diff --git a/dist/CookieMonster.js b/dist/CookieMonster.js index 7a58df40..63e963c7 100644 --- a/dist/CookieMonster.js +++ b/dist/CookieMonster.js @@ -1,3 +1,3 @@ /*! For license information please see CookieMonster.js.LICENSE.txt */ -(()=>{var e={877:function(e){!function(t,o){"use strict";"object"!=typeof e.exports?o(t):e.exports=t.document?o(t):function(e){if(!e.document)throw new Error("jscolor needs a window with document");return o(e)}}("undefined"!=typeof window?window:this,(function(e){"use strict";var t,o,a,n,i=(n={initialized:!1,instances:[],readyQueue:[],register:function(){void 0!==e&&e.document&&e.document.addEventListener("DOMContentLoaded",n.pub.init,!1)},installBySelector:function(t,o){if(!(o=o?n.node(o):e.document))throw new Error("Missing root node");for(var a=o.querySelectorAll(t),i=new RegExp("(^|\\s)("+n.pub.lookupClass+")(\\s*(\\{[^}]*\\})|\\s|$)","i"),r=0;r<a.length;r+=1){var s,l;if(!(a[r].jscolor&&a[r].jscolor instanceof n.pub)&&(void 0===a[r].type||"color"!=a[r].type.toLowerCase()||!n.isColorAttrSupported)&&(null!==(s=n.getDataAttr(a[r],"jscolor"))||a[r].className&&(l=a[r].className.match(i)))){var c=a[r],d="";null!==s?d=s:l&&(console.warn('Installation using class name is DEPRECATED. Use data-jscolor="" attribute instead.'+n.docsRef),l[4]&&(d=l[4]));var m=null;if(d.trim())try{m=n.parseOptionsStr(d)}catch(e){console.warn(e+"\n"+d)}try{new n.pub(c,m)}catch(e){console.warn(e)}}}},parseOptionsStr:function(e){var t=null;try{t=JSON.parse(e)}catch(o){if(!n.pub.looseJSON)throw new Error("Could not parse jscolor options as JSON: "+o);try{t=new Function("var opts = ("+e+'); return typeof opts === "object" ? opts : {};')()}catch(e){throw new Error("Could not evaluate jscolor options: "+e)}}return t},getInstances:function(){for(var e=[],t=0;t<n.instances.length;t+=1)n.instances[t]&&n.instances[t].targetElement&&e.push(n.instances[t]);return e},createEl:function(t){var o=e.document.createElement(t);return n.setData(o,"gui",!0),o},node:function(t){if(!t)return null;if("string"==typeof t){var o=t,a=null;try{a=e.document.querySelector(o)}catch(e){return console.warn(e),null}return a||console.warn("No element matches the selector: %s",o),a}return n.isNode(t)?t:(console.warn("Invalid node of type %s: %s",typeof t,t),null)},isNode:function(e){return"object"==typeof Node?e instanceof Node:e&&"object"==typeof e&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},nodeName:function(e){return!(!e||!e.nodeName)&&e.nodeName.toLowerCase()},removeChildren:function(e){for(;e.firstChild;)e.removeChild(e.firstChild)},isTextInput:function(e){return e&&"input"===n.nodeName(e)&&"text"===e.type.toLowerCase()},isButton:function(e){if(!e)return!1;var t=n.nodeName(e);return"button"===t||"input"===t&&["button","submit","reset"].indexOf(e.type.toLowerCase())>-1},isButtonEmpty:function(e){switch(n.nodeName(e)){case"input":return!e.value||""===e.value.trim();case"button":return""===e.textContent.trim()}return null},isPassiveEventSupported:function(){var t=!1;try{var o=Object.defineProperty({},"passive",{get:function(){t=!0}});e.addEventListener("testPassive",null,o),e.removeEventListener("testPassive",null,o)}catch(e){}return t}(),isColorAttrSupported:(a=e.document.createElement("input"),!(!a.setAttribute||(a.setAttribute("type","color"),"color"!=a.type.toLowerCase()))),dataProp:"_data_jscolor",setData:function(){var e=arguments[0];if(3===arguments.length){var t=e.hasOwnProperty(n.dataProp)?e[n.dataProp]:e[n.dataProp]={},o=arguments[2];return t[i=arguments[1]]=o,!0}if(2===arguments.length&&"object"==typeof arguments[1]){t=e.hasOwnProperty(n.dataProp)?e[n.dataProp]:e[n.dataProp]={};var a=arguments[1];for(var i in a)a.hasOwnProperty(i)&&(t[i]=a[i]);return!0}throw new Error("Invalid arguments")},removeData:function(){var e=arguments[0];if(!e.hasOwnProperty(n.dataProp))return!0;for(var t=1;t<arguments.length;t+=1){var o=arguments[t];delete e[n.dataProp][o]}return!0},getData:function(e,t,o){if(!e.hasOwnProperty(n.dataProp)){if(void 0===o)return;e[n.dataProp]={}}var a=e[n.dataProp];return a.hasOwnProperty(t)||void 0===o||(a[t]=o),a[t]},getDataAttr:function(e,t){var o="data-"+t;return e.getAttribute(o)},setDataAttr:function(e,t,o){var a="data-"+t;e.setAttribute(a,o)},_attachedGroupEvents:{},attachGroupEvent:function(e,t,o,a){n._attachedGroupEvents.hasOwnProperty(e)||(n._attachedGroupEvents[e]=[]),n._attachedGroupEvents[e].push([t,o,a]),t.addEventListener(o,a,!1)},detachGroupEvents:function(e){if(n._attachedGroupEvents.hasOwnProperty(e)){for(var t=0;t<n._attachedGroupEvents[e].length;t+=1){var o=n._attachedGroupEvents[e][t];o[0].removeEventListener(o[1],o[2],!1)}delete n._attachedGroupEvents[e]}},preventDefault:function(e){e.preventDefault&&e.preventDefault(),e.returnValue=!1},captureTarget:function(e){e.setCapture&&(n._capturedTarget=e,n._capturedTarget.setCapture())},releaseTarget:function(){n._capturedTarget&&(n._capturedTarget.releaseCapture(),n._capturedTarget=null)},triggerEvent:function(t,o,a,i){if(t){var r=null;return"function"==typeof Event?r=new Event(o,{bubbles:a,cancelable:i}):(r=e.document.createEvent("Event")).initEvent(o,a,i),!!r&&(n.setData(r,"internal",!0),t.dispatchEvent(r),!0)}},triggerInputEvent:function(e,t,o,a){e&&n.isTextInput(e)&&n.triggerEvent(e,t,o,a)},eventKey:function(e){var t={9:"Tab",13:"Enter",27:"Escape"};return"string"==typeof e.code?e.code:void 0!==e.keyCode&&t.hasOwnProperty(e.keyCode)?t[e.keyCode]:null},strList:function(e){return e?e.replace(/^\s+|\s+$/g,"").split(/\s+/):[]},hasClass:function(e,t){return!!t&&(void 0!==e.classList?e.classList.contains(t):-1!=(" "+e.className.replace(/\s+/g," ")+" ").indexOf(" "+t+" "))},addClass:function(e,t){var o=n.strList(t);if(void 0===e.classList)for(a=0;a<o.length;a+=1)n.hasClass(e,o[a])||(e.className+=(e.className?" ":"")+o[a]);else for(var a=0;a<o.length;a+=1)e.classList.add(o[a])},removeClass:function(e,t){var o=n.strList(t);if(void 0===e.classList)for(i=0;i<o.length;i+=1){var a=new RegExp("^\\s*"+o[i]+"\\s*|\\s*"+o[i]+"\\s*$|\\s+"+o[i]+"(\\s+)","g");e.className=e.className.replace(a,"$1")}else for(var i=0;i<o.length;i+=1)e.classList.remove(o[i])},getCompStyle:function(t){return(e.getComputedStyle?e.getComputedStyle(t):t.currentStyle)||{}},setStyle:function(e,t,o,a){var i=o?"important":"",r=null;for(var s in t)if(t.hasOwnProperty(s)){var l=null;null===t[s]?(r||(r=n.getData(e,"origStyle")),r&&r.hasOwnProperty(s)&&(l=r[s])):(a&&(r||(r=n.getData(e,"origStyle",{})),r.hasOwnProperty(s)||(r[s]=e.style[s])),l=t[s]),null!==l&&e.style.setProperty(s,l,i)}},hexColor:function(e,t,o){return"#"+(("0"+Math.round(e).toString(16)).substr(-2)+("0"+Math.round(t).toString(16)).substr(-2)+("0"+Math.round(o).toString(16)).substr(-2)).toUpperCase()},hexaColor:function(e,t,o,a){return"#"+(("0"+Math.round(e).toString(16)).substr(-2)+("0"+Math.round(t).toString(16)).substr(-2)+("0"+Math.round(o).toString(16)).substr(-2)+("0"+Math.round(255*a).toString(16)).substr(-2)).toUpperCase()},rgbColor:function(e,t,o){return"rgb("+Math.round(e)+","+Math.round(t)+","+Math.round(o)+")"},rgbaColor:function(e,t,o,a){return"rgba("+Math.round(e)+","+Math.round(t)+","+Math.round(o)+","+Math.round(100*(null==a?1:a))/100+")"},linearGradient:(o=function(){for(var t="linear-gradient",o=["","-webkit-","-moz-","-o-","-ms-"],a=e.document.createElement("div"),n=0;n<o.length;n+=1){var i=o[n]+t,r=i+"(to right, rgba(0,0,0,0), rgba(0,0,0,0))";if(a.style.background=r,a.style.background)return i}return t}(),function(){return o+"("+Array.prototype.join.call(arguments,", ")+")"}),setBorderRadius:function(e,t){n.setStyle(e,{"border-radius":t||"0"})},setBoxShadow:function(e,t){n.setStyle(e,{"box-shadow":t||"none"})},getElementPos:function(e,t){var o=0,a=0,i=e.getBoundingClientRect();if(o=i.left,a=i.top,!t){var r=n.getViewPos();o+=r[0],a+=r[1]}return[o,a]},getElementSize:function(e){return[e.offsetWidth,e.offsetHeight]},getAbsPointerPos:function(e){var t=0,o=0;return void 0!==e.changedTouches&&e.changedTouches.length?(t=e.changedTouches[0].clientX,o=e.changedTouches[0].clientY):"number"==typeof e.clientX&&(t=e.clientX,o=e.clientY),{x:t,y:o}},getRelPointerPos:function(e){var t=(e.target||e.srcElement).getBoundingClientRect(),o=0,a=0;return void 0!==e.changedTouches&&e.changedTouches.length?(o=e.changedTouches[0].clientX,a=e.changedTouches[0].clientY):"number"==typeof e.clientX&&(o=e.clientX,a=e.clientY),{x:o-t.left,y:a-t.top}},getViewPos:function(){var t=e.document.documentElement;return[(e.pageXOffset||t.scrollLeft)-(t.clientLeft||0),(e.pageYOffset||t.scrollTop)-(t.clientTop||0)]},getViewSize:function(){var t=e.document.documentElement;return[e.innerWidth||t.clientWidth,e.innerHeight||t.clientHeight]},RGB_HSV:function(e,t,o){e/=255,t/=255,o/=255;var a=Math.min(Math.min(e,t),o),n=Math.max(Math.max(e,t),o),i=n-a;if(0===i)return[null,0,100*n];var r=e===a?3+(o-t)/i:t===a?5+(e-o)/i:1+(t-e)/i;return[60*(6===r?0:r),i/n*100,100*n]},HSV_RGB:function(e,t,o){var a=o/100*255;if(null===e)return[a,a,a];e/=60,t/=100;var n=Math.floor(e),i=a*(1-t),r=a*(1-t*(n%2?e-n:1-(e-n)));switch(n){case 6:case 0:return[a,r,i];case 1:return[r,a,i];case 2:return[i,a,r];case 3:return[i,r,a];case 4:return[r,i,a];case 5:return[a,i,r]}},parseColorString:function(e){var t,o={rgba:null,format:null};if(t=e.match(/^\W*([0-9A-F]{3,8})\W*$/i)){if(8===t[1].length)o.format="hexa",o.rgba=[parseInt(t[1].substr(0,2),16),parseInt(t[1].substr(2,2),16),parseInt(t[1].substr(4,2),16),parseInt(t[1].substr(6,2),16)/255];else if(6===t[1].length)o.format="hex",o.rgba=[parseInt(t[1].substr(0,2),16),parseInt(t[1].substr(2,2),16),parseInt(t[1].substr(4,2),16),null];else{if(3!==t[1].length)return!1;o.format="hex",o.rgba=[parseInt(t[1].charAt(0)+t[1].charAt(0),16),parseInt(t[1].charAt(1)+t[1].charAt(1),16),parseInt(t[1].charAt(2)+t[1].charAt(2),16),null]}return o}if(t=e.match(/^\W*rgba?\(([^)]*)\)\W*$/i)){var a,n,i,r,s=t[1].split(","),l=/^\s*(\d+|\d*\.\d+|\d+\.\d*)\s*$/;if(s.length>=3&&(a=s[0].match(l))&&(n=s[1].match(l))&&(i=s[2].match(l)))return o.format="rgb",o.rgba=[parseFloat(a[1])||0,parseFloat(n[1])||0,parseFloat(i[1])||0,null],s.length>=4&&(r=s[3].match(l))&&(o.format="rgba",o.rgba[3]=parseFloat(r[1])||0),o}return!1},parsePaletteValue:function(e){var t=[];"string"==typeof e?e.replace(/#[0-9A-F]{3}([0-9A-F]{3})?|rgba?\(([^)]*)\)/gi,(function(e){t.push(e)})):Array.isArray(e)&&(t=e);for(var o=[],a=0;a<t.length;a++){var i=n.parseColorString(t[a]);i&&o.push(i)}return o},containsTranparentColor:function(e){for(var t=0;t<e.length;t++){var o=e[t].rgba[3];if(null!==o&&o<1)return!0}return!1},isAlphaFormat:function(e){switch(e.toLowerCase()){case"hexa":case"rgba":return!0}return!1},scaleCanvasForHighDPR:function(t){var o=e.devicePixelRatio||1;t.width*=o,t.height*=o,t.getContext("2d").scale(o,o)},genColorPreviewCanvas:function(e,t,o,a){var i=Math.round(n.pub.previewSeparator.length),r=n.pub.chessboardSize,s=n.pub.chessboardColor1,l=n.pub.chessboardColor2,c=o||2*r,d=2*r,m=n.createEl("canvas"),p=m.getContext("2d");m.width=c,m.height=d,a&&n.scaleCanvasForHighDPR(m),p.fillStyle=s,p.fillRect(0,0,c,d),p.fillStyle=l;for(var u=0;u<c;u+=2*r)p.fillRect(u,0,r,r),p.fillRect(u+r,r,r,r);e&&(p.fillStyle=e,p.fillRect(0,0,c,d));var h=null;switch(t){case"left":h=0,p.clearRect(0,0,i/2,d);break;case"right":h=c-i,p.clearRect(c-i/2,0,i/2,d)}if(null!==h){p.lineWidth=1;for(var g=0;g<n.pub.previewSeparator.length;g+=1)p.beginPath(),p.strokeStyle=n.pub.previewSeparator[g],p.moveTo(.5+h+g,0),p.lineTo(.5+h+g,d),p.stroke()}return{canvas:m,width:c,height:d}},genColorPreviewGradient:function(e,t,o){var a;return a=t&&o?["to "+{left:"right",right:"left"}[t],e+" 0%",e+" "+o+"px","rgba(0,0,0,0) "+(o+1)+"px","rgba(0,0,0,0) 100%"]:["to right",e+" 0%",e+" 100%"],n.linearGradient.apply(this,a)},redrawPosition:function(){if(n.picker&&n.picker.owner){var e,t,o=n.picker.owner;o.fixed?(e=n.getElementPos(o.targetElement,!0),t=[0,0]):(e=n.getElementPos(o.targetElement),t=n.getViewPos());var a,i,r,s=n.getElementSize(o.targetElement),l=n.getViewSize(),c=n.getPickerDims(o),d=[c.borderW,c.borderH];switch(o.position.toLowerCase()){case"left":a=1,i=0,r=-1;break;case"right":a=1,i=0,r=1;break;case"top":a=0,i=1,r=-1;break;default:a=0,i=1,r=1}var m=(s[i]+d[i])/2;if(o.smartPosition)p=[-t[a]+e[a]+d[a]>l[a]&&-t[a]+e[a]+s[a]/2>l[a]/2&&e[a]+s[a]-d[a]>=0?e[a]+s[a]-d[a]:e[a],-t[i]+e[i]+s[i]+d[i]-m+m*r>l[i]?-t[i]+e[i]+s[i]/2>l[i]/2&&e[i]+s[i]-m-m*r>=0?e[i]+s[i]-m-m*r:e[i]+s[i]-m+m*r:e[i]+s[i]-m+m*r>=0?e[i]+s[i]-m+m*r:e[i]+s[i]-m-m*r];else var p=[e[a],e[i]+s[i]-m+m*r];var u=p[a],h=p[i],g=o.fixed?"fixed":"absolute",f=(p[0]+d[0]>e[0]||p[0]<e[0]+s[0])&&p[1]+d[1]<e[1]+s[1];n._drawPosition(o,u,h,g,f)}},_drawPosition:function(e,t,o,a,i){var r=i?0:e.shadowBlur;n.picker.wrap.style.position=a,n.picker.wrap.style.left=t+"px",n.picker.wrap.style.top=o+"px",n.setBoxShadow(n.picker.boxS,e.shadow?new n.BoxShadow(0,r,e.shadowBlur,0,e.shadowColor):null)},getPickerDims:function(e){var t=2*e.controlBorderWidth+e.width,o=2*e.controlBorderWidth+e.height,a=2*e.controlBorderWidth+2*n.getControlPadding(e)+e.sliderSize;n.getSliderChannel(e)&&(t+=a),e.hasAlphaChannel()&&(t+=a);var i=n.getPaletteDims(e,t);i.height&&(o+=i.height+e.padding),e.closeButton&&(o+=2*e.controlBorderWidth+e.padding+e.buttonHeight);var r=t+2*e.padding,s=o+2*e.padding;return{contentW:t,contentH:o,paddedW:r,paddedH:s,borderW:r+2*e.borderWidth,borderH:s+2*e.borderWidth,palette:i}},getPaletteDims:function(e,t){var o=0,a=0,n=0,i=0,r=0,s=e._palette?e._palette.length:0;return s&&(a=(o=e.paletteCols)>0?Math.ceil(s/o):0,n=Math.max(1,Math.floor((t-(o-1)*e.paletteSpacing)/o)),i=e.paletteHeight?Math.min(e.paletteHeight,n):n),a&&(r=a*i+(a-1)*e.paletteSpacing),{cols:o,rows:a,cellW:n,cellH:i,width:t,height:r}},getControlPadding:function(e){return Math.max(e.padding/2,2*e.pointerBorderWidth+e.pointerThickness-e.controlBorderWidth)},getPadYChannel:function(e){return"v"===e.mode.charAt(1).toLowerCase()?"v":"s"},getSliderChannel:function(e){if(e.mode.length>2)switch(e.mode.charAt(2).toLowerCase()){case"s":return"s";case"v":return"v"}return null},triggerCallback:function(e,t){if(e[t]){var o=null;if("string"==typeof e[t])try{o=new Function(e[t])}catch(e){console.error(e)}else o=e[t];o&&o.call(e)}},triggerGlobal:function(e){for(var t=n.getInstances(),o=0;o<t.length;o+=1)t[o].trigger(e)},_pointerMoveEvent:{mouse:"mousemove",touch:"touchmove"},_pointerEndEvent:{mouse:"mouseup",touch:"touchend"},_pointerOrigin:null,_capturedTarget:null,onDocumentKeyUp:function(e){-1!==["Tab","Escape"].indexOf(n.eventKey(e))&&n.picker&&n.picker.owner&&n.picker.owner.tryHide()},onWindowResize:function(e){n.redrawPosition()},onWindowScroll:function(e){n.redrawPosition()},onParentScroll:function(e){n.picker&&n.picker.owner&&n.picker.owner.tryHide()},onDocumentMouseDown:function(e){var t=e.target||e.srcElement;t.jscolor&&t.jscolor instanceof n.pub?t.jscolor.showOnClick&&!t.disabled&&t.jscolor.show():n.getData(t,"gui")?n.getData(t,"control")&&n.onControlPointerStart(e,t,n.getData(t,"control"),"mouse"):n.picker&&n.picker.owner&&n.picker.owner.tryHide()},onPickerTouchStart:function(e){var t=e.target||e.srcElement;n.getData(t,"control")&&n.onControlPointerStart(e,t,n.getData(t,"control"),"touch")},onControlPointerStart:function(t,o,a,i){var r=n.getData(o,"instance");n.preventDefault(t),n.captureTarget(o);var s=function(e,r){n.attachGroupEvent("drag",e,n._pointerMoveEvent[i],n.onDocumentPointerMove(t,o,a,i,r)),n.attachGroupEvent("drag",e,n._pointerEndEvent[i],n.onDocumentPointerEnd(t,o,a,i))};if(s(e.document,[0,0]),e.parent&&e.frameElement){var l=e.frameElement.getBoundingClientRect(),c=[-l.left,-l.top];s(e.parent.window.document,c)}var d=n.getAbsPointerPos(t),m=n.getRelPointerPos(t);switch(n._pointerOrigin={x:d.x-m.x,y:d.y-m.y},a){case"pad":"v"===n.getSliderChannel(r)&&0===r.channels.v&&r.fromHSVA(null,null,100,null),n.setPad(r,t,0,0);break;case"sld":n.setSld(r,t,0);break;case"asld":n.setASld(r,t,0)}r.trigger("input")},onDocumentPointerMove:function(e,t,o,a,i){return function(e){var a=n.getData(t,"instance");switch(o){case"pad":n.setPad(a,e,i[0],i[1]);break;case"sld":n.setSld(a,e,i[1]);break;case"asld":n.setASld(a,e,i[1])}a.trigger("input")}},onDocumentPointerEnd:function(e,t,o,a){return function(e){var o=n.getData(t,"instance");n.detachGroupEvents("drag"),n.releaseTarget(),o.trigger("input"),o.trigger("change")}},onPaletteSampleClick:function(e){var t=e.currentTarget,o=n.getData(t,"instance"),a=n.getData(t,"color");"any"===o.format.toLowerCase()&&(o._setFormat(a.format),n.isAlphaFormat(o.getFormat())||(a.rgba[3]=1)),null===a.rgba[3]&&(!0===o.paletteSetsAlpha||"auto"===o.paletteSetsAlpha&&o._paletteHasTransparency)&&(a.rgba[3]=1),o.fromRGBA.apply(o,a.rgba),o.trigger("input"),o.trigger("change"),o.hideOnPaletteClick&&o.hide()},setPad:function(e,t,o,a){var i=n.getAbsPointerPos(t),r=o+i.x-n._pointerOrigin.x-e.padding-e.controlBorderWidth,s=a+i.y-n._pointerOrigin.y-e.padding-e.controlBorderWidth,l=r*(360/(e.width-1)),c=100-s*(100/(e.height-1));switch(n.getPadYChannel(e)){case"s":e.fromHSVA(l,c,null,null);break;case"v":e.fromHSVA(l,null,c,null)}},setSld:function(e,t,o){var a=100-(o+n.getAbsPointerPos(t).y-n._pointerOrigin.y-e.padding-e.controlBorderWidth)*(100/(e.height-1));switch(n.getSliderChannel(e)){case"s":e.fromHSVA(null,a,null,null);break;case"v":e.fromHSVA(null,null,a,null)}},setASld:function(e,t,o){var a=1-(o+n.getAbsPointerPos(t).y-n._pointerOrigin.y-e.padding-e.controlBorderWidth)*(1/(e.height-1));if(a<1){var i=e.getFormat();"any"!==e.format.toLowerCase()||n.isAlphaFormat(i)||e._setFormat("hex"===i?"hexa":"rgba")}e.fromHSVA(null,null,null,a)},createPadCanvas:function(){var e={elm:null,draw:null},t=n.createEl("canvas"),o=t.getContext("2d");return e.elm=t,e.draw=function(e,a,n){t.width=e,t.height=a,o.clearRect(0,0,t.width,t.height);var i=o.createLinearGradient(0,0,t.width,0);i.addColorStop(0,"#F00"),i.addColorStop(1/6,"#FF0"),i.addColorStop(2/6,"#0F0"),i.addColorStop(.5,"#0FF"),i.addColorStop(4/6,"#00F"),i.addColorStop(5/6,"#F0F"),i.addColorStop(1,"#F00"),o.fillStyle=i,o.fillRect(0,0,t.width,t.height);var r=o.createLinearGradient(0,0,0,t.height);switch(n.toLowerCase()){case"s":r.addColorStop(0,"rgba(255,255,255,0)"),r.addColorStop(1,"rgba(255,255,255,1)");break;case"v":r.addColorStop(0,"rgba(0,0,0,0)"),r.addColorStop(1,"rgba(0,0,0,1)")}o.fillStyle=r,o.fillRect(0,0,t.width,t.height)},e},createSliderGradient:function(){var e={elm:null,draw:null},t=n.createEl("canvas"),o=t.getContext("2d");return e.elm=t,e.draw=function(e,a,n,i){t.width=e,t.height=a,o.clearRect(0,0,t.width,t.height);var r=o.createLinearGradient(0,0,0,t.height);r.addColorStop(0,n),r.addColorStop(1,i),o.fillStyle=r,o.fillRect(0,0,t.width,t.height)},e},createASliderGradient:function(){var e={elm:null,draw:null},t=n.createEl("canvas"),o=t.getContext("2d");return e.elm=t,e.draw=function(e,a,i){t.width=e,t.height=a,o.clearRect(0,0,t.width,t.height);var r=t.width/2,s=n.pub.chessboardColor1,l=n.pub.chessboardColor2;if(o.fillStyle=s,o.fillRect(0,0,t.width,t.height),r>0)for(var c=0;c<t.height;c+=2*r)o.fillStyle=l,o.fillRect(0,c,r,r),o.fillRect(r,c+r,r,r);var d=o.createLinearGradient(0,0,0,t.height);d.addColorStop(0,i),d.addColorStop(1,"rgba(0,0,0,0)"),o.fillStyle=d,o.fillRect(0,0,t.width,t.height)},e},BoxShadow:(t=function(e,t,o,a,n,i){this.hShadow=e,this.vShadow=t,this.blur=o,this.spread=a,this.color=n,this.inset=!!i},t.prototype.toString=function(){var e=[Math.round(this.hShadow)+"px",Math.round(this.vShadow)+"px",Math.round(this.blur)+"px",Math.round(this.spread)+"px",this.color];return this.inset&&e.push("inset"),e.join(" ")},t),flags:{leaveValue:1,leaveAlpha:2,leavePreview:4},enumOpts:{format:["auto","any","hex","hexa","rgb","rgba"],previewPosition:["left","right"],mode:["hsv","hvs","hs","hv"],position:["left","right","top","bottom"],alphaChannel:["auto",!0,!1],paletteSetsAlpha:["auto",!0,!1]},deprecatedOpts:{styleElement:"previewElement",onFineChange:"onInput",overwriteImportant:"forceStyle",closable:"closeButton",insetWidth:"controlBorderWidth",insetColor:"controlBorderColor",refine:null},docsRef:" See https://jscolor.com/docs/",pub:function(t,o){var a=this;function i(e,t){if("string"!=typeof e)throw new Error("Invalid value for option name: "+e);if(n.enumOpts.hasOwnProperty(e)&&("string"==typeof t&&(t=t.toLowerCase()),-1===n.enumOpts[e].indexOf(t)))throw new Error("Option '"+e+"' has invalid value: "+t);if(n.deprecatedOpts.hasOwnProperty(e)){var o=e,i=n.deprecatedOpts[e];if(!i)throw new Error("Option '"+e+"' is DEPRECATED");console.warn("Option '%s' is DEPRECATED, using '%s' instead."+n.docsRef,o,i),e=i}var r="set__"+e;if("function"==typeof a[r])return a[r](t),!0;if(e in a)return a[e]=t,!0;throw new Error("Unrecognized configuration option: "+e)}function r(e){if("string"!=typeof e)throw new Error("Invalid value for option name: "+e);if(n.deprecatedOpts.hasOwnProperty(e)){var t=e,o=n.deprecatedOpts[e];if(!o)throw new Error("Option '"+e+"' is DEPRECATED");console.warn("Option '%s' is DEPRECATED, using '%s' instead."+n.docsRef,t,o),e=o}var i="get__"+e;if("function"==typeof a[i])return a[i](value);if(e in a)return a[e];throw new Error("Unrecognized configuration option: "+e)}function s(){a._processParentElementsInDOM(),n.picker||(n.picker={owner:null,wrap:n.createEl("div"),box:n.createEl("div"),boxS:n.createEl("div"),boxB:n.createEl("div"),pad:n.createEl("div"),padB:n.createEl("div"),padM:n.createEl("div"),padCanvas:n.createPadCanvas(),cross:n.createEl("div"),crossBY:n.createEl("div"),crossBX:n.createEl("div"),crossLY:n.createEl("div"),crossLX:n.createEl("div"),sld:n.createEl("div"),sldB:n.createEl("div"),sldM:n.createEl("div"),sldGrad:n.createSliderGradient(),sldPtrS:n.createEl("div"),sldPtrIB:n.createEl("div"),sldPtrMB:n.createEl("div"),sldPtrOB:n.createEl("div"),asld:n.createEl("div"),asldB:n.createEl("div"),asldM:n.createEl("div"),asldGrad:n.createASliderGradient(),asldPtrS:n.createEl("div"),asldPtrIB:n.createEl("div"),asldPtrMB:n.createEl("div"),asldPtrOB:n.createEl("div"),pal:n.createEl("div"),btn:n.createEl("div"),btnT:n.createEl("span")},n.picker.pad.appendChild(n.picker.padCanvas.elm),n.picker.padB.appendChild(n.picker.pad),n.picker.cross.appendChild(n.picker.crossBY),n.picker.cross.appendChild(n.picker.crossBX),n.picker.cross.appendChild(n.picker.crossLY),n.picker.cross.appendChild(n.picker.crossLX),n.picker.padB.appendChild(n.picker.cross),n.picker.box.appendChild(n.picker.padB),n.picker.box.appendChild(n.picker.padM),n.picker.sld.appendChild(n.picker.sldGrad.elm),n.picker.sldB.appendChild(n.picker.sld),n.picker.sldB.appendChild(n.picker.sldPtrOB),n.picker.sldPtrOB.appendChild(n.picker.sldPtrMB),n.picker.sldPtrMB.appendChild(n.picker.sldPtrIB),n.picker.sldPtrIB.appendChild(n.picker.sldPtrS),n.picker.box.appendChild(n.picker.sldB),n.picker.box.appendChild(n.picker.sldM),n.picker.asld.appendChild(n.picker.asldGrad.elm),n.picker.asldB.appendChild(n.picker.asld),n.picker.asldB.appendChild(n.picker.asldPtrOB),n.picker.asldPtrOB.appendChild(n.picker.asldPtrMB),n.picker.asldPtrMB.appendChild(n.picker.asldPtrIB),n.picker.asldPtrIB.appendChild(n.picker.asldPtrS),n.picker.box.appendChild(n.picker.asldB),n.picker.box.appendChild(n.picker.asldM),n.picker.box.appendChild(n.picker.pal),n.picker.btn.appendChild(n.picker.btnT),n.picker.box.appendChild(n.picker.btn),n.picker.boxB.appendChild(n.picker.box),n.picker.wrap.appendChild(n.picker.boxS),n.picker.wrap.appendChild(n.picker.boxB),n.picker.wrap.addEventListener("touchstart",n.onPickerTouchStart,!!n.isPassiveEventSupported&&{passive:!1}));var t,o,i=n.picker,r=!!n.getSliderChannel(a),s=a.hasAlphaChannel(),m=n.getPickerDims(a),p=2*a.pointerBorderWidth+a.pointerThickness+2*a.crossSize,u=n.getControlPadding(a),h=Math.min(a.borderRadius,Math.round(a.padding*Math.PI));i.wrap.className="jscolor-picker-wrap",i.wrap.style.clear="both",i.wrap.style.width=m.borderW+"px",i.wrap.style.height=m.borderH+"px",i.wrap.style.zIndex=a.zIndex,i.box.className="jscolor-picker",i.box.style.width=m.paddedW+"px",i.box.style.height=m.paddedH+"px",i.box.style.position="relative",i.boxS.className="jscolor-picker-shadow",i.boxS.style.position="absolute",i.boxS.style.left="0",i.boxS.style.top="0",i.boxS.style.width="100%",i.boxS.style.height="100%",n.setBorderRadius(i.boxS,h+"px"),i.boxB.className="jscolor-picker-border",i.boxB.style.position="relative",i.boxB.style.border=a.borderWidth+"px solid",i.boxB.style.borderColor=a.borderColor,i.boxB.style.background=a.backgroundColor,n.setBorderRadius(i.boxB,h+"px"),i.padM.style.background="rgba(255,0,0,.2)",i.sldM.style.background="rgba(0,255,0,.2)",i.asldM.style.background="rgba(0,0,255,.2)",i.padM.style.opacity=i.sldM.style.opacity=i.asldM.style.opacity="0",i.pad.style.position="relative",i.pad.style.width=a.width+"px",i.pad.style.height=a.height+"px",i.padCanvas.draw(a.width,a.height,n.getPadYChannel(a)),i.padB.style.position="absolute",i.padB.style.left=a.padding+"px",i.padB.style.top=a.padding+"px",i.padB.style.border=a.controlBorderWidth+"px solid",i.padB.style.borderColor=a.controlBorderColor,i.padM.style.position="absolute",i.padM.style.left="0px",i.padM.style.top="0px",i.padM.style.width=a.padding+2*a.controlBorderWidth+a.width+u+"px",i.padM.style.height=2*a.controlBorderWidth+2*a.padding+a.height+"px",i.padM.style.cursor="crosshair",n.setData(i.padM,{instance:a,control:"pad"}),i.cross.style.position="absolute",i.cross.style.left=i.cross.style.top="0",i.cross.style.width=i.cross.style.height=p+"px",i.crossBY.style.position=i.crossBX.style.position="absolute",i.crossBY.style.background=i.crossBX.style.background=a.pointerBorderColor,i.crossBY.style.width=i.crossBX.style.height=2*a.pointerBorderWidth+a.pointerThickness+"px",i.crossBY.style.height=i.crossBX.style.width=p+"px",i.crossBY.style.left=i.crossBX.style.top=Math.floor(p/2)-Math.floor(a.pointerThickness/2)-a.pointerBorderWidth+"px",i.crossBY.style.top=i.crossBX.style.left="0",i.crossLY.style.position=i.crossLX.style.position="absolute",i.crossLY.style.background=i.crossLX.style.background=a.pointerColor,i.crossLY.style.height=i.crossLX.style.width=p-2*a.pointerBorderWidth+"px",i.crossLY.style.width=i.crossLX.style.height=a.pointerThickness+"px",i.crossLY.style.left=i.crossLX.style.top=Math.floor(p/2)-Math.floor(a.pointerThickness/2)+"px",i.crossLY.style.top=i.crossLX.style.left=a.pointerBorderWidth+"px",i.sld.style.overflow="hidden",i.sld.style.width=a.sliderSize+"px",i.sld.style.height=a.height+"px",i.sldGrad.draw(a.sliderSize,a.height,"#000","#000"),i.sldB.style.display=r?"block":"none",i.sldB.style.position="absolute",i.sldB.style.left=a.padding+a.width+2*a.controlBorderWidth+2*u+"px",i.sldB.style.top=a.padding+"px",i.sldB.style.border=a.controlBorderWidth+"px solid",i.sldB.style.borderColor=a.controlBorderColor,i.sldM.style.display=r?"block":"none",i.sldM.style.position="absolute",i.sldM.style.left=a.padding+a.width+2*a.controlBorderWidth+u+"px",i.sldM.style.top="0px",i.sldM.style.width=a.sliderSize+2*u+2*a.controlBorderWidth+(s?0:Math.max(0,a.padding-u))+"px",i.sldM.style.height=2*a.controlBorderWidth+2*a.padding+a.height+"px",i.sldM.style.cursor="default",n.setData(i.sldM,{instance:a,control:"sld"}),i.sldPtrIB.style.border=i.sldPtrOB.style.border=a.pointerBorderWidth+"px solid "+a.pointerBorderColor,i.sldPtrOB.style.position="absolute",i.sldPtrOB.style.left=-(2*a.pointerBorderWidth+a.pointerThickness)+"px",i.sldPtrOB.style.top="0",i.sldPtrMB.style.border=a.pointerThickness+"px solid "+a.pointerColor,i.sldPtrS.style.width=a.sliderSize+"px",i.sldPtrS.style.height=n.pub.sliderInnerSpace+"px",i.asld.style.overflow="hidden",i.asld.style.width=a.sliderSize+"px",i.asld.style.height=a.height+"px",i.asldGrad.draw(a.sliderSize,a.height,"#000"),i.asldB.style.display=s?"block":"none",i.asldB.style.position="absolute",i.asldB.style.left=a.padding+a.width+2*a.controlBorderWidth+u+(r?a.sliderSize+3*u+2*a.controlBorderWidth:0)+"px",i.asldB.style.top=a.padding+"px",i.asldB.style.border=a.controlBorderWidth+"px solid",i.asldB.style.borderColor=a.controlBorderColor,i.asldM.style.display=s?"block":"none",i.asldM.style.position="absolute",i.asldM.style.left=a.padding+a.width+2*a.controlBorderWidth+u+(r?a.sliderSize+2*u+2*a.controlBorderWidth:0)+"px",i.asldM.style.top="0px",i.asldM.style.width=a.sliderSize+2*u+2*a.controlBorderWidth+Math.max(0,a.padding-u)+"px",i.asldM.style.height=2*a.controlBorderWidth+2*a.padding+a.height+"px",i.asldM.style.cursor="default",n.setData(i.asldM,{instance:a,control:"asld"}),i.asldPtrIB.style.border=i.asldPtrOB.style.border=a.pointerBorderWidth+"px solid "+a.pointerBorderColor,i.asldPtrOB.style.position="absolute",i.asldPtrOB.style.left=-(2*a.pointerBorderWidth+a.pointerThickness)+"px",i.asldPtrOB.style.top="0",i.asldPtrMB.style.border=a.pointerThickness+"px solid "+a.pointerColor,i.asldPtrS.style.width=a.sliderSize+"px",i.asldPtrS.style.height=n.pub.sliderInnerSpace+"px",i.pal.className="jscolor-palette",i.pal.style.display=m.palette.rows?"block":"none",i.pal.style.position="absolute",i.pal.style.left=a.padding+"px",i.pal.style.top=2*a.controlBorderWidth+2*a.padding+a.height+"px",i.pal.innerHTML="";for(var g=n.genColorPreviewCanvas("rgba(0,0,0,0)"),f=0,k=0;k<m.palette.rows;k++)for(var C=0;C<m.palette.cols&&f<a._palette.length;C++,f++){var M=a._palette[f],y=n.rgbaColor.apply(null,M.rgba),b=n.createEl("div");b.style.width=m.palette.cellW-2*a.controlBorderWidth+"px",b.style.height=m.palette.cellH-2*a.controlBorderWidth+"px",b.style.backgroundColor=y;var G=n.createEl("div");G.className="jscolor-palette-sample",G.style.display="block",G.style.position="absolute",G.style.left=(m.palette.cols<=1?0:Math.round(C*((m.contentW-m.palette.cellW)/(m.palette.cols-1))*10)/10)+"px",G.style.top=k*(m.palette.cellH+a.paletteSpacing)+"px",G.style.border=a.controlBorderWidth+"px solid",G.style.borderColor=a.controlBorderColor,G.style.cursor="pointer",null!==M.rgba[3]&&M.rgba[3]<1&&(G.style.backgroundImage="url('"+g.canvas.toDataURL()+"')",G.style.backgroundRepeat="repeat",G.style.backgroundPosition="center center"),n.setData(G,{instance:a,control:"palette-sample",color:M}),G.addEventListener("click",n.onPaletteSampleClick,!1),G.appendChild(b),i.pal.appendChild(G)}i.btn.className="jscolor-btn-close",i.btn.style.display=a.closeButton?"block":"none",i.btn.style.position="absolute",i.btn.style.left=a.padding+"px",i.btn.style.bottom=a.padding+"px",i.btn.style.padding="0 15px",i.btn.style.maxWidth=m.contentW-2*a.controlBorderWidth-30+"px",i.btn.style.overflow="hidden",i.btn.style.height=a.buttonHeight+"px",i.btn.style.whiteSpace="nowrap",i.btn.style.border=a.controlBorderWidth+"px solid",o=(t=a.controlBorderColor.split(/\s+/)).length<2?t[0]:t[1]+" "+t[0]+" "+t[0]+" "+t[1],i.btn.style.borderColor=o,i.btn.style.color=a.buttonColor,i.btn.style.font="12px sans-serif",i.btn.style.textAlign="center",i.btn.style.cursor="pointer",i.btn.onmousedown=function(){a.hide()},i.btnT.style.lineHeight=a.buttonHeight+"px",i.btnT.innerHTML="",i.btnT.appendChild(e.document.createTextNode(a.closeText)),l(),c(),d(),n.picker.owner&&n.picker.owner!==a&&n.removeClass(n.picker.owner.targetElement,n.pub.activeClassName),n.picker.owner=a,a.container===e.document.body?n.redrawPosition():n._drawPosition(a,0,0,"relative",!1),i.wrap.parentNode!==a.container&&a.container.appendChild(i.wrap),n.addClass(a.targetElement,n.pub.activeClassName)}function l(){var e=n.getPadYChannel(a),t=Math.round(a.channels.h/360*(a.width-1)),o=Math.round((1-a.channels[e]/100)*(a.height-1)),i=2*a.pointerBorderWidth+a.pointerThickness+2*a.crossSize,r=-Math.floor(i/2);switch(n.picker.cross.style.left=t+r+"px",n.picker.cross.style.top=o+r+"px",n.getSliderChannel(a)){case"s":var s=n.HSV_RGB(a.channels.h,100,a.channels.v),l=n.HSV_RGB(a.channels.h,0,a.channels.v),c="rgb("+Math.round(s[0])+","+Math.round(s[1])+","+Math.round(s[2])+")",d="rgb("+Math.round(l[0])+","+Math.round(l[1])+","+Math.round(l[2])+")";n.picker.sldGrad.draw(a.sliderSize,a.height,c,d);break;case"v":var m=n.HSV_RGB(a.channels.h,a.channels.s,100);c="rgb("+Math.round(m[0])+","+Math.round(m[1])+","+Math.round(m[2])+")",d="#000",n.picker.sldGrad.draw(a.sliderSize,a.height,c,d)}n.picker.asldGrad.draw(a.sliderSize,a.height,a.toHEXString())}function c(){var e=n.getSliderChannel(a);if(e){var t=Math.round((1-a.channels[e]/100)*(a.height-1));n.picker.sldPtrOB.style.top=t-(2*a.pointerBorderWidth+a.pointerThickness)-Math.floor(n.pub.sliderInnerSpace/2)+"px"}n.picker.asldGrad.draw(a.sliderSize,a.height,a.toHEXString())}function d(){var e=Math.round((1-a.channels.a)*(a.height-1));n.picker.asldPtrOB.style.top=e-(2*a.pointerBorderWidth+a.pointerThickness)-Math.floor(n.pub.sliderInnerSpace/2)+"px"}function m(){return n.picker&&n.picker.owner===a}if(o||(o={}),this.channels={r:255,g:255,b:255,h:0,s:0,v:100,a:1},this.format="auto",this.value=void 0,this.alpha=void 0,this.random=!1,this.onChange=void 0,this.onInput=void 0,this.valueElement=void 0,this.alphaElement=void 0,this.previewElement=void 0,this.previewPosition="left",this.previewSize=32,this.previewPadding=8,this.required=!0,this.hash=!0,this.uppercase=!0,this.forceStyle=!0,this.width=181,this.height=101,this.mode="HSV",this.alphaChannel="auto",this.position="bottom",this.smartPosition=!0,this.showOnClick=!0,this.hideOnLeave=!0,this.palette=[],this.paletteCols=10,this.paletteSetsAlpha="auto",this.paletteHeight=16,this.paletteSpacing=4,this.hideOnPaletteClick=!1,this.sliderSize=16,this.crossSize=8,this.closeButton=!1,this.closeText="Close",this.buttonColor="rgba(0,0,0,1)",this.buttonHeight=18,this.padding=12,this.backgroundColor="rgba(255,255,255,1)",this.borderWidth=1,this.borderColor="rgba(187,187,187,1)",this.borderRadius=8,this.controlBorderWidth=1,this.controlBorderColor="rgba(187,187,187,1)",this.shadow=!0,this.shadowBlur=15,this.shadowColor="rgba(0,0,0,0.2)",this.pointerColor="rgba(76,76,76,1)",this.pointerBorderWidth=1,this.pointerBorderColor="rgba(255,255,255,1)",this.pointerThickness=2,this.zIndex=5e3,this.container=void 0,this.minS=0,this.maxS=100,this.minV=0,this.maxV=100,this.minA=0,this.maxA=1,this.option=function(){if(!arguments.length)throw new Error("No option specified");if(1===arguments.length&&"string"==typeof arguments[0]){try{return r(arguments[0])}catch(e){console.warn(e)}return!1}if(arguments.length>=2&&"string"==typeof arguments[0]){try{if(!i(arguments[0],arguments[1]))return!1}catch(e){return console.warn(e),!1}return this.redraw(),this.exposeColor(),!0}if(1===arguments.length&&"object"==typeof arguments[0]){var e=arguments[0],t=!0;for(var o in e)if(e.hasOwnProperty(o))try{i(o,e[o])||(t=!1)}catch(e){console.warn(e),t=!1}return this.redraw(),this.exposeColor(),t}throw new Error("Invalid arguments")},this.channel=function(e,t){if("string"!=typeof e)throw new Error("Invalid value for channel name: "+e);if(void 0===t)return this.channels.hasOwnProperty(e.toLowerCase())?this.channels[e.toLowerCase()]:(console.warn("Getting unknown channel: "+e),!1);var o=!1;switch(e.toLowerCase()){case"r":o=this.fromRGBA(t,null,null,null);break;case"g":o=this.fromRGBA(null,t,null,null);break;case"b":o=this.fromRGBA(null,null,t,null);break;case"h":o=this.fromHSVA(t,null,null,null);break;case"s":o=this.fromHSVA(null,t,null,null);break;case"v":o=this.fromHSVA(null,null,t,null);break;case"a":o=this.fromHSVA(null,null,null,t);break;default:return console.warn("Setting unknown channel: "+e),!1}return!!o&&(this.redraw(),!0)},this.trigger=function(e){for(var t=n.strList(e),o=0;o<t.length;o+=1){var a=t[o].toLowerCase(),i=null;switch(a){case"input":i="onInput";break;case"change":i="onChange"}i&&n.triggerCallback(this,i),n.triggerInputEvent(this.valueElement,a,!0,!0)}},this.fromHSVA=function(e,t,o,a,i){if(void 0===e&&(e=null),void 0===t&&(t=null),void 0===o&&(o=null),void 0===a&&(a=null),null!==e){if(isNaN(e))return!1;this.channels.h=Math.max(0,Math.min(360,e))}if(null!==t){if(isNaN(t))return!1;this.channels.s=Math.max(0,Math.min(100,this.maxS,t),this.minS)}if(null!==o){if(isNaN(o))return!1;this.channels.v=Math.max(0,Math.min(100,this.maxV,o),this.minV)}if(null!==a){if(isNaN(a))return!1;this.channels.a=this.hasAlphaChannel()?Math.max(0,Math.min(1,this.maxA,a),this.minA):1}var r=n.HSV_RGB(this.channels.h,this.channels.s,this.channels.v);return this.channels.r=r[0],this.channels.g=r[1],this.channels.b=r[2],this.exposeColor(i),!0},this.fromRGBA=function(e,t,o,a,i){if(void 0===e&&(e=null),void 0===t&&(t=null),void 0===o&&(o=null),void 0===a&&(a=null),null!==e){if(isNaN(e))return!1;e=Math.max(0,Math.min(255,e))}if(null!==t){if(isNaN(t))return!1;t=Math.max(0,Math.min(255,t))}if(null!==o){if(isNaN(o))return!1;o=Math.max(0,Math.min(255,o))}if(null!==a){if(isNaN(a))return!1;this.channels.a=this.hasAlphaChannel()?Math.max(0,Math.min(1,this.maxA,a),this.minA):1}var r=n.RGB_HSV(null===e?this.channels.r:e,null===t?this.channels.g:t,null===o?this.channels.b:o);null!==r[0]&&(this.channels.h=Math.max(0,Math.min(360,r[0]))),0!==r[2]&&(this.channels.s=Math.max(0,this.minS,Math.min(100,this.maxS,r[1]))),this.channels.v=Math.max(0,this.minV,Math.min(100,this.maxV,r[2]));var s=n.HSV_RGB(this.channels.h,this.channels.s,this.channels.v);return this.channels.r=s[0],this.channels.g=s[1],this.channels.b=s[2],this.exposeColor(i),!0},this.fromHSV=function(e,t,o,a){return console.warn("fromHSV() method is DEPRECATED. Using fromHSVA() instead."+n.docsRef),this.fromHSVA(e,t,o,null,a)},this.fromRGB=function(e,t,o,a){return console.warn("fromRGB() method is DEPRECATED. Using fromRGBA() instead."+n.docsRef),this.fromRGBA(e,t,o,null,a)},this.fromString=function(e,t){if(!this.required&&""===e.trim())return this.setPreviewElementBg(null),this.setValueElementValue(""),!0;var o=n.parseColorString(e);return!!o&&("any"===this.format.toLowerCase()&&(this._setFormat(o.format),n.isAlphaFormat(this.getFormat())||(o.rgba[3]=1)),this.fromRGBA(o.rgba[0],o.rgba[1],o.rgba[2],o.rgba[3],t),!0)},this.randomize=function(e,t,o,a,n,i,r,s){void 0===e&&(e=0),void 0===t&&(t=100),void 0===o&&(o=0),void 0===a&&(a=100),void 0===n&&(n=0),void 0===i&&(i=359),void 0===r&&(r=1),void 0===s&&(s=1),this.fromHSVA(n+Math.floor(Math.random()*(i-n+1)),o+Math.floor(Math.random()*(a-o+1)),e+Math.floor(Math.random()*(t-e+1)),(100*r+Math.floor(Math.random()*(100*(s-r)+1)))/100)},this.toString=function(e){switch(void 0===e&&(e=this.getFormat()),e.toLowerCase()){case"hex":return this.toHEXString();case"hexa":return this.toHEXAString();case"rgb":return this.toRGBString();case"rgba":return this.toRGBAString()}return!1},this.toHEXString=function(){return n.hexColor(this.channels.r,this.channels.g,this.channels.b)},this.toHEXAString=function(){return n.hexaColor(this.channels.r,this.channels.g,this.channels.b,this.channels.a)},this.toRGBString=function(){return n.rgbColor(this.channels.r,this.channels.g,this.channels.b)},this.toRGBAString=function(){return n.rgbaColor(this.channels.r,this.channels.g,this.channels.b,this.channels.a)},this.toGrayscale=function(){return.213*this.channels.r+.715*this.channels.g+.072*this.channels.b},this.toCanvas=function(){return n.genColorPreviewCanvas(this.toRGBAString()).canvas},this.toDataURL=function(){return this.toCanvas().toDataURL()},this.toBackground=function(){return n.pub.background(this.toRGBAString())},this.isLight=function(){return this.toGrayscale()>127.5},this.hide=function(){m()&&(n.removeClass(a.targetElement,n.pub.activeClassName),n.picker.wrap.parentNode.removeChild(n.picker.wrap),delete n.picker.owner)},this.show=function(){s()},this.redraw=function(){m()&&s()},this.getFormat=function(){return this._currentFormat},this._setFormat=function(e){this._currentFormat=e.toLowerCase()},this.hasAlphaChannel=function(){return"auto"===this.alphaChannel?"any"===this.format.toLowerCase()||n.isAlphaFormat(this.getFormat())||void 0!==this.alpha||void 0!==this.alphaElement:this.alphaChannel},this.processValueInput=function(e){this.fromString(e)||this.exposeColor()},this.processAlphaInput=function(e){this.fromHSVA(null,null,null,parseFloat(e))||this.exposeColor()},this.exposeColor=function(e){var t=this.toString(),o=this.getFormat();if(n.setDataAttr(this.targetElement,"current-color",t),e&n.flags.leaveValue||!this.valueElement||("hex"!==o&&"hexa"!==o||(this.uppercase||(t=t.toLowerCase()),this.hash||(t=t.replace(/^#/,""))),this.setValueElementValue(t)),!(e&n.flags.leaveAlpha)&&this.alphaElement){var a=Math.round(100*this.channels.a)/100;this.setAlphaElementValue(a)}e&n.flags.leavePreview||!this.previewElement||((n.isTextInput(this.previewElement)||n.isButton(this.previewElement)&&!n.isButtonEmpty(this.previewElement))&&this.previewPosition,this.setPreviewElementBg(this.toRGBAString())),m()&&(l(),c(),d())},this.setPreviewElementBg=function(e){if(this.previewElement){var t=null,o=null;(n.isTextInput(this.previewElement)||n.isButton(this.previewElement)&&!n.isButtonEmpty(this.previewElement))&&(t=this.previewPosition,o=this.previewSize);var a=[];if(e){a.push({image:n.genColorPreviewGradient(e,t,o?o-n.pub.previewSeparator.length:null),position:"left top",size:"auto",repeat:t?"repeat-y":"repeat",origin:"padding-box"});var i=n.genColorPreviewCanvas("rgba(0,0,0,0)",t?{left:"right",right:"left"}[t]:null,o,!0);a.push({image:"url('"+i.canvas.toDataURL()+"')",position:(t||"left")+" top",size:i.width+"px "+i.height+"px",repeat:t?"repeat-y":"repeat",origin:"padding-box"})}else a.push({image:"none",position:"left top",size:"auto",repeat:"no-repeat",origin:"padding-box"});for(var r={image:[],position:[],size:[],repeat:[],origin:[]},s=0;s<a.length;s+=1)r.image.push(a[s].image),r.position.push(a[s].position),r.size.push(a[s].size),r.repeat.push(a[s].repeat),r.origin.push(a[s].origin);var l={"background-image":r.image.join(", "),"background-position":r.position.join(", "),"background-size":r.size.join(", "),"background-repeat":r.repeat.join(", "),"background-origin":r.origin.join(", ")};n.setStyle(this.previewElement,l,this.forceStyle);var c={left:null,right:null};t&&(c[t]=this.previewSize+this.previewPadding+"px"),l={"padding-left":c.left,"padding-right":c.right},n.setStyle(this.previewElement,l,this.forceStyle,!0)}},this.setValueElementValue=function(e){this.valueElement&&("input"===n.nodeName(this.valueElement)?this.valueElement.value=e:this.valueElement.innerHTML=e)},this.setAlphaElementValue=function(e){this.alphaElement&&("input"===n.nodeName(this.alphaElement)?this.alphaElement.value=e:this.alphaElement.innerHTML=e)},this._processParentElementsInDOM=function(){if(!this._parentElementsProcessed){this._parentElementsProcessed=!0;var e=this.targetElement;do{var t=n.getCompStyle(e);t.position&&"fixed"===t.position.toLowerCase()&&(this.fixed=!0),e!==this.targetElement&&(n.getData(e,"hasScrollListener")||(e.addEventListener("scroll",n.onParentScroll,!1),n.setData(e,"hasScrollListener",!0)))}while((e=e.parentNode)&&"body"!==n.nodeName(e))}},this.tryHide=function(){this.hideOnLeave&&this.hide()},this.set__palette=function(e){this.palette=e,this._palette=n.parsePaletteValue(e),this._paletteHasTransparency=n.containsTranparentColor(this._palette)},n.pub.options)for(var p in n.pub.options)if(n.pub.options.hasOwnProperty(p))try{i(p,n.pub.options[p])}catch(e){console.warn(e)}var u=[];o.preset&&("string"==typeof o.preset?u=o.preset.split(/\s+/):Array.isArray(o.preset)?u=o.preset.slice():console.warn("Unrecognized preset value")),-1===u.indexOf("default")&&u.push("default");for(var h=u.length-1;h>=0;h-=1){var g=u[h];if(g)if(n.pub.presets.hasOwnProperty(g)){for(var p in n.pub.presets[g])if(n.pub.presets[g].hasOwnProperty(p))try{i(p,n.pub.presets[g][p])}catch(e){console.warn(e)}}else console.warn("Unknown preset: %s",g)}var f=["preset"];for(var p in o)if(o.hasOwnProperty(p)&&-1===f.indexOf(p))try{i(p,o[p])}catch(e){console.warn(e)}if(void 0===this.container?this.container=e.document.body:this.container=n.node(this.container),!this.container)throw new Error("Cannot instantiate color picker without a container element");if(this.targetElement=n.node(t),!this.targetElement){if("string"==typeof t&&/^[a-zA-Z][\w:.-]*$/.test(t))throw new Error("If '"+t+"' is supposed to be an ID, please use '#"+t+"' or any valid CSS selector.");throw new Error("Cannot instantiate color picker without a target element")}if(this.targetElement.jscolor&&this.targetElement.jscolor instanceof n.pub)throw new Error("Color picker already installed on this element");if(this.targetElement.jscolor=this,n.addClass(this.targetElement,n.pub.className),n.instances.push(this),n.isButton(this.targetElement)&&("button"!==this.targetElement.type.toLowerCase()&&(this.targetElement.type="button"),n.isButtonEmpty(this.targetElement))){n.removeChildren(this.targetElement),this.targetElement.appendChild(e.document.createTextNode(" "));var k=n.getCompStyle(this.targetElement);(parseFloat(k["min-width"])||0)<this.previewSize&&n.setStyle(this.targetElement,{"min-width":this.previewSize+"px"},this.forceStyle)}if(void 0===this.valueElement?n.isTextInput(this.targetElement)&&(this.valueElement=this.targetElement):null===this.valueElement||(this.valueElement=n.node(this.valueElement)),this.alphaElement&&(this.alphaElement=n.node(this.alphaElement)),void 0===this.previewElement?this.previewElement=this.targetElement:null===this.previewElement||(this.previewElement=n.node(this.previewElement)),this.valueElement&&n.isTextInput(this.valueElement)){var C={onInput:this.valueElement.oninput};this.valueElement.oninput=null,this.valueElement.addEventListener("keydown",(function(e){"Enter"===n.eventKey(e)&&(a.valueElement&&a.processValueInput(a.valueElement.value),a.tryHide())}),!1),this.valueElement.addEventListener("change",(function(e){if(!n.getData(e,"internal")){var t=a.valueElement.value;a.processValueInput(a.valueElement.value),n.triggerCallback(a,"onChange"),a.valueElement.value!==t&&n.triggerInputEvent(a.valueElement,"change",!0,!0)}}),!1),this.valueElement.addEventListener("input",(function(e){n.getData(e,"internal")||(a.valueElement&&a.fromString(a.valueElement.value,n.flags.leaveValue),n.triggerCallback(a,"onInput"))}),!1),C.onInput&&this.valueElement.addEventListener("input",C.onInput,!1),this.valueElement.setAttribute("autocomplete","off"),this.valueElement.setAttribute("autocorrect","off"),this.valueElement.setAttribute("autocapitalize","off"),this.valueElement.setAttribute("spellcheck",!1)}this.alphaElement&&n.isTextInput(this.alphaElement)&&(this.alphaElement.addEventListener("keydown",(function(e){"Enter"===n.eventKey(e)&&(a.alphaElement&&a.processAlphaInput(a.alphaElement.value),a.tryHide())}),!1),this.alphaElement.addEventListener("change",(function(e){if(!n.getData(e,"internal")){var t=a.alphaElement.value;a.processAlphaInput(a.alphaElement.value),n.triggerCallback(a,"onChange"),n.triggerInputEvent(a.valueElement,"change",!0,!0),a.alphaElement.value!==t&&n.triggerInputEvent(a.alphaElement,"change",!0,!0)}}),!1),this.alphaElement.addEventListener("input",(function(e){n.getData(e,"internal")||(a.alphaElement&&a.fromHSVA(null,null,null,parseFloat(a.alphaElement.value),n.flags.leaveAlpha),n.triggerCallback(a,"onInput"),n.triggerInputEvent(a.valueElement,"input",!0,!0))}),!1),this.alphaElement.setAttribute("autocomplete","off"),this.alphaElement.setAttribute("autocorrect","off"),this.alphaElement.setAttribute("autocapitalize","off"),this.alphaElement.setAttribute("spellcheck",!1));var M="FFFFFF";void 0!==this.value?M=this.value:this.valueElement&&void 0!==this.valueElement.value&&(M=this.valueElement.value);var y=void 0;if(void 0!==this.alpha?y=""+this.alpha:this.alphaElement&&void 0!==this.alphaElement.value&&(y=this.alphaElement.value),this._currentFormat=null,["auto","any"].indexOf(this.format.toLowerCase())>-1){var b=n.parseColorString(M);this._currentFormat=b?b.format:"hex"}else this._currentFormat=this.format.toLowerCase();this.processValueInput(M),void 0!==y&&this.processAlphaInput(y),this.random&&this.randomize.apply(this,Array.isArray(this.random)?this.random:[])}},n.pub.className="jscolor",n.pub.activeClassName="jscolor-active",n.pub.looseJSON=!0,n.pub.presets={},n.pub.presets.default={},n.pub.presets.light={backgroundColor:"rgba(255,255,255,1)",controlBorderColor:"rgba(187,187,187,1)",buttonColor:"rgba(0,0,0,1)"},n.pub.presets.dark={backgroundColor:"rgba(51,51,51,1)",controlBorderColor:"rgba(153,153,153,1)",buttonColor:"rgba(240,240,240,1)"},n.pub.presets.small={width:101,height:101,padding:10,sliderSize:14,paletteCols:8},n.pub.presets.medium={width:181,height:101,padding:12,sliderSize:16,paletteCols:10},n.pub.presets.large={width:271,height:151,padding:12,sliderSize:24,paletteCols:15},n.pub.presets.thin={borderWidth:1,controlBorderWidth:1,pointerBorderWidth:1},n.pub.presets.thick={borderWidth:2,controlBorderWidth:2,pointerBorderWidth:2},n.pub.sliderInnerSpace=3,n.pub.chessboardSize=8,n.pub.chessboardColor1="#666666",n.pub.chessboardColor2="#999999",n.pub.previewSeparator=["rgba(255,255,255,.65)","rgba(128,128,128,.65)"],n.pub.init=function(){if(!n.initialized)for(e.document.addEventListener("mousedown",n.onDocumentMouseDown,!1),e.document.addEventListener("keyup",n.onDocumentKeyUp,!1),e.addEventListener("resize",n.onWindowResize,!1),e.addEventListener("scroll",n.onWindowScroll,!1),n.pub.install(),n.initialized=!0;n.readyQueue.length;)n.readyQueue.shift()()},n.pub.install=function(e){var t=!0;try{n.installBySelector("[data-jscolor]",e)}catch(e){t=!1,console.warn(e)}if(n.pub.lookupClass)try{n.installBySelector("input."+n.pub.lookupClass+", button."+n.pub.lookupClass,e)}catch(e){}return t},n.pub.ready=function(e){return"function"!=typeof e?(console.warn("Passed value is not a function"),!1):(n.initialized?e():n.readyQueue.push(e),!0)},n.pub.trigger=function(e){var t=function(){n.triggerGlobal(e)};n.initialized?t():n.pub.ready(t)},n.pub.hide=function(){n.picker&&n.picker.owner&&n.picker.owner.hide()},n.pub.chessboard=function(e){return e||(e="rgba(0,0,0,0)"),n.genColorPreviewCanvas(e).canvas.toDataURL()},n.pub.background=function(e){var t=[];t.push(n.genColorPreviewGradient(e));var o=n.genColorPreviewCanvas();return t.push(["url('"+o.canvas.toDataURL()+"')","left top","repeat"].join(" ")),t.join(", ")},n.pub.options={},n.pub.lookupClass="jscolor",n.pub.installByClassName=function(){return console.error('jscolor.installByClassName() is DEPRECATED. Use data-jscolor="" attribute instead of a class name.'+n.docsRef),!1},n.register(),n.pub);return void 0===e.jscolor&&(e.jscolor=e.JSColor=i),i}))}},t={};function o(a){var n=t[a];if(void 0!==n)return n.exports;var i=t[a]={exports:{}};return e[a].call(i.exports,i,i.exports,o),i.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var a in t)o.o(t,a)&&!o.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";class e{constructor(e,t,o){this.defaultValue=e,this.type=t,this.group=o}}function t(e,t){Game.promptWrapL.className="framed",Game.promptL.innerHTML=`${e}<div class="optionBox"></div>`,Object.keys(t).forEach((e=>{const o=document.createElement("a");o.id=`promptOption${e}`,o.className="option",o.onclick=function(){PlaySound("snd/tick.mp3"),t[e][1]()},o.textContent=t[e][0],Game.promptL.children[1].appendChild(o)})),Game.promptAnchorL.style.display="block",Game.darkenL.style.display="block",Game.promptL.focus(),Game.promptOn=1,Game.UpdatePrompt()}function a(e,t,o,n){(1===Game.mods.cookieMonsterFramework.saveData[e].settings[o]||n)&&3===t&&!1===window.cookieMonsterFrameworkData.isInitializing||1===t?(l("CMFlashScreen").style.backgroundColor=Game.mods.cookieMonsterFramework.saveData[e].settings[`Colour${o}`],l("CMFlashScreen").style.opacity="0.5",3===t?(l("CMFlashScreen").style.display="inline",setTimeout((()=>{a(e,2,o,!0)}),1e3/Game.fps)):setTimeout((()=>{a(e,0,o,!0)}),1e3/Game.fps)):2===t?(l("CMFlashScreen").style.opacity="1",setTimeout((()=>{a(e,1,o,!0)}),1e3/Game.fps)):0===t&&(l("CMFlashScreen").style.display="none")}function n(){Object.keys(Game.mods.cookieMonsterFramework.saveData).forEach((e=>{const t=JSON.stringify(Game.mods.cookieMonsterFramework.saveData[e]),o=b64_to_utf8(unescape(localStorage.getItem("CookieClickerGame")).split("!END!")[0]),a=new RegExp(`${e}.*(;|$)`),n=o.match(a);if(null!==n){const a=o.replace(n[0],`${e}:${t}`);localStorage.setItem("CookieClickerGame",escape(`${utf8_to_b64(a)}!END!`))}}))}function i(e,t){void 0===Game.mods.cookieMonsterFramework.saveData[e].headers[t]&&(Game.mods.cookieMonsterFramework.saveData[e].headers[t]=1),0===Game.mods.cookieMonsterFramework.saveData[e].headers[t]?Game.mods.cookieMonsterFramework.saveData[e].headers[t]=1:Game.mods.cookieMonsterFramework.saveData[e].headers[t]=0,n()}var r=o(877),s=o.n(r);function c(e,t,o,a,n){if((1===Game.mods.cookieMonsterFramework.saveData[e].settings[o]||n)&&!1===window.cookieMonsterFrameworkData.isInitializing){const o=new Audio(t);Game.mods.cookieMonsterFramework.saveData[e].settings.GeneralSound?o.volume=Game.mods.cookieMonsterFramework.saveData[e].settings[a]/100*(Game.volume/100):o.volume=Game.mods.cookieMonsterFramework.saveData[e].settings[a]/100,o.play()}}function d(e,t){null!==l(`slider${e}${t}`)&&(l(`slider${e}${t}right`).innerHTML=`${l(`slider${e}${t}`).value}%`,Game.mods.cookieMonsterFramework.saveData[e].settings[t]=Math.round(l(`slider${e}${t}`).value)),n()}function m(e,t){t.disconnect(),"log"===Game.onMenu?function(){const e=l("menu").children[1];if(e.insertBefore(function(){const e=document.createElement("div");e.className="subsection",e.id="cookieMonsterFrameworkMenuSection";const t=document.createElement("div");t.className="title",t.innerHTML="Cookie Monster Mod Family";const o=document.createElement("span");if(o.style.cursor="pointer",o.style.display="inline-block",o.style.height="14px",o.style.width="14px",o.style.borderRadius="7px",o.style.textAlign="center",o.style.backgroundColor="#C0C0C0",o.style.color="black",o.style.fontSize="13px",o.style.verticalAlign="middle",o.textContent=Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu?"-":"+",o.onclick=function(){i("cookieMonsterFramework","infoMenu"),Game.UpdateMenu()},t.appendChild(o),e.appendChild(t),Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu){const t=document.createElement("div");t.className="listing",t.innerHTML='<a href="https://github.com/CookieMonsterTeam" target="blank">Cookie Monster Team</a>\noffers a suite of tools to enhance your game experience.</br>\nOriginally known from our work on the Cookie Monster add-on we are now expanding and working on new tools within the Cookie Monster Mod Family.</br>\nKeep an eye on our GitHub to see future work or use it to report bugs or feature requests!</br>\n',e.appendChild(t)}return e}(),e.children[1]),Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu){const e=Game.mods.cookieMonsterFramework.listeners.infoMenu;for(let t=0;t<e.length;t++)l("cookieMonsterFrameworkMenuSection").appendChild(e[t]())}}():Game.onMenu,t.observe(document.getElementById("menu"),{attributes:!0,childList:!0,subtree:!0})}function p(){}const u={infoMenu:1,optionsMenu:1};function h(e,t,o,a,i){const r=JSON.parse(t);Game.mods.cookieMonsterFramework.saveData[e]=function(e,t,o){const a={},n={};Object.keys(t).forEach((o=>{void 0===e.settings||void 0===e.settings[o]?n[o]=t[o].defaultValue:n[o]=e.settings[o]})),a.settings=n;const i={};return Object.keys(o).forEach((t=>{void 0===e.headers||void 0===e.headers[t]?i[t]=o[t]:i[t]=e.headers[t]})),a.headers=i,Object.keys(e).forEach((t=>{"settings"!==t&&"headers"!==t&&(a[t]=e[t])})),void 0===a.favouriteSettings&&(a.favouriteSettings=[]),a}(r,o,a),n(),i(),Object.keys(Game.mods.cookieMonsterFramework.saveData[e].settings).forEach((e=>{void 0!==o[e].func&&o[e].func()})),Game.UpdateMenu()}function g(){}const f={};function k(e){h("cookieMonsterFramework",e,f,u,g)}const C={init:function(){window.cookieMonsterFrameworkData={isInitializing:!0},new MutationObserver(m).observe(document.getElementById("menu"),{attributes:!0,childList:!0,subtree:!0}),function(){const e=document.createElement("div");e.id="CMFlashScreen",e.style.width="100%",e.style.height="100%",e.style.backgroundColor="white",e.style.display="none",e.style.zIndex="9999999999",e.style.position="absolute",e.style.pointerEvents="none",l("wrapper").appendChild(e)}(),Game.registerHook("draw",p),void 0===Game.modSaveData.cookieMonsterFramework&&k("{}"),window.cookieMonsterFrameworkData.isInitializing=!1},load:k,save:function(){return JSON.stringify(Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework)},listeners:{infoMenu:[],optionsMenu:[]},saveData:{cookieMonsterFramework:{headers:{},settings:{}}}},M=function(){"undefined"==typeof cookieMonsterFrameworkData&&Game.registerMod("cookieMonsterFramework",C)},y=function(e){Game.mods.cookieMonsterFramework.saveData[e]={favouriteSettings:[],headers:{},settings:{}}},b={createInfoListing:function(e){const t=document.createElement("div");return t.className="listing",t.innerHTML=e,t},createOptionsListing:function(e,o,i,m,p){const u=document.createElement("div");if(u.className="listing",1===Game.mods.cookieMonsterFramework.saveData[e].settings.FavouriteSettings&&u.appendChild(function(e,t,o){const a=document.createElement("a");return o.includes(t)?(a.innerText="★",a.style.color="yellow"):a.innerText="☆",a.className="option",a.onclick=function(){!function(e,t){Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings.includes(t)?Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings=Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings.filter((e=>e!==t)):Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings.push(t),n()}(e,t),n(),Game.UpdateMenu()},a.onmouseover=function(){Game.tooltip.draw(this,escape('<div style="min-width: 250px; margin-bottom: 4px;"><div style="text-align: left;">Click to set this setting as favourite and show it in \'favourite\' settings at the top of the Cookie Monster Settings</div></div>'))},a.onmouseout=function(){Game.tooltip.hide()},a.appendChild(document.createTextNode(" ")),a}(e,o,Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings)),"bool"===i[o].type){const t=document.createElement("a");i[o].toggle&&0===Game.mods.cookieMonsterFramework.saveData[e].settings[o]?t.className="option off":t.className="option",t.id=`${e}Options${o}`,t.onclick=function(){!function(e,t,o){Game.mods.cookieMonsterFramework.saveData[e].settings[t]+=1,Game.mods.cookieMonsterFramework.saveData[e].settings[t]===o[t].label.length?(Game.mods.cookieMonsterFramework.saveData[e].settings[t]=0,o[t].toggle&&(l(`${e}Options${t}`).className="option off")):l(`${e}Options${t}`).className="option",void 0!==o[t].func&&o[t].func(),n()}(e,o,i),Game.UpdateMenu()},t.textContent=i[o].label[Game.mods.cookieMonsterFramework.saveData[e].settings[o]],u.appendChild(t);const a=document.createElement("label");return a.textContent=i[o].desc,a.style.lineHeight="1.6",u.appendChild(a),u}if("vol"===i[o].type){const t=document.createElement("div");t.className="sliderBox";const a=document.createElement("div");a.style.float="left",a.innerHTML=i[o].desc,t.appendChild(a);const n=document.createElement("div");n.id=`slider${e}${o}right`,n.style.float="right",n.innerHTML=`${Game.mods.cookieMonsterFramework.saveData[e].settings[o]}%`,t.appendChild(n);const r=document.createElement("input");r.className="slider",r.id=`slider${e}${o}`,r.style.clear="both",r.type="range",r.min="0",r.max="100",r.step="1",r.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o],r.oninput=function(){d(e,o),Game.UpdateMenu()},r.onchange=function(){d(e,o),Game.UpdateMenu()},t.appendChild(r),u.appendChild(t);const s=document.createElement("a");return s.className="option",s.onclick=function(){c(e,Game.mods.cookieMonsterFramework.saveData[e].settings[o.replace("Volume","SoundURL")],o.replace("Volume","Sound"),o,!0)},s.textContent="Test sound",u.appendChild(s),u}if("url"===i[o].type){const a=document.createElement("span");a.className="option",a.textContent=`${i[o].label} `,a.style.lineHeight="1.6",u.appendChild(a);const r=document.createElement("input");r.id=`${e}Options${o}`,r.className="option",r.type="text",r.readOnly=!0,r.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o],r.style.width="300px",u.appendChild(r),u.appendChild(document.createTextNode(" "));const s=document.createElement("input");s.id=`${e}Options${o}Prompt`,s.className="option",s.type="text",s.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o];const c=document.createElement("a");c.className="option",c.onclick=function(){t(s.outerHTML,[["Save",function(){Game.mods.cookieMonsterFramework.saveData[e].settings[o]=l(`${e}Options${o}Prompt`).value,n(),Game.ClosePrompt(),Game.UpdateMenu()}],["Cancel",function(){Game.ClosePrompt()}]])},c.textContent="Edit",u.appendChild(c);const d=document.createElement("label");return d.textContent=i[o].desc,d.style.lineHeight="1.6",u.appendChild(d),u}if("colour"===i[o].type){const t=document.createElement("span");t.className="option";const l=document.createElement("input");l.id=o,l.style.width="65px",l.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o],t.appendChild(l),new r(l,{hash:!0,position:"right",onInput:function(){Game.mods.cookieMonsterFramework.saveData[e].settings[this.targetElement.id]=this.toHEXString(),m(),n(),Game.UpdateMenu()}});const c=document.createElement("label");if(c.textContent=i[o].desc,c.style.lineHeight="1.6",t.appendChild(c),o.includes("Flash")){const n=document.createElement("a");n.className="option",n.onclick=function(){a(e,3,o.replace("Colour",""),!0)},n.textContent="Test flash",t.appendChild(n)}return u.appendChild(t),s().init(),u}if("numscale"===i[o].type){const t=document.createElement("span");t.className="option",t.textContent=`${i[o].label} `,t.style.lineHeight="1.6",u.appendChild(t);const a=document.createElement("input");a.id=`${e}Options${o}`,a.className="option",a.type="number",a.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o],a.min=i[o].min,a.max=i[o].max,a.oninput=function(){Game.mods.cookieMonsterFramework.saveData[e].settings[o]=this.value,n(),p(),Game.UpdateMenu()},u.appendChild(a),u.appendChild(document.createTextNode(" "));const r=document.createElement("label");return r.textContent=i[o].desc,r.style.lineHeight="1.6",u.appendChild(r),u}if("keycode"===i[o].type){const a=document.createElement("input");a.id=`${e}Options${o}Prompt`,a.className="option",a.type="text",a.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o].displayName;const r=document.createElement("a");r.className="option",r.id=`${e}Options${o}`,r.onclick=function(){t(a.outerHTML,[]),l(`${e}Options${o}Prompt`).addEventListener("keyup",(t=>{!function(e,t,o){const a={key:o.key,altKey:o.altKey,ctrlKey:o.ctrlKey,shiftKey:o.shiftKey,displayName:`${o.shiftKey?"Shift + ":""}${o.altKey?"Alt + ":""}${o.ctrlKey?"Ctrl + ":""}${o.key}`};Game.mods.cookieMonsterFramework.saveData[e].settings[t]=a,n()}(e,o,t),Game.ClosePrompt(),Game.UpdateMenu()}))},r.textContent=Game.mods.cookieMonsterFramework.saveData[e].settings[o].displayName,u.appendChild(r);const s=document.createElement("label");return s.textContent=i[o].desc,s.style.lineHeight="1.6",u.appendChild(s),u}return u},createOptionsSubHeader:function(e,t,o){const a=document.createElement("div");a.className="title",a.style.opacity="0.7",a.style.fontSize="17px",a.appendChild(document.createTextNode(`${o} `));const n=document.createElement("span");return n.style.cursor="pointer",n.style.display="inline-block",n.style.height="14px",n.style.width="14px",n.style.borderRadius="7px",n.style.textAlign="center",n.style.backgroundColor="#C0C0C0",n.style.color="black",n.style.fontSize="13px",n.style.verticalAlign="middle",n.textContent=Game.mods.cookieMonsterFramework.saveData[e].headers[t]?"-":"+",n.onclick=function(){i(e,t),Game.UpdateMenu()},a.appendChild(n),a}},G=function(e,t,o){const a=document.createElement("div");a.className="subsection",a.id=`${e}MenuSection`;const n=document.createElement("div");n.className="title",n.style.fontSize="18px",n.innerHTML=t;const r=document.createElement("span");return r.style.cursor="pointer",r.style.display="inline-block",r.style.height="14px",r.style.width="14px",r.style.borderRadius="7px",r.style.textAlign="center",r.style.backgroundColor="#C0C0C0",r.style.color="black",r.style.fontSize="13px",r.style.verticalAlign="middle",r.textContent=Game.mods.cookieMonsterFramework.saveData[e].headers[o]?"-":"+",r.onclick=function(){i(e,o),Game.UpdateMenu()},n.appendChild(r),a.appendChild(n),a},v={createFlash:a,createNotification:function(e,t,o,a){1===Game.mods.cookieMonsterFramework.saveData[e].settings[t]&&"hidden"===document.visibilityState&&!1===window.cookieMonsterFrameworkData.isInitializing&&new Notification(o,{body:a,badge:"https://orteil.dashnet.org/cookieclicker/favicon.ico"})},cookieMonsterPrompt:t,playCMSound:c},w={loadMod:h,saveFramework:n},x=class extends e{constructor(e,t,o,a){super(e,t,o),this.desc=a}},T=class extends e{constructor(e,t,o,a,n,i,r){super(e,t,o),this.label=a,this.desc=n,this.min=i,this.max=r}},S=class extends e{constructor(e,t,o,a,n,i){super(e,t,o),this.label=a,this.desc=n,this.toggle=i}},F=class extends e{constructor(e,t,o,a,n,i,r){super(e,t,o),this.label=a,this.desc=n,this.toggle=i,void 0!==r&&(this.func=r)}},E=class extends e{constructor(e,t,o,a,n){super(e,t,o),this.label=a,this.desc=n;for(let e=0;e<101;e++)this.label[e]=`${e}%`}};function B(){Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerButtons&&Game.elderWrath?(l("PopAllNormalWrinklerButton").style.display="",l("PopFattestWrinklerButton").style.display=""):(l("PopAllNormalWrinklerButton").style.display="none",l("PopFattestWrinklerButton").style.display="none")}let P,N,O,D,L,A,W,j,$,U,H,R,I,z,V,_,X,Q,q,Y,K,J,Z,ee,te,oe,ae,ne,ie,re,se,le,ce,de,me,pe,ue=0,he=0,ge=0,fe=0,ke=0,Ce=0,Me=0,ye=0,be=0,Ge=0,ve=0,we=0,xe=0,Te=0,Se=0,Fe=1,Ee=1,Be=1,Pe=0,Ne=0,Oe=0,De=0,Le={},Ae={},We={},je={},$e=0,Ue=0,He=[0,null],Re=0,Ie=0,ze={},Ve={},_e={},Xe={},Qe={},qe=0,Ye=0,Ke=[],Je=0,Ze=0,et=[],tt=0,ot=0,at=[],nt=0,it=0,rt=[],st=0,lt=0,ct={},dt={},mt=0,pt=0,ut=0,ht=[],gt={},ft=0,kt={0:[0,0,0],1:[0,0,0],2:[0,0,0],3:[0,0,0],4:[0,0,0],5:[0,0,0],6:[0,0,0],7:[0,0,0],8:[0,0,0],9:[0,0,0],10:[0,0,0]},Ct=[],Mt=[],yt=[];function bt(e){let t=0;return Game.dragonAuras[ne].name!==e&&Game.dragonAuras[ie].name!==e||(t=1),("Reality Bending"===Game.dragonAuras[ne].name||"Reality Bending"===Game.dragonAuras[ie].name&&Game.dragonLevel>=Game.dragonAurasBN[e].id+4)&&(t+=.1),t}function Gt(){let e=.25;return e*=1+bt("Earth Shatterer"),e}function vt(e,t){return void 0===de[e]?void 0===t?1:t:de[e]}function wt(e){const t=Mt[e];return(!t||1!==Game.ascensionMode||"prestige"!==t.pool&&"fortune"!==t.tier)&&t?t.bought:0}function xt(e){return Game.dragonAuras[ne].name===e||Game.dragonAuras[ie].name===e}function Tt(e){if(Game.hasGod){void 0===Ct.Temple.minigame&&(Ct.Temple.minigame=Game.Objects.Temple.minigame);const t=Ct.Temple.minigame.gods[e];if(re===t.id)return 1;if(se===t.id)return xt("Supreme Intellect")?1:2;if(le===t.id)return xt("Supreme Intellect")?2:3}return!1}function St(e,t){let o=t;if(wt("Season savings")&&(o*=.99),wt("Santa's dominion")&&(o*=.99),wt("Faberge egg")&&(o*=.99),wt("Divine discount")&&(o*=.99),wt("Fortune #100")&&(o*=.99),o*=1-.02*bt("Fierce Hoarder"),Game.hasBuff("Everything must go")&&(o*=.95),Game.hasBuff("Crafty pixies")&&(o*=.98),Game.hasBuff("Nasty goblins")&&(o*=1.02),e.fortune&&wt(e.fortune.name)&&(o*=.93),o*=vt("buildingCost"),Ct.Temple.minigameLoaded){const e=Tt("creation");1===e?o*=.93:2===e?o*=.95:3===e&&(o*=.98)}return o}function Ft(e,t,o,a,n,i){const r=void 0===i?0:i;let s=n,l=o,c=0;-1===n&&(s=l),n||(s=Game.buyBulk);for(let o=0;o<s;o++){let o=t*Game.priceIncrease**Math.max(0,l-a);o=r?Game.modifyBuildingPrice(e,o):St(e,o),o=Math.ceil(o);const n=r?e.getSellMultiplier():Gt();o=Math.floor(o*n),l>0&&(c+=o,l-=1)}return c}const Et=["","","M","G","T","P","E","Z","Y"],Bt=["","","M","B","Tr","Quadr","Quint","Sext","Sept","Oct","Non","Dec","Undec","Duodec","Tredec","Quattuordec","Quindec","Sexdec","Septendec","Octodec","Novemdec","Vigint","Unvigint","Duovigint","Trevigint","Quattuorvigint"],Pt=["","K","M","B","T","Qa","Qi","Sx","Sp","Oc","No","De","UDe","DDe","TDe","QaDe","QiDe","SxDe","SpDe","ODe","NDe","Vi","UVi","DVi","TVi","QaVi","QiVi","SxVi","SpVi","OVi","NVi","Tr","UTr","DTr","TTr","QaTr","QiTr","SxTr","SpTr","OTr","NTr","Qaa","UQa","DQa","TQa","QaQa","QiQa","SxQa","SpQa","OQa","NQa","Qia","UQi","DQi","TQi","QaQi","QiQi","SxQi","SpQi","OQi","NQi","Sxa","USx","DSx","TSx","QaSx","QiSx","SxSx","SpSx","OSx","NSx","Spa","USp","DSp","TSp","QaSp","QiSp","SxSp","SpSp","OSp","NSp","Oco","UOc","DOc","TOc","QaOc","QiOc","SxOc","SpOc","OOc","NOc","Noa","UNo","DNo","TNo","QaNo","QiNo","SxNo","SpNo","ONo","NNo","Ct","UCt"];let Nt,Ot,Dt,Lt,At,Wt,jt,$t,Ut,Ht,Rt,It,zt,Vt,_t,Xt,Qt,qt=[],Yt=[],Kt=[],Jt={},Zt=Date.now(),eo=Date.now();function to(e,t,o){const a=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleDecimals+1;if(e===1/0)return"Infinity";if(void 0===e)return"0";if(0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale)return Jt.Beautify(e,t);if(Number.isFinite(e)){if(e<0)return`-${to(Math.abs(e))}`;let n="";if(0===e)return e.toString();if(e>.001&&e<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleCutoff)return n=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?e.toLocaleString("nl"):e.toLocaleString("en"),n;if(4===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||4===o)n=e.toExponential(a).toString().replace("e","E");else{const t=e.toExponential().toString(),i=Math.floor(t.slice(t.indexOf("e")+1)/3);n=(e/Number("1e"+3*i)).toFixed(a),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||1===o?e>=.01&&e<Number("1e"+3*Et.length)?n+=` ${Et[i]}`:n=to(e,0,4):2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||2===o?e>=.01&&e<Number("1e"+3*Bt.length)?n+=` ${Bt[i]}`:n=to(e,0,4):3===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||3===o?e>=.01&&e<Number("1e"+3*Pt.length)?n+=` ${Pt[i]}`:n=to(e,0,4):(5===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||5===o)&&(n+="E"+3*i)}return""===n&&(console.log(`Could not beautify number with Cookie Monster Beautify: ${e}`),n=Jt.Beautify(e,t)),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator&&(n=n.replace(".",",")),n}return console.log(`Could not beautify number with Cookie Monster Beautify: ${e}`),Jt.Beautify(e,t)}const oo="CMText",ao="CMBack",no="Blue",io="Green",ro="Yellow",so="Orange",lo="Red",co="Purple",mo="Gray",po="Pink",uo="Brown",ho=[no,io,ro,so,lo,co,po,uo,mo],go=[["GoldCookTooltipPlaceholder","Calculated with Golden Switch off","200px"],["GoldCookDragonsFortuneTooltipPlaceholder","Calculated with Golden Switch off and at least one golden cookie on-screen","240px"],["PrestMaxTooltipPlaceholder","The MAX prestige is calculated with the cookies gained from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and buying Chocolate egg","320px"],["NextPrestTooltipPlaceholder","Calculated with cookies gained from wrinklers and Chocolate egg","200px"],["HeavenChipMaxTooltipPlaceholder","The MAX heavenly chips is calculated with the cookies gained from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and buying Chocolate egg","330px"],["ResetTooltipPlaceholder","The bonus income you would get from new prestige levels unlocked at 100% of its potential and from ascension achievements if you have the same buildings/upgrades after reset","370px"],["ChoEggTooltipPlaceholder","The amount of cookies you would get from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and then buying Chocolate egg","300px"],["ChainNextLevelPlaceholder","Cheated cookies might break this formula","250px"],["FavouriteSettingPlaceholder","Click to set this setting as favourite and show it in 'favourite' settings at the top of the Cookie Monster Settings","250px"]],fo={};let ko,Co=0,Mo=-1,yo=[],bo=function(){},Go=1,vo=1,wo=1;const xo=[10,15,30,60,300,600,900,1800],To=[1,5,10,15,30],So={Frenzy:ro,"Dragon Harvest":uo,"Elder frenzy":io,Clot:lo,"Click frenzy":no,Dragonflight:po};let Fo,Eo,Bo,Po,No,Oo,Do,Lo={},Ao="";function Wo(){let e,t=Game.buyBulk;1===Game.buyMode?vo=t:t=vo,1===t?t=Le:10===t?t=Ae:100===t&&(t=We),l("storeBulk1").style.removeProperty("color"),l("storeBulk10").style.removeProperty("color"),l("storeBulk100").style.removeProperty("color"),1===Game.buyMode?1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BuildColour?(Object.keys(t).forEach((e=>{l(`productPrice${Game.Objects[e].id}`).style.color=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[`Colour${t[e].colour}`]})),l(`storeBulk${ut}`).style.color=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ColourGreen):Object.keys(Game.Objects).forEach((e=>{l(`productPrice${Game.Objects[e].id}`).style.removeProperty("color")})):-1===Game.buyMode&&Object.keys(Le).forEach((e=>{const t=Game.Objects[e];l(`productPrice${t.id}`).style.color="",l(`productPrice${t.id}`).innerHTML=to(Ft(t,t.basePrice,t.amount,t.free,Game.buyBulk,1))})),1===Game.buyMode&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings?1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings?(e=Object.keys(Le).map((e=>{const t={};return t.name=e,t.pp=Le[e].pp,t.colour=Le[e].colour,t})),e.sort(((e,t)=>ho.indexOf(e.colour)===ho.indexOf(t.colour)?e.pp-t.pp:ho.indexOf(e.colour)-ho.indexOf(t.colour)))):2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings?(e=Object.keys(t).map((e=>{const o={};return o.name=e,o.pp=t[e].pp,o.colour=t[e].colour,o})),e.sort(((e,t)=>ho.indexOf(e.colour)===ho.indexOf(t.colour)?e.pp-t.pp:ho.indexOf(e.colour)-ho.indexOf(t.colour)))):3===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings&&(e=Object.keys(je).map((e=>{const t={};return t.name=e,t.id=Game.Objects[e].id,t.amountUntilNext=je[e].AmountNeeded,t.priceUntilNext=je[e].price,t})),e.sort(((e,t)=>e.id-t.id)),e.sort(((e,t)=>(101!==e.amountUntilNext?e.priceUntilNext:1/0)-(101!==t.amountUntilNext?t.priceUntilNext:1/0)))):(e=Object.keys(Le).map((e=>{const t={};return t.name=e,t.id=Game.Objects[e].id,t})),e.sort(((e,t)=>e.id-t.id)));for(let t=0;t<e.length;t++)Game.Objects[e[t].name].l.style.gridRow=`${t+2}/${t+2}`}function jo(){Object.values(document.getElementsByClassName("storeSection")).forEach((e=>{Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpgradesNeverCollapse||"products"===e.id?e.style.height="auto":"vaultUpgrades"===e.id?(e.style.height="",e.style.minHeight="0px"):"upgrades"===e.id?(e.style.height="",e.className.includes("hasMenu")?e.style.minHeight="82px":e.style.minHeight="60px"):(e.style.height="",e.style.minHeight="60px")}))}function $o(){if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour>0){let e=0,t=0,o=0,a=0,n=0,i=0,r=0;Object.keys(Game.UpgradesInStore).forEach((s=>{const c=Game.UpgradesInStore[s];let d=!1;for(let e=0;e<l(`upgrade${s}`).childNodes.length;e+=1)if(-1!==l(`upgrade${s}`).childNodes[e].className.indexOf(ao)){l(`upgrade${s}`).childNodes[e].className=ao+ze[c.name].colour,d=!0;break}if(!d){const e=document.createElement("div");e.style.width="10px",e.style.height="10px",e.className=ao+ze[c.name].colour,l(`upgrade${s}`).appendChild(e)}ze[c.name].colour===no?e+=1:ze[c.name].colour===io?t+=1:ze[c.name].colour===ro?o+=1:ze[c.name].colour===so?a+=1:ze[c.name].colour===lo?n+=1:ze[c.name].colour===co?i+=1:ze[c.name].colour===mo&&(r+=1)})),l("CMUpgradeBarBlue").textContent=e,l("CMUpgradeBarGreen").textContent=t,l("CMUpgradeBarYellow").textContent=o,l("CMUpgradeBarOrange").textContent=a,l("CMUpgradeBarRed").textContent=n,l("CMUpgradeBarPurple").textContent=i,l("CMUpgradeBarGray").textContent=r}const e=[];for(let t=0;t<Game.UpgradesInStore.length;t+=1){const o={};o.name=Game.UpgradesInStore[t].name,o.price=Game.UpgradesInStore[t].basePrice,o.pp=ze[o.name].pp,o.colour=ze[o.name].colour,e.push(o)}Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortUpgrades?e.sort(((e,t)=>ho.indexOf(e.colour)===ho.indexOf(t.colour)?e.pp-t.pp:ho.indexOf(e.colour)-ho.indexOf(t.colour))):e.sort(((e,t)=>e.price-t.price));const t=function(e,t){return e.findIndex((e=>e.name===t.name))};for(let o=0;o<Game.UpgradesInStore.length;o+=1)l(`upgrade${o}`).style.order=t(e,Game.UpgradesInStore[o])+1}function Uo(e,t){let o=e;if(e===1/0)return e;if(e<0)return"Negative time period";o=Math.ceil(e);const a=Math.floor(o/31536e3),n=Math.floor(o%31536e3/86400),i=Math.floor(o%31536e3%86400/3600),r=Math.floor(o%31536e3%86400%3600/60),s=Math.floor(o%31536e3%86400%3600%60);let l="";if(0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat){if(o>7776e5)return t?"Over 9000 days!":">9000d";l+=a>0?a+(t?1===a?" year":" years":"y")+", ":"",(l.length>0||n>0)&&(l+=n+(t?1===n?" day":" days":"d")+", "),(l.length>0||i>0)&&(l+=i+(t?1===i?" hour":" hours":"h")+", "),(l.length>0||r>0)&&(l+=r+(t?1===r?" minute":" minutes":"m")+", "),l+=s+(t?1===s?" second":" seconds":"s")}else if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat){if(o>315576e4)return"XX:XX:XX:XX:XX";l+=(a<10?"0":"")+a+":",l+=(n<10?"0":"")+n+":",l+=(i<10?"0":"")+i+":",l+=(r<10?"0":"")+r+":",l+=(s<10?"0":"")+s}else{if(o>7776e5)return t?"Over 9000 days!":">9000d";a>0?(l+=a+(t?1===a?" year":" years":"y")+", ",l+=n+(t?1===n?" day":" days":"d")):n>0?(l+=n+(t?1===n?" day":" days":"d")+", ",l+=i+(t?1===i?" hour":" hours":"h")):i>0?(l+=i+(t?1===i?" hour":" hours":"h")+", ",l+=r+(t?1===r?" minute":" minutes":"m")):r>0?(l+=r+(t?1===r?" minute":" minutes":"m")+", ",l+=s+(t?1===s?" second":" seconds":"s")):l+=s+(t?1===s?" second":" seconds":"s")}return l}function Ho(e){let t,o;return e<=0?(o=1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat?"00:00:00:00:00":"Done!",t=io):(o=Uo(e),t=e>300?lo:e>60?so:ro),{text:o,colour:t}}function Ro(){return Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CPSMode?X:0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?Game.cookiesPs*(1-Game.cpsSucked):1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?Game.cookiesPs*(Re+(1-.05*Ie)):null!==He[1]&&2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink&&1===Game.wrinklers[He[1]].type?Game.cookiesPs*(3*Re/Ie+(1-.05*Ie)):Game.cookiesPs*(Re/Ie+(1-.05*Ie))}function Io(){return 1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?$e:2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?He[0]:0}function zo(e,t,o){const a=document.createElement("div");a.id=e,a.style.height="12px",a.style.margin="0px 10px",a.style.position="relative";const n=document.createElement("div");n.style.width="100%",n.style.height="10px",n.style.margin="auto",n.style.position="absolute",n.style.left="0px",n.style.top="0px",n.style.right="0px",n.style.bottom="0px";const i=document.createElement("span");i.style.display="inline-block",i.style.textAlign="right",i.style.fontSize="10px",i.style.width="108px",i.style.marginRight="5px",i.style.verticalAlign="text-top",i.textContent=t,n.appendChild(i);for(let e=0;e<o.length;e++){const t=document.createElement("span");t.id=o[e].id,t.style.display="inline-block",t.style.height="10px",t.style.verticalAlign="text-top",t.style.textAlign="center",o.length-1===e&&(t.style.borderTopRightRadius="10px",t.style.borderBottomRightRadius="10px"),void 0!==o[e].colour&&(t.className=ao+o[e].colour),n.appendChild(t)}const r=document.createElement("span");return r.id=`${e}Time`,r.style.marginLeft="5px",r.style.verticalAlign="text-top",n.appendChild(r),a.appendChild(n),a}function Vo(e){if(null!==l("CMBotBar")){const t=l("CMBotBar").firstChild.firstChild.childNodes[0],o=l("CMBotBar").firstChild.firstChild.childNodes[1],a=l("CMBotBar").firstChild.firstChild.childNodes[2],n=l("CMBotBar").firstChild.firstChild.childNodes[3],i=e,r=t.appendChild(document.createElement("td"));r.appendChild(document.createTextNode(`${-1!==i.indexOf(" ")?i.substring(0,i.indexOf(" ")):i} (`)),r.appendChild(document.createElement("span")).className="CMTextBlue",r.appendChild(document.createTextNode(")")),t.lastChild.style.paddingLeft="8px",o.appendChild(document.createElement("td")),o.lastChild.style.paddingLeft="8px",a.appendChild(document.createElement("td")),a.lastChild.style.paddingLeft="8px",n.appendChild(document.createElement("td")),n.lastChild.style.paddingLeft="2px"}}function _o(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar&&Le&&1===Game.buyMode){let e=0;Object.keys(Le).forEach((t=>{let o,a=Game.buyBulk;1===Game.buyMode?Go=a:a=Go,1===a&&(a=Le),10===a&&(a=Ae),100===a&&(a=We),e+=1,l("CMBotBar").firstChild.firstChild.childNodes[0].childNodes[e].childNodes[1].textContent=Game.Objects[t].amount,l("CMBotBar").firstChild.firstChild.childNodes[1].childNodes[e].textContent=to(a[t].bonus,2),l("CMBotBar").firstChild.firstChild.childNodes[2].childNodes[e].className=oo+a[t].colour,o=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime?Uo(Math.round(a[t].pp)):to(Math.round(a[t].pp),2),l("CMBotBar").firstChild.firstChild.childNodes[2].childNodes[e].textContent=o;const n=Ho((Game.Objects[t].bulkPrice-(Game.cookies+Io()))/Ro());l("CMBotBar").firstChild.firstChild.childNodes[3].childNodes[e].className=oo+n.colour,"Done!"===n.text&&Game.cookies<Game.Objects[t].bulkPrice?l("CMBotBar").firstChild.firstChild.childNodes[3].childNodes[e].textContent=`${n.text} (with Wrink)`:l("CMBotBar").firstChild.firstChild.childNodes[3].childNodes[e].textContent=n.text}))}}function Xo(){Game.Background.canvas.width=Game.Background.canvas.parentNode.offsetWidth,Game.Background.canvas.height=Game.Background.canvas.parentNode.offsetHeight,Game.LeftBackground.canvas.width=Game.LeftBackground.canvas.parentNode.offsetWidth,Game.LeftBackground.canvas.height=Game.LeftBackground.canvas.parentNode.offsetHeight,Game.DrawBackground()}function Qo(){1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos?(l("CMBotBar").style.bottom=l("CMTimerBar").style.height,l("game").style.bottom=`${Number(l("CMTimerBar").style.height.replace("px",""))+70}px`):1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar?(l("CMBotBar").style.bottom="0px",l("game").style.bottom="70px"):1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos?l("game").style.bottom=l("CMTimerBar").style.height:l("game").style.bottom="0px",1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos?l("sectionLeft").style.top=l("CMTimerBar").style.height:l("sectionLeft").style.top="",Xo()}function qo(){1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar?l("CMTimerBar").style.display="":l("CMTimerBar").style.display="none",Qo()}function Yo(){ue=Game.dragonAura,he=Game.dragonAura2}function Ko(e){const t=Game.Achievements[e],o={};return o.name=t.name,o}function Jo(e){let t=1;if(Object.keys(e.tieredUpgrades).forEach((o=>{if(!Game.Tiers[e.tieredUpgrades[o].tier].special&&wt(e.tieredUpgrades[o].name)){let a=2;1!==Game.ascensionMode&&wt(e.unshackleUpgrade)&&wt(Game.Tiers[e.tieredUpgrades[o].tier].unshackleUpgrade)&&(a+=1===e.id?.5:.1*(20-e.id)),t*=a}})),Object.keys(e.synergies).forEach((o=>{if(wt(e.synergies[o].name)){const a=e.synergies[o];a.buildingTie1.name===e.name?t*=1+.05*a.buildingTie2.amount:a.buildingTie2.name===e.name&&(t*=1+.001*a.buildingTie1.amount)}})),e.fortune&&wt(e.fortune.name)&&(t*=1.07),e.grandma&&wt(e.grandma.name)&&(t*=1+.01*Ct.Grandma.amount*(1/(e.id-1))),"object"==typeof e.tieredUpgrades.misfortune&&1===e.vanilla&&wt(e.tieredUpgrades.misfortune.name))switch(Game.elderWrath){default:t*=1;break;case 1:t*=1.02;break;case 2:t*=1.04;break;case 3:t*=1.06}return t}function Zo(e){const t=Game.Objects[e],o={};return"Cursor"===t.name?o.cps=function(e){let t=0;wt("Thousand fingers")&&(t+=.1),wt("Million fingers")&&(t*=5),wt("Billion fingers")&&(t*=10),wt("Trillion fingers")&&(t*=20),wt("Quadrillion fingers")&&(t*=20),wt("Quintillion fingers")&&(t*=20),wt("Sextillion fingers")&&(t*=20),wt("Septillion fingers")&&(t*=20),wt("Octillion fingers")&&(t*=20),wt("Nonillion fingers")&&(t*=20),wt("Decillion fingers")&&(t*=20),wt("Undecillion fingers")&&(t*=20),wt("Unshackled cursors")&&(t*=25);let o=1,a=0;return Object.keys(Ct).forEach((e=>{"Cursor"!==Ct[e].name&&(a+=Ct[e].amount)})),t*=a,o*=Jo(e),o*=Game.magicCpS("Cursor"),o*=vt("cursorCps"),Game.ComputeCps(.1,wt("Reinforced index finger")+wt("Carpal tunnel prevention cream")+wt("Ambidextrous"),t)*o}:"Grandma"===t.name?o.cps=function(e){let o=1;if(Object.keys(Game.GrandmaSynergies).forEach((e=>{wt(Game.GrandmaSynergies[e])&&(o*=2)})),wt("Bingo center/Research facility")&&(o*=4),wt("Ritual rolling pins")&&(o*=2),wt("Naughty list")&&(o*=2),wt("Elderwort biscuits")&&(o*=1.02),o*=vt("grandmaCps"),wt("Cat ladies"))for(let e=0;e<Game.UpgradesByPool.kitten.length;e++)wt(Game.UpgradesByPool.kitten[e].name)&&(o*=1.29);o*=Jo(e);let a=0;wt("One mind")&&(a+=.02*Ct.Grandma.amount),wt("Communal brainsweep")&&(a+=.02*Ct.Grandma.amount),wt("Elder Pact")&&(a+=.05*Ct.Portal.amount);let n=0;return Object.keys(Ct).forEach((e=>{"Grandma"!==Ct[e].name&&(n+=Ct[e].amount)})),o*=1+.01*bt("Elder Battalion")*n,o*=Game.magicCpS(t.name),(t.baseCps+a)*o}:o.cps=function(e){let t=1;return t*=Jo(e),t*=Game.magicCpS(e.name),e.baseCPS*t},o.baseCps=t.baseCps,o.name=t.name,o.tieredUpgrades=t.tieredUpgrades,o.synergies=t.synergies,o.fortune=t.fortune,o.grandma=t.grandma,o.baseCPS=t.baseCps,o.id=t.id,o.vanilla=t.vanilla,o.unshackleUpgrade=t.unshackleUpgrade,o}function ea(e){const t=Game.Upgrades[e],o={};return o.power=t.power,"function"==typeof o.power&&("Sugar crystal cookies"===t.name?o.power=function(){let e=5;return Object.keys(Ct).forEach((t=>{Ct[t].level>=10&&(e+=1)})),e}:o.power=function(){let e=2;if(wt("Starlove")&&(e=3),Game.hasGod){const t=Tt("seasons");1===t?e*=1.3:2===t?e*=1.2:3===t&&(e*=1.1)}return e}),o.pool=t.pool,o.name=t.name,o}function ta(){Z=Game.UpgradesOwned,ee=Game.pledges,te=Game.AchievementsOwned,oe=Game.heavenlyPower,ae=Game.prestige,Object.keys(Game.Objects).forEach((e=>{const t=Game.Objects[e];let o=Ct[e];void 0===o&&(Ct[e]=Zo(e),o=Ct[e],Vo(e)),o.amount=t.amount,o.level=t.level,o.totalCookies=t.totalCookies,o.basePrice=t.basePrice,o.free=t.free,t.minigameLoaded&&("Temple"===t.name&&(re=t.minigame.slot[0],se=t.minigame.slot[1],le=t.minigame.slot[2]),o.minigameLoaded=t.minigameLoaded,o.minigame=t.minigame),Ct[e]=o})),Object.keys(Game.Upgrades).forEach((e=>{const t=Game.Upgrades[e];let o=Mt[e];void 0===o&&(Mt[e]=ea(e),o=Mt[e]),o.bought=t.bought,Mt[e]=o})),Object.keys(Game.Achievements).forEach((e=>{const t=Game.Achievements[e];let o=yt[e];void 0===o&&(yt[e]=Ko(e),o=yt[e]),o.won=t.won,yt[e]=o})),Yo(),ne=ue,ie=he}function oa(e){const t=document.createElement("div");return t.style.fontWeight="bold",t.id=`${e}Title`,t.className="CMTextBlue",t.textContent=e,t}function aa(e){e.appendChild(oa("Bonus Income"));const t=document.createElement("div");t.style.marginBottom="4px",t.style.color="white",t.id="CMTooltipIncome",e.appendChild(t),e.appendChild(oa("Bonus Cookies per Click")),e.lastChild.style.display="none";const o=document.createElement("div");o.style.marginBottom="4px",o.style.color="white",o.style.display="none",o.id="CMTooltipCookiePerClick",e.appendChild(o),e.appendChild(oa("Payback Period"));const a=document.createElement("div");a.style.marginBottom="4px",a.id="CMTooltipPP",e.appendChild(a),e.appendChild(oa("Time Left"));const n=document.createElement("div");if(n.id="CMTooltipTime",e.appendChild(n),"b"===Bo){e.appendChild(oa("Production left till next achievement")),e.lastChild.id="CMTooltipProductionLeftHeader";const t=document.createElement("div");t.id="CMTooltipProductionLeft",e.appendChild(t)}if("b"===Bo){e.appendChild(oa("Buildings (price / PP) left till next achievement")),e.lastChild.id="CMTooltipNextAchievementHeader";const t=document.createElement("div");t.id="CMTooltipNextAchievement",e.appendChild(t)}}function na(e,t){let o="";return o=e.pp<=0||e.pp===1/0?mo:e.pp<pt?no:e.pp===pt?io:e.pp<ht[10][0]?ro:e.pp<ht[20][0]?so:e.pp<ht[30][0]?lo:co,0!==Number(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPSecondsLowerLimit)&&t/Ro()<Number(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPSecondsLowerLimit)&&(o=no),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPOnlyConsiderBuyable&&t-Game.cookies>0&&(o=lo),o}function ia(){let e=1;return Object.keys(Game.buffs).forEach((t=>{void 0!==Game.buffs[t].multCpS&&(e*=Game.buffs[t].multCpS)})),e}function ra(e){yt[e]&&0===yt[e].won&&(yt[e].won=1,"shadow"!==Game.Achievements[e].pool&&(te+=1))}function sa(){me=0;let e=1;const t={};Object.keys(Game.Objects).forEach((e=>{if(Game.Objects[e].minigameLoaded&&Game.Objects[e].minigame.effs){const o=Game.Objects[e].minigame.effs;Object.keys(o).forEach((e=>{t[e]?t[e]*=o[e]:t[e]=o[e]}))}})),de=t,1!==Game.ascensionMode&&(e+=.01*parseFloat(ae)*oe*function(){let e=0;if(wt("Heavenly chip secret")&&(e+=.05),wt("Heavenly cookie stand")&&(e+=.2),wt("Heavenly bakery")&&(e+=.25),wt("Heavenly confectionery")&&(e+=.25),wt("Heavenly key")&&(e+=.25),e*=1+.05*bt("Dragon God"),wt("Lucky digit")&&(e*=1.01),wt("Lucky number")&&(e*=1.01),wt("Lucky payout")&&(e*=1.01),Game.hasGod){const t=Tt("creation");1===t?e*=.7:2===t?e*=.8:3===t&&(e*=.9)}return e}()),e*=vt("cps"),wt("Heralds")&&1!==Game.ascensionMode&&(e*=1+.01*Game.heralds),Object.keys(Game.cookieUpgrades).forEach((t=>{const o=Game.cookieUpgrades[t];wt(o.name)&&("function"==typeof o.power?e*=1+.01*Mt[o.name].power(Mt[o.name]):e*=1+.01*o.power)})),wt("Specialized chocolate chips")&&(e*=1.01),wt("Designer cocoa beans")&&(e*=1.02),wt("Underworld ovens")&&(e*=1.03),wt("Exotic nuts")&&(e*=1.04),wt("Arcane sugar")&&(e*=1.05),wt("Increased merriness")&&(e*=1.15),wt("Improved jolliness")&&(e*=1.15),wt("A lump of coal")&&(e*=1.01),wt("An itchy sweater")&&(e*=1.01),wt("Santa's dominion")&&(e*=1.2),wt("Fortune #100")&&(e*=1.01),wt("Fortune #101")&&(e*=1.07),wt("Dragon scale")&&(e*=1.03);let o=1;if(Tt){let t=Tt("asceticism");1===t?e*=1.15:2===t?e*=1.1:3===t&&(e*=1.05),t=Tt("ages"),1===t?e*=1+.15*Math.sin(Zt/1e3/10800*Math.PI*2):2===t?e*=1+.15*Math.sin(Zt/1e3/43200*Math.PI*2):3===t&&(e*=1+.15*Math.sin(Zt/1e3/86400*Math.PI*2)),t=Tt("decadence"),1===t?o*=.93:2===t?o*=.95:3===t&&(o*=.98),t=Tt("industry"),1===t?o*=1.1:2===t?o*=1.06:3===t&&(o*=1.03),t=Tt("labor"),1===t?o*=.97:2===t?o*=.98:3===t&&(o*=.99)}wt("Santa's legacy")&&(e*=1+.03*(Game.santaLevel+1));const a=te/25;let n=1;if(wt("Santa's milk and cookies")&&(n*=1.05),n*=1+.05*bt("Breath of Milk"),Tt){const e=Tt("mother");1===e?n*=1.1:2===e?n*=1.05:3===e&&(n*=1.03)}n*=vt("milk");let i=1;wt("Kitten helpers")&&(i*=1+.1*a*n),wt("Kitten workers")&&(i*=1+.125*a*n),wt("Kitten engineers")&&(i*=1+.15*a*n),wt("Kitten overseers")&&(i*=1+.175*a*n),wt("Kitten managers")&&(i*=1+.2*a*n),wt("Kitten accountants")&&(i*=1+.2*a*n),wt("Kitten specialists")&&(i*=1+.2*a*n),wt("Kitten experts")&&(i*=1+.2*a*n),wt("Kitten consultants")&&(i*=1+.2*a*n),wt("Kitten assistants to the regional manager")&&(i*=1+.175*a*n),wt("Kitten marketeers")&&(i*=1+.15*a*n),wt("Kitten analysts")&&(i*=1+.125*a*n),wt("Kitten executives")&&(i*=1+.115*a*n),wt("Kitten admins")&&(i*=1+.11*a*n),wt("Kitten strategists")&&(i*=1+.105*a*n),wt("Kitten angels")&&(i*=1+.1*a*n),wt("Fortune #103")&&(i*=1+.05*a*n),Object.keys(Ct).forEach((e=>{const t=Ct[e];let i=t.cps(t);1!==Game.ascensionMode&&(i*=(1+.01*t.level)*o),"Grandma"===t.name&&wt("Milkhelp® lactose intolerance relief tablets")&&(i*=1+.05*a*n),me+=t.amount*i})),wt('"egg"')&&(me+=9),e*=i;let r=1;if(wt("Chicken egg")&&(r*=1.01),wt("Duck egg")&&(r*=1.01),wt("Turkey egg")&&(r*=1.01),wt("Quail egg")&&(r*=1.01),wt("Robin egg")&&(r*=1.01),wt("Ostrich egg")&&(r*=1.01),wt("Cassowary egg")&&(r*=1.01),wt("Salmon roe")&&(r*=1.01),wt("Frogspawn")&&(r*=1.01),wt("Shark egg")&&(r*=1.01),wt("Turtle egg")&&(r*=1.01),wt("Ant larva")&&(r*=1.01),wt("Century egg")){let e=10*Math.floor((eo-Game.startDate)/1e3/10)/60/60/24;e=Math.min(e,100),Ne=1+.1*(1-(1-e/100)**3),r*=Ne}e*=r,wt("Sugar baking")&&(e*=1+.01*Math.min(100,Game.lumps)),e*=1+bt("Radiant Appetite");const s=me*e;Object.keys(Game.CpsAchievements).forEach((e=>{s>=Game.CpsAchievements[e].threshold&&ra(Game.CpsAchievements[e].name)})),pe=s;const{n:l}=Game.shimmerTypes.golden,c=bt("Dragon's Fortune");for(let t=0;t<l;t++)e*=1+1.23*c;const d=Game.bakeryName.toLowerCase();if("orteil"===d?e*=.99:"ortiel"===d&&(e*=.98),wt("Elder Covenant")&&(e*=.95),wt("Golden switch [off]")){let t=1.5;if(wt("Residual luck")){const e=Game.goldenCookieUpgrades;Object.keys(e).forEach((o=>{wt(e[o])&&(t+=.1)}))}e*=t}if(wt("Shimmering veil [off]")){let t=.5;wt("Reinforced membrane")&&(t+=.1),wt("Delicate touch")&&(t+=.05),wt("Steadfast murmur")&&(t+=.05),wt("Glittering edge")&&(t+=.05),e*=1+t}wt("Magic shenanigans")&&(e*=1e3),wt("Occult obstruction")&&(e*=0),me=Game.runModHookOnValue("cps",me),e*=ia(),me*=e}const la=["Fortune #001","Fortune #002","Fortune #003","Fortune #004","Fortune #005","Fortune #006","Fortune #007","Fortune #008","Fortune #009","Fortune #010","Fortune #011","Fortune #012","Fortune #013","Fortune #014","Fortune #015","Fortune #016","Fortune #017","Fortune #018","Fortune #019","Fortune #020","Fortune #100","Fortune #101","Fortune #102","Fortune #103","Fortune #104"],ca=["Skull cookies","Ghost cookies","Bat cookies","Slime cookies","Pumpkin cookies","Eyeball cookies","Spider cookies"],da=["Christmas tree biscuits","Snowflake biscuits","Snowman biscuits","Holly biscuits","Candy cane biscuits","Bell biscuits","Present biscuits"],ma=["Pure heart biscuits","Ardent heart biscuits","Sour heart biscuits","Weeping heart biscuits","Golden heart biscuits","Eternal heart biscuits","Prism heart biscuits"],pa=["Elderwort biscuits","Bakeberry cookies","Duketater cookies","Green yeast digestives","Wheat slims","Fern tea","Ichor syrup"];function ua(e){return yt[e]?yt[e].won:0}function ha(){let e=0;Object.keys(Game.GrandmaSynergies).forEach((t=>{wt(Game.GrandmaSynergies[t])&&(e+=1)})),!ua("Elder")&&e>=7&&ra("Elder"),!ua("Veteran")&&e>=14&&ra("Veteran");let t=0,o=1,a=1,n=1e5;Object.keys(Ct).forEach((e=>{t+=Ct[e].amount,n=Math.min(Ct[e].amount,n),ua("Mathematician")||Ct[e].amount<Math.min(128,2**(Game.ObjectsById.length-Game.Objects[e].id-1))&&(o=0),ua("Base 10")||Ct[e].amount<10*(Game.ObjectsById.length-Game.Objects[e].id)&&(a=0)})),n>=1&&ra("One with everything"),1===o&&ra("Mathematician"),1===a&&ra("Base 10"),n>=100&&ra("Centennial"),n>=150&&ra("Centennial and a half"),n>=200&&ra("Bicentennial"),n>=250&&ra("Bicentennial and a half"),n>=300&&ra("Tricentennial"),n>=350&&ra("Tricentennial and a half"),n>=400&&ra("Quadricentennial"),n>=450&&ra("Quadricentennial and a half"),n>=500&&ra("Quincentennial"),n>=550&&ra("Quincentennial and a half"),n>=600&&ra("Sexcentennial"),n>=650&&ra("Sexcentennial and a half"),n>=700&&ra("Septcentennial"),t>=100&&ra("Builder"),t>=500&&ra("Architect"),t>=1e3&&ra("Engineer"),t>=2500&&ra("Lord of Constructs"),t>=5e3&&ra("Grand design"),t>=7500&&ra("Ecumenopolis"),t>=1e4&&ra("Myriad"),Z>=20&&ra("Enhancer"),Z>=50&&ra("Augmenter"),Z>=100&&ra("Upgrader"),Z>=200&&ra("Lord of Progress"),Z>=300&&ra("The full picture"),Z>=400&&ra("When there's nothing left to add"),Z>=500&&ra("Kaizen"),Z>=600&&ra("Beyond quality"),Z>=700&&ra("Oft we mar what's well"),t>=4e3&&Z>=300&&ra("Polymath"),t>=8e3&&Z>=400&&ra("Renaissance baker"),Ct.Cursor.amount+Ct.Grandma.amount>=777&&ra("The elder scrolls");let i=!0;Object.keys(ca).forEach((e=>{wt(ca[e])||(i=!1)})),i&&ra("Spooky cookies");let r=!0;if(Object.keys(da).forEach((e=>{wt(da[e])||(r=!1)})),r&&ra("Let it snow"),wt("Fortune cookies")){const e=Game.Tiers.fortune.upgrades;let t=0;Object.keys(e).forEach((o=>{wt(e[o].name)&&(t+=1)})),t>=e.length&&ra("O Fortuna")}}function ga(e,t){ta(),Ct[e].amount+=t;const o=Ct[e];"Cursor"===e?(o.amount>=1&&ra("Click"),o.amount>=2&&ra("Double-click"),o.amount>=50&&ra("Mouse wheel"),o.amount>=100&&ra("Of Mice and Men"),o.amount>=200&&ra("The Digital"),o.amount>=300&&ra("Extreme polydactyly"),o.amount>=400&&ra("Dr. T"),o.amount>=500&&ra("Thumbs, phalanges, metacarpals"),o.amount>=600&&ra("With her finger and her thumb"),o.amount>=700&&ra("Gotta hand it to you"),o.amount>=800&&ra("The devil's workshop"),o.amount>=900&&ra("All on deck"),o.amount>=1e3&&ra("A round of applause")):Object.keys(Game.Objects[o.name].tieredAchievs).forEach((e=>{o.amount>=Game.Tiers[Game.Objects[o.name].tieredAchievs[e].tier].achievUnlock&&ra(Game.Objects[o.name].tieredAchievs[e].name)}));const a=te;return sa(),ha(),a!==te&&sa(),me-Game.cookiesPs}function fa(e,t,o){let a=e,n=0;for(;a<o;)a+=.002*Math.max(.002,(a/Math.max(t,100))**.5),n+=1;return n/Game.fps}function ka(){null!==l("CMDispTooltipWarningParent")&&(0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos?(l("CMDispTooltipWarningParent").style.top="auto",l("CMDispTooltipWarningParent").style.margin="4px -4px",l("CMDispTooltipWarningParent").style.padding="3px 4px"):(l("CMDispTooltipWarningParent").style.right="auto",l("CMDispTooltipWarningParent").style.margin="4px",l("CMDispTooltipWarningParent").style.padding="4px 3px"))}function Ca(){if(ta(),"none"!==l("tooltipAnchor").style.display&&l("CMTooltipArea")){l("CMTooltipArea").innerHTML="";const e=function(){l("tooltip").firstChild.style.paddingBottom="4px";const e=document.createElement("div");return e.style.border="1px solid",e.style.padding="4px",e.style.margin="0px -4px",e.id="CMTooltipBorder",e.className="CMTextGray",e}();l("CMTooltipArea").appendChild(e),"b"===Bo?function(){let e;if(1===Game.buyMode?wo=e:e=wo,1===Game.buyBulk?e=Le:10===Game.buyBulk?e=Ae:100===Game.buyBulk&&(e=We),Fo=Game.Objects[Po].bulkPrice,Eo=e[Po].bonus,1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade&&1===Game.buyMode){if(aa(l("CMTooltipBorder")),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade&&1===Game.buyMode){l("CMTooltipIncome").textContent=to(Eo,2);const t=Math.round(Eo/Game.cookiesPs*1e4);Number.isFinite(t)&&0!==t?l("CMTooltipIncome").textContent+=` (${t/100}% of income)`:l("CMTooltipIncome").textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`,l("CMTooltipBorder").className=oo+e[Po].colour,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime?l("CMTooltipPP").textContent=Uo(e[Po].pp):l("CMTooltipPP").textContent=to(e[Po].pp,2),l("CMTooltipPP").className=oo+e[Po].colour;const o=Ho((Fo-(Game.cookies+Io()))/Ro());l("CMTooltipTime").textContent=o.text,"Done!"===o.text&&Game.cookies<e[Po].price?l("CMTooltipTime").textContent=`${o.text} (with Wrink)`:l("CMTooltipTime").textContent=o.text,l("CMTooltipTime").className=oo+o.colour}l("CMTooltipProductionLeftHeader").style.display="none",l("CMTooltipTime").style.marginBottom="0px";for(const e of Object.keys(Game.Objects[Po].productionAchievs))if(!Game.HasAchiev(Game.Objects[Po].productionAchievs[e].achiev.name)){const t=Game.Objects[Po].productionAchievs[e];l("CMTooltipTime").style.marginBottom="4px",l("CMTooltipProductionLeftHeader").style.display="",l("CMTooltipProductionLeft").className=`ProdAchievement${Po}`,l("CMTooltipProductionLeft").textContent=to(t.pow-Ct[Po].totalCookies,15),l("CMTooltipProductionLeft").style.color="white";break}const t=je[Po];if(t.AmountNeeded<101){let e;l("CMTooltipProductionLeft").style.marginBottom="4px",l("CMTooltipNextAchievementHeader").style.display="",e=Game.cookiesPs?Math.max(t.price-(Game.cookies+Io()),0)/Game.cookiesPs+t.price/ga(Po,t.AmountNeeded):t.price/ga(Po,t.AmountNeeded),l("CMTooltipNextAchievement").textContent=`${to(t.AmountNeeded)} / ${to(t.price)} / `,l("CMTooltipNextAchievement").style.color="white";const o=document.createElement("span");Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime?o.textContent=Uo(e):o.textContent=to(e),o.className=oo+na({pp:e},t.price),l("CMTooltipNextAchievement").appendChild(o)}else l("CMTooltipNextAchievementHeader").style.display="none",l("CMTooltipProductionLeft").style.marginBottom="0px"}else l("CMTooltipArea").style.display="none"}():"u"===Bo?function(){if(aa(l("CMTooltipBorder")),Eo=ze[Game.UpgradesInStore[Po].name].bonus,Fo=Game.Upgrades[Game.UpgradesInStore[Po].name].getPrice(),No=ze[Game.UpgradesInStore[Po].name].bonusMouse,1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade){l("CMTooltipIncome").textContent=to(Eo,2);const e=Math.round(Eo/Game.cookiesPs*1e4);"0"===l("CMTooltipIncome").textContent?(l("Bonus IncomeTitle").style.display="none",l("CMTooltipIncome").style.display="none",l("Payback PeriodTitle").style.display="none",l("CMTooltipPP").style.display="none"):(Number.isFinite(e)&&0!==e?l("CMTooltipIncome").textContent+=` (${e/100}% of income)`:l("CMTooltipIncome").textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`,l("CMTooltipBorder").className=oo+ze[Game.UpgradesInStore[Po].name].colour),No&&(l("CMTooltipCookiePerClick").textContent=to(No),l("CMTooltipCookiePerClick").style.display="block",l("CMTooltipCookiePerClick").previousSibling.style.display="block"),!Eo&&No?(l("CMTooltipPP").textContent=`${to(Fo/No)} Clicks`,l("CMTooltipPP").style.color="white",l("Payback PeriodTitle").style.display="block",l("CMTooltipPP").style.display="block"):(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime?l("CMTooltipPP").textContent=Uo(ze[Game.UpgradesInStore[Po].name].pp):l("CMTooltipPP").textContent=to(ze[Game.UpgradesInStore[Po].name].pp,2),l("CMTooltipPP").className=oo+ze[Game.UpgradesInStore[Po].name].colour);const t=Ho((Fo-(Game.cookies+Io()))/Ro());if(l("CMTooltipTime").textContent=t.text,"Done!"===t.text&&Game.cookies<Game.UpgradesInStore[Po].getPrice()?l("CMTooltipTime").textContent=`${t.text} (with Wrink)`:l("CMTooltipTime").textContent=t.text,l("CMTooltipTime").className=oo+t.colour,"Chocolate egg"===Game.UpgradesInStore[Po].name){l("CMTooltipBorder").lastChild.style.marginBottom="4px",l("CMTooltipBorder").appendChild(oa("Cookies to be gained (Currently/Max)"));const e=document.createElement("div");e.style.color="white",e.textContent=`${to(.05*Game.cookies)} / ${to(De)}`,l("CMTooltipBorder").appendChild(e)}}else l("CMTooltipArea").style.display="none"}():"s"===Bo?function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipLump){const t=l("CMTooltipBorder");t.appendChild(oa("Current Sugar Lump"));const o=document.createElement("div");o.id="CMTooltipTime",t.appendChild(o);const a=0===(e=Game.lumpCurrentType)?{text:"Normal",colour:mo}:1===e?{text:"Bifurcated",colour:io}:2===e?{text:"Golden",colour:ro}:3===e?{text:"Meaty",colour:so}:4===e?{text:"Caramelized",colour:co}:{text:"Unknown Sugar Lump",colour:lo};o.textContent=a.text,o.className=oo+a.colour}else l("CMTooltipArea").style.display="none";var e}():"g"===Bo?function(){const{minigame:e}=Game.Objects["Wizard tower"],t=e.getSpellCost(e.spellsById[Po]);if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipGrim&&t<=e.magicM){const o=l("CMTooltipBorder");o.appendChild(oa("Time Left"));const a=document.createElement("div");a.id="CMTooltipTime",o.appendChild(a);const n=Ho(fa(e.magic,e.magicM,t));if(a.textContent=n.text,a.className=oo+n.colour,t<=e.magic){o.appendChild(oa("Recover Time"));const a=document.createElement("div");a.id="CMTooltipRecover",o.appendChild(a);const n=Ho(fa(Math.max(0,e.magic-t),e.magicM,e.magic));a.textContent=n.text,a.className=oo+n.colour}if("0"===Po){o.appendChild(oa("Cookies to be gained/lost"));const e=document.createElement("div");e.id="x",o.appendChild(e);const t=document.createElement("span");t.style.color="#33FF00",t.textContent=to(Math.max(Math.min(.15*Game.cookies,60*Game.cookiesPs*30),7),2),e.appendChild(t);const a=document.createElement("span");a.textContent=" / ",e.appendChild(a);const n=document.createElement("span");n.style.color="red",n.textContent=to(Math.min(Game.cookies,Math.min(.15*Game.cookies,60*Game.cookiesPs*15)+13),2),e.appendChild(n)}l("CMTooltipArea").appendChild(o)}else l("CMTooltipArea").style.display="none"}():"p"===Bo?function(){const{minigame:e}=Game.Objects.Farm;if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipPlots&&0!==e.plot[Po[1]][Po[0]][0]){const t=e.plot[Po[1]][Po[0]][1]>e.plantsById[e.plot[Po[1]][Po[0]][0]-1].mature,o=e.plantsById[e.plot[Po[1]][Po[0]][0]-1].name;l("CMTooltipBorder").appendChild(oa("Reward (Current / Maximum)"));const a=document.createElement("div");a.id="CMTooltipPlantReward",l("CMTooltipBorder").appendChild(a),"Chocoroot"===o||"White chocoroot"===o?l("CMTooltipPlantReward").textContent=`${t?to(Math.min(.03*Game.cookies,60*Game.cookiesPs*3)):"0"} / ${to(60*Game.cookiesPs*3)}`:"Bakeberry"===o?l("CMTooltipPlantReward").textContent=`${t?to(Math.min(.03*Game.cookies,60*Game.cookiesPs*30)):"0"} / ${to(60*Game.cookiesPs*30)}`:"Queenbeet"===o?l("CMTooltipPlantReward").textContent=`${t?to(Math.min(.04*Game.cookies,60*Game.cookiesPs*60)):"0"} / ${to(60*Game.cookiesPs*60)}`:"Duketater"===o?l("CMTooltipPlantReward").textContent=`${t?to(Math.min(.08*Game.cookies,60*Game.cookiesPs*120)):"0"} / ${to(60*Game.cookiesPs*120)}`:l("CMTooltipArea").style.display="none"}else l("CMTooltipArea").style.display="none"}():"ha"===Bo?function(){const{minigame:e}=Game.Objects.Farm;if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipLump){l("CMTooltipBorder").appendChild(oa("Cookies gained from harvesting:"));let t=0,o=0;Game.keys[16]&&Game.keys[17]&&(o=1);for(let a=0;a<6;a++)for(let n=0;n<6;n++)if(e.plot[a][n][0]>=1){const i=e.plot[a][n],r=e.plantsById[i[0]-1],s=r.name;let l=!0;o&&r.immortal&&(l=!1),i[1]<r.matureBase&&(l=!1),l&&"Bakeberry"===s?t+=Math.min(.03*Game.cookies,60*Game.cookiesPs*30):l&&"Chocoroot"===s||"White chocoroot"===s?t+=Math.min(.03*Game.cookies,60*Game.cookiesPs*3):l&&"Queenbeet"===s?t+=Math.min(.04*Game.cookies,60*Game.cookiesPs*60):l&&"Duketater"===s&&(t+=Math.min(.08*Game.cookies,60*Game.cookiesPs*120))}l("CMTooltipBorder").appendChild(document.createTextNode(to(t)))}else l("CMTooltipArea").style.display="none"}():"wb"===Bo?function(){l("tooltip").innerHTML="",l("tooltip").appendChild(oa("Reward:"));const e=document.createElement("div");e.id="CMWrinklerReward","PopAllNormal"===Po?e.textContent=to(Ue):"PopFattest"===Po&&(e.textContent=to(He[0])),l("tooltip").appendChild(e)}():("pag"===Bo||"pas"===Bo&&-1!==Po[1])&&function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipPantheon){const e=l("CMTooltipBorder");let t;t="pas"===Bo?Po[1]:Po,e.appendChild(oa("Effect in position 1:"));const o=document.createElement("div");if(o.id="CMPantheonTooltipPosition1",0!==kt[t][0]){o.textContent=to(kt[t][0]);const e=Math.round(kt[t][0]/Game.cookiesPs*1e4);Number.isFinite(e)&&0!==e?o.textContent+=` (${e/100}% of income)`:o.textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`}else o.textContent="No effect to CPS";e.appendChild(o),e.appendChild(oa("Effect in position 2:"));const a=document.createElement("div");if(a.id="CMPantheonTooltipPosition2",0!==kt[t][1]){a.textContent=to(kt[t][1]);const e=Math.round(kt[t][1]/Game.cookiesPs*1e4);Number.isFinite(e)&&0!==e?a.textContent+=` (${e/100}% of income)`:a.textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`}else a.textContent="No effect to CPS";e.appendChild(a),e.appendChild(oa("Effect in position 3:"));const n=document.createElement("div");if(n.id="CMPantheonTooltipPosition2",0!==kt[t][2]){n.textContent=to(kt[t][2]);const e=Math.round(kt[t][2]/Game.cookiesPs*1e4);Number.isFinite(e)&&0!==e?n.textContent+=` (${e/100}% of income)`:n.textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`}else n.textContent="No effect to CPS";e.appendChild(n),l("CMTooltipArea").appendChild(e)}else l("CMTooltipArea").style.display="none"}(),function(){if("b"===Bo||"u"===Bo){null===document.getElementById("CMDispTooltipWarningParent")&&(l("tooltipAnchor").appendChild(function(){const e=document.createElement("div");e.style.position="absolute",e.style.display="block",e.style.left="auto",e.style.bottom="auto",e.id="CMDispTooltipWarningParent";const t=function(e,t,o,a,n){const i=document.createElement("div");i.id=e,i.style.display="none",i.style.transition="opacity 0.1s ease-out",i.className="CMBorder"+t,i.style.padding="2px",i.style.background="#000 url(img/darkNoise.png)";const r=document.createElement("div");i.appendChild(r);const s=document.createElement("span");s.className=oo+t,s.style.fontWeight="bold",s.textContent=o,r.appendChild(s),r.appendChild(document.createTextNode(a));const l=document.createElement("div");i.appendChild(l);const c=document.createElement("span");return c.id=n,l.appendChild(document.createTextNode("Deficit: ")),l.appendChild(c),i};return e.appendChild(t("CMDispTooltipWarnLucky",lo,"Warning: ",'Purchase of this item will put you under the number of Cookies required for "Lucky!"',"CMDispTooltipWarnLuckyText")),e.firstChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnLuckyFrenzy",ro,"Warning: ",'Purchase of this item will put you under the number of Cookies required for "Lucky!" (Frenzy)',"CMDispTooltipWarnLuckyFrenzyText")),e.lastChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnConjure",co,"Warning: ",'Purchase of this item will put you under the number of Cookies required for "Conjure Baked Goods"',"CMDispTooltipWarnConjureText")),e.lastChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnConjureFrenzy",co,"Warning: ",'Purchase of this item will put you under the number of Cookies required for "Conjure Baked Goods" (Frenzy)',"CMDispTooltipWarnConjureFrenzyText")),e.lastChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnEdifice",co,"Warning: ",'Purchase of this item will put you under the number of Cookies needed for "Spontaneous Edifice" to possibly give you your most expensive building"',"CMDispTooltipWarnEdificeText")),e.lastChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnUser",lo,"Warning: ",`Purchase of this item will put you under the number of Cookies equal to ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser} seconds of CPS`,"CMDispTooltipWarnUserText")),e}()),ka()),0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos?l("CMDispTooltipWarningParent").style.right="0px":l("CMDispTooltipWarningParent").style.top=`${l("tooltip").offsetHeight}px`,l("CMDispTooltipWarningParent").style.width=l("tooltip").offsetWidth-6+"px";const e=Game.cookies+Io()-Fo,t=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnBon?Eo:0;let o=ke;if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnBon){let e=Eo;e/=ia(),o+=60*e*15/.15}if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLucky&&e<o&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnLucky").style.display="",l("CMDispTooltipWarnLuckyText").textContent=`${to(o-e)} (${Uo((o-e)/(Ro()+t))})`):l("CMDispTooltipWarnLucky").style.display="none",1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLuckyFrenzy){const a=7*o;e<a&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnLuckyFrenzy").style.display="",l("CMDispTooltipWarnLuckyFrenzyText").textContent=`${to(a-e)} (${Uo((a-e)/(Ro()+t))})`):l("CMDispTooltipWarnLuckyFrenzy").style.display="none"}else l("CMDispTooltipWarnLuckyFrenzy").style.display="none";if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnConjure){const a=2*o;e<a&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnConjure").style.display="",l("CMDispTooltipWarnConjureText").textContent=`${to(a-e)} (${Uo((a-e)/(Ro()+t))})`):l("CMDispTooltipWarnConjure").style.display="none"}else l("CMDispTooltipWarnConjure").style.display="none";if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnConjureFrenzy){const a=2*o*7;e<a&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnConjureFrenzy").style.display="",l("CMDispTooltipWarnConjureFrenzyText").textContent=`${to(a-e)} (${Uo((a-e)/(Ro()+t))})`):l("CMDispTooltipWarnConjureFrenzy").style.display="none"}else l("CMDispTooltipWarnConjureFrenzy").style.display="none";1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnEdifice&&Game.Objects["Wizard tower"].minigameLoaded&&xe&&e<xe&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnEdifice").style.display="",l("CMDispTooltipWarnEdificeText").textContent=`${to(xe-e)} (${Uo((xe-e)/(Ro()+t))})`):l("CMDispTooltipWarnEdifice").style.display="none",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser>0&&e<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser*Ro()&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnUser").style.display="",l("CMDispTooltipWarnUser").children[0].textContent=`Purchase of this item will put you under the number of Cookies equal to ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser} seconds of CPS`,l("CMDispTooltipWarnUserText").textContent=`${to(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser*Ro()-e)} (${Uo((Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser*Ro()-e)/(Ro()+t))})`):l("CMDispTooltipWarnUser").style.display="none"}else null!==l("CMDispTooltipWarningParent")&&l("CMDispTooltipWarningParent").remove()}()}else null===l("CMTooltipArea")&&null!==l("CMDispTooltipWarningParent")&&l("CMDispTooltipWarningParent").remove()}function Ma(){if(Game.prefs.autosave&&Game.drawT%10==0&&"stats"===Game.onMenu&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Stats){const e=document.getElementById("CMStatsAutosaveTimer");e&&(e.innerText=Game.sayTime(60*Game.fps-Game.T%(60*Game.fps),4))}Wo(),$o(),jo(),function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar){const e=l("CMTimerBar").offsetWidth-163,t=l("CMTimerBar").offsetWidth-133;let o=0;if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AutosaveTimerBar&&Game.prefs.autosave){const e=(60*Game.fps-(Game.OnAscend?0:Game.T%(60*Game.fps)))/Game.fps;l("CMTimerBarAutosave").style.display="",l("CMTimerBarAutosaveBar").style.width=`${Math.round(e*(t-8*Math.ceil(e).toString().length)/60)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarAutosaveBar").textContent=Math.ceil(e):l("CMTimerBarAutosaveBar").textContent="",l("CMTimerBarAutosaveTime").textContent=Math.ceil(e),o+=1}else l("CMTimerBarAutosave").style.display="none";if(0!==Game.shimmerTypes.golden.spawned||Game.Has("Golden switch [off]"))l("CMTimerBarGC").style.display="none";else{l("CMTimerBarGC").style.display="",l("CMTimerBarGCMinBar").style.width=`${Math.round(Math.max(0,Game.shimmerTypes.golden.minTime-Game.shimmerTypes.golden.time)*e/Game.shimmerTypes.golden.maxTime)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarGCMinBar").textContent=Math.ceil((Game.shimmerTypes.golden.minTime-Game.shimmerTypes.golden.time)/Game.fps):l("CMTimerBarGCMinBar").textContent="",Game.shimmerTypes.golden.minTime===Game.shimmerTypes.golden.maxTime?(l("CMTimerBarGCMinBar").style.borderTopRightRadius="10px",l("CMTimerBarGCMinBar").style.borderBottomRightRadius="10px"):(l("CMTimerBarGCMinBar").style.borderTopRightRadius="",l("CMTimerBarGCMinBar").style.borderBottomRightRadius=""),l("CMTimerBarGCBar").style.width=`${Math.round(Math.min(Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.minTime,Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.time)*e/Game.shimmerTypes.golden.maxTime)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarGCBar").textContent=Math.ceil(Math.min(Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.minTime,Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.time)/Game.fps):l("CMTimerBarGCBar").textContent="";const t=Math.max(0,(Game.shimmerTypes.golden.time-Game.shimmerTypes.golden.minTime)/(Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.minTime))**5;l("CMTimerBarGCTime").textContent=`${Math.ceil((Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.time)/Game.fps)} ${t<.01?"<":""}${t.toLocaleString("en",{style:"percent"})}`,o+=1}if("christmas"===Game.season&&0===Game.shimmerTypes.reindeer.spawned){l("CMTimerBarRen").style.display="",l("CMTimerBarRenMinBar").style.width=`${Math.round(Math.max(0,Game.shimmerTypes.reindeer.minTime-Game.shimmerTypes.reindeer.time)*e/Game.shimmerTypes.reindeer.maxTime)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarRenMinBar").textContent=Math.ceil((Game.shimmerTypes.reindeer.minTime-Game.shimmerTypes.reindeer.time)/Game.fps):l("CMTimerBarRenMinBar").textContent="",l("CMTimerBarRenBar").style.width=`${Math.round(Math.min(Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.minTime,Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.time)*e/Game.shimmerTypes.reindeer.maxTime)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarRenBar").textContent=Math.ceil(Math.min(Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.minTime,Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.time)/Game.fps):l("CMTimerBarRenBar").textContent="";const t=Math.max(0,(Game.shimmerTypes.reindeer.time-Game.shimmerTypes.reindeer.minTime)/(Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.minTime))**5;l("CMTimerBarRenTime").textContent=`${Math.ceil((Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.time)/Game.fps)} ${t<.01?"<":""}${t.toLocaleString("en",{style:"percent"})}`,o+=1}else l("CMTimerBarRen").style.display="none";const a={};l("CMTimerBarBuffTimers").innerHTML="",Object.keys(Game.buffs).forEach((e=>{if(Game.buffs[e]){const n=zo(Game.buffs[e].name,Game.buffs[e].name,[{id:`${Game.buffs[e].name}Bar`}]);n.style.display="";let i="";i=void 0!==So[Game.buffs[e].name]?So[Game.buffs[e].name]:co,n.lastChild.children[1].className=ao+i,n.lastChild.children[1].style.color="black",2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay?n.lastChild.children[1].textContent=`${Math.round(Game.buffs[e].time/Game.buffs[e].maxTime*100)}%`:n.lastChild.children[1].textContent="",n.lastChild.children[1].style.width=`${Math.round(Game.buffs[e].time*(t-8*Math.ceil(Game.buffs[e].time/Game.fps).toString().length)/Game.buffs[e].maxTime)}px`,n.lastChild.children[2].textContent=Math.ceil(Game.buffs[e].time/Game.fps),o+=1,a[Game.buffs[e].name]=n}})),Object.keys(a).forEach((e=>{l("CMTimerBarBuffTimers").appendChild(a[e])})),0!==o&&(l("CMTimerBar").style.height=12*o+2+"px"),Do!==o&&(Do=o,Qo())}}(),_o(),Ca(),function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipWrink&&1===Co){let e=!1;Object.keys(Game.wrinklers).forEach((t=>{const o=Game.wrinklers[t];if(o.phase>0&&o.selected){if(e=!0,0===yo[t]||void 0===yo[t]){const e=document.createElement("div"),o=document.createElement("div");o.style.minWidth="120px",o.style.marginBottom="4px";const a=document.createElement("div");a.style.textAlign="center",a.id="CMTooltipWrinkler",o.appendChild(a),e.appendChild(o),Game.tooltip.draw(this,escape(e.innerHTML)),Mo=t,yo[t]=1}}else yo[t]=0})),e||Game.tooltip.hide()}}(),function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipWrink&&null!==l("CMTooltipWrinkler")){let{sucked:e}=Game.wrinklers[Mo],t=1.1;if(Game.Has("Sacrilegious corruption")&&(t*=1.05),1===Game.wrinklers[Mo].type&&(t*=3),e*=t,Game.Has("Wrinklerspawn")&&(e*=1.05),Ct.Temple.minigameLoaded){const t=Game.hasGod("scorn");1===t?e*=1.15:2===t?e*=1.1:3===t&&(e*=1.05)}l("CMTooltipWrinkler").textContent=to(e)}}(),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpStats&&"stats"===Game.onMenu&&(Game.drawT-1)%(5*Game.fps)!=0&&(Game.drawT-1)%Game.fps==0&&Game.UpdateMenu(),B()}function ya(){P.addLatest(Game.computedMouseCps)}class ba{constructor(e){this.maxLength=e,this.queue=[]}addLatest(e){this.queue.push(e)>this.maxLength&&this.queue.shift()}calcAverage(e){let t=e;t>this.maxLength&&(t=this.maxLength),t>this.queue.length&&(t=this.queue.length);let o=0;for(let e=this.queue.length-1;e>=0&&e>this.queue.length-1-t;e--)o+=this.queue[e];return 0===o?0:o/t}calcSum(e){let t=e;return t>this.maxLength&&(t=this.maxLength),t>this.queue.length&&(t=this.queue.length),0===t?0:this.queue.slice(-t).reduce(((e,t)=>e+t),0)}}function Ga(e){"Cache"in window.CookieMonsterData||(window.CookieMonsterData.Cache={}),Object.keys(e).forEach((t=>{const o=t.replace(/^Cache/,"");void 0===e[t]?window.CookieMonsterData.Cache[o]=void 0:window.CookieMonsterData.Cache[o]=JSON.parse(JSON.stringify(e[t]))}))}function va(){const e=Math.floor(Date.now()/1e3);if(Game.T/Game.fps%1==0){let t=Game.cookies+ft;Game.cpsSucked>0&&(t+=$e),st=Math.max(Game.cookiesEarned,t),t*=.05;const o=e-j,a=Math.max(0,Game.cookies-$)/o,n=Math.max(0,$e-U)/o,i=Math.max(0,He[0]-H)/o,r=Math.max(0,t-De)/o,s=(Game.cookieClicks-R)/o;for(let e=0;e<o;e++)N.addLatest(a),O.addLatest(n),D.addLatest(i),L.addLatest(r),A.addLatest(s);j=e,$=Game.cookies,U=$e,H=He[0],De=t,R=Game.cookieClicks;const l=xo[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist];I=N.calcAverage(l),z=O.calcAverage(l),V=D.calcAverage(l),_=L.calcAverage(l),X=I,1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink&&(X+=z),2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink&&(X+=V);const c=Game.HasUnlocked("Chocolate egg")&&!Game.Has("Chocolate egg");lt=c||0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?I+z+(c?_:0):X,Ve=A.calcAverage(To[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist])}Ga({CacheRealCookiesEarned:st,CacheLastCPSCheck:j,CacheLastCookies:$,CacheLastWrinkCookies:U,CacheLastWrinkFattestCookies:H,CacheLastChoEgg:De,CacheLastClicks:R,CacheAverageGainBank:I,CacheAverageGainWrink:z,CacheAverageGainWrinkFattest:V,CacheAverageGainChoEgg:_,CacheAverageCPS:X,CacheAvgCPSWithChoEgg:lt,CacheAverageClicks:Ve})}function wa(e,t,o,a,n){let i=0;for(let e=Math.max(0,o);e<Math.max(0,o+n);e++)i+=Game.priceIncrease**Math.max(0,e-a);let r=t*i;return r=Game.modifyBuildingPrice(Game.Objects[e],r),Math.ceil(r)}function xa(e,t){Object.keys(e).forEach((o=>{if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPRigidelMode&&1===t)e[o].colour=mo;else{e[o].colour=na(e[o],wa(o,Game.Objects[o].basePrice,Game.Objects[o].amount,Game.Objects[o].free,t));for(let t=0;t<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop;t++)e[o].pp===ht[t][0]&&(e[o].colour=mo)}}))}function Ta(e,t){Object.keys(e).forEach((o=>{const a=wa(o,Game.Objects[o].basePrice,Game.Objects[o].amount,Game.Objects[o].free,t);Game.cookiesPs?e[o].pp=Math.max(a-(Game.cookies+Io()),0)/Game.cookiesPs+a/e[o].bonus:e[o].pp=a/e[o].bonus,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPRigidelMode&&1===t||ht.push([e[o].pp,t,a])}))}function Sa(){!function(){pt=1/0,ht=[],void 0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop&&(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop=0),Ta(Le,1),Ta(Ae,10),Ta(We,100),ht.sort(((e,t)=>e[0]-t[0]));let e=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop;if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPOnlyConsiderBuyable)for(;ht[e][2]>Game.cookies&&(e+=1,ht.length!==e+1););pt=ht[e][0],ut=ht[e][1],xa(Le,1),xa(Ae,10),xa(We,100),Ga({CacheMinPP:pt,CacheMinPPBulk:ut,CachePPArray:ht})}(),Object.keys(ze).forEach((e=>{Game.cookiesPs?ze[e].pp=Math.max(Game.Upgrades[e].getPrice()-(Game.cookies+Io()),0)/Game.cookiesPs+Game.Upgrades[e].getPrice()/ze[e].bonus:ze[e].pp=Game.Upgrades[e].getPrice()/ze[e].bonus,Number.isNaN(ze[e].pp)&&(ze[e].pp=1/0),ze[e].colour=na(ze[e],Game.Upgrades[e].getPrice())})),window.CookieMonsterData.Objects1=JSON.parse(JSON.stringify(Le)),window.CookieMonsterData.Objects10=JSON.parse(JSON.stringify(Ae)),window.CookieMonsterData.Objects100=JSON.parse(JSON.stringify(We)),window.CookieMonsterData.Upgrades=[],Object.entries(ze).forEach((e=>{window.CookieMonsterData.Upgrades[e[0]]=JSON.parse(JSON.stringify(e[1]))}))}function Fa(e){if("toggle"===Game.Upgrades[e].pool||0===Game.Upgrades[e].bought&&Game.Upgrades[e].unlocked&&"prestige"!==Game.Upgrades[e].pool){ta(),"Shimmering veil [on]"===Mt[e].name?Mt["Shimmering veil [off]"].bought=0:"Golden switch [on]"===Mt[e].name?Mt["Golden switch [off]"].bought=0:Mt[e].bought=(Mt[e].bought+1)%2,Game.CountsAsUpgradeOwned(Game.Upgrades[e].pool)&&(Z+=1),"Elder Pledge"===e?(ee+=1,ee>0&&ra("Elder nap"),ee>=5&&ra("Elder slumber")):"Elder Covenant"===e?ra("Elder calm"):"Prism heart biscuits"===e?ra("Lovely cookies"):"Heavenly key"===e&&ra("Wholesome");const t=te;sa(),ha(),t!==te&&sa();const o=function(){let e=0;wt("Thousand fingers")&&(e+=.1),wt("Million fingers")&&(e*=5),wt("Billion fingers")&&(e*=10),wt("Trillion fingers")&&(e*=20),wt("Quadrillion fingers")&&(e*=20),wt("Quintillion fingers")&&(e*=20),wt("Sextillion fingers")&&(e*=20),wt("Septillion fingers")&&(e*=20),wt("Octillion fingers")&&(e*=20),wt("Nonillion fingers")&&(e*=20),wt("Decillion fingers")&&(e*=20),wt("Undecillion fingers")&&(e*=20),wt("Unshackled cursors")&&(e*=25);let t=0;Object.keys(Ct).forEach((e=>{t+=Ct[e].amount})),t-=Ct.Cursor.amount,e*=t,wt("Plastic mouse")&&(e+=.01*me),wt("Iron mouse")&&(e+=.01*me),wt("Titanium mouse")&&(e+=.01*me),wt("Adamantium mouse")&&(e+=.01*me),wt("Unobtainium mouse")&&(e+=.01*me),wt("Eludium mouse")&&(e+=.01*me),wt("Wishalloy mouse")&&(e+=.01*me),wt("Fantasteel mouse")&&(e+=.01*me),wt("Nevercrack mouse")&&(e+=.01*me),wt("Armythril mouse")&&(e+=.01*me),wt("Technobsidian mouse")&&(e+=.01*me),wt("Plasmarble mouse")&&(e+=.01*me),wt("Miraculite mouse")&&(e+=.01*me),wt("Aetherice mouse")&&(e+=.01*me),wt("Omniplast mouse")&&(e+=.01*me),wt("Fortune #104")&&(e+=.01*me);let o=1;if(wt("Santa's helpers")&&(o*=1.1),wt("Cookie egg")&&(o*=1.1),wt("Halo gloves")&&(o*=1.1),wt("Dragon claw")&&(o*=1.03),wt("Aura gloves")&&(o*=1+.05*Math.min(Game.Objects.Cursor.level,wt("Luminous gloves")?20:10)),o*=vt("click"),Ct.Temple.minigameLoaded&&Tt){const e=Tt("labor");1===e?o*=1.15:2===e?o*=1.1:3===e&&(o*=1.05)}Object.keys(Game.buffs).forEach((e=>{void 0!==Game.buffs[e].multClick&&(o*=Game.buffs[e].multClick)})),o*=1+.05*bt("Dragon Cursor");let a=o*Game.ComputeCps(1,wt("Reinforced index finger")+wt("Carpal tunnel prevention cream")+wt("Ambidextrous"),e);return a=Game.runModHookOnValue("cookiesPerClick",a),Game.hasBuff("Cursed finger")&&(a=Game.buffs["Cursed finger"].power),a}()-Game.computedMouseCps;return o?[me-Game.cookiesPs,o]:[me-Game.cookiesPs]}return[]}function Ea(e){const t={};return Object.keys(Game.Objects).forEach((o=>{t[o]={},t[o].bonus=ga(o,e),1!==e&&(Y=1)})),t}function Ba(){Object.keys(Game.Objects).forEach((e=>{Le[e].price=wa(e,Game.Objects[e].basePrice,Game.Objects[e].amount,Game.Objects[e].free,1),Ae[e].price=wa(e,Game.Objects[e].basePrice,Game.Objects[e].amount,Game.Objects[e].free,10),We[e].price=wa(e,Game.Objects[e].basePrice,Game.Objects[e].amount,Game.Objects[e].free,100),je[e].price=wa(e,Game.Objects[e].basePrice,Game.Objects[e].amount,Game.Objects[e].free,je[e].AmountNeeded)})),Ga({CacheObjectsNextAchievement:je})}function Pa(){Le=Ea(1),Ae=Ea(10),We=Ea(100),function(){ze={};for(let e=0;e<Game.UpgradesInStore.length;e++){const t=Game.UpgradesInStore[e].name,o=Fa(t);"Elder Pledge"===t?(ze[t]={bonus:Game.cookiesPs-I},1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?ze[t].bonus-=z:2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink&&(ze[t].bonus-=V),Number.isFinite(ze[t].bonus)||(ze[t].bonus=0)):(ze[t]={},o[0]&&(ze[t].bonus=o[0]),o[1]&&(ze[t].bonusMouse=o[1]))}}()}function Na(e,t,o){let a=0,n=0,i=0,r=0,s=1+Math.max(0,Math.ceil(Math.log(Game.cookies)/Math.LN10)-10);for(;i<t*o;)n=Math.max(e,Math.min(Math.floor(1/9*10**s*e*o),t*o)),i=Math.max(e,Math.min(Math.floor(1/9*10**(s+1)*e*o),t*o)),r=Math.floor(1/9*10**(s+1)*e*o),a+=n,s+=1;return[a,n,r]}function Oa(){let e=60*Se*60*6*Fe;const t=ia();t>0?e/=t:e=0,Ke=Na(7,e,Ee),qe=2*Ke[1]/Ee,Ye=Ke[2]/60/60/6/Fe,et=Na(6,e,Be),Je=2*et[1]/Be,Ze=et[2]/60/60/6/Fe,at=Na(7,7*e,Ee),tt=2*at[1]/Ee,ot=at[2]/60/60/6/Fe,rt=Na(6,7*e,Be),nt=2*rt[1]/Be,it=rt[2]/60/60/6/Fe,Ga({CacheChainMaxReward:Ke,CacheChainRequired:qe,CacheChainRequiredNext:Ye,CacheChainWrathMaxReward:et,CacheChainWrathRequired:Je,CacheChainWrathRequiredNext:Ze,CacheChainFrenzyMaxReward:at,CacheChainFrenzyRequired:tt,CacheChainFrenzyRequiredNext:ot,CacheChainFrenzyWrathMaxReward:rt,CacheChainFrenzyWrathRequired:nt,CacheChainFrenzyWrathRequiredNext:it})}function Da(){const e=Math.floor(Date.now()/1e3);if(Game.T/Game.fps%1==0){const t=Game.HowMuchPrestige(Game.cookiesReset),o=Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned))-Math.floor(t),a=e-Q,n=Math.max(0,o-q)/a;for(let e=0;e<a;e++)W.addLatest(n);Q=e,q=o,Pe=W.calcAverage(5)}Ga({CacheLastHeavenlyCheck:Q,CacheLastHeavenlyChips:q,CacheHCPerSecond:Pe})}function La(){_e="",Qe="",Xe="";const e=[];Object.keys(Game.Upgrades).forEach((t=>{e.push(Game.Upgrades[t])})),e.sort((function(e,t){return e.order>t.order?1:e.order<t.order?-1:0})),Object.keys(e).forEach((t=>{const o=e[t];if(0===o.bought){let e="";e+=function(e){let t="crate upgrade missing";"prestige"===e.pool&&(t+=" heavenly");let o=0;Game.prefs.crates||(o=1),o&&(t+=" noFrame");let{icon:a}=e;e.iconFunction&&(a=e.iconFunction());const n=`function() {return Game.crateTooltip(Game.UpgradesById[${e.id}], 'stats');}`;return`<div class="${t}"\n\t${Game.getDynamicTooltip(n,"top",!0)}\n\tstyle = "${a[2]?`background-image: url(${a[2]});`:""}background-position:${48*-a[0]}px ${48*-a[1]}px;">\n\t</div>`}(o),"prestige"===o.pool?Xe+=e:"cookie"===o.pool?Qe+=e:"toggle"!==o.pool&&"unused"!==o.pool&&"debug"!==o.pool&&(_e+=e)}}))}function Aa(){if("christmas"===Game.season){let e=60*Game.cookiesPs;Game.hasBuff("Elder frenzy")&&(e*=.5),Game.hasBuff("Frenzy")&&(e*=.75),Oe=Math.max(25,e),Game.Has("Ho ho ho-flavored frosting")&&(Oe*=2)}Ga({CacheSeaSpec:Oe})}function Wa(){ke=900*Se/.15,ke*=Fe;const e=ia();e>0?ke/=e:ke=0,Ce=Ee*(.15*ke)+13,Me=Be*(.15*ke)+13,ye=7*ke,be=Ee*(.15*ye)+13,Ge=Be*(.15*ye)+13,ve=2*ke,we=.15*ve,xe=0;let t=0,o=0;Object.keys(Game.Objects).forEach((e=>{Game.Objects[e].amount>t&&(t=Game.Objects[e].amount),Game.Objects[e].amount>0&&(o+=1)})),Object.keys(Game.Objects).forEach((e=>{(Game.Objects[e].amount<t||1===o)&&Game.Objects[e].amount<400&&2*Game.Objects[e].price>xe&&(xe=2*Game.Objects[e].price,Te=e)})),Ga({CacheLucky:ke,CacheLuckyReward:Ce,CacheLuckyWrathReward:Me,CacheLuckyFrenzy:ye,CacheLuckyRewardFrenzy:be,CacheLuckyWrathRewardFrenzy:Ge,CacheConjure:ve,CacheConjureReward:we,CacheEdifice:xe,CacheEdificeBuilding:Te})}function ja(){let e=1,t=1,o=1;wt("Green yeast digestives")&&(o*=1.01),wt("Dragon fang")&&(o*=1.03),e*=1+.1*Game.auraMult("Ancestral Metamorphosis"),e*=Game.eff("goldenCookieGain"),t*=1+.1*Game.auraMult("Unholy Dominion"),t*=Game.eff("wrathCookieGain"),Ee=o*e,Be=o*t,Fe=1,0===Game.shimmerTypes.golden.n&&(Fe*=1+1.23*Game.auraMult("Dragon's Fortune")),Ga({CacheGoldenCookiesMult:Ee,CacheWrathCookiesMult:Be,CacheDragonsFortuneMultAdjustment:Fe})}function $a(e){const t={};Object.keys(Game.Objects).forEach((o=>{if(0!==Object.keys(je).length&&je[o].TotalNeeded>Game.Objects[o].amount&&!e)t[o]={AmountNeeded:je[o].TotalNeeded-Game.Objects[o].amount,TotalNeeded:je[o].TotalNeeded,price:wa(o,Game.Objects[o].basePrice,Game.Objects[o].amount,Game.Objects[o].free,je[o].TotalNeeded-Game.Objects[o].amount)};else{const e=function(e){const t=Game.AchievementsOwned;let o=100,a=100;for(;o>-1;)if(ga(e,o),te>t)a=o,o-=10;else{if(100===o)return 101;for(o+=1;o<=a;){if(ga(e,o),te>t)return o;o+=1}}return 101}(o);t[o]={AmountNeeded:e,TotalNeeded:Game.Objects[o].amount+e,price:wa(o,Game.Objects[o].basePrice,Game.Objects[o].amount,Game.Objects[o].free,e)}}})),je=t,Ga({CacheObjectsNextAchievement:je})}function Ua(){$e=0,Ue=0,He=[0,null];for(let e=0;e<Game.wrinklers.length;e++){let{sucked:t}=Game.wrinklers[e],o=1.1;if(Game.Has("Sacrilegious corruption")&&(o*=1.05),1===Game.wrinklers[e].type&&(o*=3),t*=o,Game.Has("Wrinklerspawn")&&(t*=1.05),Ct.Temple.minigameLoaded){const e=Game.hasGod("scorn");1===e?t*=1.15:2===e?t*=1.1:3===e&&(t*=1.05)}$e+=t,0===Game.wrinklers[e].type&&(Ue+=t,t>He[0]&&(He=[t,e]))}Ga({CacheWrinklersTotal:$e,CacheWrinklersNormal:Ue,CacheWrinklersFattest:He})}function Ha(){Yo(),Ua(),Wa(),ja(),Oa(),La(),Aa(),N=new ba(xo[xo.length-1]),O=new ba(xo[xo.length-1]),D=new ba(xo[xo.length-1]),L=new ba(xo[xo.length-1]),A=new ba(To[To.length-1]),W=new ba(5),P=new ba(20*To[To.length-1]),Da(),$a(),va(),Pa(),Ba(),Sa()}function Ra(){Object.keys(Game.wrinklers).forEach((e=>{Game.wrinklers[e].sucked>0&&0===Game.wrinklers[e].type&&(Game.wrinklers[e].hp=0)}))}function Ia(e,t){if("b"===e){if(l("tooltip").innerHTML=Game.Objects[t].tooltip(),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipAmor){const e=wa(t,Game.Objects[t].basePrice,0,Game.Objects[t].free,Game.Objects[t].amount),o=e-Game.Objects[t].totalCookies;o>0&&(l("tooltip").innerHTML=l("tooltip").innerHTML.split("so far</div>").join(`so far<br/>• <b>${to(o)}</b> ${1===Math.floor(o)?"cookie":"cookies"} left to amortize (${Ho((e-Game.Objects[t].totalCookies)/(Game.Objects[t].storedTotalCps*Game.globalCpsMult)).text})</div>`))}-1===Game.buyMode&&(l("tooltip").innerHTML=l("tooltip").innerHTML.split(to(Game.Objects[t].bulkPrice)).join(to((Game.Objects[t],Game.Objects[t].basePrice,Game.Objects[t].amount,Game.Objects[t].free,Game.buyBulk,1))))}else if("u"===e){if(!Game.UpgradesInStore[t])return"";l("tooltip").innerHTML=Game.crateTooltip(Game.UpgradesInStore[t],"store")}else"s"===e?l("tooltip").innerHTML=Game.lumpTooltip():"g"===e?l("tooltip").innerHTML=Game.Objects["Wizard tower"].minigame.spellTooltip(t)():"p"===e?l("tooltip").innerHTML=Game.ObjectsById[2].minigame.tileTooltip(t[0],t[1])():"ha"===e?l("tooltip").innerHTML=Game.ObjectsById[2].minigame.toolTooltip(1)():"wb"===e?l("tooltip").innerHTML="":"pag"===e?l("tooltip").innerHTML=Game.Objects.Temple.minigame.godTooltip(t)():"pas"===e&&(l("tooltip").innerHTML=Game.Objects.Temple.minigame.slotTooltip(t[0])());if("b"===e&&1===Game.buyMode||"u"===e||"s"===e||"g"===e||"p"===e&&!Game.keys[16]||"ha"===e||"wb"===e||"pag"===e||"pas"===e&&-1!==t[1]){const e=document.createElement("div");e.id="CMTooltipArea",l("tooltip").appendChild(e)}return Bo=e,Po=t,Ca(),l("tooltip").innerHTML}function za(){1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Favicon&&It>0?ct.wrath?l("CMFavicon").href="https://CookieMonsterTeam.github.io/CookieMonster/favicon/wrathCookie.ico":l("CMFavicon").href="https://CookieMonsterTeam.github.io/CookieMonster/favicon/goldenCookie.ico":l("CMFavicon").href="https://orteil.dashnet.org/cookieclicker/favicon.ico"}function Va(){Ct=[],Object.keys(Game.Objects).forEach((e=>{Ct[e]=Zo(e)})),Mt=[],Object.keys(Game.Upgrades).forEach((e=>{Mt[e]=ea(e)})),yt=[],Object.keys(Game.Achievements).forEach((e=>{yt[e]=Ko(e)})),ta()}function _a(){Game.Objects["Wizard tower"].minigameLoaded&&Object.keys(Game.Objects["Wizard tower"].minigame.spellsById).forEach((e=>{null!==l(`grimoireSpell${e}`).onmouseover&&(Yt[e]=l(`grimoireSpell${e}`).onmouseover,l(`grimoireSpell${e}`).onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("g",`${e}`)),"this"),Game.tooltip.wobble()})}))}function Xa(){if(!jt&&Game.Objects["Wizard tower"].minigameLoaded){const{minigame:e}=Game.Objects["Wizard tower"];At=e.draw,Game.Objects["Wizard tower"].minigame.draw=function(){At(),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GrimoireBar&&e.magic<e.magicM&&Game.drawT%5==0&&(e.magicBarTextL.innerHTML+=` (${Uo(fa(e.magic,e.magicM,e.magicM))})`,e.magicBarL.style.width="75%")},jt=!0}}function Qa(){!function(){if(!Wt&&Game.Objects["Wizard tower"].minigameLoaded){const{minigame:e}=Game.Objects["Wizard tower"];Dt=e.launch,Lt=new Function(`return ${e.launch.toString().split("=this").join("= Game.Objects['Wizard tower'].minigame")}`),Game.Objects["Wizard tower"].minigame.launch=function(){Lt(),_a(),jt=!1,Xa(),Wt=!0}}}(),Xa()}function qa(){if(ge!==Game.dragonLevel||ce){if(Game.dragonLevel<25&&Game.dragonLevels[Game.dragonLevel].buy.toString().includes("sacrifice")){const e=Game.dragonLevels[Game.dragonLevel].buy.toString().match(/Objects\[(.*)\]/);let t=null!==e?e[1]:Game.ObjectsById[Game.dragonLevel-5].name;const o=Game.dragonLevels[Game.dragonLevel].buy.toString().match(/sacrifice\((.*?)\)/)[1];if("i"!==t)if(t=t.replaceAll("'",""),Game.Objects[t].amount<o)fe="Not enough buildings to sell";else{let e=0;ta();for(let a=0;a<o;a++){let o=Ct[t].basePrice*Game.priceIncrease**Math.max(0,Ct[t].amount-1-Ct[t].free);o=Game.modifyBuildingPrice(Ct[t],o),o=Math.ceil(o),e+=o,Ct[t].amount-=1}fe=`Cost to rebuy: ${to(e)}`}else{let e=0;ta(),Object.keys(Game.Objects).forEach((a=>{if(t=a,Game.Objects[t].amount<o)fe="Not enough buildings to sell";else{for(let a=0;a<o;a++){let o=Ct[t].basePrice*Game.priceIncrease**Math.max(0,Ct[t].amount-1-Ct[t].free);o=Game.modifyBuildingPrice(Ct[t],o),o=Math.ceil(o),e+=o,Ct[t].amount-=1}fe=`Cost to rebuy: ${to(e)}`}}))}}ge=Game.dragonLevel}Ga({CacheLastDragonLevel:ge})}const Ya={Favourite:"Favourite Settings",Calculation:"Calculation",Notation:"Notation",Colours:"Colours and colour coding",BarsDisplay:"Infobars and visual settings",Tooltip:"Tooltips",Statistics:"Statistics",Notification:"Notifications",Miscellaneous:"Miscellaneous"},Ka={NotificationGeneral:"General Notifications",NotificationGC:"Golden Cookie",NotificationFC:"Fortune Cookie",NotificationSea:"Season Special",NotificationGard:"Garden Tick",NotificationMagi:"Full Magic Bar",NotificationWrink:"Wrinkler",NotificationWrinkMax:"Maximum Wrinklers"},Ja=function(e){if(1===e){const e=function(){try{Notification.requestPermission().then()}catch(e){return!1}return!0};"Notification"in window?e()?Notification.requestPermission().then():Notification.requestPermission():console.log("This browser does not support notifications.")}};function Za(){BeautifyAll(),Game.RefreshStore(),Game.RebuildUpgrades(),_o(),Wo(),$o()}function en(){1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar?(l("CMBotBar").style.display="",_o()):l("CMBotBar").style.display="none",Qo()}const tn={CPSMode:new S(1,"bool","Calculation",["Current cookies per second","Average cookies per second"],"Calculate times using current cookies per second or average cookies per second",!1),AvgCPSHist:new S(3,"bool","Calculation",["Average CPS in past 10s","Average CPS in past 15s","Average CPS in past 30s","Average CPS in past 1m","Average CPS in past 5m","Average CPS in past 10m","Average CPS in past 15m","Average CPS in past 30m"],"How much time average Cookies Per Second should consider",!1),AvgClicksHist:new S(0,"bool","Calculation",["Average clicks in past 1s","Average clicks in past 5s","Average clicks in past 10s","Average clicks in past 15s","Average clicks in past 30s"],"How much time average Cookie Clicks should consider",!1),CalcWrink:new F(0,"bool","Calculation",["Calculate with wrinklers OFF","Calculate with wrinklers ON","Calculate with single fattest wrinkler ON"],"Calculate times and average Cookies Per Second with (only the single non-shiny fattest) wrinklers",!0,(()=>{ce=!0})),Scale:new F(2,"bool","Notation",["Game's setting scale","Metric","Short scale","Short scale (Abbreviated)","Scientific notation","Engineering notation"],"Change how long numbers are formatted",!1,(()=>{Za()})),ScaleDecimals:new F(2,"bool","Notation",["1 decimals","2 decimals","3 decimals"],'Set the number of decimals used when applicable. This only works with Cookie Monster scales and not with "Game\'s Setting Scale"',!1,(()=>{Za()})),ScaleSeparator:new F(0,"bool","Notation",[". for decimals (standard)",". for thousands"],"Set the separator used for decimals and thousands",!1,(()=>{Za()})),ScaleCutoff:new T(999999,"numscale","Notation","Notation cut-off point: ","The number from which Cookie Monster will start formatting numbers based on chosen scale. Standard is 999,999. Setting this above 999,999,999 might break certain notations",1,999999999),TimeFormat:new S(0,"bool","Notation",["Time XXd, XXh, XXm, XXs","Time XX:XX:XX:XX:XX","Time XXx, XXx"],"Change the time format",!1),DetailedTime:new F(1,"bool","Notation",["Detailed time OFF","Detailed time ON"],"Change how time is displayed in certain statistics and tooltips",!0,(()=>{1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.DetailedTime?Game.sayTime=bo:Game.sayTime=Jt.sayTime})),PPDisplayTime:new S(0,"bool","Notation",["PP as value (standard)","PP as time unit"],"Display PP as calculated value or as approximate time unit. Note that PP does not translate directly into a time unit and this is therefore only an approximation.",!1),BuildColour:new F(1,"bool","Colours",["Building colours OFF","Building colours ON"],"Colour code buildings",!0,(()=>{Wo()})),PPOnlyConsiderBuyable:new S(0,"bool","Colours",["Don't ignore non-buyable","Ignore non-buyable"],"Makes Cookie Monster label buildings and upgrades you can't buy right now red, useful in those situations where you just want to spend your full bank 'most optimally'",!0),PPExcludeTop:new S(0,"bool","Colours",["Don't ignore any","Ignore 1st best","Ignore 1st and 2nd best","Ignore 1st, 2nd and 3rd best"],"Makes Cookie Monster ignore the 1st, 2nd or 3rd best buildings in labeling and colouring PP values",!0),PPRigidelMode:new S(0,"bool","Colours",["Rigidel mode OFF","Rigidel mode ON"],'Makes Cookie Monster ignore all "buy 1" options when colouring PP in order to stay at a total building count ending in 10 for pantheon god Rigidel',!0),PPSecondsLowerLimit:new T(0,"numscale","Colours","Lower limit for PP (in seconds): ",'If a building or upgrade costs less than the specified seconds of CPS it will also be considered optimal and label it as such ("PP is less than xx seconds of CPS"); setting to 0 ignores this option',0,1/0),ColourBlue:new x("#4bb8f0","colour","Colours","Standard colour is blue. Used to show upgrades better than best PP building, for Click Frenzy bar, and for various labels"),ColourGreen:new x("#00ff00","colour","Colours","Standard colour is green. Used to show best PP building, for Blood Frenzy bar, and for various labels"),ColourYellow:new x("#ffff00","colour","Colours","Standard colour is yellow. Used to show buildings within the top 10 of PP, for Frenzy bar, and for various labels"),ColourOrange:new x("#ff7f00","colour","Colours","Standard colour is orange. Used to show buildings within the top 20 of PP, for Next Reindeer bar, and for various labels"),ColourRed:new x("#ff0000","colour","Colours","Standard colour is Red. Used to show buildings within the top 30 of PP, for Clot bar, and for various labels"),ColourPurple:new x("#ff00ff","colour","Colours","Standard colour is purple. Used to show buildings outside of the top 30 of PP, for Next Cookie bar, and for various labels"),ColourGray:new x("#b3b3b3","colour","Colours","Standard colour is gray. Used to show negative or infinity PP, and for Next Cookie/Next Reindeer bar"),ColourPink:new x("#ff1493","colour","Colours","Standard colour is pink. Used for Dragonflight bar"),ColourBrown:new x("#8b4513","colour","Colours","Standard colour is brown. Used for Dragon Harvest bar"),BotBar:new F(1,"bool","BarsDisplay",["Bottom bar OFF","Bottom bar ON"],"Building information",!0,(()=>{en()})),TimerBar:new F(1,"bool","BarsDisplay",["Timer bar OFF","Timer bar ON"],"Bar with timers for golden cookie, season popup, Frenzy (Normal, Clot, Elder), Click Frenzy",!0,(()=>{qo()})),TimerBarPos:new F(0,"bool","BarsDisplay",["Timer bar position (top left)","Timer bar position (bottom)"],"Placement of the timer bar",!1,(()=>{0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos?(l("CMTimerBar").style.width="30%",l("CMTimerBar").style.bottom="",l("game").insertBefore(l("CMTimerBar"),l("sectionLeft"))):(l("CMTimerBar").style.width="100%",l("CMTimerBar").style.bottom="0px",l("wrapper").appendChild(l("CMTimerBar"))),Qo()})),TimerBarOverlay:new S(2,"bool","BarsDisplay",["Timer bar overlay OFF","Timer bar overlay only seconds","Timer bar overlay full"],"Overlay on timers displaying seconds and/or percentage left",!0),AutosaveTimerBar:new S(0,"bool","BarsDisplay",["Autosave timer bar OFF","Autosave timer bar ON"],"Show a timer counting down till next autosave in the timer bar",!0),UpBarColour:new F(1,"bool","BarsDisplay",["Upgrade colours/bar OFF","Upgrade colours with bar ON","Upgrade colours without bar ON"],"Colour code upgrades and optionally add a counter bar",!1,(()=>{1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour?(l("CMUpgradeBar").style.display="",$o()):2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour?(l("CMUpgradeBar").style.display="none",$o()):(l("CMUpgradeBar").style.display="none",Game.RebuildUpgrades())})),UpgradeBarFixedPos:new F(1,"bool","BarsDisplay",["Upgrade bar fixed position OFF","Upgrade bar fixed position ON"],"Lock the upgrade bar at top of the screen to prevent it from moving ofscreen when scrolling",!0,(()=>{1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpgradeBarFixedPos?(l("CMUpgradeBar").style.position="sticky",l("CMUpgradeBar").style.top="0px"):l("CMUpgradeBar").style.position=""})),SortBuildings:new F(0,"bool","BarsDisplay",["Sort buildings: default","Sort buildings: PP of x1 purchase","Sort buildings: PP of selected bulk mode","Sort buildings: price until next achievement"],"Sort the display of buildings in default order, by PP, or until next achievement",!1,(()=>{Wo()})),SortUpgrades:new F(0,"bool","BarsDisplay",["Sort upgrades: default","Sort upgrades: PP"],"Sort the display of upgrades in either default order or by PP",!1,(()=>{$o()})),UpgradesNeverCollapse:new F(0,"bool","BarsDisplay",["Upgrades always expanded OFF","Upgrades always expanded ON"],"Toggle to make the upgrades sections always expanded to the size needed to display all upgrades",!0,(()=>{jo()})),DragonAuraInfo:new S(1,"bool","BarsDisplay",["Extra dragon aura info OFF","Extra dragon aura info ON"],"Shows information about changes in CPS and costs in the dragon aura interface.",!0),GrimoireBar:new S(1,"bool","BarsDisplay",["Grimoire magic meter timer OFF","Grimoire magic meter timer ON"],"A timer overlay showing how long till the Grimoire magic meter is full",!0),GCTimer:new F(1,"bool","BarsDisplay",["Golden cookie timer OFF","Golden cookie timer ON"],"A timer on the golden cookie when it has been spawned",!0,(()=>{1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer?Object.keys(Lo).forEach((e=>{Lo[e].style.display="block",Lo[e].style.left=gt[e].l.style.left,Lo[e].style.top=gt[e].l.style.top})):Object.keys(Lo).forEach((e=>Lo[e].style.display="none"))})),Favicon:new F(1,"bool","BarsDisplay",["Favicon OFF","Favicon ON"],"Update favicon with golden/wrath cookie",!0,(()=>{za()})),WrinklerButtons:new F(1,"bool","BarsDisplay",["Extra wrinkler buttons OFF","Extra wrinkler buttons ON"],"Show buttons for popping wrinklers at bottom of cookie section",!0,(()=>{B()})),HideSectionsButtons:new F(0,"bool","BarsDisplay",["Hide buildings/upgrades button OFF","Hide buildings/upgrades button ON"],"Show buttons for hiding and showing the buildings and upgrades sections in the right column",!0,(()=>{Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.HideSectionsButtons?l("CMSectionHidButtons").style.display="":l("CMSectionHidButtons").style.display="none"})),TooltipBuildUpgrade:new S(1,"bool","Tooltip",["Building/upgrade tooltip information OFF","Building/upgrade tooltip information ON"],"Extra information in building/upgrade tooltips",!0),TooltipAmor:new S(0,"bool","Tooltip",["Buildings tooltip amortization information OFF","Buildings tooltip amortization information ON"],"Add amortization information to buildings tooltip",!0),ToolWarnLucky:new S(1,"bool","Tooltip",["Tooltip lucky warning OFF","Tooltip lucky warning ON"],'A warning when buying if it will put the bank under the amount needed for max "Lucky!" rewards',!0),ToolWarnLuckyFrenzy:new S(1,"bool","Tooltip",["Tooltip lucky frenzy warning OFF","Tooltip lucky frenzy warning ON"],'A warning when buying if it will put the bank under the amount needed for max "Lucky!" (Frenzy) rewards',!0),ToolWarnConjure:new S(1,"bool","Tooltip",["Tooltip conjure warning OFF","Tooltip conjure warning ON"],'A warning when buying if it will put the bank under the amount needed for max "Conjure Baked Goods" rewards',!0),ToolWarnConjureFrenzy:new S(1,"bool","Tooltip",["Tooltip conjure frenzy warning OFF","Tooltip conjure frenzy warning ON"],'A warning when buying if it will put the bank under the amount needed for max "Conjure Baked Goods" rewards with Frenzy active',!0),ToolWarnEdifice:new S(1,"bool","Tooltip",["Tooltip edifice warning OFF","Tooltip edifice warning ON"],'A warning when buying if it will put the bank under the amount needed for "Spontaneous Edifice" to possibly give you your most expensive building',!0),ToolWarnUser:new T(0,"numscale","Tooltip","Tooltip warning at x times CPS: ","Use this to show a customized warning if buying it will put the bank under the amount equal to value times cps; setting to 0 disables the function altogether",0,1/0),ToolWarnBon:new S(1,"bool","Tooltip",["Calculate tooltip warning with bonus CPS OFF","Calculate tooltip warning with bonus CPS ON"],"Calculate the warning with or without the bonus CPS you get from buying",!0),ToolWarnPos:new F(1,"bool","Tooltip",["Tooltip warning position (left)","Tooltip warning position (bottom)"],"Placement of the warning boxes",!1,(()=>{ka()})),TooltipGrim:new S(1,"bool","Tooltip",["Grimoire tooltip information OFF","Grimoire tooltip information ON"],"Extra information in tooltip for grimoire",!0),TooltipWrink:new S(1,"bool","Tooltip",["Wrinkler tooltip OFF","Wrinkler tooltip ON"],"Shows the amount of cookies a wrinkler will give when popping it",!0),TooltipLump:new S(1,"bool","Tooltip",["Sugar lump tooltip OFF","Sugar lump tooltip ON"],"Shows the current Sugar Lump type in Sugar lump tooltip.",!0),TooltipPlots:new S(1,"bool","Tooltip",["Garden plots tooltip OFF","Garden plots tooltip ON"],"Shows a tooltip for plants that have a cookie reward.",!0),TooltipPantheon:new S(1,"bool","Tooltip",["Pantheon tooltip OFF","Pantheon tooltip ON"],"Shows additional info in the pantheon tooltip",!0),TooltipAscendButton:new S(1,"bool","Tooltip",["Show Extra Info Ascend Tooltip OFF","Show Extra Info Ascend Tooltip ON"],"Shows additional info in the ascend tooltip",!0),Stats:new S(1,"bool","Statistics",["Statistics OFF","Statistics ON"],"Extra Cookie Monster statistics!",!0),MissingUpgrades:new S(1,"bool","Statistics",["Missing upgrades OFF","Missing upgrades ON"],"Shows missing upgrades in statistics menu",!0),MissingAchievements:new S(0,"bool","Statistics",["Missing Achievements OFF","Missing Normal Achievements ON"],"Shows missing normal achievements in statistics menu.",!0),UpStats:new S(1,"bool","Statistics",["Statistics update rate (default)","Statistics update rate (1s)"],"Default rate is once every 5 seconds",!1),HeavenlyChipsTarget:new T(1,"numscale","Statistics","Heavenly chips target: ",'Use this to set a heavenly chips target that will be counted towards in the "prestige" statsistics sections',1,1/0),ShowMissedGC:new S(1,"bool","Statistics",["Missed GC OFF","Missed GC ON"],"Show a stat in the statistics screen that counts how many golden cookies you have missed",!0),Title:new S(1,"bool","NotificationGeneral",["Title OFF","Title ON","Title pinned tab highlight"],'Update title with colden cookie/season popup timers; pinned tab highlight only changes the title when a golden cookie/season popup spawns; "!" means that golden cookie/reindeer can spawn',!0),GeneralSound:new S(1,"bool","NotificationGeneral",["Consider game volume setting OFF","Consider game volume setting ON"],'Turning this toggle to "off" makes Cookie Monster no longer consider the volume setting of the base game, allowing mod notifications to play with base game volume turned down',!0),GCNotification:new F(0,"bool","NotificationGC",["Notification OFF","Notification ON"],"Create a notification when golden cookie spawns",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCNotification)})),GCFlash:new S(1,"bool","NotificationGC",["Flash OFF","Flash ON"],"Flash screen on golden cookie",!0),ColourGCFlash:new x("#ffffff","colour","NotificationGC","The colour of the GC flash, standard colour is white"),GCSound:new S(1,"bool","NotificationGC",["Sound OFF","Sound ON"],"Play a sound on golden cookie",!0),GCVolume:new E(100,"vol","NotificationGC",[],"Volume"),GCSoundURL:new S("https://freesound.org/data/previews/66/66717_931655-lq.mp3","url","NotificationGC","Sound URL:","URL of the sound to be played when a golden cookie spawns"),FortuneNotification:new F(0,"bool","NotificationFC",["Notification OFF","Notification ON"],"Create a notification when fortune cookie is on the ticker",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FortuneNotification)})),FortuneFlash:new S(1,"bool","NotificationFC",["Flash OFF","Flash ON"],"Flash screen on fortune cookie spawn",!0),ColourFortuneFlash:new x("#ffffff","colour","NotificationFC","The colour of the fortune flash, standard colour is white"),FortuneSound:new S(1,"bool","NotificationFC",["Sound OFF","Sound ON"],"Play a sound on fortune cookie spawn",!0),FortuneVolume:new E(100,"vol","NotificationFC",[],"Volume"),FortuneSoundURL:new S("https://freesound.org/data/previews/174/174027_3242494-lq.mp3","url","NotificationFC","Sound URL:","URL of the sound to be played when the ticker has a fortune cookie"),SeaNotification:new F(0,"bool","NotificationSea",["Notification OFF","Notification ON"],"Create a notification on season popup",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SeaNotification)})),SeaFlash:new S(1,"bool","NotificationSea",["Flash OFF","Flash ON"],"Flash screen on season popup",!0),ColourSeaFlash:new x("#ffffff","colour","NotificationSea","The colour of the season popup flash, standard colour is white"),SeaSound:new S(1,"bool","NotificationSea",["Sound OFF","Sound ON"],"Play a sound on season popup",!0),SeaVolume:new E(100,"vol","NotificationSea",[],"Volume"),SeaSoundURL:new S("https://www.freesound.org/data/previews/121/121099_2193266-lq.mp3","url","NotificationSea","Sound URL:","URL of the sound to be played when on season popup spawns"),GardFlash:new S(1,"bool","NotificationGard",["Garden Tick Flash OFF","Flash ON"],"Flash screen on garden tick",!0),ColourGardFlash:new x("#ffffff","colour","NotificationGard","The colour of the garden flash, standard colour is white"),GardSound:new S(1,"bool","NotificationGard",["Sound OFF","Sound ON"],"Play a sound on garden tick",!0),GardVolume:new E(100,"vol","NotificationGard",[],"Volume"),GardSoundURL:new S("https://freesound.org/data/previews/103/103046_861714-lq.mp3","url","NotificationGard","Garden Tick Sound URL:","URL of the sound to be played when the garden ticks"),MagicNotification:new F(0,"bool","NotificationMagi",["Notification OFF","Notification ON"],"Create a notification when magic reaches maximum",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MagicNotification)})),MagicFlash:new S(1,"bool","NotificationMagi",["Flash OFF","Flash ON"],"Flash screen when magic reaches maximum",!0),ColourMagicFlash:new x("#ffffff","colour","NotificationMagi","The colour of the magic flash, standard colour is white"),MagicSound:new S(1,"bool","NotificationMagi",["Sound OFF","Sound ON"],"Play a sound when magic reaches maximum",!0),MagicVolume:new E(100,"vol","NotificationMagi",[],"Volume"),MagicSoundURL:new S("https://freesound.org/data/previews/221/221683_1015240-lq.mp3","url","NotificationMagi","Sound URL:","URL of the sound to be played when magic reaches maxium"),WrinklerNotification:new F(0,"bool","NotificationWrink",["Notification OFF","Notification ON"],"Create a notification when a wrinkler appears",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerNotification)})),WrinklerFlash:new S(1,"bool","NotificationWrink",["Flash OFF","Flash ON"],"Flash screen when a wrinkler appears",!0),ColourWrinklerFlash:new x("#ffffff","colour","NotificationWrink","The colour of the wrinkler flash, standard colour is white"),WrinklerSound:new S(1,"bool","NotificationWrink",["Sound OFF","Sound ON"],"Play a sound when a wrinkler appears",!0),WrinklerVolume:new E(100,"vol","NotificationWrink",[],"Volume"),WrinklerSoundURL:new S("https://freesound.org/data/previews/124/124186_8043-lq.mp3","url","NotificationWrink","Sound URL:","URL of the sound to be played when a wrinkler appears"),WrinklerMaxNotification:new F(0,"bool","NotificationWrinkMax",["Notification OFF","Notification ON"],"Create a notification when the maximum amount of wrinklers has appeared",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxNotification)})),WrinklerMaxFlash:new S(1,"bool","NotificationWrinkMax",["Flash OFF","Flash ON"],"Flash screen when the maximum amount of Wrinklers has appeared",!0),ColourWrinklerMaxFlash:new x("#ffffff","colour","NotificationWrinkMax","The colour of the maximum wrinkler flash, standard colour is white"),WrinklerMaxSound:new S(1,"bool","NotificationWrinkMax",["Sound OFF","Sound ON"],"Play a sound when the maximum amount of wrinklers has appeared",!0),WrinklerMaxVolume:new E(100,"vol","NotificationWrinkMax",[],"Volume"),WrinklerMaxSoundURL:new S("https://freesound.org/data/previews/152/152743_15663-lq.mp3","url","NotificationWrinkMax","Sound URL:","URL of the sound to be played when the maximum amount of wrinklers has appeared"),BulkBuyBlock:new S(1,"bool","Miscellaneous",["Block bulk buying OFF","Block bulk buying ON"],"Block clicking bulk buying when you can't buy all. This prevents buying 7 of a building when you are in buy-10 or buy-100 mode.",!0),FavouriteSettings:new F(1,"bool","Miscellaneous",["Favourite settings section OFF","Favourite settings section ON","Favourite settings section ON (Locked)"],"Show stars before each setting which allows selecting it for a 'favourites' section at the top of the Cookie Monster settings. Setting this to Locked removes the stars but shows the 'favourites' section",!0,(()=>{Game.UpdateMenu()}))};function on(){let e="";for(let t=0;t<ho.length;t++)e+=`.CMText${ho[t]} { color: ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[`Colour${ho[t]}`]}; }\n`;for(let t=0;t<ho.length;t++)e+=`.CMBack${ho[t]} { background-color: ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[`Colour${ho[t]}`]}; }\n`;for(let t=0;t<ho.length;t++)e+=`.CMBorder${ho[t]} { border: 1px solid ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[`Colour${ho[t]}`]}; }\n`;l("CMCSS").textContent=e,Wo()}function an(){const e=G("cookieMonsterMod","Cookie Monster","optionsMenu");return Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.optionsMenu&&Object.keys(Ya).forEach((t=>{if("Favourite"===t){if(0!==Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings.length&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FavouriteSettings>0&&(e.appendChild(b.createOptionsSubHeader("cookieMonsterMod",t,Ya[t])),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[t]))for(let t=0;t<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings.length;t++)e.appendChild(b.createOptionsListing("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings[t],tn,on,Za))}else e.appendChild(b.createOptionsSubHeader("cookieMonsterMod",t,Ya[t])),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[t]&&("Notification"===t?Object.keys(Ka).forEach((t=>{const o=b.createOptionsSubHeader("cookieMonsterMod",t,Ka[t]);o.style.fontSize="15px",o.style.opacity="0.5",e.appendChild(o),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[t]&&Object.keys(tn).forEach((o=>{tn[o].group===t&&e.appendChild(b.createOptionsListing("cookieMonsterMod",o,tn,on,Za))}))})):Object.keys(tn).forEach((o=>{tn[o].group===t&&e.appendChild(b.createOptionsListing("cookieMonsterMod",o,tn,on,Za))})))})),e}function nn(e){return String(e).split(String(7)).length-1}function rn(e,t){const o=10*t;let a=7*t-e%o+e%t;return a<0&&(a+=o),a}function sn(e,t){const o=document.createElement("div");o.className="title",o.style.padding="0px 16px",o.style.opacity="0.7",o.style.fontSize="17px",o.style.fontFamily='"Kavoon", Georgia, serif',o.appendChild(document.createTextNode(`${e} `));const a=document.createElement("span");return a.style.cursor="pointer",a.style.display="inline-block",a.style.height="14px",a.style.width="14px",a.style.borderRadius="7px",a.style.textAlign="center",a.style.backgroundColor="#C0C0C0",a.style.color="black",a.style.fontSize="13px",a.style.verticalAlign="middle",a.textContent=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[t]?"-":"+",a.onclick=function(){!function(e){Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[e]+=1,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[e]>1&&(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[e]=0),w.saveFramework()}(t),Game.UpdateMenu()},o.appendChild(a),o}function ln(e,t,o,a){const n=document.createElement("div");n.className="listing";const i=document.createElement("b");if(i.textContent=t,n.appendChild(i),"withTooltip"===e){n.className="listing",n.appendChild(document.createTextNode(" "));const e=document.createElement("span");e.onmouseout=function(){Game.tooltip.hide()},e.onmouseover=function(){Game.tooltip.draw(this,escape(fo[a].innerHTML))},e.style.cursor="default",e.style.display="inline-block",e.style.height="10px",e.style.width="10px",e.style.borderRadius="5px",e.style.textAlign="center",e.style.backgroundColor="#C0C0C0",e.style.color="black",e.style.fontSize="9px",e.style.verticalAlign="bottom",e.textContent="?",n.appendChild(e)}return n.appendChild(document.createTextNode(": ")),n.appendChild(o),n}function cn(e,t,o,a){const n=document.createElement("div");n.className="listing";const i=document.createElement("b");return i.textContent=t,!0===a&&(i.style.color=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ColourGreen),n.appendChild(i),n.appendChild(document.createTextNode(": ")),n.appendChild(o),n}function dn(e){const t=document.createDocumentFragment();t.appendChild(document.createTextNode(`${e.length} `));const o=document.createElement("span");o.onmouseout=function(){Game.tooltip.hide()};const a=document.createElement("div"),n=document.createElement("div");n.style.minWidth="140px",n.style.marginBottom="4px";const i=document.createElement("div");return i.className="name",i.style.marginBottom="4px",i.style.textAlign="center",i.textContent="Missing",n.appendChild(i),Object.keys(e).forEach((t=>{const o=document.createElement("div");o.style.textAlign="center",o.appendChild(document.createTextNode(e[t])),n.appendChild(o)})),a.appendChild(n),o.onmouseover=function(){Game.tooltip.draw(this,escape(a.innerHTML))},o.style.cursor="default",o.style.display="inline-block",o.style.height="10px",o.style.width="10px",o.style.borderRadius="5px",o.style.textAlign="center",o.style.backgroundColor="#C0C0C0",o.style.color="black",o.style.fontSize="9px",o.style.verticalAlign="bottom",o.textContent="?",t.appendChild(o),t}function mn(e){const t=document.createElement("div");if(t.className="subsection",t.appendChild(e),t.appendChild(sn("Lucky Cookies","Lucky")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Lucky&&t.appendChild(function(){const e=Game.auraMult("Dragon's Fortune")?"GoldCookDragonsFortuneTooltipPlaceholder":"GoldCookTooltipPlaceholder",t=document.createElement("div");t.className="CMStatsLuckySection";const o=Game.cookies+Io()<ke?lo:io,a=Game.cookies+Io()<ke?Uo((ke-(Game.cookies+Io()))/Ro()):"",n=document.createDocumentFragment(),i=document.createElement("span");if(i.style.fontWeight="bold",i.className=oo+o,i.textContent=to(ke),n.appendChild(i),""!==a){const e=document.createElement("small");e.textContent=` (${a})`,n.appendChild(e)}t.appendChild(ln("withTooltip",'"Lucky!" cookies required',n,e));const r=Game.cookies+Io()<ye?lo:io,s=Game.cookies+Io()<ye?Uo((ye-(Game.cookies+Io()))/Ro()):"",l=document.createDocumentFragment(),c=document.createElement("span");if(c.style.fontWeight="bold",c.className=oo+r,c.textContent=to(ye),l.appendChild(c),""!==s){const e=document.createElement("small");e.textContent=` (${s})`,l.appendChild(e)}t.appendChild(ln("withTooltip",'"Lucky!" cookies required (frenzy)',l,e));const d=Ce!==Me,m=document.createElement("span");m.style.fontWeight="bold",m.className=oo+Ce,m.textContent=to(Ce)+(d?` / ${to(Me)}`:""),t.appendChild(ln("withTooltip",'"Lucky!" reward (max)'+(d?" (golden / wrath)":""),m,e));const p=document.createElement("span");p.style.fontWeight="bold",p.className=oo+p,p.textContent=to(be)+(d?` / ${to(Ge)}`:""),t.appendChild(ln("withTooltip",'"Lucky!" reward (max) (frenzy)'+(d?" (golden / wrath)":""),p,e));const u=Math.min(.15*(Game.cookies+Io()),Se*Fe*60*15)+13,h=document.createElement("span");return h.style.fontWeight="bold",h.className=oo+h,h.textContent=to(Ee*u)+(d?` / ${to(Be*u)}`:""),t.appendChild(ln("withTooltip",'"Lucky!" reward (cur)'+(d?" (golden / wrath)":""),h,e)),t}()),t.appendChild(sn("Chain Cookies","Chain")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Chain&&t.appendChild(function(){const e=Game.auraMult("Dragon's Fortune")?"GoldCookDragonsFortuneTooltipPlaceholder":"GoldCookTooltipPlaceholder",t=document.createElement("div");t.className="CMStatsChainSection";const o=Game.cookies+Io()<qe?lo:io,a=Game.cookies+Io()<qe?Uo((qe-(Game.cookies+Io()))/Ro()):"",n=document.createDocumentFragment(),i=document.createElement("span");if(i.style.fontWeight="bold",i.className=oo+o,i.textContent=to(qe),n.appendChild(i),""!==a){const e=document.createElement("small");e.textContent=` (${a})`,n.appendChild(e)}t.appendChild(ln("withTooltip",'"Chain" cookies required',n,e));const r=Game.cookies+Io()<Je?lo:io,s=Game.cookies+Io()<Je?Uo((Je-(Game.cookies+Io()))/Ro()):"",l=document.createDocumentFragment(),c=document.createElement("span");if(c.style.fontWeight="bold",c.className=oo+r,c.textContent=to(Je),l.appendChild(c),""!==s){const e=document.createElement("small");e.textContent=` (${s})`,l.appendChild(e)}t.appendChild(ln("withTooltip",'"Chain" cookies required (Wrath)',l,e));const d=Game.cookies+Io()<tt?lo:io,m=Game.cookies+Io()<tt?Uo((tt-(Game.cookies+Io()))/Ro()):"",p=document.createDocumentFragment(),u=document.createElement("span");if(u.style.fontWeight="bold",u.className=oo+d,u.textContent=to(tt),p.appendChild(u),""!==m){const e=document.createElement("small");e.textContent=` (${m})`,p.appendChild(e)}t.appendChild(ln("withTooltip",'"Chain" cookies required (Frenzy)',p,e));const h=Game.cookies+Io()<nt?lo:io,g=Game.cookies+Io()<nt?Uo((nt-(Game.cookies+Io()))/Ro()):"",f=document.createDocumentFragment(),k=document.createElement("span");if(k.style.fontWeight="bold",k.className=oo+h,k.textContent=to(nt),f.appendChild(k),""!==g){const e=document.createElement("small");e.textContent=` (${g})`,f.appendChild(e)}t.appendChild(ln("withTooltip",'"Chain" cookies required (frenzy) (Wrath)',f,e)),t.appendChild(ln("withTooltip",'"Chain" reward (max) (golden / wrath)',document.createTextNode(`${to(Ke[0])} / ${to(et[0])}`),e)),t.appendChild(ln("withTooltip",'"Chain" reward (max) (frenzy) (golden / wrath)',document.createTextNode(`${to(at[0])} / ${to(at[0])}`),e));const C=Math.min(60*Game.cookiesPs*60*6*Fe,.5*Game.cookies),M=Na(7,C,Ee)[0],y=Na(6,C,Be)[0];return t.appendChild(ln("withTooltip",'"Chain" reward (cur) (golden / wrath)',document.createTextNode(`${to(M)} / ${to(y)}`),e)),t.appendChild(ln("withTooltip","CPS needed for next level (g / w)",document.createTextNode(`${to(Ye)} / ${to(Ze)}`),"ChainNextLevelPlaceholder")),t.appendChild(ln("withTooltip","CPS needed for next level (frenzy) (g / w)",document.createTextNode(`${to(ot)} / ${to(it)}`),"ChainNextLevelPlaceholder")),t}()),Game.Objects["Wizard tower"].minigameLoaded&&(t.appendChild(sn("Spells","Spells")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Spells&&t.appendChild(function(){const e=document.createElement("div");e.className="CMStatsSpellsSection";const t=Game.cookies+Io()<ve?lo:io,o=Game.cookies+Io()<ve?Uo((ve-(Game.cookies+Io()))/Ro()):"",a=document.createDocumentFragment(),n=document.createElement("span");if(n.style.fontWeight="bold",n.className=oo+t,n.textContent=to(ve),a.appendChild(n),""!==o){const e=document.createElement("small");e.textContent=` (${o})`,a.appendChild(e)}e.appendChild(ln("withTooltip",'"Conjure Baked Goods" cookies required',a,"GoldCookTooltipPlaceholder")),e.appendChild(ln("withTooltip",'"Conjure Baked Goods" reward (max)',document.createTextNode(to(we)),"GoldCookTooltipPlaceholder"));const i=Game.cookies+Io()<7*ve?lo:io,r=Math.min(.15*(Game.cookies+Io()),60*Se*30),s=Game.cookies+Io()<7*ve?Uo((7*ve-(Game.cookies+Io()))/Ro()):"",l=document.createDocumentFragment(),c=document.createElement("span");if(c.style.fontWeight="bold",c.className=oo+i,c.textContent=to(7*ve),l.appendChild(c),""!==s){const e=document.createElement("small");e.textContent=` (${s})`,l.appendChild(e)}return e.appendChild(ln("withTooltip",'"Conjure Baked Goods" cookies required (frenzy)',l,"GoldCookTooltipPlaceholder")),e.appendChild(ln("withTooltip",'"Conjure Baked Goods" reward (max) (frenzy)',document.createTextNode(to(7*we)),"GoldCookTooltipPlaceholder")),e.appendChild(ln("withTooltip",'"Conjure Baked Goods" reward (cur)',document.createTextNode(to(r)),"GoldCookTooltipPlaceholder")),xe&&e.appendChild(ln("withTooltip",'"Spontaneous Edifice" cookies required (most expensive building)',document.createTextNode(`${to(xe)} (${Te})`),"GoldCookTooltipPlaceholder")),e}())),Game.Objects.Farm.minigameLoaded&&(t.appendChild(sn("Garden","Garden")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Garden&&t.appendChild(function(){const e=document.createElement("div");e.className="CMStatsGardenSection";const t=Game.cookies<60*Game.cookiesPs*10*100?lo:io,o=document.createElement("span");o.style.fontWeight="bold",o.className=oo+t,o.textContent=to(60*Game.cookiesPs*10*100),e.appendChild(ln("basic","Cookies required for max reward of Bakeberry: ",o));const a=Game.cookies<60*Game.cookiesPs*100?lo:io,n=document.createElement("span");n.style.fontWeight="bold",n.className=oo+a,n.textContent=to(60*Game.cookiesPs*100),e.appendChild(ln("basic","Cookies required for max reward of Chocoroot: ",n));const i=Game.cookies<60*Game.cookiesPs*60*25?lo:io,r=document.createElement("span");r.style.fontWeight="bold",r.className=oo+i,r.textContent=to(60*Game.cookiesPs*60*25),e.appendChild(ln("basic","Cookies required for max reward of Queenbeet: ",r));const s=Game.cookies<60*Game.cookiesPs*15*100?lo:io,l=document.createElement("span");l.style.fontWeight="bold",l.className=oo+s,l.textContent=to(60*Game.cookiesPs*15*100),e.appendChild(ln("basic","Cookies required for max reward of Duketater: ",l));const c=[];return Object.keys(pa).forEach((e=>{Game.HasUnlocked(pa[e])||c.push(pa[e])})),0!==c.length&&e.appendChild(ln("basic","Rare plant drops left to unlock",dn(c))),e}())),t.appendChild(sn("Prestige","Prestige")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Prestige&&t.appendChild(function(){const e=document.createElement("div");e.className="CMStatsPrestigeSection";const t=Math.floor(Game.HowMuchPrestige(st+Game.cookiesReset+$e+(Game.HasUnlocked("Chocolate egg")&&!Game.Has("Chocolate egg")?De:0)));e.appendChild(ln("withTooltip","Prestige level (cur / max)",document.createTextNode(`${to(Game.prestige)} / ${to(t)}`),"PrestMaxTooltipPlaceholder"));const o=Math.max(0,Game.HowManyCookiesReset(t+1)-(st+Game.cookiesReset+$e+(Game.HasUnlocked("Chocolate egg")&&!Game.Has("Chocolate egg")&&De?De:0))),a=document.createDocumentFragment();a.appendChild(document.createTextNode(to(o)));const n=document.createElement("small");n.textContent=` (${Uo(o/lt,1)})`,a.appendChild(n),e.appendChild(ln("withTooltip","Cookies to next level",a,"NextPrestTooltipPlaceholder")),e.appendChild(ln("withTooltip","Heavenly chips (cur / max)",document.createTextNode(`${to(Game.heavenlyChips)} / ${to(t-Game.prestige+Game.heavenlyChips)}`),"HeavenChipMaxTooltipPlaceholder")),e.appendChild(ln("basic","Heavenly chips per second (last 5 seconds)",document.createTextNode(to(Pe,2))));const i=Number(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.HeavenlyChipsTarget);if(!Number.isNaN(i)){const t=i-Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned));t>0&&(e.appendChild(ln("basic","Heavenly chips to target set in settings (cur)",document.createTextNode(to(t)))),e.appendChild(ln("basic","Time till target (cur, current 5 second average)",document.createTextNode(Uo(t/Pe)))))}const r=function(e){let t=Game.cookiesPs;ta(),0===Mt["Heavenly key"].bought&&(Mt["Heavenly chip secret"].bought=1,Mt["Heavenly cookie stand"].bought=1,Mt["Heavenly bakery"].bought=1,Mt["Heavenly confectionery"].bought=1,Mt["Heavenly key"].bought=1,sa(),t=me,ta()),st>=1e6&&ra("Sacrifice"),st>=1e9&&ra("Oblivion"),st>=1e12&&ra("From scratch"),st>=1e15&&ra("Nihilism"),st>=1e18&&ra("Dematerialize"),st>=1e21&&ra("Nil zero zilch"),st>=1e24&&ra("Transcendence"),st>=1e27&&ra("Obliterate"),st>=1e30&&ra("Negative void"),st>=1e33&&ra("To crumbs, you say?"),st>=1e36&&ra("You get nothing"),st>=1e39&&ra("Humble rebeginnings"),st>=1e42&&ra("The end of the world"),st>=1e45&&ra("Oh, you're back"),st>=1e48&&ra("Lazarus"),st>=1e51&&ra("Smurf account"),st>=1e54&&ra("If at first you don't succeed"),Mt["Heavenly chip secret"].bought=1,Mt["Heavenly cookie stand"].bought=1,Mt["Heavenly bakery"].bought=1,Mt["Heavenly confectionery"].bought=1,Mt["Heavenly key"].bought=1,ae=e;const o=te;sa(),ha(),o!==te&&sa();const a=me-t;return ae=Game.prestige,a}(t),s=document.createDocumentFragment();s.appendChild(document.createTextNode(to(r)));const l=Math.round(r/Game.cookiesPs*1e4);if(Number.isFinite(l)&&0!==l){const e=document.createElement("small");e.textContent=` (${l/100}% of income)`,s.appendChild(e)}e.appendChild(ln("withTooltip","Reset bonus income",s,"ResetTooltipPlaceholder"));const c=Math.floor(Game.HowMuchPrestige(Game.cookiesReset)),d=Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned)),m=d-c,{luckyDigit:p,luckyNumber:u,luckyPayout:h}=function(e){const t={};let o=nn(e);const a=String(e).length;if(o>=1&&(t.luckyDigit=e,o>=2&&(t.luckyNumber=e,o>=4)))return t.luckyPayout=e,t;let n;if(n=a>=16?Math.ceil(e/10**(a-15)):e,o=nn(n),void 0===t.luckyDigit&&(o<1&&(n+=rn(n,1),o=nn(n)),t.luckyDigit=n,a>=16&&(t.luckyDigit*=10**Number(a-15))),void 0===t.luckyNumber){for(;o<2;){let e=rn(n,1);0===e&&(e=rn(n,10)),n+=e,o=nn(n)}t.luckyNumber=n,a>=16&&(t.luckyNumber*=10**Number(a-15))}let i=1;for(;o<4;){const e=rn(n,i);0===e?i*=10:(n+=e,o=nn(n))}return t.luckyPayout=n,a>=16&&(t.luckyPayout*=10**Number(a-15)),t}(d);if(!Game.Has("Lucky digit")){const t=p-d,o=m+t,a=document.createDocumentFragment();a.appendChild(document.createTextNode(`${p.toLocaleString()} / ${o.toLocaleString()} (+${t})`)),e.appendChild(ln("basic",'Next "Lucky Digit" (total / reset)',a))}if(!Game.Has("Lucky number")){const t=u-d,o=m+t,a=document.createDocumentFragment();a.appendChild(document.createTextNode(`${u.toLocaleString()} / ${o.toLocaleString()} (+${t})`)),e.appendChild(ln("basic",'Next "Lucky Number" (total / reset)',a))}if(!Game.Has("Lucky payout")){const t=h-d,o=m+t,a=document.createDocumentFragment();a.appendChild(document.createTextNode(`${h.toLocaleString()} / ${o.toLocaleString()} (+${t})`)),e.appendChild(ln("basic",'Next "Lucky Payout" (total / reset)',a))}return e}()),Game.cpsSucked>0&&(t.appendChild(sn("Wrinklers","Wrink")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Wrink)){const e=document.createDocumentFragment();e.appendChild(document.createTextNode(`${to($e)} / ${to(Ue)} `));const o=document.createElement("a");o.textContent="Pop All Normal",o.className="option",o.onclick=function(){Ra()},e.appendChild(o),t.appendChild(ln("basic","Rewards of Popping (All/Normal)",e));const a=document.createDocumentFragment();a.appendChild(document.createTextNode(`${to(He[0])} `));const n=document.createElement("a");n.textContent="Pop Single Fattest",n.className="option",n.onclick=function(){null!==He[1]&&(Game.wrinklers[He[1]].hp=0)},a.appendChild(n),t.appendChild(ln("basic",`Rewards of Popping Single Fattest Non-Shiny Wrinkler (id: ${null!==He[1]?He[1]:"None"})`,a))}if(t.appendChild(function(){const e=document.createElement("div");e.className="CMStatsSeasonSection";let t=!1;const o=[];Object.keys(ca).forEach((e=>{Game.Has(ca[e])||(o.push(ca[e]),t=!0)}));const a=[];Object.keys(da).forEach((e=>{Game.Has(da[e])||(a.push(da[e]),t=!0)}));const n=[];Object.keys(ma).forEach((e=>{Game.Has(ma[e])||(n.push(ma[e]),t=!0)}));const i=[];Object.keys(Game.eggDrops).forEach((e=>{Game.HasUnlocked(Game.eggDrops[e])||(i.push(Game.eggDrops[e]),t=!0)}));const r=[];Object.keys(Game.rareEggDrops).forEach((e=>{Game.HasUnlocked(Game.rareEggDrops[e])||(r.push(Game.rareEggDrops[e]),t=!0)}));const s=Game.HasUnlocked("Chocolate egg")&&!Game.Has("Chocolate egg"),l=Game.Has("Century egg");if(("christmas"===Game.season||t||s||l)&&(e.appendChild(sn("Season Specials","Sea")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Sea)){if(0!==o.length){e.appendChild(cn(0,"Halloween cookies left to buy",dn(o),"halloween"===Game.season));let t=.95;if(Game.HasAchiev("Spooky cookies")&&(t=.8),Game.Has("Starterror")&&(t*=.9),t*=1/Game.dropRateMult(),Game.hasGod){const e=Game.hasGod("seasons");1===e?t*=.9:2===e?t*=.95:3===e&&(t*=.97)}const a=o.length/7;e.appendChild(cn(0,"Chance of receiving a cookie from wrinkler/shiny wrinkler",document.createTextNode(`${to((1-t)*a*100)}% / ${to((1-.9*t)*a*100)}%`),"halloween"===Game.season))}if(0!==a.length){e.appendChild(cn(0,"Christmas cookies left to buy",dn(a),"christmas"===Game.season));let t=.8;if(Game.HasAchiev("Let it snow")&&(t=.6),t*=1/Game.dropRateMult(),Game.Has("Starsnow")&&(t*=.95),Game.hasGod){const e=Game.hasGod("seasons");1===e?t*=.9:2===e?t*=.95:3===e&&(t*=.97)}const o=a.length/7;e.appendChild(cn(0,"Chance of receiving a cookie from reindeer",document.createTextNode(`${to((1-t)*o*100)}%`),"christmas"===Game.season))}0!==n.length&&e.appendChild(cn(0,"Valentine cookies left to buy",dn(n),"valentines"===Game.season));const t=function(e){let t=e*(1/Game.dropRateMult());if(Game.HasAchiev("Hide & seek champion")&&(t*=.7),Game.Has("Omelette")&&(t*=.9),Game.Has("Starspawn")&&(t*=.9),Game.hasGod){const e=Game.hasGod("seasons");1===e?t*=.9:2===e?t*=.95:3===e&&(t*=.97)}const o=1-t,a=Game.eggDrops.length-i.length,n=Game.rareEggDrops.length-r.length,s=.9*o*(1-a/Game.eggDrops.length),l=.1*o*(1-n/Game.rareEggDrops.length),c=.9*o*(a/Game.eggDrops.length)+.1*o*(n/Game.rareEggDrops.length);return[s+.9*c*(1-a/Game.eggDrops.length),l+.1*c*(1-n/Game.rareEggDrops.length)]};0!==i.length&&(e.appendChild(cn(0,"Normal easter eggs left to unlock",dn(i),"easter"===Game.season)),e.appendChild(cn(0,"Chance of receiving an egg from wrinkler/golden cookie",document.createTextNode(`${to(100*t(.98)[0])}% / ${to(100*t(.9)[0])}%`),"easter"===Game.season))),0!==r.length&&(e.appendChild(cn(0,"Rare easter eggs left to unlock",dn(r),"easter"===Game.season)),e.appendChild(cn(0,"Chance of receiving a rare egg from wrinkler/golden cookie",document.createTextNode(`${to(100*t(.98)[1])}% / ${to(100*t(.9)[1])}%`),"easter"===Game.season))),"christmas"===Game.season&&e.appendChild(cn(0,"Reindeer reward",document.createTextNode(to(Oe)),!0)),s&&e.appendChild(ln("withTooltip","Chocolate egg cookies",document.createTextNode(to(De)),"ChoEggTooltipPlaceholder")),l&&e.appendChild(ln("basic","Century egg multiplier",document.createTextNode(Math.round(1e4*(Ne-1))/100+"%")))}return e}()),t.appendChild(sn("Achievements","Achievs")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Achievs&&Object.keys(Game.Objects).forEach((e=>{const o=je[e];t.appendChild(ln("basic",e,o.AmountNeeded<101?document.createTextNode(`Next achievement in ${o.AmountNeeded}, price: ${to(o.price)}`):document.createTextNode("No new achievement for next 100 buildings")))})),t.appendChild(sn("Miscellaneous","Misc")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Misc){if(t.appendChild(ln("basic",`Average cookies per second (past ${xo[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist]<60?`${xo[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist]} seconds`:xo[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist]/60+(3===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist?" minute":" minutes")})`,document.createTextNode(to(Ro(),3)))),t.appendChild(ln("basic",`Average cookie clicks per second (past ${To[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist]}${0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist?" second":" seconds"})`,document.createTextNode(to(Ve,1)))),t.appendChild(ln("basic",`Cookies from clicking (past ${To[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist]}${0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist?" second":" seconds"})`,document.createTextNode(to(P.calcSum(Ve*To[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist]))))),Game.Has("Fortune cookies")){const e=[];Object.keys(la).forEach((t=>{Game.Has(la[t])||e.push(la[t])})),0!==e.length&&t.appendChild(ln("basic","Fortune Upgrades Left to Buy",dn(e)))}if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ShowMissedGC&&t.appendChild(ln("basic","Missed golden cookies",document.createTextNode(to(Game.missedGoldenClicks)))),Game.prefs.autosave){const e=document.createElement("span");e.id="CMStatsAutosaveTimer",e.innerText=Game.sayTime(60*Game.fps-(Game.OnAscend?0:Game.T%(60*Game.fps)),4),t.appendChild(ln("basic","Time till autosave",e))}}l("menu").insertBefore(t,l("menu").childNodes[2]),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingUpgrades&&l("menu").childNodes.forEach((e=>{if(e.children[0])if("Prestige"===e.children[0].innerHTML&&Xe){const t=Xe.match(new RegExp("div","g")||0).length/2,o=document.createElement("div");o.id="CMMissingUpgradesPrestigeTitle",o.className="listing";const a=document.createElement("div");a.innerHTML=`<b>Missing Prestige upgrades:</b> ${t}/${Game.PrestigeUpgrades.length} (${Math.floor(t/Game.PrestigeUpgrades.length*100)}%)`,o.appendChild(a),e.appendChild(o);const n=document.createElement("div");n.className="listing crateBox",n.innerHTML=Xe,e.appendChild(n)}else if("Upgrades"===e.children[0].innerHTML){if(_e){const t=_e.match(new RegExp("div","g")||0).length/2,o=document.createElement("div");o.id="CMMissingUpgradesTitle",o.className="listing";const a=document.createElement("div");a.innerHTML=`<b>Missing normal upgrades:</b> ${t}/${Game.UpgradesByPool[""].length+Game.UpgradesByPool.tech.length} (${Math.floor(t/(Game.UpgradesByPool[""].length+Game.UpgradesByPool.tech.length)*100)}%)`,o.appendChild(a),e.insertBefore(o,e.childNodes[3]);const n=document.createElement("div");n.className="listing crateBox",n.innerHTML=_e,e.insertBefore(n,document.getElementById("CMMissingUpgradesTitle").nextSibling)}if(Qe){const t=Qe.match(new RegExp("div","g")||0).length/2,o=document.createElement("div");o.id="CMMissingUpgradesCookiesTitle",o.className="listing";const a=document.createElement("div");a.innerHTML=`<b>Missing Cookie upgrades:</b> ${t}/${Game.UpgradesByPool.cookie.length} (${Math.floor(t/Game.UpgradesByPool.cookie.length*100)}%)`,o.appendChild(a),e.appendChild(o);const n=document.createElement("div");n.className="listing crateBox",n.innerHTML=Qe,e.appendChild(n)}}})),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingAchievements&&function(){let e;Object.values(document.querySelectorAll("div.title")).forEach((t=>{t.textContent.includes("Achievements")&&(e=t.parentElement.querySelectorAll("div.listing.crateBox")[0])})),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingAchievements&&Object.values(e.children).forEach((e=>{if(!e.className.includes("enabled")){const t=e.onclick.toString().split(/\[(.*)\]/gi)[1],{icon:o}=Game.AchievementsById[t];e.style.backgroundPosition=`${48*-o[0]}px ${48*-o[1]}px`,e.onmouseover=function(){Game.mouseDown||(Game.setOnCrate(this),Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>function(e){const t=[];"shadow"===e.pool?t.push("Shadow Achievement","#9700cf"):t.push("Achievement",0),t.push("Locked",0);let o=0;(Game.Has("Neuromancy")||Game.sesame&&"debug"===e.pool)&&(o=1),o&&0===e.won?t.push("Click to win!","#00c462"):o&&e.won>0&&t.push("Click to lose!","#00c462");let{icon:a}=e;e.iconFunction&&(a=e.iconFunction());let{desc:n}=e;e.descFunc&&(n=e.descFunc("stats"));let i="";for(let e=0;e<t.length;e+=2)e%2==0&&(i+=` <div class="tag" style="color:${0===t[e+1]?"#fff":t[e+1]};">[${t[e]}]</div>`);return i=i.substring(1),`<div style="padding:8px 4px;min-width:350px;opacity:0.5">\n <div class="icon" style="float:left;margin-left:-8px;margin-top:-8px;background-position:${48*-a[0]}px ${48*-a[1]}px;"></div>\n <div class="name">${e.name}</div>\n ${i}<div class="line"></div><div class="description">${n}</div></div>\n ${Game.sesame?`<div style="font-size:9px;">Id : ${e.id} | Order : ${Math.floor(e.order)}${e.tier?` | Tier : ${e.tier}`:""}</div>`:""}`}(Game.AchievementsById[t])),"top"),Game.tooltip.wobble())}}}))}()}function pn(e){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos){const t=parseInt(l("CMTimerBar").style.height,10);Game.mouseY-=t,e(),Game.mouseY+=t}else e()}function un(){Jt.Beautify=Beautify,Beautify=to,Jt.CalculateGains=Game.CalculateGains,Game.CalculateGains=function(){Jt.CalculateGains(),ce=1,Zt=Date.now(),eo=Date.now()},Jt.tooltip={},Jt.tooltip.draw=Game.tooltip.draw,Jt.tooltip.drawMod=new Function(`return ${Game.tooltip.draw.toString().split("this").join("Game.tooltip")}`)(),Game.tooltip.draw=function(e,t,o){Jt.tooltip.drawMod(e,t,o)},Jt.tooltip.update=Game.tooltip.update,Jt.tooltip.updateMod=new Function(`return ${Game.tooltip.update.toString().split("this.").join("Game.tooltip.")}`)(),Game.tooltip.update=function(){Jt.tooltip.updateMod(),function(){if("store"===Game.tooltip.origin){let e=0;1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLucky&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos&&null!==l("CMDispTooltipWarningParent")&&(e=l("CMDispTooltipWarningParent").clientHeight-4),Game.tooltip.tta.style.top=`${Math.min(parseInt(Game.tooltip.tta.style.top,10),l("game").clientHeight+l("topBar").clientHeight-Game.tooltip.tt.clientHeight-e-46)}px`}}()},Jt.UpdateWrinklers=Game.UpdateWrinklers,Game.UpdateWrinklers=function(){pn(Jt.UpdateWrinklers)},Jt.UpdateSpecial=Game.UpdateSpecial,Game.UpdateSpecial=function(){pn(Jt.UpdateSpecial)},l("bigCookie").removeEventListener("click",Game.ClickCookie,!1),l("bigCookie").addEventListener("click",(e=>{pn((()=>Game.ClickCookie(e,0)))}),!1),Jt.RebuildUpgrades=Game.RebuildUpgrades,Game.RebuildUpgrades=function(){Jt.RebuildUpgrades(),Kt=[],Object.keys(Game.UpgradesInStore).forEach((e=>{null!==l(`upgrade${e}`).onmouseover&&(Kt[e]=l(`upgrade${e}`).onmouseover,l(`upgrade${e}`).onmouseover=function(){Game.mouseDown||(Game.setOnCrate(this),Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("u",`${e}`)),"store"),Game.tooltip.wobble())})})),Game.CalculateGains()},Jt.ClickProduct=Game.ClickProduct,Game.ClickProduct=function(e){(!Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BulkBuyBlock||Game.ObjectsById[e].bulkPrice<=Game.cookies||-1===Game.buyMode)&&Jt.ClickProduct(e)},Jt.DescribeDragonAura=Game.DescribeDragonAura,Game.DescribeDragonAura=function(e){Jt.DescribeDragonAura(e),function(e){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.DragonAuraInfo){const[t,o]=function(e){ta(),l("promptContent").children[0].innerHTML.includes("secondary")?ie=e:ne=e;let t=0;if(ne!==ue||ie!==he)for(let e=Game.ObjectsById.length-1;e>-1;--e)if(Game.ObjectsById[e].amount>0){const o=Ct[Game.ObjectsById[e].name].name;Ct[o].amount-=1,J-=1,t=Ct[o].basePrice*Game.priceIncrease**Math.max(0,Ct[o].amount-1-Ct[o].free),t=Game.modifyBuildingPrice(Ct[o],t),t=Math.ceil(t);break}const o=te;return sa(),ha(),o!==te&&sa(),[me-Game.cookiesPs,t]}(e),a=Uo(o/(t+Game.cookiesPs));let n;n=0===Game.cookiesPs?to(1/0):to(t/Game.cookiesPs*100),l("dragonAuraInfo").style.minHeight="60px",l("dragonAuraInfo").style.margin="8px",l("dragonAuraInfo").appendChild(document.createElement("div")).className="line";const i=document.createElement("div");i.style.minWidth="200px",i.style.textAlign="center",i.textContent=`Picking this aura will change CPS by ${to(t)} (${n}% of current CPS).`,l("dragonAuraInfo").appendChild(i);const r=document.createElement("div");r.style.minWidth="200px",r.style.textAlign="center",r.textContent=`It will take ${a} to recover the cost.`,l("dragonAuraInfo").appendChild(r)}}(e)},Jt.ToggleSpecialMenu=Game.ToggleSpecialMenu,Game.ToggleSpecialMenu=function(e){Jt.ToggleSpecialMenu(e),function(){if(null!==(l("specialPopup").className.match(/onScreen/)&&l("specialPopup").children[0].style.background.match(/dragon/)))for(let e=0;e<l("specialPopup").childNodes.length;e++)"optionBox"===l("specialPopup").childNodes[e].className&&(l("specialPopup").children[e].onmouseover=function(){qa(),Game.tooltip.dynamic=1,Game.tooltip.draw(l("specialPopup"),`<div style="min-width:200px;text-align:center;">${fe}</div>`,"this"),Game.tooltip.wobble()},l("specialPopup").children[e].onmouseout=function(){Game.tooltip.shouldHide=1})}()},Jt.UpdateMenu=Game.UpdateMenu,Game.UpdateMenu=function(){void 0!==s().picker&&void 0!==s().picker.owner||(Jt.UpdateMenu(),function(){const e=document.createElement("div");e.className="title","stats"===Game.onMenu?Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Stats&&(e.textContent="Cookie Monster Statistics",mn(e)):"prefs"===Game.onMenu&&l("menu").childNodes[2].insertBefore(an(),l("menu").childNodes[2].childNodes[l("menu").childNodes[2].childNodes.length-1])}())},Jt.sayTime=Game.sayTime,bo=function(e,t){return Number.isNaN(e)||e<=0?Jt.sayTime(e,t):Uo(e/Game.fps,1)},Jt.Logic=Game.Logic,Game.Logic=function(){Jt.Logic();let e="Cookie Clicker";"fools"===Game.season&&(e="Cookie Baker"),Ao=`${Game.OnAscend?"Ascending! ":""}${to(Game.cookies)} ${1===Game.cookies?"cookie":"cookies"} - ${e}`,function(){if(Game.OnAscend||0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title)document.title=Ao;else if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title){let e,t,o,a=!1,n=!1;e=ct?ct.wrath?`[W${Math.ceil(ct.life/Game.fps)}]`:`[G${Math.ceil(ct.life/Game.fps)}]`:Game.Has("Golden switch [off]")?"[GS]":`[${Number(l("CMTimerBarGCMinBar").textContent)<0?"!":""}${Math.ceil((Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.time)/Game.fps)}]`,Ht&&(a=!0,t="[F]"),"christmas"===Game.season&&(n=!0,o=Ut?`[R${Math.ceil(dt.life/Game.fps)}]`:`[${Number(l("CMTimerBarRenMinBar").textContent)<0?"!":""}${Math.ceil((Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.time)/Game.fps)}]`);let i=Ao;"["===i.charAt(0)&&(i=i.substring(i.lastIndexOf("]")+1)),document.title=`${e+(a?t:"")+(n?o:"")} ${i}`}else if(2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title){let e="",t=!1;ct&&(t=!0,ct.wrath?e+=`[W${Math.ceil(ct.life/Game.fps)}]`:e+=`[G${Math.ceil(ct.life/Game.fps)}]`),Ht&&(t=!0,e+="[F]"),"christmas"===Game.season&&Ut&&(e+=`[R${Math.ceil(dt.life/Game.fps)}]`,t=!0),t&&(e+=" - ");let o="Cookie Clicker";"fools"===Game.season&&(o="Cookie Baker"),e+=o,document.title=e}}(),function(){const e=Math.max(0,Game.HowManyCookiesReset(Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned))+1)-(Game.cookiesEarned+Game.cookiesReset)),t=Game.sayTime((Date.now()-Game.startDate)/1e3*Game.fps,-1);let o=`You've been on this run for <b>${""===t?"not very long":t}</b>.<br>\n <div class="line"></div>`;Game.prestige>0&&(o+=`Your prestige level is currently <b>${to(Game.prestige)}</b>.<br>(CpS +${to(Game.prestige)}%)\n <div class="line"></div>`),o+=q<1?"Ascending now would grant you no prestige.":q<2?"Ascending now would grant you<br><b>1 prestige level</b> (+1% CpS)<br>and <b>1 heavenly chip</b> to spend.":`Ascending now would grant you<br><b>${to(q)} prestige levels</b> (+${to(q)}% CpS)<br>and <b>${to(q)} heavenly chips</b> to spend.`,o+=`<div class="line"></div>\n You need <b>${to(e)} more cookies</b> for the next level.<br>\n ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipAscendButton?`<div class='line'></div>It takes ${mt} to reach the next level and you were making ${to(Pe,2)} chips on average in the last 5 seconds.<br>`:""}`,l("ascendTooltip").innerHTML=o}()}}function hn(){window.CookieMonsterData={},Game.mods.cookieMonsterFramework.listeners.optionsMenu.push(an),Va(),Wa(),Ha(),Nt=Object.keys(Game.mods).length,Qt=document.createElement("style"),Qt.type="text/css",Qt.id="CMCSS",document.head.appendChild(Qt),function(){const e=document.createElement("div");e.id="CMBotBar",e.style.height="69px",e.style.width="100%",e.style.position="absolute",e.style.display="none",e.style.backgroundColor="#262224",e.style.backgroundImage="linear-gradient(to bottom, #4d4548, #000000)",e.style.borderTop="1px solid black",e.style.overflow="auto",e.style.textShadow="-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black";const t=e.appendChild(document.createElement("table"));t.style.width="100%",t.style.textAlign="center",t.style.whiteSpace="nowrap";const o=t.appendChild(document.createElement("tbody")),a=function(e,t){const o=document.createElement("td");return o.style.textAlign="right",o.className=oo+t,o.textContent=e,o},n=o.appendChild(document.createElement("tr"));n.style.fontWeight="bold",n.appendChild(a("CM 2.052.10",ro)),o.appendChild(document.createElement("tr")).appendChild(a("Bonus Income",no)),o.appendChild(document.createElement("tr")).appendChild(a("Payback Period",no)),o.appendChild(document.createElement("tr")).appendChild(a("Time Left",no)),l("wrapper").appendChild(e),Object.keys(Game.Objects).forEach((e=>{Vo(e)}))}(),function(){const e=document.createElement("div");e.id="CMTimerBar",e.style.position="absolute",e.style.display="none",e.style.height="0px",e.style.fontSize="10px",e.style.fontWeight="bold",e.style.backgroundColor="black";const t=zo("CMTimerBarAutosave","Autosave",[{id:"CMTimerBarAutosaveBar",colour:co}]);e.appendChild(t);const o=zo("CMTimerBarGC","Next Cookie",[{id:"CMTimerBarGCMinBar",colour:mo},{id:"CMTimerBarGCBar",colour:co}]);e.appendChild(o);const a=zo("CMTimerBarRen","Next Reindeer",[{id:"CMTimerBarRenMinBar",colour:mo},{id:"CMTimerBarRenBar",colour:so}]);e.appendChild(a);const n=document.createElement("div");n.id="CMTimerBarBuffTimers",e.appendChild(n),l("wrapper").appendChild(e)}(),function(){const e=document.createElement("div");e.id="CMUpgradeBar",e.style.width="100%",e.style.backgroundColor="black",e.style.textAlign="center",e.style.fontWeight="bold",e.style.display="none",e.style.zIndex="21",e.onmouseout=function(){Game.tooltip.hide()};const t=document.createElement("div");t.appendChild(function(){const e=document.createElement("div");e.style.minWidth="330px",e.style.marginBottom="4px";const t=document.createElement("div");t.className="name",t.style.marginBottom="4px",t.textContent="Legend",e.appendChild(t);const o=function(e,t){const o=document.createElement("div");o.style.verticalAlign="middle";const a=document.createElement("span");return a.className=ao+e,a.style.display="inline-block",a.style.height="10px",a.style.width="10px",a.style.marginRight="4px",o.appendChild(a),o.appendChild(document.createTextNode(t)),o};return e.appendChild(o(no,"Better than the best PP of a building option")),e.appendChild(o(io,"Same as the best PP building option")),e.appendChild(o(ro,"Within the top 10 of PP for buildings")),e.appendChild(o(so,"Within the top 20 of PP for buildings")),e.appendChild(o(lo,"Within the top 30 of PP for buildings")),e.appendChild(o(co,"Outside of the top 30 of PP for buildings")),e.appendChild(o(mo,"Negative or infinity PP")),e}()),e.onmouseover=function(){Game.tooltip.draw(this,escape(t.innerHTML),"store")};const o=function(e,t){const o=document.createElement("span");return o.id=e,o.className=oo+t,o.style.width="14.28571428571429%",o.style.display="inline-block",o.textContent="0",o};e.appendChild(o("CMUpgradeBarBlue",no)),e.appendChild(o("CMUpgradeBarGreen",io)),e.appendChild(o("CMUpgradeBarYellow",ro)),e.appendChild(o("CMUpgradeBarOrange",so)),e.appendChild(o("CMUpgradeBarRed",lo)),e.appendChild(o("CMUpgradeBarPurple",co)),e.appendChild(o("CMUpgradeBarGray",mo)),l("upgrades").parentNode.insertBefore(e,l("upgrades").parentNode.childNodes[3])}(),function(){const e=document.createElement("div");e.id="CMSectionHidButtons",e.style.textAlign="center";const t=document.createElement("a");t.className="option",t.onclick=function(){"flex"===l("upgrades").style.display?(l("upgrades").style.display="none",l("toggleUpgrades").style.display="none",l("techUpgrades").style.display="none",l("vaultUpgrades").style.display="none"):(l("upgrades").style.display="flex",0!==l("toggleUpgrades").children.length&&(l("toggleUpgrades").style.display="block"),0!==l("techUpgrades").children.length&&(l("techUpgrades").style.display="block"),0!==l("vaultUpgrades").children.length&&(l("vaultUpgrades").style.display="block"))},t.textContent="Hide/Show Upgrades",e.appendChild(t);const o=document.createElement("a");o.className="option",o.onclick=function(){"grid"===l("products").style.display?l("products").style.display="none":l("products").style.display="grid"},o.textContent="Hide/Show Buildings",e.appendChild(o),l("store").insertBefore(e,l("store").childNodes[2])}(),function(){const e=document.createElement("link");e.id="CMFavicon",e.rel="shortcut icon",e.href="https://orteil.dashnet.org/cookieclicker/favicon.ico",document.getElementsByTagName("head")[0].appendChild(e)}(),Object.keys(go).forEach((e=>{!function(e,t,o){const a=document.createElement("div");a.id=e;const n=document.createElement("div");n.style.minWidth=o,n.style.marginBottom="4px";const i=document.createElement("div");i.style.textAlign="left",i.textContent=t,n.appendChild(i),a.appendChild(n),fo[e]=a}(go[e][0],go[e][1],go[e][2])})),function(){const e=document.createElement("a");e.id="PopAllNormalWrinklerButton",e.textContent="Pop All Normal",e.className="option",e.onclick=function(){Ra()},e.onmouseout=function(){Game.tooltip.shouldHide=1},e.onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("wb","PopAllNormal")),"this"),Game.tooltip.wobble()},l("sectionLeftExtra").children[0].append(e);const t=document.createElement("a");t.id="PopFattestWrinklerButton",t.textContent="Pop Single Fattest",t.className="option",t.onclick=function(){null!==He[1]&&(Game.wrinklers[He[1]].hp=0)},t.onmouseout=function(){Game.tooltip.shouldHide=1},t.onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("wb","PopFattest")),"this"),Game.tooltip.wobble()},l("sectionLeftExtra").children[0].append(t)}(),l("products").style.display="grid",l("storeBulk").style.gridRow="1/1",l("upgrades").style.display="flex",l("upgrades").style["flex-wrap"]="wrap",Object.keys(l("rows").children).forEach((e=>{const t=l("rows").children[e].children[1],o=document.createElement("div");o.id=`productLock${Number(e)+1}`,o.className="productButton",o.innerHTML="Lock",o.onclick=function(){!function(e){"Lock"===l(`productLock${e}`).innerHTML?(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.push(e.toString()),l(`row${e}`).style.pointerEvents="none",l(`row${e}`).style.opacity="0.4",l(`productLock${e}`).innerHTML="Unlock",l(`productLock${e}`).style.pointerEvents="auto"):(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.includes(e.toString())&&(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.filter((t=>t!==e.toString()))),l(`productLock${e}`).innerHTML="Lock",l(`row${e}`).style.pointerEvents="auto",l(`row${e}`).style.opacity="1")}(Number(e)+1)},t.appendChild(o)})),Object.keys(Game.Objects).forEach((e=>{const t=Game.Objects[e];null!==l(`product${t.id}`).onmouseover&&(qt[e]=l(`product${t.id}`).onmouseover,l(`product${t.id}`).onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("b",`${e}`)),"store"),Game.tooltip.wobble()})})),Game.canLumps()&&(Ot=l("lumps").onmouseover,l("lumps").onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("s","Lump")),"this"),Game.tooltip.wobble()}),$t=Game.LoadMinigames,Game.LoadMinigames=function(){$t(),Game.Objects.Farm.minigameLoaded&&(l("gardenTool-1").onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("ha","HarvestAllButton")),"this"),Game.tooltip.wobble()},Array.from(l("gardenPlot").children).forEach((e=>{const t=e.id.slice(-3);e.onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("p",[`${t[0]}`,`${t[2]}`])),"this"),Game.tooltip.wobble()}}))),_a(),function(){if(Game.Objects.Temple.minigameLoaded){for(let e=0;e<11;e+=1)l(`templeGod${e}`).onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("pag",e)),"this"),Game.tooltip.wobble()};for(let e=0;e<3;e+=1)l(`templeSlot${e}`).onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("pas",[e,Game.Objects.Temple.minigame.slot[e]])),"this"),Game.tooltip.wobble()}}}(),Qa()},Game.LoadMinigames(),l("backgroundLeftCanvas").onmouseover=function(){Co=1},l("backgroundLeftCanvas").onmouseout=function(){Co=0,Game.tooltip.hide(),Object.keys(Game.wrinklers).forEach((e=>{yo[e]=0}))},un(),Qa(),Game.CalculateGains(),ko=Game.OnAscend,Game.prefs.popups?Game.Popup("Cookie Monster version 2.052.10 loaded!"):Game.Notify("Cookie Monster version 2.052.10 loaded!","","",1,1),Game.Win("Third-party")}function gn(e,t){if(!Game.Objects.Temple.minigameLoaded)return 0;ta();const{minigame:o}=Game.Objects.Temple,a=o.godsById[e].slot;"0"===a?re=o.slot[t]:"1"===a?se=o.slot[t]:"2"===a&&(le=o.slot[t]),0===t?re=e:1===t?se=e:2===t&&(le=e);const n=te;return sa(),ha(),n!==te&&sa(),me-Game.cookiesPs}function fn(){if(Oo!==Game.OnAscend&&(Oo=Game.OnAscend,Game.OnAscend?(l("game").style.bottom="0px",1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar&&(l("CMBotBar").style.display="none"),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&(l("CMTimerBar").style.display="none")):(en(),qo()),Xo()),!Game.OnAscend&&0===Game.AscendTimer){Nt!==Object.keys(Game.mods).length&&(Va(),Ha(),Nt=Object.keys(Game.mods).length),ce&&($a(!0),Pa(),Game.Has("Golden switch [off]")?(ta(),Mt["Golden switch [off]"].bought=0,sa(),Se=me):Se=Game.cookiesPs,Ga({CacheNoGoldSwitchCookiesPS:Se}),ja(),Wa(),La(),Oa(),qa(),function(){for(let e=0;e<11;e+=1)for(let t=0;t<3;t+=1)kt[e][t]=gn(e,t);Ga({CacheGods:kt})}(),Aa(),function(){let e=0;if(Game.Objects.Bank.minigameLoaded){const t=Game.Objects.Bank.minigame.goods;let o=0;Object.keys(t).forEach((e=>{const a=t[e];o+=a.stock*a.val})),e+=o*Game.cookiesPsRawHighest}e+=function(){let e=0;ta();let t=2;5!==ne&&18!==ne||(t-=1),5!==ie&&18!==ie||(t-=1),ne=5,ie=18;for(let e=0;e<t;++e){let e="Cursor";Object.keys(Ct).forEach((t=>{Ct[t].amount>0&&(e=t)})),Ct[e].amount-=1,J-=1}return Object.keys(Ct).forEach((t=>{const o=Ct[t];e+=Ft(Game.Objects[o.name],Game.Objects[t].basePrice,o.amount,Game.Objects[t].free,o.amount)})),e}(),ft=e,Ga({CacheSellForChoEgg:ft})}(),ce=0);const e=Game.auraMult("Fierce Hoarder")>0;!K&&e?(K=!0,Y=1):K&&!e&&(K=!1,Y=1),Y&&(Ba(),Y=0),function(){Ua(),Sa(),$a(!1),function(){Re=0;let e=0;Object.keys(Game.wrinklers).forEach((t=>{2===Game.wrinklers[t].phase&&(e+=1)}));let t=1;if(Ct.Temple.minigameLoaded){const e=Game.hasGod("scorn");1===e?t*=1.15:2===e?t*=1.1:3===e&&(t*=1.05)}Ie=e,Re=e*(.05*e*1.1)*(.05*Game.Has("Sacrilegious corruption")+1)*(.05*Game.Has("Wrinklerspawn")+1)*t,Ga({CacheCurrWrinklerCount:Ie,CacheCurrWrinklerCPSMult:Re})}(),va(),Da();const e=Game.HowManyCookiesReset(Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned))+1)-(Game.cookiesEarned+Game.cookiesReset);mt=Uo(e/Ro())}(),Ht!==(Game.TickerEffect&&"fortune"===Game.TickerEffect.type)&&(Ht=Game.TickerEffect&&"fortune"===Game.TickerEffect.type,Ht&&(v.createFlash("cookieMonsterMod",3,"FortuneFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FortuneSoundURL,"FortuneSound","FortuneVolume",!1),v.createNotification("cookieMonsterMod","FortuneNotification","Fortune Cookie found","A Fortune Cookie has appeared on the Ticker."))),Ut!==Game.shimmerTypes.reindeer.spawned&&(Ut=Game.shimmerTypes.reindeer.spawned,Object.keys(Game.shimmers).forEach((e=>{Game.shimmers[e].spawnLead&&"reindeer"===Game.shimmers[e].type&&(dt=Game.shimmers[e])})),v.createFlash("cookieMonsterMod",3,"SeaFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SeaSoundURL,"SeaSound","SeaVolume",!1),v.createNotification("cookieMonsterMod","SeaNotification","Reindeer sighted!","A Reindeer has spawned. Click it now!")),Game.Objects.Farm.minigameLoaded&&Rt!==Game.Objects.Farm.minigame.nextStep&&(0!==Rt&&Rt<Date.now()&&(v.createFlash("cookieMonsterMod",3,"GardFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GardSoundURL,"GardSound","GardVolume",!1)),Rt=Game.Objects.Farm.minigame.nextStep),function(){if(Game.Objects["Wizard tower"].minigameLoaded&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GrimoireBar){const{minigame:e}=Game.Objects["Wizard tower"];e.magic<e.magicM?Vt=!1:Vt||(Vt=!0,v.createFlash("cookieMonsterMod",3,"MagicFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MagicSoundURL,"MagicSound","MagicVolume",!1),v.createNotification("cookieMonsterMod","MagicNotification","Magic Meter full","Your Magic Meter is full. Cast a spell!"))}}(),function(){if(Game.elderWrath>0){let e=0;Object.keys(Game.wrinklers).forEach((t=>{2===Game.wrinklers[t].phase&&(e+=1)})),e>Xt?(Xt=e,e===Game.getWrinklersMax()&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxFlash?v.createFlash("cookieMonsterMod",3,"WrinklerMaxFlash",!1):v.createFlash("cookieMonsterMod",3,"WrinklerFlash",!1),e===Game.getWrinklersMax()&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxSound?v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxSoundURL,"WrinklerMaxSound","WrinklerMaxVolume",!1):v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerSoundURL,"WrinklerSound","WrinklerVolume",!1),e===Game.getWrinklersMax()&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxNotification?v.createNotification("cookieMonsterMod","WrinklerMaxNotification","Maximum Wrinklers Reached","You have reached your maximum ammount of wrinklers"):v.createNotification("cookieMonsterMod","WrinklerNotification","A Wrinkler appeared","A new wrinkler has appeared")):Xt=e}}()}_t=0,gt={},Object.keys(Game.shimmers).forEach((e=>{gt[Game.shimmers[e].id]=Game.shimmers[e],Game.shimmers[e].spawnLead&&"golden"===Game.shimmers[e].type&&(ct=Game.shimmers[e],_t+=1)})),Object.keys(Lo).forEach((e=>{void 0===gt[e]&&(Lo[e].parentNode.removeChild(Lo[e]),delete Lo[e])})),It!==Game.shimmerTypes.golden.n?(It=Game.shimmerTypes.golden.n,It&&(zt<_t&&(v.createFlash("cookieMonsterMod",3,"GCFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCSoundURL,"GCSound","GCVolume",!1),v.createNotification("cookieMonsterMod","GCNotification","Golden Cookie Spawned","A Golden Cookie has spawned. Click it now!")),Object.keys(Game.shimmers).forEach((e=>{void 0===Lo[Game.shimmers[e].id]&&function(e){const t=document.createElement("div");t.id=`GCTimer${e.id}`,t.style.width="96px",t.style.height="96px",t.style.position="absolute",t.style.zIndex="10000000001",t.style.textAlign="center",t.style.lineHeight="96px",t.style.fontFamily='"Kavoon", Georgia, serif',t.style.fontSize="35px",t.style.cursor="pointer",t.style.display="block",t.style.pointerEvents="none",0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer&&(t.style.display="none"),t.style.left=e.l.style.left,t.style.top=e.l.style.top,t.onclick=function(){e.pop()},t.onmouseover=function(){e.l.style.filter="brightness(125%) drop-shadow(0px 0px 3px rgba(255,255,255,1))",e.l.style.webkitFilter="brightness(125%) drop-shadow(0px 0px 3px rgba(255,255,255,1))"},t.onmouseout=function(){e.l.style.filter="",e.l.style.webkitFilter=""},Lo[e.id]=t,l("shimmers").appendChild(t)}(Game.shimmers[e])}))),za(),zt=_t,0===_t&&(ct=0)):1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer&&It&&Object.keys(Lo).forEach((e=>{Lo[e].style.opacity=gt[e].l.style.opacity,Lo[e].style.transform=gt[e].l.style.transform,Lo[e].textContent=Math.ceil(gt[e].life/Game.fps)}))}const kn={Favourite:1,Calculation:1,Notation:1,Colours:1,BarsDisplay:1,Tooltip:1,Statistics:1,Notification:1,NotificationGeneral:1,NotificationGC:1,NotificationFC:1,NotificationSea:1,NotificationGard:1,NotificationMagi:1,NotificationWrink:1,NotificationWrinkMax:1,Miscellaneous:1,Lucky:1,Chain:1,Spells:1,Garden:1,Prestige:1,Wrink:1,Sea:1,Achievs:1,Misc:1,infoMenu:1,optionsMenu:1};function Cn(e){Va(),w.loadMod("cookieMonsterMod",e,tn,kn,fn),void 0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames&&(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames=[]),on();for(let e=0;e<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.length;e++){const t=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames[e];l(`row${t}`).style.pointerEvents="none",l(`row${t}`).style.opacity="0.4",l(`productLock${t}`).innerHTML="Unlock",l(`productLock${t}`).style.pointerEvents="auto"}void 0!==Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.version&&"2.052.10"!==Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.version&&(Game.prefs.popups?Game.Popup("A new version of Cookie Monster has been loaded, check out the release notes in the info tab!"):Game.Notify("A new version of Cookie Monster has been loaded, check out the release notes in the info tab!","","",0,1))}const Mn={init:function(){let e=!0;M(),window.cookieMonsterFrameworkData.isInitializing=!0,y("cookieMonsterMod"),Game.version!==Number("2.052")&&(e=confirm("Cookie Monster version 2.052.10 is meant for Game version 2.052. Loading a different version may cause errors. Do you still want to load Cookie Monster?")),e&&(hn(),Game.registerHook("click",ya),Game.registerHook("draw",Ma),Game.registerHook("logic",fn),void 0===Game.modSaveData.cookieMonsterMod&&Cn("{}"))},load:Cn,save:function(){const e=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod;return e.version="2.052.10",JSON.stringify(e)}};"undefined"!=typeof Steam?setTimeout((function(){Game.registerMod("CookieMonster",Mn),window.cookieMonsterFrameworkData.isInitializing=!1}),2e3):(Game.registerMod("CookieMonster",Mn),window.cookieMonsterFrameworkData.isInitializing=!1)})()})(); +(()=>{var e={877:function(e){!function(t,o){"use strict";"object"!=typeof e.exports?o(t):e.exports=t.document?o(t):function(e){if(!e.document)throw new Error("jscolor needs a window with document");return o(e)}}("undefined"!=typeof window?window:this,(function(e){"use strict";var t,o,a,n,i=(n={initialized:!1,instances:[],readyQueue:[],register:function(){void 0!==e&&e.document&&e.document.addEventListener("DOMContentLoaded",n.pub.init,!1)},installBySelector:function(t,o){if(!(o=o?n.node(o):e.document))throw new Error("Missing root node");for(var a=o.querySelectorAll(t),i=new RegExp("(^|\\s)("+n.pub.lookupClass+")(\\s*(\\{[^}]*\\})|\\s|$)","i"),r=0;r<a.length;r+=1){var s,l;if(!(a[r].jscolor&&a[r].jscolor instanceof n.pub)&&(void 0===a[r].type||"color"!=a[r].type.toLowerCase()||!n.isColorAttrSupported)&&(null!==(s=n.getDataAttr(a[r],"jscolor"))||a[r].className&&(l=a[r].className.match(i)))){var c=a[r],d="";null!==s?d=s:l&&(console.warn('Installation using class name is DEPRECATED. Use data-jscolor="" attribute instead.'+n.docsRef),l[4]&&(d=l[4]));var m=null;if(d.trim())try{m=n.parseOptionsStr(d)}catch(e){console.warn(e+"\n"+d)}try{new n.pub(c,m)}catch(e){console.warn(e)}}}},parseOptionsStr:function(e){var t=null;try{t=JSON.parse(e)}catch(o){if(!n.pub.looseJSON)throw new Error("Could not parse jscolor options as JSON: "+o);try{t=new Function("var opts = ("+e+'); return typeof opts === "object" ? opts : {};')()}catch(e){throw new Error("Could not evaluate jscolor options: "+e)}}return t},getInstances:function(){for(var e=[],t=0;t<n.instances.length;t+=1)n.instances[t]&&n.instances[t].targetElement&&e.push(n.instances[t]);return e},createEl:function(t){var o=e.document.createElement(t);return n.setData(o,"gui",!0),o},node:function(t){if(!t)return null;if("string"==typeof t){var o=t,a=null;try{a=e.document.querySelector(o)}catch(e){return console.warn(e),null}return a||console.warn("No element matches the selector: %s",o),a}return n.isNode(t)?t:(console.warn("Invalid node of type %s: %s",typeof t,t),null)},isNode:function(e){return"object"==typeof Node?e instanceof Node:e&&"object"==typeof e&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},nodeName:function(e){return!(!e||!e.nodeName)&&e.nodeName.toLowerCase()},removeChildren:function(e){for(;e.firstChild;)e.removeChild(e.firstChild)},isTextInput:function(e){return e&&"input"===n.nodeName(e)&&"text"===e.type.toLowerCase()},isButton:function(e){if(!e)return!1;var t=n.nodeName(e);return"button"===t||"input"===t&&["button","submit","reset"].indexOf(e.type.toLowerCase())>-1},isButtonEmpty:function(e){switch(n.nodeName(e)){case"input":return!e.value||""===e.value.trim();case"button":return""===e.textContent.trim()}return null},isPassiveEventSupported:function(){var t=!1;try{var o=Object.defineProperty({},"passive",{get:function(){t=!0}});e.addEventListener("testPassive",null,o),e.removeEventListener("testPassive",null,o)}catch(e){}return t}(),isColorAttrSupported:(a=e.document.createElement("input"),!(!a.setAttribute||(a.setAttribute("type","color"),"color"!=a.type.toLowerCase()))),dataProp:"_data_jscolor",setData:function(){var e=arguments[0];if(3===arguments.length){var t=e.hasOwnProperty(n.dataProp)?e[n.dataProp]:e[n.dataProp]={},o=arguments[2];return t[i=arguments[1]]=o,!0}if(2===arguments.length&&"object"==typeof arguments[1]){t=e.hasOwnProperty(n.dataProp)?e[n.dataProp]:e[n.dataProp]={};var a=arguments[1];for(var i in a)a.hasOwnProperty(i)&&(t[i]=a[i]);return!0}throw new Error("Invalid arguments")},removeData:function(){var e=arguments[0];if(!e.hasOwnProperty(n.dataProp))return!0;for(var t=1;t<arguments.length;t+=1){var o=arguments[t];delete e[n.dataProp][o]}return!0},getData:function(e,t,o){if(!e.hasOwnProperty(n.dataProp)){if(void 0===o)return;e[n.dataProp]={}}var a=e[n.dataProp];return a.hasOwnProperty(t)||void 0===o||(a[t]=o),a[t]},getDataAttr:function(e,t){var o="data-"+t;return e.getAttribute(o)},setDataAttr:function(e,t,o){var a="data-"+t;e.setAttribute(a,o)},_attachedGroupEvents:{},attachGroupEvent:function(e,t,o,a){n._attachedGroupEvents.hasOwnProperty(e)||(n._attachedGroupEvents[e]=[]),n._attachedGroupEvents[e].push([t,o,a]),t.addEventListener(o,a,!1)},detachGroupEvents:function(e){if(n._attachedGroupEvents.hasOwnProperty(e)){for(var t=0;t<n._attachedGroupEvents[e].length;t+=1){var o=n._attachedGroupEvents[e][t];o[0].removeEventListener(o[1],o[2],!1)}delete n._attachedGroupEvents[e]}},preventDefault:function(e){e.preventDefault&&e.preventDefault(),e.returnValue=!1},captureTarget:function(e){e.setCapture&&(n._capturedTarget=e,n._capturedTarget.setCapture())},releaseTarget:function(){n._capturedTarget&&(n._capturedTarget.releaseCapture(),n._capturedTarget=null)},triggerEvent:function(t,o,a,i){if(t){var r=null;return"function"==typeof Event?r=new Event(o,{bubbles:a,cancelable:i}):(r=e.document.createEvent("Event")).initEvent(o,a,i),!!r&&(n.setData(r,"internal",!0),t.dispatchEvent(r),!0)}},triggerInputEvent:function(e,t,o,a){e&&n.isTextInput(e)&&n.triggerEvent(e,t,o,a)},eventKey:function(e){var t={9:"Tab",13:"Enter",27:"Escape"};return"string"==typeof e.code?e.code:void 0!==e.keyCode&&t.hasOwnProperty(e.keyCode)?t[e.keyCode]:null},strList:function(e){return e?e.replace(/^\s+|\s+$/g,"").split(/\s+/):[]},hasClass:function(e,t){return!!t&&(void 0!==e.classList?e.classList.contains(t):-1!=(" "+e.className.replace(/\s+/g," ")+" ").indexOf(" "+t+" "))},addClass:function(e,t){var o=n.strList(t);if(void 0===e.classList)for(a=0;a<o.length;a+=1)n.hasClass(e,o[a])||(e.className+=(e.className?" ":"")+o[a]);else for(var a=0;a<o.length;a+=1)e.classList.add(o[a])},removeClass:function(e,t){var o=n.strList(t);if(void 0===e.classList)for(i=0;i<o.length;i+=1){var a=new RegExp("^\\s*"+o[i]+"\\s*|\\s*"+o[i]+"\\s*$|\\s+"+o[i]+"(\\s+)","g");e.className=e.className.replace(a,"$1")}else for(var i=0;i<o.length;i+=1)e.classList.remove(o[i])},getCompStyle:function(t){return(e.getComputedStyle?e.getComputedStyle(t):t.currentStyle)||{}},setStyle:function(e,t,o,a){var i=o?"important":"",r=null;for(var s in t)if(t.hasOwnProperty(s)){var l=null;null===t[s]?(r||(r=n.getData(e,"origStyle")),r&&r.hasOwnProperty(s)&&(l=r[s])):(a&&(r||(r=n.getData(e,"origStyle",{})),r.hasOwnProperty(s)||(r[s]=e.style[s])),l=t[s]),null!==l&&e.style.setProperty(s,l,i)}},hexColor:function(e,t,o){return"#"+(("0"+Math.round(e).toString(16)).substr(-2)+("0"+Math.round(t).toString(16)).substr(-2)+("0"+Math.round(o).toString(16)).substr(-2)).toUpperCase()},hexaColor:function(e,t,o,a){return"#"+(("0"+Math.round(e).toString(16)).substr(-2)+("0"+Math.round(t).toString(16)).substr(-2)+("0"+Math.round(o).toString(16)).substr(-2)+("0"+Math.round(255*a).toString(16)).substr(-2)).toUpperCase()},rgbColor:function(e,t,o){return"rgb("+Math.round(e)+","+Math.round(t)+","+Math.round(o)+")"},rgbaColor:function(e,t,o,a){return"rgba("+Math.round(e)+","+Math.round(t)+","+Math.round(o)+","+Math.round(100*(null==a?1:a))/100+")"},linearGradient:(o=function(){for(var t="linear-gradient",o=["","-webkit-","-moz-","-o-","-ms-"],a=e.document.createElement("div"),n=0;n<o.length;n+=1){var i=o[n]+t,r=i+"(to right, rgba(0,0,0,0), rgba(0,0,0,0))";if(a.style.background=r,a.style.background)return i}return t}(),function(){return o+"("+Array.prototype.join.call(arguments,", ")+")"}),setBorderRadius:function(e,t){n.setStyle(e,{"border-radius":t||"0"})},setBoxShadow:function(e,t){n.setStyle(e,{"box-shadow":t||"none"})},getElementPos:function(e,t){var o=0,a=0,i=e.getBoundingClientRect();if(o=i.left,a=i.top,!t){var r=n.getViewPos();o+=r[0],a+=r[1]}return[o,a]},getElementSize:function(e){return[e.offsetWidth,e.offsetHeight]},getAbsPointerPos:function(e){var t=0,o=0;return void 0!==e.changedTouches&&e.changedTouches.length?(t=e.changedTouches[0].clientX,o=e.changedTouches[0].clientY):"number"==typeof e.clientX&&(t=e.clientX,o=e.clientY),{x:t,y:o}},getRelPointerPos:function(e){var t=(e.target||e.srcElement).getBoundingClientRect(),o=0,a=0;return void 0!==e.changedTouches&&e.changedTouches.length?(o=e.changedTouches[0].clientX,a=e.changedTouches[0].clientY):"number"==typeof e.clientX&&(o=e.clientX,a=e.clientY),{x:o-t.left,y:a-t.top}},getViewPos:function(){var t=e.document.documentElement;return[(e.pageXOffset||t.scrollLeft)-(t.clientLeft||0),(e.pageYOffset||t.scrollTop)-(t.clientTop||0)]},getViewSize:function(){var t=e.document.documentElement;return[e.innerWidth||t.clientWidth,e.innerHeight||t.clientHeight]},RGB_HSV:function(e,t,o){e/=255,t/=255,o/=255;var a=Math.min(Math.min(e,t),o),n=Math.max(Math.max(e,t),o),i=n-a;if(0===i)return[null,0,100*n];var r=e===a?3+(o-t)/i:t===a?5+(e-o)/i:1+(t-e)/i;return[60*(6===r?0:r),i/n*100,100*n]},HSV_RGB:function(e,t,o){var a=o/100*255;if(null===e)return[a,a,a];e/=60,t/=100;var n=Math.floor(e),i=a*(1-t),r=a*(1-t*(n%2?e-n:1-(e-n)));switch(n){case 6:case 0:return[a,r,i];case 1:return[r,a,i];case 2:return[i,a,r];case 3:return[i,r,a];case 4:return[r,i,a];case 5:return[a,i,r]}},parseColorString:function(e){var t,o={rgba:null,format:null};if(t=e.match(/^\W*([0-9A-F]{3,8})\W*$/i)){if(8===t[1].length)o.format="hexa",o.rgba=[parseInt(t[1].substr(0,2),16),parseInt(t[1].substr(2,2),16),parseInt(t[1].substr(4,2),16),parseInt(t[1].substr(6,2),16)/255];else if(6===t[1].length)o.format="hex",o.rgba=[parseInt(t[1].substr(0,2),16),parseInt(t[1].substr(2,2),16),parseInt(t[1].substr(4,2),16),null];else{if(3!==t[1].length)return!1;o.format="hex",o.rgba=[parseInt(t[1].charAt(0)+t[1].charAt(0),16),parseInt(t[1].charAt(1)+t[1].charAt(1),16),parseInt(t[1].charAt(2)+t[1].charAt(2),16),null]}return o}if(t=e.match(/^\W*rgba?\(([^)]*)\)\W*$/i)){var a,n,i,r,s=t[1].split(","),l=/^\s*(\d+|\d*\.\d+|\d+\.\d*)\s*$/;if(s.length>=3&&(a=s[0].match(l))&&(n=s[1].match(l))&&(i=s[2].match(l)))return o.format="rgb",o.rgba=[parseFloat(a[1])||0,parseFloat(n[1])||0,parseFloat(i[1])||0,null],s.length>=4&&(r=s[3].match(l))&&(o.format="rgba",o.rgba[3]=parseFloat(r[1])||0),o}return!1},parsePaletteValue:function(e){var t=[];"string"==typeof e?e.replace(/#[0-9A-F]{3}([0-9A-F]{3})?|rgba?\(([^)]*)\)/gi,(function(e){t.push(e)})):Array.isArray(e)&&(t=e);for(var o=[],a=0;a<t.length;a++){var i=n.parseColorString(t[a]);i&&o.push(i)}return o},containsTranparentColor:function(e){for(var t=0;t<e.length;t++){var o=e[t].rgba[3];if(null!==o&&o<1)return!0}return!1},isAlphaFormat:function(e){switch(e.toLowerCase()){case"hexa":case"rgba":return!0}return!1},scaleCanvasForHighDPR:function(t){var o=e.devicePixelRatio||1;t.width*=o,t.height*=o,t.getContext("2d").scale(o,o)},genColorPreviewCanvas:function(e,t,o,a){var i=Math.round(n.pub.previewSeparator.length),r=n.pub.chessboardSize,s=n.pub.chessboardColor1,l=n.pub.chessboardColor2,c=o||2*r,d=2*r,m=n.createEl("canvas"),p=m.getContext("2d");m.width=c,m.height=d,a&&n.scaleCanvasForHighDPR(m),p.fillStyle=s,p.fillRect(0,0,c,d),p.fillStyle=l;for(var u=0;u<c;u+=2*r)p.fillRect(u,0,r,r),p.fillRect(u+r,r,r,r);e&&(p.fillStyle=e,p.fillRect(0,0,c,d));var h=null;switch(t){case"left":h=0,p.clearRect(0,0,i/2,d);break;case"right":h=c-i,p.clearRect(c-i/2,0,i/2,d)}if(null!==h){p.lineWidth=1;for(var g=0;g<n.pub.previewSeparator.length;g+=1)p.beginPath(),p.strokeStyle=n.pub.previewSeparator[g],p.moveTo(.5+h+g,0),p.lineTo(.5+h+g,d),p.stroke()}return{canvas:m,width:c,height:d}},genColorPreviewGradient:function(e,t,o){var a;return a=t&&o?["to "+{left:"right",right:"left"}[t],e+" 0%",e+" "+o+"px","rgba(0,0,0,0) "+(o+1)+"px","rgba(0,0,0,0) 100%"]:["to right",e+" 0%",e+" 100%"],n.linearGradient.apply(this,a)},redrawPosition:function(){if(n.picker&&n.picker.owner){var e,t,o=n.picker.owner;o.fixed?(e=n.getElementPos(o.targetElement,!0),t=[0,0]):(e=n.getElementPos(o.targetElement),t=n.getViewPos());var a,i,r,s=n.getElementSize(o.targetElement),l=n.getViewSize(),c=n.getPickerDims(o),d=[c.borderW,c.borderH];switch(o.position.toLowerCase()){case"left":a=1,i=0,r=-1;break;case"right":a=1,i=0,r=1;break;case"top":a=0,i=1,r=-1;break;default:a=0,i=1,r=1}var m=(s[i]+d[i])/2;if(o.smartPosition)p=[-t[a]+e[a]+d[a]>l[a]&&-t[a]+e[a]+s[a]/2>l[a]/2&&e[a]+s[a]-d[a]>=0?e[a]+s[a]-d[a]:e[a],-t[i]+e[i]+s[i]+d[i]-m+m*r>l[i]?-t[i]+e[i]+s[i]/2>l[i]/2&&e[i]+s[i]-m-m*r>=0?e[i]+s[i]-m-m*r:e[i]+s[i]-m+m*r:e[i]+s[i]-m+m*r>=0?e[i]+s[i]-m+m*r:e[i]+s[i]-m-m*r];else var p=[e[a],e[i]+s[i]-m+m*r];var u=p[a],h=p[i],g=o.fixed?"fixed":"absolute",f=(p[0]+d[0]>e[0]||p[0]<e[0]+s[0])&&p[1]+d[1]<e[1]+s[1];n._drawPosition(o,u,h,g,f)}},_drawPosition:function(e,t,o,a,i){var r=i?0:e.shadowBlur;n.picker.wrap.style.position=a,n.picker.wrap.style.left=t+"px",n.picker.wrap.style.top=o+"px",n.setBoxShadow(n.picker.boxS,e.shadow?new n.BoxShadow(0,r,e.shadowBlur,0,e.shadowColor):null)},getPickerDims:function(e){var t=2*e.controlBorderWidth+e.width,o=2*e.controlBorderWidth+e.height,a=2*e.controlBorderWidth+2*n.getControlPadding(e)+e.sliderSize;n.getSliderChannel(e)&&(t+=a),e.hasAlphaChannel()&&(t+=a);var i=n.getPaletteDims(e,t);i.height&&(o+=i.height+e.padding),e.closeButton&&(o+=2*e.controlBorderWidth+e.padding+e.buttonHeight);var r=t+2*e.padding,s=o+2*e.padding;return{contentW:t,contentH:o,paddedW:r,paddedH:s,borderW:r+2*e.borderWidth,borderH:s+2*e.borderWidth,palette:i}},getPaletteDims:function(e,t){var o=0,a=0,n=0,i=0,r=0,s=e._palette?e._palette.length:0;return s&&(a=(o=e.paletteCols)>0?Math.ceil(s/o):0,n=Math.max(1,Math.floor((t-(o-1)*e.paletteSpacing)/o)),i=e.paletteHeight?Math.min(e.paletteHeight,n):n),a&&(r=a*i+(a-1)*e.paletteSpacing),{cols:o,rows:a,cellW:n,cellH:i,width:t,height:r}},getControlPadding:function(e){return Math.max(e.padding/2,2*e.pointerBorderWidth+e.pointerThickness-e.controlBorderWidth)},getPadYChannel:function(e){return"v"===e.mode.charAt(1).toLowerCase()?"v":"s"},getSliderChannel:function(e){if(e.mode.length>2)switch(e.mode.charAt(2).toLowerCase()){case"s":return"s";case"v":return"v"}return null},triggerCallback:function(e,t){if(e[t]){var o=null;if("string"==typeof e[t])try{o=new Function(e[t])}catch(e){console.error(e)}else o=e[t];o&&o.call(e)}},triggerGlobal:function(e){for(var t=n.getInstances(),o=0;o<t.length;o+=1)t[o].trigger(e)},_pointerMoveEvent:{mouse:"mousemove",touch:"touchmove"},_pointerEndEvent:{mouse:"mouseup",touch:"touchend"},_pointerOrigin:null,_capturedTarget:null,onDocumentKeyUp:function(e){-1!==["Tab","Escape"].indexOf(n.eventKey(e))&&n.picker&&n.picker.owner&&n.picker.owner.tryHide()},onWindowResize:function(e){n.redrawPosition()},onWindowScroll:function(e){n.redrawPosition()},onParentScroll:function(e){n.picker&&n.picker.owner&&n.picker.owner.tryHide()},onDocumentMouseDown:function(e){var t=e.target||e.srcElement;t.jscolor&&t.jscolor instanceof n.pub?t.jscolor.showOnClick&&!t.disabled&&t.jscolor.show():n.getData(t,"gui")?n.getData(t,"control")&&n.onControlPointerStart(e,t,n.getData(t,"control"),"mouse"):n.picker&&n.picker.owner&&n.picker.owner.tryHide()},onPickerTouchStart:function(e){var t=e.target||e.srcElement;n.getData(t,"control")&&n.onControlPointerStart(e,t,n.getData(t,"control"),"touch")},onControlPointerStart:function(t,o,a,i){var r=n.getData(o,"instance");n.preventDefault(t),n.captureTarget(o);var s=function(e,r){n.attachGroupEvent("drag",e,n._pointerMoveEvent[i],n.onDocumentPointerMove(t,o,a,i,r)),n.attachGroupEvent("drag",e,n._pointerEndEvent[i],n.onDocumentPointerEnd(t,o,a,i))};if(s(e.document,[0,0]),e.parent&&e.frameElement){var l=e.frameElement.getBoundingClientRect(),c=[-l.left,-l.top];s(e.parent.window.document,c)}var d=n.getAbsPointerPos(t),m=n.getRelPointerPos(t);switch(n._pointerOrigin={x:d.x-m.x,y:d.y-m.y},a){case"pad":"v"===n.getSliderChannel(r)&&0===r.channels.v&&r.fromHSVA(null,null,100,null),n.setPad(r,t,0,0);break;case"sld":n.setSld(r,t,0);break;case"asld":n.setASld(r,t,0)}r.trigger("input")},onDocumentPointerMove:function(e,t,o,a,i){return function(e){var a=n.getData(t,"instance");switch(o){case"pad":n.setPad(a,e,i[0],i[1]);break;case"sld":n.setSld(a,e,i[1]);break;case"asld":n.setASld(a,e,i[1])}a.trigger("input")}},onDocumentPointerEnd:function(e,t,o,a){return function(e){var o=n.getData(t,"instance");n.detachGroupEvents("drag"),n.releaseTarget(),o.trigger("input"),o.trigger("change")}},onPaletteSampleClick:function(e){var t=e.currentTarget,o=n.getData(t,"instance"),a=n.getData(t,"color");"any"===o.format.toLowerCase()&&(o._setFormat(a.format),n.isAlphaFormat(o.getFormat())||(a.rgba[3]=1)),null===a.rgba[3]&&(!0===o.paletteSetsAlpha||"auto"===o.paletteSetsAlpha&&o._paletteHasTransparency)&&(a.rgba[3]=1),o.fromRGBA.apply(o,a.rgba),o.trigger("input"),o.trigger("change"),o.hideOnPaletteClick&&o.hide()},setPad:function(e,t,o,a){var i=n.getAbsPointerPos(t),r=o+i.x-n._pointerOrigin.x-e.padding-e.controlBorderWidth,s=a+i.y-n._pointerOrigin.y-e.padding-e.controlBorderWidth,l=r*(360/(e.width-1)),c=100-s*(100/(e.height-1));switch(n.getPadYChannel(e)){case"s":e.fromHSVA(l,c,null,null);break;case"v":e.fromHSVA(l,null,c,null)}},setSld:function(e,t,o){var a=100-(o+n.getAbsPointerPos(t).y-n._pointerOrigin.y-e.padding-e.controlBorderWidth)*(100/(e.height-1));switch(n.getSliderChannel(e)){case"s":e.fromHSVA(null,a,null,null);break;case"v":e.fromHSVA(null,null,a,null)}},setASld:function(e,t,o){var a=1-(o+n.getAbsPointerPos(t).y-n._pointerOrigin.y-e.padding-e.controlBorderWidth)*(1/(e.height-1));if(a<1){var i=e.getFormat();"any"!==e.format.toLowerCase()||n.isAlphaFormat(i)||e._setFormat("hex"===i?"hexa":"rgba")}e.fromHSVA(null,null,null,a)},createPadCanvas:function(){var e={elm:null,draw:null},t=n.createEl("canvas"),o=t.getContext("2d");return e.elm=t,e.draw=function(e,a,n){t.width=e,t.height=a,o.clearRect(0,0,t.width,t.height);var i=o.createLinearGradient(0,0,t.width,0);i.addColorStop(0,"#F00"),i.addColorStop(1/6,"#FF0"),i.addColorStop(2/6,"#0F0"),i.addColorStop(.5,"#0FF"),i.addColorStop(4/6,"#00F"),i.addColorStop(5/6,"#F0F"),i.addColorStop(1,"#F00"),o.fillStyle=i,o.fillRect(0,0,t.width,t.height);var r=o.createLinearGradient(0,0,0,t.height);switch(n.toLowerCase()){case"s":r.addColorStop(0,"rgba(255,255,255,0)"),r.addColorStop(1,"rgba(255,255,255,1)");break;case"v":r.addColorStop(0,"rgba(0,0,0,0)"),r.addColorStop(1,"rgba(0,0,0,1)")}o.fillStyle=r,o.fillRect(0,0,t.width,t.height)},e},createSliderGradient:function(){var e={elm:null,draw:null},t=n.createEl("canvas"),o=t.getContext("2d");return e.elm=t,e.draw=function(e,a,n,i){t.width=e,t.height=a,o.clearRect(0,0,t.width,t.height);var r=o.createLinearGradient(0,0,0,t.height);r.addColorStop(0,n),r.addColorStop(1,i),o.fillStyle=r,o.fillRect(0,0,t.width,t.height)},e},createASliderGradient:function(){var e={elm:null,draw:null},t=n.createEl("canvas"),o=t.getContext("2d");return e.elm=t,e.draw=function(e,a,i){t.width=e,t.height=a,o.clearRect(0,0,t.width,t.height);var r=t.width/2,s=n.pub.chessboardColor1,l=n.pub.chessboardColor2;if(o.fillStyle=s,o.fillRect(0,0,t.width,t.height),r>0)for(var c=0;c<t.height;c+=2*r)o.fillStyle=l,o.fillRect(0,c,r,r),o.fillRect(r,c+r,r,r);var d=o.createLinearGradient(0,0,0,t.height);d.addColorStop(0,i),d.addColorStop(1,"rgba(0,0,0,0)"),o.fillStyle=d,o.fillRect(0,0,t.width,t.height)},e},BoxShadow:(t=function(e,t,o,a,n,i){this.hShadow=e,this.vShadow=t,this.blur=o,this.spread=a,this.color=n,this.inset=!!i},t.prototype.toString=function(){var e=[Math.round(this.hShadow)+"px",Math.round(this.vShadow)+"px",Math.round(this.blur)+"px",Math.round(this.spread)+"px",this.color];return this.inset&&e.push("inset"),e.join(" ")},t),flags:{leaveValue:1,leaveAlpha:2,leavePreview:4},enumOpts:{format:["auto","any","hex","hexa","rgb","rgba"],previewPosition:["left","right"],mode:["hsv","hvs","hs","hv"],position:["left","right","top","bottom"],alphaChannel:["auto",!0,!1],paletteSetsAlpha:["auto",!0,!1]},deprecatedOpts:{styleElement:"previewElement",onFineChange:"onInput",overwriteImportant:"forceStyle",closable:"closeButton",insetWidth:"controlBorderWidth",insetColor:"controlBorderColor",refine:null},docsRef:" See https://jscolor.com/docs/",pub:function(t,o){var a=this;function i(e,t){if("string"!=typeof e)throw new Error("Invalid value for option name: "+e);if(n.enumOpts.hasOwnProperty(e)&&("string"==typeof t&&(t=t.toLowerCase()),-1===n.enumOpts[e].indexOf(t)))throw new Error("Option '"+e+"' has invalid value: "+t);if(n.deprecatedOpts.hasOwnProperty(e)){var o=e,i=n.deprecatedOpts[e];if(!i)throw new Error("Option '"+e+"' is DEPRECATED");console.warn("Option '%s' is DEPRECATED, using '%s' instead."+n.docsRef,o,i),e=i}var r="set__"+e;if("function"==typeof a[r])return a[r](t),!0;if(e in a)return a[e]=t,!0;throw new Error("Unrecognized configuration option: "+e)}function r(e){if("string"!=typeof e)throw new Error("Invalid value for option name: "+e);if(n.deprecatedOpts.hasOwnProperty(e)){var t=e,o=n.deprecatedOpts[e];if(!o)throw new Error("Option '"+e+"' is DEPRECATED");console.warn("Option '%s' is DEPRECATED, using '%s' instead."+n.docsRef,t,o),e=o}var i="get__"+e;if("function"==typeof a[i])return a[i](value);if(e in a)return a[e];throw new Error("Unrecognized configuration option: "+e)}function s(){a._processParentElementsInDOM(),n.picker||(n.picker={owner:null,wrap:n.createEl("div"),box:n.createEl("div"),boxS:n.createEl("div"),boxB:n.createEl("div"),pad:n.createEl("div"),padB:n.createEl("div"),padM:n.createEl("div"),padCanvas:n.createPadCanvas(),cross:n.createEl("div"),crossBY:n.createEl("div"),crossBX:n.createEl("div"),crossLY:n.createEl("div"),crossLX:n.createEl("div"),sld:n.createEl("div"),sldB:n.createEl("div"),sldM:n.createEl("div"),sldGrad:n.createSliderGradient(),sldPtrS:n.createEl("div"),sldPtrIB:n.createEl("div"),sldPtrMB:n.createEl("div"),sldPtrOB:n.createEl("div"),asld:n.createEl("div"),asldB:n.createEl("div"),asldM:n.createEl("div"),asldGrad:n.createASliderGradient(),asldPtrS:n.createEl("div"),asldPtrIB:n.createEl("div"),asldPtrMB:n.createEl("div"),asldPtrOB:n.createEl("div"),pal:n.createEl("div"),btn:n.createEl("div"),btnT:n.createEl("span")},n.picker.pad.appendChild(n.picker.padCanvas.elm),n.picker.padB.appendChild(n.picker.pad),n.picker.cross.appendChild(n.picker.crossBY),n.picker.cross.appendChild(n.picker.crossBX),n.picker.cross.appendChild(n.picker.crossLY),n.picker.cross.appendChild(n.picker.crossLX),n.picker.padB.appendChild(n.picker.cross),n.picker.box.appendChild(n.picker.padB),n.picker.box.appendChild(n.picker.padM),n.picker.sld.appendChild(n.picker.sldGrad.elm),n.picker.sldB.appendChild(n.picker.sld),n.picker.sldB.appendChild(n.picker.sldPtrOB),n.picker.sldPtrOB.appendChild(n.picker.sldPtrMB),n.picker.sldPtrMB.appendChild(n.picker.sldPtrIB),n.picker.sldPtrIB.appendChild(n.picker.sldPtrS),n.picker.box.appendChild(n.picker.sldB),n.picker.box.appendChild(n.picker.sldM),n.picker.asld.appendChild(n.picker.asldGrad.elm),n.picker.asldB.appendChild(n.picker.asld),n.picker.asldB.appendChild(n.picker.asldPtrOB),n.picker.asldPtrOB.appendChild(n.picker.asldPtrMB),n.picker.asldPtrMB.appendChild(n.picker.asldPtrIB),n.picker.asldPtrIB.appendChild(n.picker.asldPtrS),n.picker.box.appendChild(n.picker.asldB),n.picker.box.appendChild(n.picker.asldM),n.picker.box.appendChild(n.picker.pal),n.picker.btn.appendChild(n.picker.btnT),n.picker.box.appendChild(n.picker.btn),n.picker.boxB.appendChild(n.picker.box),n.picker.wrap.appendChild(n.picker.boxS),n.picker.wrap.appendChild(n.picker.boxB),n.picker.wrap.addEventListener("touchstart",n.onPickerTouchStart,!!n.isPassiveEventSupported&&{passive:!1}));var t,o,i=n.picker,r=!!n.getSliderChannel(a),s=a.hasAlphaChannel(),m=n.getPickerDims(a),p=2*a.pointerBorderWidth+a.pointerThickness+2*a.crossSize,u=n.getControlPadding(a),h=Math.min(a.borderRadius,Math.round(a.padding*Math.PI));i.wrap.className="jscolor-picker-wrap",i.wrap.style.clear="both",i.wrap.style.width=m.borderW+"px",i.wrap.style.height=m.borderH+"px",i.wrap.style.zIndex=a.zIndex,i.box.className="jscolor-picker",i.box.style.width=m.paddedW+"px",i.box.style.height=m.paddedH+"px",i.box.style.position="relative",i.boxS.className="jscolor-picker-shadow",i.boxS.style.position="absolute",i.boxS.style.left="0",i.boxS.style.top="0",i.boxS.style.width="100%",i.boxS.style.height="100%",n.setBorderRadius(i.boxS,h+"px"),i.boxB.className="jscolor-picker-border",i.boxB.style.position="relative",i.boxB.style.border=a.borderWidth+"px solid",i.boxB.style.borderColor=a.borderColor,i.boxB.style.background=a.backgroundColor,n.setBorderRadius(i.boxB,h+"px"),i.padM.style.background="rgba(255,0,0,.2)",i.sldM.style.background="rgba(0,255,0,.2)",i.asldM.style.background="rgba(0,0,255,.2)",i.padM.style.opacity=i.sldM.style.opacity=i.asldM.style.opacity="0",i.pad.style.position="relative",i.pad.style.width=a.width+"px",i.pad.style.height=a.height+"px",i.padCanvas.draw(a.width,a.height,n.getPadYChannel(a)),i.padB.style.position="absolute",i.padB.style.left=a.padding+"px",i.padB.style.top=a.padding+"px",i.padB.style.border=a.controlBorderWidth+"px solid",i.padB.style.borderColor=a.controlBorderColor,i.padM.style.position="absolute",i.padM.style.left="0px",i.padM.style.top="0px",i.padM.style.width=a.padding+2*a.controlBorderWidth+a.width+u+"px",i.padM.style.height=2*a.controlBorderWidth+2*a.padding+a.height+"px",i.padM.style.cursor="crosshair",n.setData(i.padM,{instance:a,control:"pad"}),i.cross.style.position="absolute",i.cross.style.left=i.cross.style.top="0",i.cross.style.width=i.cross.style.height=p+"px",i.crossBY.style.position=i.crossBX.style.position="absolute",i.crossBY.style.background=i.crossBX.style.background=a.pointerBorderColor,i.crossBY.style.width=i.crossBX.style.height=2*a.pointerBorderWidth+a.pointerThickness+"px",i.crossBY.style.height=i.crossBX.style.width=p+"px",i.crossBY.style.left=i.crossBX.style.top=Math.floor(p/2)-Math.floor(a.pointerThickness/2)-a.pointerBorderWidth+"px",i.crossBY.style.top=i.crossBX.style.left="0",i.crossLY.style.position=i.crossLX.style.position="absolute",i.crossLY.style.background=i.crossLX.style.background=a.pointerColor,i.crossLY.style.height=i.crossLX.style.width=p-2*a.pointerBorderWidth+"px",i.crossLY.style.width=i.crossLX.style.height=a.pointerThickness+"px",i.crossLY.style.left=i.crossLX.style.top=Math.floor(p/2)-Math.floor(a.pointerThickness/2)+"px",i.crossLY.style.top=i.crossLX.style.left=a.pointerBorderWidth+"px",i.sld.style.overflow="hidden",i.sld.style.width=a.sliderSize+"px",i.sld.style.height=a.height+"px",i.sldGrad.draw(a.sliderSize,a.height,"#000","#000"),i.sldB.style.display=r?"block":"none",i.sldB.style.position="absolute",i.sldB.style.left=a.padding+a.width+2*a.controlBorderWidth+2*u+"px",i.sldB.style.top=a.padding+"px",i.sldB.style.border=a.controlBorderWidth+"px solid",i.sldB.style.borderColor=a.controlBorderColor,i.sldM.style.display=r?"block":"none",i.sldM.style.position="absolute",i.sldM.style.left=a.padding+a.width+2*a.controlBorderWidth+u+"px",i.sldM.style.top="0px",i.sldM.style.width=a.sliderSize+2*u+2*a.controlBorderWidth+(s?0:Math.max(0,a.padding-u))+"px",i.sldM.style.height=2*a.controlBorderWidth+2*a.padding+a.height+"px",i.sldM.style.cursor="default",n.setData(i.sldM,{instance:a,control:"sld"}),i.sldPtrIB.style.border=i.sldPtrOB.style.border=a.pointerBorderWidth+"px solid "+a.pointerBorderColor,i.sldPtrOB.style.position="absolute",i.sldPtrOB.style.left=-(2*a.pointerBorderWidth+a.pointerThickness)+"px",i.sldPtrOB.style.top="0",i.sldPtrMB.style.border=a.pointerThickness+"px solid "+a.pointerColor,i.sldPtrS.style.width=a.sliderSize+"px",i.sldPtrS.style.height=n.pub.sliderInnerSpace+"px",i.asld.style.overflow="hidden",i.asld.style.width=a.sliderSize+"px",i.asld.style.height=a.height+"px",i.asldGrad.draw(a.sliderSize,a.height,"#000"),i.asldB.style.display=s?"block":"none",i.asldB.style.position="absolute",i.asldB.style.left=a.padding+a.width+2*a.controlBorderWidth+u+(r?a.sliderSize+3*u+2*a.controlBorderWidth:0)+"px",i.asldB.style.top=a.padding+"px",i.asldB.style.border=a.controlBorderWidth+"px solid",i.asldB.style.borderColor=a.controlBorderColor,i.asldM.style.display=s?"block":"none",i.asldM.style.position="absolute",i.asldM.style.left=a.padding+a.width+2*a.controlBorderWidth+u+(r?a.sliderSize+2*u+2*a.controlBorderWidth:0)+"px",i.asldM.style.top="0px",i.asldM.style.width=a.sliderSize+2*u+2*a.controlBorderWidth+Math.max(0,a.padding-u)+"px",i.asldM.style.height=2*a.controlBorderWidth+2*a.padding+a.height+"px",i.asldM.style.cursor="default",n.setData(i.asldM,{instance:a,control:"asld"}),i.asldPtrIB.style.border=i.asldPtrOB.style.border=a.pointerBorderWidth+"px solid "+a.pointerBorderColor,i.asldPtrOB.style.position="absolute",i.asldPtrOB.style.left=-(2*a.pointerBorderWidth+a.pointerThickness)+"px",i.asldPtrOB.style.top="0",i.asldPtrMB.style.border=a.pointerThickness+"px solid "+a.pointerColor,i.asldPtrS.style.width=a.sliderSize+"px",i.asldPtrS.style.height=n.pub.sliderInnerSpace+"px",i.pal.className="jscolor-palette",i.pal.style.display=m.palette.rows?"block":"none",i.pal.style.position="absolute",i.pal.style.left=a.padding+"px",i.pal.style.top=2*a.controlBorderWidth+2*a.padding+a.height+"px",i.pal.innerHTML="";for(var g=n.genColorPreviewCanvas("rgba(0,0,0,0)"),f=0,k=0;k<m.palette.rows;k++)for(var C=0;C<m.palette.cols&&f<a._palette.length;C++,f++){var M=a._palette[f],y=n.rgbaColor.apply(null,M.rgba),b=n.createEl("div");b.style.width=m.palette.cellW-2*a.controlBorderWidth+"px",b.style.height=m.palette.cellH-2*a.controlBorderWidth+"px",b.style.backgroundColor=y;var G=n.createEl("div");G.className="jscolor-palette-sample",G.style.display="block",G.style.position="absolute",G.style.left=(m.palette.cols<=1?0:Math.round(C*((m.contentW-m.palette.cellW)/(m.palette.cols-1))*10)/10)+"px",G.style.top=k*(m.palette.cellH+a.paletteSpacing)+"px",G.style.border=a.controlBorderWidth+"px solid",G.style.borderColor=a.controlBorderColor,G.style.cursor="pointer",null!==M.rgba[3]&&M.rgba[3]<1&&(G.style.backgroundImage="url('"+g.canvas.toDataURL()+"')",G.style.backgroundRepeat="repeat",G.style.backgroundPosition="center center"),n.setData(G,{instance:a,control:"palette-sample",color:M}),G.addEventListener("click",n.onPaletteSampleClick,!1),G.appendChild(b),i.pal.appendChild(G)}i.btn.className="jscolor-btn-close",i.btn.style.display=a.closeButton?"block":"none",i.btn.style.position="absolute",i.btn.style.left=a.padding+"px",i.btn.style.bottom=a.padding+"px",i.btn.style.padding="0 15px",i.btn.style.maxWidth=m.contentW-2*a.controlBorderWidth-30+"px",i.btn.style.overflow="hidden",i.btn.style.height=a.buttonHeight+"px",i.btn.style.whiteSpace="nowrap",i.btn.style.border=a.controlBorderWidth+"px solid",o=(t=a.controlBorderColor.split(/\s+/)).length<2?t[0]:t[1]+" "+t[0]+" "+t[0]+" "+t[1],i.btn.style.borderColor=o,i.btn.style.color=a.buttonColor,i.btn.style.font="12px sans-serif",i.btn.style.textAlign="center",i.btn.style.cursor="pointer",i.btn.onmousedown=function(){a.hide()},i.btnT.style.lineHeight=a.buttonHeight+"px",i.btnT.innerHTML="",i.btnT.appendChild(e.document.createTextNode(a.closeText)),l(),c(),d(),n.picker.owner&&n.picker.owner!==a&&n.removeClass(n.picker.owner.targetElement,n.pub.activeClassName),n.picker.owner=a,a.container===e.document.body?n.redrawPosition():n._drawPosition(a,0,0,"relative",!1),i.wrap.parentNode!==a.container&&a.container.appendChild(i.wrap),n.addClass(a.targetElement,n.pub.activeClassName)}function l(){var e=n.getPadYChannel(a),t=Math.round(a.channels.h/360*(a.width-1)),o=Math.round((1-a.channels[e]/100)*(a.height-1)),i=2*a.pointerBorderWidth+a.pointerThickness+2*a.crossSize,r=-Math.floor(i/2);switch(n.picker.cross.style.left=t+r+"px",n.picker.cross.style.top=o+r+"px",n.getSliderChannel(a)){case"s":var s=n.HSV_RGB(a.channels.h,100,a.channels.v),l=n.HSV_RGB(a.channels.h,0,a.channels.v),c="rgb("+Math.round(s[0])+","+Math.round(s[1])+","+Math.round(s[2])+")",d="rgb("+Math.round(l[0])+","+Math.round(l[1])+","+Math.round(l[2])+")";n.picker.sldGrad.draw(a.sliderSize,a.height,c,d);break;case"v":var m=n.HSV_RGB(a.channels.h,a.channels.s,100);c="rgb("+Math.round(m[0])+","+Math.round(m[1])+","+Math.round(m[2])+")",d="#000",n.picker.sldGrad.draw(a.sliderSize,a.height,c,d)}n.picker.asldGrad.draw(a.sliderSize,a.height,a.toHEXString())}function c(){var e=n.getSliderChannel(a);if(e){var t=Math.round((1-a.channels[e]/100)*(a.height-1));n.picker.sldPtrOB.style.top=t-(2*a.pointerBorderWidth+a.pointerThickness)-Math.floor(n.pub.sliderInnerSpace/2)+"px"}n.picker.asldGrad.draw(a.sliderSize,a.height,a.toHEXString())}function d(){var e=Math.round((1-a.channels.a)*(a.height-1));n.picker.asldPtrOB.style.top=e-(2*a.pointerBorderWidth+a.pointerThickness)-Math.floor(n.pub.sliderInnerSpace/2)+"px"}function m(){return n.picker&&n.picker.owner===a}if(o||(o={}),this.channels={r:255,g:255,b:255,h:0,s:0,v:100,a:1},this.format="auto",this.value=void 0,this.alpha=void 0,this.random=!1,this.onChange=void 0,this.onInput=void 0,this.valueElement=void 0,this.alphaElement=void 0,this.previewElement=void 0,this.previewPosition="left",this.previewSize=32,this.previewPadding=8,this.required=!0,this.hash=!0,this.uppercase=!0,this.forceStyle=!0,this.width=181,this.height=101,this.mode="HSV",this.alphaChannel="auto",this.position="bottom",this.smartPosition=!0,this.showOnClick=!0,this.hideOnLeave=!0,this.palette=[],this.paletteCols=10,this.paletteSetsAlpha="auto",this.paletteHeight=16,this.paletteSpacing=4,this.hideOnPaletteClick=!1,this.sliderSize=16,this.crossSize=8,this.closeButton=!1,this.closeText="Close",this.buttonColor="rgba(0,0,0,1)",this.buttonHeight=18,this.padding=12,this.backgroundColor="rgba(255,255,255,1)",this.borderWidth=1,this.borderColor="rgba(187,187,187,1)",this.borderRadius=8,this.controlBorderWidth=1,this.controlBorderColor="rgba(187,187,187,1)",this.shadow=!0,this.shadowBlur=15,this.shadowColor="rgba(0,0,0,0.2)",this.pointerColor="rgba(76,76,76,1)",this.pointerBorderWidth=1,this.pointerBorderColor="rgba(255,255,255,1)",this.pointerThickness=2,this.zIndex=5e3,this.container=void 0,this.minS=0,this.maxS=100,this.minV=0,this.maxV=100,this.minA=0,this.maxA=1,this.option=function(){if(!arguments.length)throw new Error("No option specified");if(1===arguments.length&&"string"==typeof arguments[0]){try{return r(arguments[0])}catch(e){console.warn(e)}return!1}if(arguments.length>=2&&"string"==typeof arguments[0]){try{if(!i(arguments[0],arguments[1]))return!1}catch(e){return console.warn(e),!1}return this.redraw(),this.exposeColor(),!0}if(1===arguments.length&&"object"==typeof arguments[0]){var e=arguments[0],t=!0;for(var o in e)if(e.hasOwnProperty(o))try{i(o,e[o])||(t=!1)}catch(e){console.warn(e),t=!1}return this.redraw(),this.exposeColor(),t}throw new Error("Invalid arguments")},this.channel=function(e,t){if("string"!=typeof e)throw new Error("Invalid value for channel name: "+e);if(void 0===t)return this.channels.hasOwnProperty(e.toLowerCase())?this.channels[e.toLowerCase()]:(console.warn("Getting unknown channel: "+e),!1);var o=!1;switch(e.toLowerCase()){case"r":o=this.fromRGBA(t,null,null,null);break;case"g":o=this.fromRGBA(null,t,null,null);break;case"b":o=this.fromRGBA(null,null,t,null);break;case"h":o=this.fromHSVA(t,null,null,null);break;case"s":o=this.fromHSVA(null,t,null,null);break;case"v":o=this.fromHSVA(null,null,t,null);break;case"a":o=this.fromHSVA(null,null,null,t);break;default:return console.warn("Setting unknown channel: "+e),!1}return!!o&&(this.redraw(),!0)},this.trigger=function(e){for(var t=n.strList(e),o=0;o<t.length;o+=1){var a=t[o].toLowerCase(),i=null;switch(a){case"input":i="onInput";break;case"change":i="onChange"}i&&n.triggerCallback(this,i),n.triggerInputEvent(this.valueElement,a,!0,!0)}},this.fromHSVA=function(e,t,o,a,i){if(void 0===e&&(e=null),void 0===t&&(t=null),void 0===o&&(o=null),void 0===a&&(a=null),null!==e){if(isNaN(e))return!1;this.channels.h=Math.max(0,Math.min(360,e))}if(null!==t){if(isNaN(t))return!1;this.channels.s=Math.max(0,Math.min(100,this.maxS,t),this.minS)}if(null!==o){if(isNaN(o))return!1;this.channels.v=Math.max(0,Math.min(100,this.maxV,o),this.minV)}if(null!==a){if(isNaN(a))return!1;this.channels.a=this.hasAlphaChannel()?Math.max(0,Math.min(1,this.maxA,a),this.minA):1}var r=n.HSV_RGB(this.channels.h,this.channels.s,this.channels.v);return this.channels.r=r[0],this.channels.g=r[1],this.channels.b=r[2],this.exposeColor(i),!0},this.fromRGBA=function(e,t,o,a,i){if(void 0===e&&(e=null),void 0===t&&(t=null),void 0===o&&(o=null),void 0===a&&(a=null),null!==e){if(isNaN(e))return!1;e=Math.max(0,Math.min(255,e))}if(null!==t){if(isNaN(t))return!1;t=Math.max(0,Math.min(255,t))}if(null!==o){if(isNaN(o))return!1;o=Math.max(0,Math.min(255,o))}if(null!==a){if(isNaN(a))return!1;this.channels.a=this.hasAlphaChannel()?Math.max(0,Math.min(1,this.maxA,a),this.minA):1}var r=n.RGB_HSV(null===e?this.channels.r:e,null===t?this.channels.g:t,null===o?this.channels.b:o);null!==r[0]&&(this.channels.h=Math.max(0,Math.min(360,r[0]))),0!==r[2]&&(this.channels.s=Math.max(0,this.minS,Math.min(100,this.maxS,r[1]))),this.channels.v=Math.max(0,this.minV,Math.min(100,this.maxV,r[2]));var s=n.HSV_RGB(this.channels.h,this.channels.s,this.channels.v);return this.channels.r=s[0],this.channels.g=s[1],this.channels.b=s[2],this.exposeColor(i),!0},this.fromHSV=function(e,t,o,a){return console.warn("fromHSV() method is DEPRECATED. Using fromHSVA() instead."+n.docsRef),this.fromHSVA(e,t,o,null,a)},this.fromRGB=function(e,t,o,a){return console.warn("fromRGB() method is DEPRECATED. Using fromRGBA() instead."+n.docsRef),this.fromRGBA(e,t,o,null,a)},this.fromString=function(e,t){if(!this.required&&""===e.trim())return this.setPreviewElementBg(null),this.setValueElementValue(""),!0;var o=n.parseColorString(e);return!!o&&("any"===this.format.toLowerCase()&&(this._setFormat(o.format),n.isAlphaFormat(this.getFormat())||(o.rgba[3]=1)),this.fromRGBA(o.rgba[0],o.rgba[1],o.rgba[2],o.rgba[3],t),!0)},this.randomize=function(e,t,o,a,n,i,r,s){void 0===e&&(e=0),void 0===t&&(t=100),void 0===o&&(o=0),void 0===a&&(a=100),void 0===n&&(n=0),void 0===i&&(i=359),void 0===r&&(r=1),void 0===s&&(s=1),this.fromHSVA(n+Math.floor(Math.random()*(i-n+1)),o+Math.floor(Math.random()*(a-o+1)),e+Math.floor(Math.random()*(t-e+1)),(100*r+Math.floor(Math.random()*(100*(s-r)+1)))/100)},this.toString=function(e){switch(void 0===e&&(e=this.getFormat()),e.toLowerCase()){case"hex":return this.toHEXString();case"hexa":return this.toHEXAString();case"rgb":return this.toRGBString();case"rgba":return this.toRGBAString()}return!1},this.toHEXString=function(){return n.hexColor(this.channels.r,this.channels.g,this.channels.b)},this.toHEXAString=function(){return n.hexaColor(this.channels.r,this.channels.g,this.channels.b,this.channels.a)},this.toRGBString=function(){return n.rgbColor(this.channels.r,this.channels.g,this.channels.b)},this.toRGBAString=function(){return n.rgbaColor(this.channels.r,this.channels.g,this.channels.b,this.channels.a)},this.toGrayscale=function(){return.213*this.channels.r+.715*this.channels.g+.072*this.channels.b},this.toCanvas=function(){return n.genColorPreviewCanvas(this.toRGBAString()).canvas},this.toDataURL=function(){return this.toCanvas().toDataURL()},this.toBackground=function(){return n.pub.background(this.toRGBAString())},this.isLight=function(){return this.toGrayscale()>127.5},this.hide=function(){m()&&(n.removeClass(a.targetElement,n.pub.activeClassName),n.picker.wrap.parentNode.removeChild(n.picker.wrap),delete n.picker.owner)},this.show=function(){s()},this.redraw=function(){m()&&s()},this.getFormat=function(){return this._currentFormat},this._setFormat=function(e){this._currentFormat=e.toLowerCase()},this.hasAlphaChannel=function(){return"auto"===this.alphaChannel?"any"===this.format.toLowerCase()||n.isAlphaFormat(this.getFormat())||void 0!==this.alpha||void 0!==this.alphaElement:this.alphaChannel},this.processValueInput=function(e){this.fromString(e)||this.exposeColor()},this.processAlphaInput=function(e){this.fromHSVA(null,null,null,parseFloat(e))||this.exposeColor()},this.exposeColor=function(e){var t=this.toString(),o=this.getFormat();if(n.setDataAttr(this.targetElement,"current-color",t),e&n.flags.leaveValue||!this.valueElement||("hex"!==o&&"hexa"!==o||(this.uppercase||(t=t.toLowerCase()),this.hash||(t=t.replace(/^#/,""))),this.setValueElementValue(t)),!(e&n.flags.leaveAlpha)&&this.alphaElement){var a=Math.round(100*this.channels.a)/100;this.setAlphaElementValue(a)}e&n.flags.leavePreview||!this.previewElement||((n.isTextInput(this.previewElement)||n.isButton(this.previewElement)&&!n.isButtonEmpty(this.previewElement))&&this.previewPosition,this.setPreviewElementBg(this.toRGBAString())),m()&&(l(),c(),d())},this.setPreviewElementBg=function(e){if(this.previewElement){var t=null,o=null;(n.isTextInput(this.previewElement)||n.isButton(this.previewElement)&&!n.isButtonEmpty(this.previewElement))&&(t=this.previewPosition,o=this.previewSize);var a=[];if(e){a.push({image:n.genColorPreviewGradient(e,t,o?o-n.pub.previewSeparator.length:null),position:"left top",size:"auto",repeat:t?"repeat-y":"repeat",origin:"padding-box"});var i=n.genColorPreviewCanvas("rgba(0,0,0,0)",t?{left:"right",right:"left"}[t]:null,o,!0);a.push({image:"url('"+i.canvas.toDataURL()+"')",position:(t||"left")+" top",size:i.width+"px "+i.height+"px",repeat:t?"repeat-y":"repeat",origin:"padding-box"})}else a.push({image:"none",position:"left top",size:"auto",repeat:"no-repeat",origin:"padding-box"});for(var r={image:[],position:[],size:[],repeat:[],origin:[]},s=0;s<a.length;s+=1)r.image.push(a[s].image),r.position.push(a[s].position),r.size.push(a[s].size),r.repeat.push(a[s].repeat),r.origin.push(a[s].origin);var l={"background-image":r.image.join(", "),"background-position":r.position.join(", "),"background-size":r.size.join(", "),"background-repeat":r.repeat.join(", "),"background-origin":r.origin.join(", ")};n.setStyle(this.previewElement,l,this.forceStyle);var c={left:null,right:null};t&&(c[t]=this.previewSize+this.previewPadding+"px"),l={"padding-left":c.left,"padding-right":c.right},n.setStyle(this.previewElement,l,this.forceStyle,!0)}},this.setValueElementValue=function(e){this.valueElement&&("input"===n.nodeName(this.valueElement)?this.valueElement.value=e:this.valueElement.innerHTML=e)},this.setAlphaElementValue=function(e){this.alphaElement&&("input"===n.nodeName(this.alphaElement)?this.alphaElement.value=e:this.alphaElement.innerHTML=e)},this._processParentElementsInDOM=function(){if(!this._parentElementsProcessed){this._parentElementsProcessed=!0;var e=this.targetElement;do{var t=n.getCompStyle(e);t.position&&"fixed"===t.position.toLowerCase()&&(this.fixed=!0),e!==this.targetElement&&(n.getData(e,"hasScrollListener")||(e.addEventListener("scroll",n.onParentScroll,!1),n.setData(e,"hasScrollListener",!0)))}while((e=e.parentNode)&&"body"!==n.nodeName(e))}},this.tryHide=function(){this.hideOnLeave&&this.hide()},this.set__palette=function(e){this.palette=e,this._palette=n.parsePaletteValue(e),this._paletteHasTransparency=n.containsTranparentColor(this._palette)},n.pub.options)for(var p in n.pub.options)if(n.pub.options.hasOwnProperty(p))try{i(p,n.pub.options[p])}catch(e){console.warn(e)}var u=[];o.preset&&("string"==typeof o.preset?u=o.preset.split(/\s+/):Array.isArray(o.preset)?u=o.preset.slice():console.warn("Unrecognized preset value")),-1===u.indexOf("default")&&u.push("default");for(var h=u.length-1;h>=0;h-=1){var g=u[h];if(g)if(n.pub.presets.hasOwnProperty(g)){for(var p in n.pub.presets[g])if(n.pub.presets[g].hasOwnProperty(p))try{i(p,n.pub.presets[g][p])}catch(e){console.warn(e)}}else console.warn("Unknown preset: %s",g)}var f=["preset"];for(var p in o)if(o.hasOwnProperty(p)&&-1===f.indexOf(p))try{i(p,o[p])}catch(e){console.warn(e)}if(void 0===this.container?this.container=e.document.body:this.container=n.node(this.container),!this.container)throw new Error("Cannot instantiate color picker without a container element");if(this.targetElement=n.node(t),!this.targetElement){if("string"==typeof t&&/^[a-zA-Z][\w:.-]*$/.test(t))throw new Error("If '"+t+"' is supposed to be an ID, please use '#"+t+"' or any valid CSS selector.");throw new Error("Cannot instantiate color picker without a target element")}if(this.targetElement.jscolor&&this.targetElement.jscolor instanceof n.pub)throw new Error("Color picker already installed on this element");if(this.targetElement.jscolor=this,n.addClass(this.targetElement,n.pub.className),n.instances.push(this),n.isButton(this.targetElement)&&("button"!==this.targetElement.type.toLowerCase()&&(this.targetElement.type="button"),n.isButtonEmpty(this.targetElement))){n.removeChildren(this.targetElement),this.targetElement.appendChild(e.document.createTextNode(" "));var k=n.getCompStyle(this.targetElement);(parseFloat(k["min-width"])||0)<this.previewSize&&n.setStyle(this.targetElement,{"min-width":this.previewSize+"px"},this.forceStyle)}if(void 0===this.valueElement?n.isTextInput(this.targetElement)&&(this.valueElement=this.targetElement):null===this.valueElement||(this.valueElement=n.node(this.valueElement)),this.alphaElement&&(this.alphaElement=n.node(this.alphaElement)),void 0===this.previewElement?this.previewElement=this.targetElement:null===this.previewElement||(this.previewElement=n.node(this.previewElement)),this.valueElement&&n.isTextInput(this.valueElement)){var C={onInput:this.valueElement.oninput};this.valueElement.oninput=null,this.valueElement.addEventListener("keydown",(function(e){"Enter"===n.eventKey(e)&&(a.valueElement&&a.processValueInput(a.valueElement.value),a.tryHide())}),!1),this.valueElement.addEventListener("change",(function(e){if(!n.getData(e,"internal")){var t=a.valueElement.value;a.processValueInput(a.valueElement.value),n.triggerCallback(a,"onChange"),a.valueElement.value!==t&&n.triggerInputEvent(a.valueElement,"change",!0,!0)}}),!1),this.valueElement.addEventListener("input",(function(e){n.getData(e,"internal")||(a.valueElement&&a.fromString(a.valueElement.value,n.flags.leaveValue),n.triggerCallback(a,"onInput"))}),!1),C.onInput&&this.valueElement.addEventListener("input",C.onInput,!1),this.valueElement.setAttribute("autocomplete","off"),this.valueElement.setAttribute("autocorrect","off"),this.valueElement.setAttribute("autocapitalize","off"),this.valueElement.setAttribute("spellcheck",!1)}this.alphaElement&&n.isTextInput(this.alphaElement)&&(this.alphaElement.addEventListener("keydown",(function(e){"Enter"===n.eventKey(e)&&(a.alphaElement&&a.processAlphaInput(a.alphaElement.value),a.tryHide())}),!1),this.alphaElement.addEventListener("change",(function(e){if(!n.getData(e,"internal")){var t=a.alphaElement.value;a.processAlphaInput(a.alphaElement.value),n.triggerCallback(a,"onChange"),n.triggerInputEvent(a.valueElement,"change",!0,!0),a.alphaElement.value!==t&&n.triggerInputEvent(a.alphaElement,"change",!0,!0)}}),!1),this.alphaElement.addEventListener("input",(function(e){n.getData(e,"internal")||(a.alphaElement&&a.fromHSVA(null,null,null,parseFloat(a.alphaElement.value),n.flags.leaveAlpha),n.triggerCallback(a,"onInput"),n.triggerInputEvent(a.valueElement,"input",!0,!0))}),!1),this.alphaElement.setAttribute("autocomplete","off"),this.alphaElement.setAttribute("autocorrect","off"),this.alphaElement.setAttribute("autocapitalize","off"),this.alphaElement.setAttribute("spellcheck",!1));var M="FFFFFF";void 0!==this.value?M=this.value:this.valueElement&&void 0!==this.valueElement.value&&(M=this.valueElement.value);var y=void 0;if(void 0!==this.alpha?y=""+this.alpha:this.alphaElement&&void 0!==this.alphaElement.value&&(y=this.alphaElement.value),this._currentFormat=null,["auto","any"].indexOf(this.format.toLowerCase())>-1){var b=n.parseColorString(M);this._currentFormat=b?b.format:"hex"}else this._currentFormat=this.format.toLowerCase();this.processValueInput(M),void 0!==y&&this.processAlphaInput(y),this.random&&this.randomize.apply(this,Array.isArray(this.random)?this.random:[])}},n.pub.className="jscolor",n.pub.activeClassName="jscolor-active",n.pub.looseJSON=!0,n.pub.presets={},n.pub.presets.default={},n.pub.presets.light={backgroundColor:"rgba(255,255,255,1)",controlBorderColor:"rgba(187,187,187,1)",buttonColor:"rgba(0,0,0,1)"},n.pub.presets.dark={backgroundColor:"rgba(51,51,51,1)",controlBorderColor:"rgba(153,153,153,1)",buttonColor:"rgba(240,240,240,1)"},n.pub.presets.small={width:101,height:101,padding:10,sliderSize:14,paletteCols:8},n.pub.presets.medium={width:181,height:101,padding:12,sliderSize:16,paletteCols:10},n.pub.presets.large={width:271,height:151,padding:12,sliderSize:24,paletteCols:15},n.pub.presets.thin={borderWidth:1,controlBorderWidth:1,pointerBorderWidth:1},n.pub.presets.thick={borderWidth:2,controlBorderWidth:2,pointerBorderWidth:2},n.pub.sliderInnerSpace=3,n.pub.chessboardSize=8,n.pub.chessboardColor1="#666666",n.pub.chessboardColor2="#999999",n.pub.previewSeparator=["rgba(255,255,255,.65)","rgba(128,128,128,.65)"],n.pub.init=function(){if(!n.initialized)for(e.document.addEventListener("mousedown",n.onDocumentMouseDown,!1),e.document.addEventListener("keyup",n.onDocumentKeyUp,!1),e.addEventListener("resize",n.onWindowResize,!1),e.addEventListener("scroll",n.onWindowScroll,!1),n.pub.install(),n.initialized=!0;n.readyQueue.length;)n.readyQueue.shift()()},n.pub.install=function(e){var t=!0;try{n.installBySelector("[data-jscolor]",e)}catch(e){t=!1,console.warn(e)}if(n.pub.lookupClass)try{n.installBySelector("input."+n.pub.lookupClass+", button."+n.pub.lookupClass,e)}catch(e){}return t},n.pub.ready=function(e){return"function"!=typeof e?(console.warn("Passed value is not a function"),!1):(n.initialized?e():n.readyQueue.push(e),!0)},n.pub.trigger=function(e){var t=function(){n.triggerGlobal(e)};n.initialized?t():n.pub.ready(t)},n.pub.hide=function(){n.picker&&n.picker.owner&&n.picker.owner.hide()},n.pub.chessboard=function(e){return e||(e="rgba(0,0,0,0)"),n.genColorPreviewCanvas(e).canvas.toDataURL()},n.pub.background=function(e){var t=[];t.push(n.genColorPreviewGradient(e));var o=n.genColorPreviewCanvas();return t.push(["url('"+o.canvas.toDataURL()+"')","left top","repeat"].join(" ")),t.join(", ")},n.pub.options={},n.pub.lookupClass="jscolor",n.pub.installByClassName=function(){return console.error('jscolor.installByClassName() is DEPRECATED. Use data-jscolor="" attribute instead of a class name.'+n.docsRef),!1},n.register(),n.pub);return void 0===e.jscolor&&(e.jscolor=e.JSColor=i),i}))}},t={};function o(a){var n=t[a];if(void 0!==n)return n.exports;var i=t[a]={exports:{}};return e[a].call(i.exports,i,i.exports,o),i.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var a in t)o.o(t,a)&&!o.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";class e{constructor(e,t,o){this.defaultValue=e,this.type=t,this.group=o}}function t(e,t){Game.promptWrapL.className="framed",Game.promptL.innerHTML=`${e}<div class="optionBox"></div>`,Object.keys(t).forEach((e=>{const o=document.createElement("a");o.id=`promptOption${e}`,o.className="option",o.onclick=function(){PlaySound("snd/tick.mp3"),t[e][1]()},o.textContent=t[e][0],Game.promptL.children[1].appendChild(o)})),Game.promptAnchorL.style.display="block",Game.darkenL.style.display="block",Game.promptL.focus(),Game.promptOn=1,Game.UpdatePrompt()}function a(e,t,o,n){(1===Game.mods.cookieMonsterFramework.saveData[e].settings[o]||n)&&3===t&&!1===window.cookieMonsterFrameworkData.isInitializing||1===t?(l("CMFlashScreen").style.backgroundColor=Game.mods.cookieMonsterFramework.saveData[e].settings[`Colour${o}`],l("CMFlashScreen").style.opacity="0.5",3===t?(l("CMFlashScreen").style.display="inline",setTimeout((()=>{a(e,2,o,!0)}),1e3/Game.fps)):setTimeout((()=>{a(e,0,o,!0)}),1e3/Game.fps)):2===t?(l("CMFlashScreen").style.opacity="1",setTimeout((()=>{a(e,1,o,!0)}),1e3/Game.fps)):0===t&&(l("CMFlashScreen").style.display="none")}function n(){Object.keys(Game.mods.cookieMonsterFramework.saveData).forEach((e=>{const t=JSON.stringify(Game.mods.cookieMonsterFramework.saveData[e]),o=b64_to_utf8(unescape(localStorage.getItem("CookieClickerGame")).split("!END!")[0]),a=new RegExp(`${e}.*(;|$)`),n=o.match(a);if(null!==n){const a=o.replace(n[0],`${e}:${t}`);localStorage.setItem("CookieClickerGame",escape(`${utf8_to_b64(a)}!END!`))}}))}function i(e,t){void 0===Game.mods.cookieMonsterFramework.saveData[e].headers[t]&&(Game.mods.cookieMonsterFramework.saveData[e].headers[t]=1),0===Game.mods.cookieMonsterFramework.saveData[e].headers[t]?Game.mods.cookieMonsterFramework.saveData[e].headers[t]=1:Game.mods.cookieMonsterFramework.saveData[e].headers[t]=0,n()}var r=o(877),s=o.n(r);function c(e,t,o,a,n){if((1===Game.mods.cookieMonsterFramework.saveData[e].settings[o]||n)&&!1===window.cookieMonsterFrameworkData.isInitializing){const o=new Audio(t);Game.mods.cookieMonsterFramework.saveData[e].settings.GeneralSound?o.volume=Game.mods.cookieMonsterFramework.saveData[e].settings[a]/100*(Game.volume/100):o.volume=Game.mods.cookieMonsterFramework.saveData[e].settings[a]/100,o.play()}}function d(e,t){null!==l(`slider${e}${t}`)&&(l(`slider${e}${t}right`).innerHTML=`${l(`slider${e}${t}`).value}%`,Game.mods.cookieMonsterFramework.saveData[e].settings[t]=Math.round(l(`slider${e}${t}`).value)),n()}function m(e,t){t.disconnect(),"log"===Game.onMenu?function(){const e=l("menu").children[1];if(e.insertBefore(function(){const e=document.createElement("div");e.className="subsection",e.id="cookieMonsterFrameworkMenuSection";const t=document.createElement("div");t.className="title",t.innerHTML="Cookie Monster Mod Family";const o=document.createElement("span");if(o.style.cursor="pointer",o.style.display="inline-block",o.style.height="14px",o.style.width="14px",o.style.borderRadius="7px",o.style.textAlign="center",o.style.backgroundColor="#C0C0C0",o.style.color="black",o.style.fontSize="13px",o.style.verticalAlign="middle",o.textContent=Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu?"-":"+",o.onclick=function(){i("cookieMonsterFramework","infoMenu"),Game.UpdateMenu()},t.appendChild(o),e.appendChild(t),Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu){const t=document.createElement("div");t.className="listing",t.innerHTML='<a href="https://github.com/CookieMonsterTeam" target="blank">Cookie Monster Team</a>\noffers a suite of tools to enhance your game experience.</br>\nOriginally known from our work on the Cookie Monster add-on we are now expanding and working on new tools within the Cookie Monster Mod Family.</br>\nKeep an eye on our GitHub to see future work or use it to report bugs or feature requests!</br>\n',e.appendChild(t)}return e}(),e.children[1]),Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu){const e=Game.mods.cookieMonsterFramework.listeners.infoMenu;for(let t=0;t<e.length;t++)l("cookieMonsterFrameworkMenuSection").appendChild(e[t]())}}():Game.onMenu,t.observe(document.getElementById("menu"),{attributes:!0,childList:!0,subtree:!0})}function p(){}const u={infoMenu:1,optionsMenu:1};function h(e,t,o,a,i){const r=JSON.parse(t);Game.mods.cookieMonsterFramework.saveData[e]=function(e,t,o){const a={},n={};Object.keys(t).forEach((o=>{void 0===e.settings||void 0===e.settings[o]?n[o]=t[o].defaultValue:n[o]=e.settings[o]})),a.settings=n;const i={};return Object.keys(o).forEach((t=>{void 0===e.headers||void 0===e.headers[t]?i[t]=o[t]:i[t]=e.headers[t]})),a.headers=i,Object.keys(e).forEach((t=>{"settings"!==t&&"headers"!==t&&(a[t]=e[t])})),void 0===a.favouriteSettings&&(a.favouriteSettings=[]),a}(r,o,a),n(),i(),Object.keys(Game.mods.cookieMonsterFramework.saveData[e].settings).forEach((e=>{void 0!==o[e].func&&o[e].func()})),Game.UpdateMenu()}function g(){}const f={};function k(e){h("cookieMonsterFramework",e,f,u,g)}const C={init:function(){window.cookieMonsterFrameworkData={isInitializing:!0},new MutationObserver(m).observe(document.getElementById("menu"),{attributes:!0,childList:!0,subtree:!0}),function(){const e=document.createElement("div");e.id="CMFlashScreen",e.style.width="100%",e.style.height="100%",e.style.backgroundColor="white",e.style.display="none",e.style.zIndex="9999999999",e.style.position="absolute",e.style.pointerEvents="none",l("wrapper").appendChild(e)}(),Game.registerHook("draw",p),void 0===Game.modSaveData.cookieMonsterFramework&&k("{}"),window.cookieMonsterFrameworkData.isInitializing=!1},load:k,save:function(){return JSON.stringify(Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework)},listeners:{infoMenu:[],optionsMenu:[]},saveData:{cookieMonsterFramework:{headers:{},settings:{}}}},M=function(){"undefined"==typeof cookieMonsterFrameworkData&&Game.registerMod("cookieMonsterFramework",C)},y=function(e){Game.mods.cookieMonsterFramework.saveData[e]={favouriteSettings:[],headers:{},settings:{}}},b={createInfoListing:function(e){const t=document.createElement("div");return t.className="listing",t.innerHTML=e,t},createOptionsListing:function(e,o,i,m,p){const u=document.createElement("div");if(u.className="listing",1===Game.mods.cookieMonsterFramework.saveData[e].settings.FavouriteSettings&&u.appendChild(function(e,t,o){const a=document.createElement("a");return o.includes(t)?(a.innerText="★",a.style.color="yellow"):a.innerText="☆",a.className="option",a.onclick=function(){!function(e,t){Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings.includes(t)?Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings=Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings.filter((e=>e!==t)):Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings.push(t),n()}(e,t),n(),Game.UpdateMenu()},a.onmouseover=function(){Game.tooltip.draw(this,escape('<div style="min-width: 250px; margin-bottom: 4px;"><div style="text-align: left;">Click to set this setting as favourite and show it in \'favourite\' settings at the top of the Cookie Monster Settings</div></div>'))},a.onmouseout=function(){Game.tooltip.hide()},a.appendChild(document.createTextNode(" ")),a}(e,o,Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings)),"bool"===i[o].type){const t=document.createElement("a");i[o].toggle&&0===Game.mods.cookieMonsterFramework.saveData[e].settings[o]?t.className="option off":t.className="option",t.id=`${e}Options${o}`,t.onclick=function(){!function(e,t,o){Game.mods.cookieMonsterFramework.saveData[e].settings[t]+=1,Game.mods.cookieMonsterFramework.saveData[e].settings[t]===o[t].label.length?(Game.mods.cookieMonsterFramework.saveData[e].settings[t]=0,o[t].toggle&&(l(`${e}Options${t}`).className="option off")):l(`${e}Options${t}`).className="option",void 0!==o[t].func&&o[t].func(),n()}(e,o,i),Game.UpdateMenu()},t.textContent=i[o].label[Game.mods.cookieMonsterFramework.saveData[e].settings[o]],u.appendChild(t);const a=document.createElement("label");return a.textContent=i[o].desc,a.style.lineHeight="1.6",u.appendChild(a),u}if("vol"===i[o].type){const t=document.createElement("div");t.className="sliderBox";const a=document.createElement("div");a.style.float="left",a.innerHTML=i[o].desc,t.appendChild(a);const n=document.createElement("div");n.id=`slider${e}${o}right`,n.style.float="right",n.innerHTML=`${Game.mods.cookieMonsterFramework.saveData[e].settings[o]}%`,t.appendChild(n);const r=document.createElement("input");r.className="slider",r.id=`slider${e}${o}`,r.style.clear="both",r.type="range",r.min="0",r.max="100",r.step="1",r.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o],r.oninput=function(){d(e,o),Game.UpdateMenu()},r.onchange=function(){d(e,o),Game.UpdateMenu()},t.appendChild(r),u.appendChild(t);const s=document.createElement("a");return s.className="option",s.onclick=function(){c(e,Game.mods.cookieMonsterFramework.saveData[e].settings[o.replace("Volume","SoundURL")],o.replace("Volume","Sound"),o,!0)},s.textContent="Test sound",u.appendChild(s),u}if("url"===i[o].type){const a=document.createElement("span");a.className="option",a.textContent=`${i[o].label} `,a.style.lineHeight="1.6",u.appendChild(a);const r=document.createElement("input");r.id=`${e}Options${o}`,r.className="option",r.type="text",r.readOnly=!0,r.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o],r.style.width="300px",u.appendChild(r),u.appendChild(document.createTextNode(" "));const s=document.createElement("input");s.id=`${e}Options${o}Prompt`,s.className="option",s.type="text",s.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o];const c=document.createElement("a");c.className="option",c.onclick=function(){t(s.outerHTML,[["Save",function(){Game.mods.cookieMonsterFramework.saveData[e].settings[o]=l(`${e}Options${o}Prompt`).value,n(),Game.ClosePrompt(),Game.UpdateMenu()}],["Cancel",function(){Game.ClosePrompt()}]])},c.textContent="Edit",u.appendChild(c);const d=document.createElement("label");return d.textContent=i[o].desc,d.style.lineHeight="1.6",u.appendChild(d),u}if("colour"===i[o].type){const t=document.createElement("span");t.className="option";const l=document.createElement("input");l.id=o,l.style.width="65px",l.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o],t.appendChild(l),new r(l,{hash:!0,position:"right",onInput:function(){Game.mods.cookieMonsterFramework.saveData[e].settings[this.targetElement.id]=this.toHEXString(),m(),n(),Game.UpdateMenu()}});const c=document.createElement("label");if(c.textContent=i[o].desc,c.style.lineHeight="1.6",t.appendChild(c),o.includes("Flash")){const n=document.createElement("a");n.className="option",n.onclick=function(){a(e,3,o.replace("Colour",""),!0)},n.textContent="Test flash",t.appendChild(n)}return u.appendChild(t),s().init(),u}if("numscale"===i[o].type){const t=document.createElement("span");t.className="option",t.textContent=`${i[o].label} `,t.style.lineHeight="1.6",u.appendChild(t);const a=document.createElement("input");a.id=`${e}Options${o}`,a.className="option",a.type="number",a.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o],a.min=i[o].min,a.max=i[o].max,a.oninput=function(){Game.mods.cookieMonsterFramework.saveData[e].settings[o]=this.value,n(),p(),Game.UpdateMenu()},u.appendChild(a),u.appendChild(document.createTextNode(" "));const r=document.createElement("label");return r.textContent=i[o].desc,r.style.lineHeight="1.6",u.appendChild(r),u}if("keycode"===i[o].type){const a=document.createElement("input");a.id=`${e}Options${o}Prompt`,a.className="option",a.type="text",a.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o].displayName;const r=document.createElement("a");r.className="option",r.id=`${e}Options${o}`,r.onclick=function(){t(a.outerHTML,[]),l(`${e}Options${o}Prompt`).addEventListener("keyup",(t=>{!function(e,t,o){const a={key:o.key,altKey:o.altKey,ctrlKey:o.ctrlKey,shiftKey:o.shiftKey,displayName:`${o.shiftKey?"Shift + ":""}${o.altKey?"Alt + ":""}${o.ctrlKey?"Ctrl + ":""}${o.key}`};Game.mods.cookieMonsterFramework.saveData[e].settings[t]=a,n()}(e,o,t),Game.ClosePrompt(),Game.UpdateMenu()}))},r.textContent=Game.mods.cookieMonsterFramework.saveData[e].settings[o].displayName,u.appendChild(r);const s=document.createElement("label");return s.textContent=i[o].desc,s.style.lineHeight="1.6",u.appendChild(s),u}return u},createOptionsSubHeader:function(e,t,o){const a=document.createElement("div");a.className="title",a.style.opacity="0.7",a.style.fontSize="17px",a.appendChild(document.createTextNode(`${o} `));const n=document.createElement("span");return n.style.cursor="pointer",n.style.display="inline-block",n.style.height="14px",n.style.width="14px",n.style.borderRadius="7px",n.style.textAlign="center",n.style.backgroundColor="#C0C0C0",n.style.color="black",n.style.fontSize="13px",n.style.verticalAlign="middle",n.textContent=Game.mods.cookieMonsterFramework.saveData[e].headers[t]?"-":"+",n.onclick=function(){i(e,t),Game.UpdateMenu()},a.appendChild(n),a}},G=function(e,t,o){const a=document.createElement("div");a.className="subsection",a.id=`${e}MenuSection`;const n=document.createElement("div");n.className="title",n.style.fontSize="18px",n.innerHTML=t;const r=document.createElement("span");return r.style.cursor="pointer",r.style.display="inline-block",r.style.height="14px",r.style.width="14px",r.style.borderRadius="7px",r.style.textAlign="center",r.style.backgroundColor="#C0C0C0",r.style.color="black",r.style.fontSize="13px",r.style.verticalAlign="middle",r.textContent=Game.mods.cookieMonsterFramework.saveData[e].headers[o]?"-":"+",r.onclick=function(){i(e,o),Game.UpdateMenu()},n.appendChild(r),a.appendChild(n),a},v={createFlash:a,createNotification:function(e,t,o,a){1===Game.mods.cookieMonsterFramework.saveData[e].settings[t]&&"hidden"===document.visibilityState&&!1===window.cookieMonsterFrameworkData.isInitializing&&new Notification(o,{body:a,badge:"https://orteil.dashnet.org/cookieclicker/favicon.ico"})},cookieMonsterPrompt:t,playCMSound:c},w={loadMod:h,saveFramework:n},x=class extends e{constructor(e,t,o,a){super(e,t,o),this.desc=a}},T=class extends e{constructor(e,t,o,a,n,i,r){super(e,t,o),this.label=a,this.desc=n,this.min=i,this.max=r}},S=class extends e{constructor(e,t,o,a,n,i){super(e,t,o),this.label=a,this.desc=n,this.toggle=i}},F=class extends e{constructor(e,t,o,a,n,i,r){super(e,t,o),this.label=a,this.desc=n,this.toggle=i,void 0!==r&&(this.func=r)}},E=class extends e{constructor(e,t,o,a,n){super(e,t,o),this.label=a,this.desc=n;for(let e=0;e<101;e++)this.label[e]=`${e}%`}};function B(){Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerButtons&&Game.elderWrath?(l("PopAllNormalWrinklerButton").style.display="",l("PopFattestWrinklerButton").style.display=""):(l("PopAllNormalWrinklerButton").style.display="none",l("PopFattestWrinklerButton").style.display="none")}let P,N,O,D,L,A,W,j,$,U,H,R,I,z,V,_,X,Q,q,Y,K,J,Z,ee,te,oe,ae,ne,ie,re,se,le,ce,de,me,pe,ue=0,he=0,ge=0,fe=0,ke=0,Ce=0,Me=0,ye=0,be=0,Ge=0,ve=0,we=0,xe=0,Te=0,Se=0,Fe=1,Ee=1,Be=1,Pe=0,Ne=0,Oe=0,De=0,Le={},Ae={},We={},je={},$e=0,Ue=0,He=[0,null],Re=0,Ie=0,ze={},Ve={},_e={},Xe={},Qe={},qe=0,Ye=0,Ke=[],Je=0,Ze=0,et=[],tt=0,ot=0,at=[],nt=0,it=0,rt=[],st=0,lt=0,ct={},dt={},mt=0,pt=0,ut=0,ht=[],gt={},ft=0,kt={0:[0,0,0],1:[0,0,0],2:[0,0,0],3:[0,0,0],4:[0,0,0],5:[0,0,0],6:[0,0,0],7:[0,0,0],8:[0,0,0],9:[0,0,0],10:[0,0,0]},Ct=[],Mt=[],yt=[];function bt(e){let t=0;return Game.dragonAuras[ne].name!==e&&Game.dragonAuras[ie].name!==e||(t=1),("Reality Bending"===Game.dragonAuras[ne].name||"Reality Bending"===Game.dragonAuras[ie].name&&Game.dragonLevel>=Game.dragonAurasBN[e].id+4)&&(t+=.1),t}function Gt(){let e=.25;return e*=1+bt("Earth Shatterer"),e}function vt(e,t){return void 0===de[e]?void 0===t?1:t:de[e]}function wt(e){const t=Mt[e];return(!t||1!==Game.ascensionMode||"prestige"!==t.pool&&"fortune"!==t.tier)&&t?t.bought:0}function xt(e){return Game.dragonAuras[ne].name===e||Game.dragonAuras[ie].name===e}function Tt(e){if(Game.hasGod){void 0===Ct.Temple.minigame&&(Ct.Temple.minigame=Game.Objects.Temple.minigame);const t=Ct.Temple.minigame.gods[e];if(re===t.id)return 1;if(se===t.id)return xt("Supreme Intellect")?1:2;if(le===t.id)return xt("Supreme Intellect")?2:3}return!1}function St(e,t){let o=t;if(wt("Season savings")&&(o*=.99),wt("Santa's dominion")&&(o*=.99),wt("Faberge egg")&&(o*=.99),wt("Divine discount")&&(o*=.99),wt("Fortune #100")&&(o*=.99),o*=1-.02*bt("Fierce Hoarder"),Game.hasBuff("Everything must go")&&(o*=.95),Game.hasBuff("Crafty pixies")&&(o*=.98),Game.hasBuff("Nasty goblins")&&(o*=1.02),e.fortune&&wt(e.fortune.name)&&(o*=.93),o*=vt("buildingCost"),Ct.Temple.minigameLoaded){const e=Tt("creation");1===e?o*=.93:2===e?o*=.95:3===e&&(o*=.98)}return o}function Ft(e,t,o,a,n,i){const r=void 0===i?0:i;let s=n,l=o,c=0;-1===n&&(s=l),n||(s=Game.buyBulk);for(let o=0;o<s;o++){let o=t*Game.priceIncrease**Math.max(0,l-a);o=r?Game.modifyBuildingPrice(e,o):St(e,o),o=Math.ceil(o);const n=r?e.getSellMultiplier():Gt();o=Math.floor(o*n),l>0&&(c+=o,l-=1)}return c}const Et=["","","M","G","T","P","E","Z","Y"],Bt=["","","M","B","Tr","Quadr","Quint","Sext","Sept","Oct","Non","Dec","Undec","Duodec","Tredec","Quattuordec","Quindec","Sexdec","Septendec","Octodec","Novemdec","Vigint","Unvigint","Duovigint","Trevigint","Quattuorvigint"],Pt=["","K","M","B","T","Qa","Qi","Sx","Sp","Oc","No","De","UDe","DDe","TDe","QaDe","QiDe","SxDe","SpDe","ODe","NDe","Vi","UVi","DVi","TVi","QaVi","QiVi","SxVi","SpVi","OVi","NVi","Tr","UTr","DTr","TTr","QaTr","QiTr","SxTr","SpTr","OTr","NTr","Qaa","UQa","DQa","TQa","QaQa","QiQa","SxQa","SpQa","OQa","NQa","Qia","UQi","DQi","TQi","QaQi","QiQi","SxQi","SpQi","OQi","NQi","Sxa","USx","DSx","TSx","QaSx","QiSx","SxSx","SpSx","OSx","NSx","Spa","USp","DSp","TSp","QaSp","QiSp","SxSp","SpSp","OSp","NSp","Oco","UOc","DOc","TOc","QaOc","QiOc","SxOc","SpOc","OOc","NOc","Noa","UNo","DNo","TNo","QaNo","QiNo","SxNo","SpNo","ONo","NNo","Ct","UCt"];let Nt,Ot,Dt,Lt,At,Wt,jt,$t,Ut,Ht,Rt,It,zt,Vt,_t,Xt,Qt,qt=[],Yt=[],Kt=[],Jt={},Zt=Date.now(),eo=Date.now();function to(e,t,o){const a=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleDecimals+1;if(e===1/0)return"Infinity";if(void 0===e)return"0";if(0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale)return Jt.Beautify(e,t);if(Number.isFinite(e)){if(e<0)return`-${to(Math.abs(e))}`;let n="";if(0===e)return e.toString();if(e>.001&&e<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleCutoff)return n=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?e.toLocaleString("nl"):e.toLocaleString("en"),n;if(4===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||4===o)n=e.toExponential(a).toString().replace("e","E");else{const t=e.toExponential().toString(),i=Math.floor(t.slice(t.indexOf("e")+1)/3);n=(e/Number("1e"+3*i)).toFixed(a),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||1===o?e>=.01&&e<Number("1e"+3*Et.length)?n+=` ${Et[i]}`:n=to(e,0,4):2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||2===o?e>=.01&&e<Number("1e"+3*Bt.length)?n+=` ${Bt[i]}`:n=to(e,0,4):3===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||3===o?e>=.01&&e<Number("1e"+3*Pt.length)?n+=` ${Pt[i]}`:n=to(e,0,4):(5===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||5===o)&&(n+="E"+3*i)}return""===n&&(console.log(`Could not beautify number with Cookie Monster Beautify: ${e}`),n=Jt.Beautify(e,t)),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator&&(n=n.replace(".",",")),n}return console.log(`Could not beautify number with Cookie Monster Beautify: ${e}`),Jt.Beautify(e,t)}const oo="CMText",ao="CMBack",no="Blue",io="Green",ro="Yellow",so="Orange",lo="Red",co="Purple",mo="Gray",po="Pink",uo="Brown",ho=[no,io,ro,so,lo,co,po,uo,mo],go=[["GoldCookTooltipPlaceholder","Calculated with Golden Switch off","200px"],["GoldCookDragonsFortuneTooltipPlaceholder","Calculated with Golden Switch off and at least one golden cookie on-screen","240px"],["PrestMaxTooltipPlaceholder","The MAX prestige is calculated with the cookies gained from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and buying Chocolate egg","320px"],["NextPrestTooltipPlaceholder","Calculated with cookies gained from wrinklers and Chocolate egg","200px"],["HeavenChipMaxTooltipPlaceholder","The MAX heavenly chips is calculated with the cookies gained from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and buying Chocolate egg","330px"],["ResetTooltipPlaceholder","The bonus income you would get from new prestige levels unlocked at 100% of its potential and from ascension achievements if you have the same buildings/upgrades after reset","370px"],["ChoEggTooltipPlaceholder","The amount of cookies you would get from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and then buying Chocolate egg","300px"],["ChainNextLevelPlaceholder","Cheated cookies might break this formula","250px"],["FavouriteSettingPlaceholder","Click to set this setting as favourite and show it in 'favourite' settings at the top of the Cookie Monster Settings","250px"]],fo={};let ko,Co=0,Mo=-1,yo=[],bo=function(){},Go=1,vo=1,wo=1;const xo=[10,15,30,60,300,600,900,1800],To=[1,5,10,15,30],So={Frenzy:ro,"Dragon Harvest":uo,"Elder frenzy":io,Clot:lo,"Click frenzy":no,Dragonflight:po};let Fo,Eo,Bo,Po,No,Oo,Do,Lo={},Ao="";function Wo(){let e,t=Game.buyBulk;1===Game.buyMode?vo=t:t=vo,1===t?t=Le:10===t?t=Ae:100===t&&(t=We),l("storeBulk1").style.removeProperty("color"),l("storeBulk10").style.removeProperty("color"),l("storeBulk100").style.removeProperty("color"),1===Game.buyMode?1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BuildColour?(Object.keys(t).forEach((e=>{l(`productPrice${Game.Objects[e].id}`).style.color=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[`Colour${t[e].colour}`]})),l(`storeBulk${ut}`).style.color=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ColourGreen):Object.keys(Game.Objects).forEach((e=>{l(`productPrice${Game.Objects[e].id}`).style.removeProperty("color")})):-1===Game.buyMode&&Object.keys(Le).forEach((e=>{const t=Game.Objects[e];l(`productPrice${t.id}`).style.color="",l(`productPrice${t.id}`).innerHTML=to(Ft(t,t.basePrice,t.amount,t.free,Game.buyBulk,1))})),1===Game.buyMode&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings?1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings?(e=Object.keys(Le).map((e=>{const t={};return t.name=e,t.pp=Le[e].pp,t.colour=Le[e].colour,t})),e.sort(((e,t)=>ho.indexOf(e.colour)===ho.indexOf(t.colour)?e.pp-t.pp:ho.indexOf(e.colour)-ho.indexOf(t.colour)))):2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings?(e=Object.keys(t).map((e=>{const o={};return o.name=e,o.pp=t[e].pp,o.colour=t[e].colour,o})),e.sort(((e,t)=>ho.indexOf(e.colour)===ho.indexOf(t.colour)?e.pp-t.pp:ho.indexOf(e.colour)-ho.indexOf(t.colour)))):3===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings&&(e=Object.keys(je).map((e=>{const t={};return t.name=e,t.id=Game.Objects[e].id,t.amountUntilNext=je[e].AmountNeeded,t.priceUntilNext=je[e].price,t})),e.sort(((e,t)=>e.id-t.id)),e.sort(((e,t)=>(101!==e.amountUntilNext?e.priceUntilNext:1/0)-(101!==t.amountUntilNext?t.priceUntilNext:1/0)))):(e=Object.keys(Le).map((e=>{const t={};return t.name=e,t.id=Game.Objects[e].id,t})),e.sort(((e,t)=>e.id-t.id)));for(let t=0;t<e.length;t++)Game.Objects[e[t].name].l.style.gridRow=`${t+2}/${t+2}`}function jo(){Object.values(document.getElementsByClassName("storeSection")).forEach((e=>{Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpgradesNeverCollapse||"products"===e.id?e.style.height="auto":"vaultUpgrades"===e.id?(e.style.height="",e.style.minHeight="0px"):"upgrades"===e.id?(e.style.height="",e.className.includes("hasMenu")?e.style.minHeight="82px":e.style.minHeight="60px"):(e.style.height="",e.style.minHeight="60px")}))}function $o(){if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour>0){let e=0,t=0,o=0,a=0,n=0,i=0,r=0;Object.keys(Game.UpgradesInStore).forEach((s=>{const c=Game.UpgradesInStore[s];let d=!1;for(let e=0;e<l(`upgrade${s}`).childNodes.length;e+=1)if(-1!==l(`upgrade${s}`).childNodes[e].className.indexOf(ao)){l(`upgrade${s}`).childNodes[e].className=ao+ze[c.name].colour,d=!0;break}if(!d){const e=document.createElement("div");e.style.width="10px",e.style.height="10px",e.className=ao+ze[c.name].colour,l(`upgrade${s}`).appendChild(e)}ze[c.name].colour===no?e+=1:ze[c.name].colour===io?t+=1:ze[c.name].colour===ro?o+=1:ze[c.name].colour===so?a+=1:ze[c.name].colour===lo?n+=1:ze[c.name].colour===co?i+=1:ze[c.name].colour===mo&&(r+=1)})),l("CMUpgradeBarBlue").textContent=e,l("CMUpgradeBarGreen").textContent=t,l("CMUpgradeBarYellow").textContent=o,l("CMUpgradeBarOrange").textContent=a,l("CMUpgradeBarRed").textContent=n,l("CMUpgradeBarPurple").textContent=i,l("CMUpgradeBarGray").textContent=r}const e=[];for(let t=0;t<Game.UpgradesInStore.length;t+=1){const o={};o.name=Game.UpgradesInStore[t].name,o.price=Game.UpgradesInStore[t].basePrice,o.pp=ze[o.name].pp,o.colour=ze[o.name].colour,e.push(o)}Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortUpgrades?e.sort(((e,t)=>ho.indexOf(e.colour)===ho.indexOf(t.colour)?e.pp-t.pp:ho.indexOf(e.colour)-ho.indexOf(t.colour))):e.sort(((e,t)=>e.price-t.price));const t=function(e,t){return e.findIndex((e=>e.name===t.name))};for(let o=0;o<Game.UpgradesInStore.length;o+=1)l(`upgrade${o}`).style.order=t(e,Game.UpgradesInStore[o])+1}function Uo(e,t){let o=e;if(e===1/0)return e;if(e<0)return"Negative time period";o=Math.ceil(e);const a=Math.floor(o/31536e3),n=Math.floor(o%31536e3/86400),i=Math.floor(o%31536e3%86400/3600),r=Math.floor(o%31536e3%86400%3600/60),s=Math.floor(o%31536e3%86400%3600%60);let l="";if(0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat){if(o>7776e5)return t?"Over 9000 days!":">9000d";l+=a>0?a+(t?1===a?" year":" years":"y")+", ":"",(l.length>0||n>0)&&(l+=n+(t?1===n?" day":" days":"d")+", "),(l.length>0||i>0)&&(l+=i+(t?1===i?" hour":" hours":"h")+", "),(l.length>0||r>0)&&(l+=r+(t?1===r?" minute":" minutes":"m")+", "),l+=s+(t?1===s?" second":" seconds":"s")}else if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat){if(o>315576e4)return"XX:XX:XX:XX:XX";l+=(a<10?"0":"")+a+":",l+=(n<10?"0":"")+n+":",l+=(i<10?"0":"")+i+":",l+=(r<10?"0":"")+r+":",l+=(s<10?"0":"")+s}else{if(o>7776e5)return t?"Over 9000 days!":">9000d";a>0?(l+=a+(t?1===a?" year":" years":"y")+", ",l+=n+(t?1===n?" day":" days":"d")):n>0?(l+=n+(t?1===n?" day":" days":"d")+", ",l+=i+(t?1===i?" hour":" hours":"h")):i>0?(l+=i+(t?1===i?" hour":" hours":"h")+", ",l+=r+(t?1===r?" minute":" minutes":"m")):r>0?(l+=r+(t?1===r?" minute":" minutes":"m")+", ",l+=s+(t?1===s?" second":" seconds":"s")):l+=s+(t?1===s?" second":" seconds":"s")}return l}function Ho(e){let t,o;return e<=0?(o=1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat?"00:00:00:00:00":"Done!",t=io):(o=Uo(e),t=e>300?lo:e>60?so:ro),{text:o,colour:t}}function Ro(){return Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CPSMode?X:0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?Game.cookiesPs*(1-Game.cpsSucked):1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?Game.cookiesPs*(Re+(1-.05*Ie)):null!==He[1]&&2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink&&1===Game.wrinklers[He[1]].type?Game.cookiesPs*(3*Re/Ie+(1-.05*Ie)):Game.cookiesPs*(Re/Ie+(1-.05*Ie))}function Io(){return 1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?$e:2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?He[0]:0}function zo(e,t,o){const a=document.createElement("div");a.id=e,a.style.height="12px",a.style.margin="0px 10px",a.style.position="relative";const n=document.createElement("div");n.style.width="100%",n.style.height="10px",n.style.margin="auto",n.style.position="absolute",n.style.left="0px",n.style.top="0px",n.style.right="0px",n.style.bottom="0px";const i=document.createElement("span");i.style.display="inline-block",i.style.textAlign="right",i.style.fontSize="10px",i.style.width="108px",i.style.marginRight="5px",i.style.verticalAlign="text-top",i.textContent=t,n.appendChild(i);for(let e=0;e<o.length;e++){const t=document.createElement("span");t.id=o[e].id,t.style.display="inline-block",t.style.height="10px",t.style.verticalAlign="text-top",t.style.textAlign="center",o.length-1===e&&(t.style.borderTopRightRadius="10px",t.style.borderBottomRightRadius="10px"),void 0!==o[e].colour&&(t.className=ao+o[e].colour),n.appendChild(t)}const r=document.createElement("span");return r.id=`${e}Time`,r.style.marginLeft="5px",r.style.verticalAlign="text-top",n.appendChild(r),a.appendChild(n),a}function Vo(e){if(null!==l("CMBotBar")){const t=l("CMBotBar").firstChild.firstChild.childNodes[0],o=l("CMBotBar").firstChild.firstChild.childNodes[1],a=l("CMBotBar").firstChild.firstChild.childNodes[2],n=l("CMBotBar").firstChild.firstChild.childNodes[3],i=e,r=t.appendChild(document.createElement("td"));r.appendChild(document.createTextNode(`${-1!==i.indexOf(" ")?i.substring(0,i.indexOf(" ")):i} (`)),r.appendChild(document.createElement("span")).className="CMTextBlue",r.appendChild(document.createTextNode(")")),t.lastChild.style.paddingLeft="8px",o.appendChild(document.createElement("td")),o.lastChild.style.paddingLeft="8px",a.appendChild(document.createElement("td")),a.lastChild.style.paddingLeft="8px",n.appendChild(document.createElement("td")),n.lastChild.style.paddingLeft="2px"}}function _o(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar&&Le&&1===Game.buyMode){let e=0;Object.keys(Le).forEach((t=>{let o,a=Game.buyBulk;1===Game.buyMode?Go=a:a=Go,1===a&&(a=Le),10===a&&(a=Ae),100===a&&(a=We),e+=1,l("CMBotBar").firstChild.firstChild.childNodes[0].childNodes[e].childNodes[1].textContent=Game.Objects[t].amount,l("CMBotBar").firstChild.firstChild.childNodes[1].childNodes[e].textContent=to(a[t].bonus,2),l("CMBotBar").firstChild.firstChild.childNodes[2].childNodes[e].className=oo+a[t].colour,o=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime?Uo(Math.round(a[t].pp)):to(Math.round(a[t].pp),2),l("CMBotBar").firstChild.firstChild.childNodes[2].childNodes[e].textContent=o;const n=Ho((Game.Objects[t].bulkPrice-(Game.cookies+Io()))/Ro());l("CMBotBar").firstChild.firstChild.childNodes[3].childNodes[e].className=oo+n.colour,"Done!"===n.text&&Game.cookies<Game.Objects[t].bulkPrice?l("CMBotBar").firstChild.firstChild.childNodes[3].childNodes[e].textContent=`${n.text} (with Wrink)`:l("CMBotBar").firstChild.firstChild.childNodes[3].childNodes[e].textContent=n.text}))}}function Xo(){Game.Background.canvas.width=Game.Background.canvas.parentNode.offsetWidth,Game.Background.canvas.height=Game.Background.canvas.parentNode.offsetHeight,Game.LeftBackground.canvas.width=Game.LeftBackground.canvas.parentNode.offsetWidth,Game.LeftBackground.canvas.height=Game.LeftBackground.canvas.parentNode.offsetHeight,Game.DrawBackground()}function Qo(){1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos?(l("CMBotBar").style.bottom=l("CMTimerBar").style.height,l("game").style.bottom=`${Number(l("CMTimerBar").style.height.replace("px",""))+70}px`):1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar?(l("CMBotBar").style.bottom="0px",l("game").style.bottom="70px"):1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos?l("game").style.bottom=l("CMTimerBar").style.height:l("game").style.bottom="0px",1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos?l("sectionLeft").style.top=l("CMTimerBar").style.height:l("sectionLeft").style.top="",Xo()}function qo(){1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar?l("CMTimerBar").style.display="":l("CMTimerBar").style.display="none",Qo()}function Yo(){ue=Game.dragonAura,he=Game.dragonAura2}function Ko(e){const t=Game.Achievements[e],o={};return o.name=t.name,o}function Jo(e){let t=1;if(Object.keys(e.tieredUpgrades).forEach((o=>{if(!Game.Tiers[e.tieredUpgrades[o].tier].special&&wt(e.tieredUpgrades[o].name)){let a=2;1!==Game.ascensionMode&&wt(e.unshackleUpgrade)&&wt(Game.Tiers[e.tieredUpgrades[o].tier].unshackleUpgrade)&&(a+=1===e.id?.5:.1*(20-e.id)),t*=a}})),Object.keys(e.synergies).forEach((o=>{if(wt(e.synergies[o].name)){const a=e.synergies[o];a.buildingTie1.name===e.name?t*=1+.05*a.buildingTie2.amount:a.buildingTie2.name===e.name&&(t*=1+.001*a.buildingTie1.amount)}})),e.fortune&&wt(e.fortune.name)&&(t*=1.07),e.grandma&&wt(e.grandma.name)&&(t*=1+.01*Ct.Grandma.amount*(1/(e.id-1))),"object"==typeof e.tieredUpgrades.misfortune&&1===e.vanilla&&wt(e.tieredUpgrades.misfortune.name))switch(Game.elderWrath){default:t*=1;break;case 1:t*=1.02;break;case 2:t*=1.04;break;case 3:t*=1.06}return t}function Zo(e){const t=Game.Objects[e],o={};return"Cursor"===t.name?o.cps=function(e){let t=0;wt("Thousand fingers")&&(t+=.1),wt("Million fingers")&&(t*=5),wt("Billion fingers")&&(t*=10),wt("Trillion fingers")&&(t*=20),wt("Quadrillion fingers")&&(t*=20),wt("Quintillion fingers")&&(t*=20),wt("Sextillion fingers")&&(t*=20),wt("Septillion fingers")&&(t*=20),wt("Octillion fingers")&&(t*=20),wt("Nonillion fingers")&&(t*=20),wt("Decillion fingers")&&(t*=20),wt("Undecillion fingers")&&(t*=20),wt("Unshackled cursors")&&(t*=25);let o=1,a=0;return Object.keys(Ct).forEach((e=>{"Cursor"!==Ct[e].name&&(a+=Ct[e].amount)})),t*=a,o*=Jo(e),o*=Game.magicCpS("Cursor"),o*=vt("cursorCps"),Game.ComputeCps(.1,wt("Reinforced index finger")+wt("Carpal tunnel prevention cream")+wt("Ambidextrous"),t)*o}:"Grandma"===t.name?o.cps=function(e){let o=1;if(Object.keys(Game.GrandmaSynergies).forEach((e=>{wt(Game.GrandmaSynergies[e])&&(o*=2)})),wt("Bingo center/Research facility")&&(o*=4),wt("Ritual rolling pins")&&(o*=2),wt("Naughty list")&&(o*=2),wt("Elderwort biscuits")&&(o*=1.02),o*=vt("grandmaCps"),wt("Cat ladies"))for(let e=0;e<Game.UpgradesByPool.kitten.length;e++)wt(Game.UpgradesByPool.kitten[e].name)&&(o*=1.29);o*=Jo(e);let a=0;wt("One mind")&&(a+=.02*Ct.Grandma.amount),wt("Communal brainsweep")&&(a+=.02*Ct.Grandma.amount),wt("Elder Pact")&&(a+=.05*Ct.Portal.amount);let n=0;return Object.keys(Ct).forEach((e=>{"Grandma"!==Ct[e].name&&(n+=Ct[e].amount)})),o*=1+.01*bt("Elder Battalion")*n,o*=Game.magicCpS(t.name),(t.baseCps+a)*o}:o.cps=function(e){let t=1;return t*=Jo(e),t*=Game.magicCpS(e.name),e.baseCPS*t},o.baseCps=t.baseCps,o.name=t.name,o.tieredUpgrades=t.tieredUpgrades,o.synergies=t.synergies,o.fortune=t.fortune,o.grandma=t.grandma,o.baseCPS=t.baseCps,o.id=t.id,o.vanilla=t.vanilla,o.unshackleUpgrade=t.unshackleUpgrade,o}function ea(e){const t=Game.Upgrades[e],o={};return o.power=t.power,"function"==typeof o.power&&("Sugar crystal cookies"===t.name?o.power=function(){let e=5;return Object.keys(Ct).forEach((t=>{Ct[t].level>=10&&(e+=1)})),e}:o.power=function(){let e=2;if(wt("Starlove")&&(e=3),Game.hasGod){const t=Tt("seasons");1===t?e*=1.3:2===t?e*=1.2:3===t&&(e*=1.1)}return e}),o.pool=t.pool,o.name=t.name,o}function ta(){Z=Game.UpgradesOwned,ee=Game.pledges,te=Game.AchievementsOwned,oe=Game.heavenlyPower,ae=Game.prestige,Object.keys(Game.Objects).forEach((e=>{const t=Game.Objects[e];let o=Ct[e];void 0===o&&(Ct[e]=Zo(e),o=Ct[e],Vo(e)),o.amount=t.amount,o.level=t.level,o.totalCookies=t.totalCookies,o.basePrice=t.basePrice,o.free=t.free,t.minigameLoaded&&("Temple"===t.name&&(re=t.minigame.slot[0],se=t.minigame.slot[1],le=t.minigame.slot[2]),o.minigameLoaded=t.minigameLoaded,o.minigame=t.minigame),Ct[e]=o})),Object.keys(Game.Upgrades).forEach((e=>{const t=Game.Upgrades[e];let o=Mt[e];void 0===o&&(Mt[e]=ea(e),o=Mt[e]),o.bought=t.bought,Mt[e]=o})),Object.keys(Game.Achievements).forEach((e=>{const t=Game.Achievements[e];let o=yt[e];void 0===o&&(yt[e]=Ko(e),o=yt[e]),o.won=t.won,yt[e]=o})),Yo(),ne=ue,ie=he}function oa(e){const t=document.createElement("div");return t.style.fontWeight="bold",t.id=`${e}Title`,t.className="CMTextBlue",t.textContent=e,t}function aa(e){e.appendChild(oa("Bonus Income"));const t=document.createElement("div");t.style.marginBottom="4px",t.style.color="white",t.id="CMTooltipIncome",e.appendChild(t),e.appendChild(oa("Bonus Cookies per Click")),e.lastChild.style.display="none";const o=document.createElement("div");o.style.marginBottom="4px",o.style.color="white",o.style.display="none",o.id="CMTooltipCookiePerClick",e.appendChild(o),e.appendChild(oa("Payback Period"));const a=document.createElement("div");a.style.marginBottom="4px",a.id="CMTooltipPP",e.appendChild(a),e.appendChild(oa("Time Left"));const n=document.createElement("div");if(n.id="CMTooltipTime",e.appendChild(n),"b"===Bo){e.appendChild(oa("Production left till next achievement")),e.lastChild.id="CMTooltipProductionLeftHeader";const t=document.createElement("div");t.id="CMTooltipProductionLeft",e.appendChild(t)}if("b"===Bo){e.appendChild(oa("Buildings (price / PP) left till next achievement")),e.lastChild.id="CMTooltipNextAchievementHeader";const t=document.createElement("div");t.id="CMTooltipNextAchievement",e.appendChild(t)}}function na(e,t){let o="";return o=e.pp<=0||e.pp===1/0?mo:e.pp<pt?no:e.pp===pt?io:e.pp<ht[10][0]?ro:e.pp<ht[20][0]?so:e.pp<ht[30][0]?lo:co,0!==Number(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPSecondsLowerLimit)&&t/Ro()<Number(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPSecondsLowerLimit)&&(o=no),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPOnlyConsiderBuyable&&t-Game.cookies>0&&(o=lo),o}function ia(){let e=1;return Object.keys(Game.buffs).forEach((t=>{void 0!==Game.buffs[t].multCpS&&(e*=Game.buffs[t].multCpS)})),e}function ra(e){yt[e]&&0===yt[e].won&&(yt[e].won=1,"shadow"!==Game.Achievements[e].pool&&(te+=1))}function sa(){me=0;let e=1;const t={};Object.keys(Game.Objects).forEach((e=>{if(Game.Objects[e].minigameLoaded&&Game.Objects[e].minigame.effs){const o=Game.Objects[e].minigame.effs;Object.keys(o).forEach((e=>{t[e]?t[e]*=o[e]:t[e]=o[e]}))}})),de=t,1!==Game.ascensionMode&&(e+=.01*parseFloat(ae)*oe*function(){let e=0;if(wt("Heavenly chip secret")&&(e+=.05),wt("Heavenly cookie stand")&&(e+=.2),wt("Heavenly bakery")&&(e+=.25),wt("Heavenly confectionery")&&(e+=.25),wt("Heavenly key")&&(e+=.25),e*=1+.05*bt("Dragon God"),wt("Lucky digit")&&(e*=1.01),wt("Lucky number")&&(e*=1.01),wt("Lucky payout")&&(e*=1.01),Game.hasGod){const t=Tt("creation");1===t?e*=.7:2===t?e*=.8:3===t&&(e*=.9)}return e}()),e*=vt("cps"),wt("Heralds")&&1!==Game.ascensionMode&&(e*=1+.01*Game.heralds),Object.keys(Game.cookieUpgrades).forEach((t=>{const o=Game.cookieUpgrades[t];wt(o.name)&&("function"==typeof o.power?e*=1+.01*Mt[o.name].power(Mt[o.name]):e*=1+.01*o.power)})),wt("Specialized chocolate chips")&&(e*=1.01),wt("Designer cocoa beans")&&(e*=1.02),wt("Underworld ovens")&&(e*=1.03),wt("Exotic nuts")&&(e*=1.04),wt("Arcane sugar")&&(e*=1.05),wt("Increased merriness")&&(e*=1.15),wt("Improved jolliness")&&(e*=1.15),wt("A lump of coal")&&(e*=1.01),wt("An itchy sweater")&&(e*=1.01),wt("Santa's dominion")&&(e*=1.2),wt("Fortune #100")&&(e*=1.01),wt("Fortune #101")&&(e*=1.07),wt("Dragon scale")&&(e*=1.03);let o=1;if(Tt){let t=Tt("asceticism");1===t?e*=1.15:2===t?e*=1.1:3===t&&(e*=1.05),t=Tt("ages"),1===t?e*=1+.15*Math.sin(Zt/1e3/10800*Math.PI*2):2===t?e*=1+.15*Math.sin(Zt/1e3/43200*Math.PI*2):3===t&&(e*=1+.15*Math.sin(Zt/1e3/86400*Math.PI*2)),t=Tt("decadence"),1===t?o*=.93:2===t?o*=.95:3===t&&(o*=.98),t=Tt("industry"),1===t?o*=1.1:2===t?o*=1.06:3===t&&(o*=1.03),t=Tt("labor"),1===t?o*=.97:2===t?o*=.98:3===t&&(o*=.99)}wt("Santa's legacy")&&(e*=1+.03*(Game.santaLevel+1));const a=te/25;let n=1;if(wt("Santa's milk and cookies")&&(n*=1.05),n*=1+.05*bt("Breath of Milk"),Tt){const e=Tt("mother");1===e?n*=1.1:2===e?n*=1.05:3===e&&(n*=1.03)}n*=vt("milk");let i=1;wt("Kitten helpers")&&(i*=1+.1*a*n),wt("Kitten workers")&&(i*=1+.125*a*n),wt("Kitten engineers")&&(i*=1+.15*a*n),wt("Kitten overseers")&&(i*=1+.175*a*n),wt("Kitten managers")&&(i*=1+.2*a*n),wt("Kitten accountants")&&(i*=1+.2*a*n),wt("Kitten specialists")&&(i*=1+.2*a*n),wt("Kitten experts")&&(i*=1+.2*a*n),wt("Kitten consultants")&&(i*=1+.2*a*n),wt("Kitten assistants to the regional manager")&&(i*=1+.175*a*n),wt("Kitten marketeers")&&(i*=1+.15*a*n),wt("Kitten analysts")&&(i*=1+.125*a*n),wt("Kitten executives")&&(i*=1+.115*a*n),wt("Kitten admins")&&(i*=1+.11*a*n),wt("Kitten strategists")&&(i*=1+.105*a*n),wt("Kitten angels")&&(i*=1+.1*a*n),wt("Fortune #103")&&(i*=1+.05*a*n),Object.keys(Ct).forEach((e=>{const t=Ct[e];let i=t.cps(t);1!==Game.ascensionMode&&(i*=(1+.01*t.level)*o),"Grandma"===t.name&&wt("Milkhelp® lactose intolerance relief tablets")&&(i*=1+.05*a*n),me+=t.amount*i})),wt('"egg"')&&(me+=9),e*=i;let r=1;if(wt("Chicken egg")&&(r*=1.01),wt("Duck egg")&&(r*=1.01),wt("Turkey egg")&&(r*=1.01),wt("Quail egg")&&(r*=1.01),wt("Robin egg")&&(r*=1.01),wt("Ostrich egg")&&(r*=1.01),wt("Cassowary egg")&&(r*=1.01),wt("Salmon roe")&&(r*=1.01),wt("Frogspawn")&&(r*=1.01),wt("Shark egg")&&(r*=1.01),wt("Turtle egg")&&(r*=1.01),wt("Ant larva")&&(r*=1.01),wt("Century egg")){let e=10*Math.floor((eo-Game.startDate)/1e3/10)/60/60/24;e=Math.min(e,100),Ne=1+.1*(1-(1-e/100)**3),r*=Ne}e*=r,wt("Sugar baking")&&(e*=1+.01*Math.min(100,Game.lumps)),e*=1+bt("Radiant Appetite");const s=me*e;Object.keys(Game.CpsAchievements).forEach((e=>{s>=Game.CpsAchievements[e].threshold&&ra(Game.CpsAchievements[e].name)})),pe=s;const{n:l}=Game.shimmerTypes.golden,c=bt("Dragon's Fortune");for(let t=0;t<l;t++)e*=1+1.23*c;const d=Game.bakeryName.toLowerCase();if("orteil"===d?e*=.99:"ortiel"===d&&(e*=.98),wt("Elder Covenant")&&(e*=.95),wt("Golden switch [off]")){let t=1.5;if(wt("Residual luck")){const e=Game.goldenCookieUpgrades;Object.keys(e).forEach((o=>{wt(e[o])&&(t+=.1)}))}e*=t}if(wt("Shimmering veil [off]")){let t=.5;wt("Reinforced membrane")&&(t+=.1),wt("Delicate touch")&&(t+=.05),wt("Steadfast murmur")&&(t+=.05),wt("Glittering edge")&&(t+=.05),e*=1+t}wt("Magic shenanigans")&&(e*=1e3),wt("Occult obstruction")&&(e*=0),me=Game.runModHookOnValue("cps",me),e*=ia(),me*=e}const la=["Fortune #001","Fortune #002","Fortune #003","Fortune #004","Fortune #005","Fortune #006","Fortune #007","Fortune #008","Fortune #009","Fortune #010","Fortune #011","Fortune #012","Fortune #013","Fortune #014","Fortune #015","Fortune #016","Fortune #017","Fortune #018","Fortune #019","Fortune #020","Fortune #100","Fortune #101","Fortune #102","Fortune #103","Fortune #104"],ca=["Skull cookies","Ghost cookies","Bat cookies","Slime cookies","Pumpkin cookies","Eyeball cookies","Spider cookies"],da=["Christmas tree biscuits","Snowflake biscuits","Snowman biscuits","Holly biscuits","Candy cane biscuits","Bell biscuits","Present biscuits"],ma=["Pure heart biscuits","Ardent heart biscuits","Sour heart biscuits","Weeping heart biscuits","Golden heart biscuits","Eternal heart biscuits","Prism heart biscuits"],pa=["Elderwort biscuits","Bakeberry cookies","Duketater cookies","Green yeast digestives","Wheat slims","Fern tea","Ichor syrup"];function ua(e){return yt[e]?yt[e].won:0}function ha(){let e=0;Object.keys(Game.GrandmaSynergies).forEach((t=>{wt(Game.GrandmaSynergies[t])&&(e+=1)})),!ua("Elder")&&e>=7&&ra("Elder"),!ua("Veteran")&&e>=14&&ra("Veteran");let t=0,o=1,a=1,n=1e5;Object.keys(Ct).forEach((e=>{t+=Ct[e].amount,n=Math.min(Ct[e].amount,n),ua("Mathematician")||Ct[e].amount<Math.min(128,2**(Game.ObjectsById.length-Game.Objects[e].id-1))&&(o=0),ua("Base 10")||Ct[e].amount<10*(Game.ObjectsById.length-Game.Objects[e].id)&&(a=0)})),n>=1&&ra("One with everything"),1===o&&ra("Mathematician"),1===a&&ra("Base 10"),n>=100&&ra("Centennial"),n>=150&&ra("Centennial and a half"),n>=200&&ra("Bicentennial"),n>=250&&ra("Bicentennial and a half"),n>=300&&ra("Tricentennial"),n>=350&&ra("Tricentennial and a half"),n>=400&&ra("Quadricentennial"),n>=450&&ra("Quadricentennial and a half"),n>=500&&ra("Quincentennial"),n>=550&&ra("Quincentennial and a half"),n>=600&&ra("Sexcentennial"),n>=650&&ra("Sexcentennial and a half"),n>=700&&ra("Septcentennial"),t>=100&&ra("Builder"),t>=500&&ra("Architect"),t>=1e3&&ra("Engineer"),t>=2500&&ra("Lord of Constructs"),t>=5e3&&ra("Grand design"),t>=7500&&ra("Ecumenopolis"),t>=1e4&&ra("Myriad"),Z>=20&&ra("Enhancer"),Z>=50&&ra("Augmenter"),Z>=100&&ra("Upgrader"),Z>=200&&ra("Lord of Progress"),Z>=300&&ra("The full picture"),Z>=400&&ra("When there's nothing left to add"),Z>=500&&ra("Kaizen"),Z>=600&&ra("Beyond quality"),Z>=700&&ra("Oft we mar what's well"),t>=4e3&&Z>=300&&ra("Polymath"),t>=8e3&&Z>=400&&ra("Renaissance baker"),Ct.Cursor.amount+Ct.Grandma.amount>=777&&ra("The elder scrolls");let i=!0;Object.keys(ca).forEach((e=>{wt(ca[e])||(i=!1)})),i&&ra("Spooky cookies");let r=!0;if(Object.keys(da).forEach((e=>{wt(da[e])||(r=!1)})),r&&ra("Let it snow"),wt("Fortune cookies")){const e=Game.Tiers.fortune.upgrades;let t=0;Object.keys(e).forEach((o=>{wt(e[o].name)&&(t+=1)})),t>=e.length&&ra("O Fortuna")}}function ga(e,t){ta(),Ct[e].amount+=t;const o=Ct[e];"Cursor"===e?(o.amount>=1&&ra("Click"),o.amount>=2&&ra("Double-click"),o.amount>=50&&ra("Mouse wheel"),o.amount>=100&&ra("Of Mice and Men"),o.amount>=200&&ra("The Digital"),o.amount>=300&&ra("Extreme polydactyly"),o.amount>=400&&ra("Dr. T"),o.amount>=500&&ra("Thumbs, phalanges, metacarpals"),o.amount>=600&&ra("With her finger and her thumb"),o.amount>=700&&ra("Gotta hand it to you"),o.amount>=800&&ra("The devil's workshop"),o.amount>=900&&ra("All on deck"),o.amount>=1e3&&ra("A round of applause")):Object.keys(Game.Objects[o.name].tieredAchievs).forEach((e=>{o.amount>=Game.Tiers[Game.Objects[o.name].tieredAchievs[e].tier].achievUnlock&&ra(Game.Objects[o.name].tieredAchievs[e].name)}));const a=te;return sa(),ha(),a!==te&&sa(),me-Game.cookiesPs}function fa(e,t,o){let a=e,n=0;for(;a<o;)a+=.002*Math.max(.002,(a/Math.max(t,100))**.5),n+=1;return n/Game.fps}function ka(){null!==l("CMDispTooltipWarningParent")&&(0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos?(l("CMDispTooltipWarningParent").style.top="auto",l("CMDispTooltipWarningParent").style.margin="4px -4px",l("CMDispTooltipWarningParent").style.padding="3px 4px"):(l("CMDispTooltipWarningParent").style.right="auto",l("CMDispTooltipWarningParent").style.margin="4px",l("CMDispTooltipWarningParent").style.padding="4px 3px"))}function Ca(){if(ta(),"none"!==l("tooltipAnchor").style.display&&l("CMTooltipArea")){l("CMTooltipArea").innerHTML="";const e=function(){l("tooltip").firstChild.style.paddingBottom="4px";const e=document.createElement("div");return e.style.border="1px solid",e.style.padding="4px",e.style.margin="0px -4px",e.id="CMTooltipBorder",e.className="CMTextGray",e}();l("CMTooltipArea").appendChild(e),"b"===Bo?function(){let e;if(1===Game.buyMode?wo=e:e=wo,1===Game.buyBulk?e=Le:10===Game.buyBulk?e=Ae:100===Game.buyBulk&&(e=We),Fo=Game.Objects[Po].bulkPrice,Eo=e[Po].bonus,1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade&&1===Game.buyMode){if(aa(l("CMTooltipBorder")),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade&&1===Game.buyMode){l("CMTooltipIncome").textContent=to(Eo,2);const t=Math.round(Eo/Game.cookiesPs*1e4);Number.isFinite(t)&&0!==t?l("CMTooltipIncome").textContent+=` (${t/100}% of income)`:l("CMTooltipIncome").textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`,l("CMTooltipBorder").className=oo+e[Po].colour,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime?l("CMTooltipPP").textContent=Uo(e[Po].pp):l("CMTooltipPP").textContent=to(e[Po].pp,2),l("CMTooltipPP").className=oo+e[Po].colour;const o=Ho((Fo-(Game.cookies+Io()))/Ro());l("CMTooltipTime").textContent=o.text,"Done!"===o.text&&Game.cookies<e[Po].price?l("CMTooltipTime").textContent=`${o.text} (with Wrink)`:l("CMTooltipTime").textContent=o.text,l("CMTooltipTime").className=oo+o.colour}l("CMTooltipProductionLeftHeader").style.display="none",l("CMTooltipTime").style.marginBottom="0px";for(const e of Object.keys(Game.Objects[Po].productionAchievs))if(!Game.HasAchiev(Game.Objects[Po].productionAchievs[e].achiev.name)){const t=Game.Objects[Po].productionAchievs[e];l("CMTooltipTime").style.marginBottom="4px",l("CMTooltipProductionLeftHeader").style.display="",l("CMTooltipProductionLeft").className=`ProdAchievement${Po}`,l("CMTooltipProductionLeft").textContent=to(t.pow-Ct[Po].totalCookies,15),l("CMTooltipProductionLeft").style.color="white";break}const t=je[Po];if(t.AmountNeeded<101){let e;l("CMTooltipProductionLeft").style.marginBottom="4px",l("CMTooltipNextAchievementHeader").style.display="",e=Game.cookiesPs?Math.max(t.price-(Game.cookies+Io()),0)/Game.cookiesPs+t.price/ga(Po,t.AmountNeeded):t.price/ga(Po,t.AmountNeeded),l("CMTooltipNextAchievement").textContent=`${to(t.AmountNeeded)} / ${to(t.price)} / `,l("CMTooltipNextAchievement").style.color="white";const o=document.createElement("span");Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime?o.textContent=Uo(e):o.textContent=to(e),o.className=oo+na({pp:e},t.price),l("CMTooltipNextAchievement").appendChild(o)}else l("CMTooltipNextAchievementHeader").style.display="none",l("CMTooltipProductionLeft").style.marginBottom="0px"}else l("CMTooltipArea").style.display="none"}():"u"===Bo?function(){if(aa(l("CMTooltipBorder")),Eo=ze[Game.UpgradesInStore[Po].name].bonus,Fo=Game.Upgrades[Game.UpgradesInStore[Po].name].getPrice(),No=ze[Game.UpgradesInStore[Po].name].bonusMouse,1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade){l("CMTooltipIncome").textContent=to(Eo,2);const e=Math.round(Eo/Game.cookiesPs*1e4);"0"===l("CMTooltipIncome").textContent?(l("Bonus IncomeTitle").style.display="none",l("CMTooltipIncome").style.display="none",l("Payback PeriodTitle").style.display="none",l("CMTooltipPP").style.display="none"):(Number.isFinite(e)&&0!==e?l("CMTooltipIncome").textContent+=` (${e/100}% of income)`:l("CMTooltipIncome").textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`,l("CMTooltipBorder").className=oo+ze[Game.UpgradesInStore[Po].name].colour),No&&(l("CMTooltipCookiePerClick").textContent=to(No),l("CMTooltipCookiePerClick").style.display="block",l("CMTooltipCookiePerClick").previousSibling.style.display="block"),!Eo&&No?(l("CMTooltipPP").textContent=`${to(Fo/No)} Clicks`,l("CMTooltipPP").style.color="white",l("Payback PeriodTitle").style.display="block",l("CMTooltipPP").style.display="block"):(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime?l("CMTooltipPP").textContent=Uo(ze[Game.UpgradesInStore[Po].name].pp):l("CMTooltipPP").textContent=to(ze[Game.UpgradesInStore[Po].name].pp,2),l("CMTooltipPP").className=oo+ze[Game.UpgradesInStore[Po].name].colour);const t=Ho((Fo-(Game.cookies+Io()))/Ro());if(l("CMTooltipTime").textContent=t.text,"Done!"===t.text&&Game.cookies<Game.UpgradesInStore[Po].getPrice()?l("CMTooltipTime").textContent=`${t.text} (with Wrink)`:l("CMTooltipTime").textContent=t.text,l("CMTooltipTime").className=oo+t.colour,"Chocolate egg"===Game.UpgradesInStore[Po].name){l("CMTooltipBorder").lastChild.style.marginBottom="4px",l("CMTooltipBorder").appendChild(oa("Cookies to be gained (Currently/Max)"));const e=document.createElement("div");e.style.color="white",e.textContent=`${to(.05*Game.cookies)} / ${to(De)}`,l("CMTooltipBorder").appendChild(e)}}else l("CMTooltipArea").style.display="none"}():"s"===Bo?function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipLump){const t=l("CMTooltipBorder");t.appendChild(oa("Current Sugar Lump"));const o=document.createElement("div");o.id="CMTooltipTime",t.appendChild(o);const a=0===(e=Game.lumpCurrentType)?{text:"Normal",colour:mo}:1===e?{text:"Bifurcated",colour:io}:2===e?{text:"Golden",colour:ro}:3===e?{text:"Meaty",colour:so}:4===e?{text:"Caramelized",colour:co}:{text:"Unknown Sugar Lump",colour:lo};o.textContent=a.text,o.className=oo+a.colour}else l("CMTooltipArea").style.display="none";var e}():"g"===Bo?function(){const{minigame:e}=Game.Objects["Wizard tower"],t=e.getSpellCost(e.spellsById[Po]);if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipGrim&&t<=e.magicM){const o=l("CMTooltipBorder");o.appendChild(oa("Time Left"));const a=document.createElement("div");a.id="CMTooltipTime",o.appendChild(a);const n=Ho(fa(e.magic,e.magicM,t));if(a.textContent=n.text,a.className=oo+n.colour,t<=e.magic){o.appendChild(oa("Recover Time"));const a=document.createElement("div");a.id="CMTooltipRecover",o.appendChild(a);const n=Ho(fa(Math.max(0,e.magic-t),e.magicM,e.magic));a.textContent=n.text,a.className=oo+n.colour}if("0"===Po){o.appendChild(oa("Cookies to be gained/lost"));const e=document.createElement("div");e.id="x",o.appendChild(e);const t=document.createElement("span");t.style.color="#33FF00",t.textContent=to(Math.max(Math.min(.15*Game.cookies,60*Game.cookiesPs*30),7),2),e.appendChild(t);const a=document.createElement("span");a.textContent=" / ",e.appendChild(a);const n=document.createElement("span");n.style.color="red",n.textContent=to(Math.min(Game.cookies,Math.min(.15*Game.cookies,60*Game.cookiesPs*15)+13),2),e.appendChild(n)}l("CMTooltipArea").appendChild(o)}else l("CMTooltipArea").style.display="none"}():"p"===Bo?function(){const{minigame:e}=Game.Objects.Farm;if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipPlots&&0!==e.plot[Po[1]][Po[0]][0]){const t=e.plot[Po[1]][Po[0]][1]>e.plantsById[e.plot[Po[1]][Po[0]][0]-1].mature,o=e.plantsById[e.plot[Po[1]][Po[0]][0]-1].name;l("CMTooltipBorder").appendChild(oa("Reward (Current / Maximum)"));const a=document.createElement("div");a.id="CMTooltipPlantReward",l("CMTooltipBorder").appendChild(a),"Chocoroot"===o||"White chocoroot"===o?l("CMTooltipPlantReward").textContent=`${t?to(Math.min(.03*Game.cookies,60*Game.cookiesPs*3)):"0"} / ${to(60*Game.cookiesPs*3)}`:"Bakeberry"===o?l("CMTooltipPlantReward").textContent=`${t?to(Math.min(.03*Game.cookies,60*Game.cookiesPs*30)):"0"} / ${to(60*Game.cookiesPs*30)}`:"Queenbeet"===o?l("CMTooltipPlantReward").textContent=`${t?to(Math.min(.04*Game.cookies,60*Game.cookiesPs*60)):"0"} / ${to(60*Game.cookiesPs*60)}`:"Duketater"===o?l("CMTooltipPlantReward").textContent=`${t?to(Math.min(.08*Game.cookies,60*Game.cookiesPs*120)):"0"} / ${to(60*Game.cookiesPs*120)}`:l("CMTooltipArea").style.display="none"}else l("CMTooltipArea").style.display="none"}():"ha"===Bo?function(){const{minigame:e}=Game.Objects.Farm;if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipLump){l("CMTooltipBorder").appendChild(oa("Cookies gained from harvesting:"));let t=0,o=0;Game.keys[16]&&Game.keys[17]&&(o=1);for(let a=0;a<6;a++)for(let n=0;n<6;n++)if(e.plot[a][n][0]>=1){const i=e.plot[a][n],r=e.plantsById[i[0]-1],s=r.name;let l=!0;o&&r.immortal&&(l=!1),i[1]<r.matureBase&&(l=!1),l&&"Bakeberry"===s?t+=Math.min(.03*Game.cookies,60*Game.cookiesPs*30):l&&"Chocoroot"===s||"White chocoroot"===s?t+=Math.min(.03*Game.cookies,60*Game.cookiesPs*3):l&&"Queenbeet"===s?t+=Math.min(.04*Game.cookies,60*Game.cookiesPs*60):l&&"Duketater"===s&&(t+=Math.min(.08*Game.cookies,60*Game.cookiesPs*120))}l("CMTooltipBorder").appendChild(document.createTextNode(to(t)))}else l("CMTooltipArea").style.display="none"}():"sm"===Bo?function(){const{minigame:e}=Game.Objects.Bank;if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipStocks){const t=l("CMTooltipBorder"),o=e.goodsById[Po];t.appendChild(oa("Current Mode"));const a=document.createElement("div");a.id="CMTooltipMode",t.appendChild(a);const n=o.mode,i=["Stable","Slow Rise","Slow Fall","Fast Rise","Fast Fall","Chaotic"];a.textContent=i[n];const r=[mo,ro,so,io,lo,co];a.className=oo+r[n],t.appendChild(oa("Delta"));const s=document.createElement("div");s.id="CMTooltipDelta",t.appendChild(s),s.textContent=to(o.d);const c=o.d<0?lo:io;s.className=oo+c,t.appendChild(oa("Resting Value"));const d=document.createElement("div");d.id="CMTooltipRestingValue",t.appendChild(d),d.textContent=`$${to(e.getRestingVal(o.id))}`,d.style.color="white",t.appendChild(oa("Expected Next Value"));const m=document.createElement("div");m.id="CMTooltipExpectedValue",t.appendChild(m);const p=function(e,t,o,a,n,i){let r=e,s=t;switch(s*=.97+.01*Game.auraMult("Supreme Intellect"),a){case 0:s*=.95;break;case 1:s*=.99,s+=.02;break;case 2:s*=.99,s-=.02;break;case 3:s+=.06,r+=2.5;break;case 4:s-=.06,r-=2.5}return r+=.01*(o-r),3===a&&(r-=.582),4===a&&(r+=.6),r>100+3*(n-1)&&s>0&&(s*=.9),r<5&&(r+=.5*(5-r)),r<5&&s<0&&(s*=.95),Math.max(r+s,1)}(o.val,o.d,e.getRestingVal(o.id),o.mode,Game.Objects.Bank.level);m.textContent="$"+to(p)+(p<o.val?"▼":"▲");const u=p<o.val?lo:io;m.className=oo+u,l("CMTooltipArea").appendChild(t)}else l("CMTooltipArea").style.display="none"}():"wb"===Bo?function(){l("tooltip").innerHTML="",l("tooltip").appendChild(oa("Reward:"));const e=document.createElement("div");e.id="CMWrinklerReward","PopAllNormal"===Po?e.textContent=to(Ue):"PopFattest"===Po&&(e.textContent=to(He[0])),l("tooltip").appendChild(e)}():("pag"===Bo||"pas"===Bo&&-1!==Po[1])&&function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipPantheon){const e=l("CMTooltipBorder");let t;t="pas"===Bo?Po[1]:Po,e.appendChild(oa("Effect in position 1:"));const o=document.createElement("div");if(o.id="CMPantheonTooltipPosition1",0!==kt[t][0]){o.textContent=to(kt[t][0]);const e=Math.round(kt[t][0]/Game.cookiesPs*1e4);Number.isFinite(e)&&0!==e?o.textContent+=` (${e/100}% of income)`:o.textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`}else o.textContent="No effect to CPS";e.appendChild(o),e.appendChild(oa("Effect in position 2:"));const a=document.createElement("div");if(a.id="CMPantheonTooltipPosition2",0!==kt[t][1]){a.textContent=to(kt[t][1]);const e=Math.round(kt[t][1]/Game.cookiesPs*1e4);Number.isFinite(e)&&0!==e?a.textContent+=` (${e/100}% of income)`:a.textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`}else a.textContent="No effect to CPS";e.appendChild(a),e.appendChild(oa("Effect in position 3:"));const n=document.createElement("div");if(n.id="CMPantheonTooltipPosition2",0!==kt[t][2]){n.textContent=to(kt[t][2]);const e=Math.round(kt[t][2]/Game.cookiesPs*1e4);Number.isFinite(e)&&0!==e?n.textContent+=` (${e/100}% of income)`:n.textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`}else n.textContent="No effect to CPS";e.appendChild(n),l("CMTooltipArea").appendChild(e)}else l("CMTooltipArea").style.display="none"}(),function(){if("b"===Bo||"u"===Bo){null===document.getElementById("CMDispTooltipWarningParent")&&(l("tooltipAnchor").appendChild(function(){const e=document.createElement("div");e.style.position="absolute",e.style.display="block",e.style.left="auto",e.style.bottom="auto",e.id="CMDispTooltipWarningParent";const t=function(e,t,o,a,n){const i=document.createElement("div");i.id=e,i.style.display="none",i.style.transition="opacity 0.1s ease-out",i.className="CMBorder"+t,i.style.padding="2px",i.style.background="#000 url(img/darkNoise.png)";const r=document.createElement("div");i.appendChild(r);const s=document.createElement("span");s.className=oo+t,s.style.fontWeight="bold",s.textContent=o,r.appendChild(s),r.appendChild(document.createTextNode(a));const l=document.createElement("div");i.appendChild(l);const c=document.createElement("span");return c.id=n,l.appendChild(document.createTextNode("Deficit: ")),l.appendChild(c),i};return e.appendChild(t("CMDispTooltipWarnLucky",lo,"Warning: ",'Purchase of this item will put you under the number of Cookies required for "Lucky!"',"CMDispTooltipWarnLuckyText")),e.firstChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnLuckyFrenzy",ro,"Warning: ",'Purchase of this item will put you under the number of Cookies required for "Lucky!" (Frenzy)',"CMDispTooltipWarnLuckyFrenzyText")),e.lastChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnConjure",co,"Warning: ",'Purchase of this item will put you under the number of Cookies required for "Conjure Baked Goods"',"CMDispTooltipWarnConjureText")),e.lastChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnConjureFrenzy",co,"Warning: ",'Purchase of this item will put you under the number of Cookies required for "Conjure Baked Goods" (Frenzy)',"CMDispTooltipWarnConjureFrenzyText")),e.lastChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnEdifice",co,"Warning: ",'Purchase of this item will put you under the number of Cookies needed for "Spontaneous Edifice" to possibly give you your most expensive building"',"CMDispTooltipWarnEdificeText")),e.lastChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnUser",lo,"Warning: ",`Purchase of this item will put you under the number of Cookies equal to ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser} seconds of CPS`,"CMDispTooltipWarnUserText")),e}()),ka()),0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos?l("CMDispTooltipWarningParent").style.right="0px":l("CMDispTooltipWarningParent").style.top=`${l("tooltip").offsetHeight}px`,l("CMDispTooltipWarningParent").style.width=l("tooltip").offsetWidth-6+"px";const e=Game.cookies+Io()-Fo,t=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnBon?Eo:0;let o=ke;if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnBon){let e=Eo;e/=ia(),o+=60*e*15/.15}if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLucky&&e<o&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnLucky").style.display="",l("CMDispTooltipWarnLuckyText").textContent=`${to(o-e)} (${Uo((o-e)/(Ro()+t))})`):l("CMDispTooltipWarnLucky").style.display="none",1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLuckyFrenzy){const a=7*o;e<a&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnLuckyFrenzy").style.display="",l("CMDispTooltipWarnLuckyFrenzyText").textContent=`${to(a-e)} (${Uo((a-e)/(Ro()+t))})`):l("CMDispTooltipWarnLuckyFrenzy").style.display="none"}else l("CMDispTooltipWarnLuckyFrenzy").style.display="none";if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnConjure){const a=2*o;e<a&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnConjure").style.display="",l("CMDispTooltipWarnConjureText").textContent=`${to(a-e)} (${Uo((a-e)/(Ro()+t))})`):l("CMDispTooltipWarnConjure").style.display="none"}else l("CMDispTooltipWarnConjure").style.display="none";if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnConjureFrenzy){const a=2*o*7;e<a&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnConjureFrenzy").style.display="",l("CMDispTooltipWarnConjureFrenzyText").textContent=`${to(a-e)} (${Uo((a-e)/(Ro()+t))})`):l("CMDispTooltipWarnConjureFrenzy").style.display="none"}else l("CMDispTooltipWarnConjureFrenzy").style.display="none";1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnEdifice&&Game.Objects["Wizard tower"].minigameLoaded&&xe&&e<xe&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnEdifice").style.display="",l("CMDispTooltipWarnEdificeText").textContent=`${to(xe-e)} (${Uo((xe-e)/(Ro()+t))})`):l("CMDispTooltipWarnEdifice").style.display="none",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser>0&&e<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser*Ro()&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnUser").style.display="",l("CMDispTooltipWarnUser").children[0].textContent=`Purchase of this item will put you under the number of Cookies equal to ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser} seconds of CPS`,l("CMDispTooltipWarnUserText").textContent=`${to(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser*Ro()-e)} (${Uo((Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser*Ro()-e)/(Ro()+t))})`):l("CMDispTooltipWarnUser").style.display="none"}else null!==l("CMDispTooltipWarningParent")&&l("CMDispTooltipWarningParent").remove()}()}else null===l("CMTooltipArea")&&null!==l("CMDispTooltipWarningParent")&&l("CMDispTooltipWarningParent").remove()}function Ma(){if(Game.prefs.autosave&&Game.drawT%10==0&&"stats"===Game.onMenu&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Stats){const e=document.getElementById("CMStatsAutosaveTimer");e&&(e.innerText=Game.sayTime(60*Game.fps-Game.T%(60*Game.fps),4))}Wo(),$o(),jo(),function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar){const e=l("CMTimerBar").offsetWidth-163,t=l("CMTimerBar").offsetWidth-133;let o=0;if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AutosaveTimerBar&&Game.prefs.autosave){const e=(60*Game.fps-(Game.OnAscend?0:Game.T%(60*Game.fps)))/Game.fps;l("CMTimerBarAutosave").style.display="",l("CMTimerBarAutosaveBar").style.width=`${Math.round(e*(t-8*Math.ceil(e).toString().length)/60)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarAutosaveBar").textContent=Math.ceil(e):l("CMTimerBarAutosaveBar").textContent="",l("CMTimerBarAutosaveTime").textContent=Math.ceil(e),o+=1}else l("CMTimerBarAutosave").style.display="none";if(0!==Game.shimmerTypes.golden.spawned||Game.Has("Golden switch [off]"))l("CMTimerBarGC").style.display="none";else{l("CMTimerBarGC").style.display="",l("CMTimerBarGCMinBar").style.width=`${Math.round(Math.max(0,Game.shimmerTypes.golden.minTime-Game.shimmerTypes.golden.time)*e/Game.shimmerTypes.golden.maxTime)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarGCMinBar").textContent=Math.ceil((Game.shimmerTypes.golden.minTime-Game.shimmerTypes.golden.time)/Game.fps):l("CMTimerBarGCMinBar").textContent="",Game.shimmerTypes.golden.minTime===Game.shimmerTypes.golden.maxTime?(l("CMTimerBarGCMinBar").style.borderTopRightRadius="10px",l("CMTimerBarGCMinBar").style.borderBottomRightRadius="10px"):(l("CMTimerBarGCMinBar").style.borderTopRightRadius="",l("CMTimerBarGCMinBar").style.borderBottomRightRadius=""),l("CMTimerBarGCBar").style.width=`${Math.round(Math.min(Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.minTime,Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.time)*e/Game.shimmerTypes.golden.maxTime)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarGCBar").textContent=Math.ceil(Math.min(Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.minTime,Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.time)/Game.fps):l("CMTimerBarGCBar").textContent="";const t=Math.max(0,(Game.shimmerTypes.golden.time-Game.shimmerTypes.golden.minTime)/(Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.minTime))**5;l("CMTimerBarGCTime").textContent=`${Math.ceil((Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.time)/Game.fps)} ${t<.01?"<":""}${t.toLocaleString("en",{style:"percent"})}`,o+=1}if("christmas"===Game.season&&0===Game.shimmerTypes.reindeer.spawned){l("CMTimerBarRen").style.display="",l("CMTimerBarRenMinBar").style.width=`${Math.round(Math.max(0,Game.shimmerTypes.reindeer.minTime-Game.shimmerTypes.reindeer.time)*e/Game.shimmerTypes.reindeer.maxTime)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarRenMinBar").textContent=Math.ceil((Game.shimmerTypes.reindeer.minTime-Game.shimmerTypes.reindeer.time)/Game.fps):l("CMTimerBarRenMinBar").textContent="",l("CMTimerBarRenBar").style.width=`${Math.round(Math.min(Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.minTime,Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.time)*e/Game.shimmerTypes.reindeer.maxTime)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarRenBar").textContent=Math.ceil(Math.min(Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.minTime,Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.time)/Game.fps):l("CMTimerBarRenBar").textContent="";const t=Math.max(0,(Game.shimmerTypes.reindeer.time-Game.shimmerTypes.reindeer.minTime)/(Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.minTime))**5;l("CMTimerBarRenTime").textContent=`${Math.ceil((Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.time)/Game.fps)} ${t<.01?"<":""}${t.toLocaleString("en",{style:"percent"})}`,o+=1}else l("CMTimerBarRen").style.display="none";const a={};l("CMTimerBarBuffTimers").innerHTML="",Object.keys(Game.buffs).forEach((e=>{if(Game.buffs[e]){const n=zo(Game.buffs[e].name,Game.buffs[e].name,[{id:`${Game.buffs[e].name}Bar`}]);n.style.display="";let i="";i=void 0!==So[Game.buffs[e].name]?So[Game.buffs[e].name]:co,n.lastChild.children[1].className=ao+i,n.lastChild.children[1].style.color="black",2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay?n.lastChild.children[1].textContent=`${Math.round(Game.buffs[e].time/Game.buffs[e].maxTime*100)}%`:n.lastChild.children[1].textContent="",n.lastChild.children[1].style.width=`${Math.round(Game.buffs[e].time*(t-8*Math.ceil(Game.buffs[e].time/Game.fps).toString().length)/Game.buffs[e].maxTime)}px`,n.lastChild.children[2].textContent=Math.ceil(Game.buffs[e].time/Game.fps),o+=1,a[Game.buffs[e].name]=n}})),Object.keys(a).forEach((e=>{l("CMTimerBarBuffTimers").appendChild(a[e])})),0!==o&&(l("CMTimerBar").style.height=12*o+2+"px"),Do!==o&&(Do=o,Qo())}}(),_o(),Ca(),function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipWrink&&1===Co){let e=!1;Object.keys(Game.wrinklers).forEach((t=>{const o=Game.wrinklers[t];if(o.phase>0&&o.selected){if(e=!0,0===yo[t]||void 0===yo[t]){const e=document.createElement("div"),o=document.createElement("div");o.style.minWidth="120px",o.style.marginBottom="4px";const a=document.createElement("div");a.style.textAlign="center",a.id="CMTooltipWrinkler",o.appendChild(a),e.appendChild(o),Game.tooltip.draw(this,escape(e.innerHTML)),Mo=t,yo[t]=1}}else yo[t]=0})),e||Game.tooltip.hide()}}(),function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipWrink&&null!==l("CMTooltipWrinkler")){let{sucked:e}=Game.wrinklers[Mo],t=1.1;if(Game.Has("Sacrilegious corruption")&&(t*=1.05),1===Game.wrinklers[Mo].type&&(t*=3),e*=t,Game.Has("Wrinklerspawn")&&(e*=1.05),Ct.Temple.minigameLoaded){const t=Game.hasGod("scorn");1===t?e*=1.15:2===t?e*=1.1:3===t&&(e*=1.05)}l("CMTooltipWrinkler").textContent=to(e)}}(),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpStats&&"stats"===Game.onMenu&&(Game.drawT-1)%(5*Game.fps)!=0&&(Game.drawT-1)%Game.fps==0&&Game.UpdateMenu(),B()}function ya(){P.addLatest(Game.computedMouseCps)}class ba{constructor(e){this.maxLength=e,this.queue=[]}addLatest(e){this.queue.push(e)>this.maxLength&&this.queue.shift()}calcAverage(e){let t=e;t>this.maxLength&&(t=this.maxLength),t>this.queue.length&&(t=this.queue.length);let o=0;for(let e=this.queue.length-1;e>=0&&e>this.queue.length-1-t;e--)o+=this.queue[e];return 0===o?0:o/t}calcSum(e){let t=e;return t>this.maxLength&&(t=this.maxLength),t>this.queue.length&&(t=this.queue.length),0===t?0:this.queue.slice(-t).reduce(((e,t)=>e+t),0)}}function Ga(e){"Cache"in window.CookieMonsterData||(window.CookieMonsterData.Cache={}),Object.keys(e).forEach((t=>{const o=t.replace(/^Cache/,"");void 0===e[t]?window.CookieMonsterData.Cache[o]=void 0:window.CookieMonsterData.Cache[o]=JSON.parse(JSON.stringify(e[t]))}))}function va(){const e=Math.floor(Date.now()/1e3);if(Game.T/Game.fps%1==0){let t=Game.cookies+ft;Game.cpsSucked>0&&(t+=$e),st=Math.max(Game.cookiesEarned,t),t*=.05;const o=e-j,a=Math.max(0,Game.cookies-$)/o,n=Math.max(0,$e-U)/o,i=Math.max(0,He[0]-H)/o,r=Math.max(0,t-De)/o,s=(Game.cookieClicks-R)/o;for(let e=0;e<o;e++)N.addLatest(a),O.addLatest(n),D.addLatest(i),L.addLatest(r),A.addLatest(s);j=e,$=Game.cookies,U=$e,H=He[0],De=t,R=Game.cookieClicks;const l=xo[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist];I=N.calcAverage(l),z=O.calcAverage(l),V=D.calcAverage(l),_=L.calcAverage(l),X=I,1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink&&(X+=z),2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink&&(X+=V);const c=Game.HasUnlocked("Chocolate egg")&&!Game.Has("Chocolate egg");lt=c||0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?I+z+(c?_:0):X,Ve=A.calcAverage(To[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist])}Ga({CacheRealCookiesEarned:st,CacheLastCPSCheck:j,CacheLastCookies:$,CacheLastWrinkCookies:U,CacheLastWrinkFattestCookies:H,CacheLastChoEgg:De,CacheLastClicks:R,CacheAverageGainBank:I,CacheAverageGainWrink:z,CacheAverageGainWrinkFattest:V,CacheAverageGainChoEgg:_,CacheAverageCPS:X,CacheAvgCPSWithChoEgg:lt,CacheAverageClicks:Ve})}function wa(e,t,o,a,n){let i=0;for(let e=Math.max(0,o);e<Math.max(0,o+n);e++)i+=Game.priceIncrease**Math.max(0,e-a);let r=t*i;return r=Game.modifyBuildingPrice(Game.Objects[e],r),Math.ceil(r)}function xa(e,t){Object.keys(e).forEach((o=>{if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPRigidelMode&&1===t)e[o].colour=mo;else{e[o].colour=na(e[o],wa(o,Game.Objects[o].basePrice,Game.Objects[o].amount,Game.Objects[o].free,t));for(let t=0;t<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop;t++)e[o].pp===ht[t][0]&&(e[o].colour=mo)}}))}function Ta(e,t){Object.keys(e).forEach((o=>{const a=wa(o,Game.Objects[o].basePrice,Game.Objects[o].amount,Game.Objects[o].free,t);Game.cookiesPs?e[o].pp=Math.max(a-(Game.cookies+Io()),0)/Game.cookiesPs+a/e[o].bonus:e[o].pp=a/e[o].bonus,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPRigidelMode&&1===t||ht.push([e[o].pp,t,a])}))}function Sa(){!function(){pt=1/0,ht=[],void 0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop&&(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop=0),Ta(Le,1),Ta(Ae,10),Ta(We,100),ht.sort(((e,t)=>e[0]-t[0]));let e=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop;if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPOnlyConsiderBuyable)for(;ht[e][2]>Game.cookies&&(e+=1,ht.length!==e+1););pt=ht[e][0],ut=ht[e][1],xa(Le,1),xa(Ae,10),xa(We,100),Ga({CacheMinPP:pt,CacheMinPPBulk:ut,CachePPArray:ht})}(),Object.keys(ze).forEach((e=>{Game.cookiesPs?ze[e].pp=Math.max(Game.Upgrades[e].getPrice()-(Game.cookies+Io()),0)/Game.cookiesPs+Game.Upgrades[e].getPrice()/ze[e].bonus:ze[e].pp=Game.Upgrades[e].getPrice()/ze[e].bonus,Number.isNaN(ze[e].pp)&&(ze[e].pp=1/0),ze[e].colour=na(ze[e],Game.Upgrades[e].getPrice())})),window.CookieMonsterData.Objects1=JSON.parse(JSON.stringify(Le)),window.CookieMonsterData.Objects10=JSON.parse(JSON.stringify(Ae)),window.CookieMonsterData.Objects100=JSON.parse(JSON.stringify(We)),window.CookieMonsterData.Upgrades=[],Object.entries(ze).forEach((e=>{window.CookieMonsterData.Upgrades[e[0]]=JSON.parse(JSON.stringify(e[1]))}))}function Fa(e){if("toggle"===Game.Upgrades[e].pool||0===Game.Upgrades[e].bought&&Game.Upgrades[e].unlocked&&"prestige"!==Game.Upgrades[e].pool){ta(),"Shimmering veil [on]"===Mt[e].name?Mt["Shimmering veil [off]"].bought=0:"Golden switch [on]"===Mt[e].name?Mt["Golden switch [off]"].bought=0:Mt[e].bought=(Mt[e].bought+1)%2,Game.CountsAsUpgradeOwned(Game.Upgrades[e].pool)&&(Z+=1),"Elder Pledge"===e?(ee+=1,ee>0&&ra("Elder nap"),ee>=5&&ra("Elder slumber")):"Elder Covenant"===e?ra("Elder calm"):"Prism heart biscuits"===e?ra("Lovely cookies"):"Heavenly key"===e&&ra("Wholesome");const t=te;sa(),ha(),t!==te&&sa();const o=function(){let e=0;wt("Thousand fingers")&&(e+=.1),wt("Million fingers")&&(e*=5),wt("Billion fingers")&&(e*=10),wt("Trillion fingers")&&(e*=20),wt("Quadrillion fingers")&&(e*=20),wt("Quintillion fingers")&&(e*=20),wt("Sextillion fingers")&&(e*=20),wt("Septillion fingers")&&(e*=20),wt("Octillion fingers")&&(e*=20),wt("Nonillion fingers")&&(e*=20),wt("Decillion fingers")&&(e*=20),wt("Undecillion fingers")&&(e*=20),wt("Unshackled cursors")&&(e*=25);let t=0;Object.keys(Ct).forEach((e=>{t+=Ct[e].amount})),t-=Ct.Cursor.amount,e*=t,wt("Plastic mouse")&&(e+=.01*me),wt("Iron mouse")&&(e+=.01*me),wt("Titanium mouse")&&(e+=.01*me),wt("Adamantium mouse")&&(e+=.01*me),wt("Unobtainium mouse")&&(e+=.01*me),wt("Eludium mouse")&&(e+=.01*me),wt("Wishalloy mouse")&&(e+=.01*me),wt("Fantasteel mouse")&&(e+=.01*me),wt("Nevercrack mouse")&&(e+=.01*me),wt("Armythril mouse")&&(e+=.01*me),wt("Technobsidian mouse")&&(e+=.01*me),wt("Plasmarble mouse")&&(e+=.01*me),wt("Miraculite mouse")&&(e+=.01*me),wt("Aetherice mouse")&&(e+=.01*me),wt("Omniplast mouse")&&(e+=.01*me),wt("Fortune #104")&&(e+=.01*me);let o=1;if(wt("Santa's helpers")&&(o*=1.1),wt("Cookie egg")&&(o*=1.1),wt("Halo gloves")&&(o*=1.1),wt("Dragon claw")&&(o*=1.03),wt("Aura gloves")&&(o*=1+.05*Math.min(Game.Objects.Cursor.level,wt("Luminous gloves")?20:10)),o*=vt("click"),Ct.Temple.minigameLoaded&&Tt){const e=Tt("labor");1===e?o*=1.15:2===e?o*=1.1:3===e&&(o*=1.05)}Object.keys(Game.buffs).forEach((e=>{void 0!==Game.buffs[e].multClick&&(o*=Game.buffs[e].multClick)})),o*=1+.05*bt("Dragon Cursor");let a=o*Game.ComputeCps(1,wt("Reinforced index finger")+wt("Carpal tunnel prevention cream")+wt("Ambidextrous"),e);return a=Game.runModHookOnValue("cookiesPerClick",a),Game.hasBuff("Cursed finger")&&(a=Game.buffs["Cursed finger"].power),a}()-Game.computedMouseCps;return o?[me-Game.cookiesPs,o]:[me-Game.cookiesPs]}return[]}function Ea(e){const t={};return Object.keys(Game.Objects).forEach((o=>{t[o]={},t[o].bonus=ga(o,e),1!==e&&(Y=1)})),t}function Ba(){Object.keys(Game.Objects).forEach((e=>{Le[e].price=wa(e,Game.Objects[e].basePrice,Game.Objects[e].amount,Game.Objects[e].free,1),Ae[e].price=wa(e,Game.Objects[e].basePrice,Game.Objects[e].amount,Game.Objects[e].free,10),We[e].price=wa(e,Game.Objects[e].basePrice,Game.Objects[e].amount,Game.Objects[e].free,100),je[e].price=wa(e,Game.Objects[e].basePrice,Game.Objects[e].amount,Game.Objects[e].free,je[e].AmountNeeded)})),Ga({CacheObjectsNextAchievement:je})}function Pa(){Le=Ea(1),Ae=Ea(10),We=Ea(100),function(){ze={};for(let e=0;e<Game.UpgradesInStore.length;e++){const t=Game.UpgradesInStore[e].name,o=Fa(t);"Elder Pledge"===t?(ze[t]={bonus:Game.cookiesPs-I},1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?ze[t].bonus-=z:2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink&&(ze[t].bonus-=V),Number.isFinite(ze[t].bonus)||(ze[t].bonus=0)):(ze[t]={},o[0]&&(ze[t].bonus=o[0]),o[1]&&(ze[t].bonusMouse=o[1]))}}()}function Na(e,t,o){let a=0,n=0,i=0,r=0,s=1+Math.max(0,Math.ceil(Math.log(Game.cookies)/Math.LN10)-10);for(;i<t*o;)n=Math.max(e,Math.min(Math.floor(1/9*10**s*e*o),t*o)),i=Math.max(e,Math.min(Math.floor(1/9*10**(s+1)*e*o),t*o)),r=Math.floor(1/9*10**(s+1)*e*o),a+=n,s+=1;return[a,n,r]}function Oa(){let e=60*Se*60*6*Fe;const t=ia();t>0?e/=t:e=0,Ke=Na(7,e,Ee),qe=2*Ke[1]/Ee,Ye=Ke[2]/60/60/6/Fe,et=Na(6,e,Be),Je=2*et[1]/Be,Ze=et[2]/60/60/6/Fe,at=Na(7,7*e,Ee),tt=2*at[1]/Ee,ot=at[2]/60/60/6/Fe,rt=Na(6,7*e,Be),nt=2*rt[1]/Be,it=rt[2]/60/60/6/Fe,Ga({CacheChainMaxReward:Ke,CacheChainRequired:qe,CacheChainRequiredNext:Ye,CacheChainWrathMaxReward:et,CacheChainWrathRequired:Je,CacheChainWrathRequiredNext:Ze,CacheChainFrenzyMaxReward:at,CacheChainFrenzyRequired:tt,CacheChainFrenzyRequiredNext:ot,CacheChainFrenzyWrathMaxReward:rt,CacheChainFrenzyWrathRequired:nt,CacheChainFrenzyWrathRequiredNext:it})}function Da(){const e=Math.floor(Date.now()/1e3);if(Game.T/Game.fps%1==0){const t=Game.HowMuchPrestige(Game.cookiesReset),o=Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned))-Math.floor(t),a=e-Q,n=Math.max(0,o-q)/a;for(let e=0;e<a;e++)W.addLatest(n);Q=e,q=o,Pe=W.calcAverage(5)}Ga({CacheLastHeavenlyCheck:Q,CacheLastHeavenlyChips:q,CacheHCPerSecond:Pe})}function La(){_e="",Qe="",Xe="";const e=[];Object.keys(Game.Upgrades).forEach((t=>{e.push(Game.Upgrades[t])})),e.sort((function(e,t){return e.order>t.order?1:e.order<t.order?-1:0})),Object.keys(e).forEach((t=>{const o=e[t];if(0===o.bought){let e="";e+=function(e){let t="crate upgrade missing";"prestige"===e.pool&&(t+=" heavenly");let o=0;Game.prefs.crates||(o=1),o&&(t+=" noFrame");let{icon:a}=e;e.iconFunction&&(a=e.iconFunction());const n=`function() {return Game.crateTooltip(Game.UpgradesById[${e.id}], 'stats');}`;return`<div class="${t}"\n\t${Game.getDynamicTooltip(n,"top",!0)}\n\tstyle = "${a[2]?`background-image: url(${a[2]});`:""}background-position:${48*-a[0]}px ${48*-a[1]}px;">\n\t</div>`}(o),"prestige"===o.pool?Xe+=e:"cookie"===o.pool?Qe+=e:"toggle"!==o.pool&&"unused"!==o.pool&&"debug"!==o.pool&&(_e+=e)}}))}function Aa(){if("christmas"===Game.season){let e=60*Game.cookiesPs;Game.hasBuff("Elder frenzy")&&(e*=.5),Game.hasBuff("Frenzy")&&(e*=.75),Oe=Math.max(25,e),Game.Has("Ho ho ho-flavored frosting")&&(Oe*=2)}Ga({CacheSeaSpec:Oe})}function Wa(){ke=900*Se/.15,ke*=Fe;const e=ia();e>0?ke/=e:ke=0,Ce=Ee*(.15*ke)+13,Me=Be*(.15*ke)+13,ye=7*ke,be=Ee*(.15*ye)+13,Ge=Be*(.15*ye)+13,ve=2*ke,we=.15*ve,xe=0;let t=0,o=0;Object.keys(Game.Objects).forEach((e=>{Game.Objects[e].amount>t&&(t=Game.Objects[e].amount),Game.Objects[e].amount>0&&(o+=1)})),Object.keys(Game.Objects).forEach((e=>{(Game.Objects[e].amount<t||1===o)&&Game.Objects[e].amount<400&&2*Game.Objects[e].price>xe&&(xe=2*Game.Objects[e].price,Te=e)})),Ga({CacheLucky:ke,CacheLuckyReward:Ce,CacheLuckyWrathReward:Me,CacheLuckyFrenzy:ye,CacheLuckyRewardFrenzy:be,CacheLuckyWrathRewardFrenzy:Ge,CacheConjure:ve,CacheConjureReward:we,CacheEdifice:xe,CacheEdificeBuilding:Te})}function ja(){let e=1,t=1,o=1;wt("Green yeast digestives")&&(o*=1.01),wt("Dragon fang")&&(o*=1.03),e*=1+.1*Game.auraMult("Ancestral Metamorphosis"),e*=Game.eff("goldenCookieGain"),t*=1+.1*Game.auraMult("Unholy Dominion"),t*=Game.eff("wrathCookieGain"),Ee=o*e,Be=o*t,Fe=1,0===Game.shimmerTypes.golden.n&&(Fe*=1+1.23*Game.auraMult("Dragon's Fortune")),Ga({CacheGoldenCookiesMult:Ee,CacheWrathCookiesMult:Be,CacheDragonsFortuneMultAdjustment:Fe})}function $a(e){const t={};Object.keys(Game.Objects).forEach((o=>{if(0!==Object.keys(je).length&&je[o].TotalNeeded>Game.Objects[o].amount&&!e)t[o]={AmountNeeded:je[o].TotalNeeded-Game.Objects[o].amount,TotalNeeded:je[o].TotalNeeded,price:wa(o,Game.Objects[o].basePrice,Game.Objects[o].amount,Game.Objects[o].free,je[o].TotalNeeded-Game.Objects[o].amount)};else{const e=function(e){const t=Game.AchievementsOwned;let o=100,a=100;for(;o>-1;)if(ga(e,o),te>t)a=o,o-=10;else{if(100===o)return 101;for(o+=1;o<=a;){if(ga(e,o),te>t)return o;o+=1}}return 101}(o);t[o]={AmountNeeded:e,TotalNeeded:Game.Objects[o].amount+e,price:wa(o,Game.Objects[o].basePrice,Game.Objects[o].amount,Game.Objects[o].free,e)}}})),je=t,Ga({CacheObjectsNextAchievement:je})}function Ua(){$e=0,Ue=0,He=[0,null];for(let e=0;e<Game.wrinklers.length;e++){let{sucked:t}=Game.wrinklers[e],o=1.1;if(Game.Has("Sacrilegious corruption")&&(o*=1.05),1===Game.wrinklers[e].type&&(o*=3),t*=o,Game.Has("Wrinklerspawn")&&(t*=1.05),Ct.Temple.minigameLoaded){const e=Game.hasGod("scorn");1===e?t*=1.15:2===e?t*=1.1:3===e&&(t*=1.05)}$e+=t,0===Game.wrinklers[e].type&&(Ue+=t,t>He[0]&&(He=[t,e]))}Ga({CacheWrinklersTotal:$e,CacheWrinklersNormal:Ue,CacheWrinklersFattest:He})}function Ha(){Yo(),Ua(),Wa(),ja(),Oa(),La(),Aa(),N=new ba(xo[xo.length-1]),O=new ba(xo[xo.length-1]),D=new ba(xo[xo.length-1]),L=new ba(xo[xo.length-1]),A=new ba(To[To.length-1]),W=new ba(5),P=new ba(20*To[To.length-1]),Da(),$a(),va(),Pa(),Ba(),Sa()}function Ra(){Object.keys(Game.wrinklers).forEach((e=>{Game.wrinklers[e].sucked>0&&0===Game.wrinklers[e].type&&(Game.wrinklers[e].hp=0)}))}function Ia(e,t){if("b"===e){if(l("tooltip").innerHTML=Game.Objects[t].tooltip(),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipAmor){const e=wa(t,Game.Objects[t].basePrice,0,Game.Objects[t].free,Game.Objects[t].amount),o=e-Game.Objects[t].totalCookies;o>0&&(l("tooltip").innerHTML=l("tooltip").innerHTML.split("so far</div>").join(`so far<br/>• <b>${to(o)}</b> ${1===Math.floor(o)?"cookie":"cookies"} left to amortize (${Ho((e-Game.Objects[t].totalCookies)/(Game.Objects[t].storedTotalCps*Game.globalCpsMult)).text})</div>`))}-1===Game.buyMode&&(l("tooltip").innerHTML=l("tooltip").innerHTML.split(to(Game.Objects[t].bulkPrice)).join(to((Game.Objects[t],Game.Objects[t].basePrice,Game.Objects[t].amount,Game.Objects[t].free,Game.buyBulk,1))))}else if("u"===e){if(!Game.UpgradesInStore[t])return"";l("tooltip").innerHTML=Game.crateTooltip(Game.UpgradesInStore[t],"store")}else"s"===e?l("tooltip").innerHTML=Game.lumpTooltip():"g"===e?l("tooltip").innerHTML=Game.Objects["Wizard tower"].minigame.spellTooltip(t)():"p"===e?l("tooltip").innerHTML=Game.ObjectsById[2].minigame.tileTooltip(t[0],t[1])():"ha"===e?l("tooltip").innerHTML=Game.ObjectsById[2].minigame.toolTooltip(1)():"sm"===e?l("tooltip").innerHTML=Game.Objects.Bank.minigame.goodTooltip(t)():"wb"===e?l("tooltip").innerHTML="":"pag"===e?l("tooltip").innerHTML=Game.Objects.Temple.minigame.godTooltip(t)():"pas"===e&&(l("tooltip").innerHTML=Game.Objects.Temple.minigame.slotTooltip(t[0])());if("b"===e&&1===Game.buyMode||"u"===e||"s"===e||"g"===e||"p"===e&&!Game.keys[16]||"ha"===e||"sm"===e||"wb"===e||"pag"===e||"pas"===e&&-1!==t[1]){const e=document.createElement("div");e.id="CMTooltipArea",l("tooltip").appendChild(e)}return Bo=e,Po=t,Ca(),l("tooltip").innerHTML}function za(){1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Favicon&&It>0?ct.wrath?l("CMFavicon").href="https://CookieMonsterTeam.github.io/CookieMonster/favicon/wrathCookie.ico":l("CMFavicon").href="https://CookieMonsterTeam.github.io/CookieMonster/favicon/goldenCookie.ico":l("CMFavicon").href="https://orteil.dashnet.org/cookieclicker/favicon.ico"}function Va(){Ct=[],Object.keys(Game.Objects).forEach((e=>{Ct[e]=Zo(e)})),Mt=[],Object.keys(Game.Upgrades).forEach((e=>{Mt[e]=ea(e)})),yt=[],Object.keys(Game.Achievements).forEach((e=>{yt[e]=Ko(e)})),ta()}function _a(){Game.Objects["Wizard tower"].minigameLoaded&&Object.keys(Game.Objects["Wizard tower"].minigame.spellsById).forEach((e=>{null!==l(`grimoireSpell${e}`).onmouseover&&(Yt[e]=l(`grimoireSpell${e}`).onmouseover,l(`grimoireSpell${e}`).onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("g",`${e}`)),"this"),Game.tooltip.wobble()})}))}function Xa(){if(!jt&&Game.Objects["Wizard tower"].minigameLoaded){const{minigame:e}=Game.Objects["Wizard tower"];At=e.draw,Game.Objects["Wizard tower"].minigame.draw=function(){At(),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GrimoireBar&&e.magic<e.magicM&&Game.drawT%5==0&&(e.magicBarTextL.innerHTML+=` (${Uo(fa(e.magic,e.magicM,e.magicM))})`,e.magicBarL.style.width="75%")},jt=!0}}function Qa(){!function(){if(!Wt&&Game.Objects["Wizard tower"].minigameLoaded){const{minigame:e}=Game.Objects["Wizard tower"];Dt=e.launch,Lt=new Function(`return ${e.launch.toString().split("=this").join("= Game.Objects['Wizard tower'].minigame")}`),Game.Objects["Wizard tower"].minigame.launch=function(){Lt(),_a(),jt=!1,Xa(),Wt=!0}}}(),Xa()}function qa(){if(ge!==Game.dragonLevel||ce){if(Game.dragonLevel<25&&Game.dragonLevels[Game.dragonLevel].buy.toString().includes("sacrifice")){const e=Game.dragonLevels[Game.dragonLevel].buy.toString().match(/Objects\[(.*)\]/);let t=null!==e?e[1]:Game.ObjectsById[Game.dragonLevel-5].name;const o=Game.dragonLevels[Game.dragonLevel].buy.toString().match(/sacrifice\((.*?)\)/)[1];if("i"!==t)if(t=t.replaceAll("'",""),Game.Objects[t].amount<o)fe="Not enough buildings to sell";else{let e=0;ta();for(let a=0;a<o;a++){let o=Ct[t].basePrice*Game.priceIncrease**Math.max(0,Ct[t].amount-1-Ct[t].free);o=Game.modifyBuildingPrice(Ct[t],o),o=Math.ceil(o),e+=o,Ct[t].amount-=1}fe=`Cost to rebuy: ${to(e)}`}else{let e=0;ta(),Object.keys(Game.Objects).forEach((a=>{if(t=a,Game.Objects[t].amount<o)fe="Not enough buildings to sell";else{for(let a=0;a<o;a++){let o=Ct[t].basePrice*Game.priceIncrease**Math.max(0,Ct[t].amount-1-Ct[t].free);o=Game.modifyBuildingPrice(Ct[t],o),o=Math.ceil(o),e+=o,Ct[t].amount-=1}fe=`Cost to rebuy: ${to(e)}`}}))}}ge=Game.dragonLevel}Ga({CacheLastDragonLevel:ge})}const Ya={Favourite:"Favourite Settings",Calculation:"Calculation",Notation:"Notation",Colours:"Colours and colour coding",BarsDisplay:"Infobars and visual settings",Tooltip:"Tooltips",Statistics:"Statistics",Notification:"Notifications",Miscellaneous:"Miscellaneous"},Ka={NotificationGeneral:"General Notifications",NotificationGC:"Golden Cookie",NotificationFC:"Fortune Cookie",NotificationSea:"Season Special",NotificationGard:"Garden Tick",NotificationMagi:"Full Magic Bar",NotificationWrink:"Wrinkler",NotificationWrinkMax:"Maximum Wrinklers"},Ja=function(e){if(1===e){const e=function(){try{Notification.requestPermission().then()}catch(e){return!1}return!0};"Notification"in window?e()?Notification.requestPermission().then():Notification.requestPermission():console.log("This browser does not support notifications.")}};function Za(){BeautifyAll(),Game.RefreshStore(),Game.RebuildUpgrades(),_o(),Wo(),$o()}function en(){1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar?(l("CMBotBar").style.display="",_o()):l("CMBotBar").style.display="none",Qo()}const tn={CPSMode:new S(1,"bool","Calculation",["Current cookies per second","Average cookies per second"],"Calculate times using current cookies per second or average cookies per second",!1),AvgCPSHist:new S(3,"bool","Calculation",["Average CPS in past 10s","Average CPS in past 15s","Average CPS in past 30s","Average CPS in past 1m","Average CPS in past 5m","Average CPS in past 10m","Average CPS in past 15m","Average CPS in past 30m"],"How much time average Cookies Per Second should consider",!1),AvgClicksHist:new S(0,"bool","Calculation",["Average clicks in past 1s","Average clicks in past 5s","Average clicks in past 10s","Average clicks in past 15s","Average clicks in past 30s"],"How much time average Cookie Clicks should consider",!1),CalcWrink:new F(0,"bool","Calculation",["Calculate with wrinklers OFF","Calculate with wrinklers ON","Calculate with single fattest wrinkler ON"],"Calculate times and average Cookies Per Second with (only the single non-shiny fattest) wrinklers",!0,(()=>{ce=!0})),Scale:new F(2,"bool","Notation",["Game's setting scale","Metric","Short scale","Short scale (Abbreviated)","Scientific notation","Engineering notation"],"Change how long numbers are formatted",!1,(()=>{Za()})),ScaleDecimals:new F(2,"bool","Notation",["1 decimals","2 decimals","3 decimals"],'Set the number of decimals used when applicable. This only works with Cookie Monster scales and not with "Game\'s Setting Scale"',!1,(()=>{Za()})),ScaleSeparator:new F(0,"bool","Notation",[". for decimals (standard)",". for thousands"],"Set the separator used for decimals and thousands",!1,(()=>{Za()})),ScaleCutoff:new T(999999,"numscale","Notation","Notation cut-off point: ","The number from which Cookie Monster will start formatting numbers based on chosen scale. Standard is 999,999. Setting this above 999,999,999 might break certain notations",1,999999999),TimeFormat:new S(0,"bool","Notation",["Time XXd, XXh, XXm, XXs","Time XX:XX:XX:XX:XX","Time XXx, XXx"],"Change the time format",!1),DetailedTime:new F(1,"bool","Notation",["Detailed time OFF","Detailed time ON"],"Change how time is displayed in certain statistics and tooltips",!0,(()=>{1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.DetailedTime?Game.sayTime=bo:Game.sayTime=Jt.sayTime})),PPDisplayTime:new S(0,"bool","Notation",["PP as value (standard)","PP as time unit"],"Display PP as calculated value or as approximate time unit. Note that PP does not translate directly into a time unit and this is therefore only an approximation.",!1),BuildColour:new F(1,"bool","Colours",["Building colours OFF","Building colours ON"],"Colour code buildings",!0,(()=>{Wo()})),PPOnlyConsiderBuyable:new S(0,"bool","Colours",["Don't ignore non-buyable","Ignore non-buyable"],"Makes Cookie Monster label buildings and upgrades you can't buy right now red, useful in those situations where you just want to spend your full bank 'most optimally'",!0),PPExcludeTop:new S(0,"bool","Colours",["Don't ignore any","Ignore 1st best","Ignore 1st and 2nd best","Ignore 1st, 2nd and 3rd best"],"Makes Cookie Monster ignore the 1st, 2nd or 3rd best buildings in labeling and colouring PP values",!0),PPRigidelMode:new S(0,"bool","Colours",["Rigidel mode OFF","Rigidel mode ON"],'Makes Cookie Monster ignore all "buy 1" options when colouring PP in order to stay at a total building count ending in 10 for pantheon god Rigidel',!0),PPSecondsLowerLimit:new T(0,"numscale","Colours","Lower limit for PP (in seconds): ",'If a building or upgrade costs less than the specified seconds of CPS it will also be considered optimal and label it as such ("PP is less than xx seconds of CPS"); setting to 0 ignores this option',0,1/0),ColourBlue:new x("#4bb8f0","colour","Colours","Standard colour is blue. Used to show upgrades better than best PP building, for Click Frenzy bar, and for various labels"),ColourGreen:new x("#00ff00","colour","Colours","Standard colour is green. Used to show best PP building, for Blood Frenzy bar, and for various labels"),ColourYellow:new x("#ffff00","colour","Colours","Standard colour is yellow. Used to show buildings within the top 10 of PP, for Frenzy bar, and for various labels"),ColourOrange:new x("#ff7f00","colour","Colours","Standard colour is orange. Used to show buildings within the top 20 of PP, for Next Reindeer bar, and for various labels"),ColourRed:new x("#ff0000","colour","Colours","Standard colour is Red. Used to show buildings within the top 30 of PP, for Clot bar, and for various labels"),ColourPurple:new x("#ff00ff","colour","Colours","Standard colour is purple. Used to show buildings outside of the top 30 of PP, for Next Cookie bar, and for various labels"),ColourGray:new x("#b3b3b3","colour","Colours","Standard colour is gray. Used to show negative or infinity PP, and for Next Cookie/Next Reindeer bar"),ColourPink:new x("#ff1493","colour","Colours","Standard colour is pink. Used for Dragonflight bar"),ColourBrown:new x("#8b4513","colour","Colours","Standard colour is brown. Used for Dragon Harvest bar"),BotBar:new F(1,"bool","BarsDisplay",["Bottom bar OFF","Bottom bar ON"],"Building information",!0,(()=>{en()})),TimerBar:new F(1,"bool","BarsDisplay",["Timer bar OFF","Timer bar ON"],"Bar with timers for golden cookie, season popup, Frenzy (Normal, Clot, Elder), Click Frenzy",!0,(()=>{qo()})),TimerBarPos:new F(0,"bool","BarsDisplay",["Timer bar position (top left)","Timer bar position (bottom)"],"Placement of the timer bar",!1,(()=>{0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos?(l("CMTimerBar").style.width="30%",l("CMTimerBar").style.bottom="",l("game").insertBefore(l("CMTimerBar"),l("sectionLeft"))):(l("CMTimerBar").style.width="100%",l("CMTimerBar").style.bottom="0px",l("wrapper").appendChild(l("CMTimerBar"))),Qo()})),TimerBarOverlay:new S(2,"bool","BarsDisplay",["Timer bar overlay OFF","Timer bar overlay only seconds","Timer bar overlay full"],"Overlay on timers displaying seconds and/or percentage left",!0),AutosaveTimerBar:new S(0,"bool","BarsDisplay",["Autosave timer bar OFF","Autosave timer bar ON"],"Show a timer counting down till next autosave in the timer bar",!0),UpBarColour:new F(1,"bool","BarsDisplay",["Upgrade colours/bar OFF","Upgrade colours with bar ON","Upgrade colours without bar ON"],"Colour code upgrades and optionally add a counter bar",!1,(()=>{1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour?(l("CMUpgradeBar").style.display="",$o()):2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour?(l("CMUpgradeBar").style.display="none",$o()):(l("CMUpgradeBar").style.display="none",Game.RebuildUpgrades())})),UpgradeBarFixedPos:new F(1,"bool","BarsDisplay",["Upgrade bar fixed position OFF","Upgrade bar fixed position ON"],"Lock the upgrade bar at top of the screen to prevent it from moving ofscreen when scrolling",!0,(()=>{1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpgradeBarFixedPos?(l("CMUpgradeBar").style.position="sticky",l("CMUpgradeBar").style.top="0px"):l("CMUpgradeBar").style.position=""})),SortBuildings:new F(0,"bool","BarsDisplay",["Sort buildings: default","Sort buildings: PP of x1 purchase","Sort buildings: PP of selected bulk mode","Sort buildings: price until next achievement"],"Sort the display of buildings in default order, by PP, or until next achievement",!1,(()=>{Wo()})),SortUpgrades:new F(0,"bool","BarsDisplay",["Sort upgrades: default","Sort upgrades: PP"],"Sort the display of upgrades in either default order or by PP",!1,(()=>{$o()})),UpgradesNeverCollapse:new F(0,"bool","BarsDisplay",["Upgrades always expanded OFF","Upgrades always expanded ON"],"Toggle to make the upgrades sections always expanded to the size needed to display all upgrades",!0,(()=>{jo()})),DragonAuraInfo:new S(1,"bool","BarsDisplay",["Extra dragon aura info OFF","Extra dragon aura info ON"],"Shows information about changes in CPS and costs in the dragon aura interface.",!0),GrimoireBar:new S(1,"bool","BarsDisplay",["Grimoire magic meter timer OFF","Grimoire magic meter timer ON"],"A timer overlay showing how long till the Grimoire magic meter is full",!0),GCTimer:new F(1,"bool","BarsDisplay",["Golden cookie timer OFF","Golden cookie timer ON"],"A timer on the golden cookie when it has been spawned",!0,(()=>{1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer?Object.keys(Lo).forEach((e=>{Lo[e].style.display="block",Lo[e].style.left=gt[e].l.style.left,Lo[e].style.top=gt[e].l.style.top})):Object.keys(Lo).forEach((e=>Lo[e].style.display="none"))})),Favicon:new F(1,"bool","BarsDisplay",["Favicon OFF","Favicon ON"],"Update favicon with golden/wrath cookie",!0,(()=>{za()})),WrinklerButtons:new F(1,"bool","BarsDisplay",["Extra wrinkler buttons OFF","Extra wrinkler buttons ON"],"Show buttons for popping wrinklers at bottom of cookie section",!0,(()=>{B()})),HideSectionsButtons:new F(0,"bool","BarsDisplay",["Hide buildings/upgrades button OFF","Hide buildings/upgrades button ON"],"Show buttons for hiding and showing the buildings and upgrades sections in the right column",!0,(()=>{Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.HideSectionsButtons?l("CMSectionHidButtons").style.display="":l("CMSectionHidButtons").style.display="none"})),TooltipBuildUpgrade:new S(1,"bool","Tooltip",["Building/upgrade tooltip information OFF","Building/upgrade tooltip information ON"],"Extra information in building/upgrade tooltips",!0),TooltipAmor:new S(0,"bool","Tooltip",["Buildings tooltip amortization information OFF","Buildings tooltip amortization information ON"],"Add amortization information to buildings tooltip",!0),ToolWarnLucky:new S(1,"bool","Tooltip",["Tooltip lucky warning OFF","Tooltip lucky warning ON"],'A warning when buying if it will put the bank under the amount needed for max "Lucky!" rewards',!0),ToolWarnLuckyFrenzy:new S(1,"bool","Tooltip",["Tooltip lucky frenzy warning OFF","Tooltip lucky frenzy warning ON"],'A warning when buying if it will put the bank under the amount needed for max "Lucky!" (Frenzy) rewards',!0),ToolWarnConjure:new S(1,"bool","Tooltip",["Tooltip conjure warning OFF","Tooltip conjure warning ON"],'A warning when buying if it will put the bank under the amount needed for max "Conjure Baked Goods" rewards',!0),ToolWarnConjureFrenzy:new S(1,"bool","Tooltip",["Tooltip conjure frenzy warning OFF","Tooltip conjure frenzy warning ON"],'A warning when buying if it will put the bank under the amount needed for max "Conjure Baked Goods" rewards with Frenzy active',!0),ToolWarnEdifice:new S(1,"bool","Tooltip",["Tooltip edifice warning OFF","Tooltip edifice warning ON"],'A warning when buying if it will put the bank under the amount needed for "Spontaneous Edifice" to possibly give you your most expensive building',!0),ToolWarnUser:new T(0,"numscale","Tooltip","Tooltip warning at x times CPS: ","Use this to show a customized warning if buying it will put the bank under the amount equal to value times cps; setting to 0 disables the function altogether",0,1/0),ToolWarnBon:new S(1,"bool","Tooltip",["Calculate tooltip warning with bonus CPS OFF","Calculate tooltip warning with bonus CPS ON"],"Calculate the warning with or without the bonus CPS you get from buying",!0),ToolWarnPos:new F(1,"bool","Tooltip",["Tooltip warning position (left)","Tooltip warning position (bottom)"],"Placement of the warning boxes",!1,(()=>{ka()})),TooltipGrim:new S(1,"bool","Tooltip",["Grimoire tooltip information OFF","Grimoire tooltip information ON"],"Extra information in tooltip for grimoire",!0),TooltipWrink:new S(1,"bool","Tooltip",["Wrinkler tooltip OFF","Wrinkler tooltip ON"],"Shows the amount of cookies a wrinkler will give when popping it",!0),TooltipLump:new S(1,"bool","Tooltip",["Sugar lump tooltip OFF","Sugar lump tooltip ON"],"Shows the current Sugar Lump type in Sugar lump tooltip.",!0),TooltipPlots:new S(1,"bool","Tooltip",["Garden plots tooltip OFF","Garden plots tooltip ON"],"Shows a tooltip for plants that have a cookie reward.",!0),TooltipStocks:new S(1,"bool","Tooltip",["Stock market tooltips OFF","Stock market tooltips ON"],"Shows additional info in the stock market tooltips.",!0),TooltipPantheon:new S(1,"bool","Tooltip",["Pantheon tooltip OFF","Pantheon tooltip ON"],"Shows additional info in the pantheon tooltip",!0),TooltipAscendButton:new S(1,"bool","Tooltip",["Show Extra Info Ascend Tooltip OFF","Show Extra Info Ascend Tooltip ON"],"Shows additional info in the ascend tooltip",!0),Stats:new S(1,"bool","Statistics",["Statistics OFF","Statistics ON"],"Extra Cookie Monster statistics!",!0),MissingUpgrades:new S(1,"bool","Statistics",["Missing upgrades OFF","Missing upgrades ON"],"Shows missing upgrades in statistics menu",!0),MissingAchievements:new S(0,"bool","Statistics",["Missing Achievements OFF","Missing Normal Achievements ON"],"Shows missing normal achievements in statistics menu.",!0),UpStats:new S(1,"bool","Statistics",["Statistics update rate (default)","Statistics update rate (1s)"],"Default rate is once every 5 seconds",!1),HeavenlyChipsTarget:new T(1,"numscale","Statistics","Heavenly chips target: ",'Use this to set a heavenly chips target that will be counted towards in the "prestige" statsistics sections',1,1/0),ShowMissedGC:new S(1,"bool","Statistics",["Missed GC OFF","Missed GC ON"],"Show a stat in the statistics screen that counts how many golden cookies you have missed",!0),Title:new S(1,"bool","NotificationGeneral",["Title OFF","Title ON","Title pinned tab highlight"],'Update title with colden cookie/season popup timers; pinned tab highlight only changes the title when a golden cookie/season popup spawns; "!" means that golden cookie/reindeer can spawn',!0),GeneralSound:new S(1,"bool","NotificationGeneral",["Consider game volume setting OFF","Consider game volume setting ON"],'Turning this toggle to "off" makes Cookie Monster no longer consider the volume setting of the base game, allowing mod notifications to play with base game volume turned down',!0),GCNotification:new F(0,"bool","NotificationGC",["Notification OFF","Notification ON"],"Create a notification when golden cookie spawns",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCNotification)})),GCFlash:new S(1,"bool","NotificationGC",["Flash OFF","Flash ON"],"Flash screen on golden cookie",!0),ColourGCFlash:new x("#ffffff","colour","NotificationGC","The colour of the GC flash, standard colour is white"),GCSound:new S(1,"bool","NotificationGC",["Sound OFF","Sound ON"],"Play a sound on golden cookie",!0),GCVolume:new E(100,"vol","NotificationGC",[],"Volume"),GCSoundURL:new S("https://freesound.org/data/previews/66/66717_931655-lq.mp3","url","NotificationGC","Sound URL:","URL of the sound to be played when a golden cookie spawns"),FortuneNotification:new F(0,"bool","NotificationFC",["Notification OFF","Notification ON"],"Create a notification when fortune cookie is on the ticker",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FortuneNotification)})),FortuneFlash:new S(1,"bool","NotificationFC",["Flash OFF","Flash ON"],"Flash screen on fortune cookie spawn",!0),ColourFortuneFlash:new x("#ffffff","colour","NotificationFC","The colour of the fortune flash, standard colour is white"),FortuneSound:new S(1,"bool","NotificationFC",["Sound OFF","Sound ON"],"Play a sound on fortune cookie spawn",!0),FortuneVolume:new E(100,"vol","NotificationFC",[],"Volume"),FortuneSoundURL:new S("https://freesound.org/data/previews/174/174027_3242494-lq.mp3","url","NotificationFC","Sound URL:","URL of the sound to be played when the ticker has a fortune cookie"),SeaNotification:new F(0,"bool","NotificationSea",["Notification OFF","Notification ON"],"Create a notification on season popup",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SeaNotification)})),SeaFlash:new S(1,"bool","NotificationSea",["Flash OFF","Flash ON"],"Flash screen on season popup",!0),ColourSeaFlash:new x("#ffffff","colour","NotificationSea","The colour of the season popup flash, standard colour is white"),SeaSound:new S(1,"bool","NotificationSea",["Sound OFF","Sound ON"],"Play a sound on season popup",!0),SeaVolume:new E(100,"vol","NotificationSea",[],"Volume"),SeaSoundURL:new S("https://www.freesound.org/data/previews/121/121099_2193266-lq.mp3","url","NotificationSea","Sound URL:","URL of the sound to be played when on season popup spawns"),GardFlash:new S(1,"bool","NotificationGard",["Garden Tick Flash OFF","Flash ON"],"Flash screen on garden tick",!0),ColourGardFlash:new x("#ffffff","colour","NotificationGard","The colour of the garden flash, standard colour is white"),GardSound:new S(1,"bool","NotificationGard",["Sound OFF","Sound ON"],"Play a sound on garden tick",!0),GardVolume:new E(100,"vol","NotificationGard",[],"Volume"),GardSoundURL:new S("https://freesound.org/data/previews/103/103046_861714-lq.mp3","url","NotificationGard","Garden Tick Sound URL:","URL of the sound to be played when the garden ticks"),MagicNotification:new F(0,"bool","NotificationMagi",["Notification OFF","Notification ON"],"Create a notification when magic reaches maximum",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MagicNotification)})),MagicFlash:new S(1,"bool","NotificationMagi",["Flash OFF","Flash ON"],"Flash screen when magic reaches maximum",!0),ColourMagicFlash:new x("#ffffff","colour","NotificationMagi","The colour of the magic flash, standard colour is white"),MagicSound:new S(1,"bool","NotificationMagi",["Sound OFF","Sound ON"],"Play a sound when magic reaches maximum",!0),MagicVolume:new E(100,"vol","NotificationMagi",[],"Volume"),MagicSoundURL:new S("https://freesound.org/data/previews/221/221683_1015240-lq.mp3","url","NotificationMagi","Sound URL:","URL of the sound to be played when magic reaches maxium"),WrinklerNotification:new F(0,"bool","NotificationWrink",["Notification OFF","Notification ON"],"Create a notification when a wrinkler appears",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerNotification)})),WrinklerFlash:new S(1,"bool","NotificationWrink",["Flash OFF","Flash ON"],"Flash screen when a wrinkler appears",!0),ColourWrinklerFlash:new x("#ffffff","colour","NotificationWrink","The colour of the wrinkler flash, standard colour is white"),WrinklerSound:new S(1,"bool","NotificationWrink",["Sound OFF","Sound ON"],"Play a sound when a wrinkler appears",!0),WrinklerVolume:new E(100,"vol","NotificationWrink",[],"Volume"),WrinklerSoundURL:new S("https://freesound.org/data/previews/124/124186_8043-lq.mp3","url","NotificationWrink","Sound URL:","URL of the sound to be played when a wrinkler appears"),WrinklerMaxNotification:new F(0,"bool","NotificationWrinkMax",["Notification OFF","Notification ON"],"Create a notification when the maximum amount of wrinklers has appeared",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxNotification)})),WrinklerMaxFlash:new S(1,"bool","NotificationWrinkMax",["Flash OFF","Flash ON"],"Flash screen when the maximum amount of Wrinklers has appeared",!0),ColourWrinklerMaxFlash:new x("#ffffff","colour","NotificationWrinkMax","The colour of the maximum wrinkler flash, standard colour is white"),WrinklerMaxSound:new S(1,"bool","NotificationWrinkMax",["Sound OFF","Sound ON"],"Play a sound when the maximum amount of wrinklers has appeared",!0),WrinklerMaxVolume:new E(100,"vol","NotificationWrinkMax",[],"Volume"),WrinklerMaxSoundURL:new S("https://freesound.org/data/previews/152/152743_15663-lq.mp3","url","NotificationWrinkMax","Sound URL:","URL of the sound to be played when the maximum amount of wrinklers has appeared"),BulkBuyBlock:new S(1,"bool","Miscellaneous",["Block bulk buying OFF","Block bulk buying ON"],"Block clicking bulk buying when you can't buy all. This prevents buying 7 of a building when you are in buy-10 or buy-100 mode.",!0),FavouriteSettings:new F(1,"bool","Miscellaneous",["Favourite settings section OFF","Favourite settings section ON","Favourite settings section ON (Locked)"],"Show stars before each setting which allows selecting it for a 'favourites' section at the top of the Cookie Monster settings. Setting this to Locked removes the stars but shows the 'favourites' section",!0,(()=>{Game.UpdateMenu()}))};function on(){let e="";for(let t=0;t<ho.length;t++)e+=`.CMText${ho[t]} { color: ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[`Colour${ho[t]}`]}; }\n`;for(let t=0;t<ho.length;t++)e+=`.CMBack${ho[t]} { background-color: ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[`Colour${ho[t]}`]}; }\n`;for(let t=0;t<ho.length;t++)e+=`.CMBorder${ho[t]} { border: 1px solid ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[`Colour${ho[t]}`]}; }\n`;l("CMCSS").textContent=e,Wo()}function an(){const e=G("cookieMonsterMod","Cookie Monster","optionsMenu");return Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.optionsMenu&&Object.keys(Ya).forEach((t=>{if("Favourite"===t){if(0!==Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings.length&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FavouriteSettings>0&&(e.appendChild(b.createOptionsSubHeader("cookieMonsterMod",t,Ya[t])),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[t]))for(let t=0;t<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings.length;t++)e.appendChild(b.createOptionsListing("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings[t],tn,on,Za))}else e.appendChild(b.createOptionsSubHeader("cookieMonsterMod",t,Ya[t])),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[t]&&("Notification"===t?Object.keys(Ka).forEach((t=>{const o=b.createOptionsSubHeader("cookieMonsterMod",t,Ka[t]);o.style.fontSize="15px",o.style.opacity="0.5",e.appendChild(o),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[t]&&Object.keys(tn).forEach((o=>{tn[o].group===t&&e.appendChild(b.createOptionsListing("cookieMonsterMod",o,tn,on,Za))}))})):Object.keys(tn).forEach((o=>{tn[o].group===t&&e.appendChild(b.createOptionsListing("cookieMonsterMod",o,tn,on,Za))})))})),e}function nn(e){return String(e).split(String(7)).length-1}function rn(e,t){const o=10*t;let a=7*t-e%o+e%t;return a<0&&(a+=o),a}function sn(e,t){const o=document.createElement("div");o.className="title",o.style.padding="0px 16px",o.style.opacity="0.7",o.style.fontSize="17px",o.style.fontFamily='"Kavoon", Georgia, serif',o.appendChild(document.createTextNode(`${e} `));const a=document.createElement("span");return a.style.cursor="pointer",a.style.display="inline-block",a.style.height="14px",a.style.width="14px",a.style.borderRadius="7px",a.style.textAlign="center",a.style.backgroundColor="#C0C0C0",a.style.color="black",a.style.fontSize="13px",a.style.verticalAlign="middle",a.textContent=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[t]?"-":"+",a.onclick=function(){!function(e){Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[e]+=1,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[e]>1&&(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[e]=0),w.saveFramework()}(t),Game.UpdateMenu()},o.appendChild(a),o}function ln(e,t,o,a){const n=document.createElement("div");n.className="listing";const i=document.createElement("b");if(i.textContent=t,n.appendChild(i),"withTooltip"===e){n.className="listing",n.appendChild(document.createTextNode(" "));const e=document.createElement("span");e.onmouseout=function(){Game.tooltip.hide()},e.onmouseover=function(){Game.tooltip.draw(this,escape(fo[a].innerHTML))},e.style.cursor="default",e.style.display="inline-block",e.style.height="10px",e.style.width="10px",e.style.borderRadius="5px",e.style.textAlign="center",e.style.backgroundColor="#C0C0C0",e.style.color="black",e.style.fontSize="9px",e.style.verticalAlign="bottom",e.textContent="?",n.appendChild(e)}return n.appendChild(document.createTextNode(": ")),n.appendChild(o),n}function cn(e,t,o,a){const n=document.createElement("div");n.className="listing";const i=document.createElement("b");return i.textContent=t,!0===a&&(i.style.color=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ColourGreen),n.appendChild(i),n.appendChild(document.createTextNode(": ")),n.appendChild(o),n}function dn(e){const t=document.createDocumentFragment();t.appendChild(document.createTextNode(`${e.length} `));const o=document.createElement("span");o.onmouseout=function(){Game.tooltip.hide()};const a=document.createElement("div"),n=document.createElement("div");n.style.minWidth="140px",n.style.marginBottom="4px";const i=document.createElement("div");return i.className="name",i.style.marginBottom="4px",i.style.textAlign="center",i.textContent="Missing",n.appendChild(i),Object.keys(e).forEach((t=>{const o=document.createElement("div");o.style.textAlign="center",o.appendChild(document.createTextNode(e[t])),n.appendChild(o)})),a.appendChild(n),o.onmouseover=function(){Game.tooltip.draw(this,escape(a.innerHTML))},o.style.cursor="default",o.style.display="inline-block",o.style.height="10px",o.style.width="10px",o.style.borderRadius="5px",o.style.textAlign="center",o.style.backgroundColor="#C0C0C0",o.style.color="black",o.style.fontSize="9px",o.style.verticalAlign="bottom",o.textContent="?",t.appendChild(o),t}function mn(e){const t=document.createElement("div");if(t.className="subsection",t.appendChild(e),t.appendChild(sn("Lucky Cookies","Lucky")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Lucky&&t.appendChild(function(){const e=Game.auraMult("Dragon's Fortune")?"GoldCookDragonsFortuneTooltipPlaceholder":"GoldCookTooltipPlaceholder",t=document.createElement("div");t.className="CMStatsLuckySection";const o=Game.cookies+Io()<ke?lo:io,a=Game.cookies+Io()<ke?Uo((ke-(Game.cookies+Io()))/Ro()):"",n=document.createDocumentFragment(),i=document.createElement("span");if(i.style.fontWeight="bold",i.className=oo+o,i.textContent=to(ke),n.appendChild(i),""!==a){const e=document.createElement("small");e.textContent=` (${a})`,n.appendChild(e)}t.appendChild(ln("withTooltip",'"Lucky!" cookies required',n,e));const r=Game.cookies+Io()<ye?lo:io,s=Game.cookies+Io()<ye?Uo((ye-(Game.cookies+Io()))/Ro()):"",l=document.createDocumentFragment(),c=document.createElement("span");if(c.style.fontWeight="bold",c.className=oo+r,c.textContent=to(ye),l.appendChild(c),""!==s){const e=document.createElement("small");e.textContent=` (${s})`,l.appendChild(e)}t.appendChild(ln("withTooltip",'"Lucky!" cookies required (frenzy)',l,e));const d=Ce!==Me,m=document.createElement("span");m.style.fontWeight="bold",m.className=oo+Ce,m.textContent=to(Ce)+(d?` / ${to(Me)}`:""),t.appendChild(ln("withTooltip",'"Lucky!" reward (max)'+(d?" (golden / wrath)":""),m,e));const p=document.createElement("span");p.style.fontWeight="bold",p.className=oo+p,p.textContent=to(be)+(d?` / ${to(Ge)}`:""),t.appendChild(ln("withTooltip",'"Lucky!" reward (max) (frenzy)'+(d?" (golden / wrath)":""),p,e));const u=Math.min(.15*(Game.cookies+Io()),Se*Fe*60*15)+13,h=document.createElement("span");return h.style.fontWeight="bold",h.className=oo+h,h.textContent=to(Ee*u)+(d?` / ${to(Be*u)}`:""),t.appendChild(ln("withTooltip",'"Lucky!" reward (cur)'+(d?" (golden / wrath)":""),h,e)),t}()),t.appendChild(sn("Chain Cookies","Chain")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Chain&&t.appendChild(function(){const e=Game.auraMult("Dragon's Fortune")?"GoldCookDragonsFortuneTooltipPlaceholder":"GoldCookTooltipPlaceholder",t=document.createElement("div");t.className="CMStatsChainSection";const o=Game.cookies+Io()<qe?lo:io,a=Game.cookies+Io()<qe?Uo((qe-(Game.cookies+Io()))/Ro()):"",n=document.createDocumentFragment(),i=document.createElement("span");if(i.style.fontWeight="bold",i.className=oo+o,i.textContent=to(qe),n.appendChild(i),""!==a){const e=document.createElement("small");e.textContent=` (${a})`,n.appendChild(e)}t.appendChild(ln("withTooltip",'"Chain" cookies required',n,e));const r=Game.cookies+Io()<Je?lo:io,s=Game.cookies+Io()<Je?Uo((Je-(Game.cookies+Io()))/Ro()):"",l=document.createDocumentFragment(),c=document.createElement("span");if(c.style.fontWeight="bold",c.className=oo+r,c.textContent=to(Je),l.appendChild(c),""!==s){const e=document.createElement("small");e.textContent=` (${s})`,l.appendChild(e)}t.appendChild(ln("withTooltip",'"Chain" cookies required (Wrath)',l,e));const d=Game.cookies+Io()<tt?lo:io,m=Game.cookies+Io()<tt?Uo((tt-(Game.cookies+Io()))/Ro()):"",p=document.createDocumentFragment(),u=document.createElement("span");if(u.style.fontWeight="bold",u.className=oo+d,u.textContent=to(tt),p.appendChild(u),""!==m){const e=document.createElement("small");e.textContent=` (${m})`,p.appendChild(e)}t.appendChild(ln("withTooltip",'"Chain" cookies required (Frenzy)',p,e));const h=Game.cookies+Io()<nt?lo:io,g=Game.cookies+Io()<nt?Uo((nt-(Game.cookies+Io()))/Ro()):"",f=document.createDocumentFragment(),k=document.createElement("span");if(k.style.fontWeight="bold",k.className=oo+h,k.textContent=to(nt),f.appendChild(k),""!==g){const e=document.createElement("small");e.textContent=` (${g})`,f.appendChild(e)}t.appendChild(ln("withTooltip",'"Chain" cookies required (frenzy) (Wrath)',f,e)),t.appendChild(ln("withTooltip",'"Chain" reward (max) (golden / wrath)',document.createTextNode(`${to(Ke[0])} / ${to(et[0])}`),e)),t.appendChild(ln("withTooltip",'"Chain" reward (max) (frenzy) (golden / wrath)',document.createTextNode(`${to(at[0])} / ${to(at[0])}`),e));const C=Math.min(60*Game.cookiesPs*60*6*Fe,.5*Game.cookies),M=Na(7,C,Ee)[0],y=Na(6,C,Be)[0];return t.appendChild(ln("withTooltip",'"Chain" reward (cur) (golden / wrath)',document.createTextNode(`${to(M)} / ${to(y)}`),e)),t.appendChild(ln("withTooltip","CPS needed for next level (g / w)",document.createTextNode(`${to(Ye)} / ${to(Ze)}`),"ChainNextLevelPlaceholder")),t.appendChild(ln("withTooltip","CPS needed for next level (frenzy) (g / w)",document.createTextNode(`${to(ot)} / ${to(it)}`),"ChainNextLevelPlaceholder")),t}()),Game.Objects["Wizard tower"].minigameLoaded&&(t.appendChild(sn("Spells","Spells")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Spells&&t.appendChild(function(){const e=document.createElement("div");e.className="CMStatsSpellsSection";const t=Game.cookies+Io()<ve?lo:io,o=Game.cookies+Io()<ve?Uo((ve-(Game.cookies+Io()))/Ro()):"",a=document.createDocumentFragment(),n=document.createElement("span");if(n.style.fontWeight="bold",n.className=oo+t,n.textContent=to(ve),a.appendChild(n),""!==o){const e=document.createElement("small");e.textContent=` (${o})`,a.appendChild(e)}e.appendChild(ln("withTooltip",'"Conjure Baked Goods" cookies required',a,"GoldCookTooltipPlaceholder")),e.appendChild(ln("withTooltip",'"Conjure Baked Goods" reward (max)',document.createTextNode(to(we)),"GoldCookTooltipPlaceholder"));const i=Game.cookies+Io()<7*ve?lo:io,r=Math.min(.15*(Game.cookies+Io()),60*Se*30),s=Game.cookies+Io()<7*ve?Uo((7*ve-(Game.cookies+Io()))/Ro()):"",l=document.createDocumentFragment(),c=document.createElement("span");if(c.style.fontWeight="bold",c.className=oo+i,c.textContent=to(7*ve),l.appendChild(c),""!==s){const e=document.createElement("small");e.textContent=` (${s})`,l.appendChild(e)}return e.appendChild(ln("withTooltip",'"Conjure Baked Goods" cookies required (frenzy)',l,"GoldCookTooltipPlaceholder")),e.appendChild(ln("withTooltip",'"Conjure Baked Goods" reward (max) (frenzy)',document.createTextNode(to(7*we)),"GoldCookTooltipPlaceholder")),e.appendChild(ln("withTooltip",'"Conjure Baked Goods" reward (cur)',document.createTextNode(to(r)),"GoldCookTooltipPlaceholder")),xe&&e.appendChild(ln("withTooltip",'"Spontaneous Edifice" cookies required (most expensive building)',document.createTextNode(`${to(xe)} (${Te})`),"GoldCookTooltipPlaceholder")),e}())),Game.Objects.Farm.minigameLoaded&&(t.appendChild(sn("Garden","Garden")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Garden&&t.appendChild(function(){const e=document.createElement("div");e.className="CMStatsGardenSection";const t=Game.cookies<60*Game.cookiesPs*10*100?lo:io,o=document.createElement("span");o.style.fontWeight="bold",o.className=oo+t,o.textContent=to(60*Game.cookiesPs*10*100),e.appendChild(ln("basic","Cookies required for max reward of Bakeberry: ",o));const a=Game.cookies<60*Game.cookiesPs*100?lo:io,n=document.createElement("span");n.style.fontWeight="bold",n.className=oo+a,n.textContent=to(60*Game.cookiesPs*100),e.appendChild(ln("basic","Cookies required for max reward of Chocoroot: ",n));const i=Game.cookies<60*Game.cookiesPs*60*25?lo:io,r=document.createElement("span");r.style.fontWeight="bold",r.className=oo+i,r.textContent=to(60*Game.cookiesPs*60*25),e.appendChild(ln("basic","Cookies required for max reward of Queenbeet: ",r));const s=Game.cookies<60*Game.cookiesPs*15*100?lo:io,l=document.createElement("span");l.style.fontWeight="bold",l.className=oo+s,l.textContent=to(60*Game.cookiesPs*15*100),e.appendChild(ln("basic","Cookies required for max reward of Duketater: ",l));const c=[];return Object.keys(pa).forEach((e=>{Game.HasUnlocked(pa[e])||c.push(pa[e])})),0!==c.length&&e.appendChild(ln("basic","Rare plant drops left to unlock",dn(c))),e}())),t.appendChild(sn("Prestige","Prestige")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Prestige&&t.appendChild(function(){const e=document.createElement("div");e.className="CMStatsPrestigeSection";const t=Math.floor(Game.HowMuchPrestige(st+Game.cookiesReset+$e+(Game.HasUnlocked("Chocolate egg")&&!Game.Has("Chocolate egg")?De:0)));e.appendChild(ln("withTooltip","Prestige level (cur / max)",document.createTextNode(`${to(Game.prestige)} / ${to(t)}`),"PrestMaxTooltipPlaceholder"));const o=Math.max(0,Game.HowManyCookiesReset(t+1)-(st+Game.cookiesReset+$e+(Game.HasUnlocked("Chocolate egg")&&!Game.Has("Chocolate egg")&&De?De:0))),a=document.createDocumentFragment();a.appendChild(document.createTextNode(to(o)));const n=document.createElement("small");n.textContent=` (${Uo(o/lt,1)})`,a.appendChild(n),e.appendChild(ln("withTooltip","Cookies to next level",a,"NextPrestTooltipPlaceholder")),e.appendChild(ln("withTooltip","Heavenly chips (cur / max)",document.createTextNode(`${to(Game.heavenlyChips)} / ${to(t-Game.prestige+Game.heavenlyChips)}`),"HeavenChipMaxTooltipPlaceholder")),e.appendChild(ln("basic","Heavenly chips per second (last 5 seconds)",document.createTextNode(to(Pe,2))));const i=Number(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.HeavenlyChipsTarget);if(!Number.isNaN(i)){const t=i-Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned));t>0&&(e.appendChild(ln("basic","Heavenly chips to target set in settings (cur)",document.createTextNode(to(t)))),e.appendChild(ln("basic","Time till target (cur, current 5 second average)",document.createTextNode(Uo(t/Pe)))))}const r=function(e){let t=Game.cookiesPs;ta(),0===Mt["Heavenly key"].bought&&(Mt["Heavenly chip secret"].bought=1,Mt["Heavenly cookie stand"].bought=1,Mt["Heavenly bakery"].bought=1,Mt["Heavenly confectionery"].bought=1,Mt["Heavenly key"].bought=1,sa(),t=me,ta()),st>=1e6&&ra("Sacrifice"),st>=1e9&&ra("Oblivion"),st>=1e12&&ra("From scratch"),st>=1e15&&ra("Nihilism"),st>=1e18&&ra("Dematerialize"),st>=1e21&&ra("Nil zero zilch"),st>=1e24&&ra("Transcendence"),st>=1e27&&ra("Obliterate"),st>=1e30&&ra("Negative void"),st>=1e33&&ra("To crumbs, you say?"),st>=1e36&&ra("You get nothing"),st>=1e39&&ra("Humble rebeginnings"),st>=1e42&&ra("The end of the world"),st>=1e45&&ra("Oh, you're back"),st>=1e48&&ra("Lazarus"),st>=1e51&&ra("Smurf account"),st>=1e54&&ra("If at first you don't succeed"),Mt["Heavenly chip secret"].bought=1,Mt["Heavenly cookie stand"].bought=1,Mt["Heavenly bakery"].bought=1,Mt["Heavenly confectionery"].bought=1,Mt["Heavenly key"].bought=1,ae=e;const o=te;sa(),ha(),o!==te&&sa();const a=me-t;return ae=Game.prestige,a}(t),s=document.createDocumentFragment();s.appendChild(document.createTextNode(to(r)));const l=Math.round(r/Game.cookiesPs*1e4);if(Number.isFinite(l)&&0!==l){const e=document.createElement("small");e.textContent=` (${l/100}% of income)`,s.appendChild(e)}e.appendChild(ln("withTooltip","Reset bonus income",s,"ResetTooltipPlaceholder"));const c=Math.floor(Game.HowMuchPrestige(Game.cookiesReset)),d=Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned)),m=d-c,{luckyDigit:p,luckyNumber:u,luckyPayout:h}=function(e){const t={};let o=nn(e);const a=String(e).length;if(o>=1&&(t.luckyDigit=e,o>=2&&(t.luckyNumber=e,o>=4)))return t.luckyPayout=e,t;let n;if(n=a>=16?Math.ceil(e/10**(a-15)):e,o=nn(n),void 0===t.luckyDigit&&(o<1&&(n+=rn(n,1),o=nn(n)),t.luckyDigit=n,a>=16&&(t.luckyDigit*=10**Number(a-15))),void 0===t.luckyNumber){for(;o<2;){let e=rn(n,1);0===e&&(e=rn(n,10)),n+=e,o=nn(n)}t.luckyNumber=n,a>=16&&(t.luckyNumber*=10**Number(a-15))}let i=1;for(;o<4;){const e=rn(n,i);0===e?i*=10:(n+=e,o=nn(n))}return t.luckyPayout=n,a>=16&&(t.luckyPayout*=10**Number(a-15)),t}(d);if(!Game.Has("Lucky digit")){const t=p-d,o=m+t,a=document.createDocumentFragment();a.appendChild(document.createTextNode(`${p.toLocaleString()} / ${o.toLocaleString()} (+${t})`)),e.appendChild(ln("basic",'Next "Lucky Digit" (total / reset)',a))}if(!Game.Has("Lucky number")){const t=u-d,o=m+t,a=document.createDocumentFragment();a.appendChild(document.createTextNode(`${u.toLocaleString()} / ${o.toLocaleString()} (+${t})`)),e.appendChild(ln("basic",'Next "Lucky Number" (total / reset)',a))}if(!Game.Has("Lucky payout")){const t=h-d,o=m+t,a=document.createDocumentFragment();a.appendChild(document.createTextNode(`${h.toLocaleString()} / ${o.toLocaleString()} (+${t})`)),e.appendChild(ln("basic",'Next "Lucky Payout" (total / reset)',a))}return e}()),Game.cpsSucked>0&&(t.appendChild(sn("Wrinklers","Wrink")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Wrink)){const e=document.createDocumentFragment();e.appendChild(document.createTextNode(`${to($e)} / ${to(Ue)} `));const o=document.createElement("a");o.textContent="Pop All Normal",o.className="option",o.onclick=function(){Ra()},e.appendChild(o),t.appendChild(ln("basic","Rewards of Popping (All/Normal)",e));const a=document.createDocumentFragment();a.appendChild(document.createTextNode(`${to(He[0])} `));const n=document.createElement("a");n.textContent="Pop Single Fattest",n.className="option",n.onclick=function(){null!==He[1]&&(Game.wrinklers[He[1]].hp=0)},a.appendChild(n),t.appendChild(ln("basic",`Rewards of Popping Single Fattest Non-Shiny Wrinkler (id: ${null!==He[1]?He[1]:"None"})`,a))}if(t.appendChild(function(){const e=document.createElement("div");e.className="CMStatsSeasonSection";let t=!1;const o=[];Object.keys(ca).forEach((e=>{Game.Has(ca[e])||(o.push(ca[e]),t=!0)}));const a=[];Object.keys(da).forEach((e=>{Game.Has(da[e])||(a.push(da[e]),t=!0)}));const n=[];Object.keys(ma).forEach((e=>{Game.Has(ma[e])||(n.push(ma[e]),t=!0)}));const i=[];Object.keys(Game.eggDrops).forEach((e=>{Game.HasUnlocked(Game.eggDrops[e])||(i.push(Game.eggDrops[e]),t=!0)}));const r=[];Object.keys(Game.rareEggDrops).forEach((e=>{Game.HasUnlocked(Game.rareEggDrops[e])||(r.push(Game.rareEggDrops[e]),t=!0)}));const s=Game.HasUnlocked("Chocolate egg")&&!Game.Has("Chocolate egg"),l=Game.Has("Century egg");if(("christmas"===Game.season||t||s||l)&&(e.appendChild(sn("Season Specials","Sea")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Sea)){if(0!==o.length){e.appendChild(cn(0,"Halloween cookies left to buy",dn(o),"halloween"===Game.season));let t=.95;if(Game.HasAchiev("Spooky cookies")&&(t=.8),Game.Has("Starterror")&&(t*=.9),t*=1/Game.dropRateMult(),Game.hasGod){const e=Game.hasGod("seasons");1===e?t*=.9:2===e?t*=.95:3===e&&(t*=.97)}const a=o.length/7;e.appendChild(cn(0,"Chance of receiving a cookie from wrinkler/shiny wrinkler",document.createTextNode(`${to((1-t)*a*100)}% / ${to((1-.9*t)*a*100)}%`),"halloween"===Game.season))}if(0!==a.length){e.appendChild(cn(0,"Christmas cookies left to buy",dn(a),"christmas"===Game.season));let t=.8;if(Game.HasAchiev("Let it snow")&&(t=.6),t*=1/Game.dropRateMult(),Game.Has("Starsnow")&&(t*=.95),Game.hasGod){const e=Game.hasGod("seasons");1===e?t*=.9:2===e?t*=.95:3===e&&(t*=.97)}const o=a.length/7;e.appendChild(cn(0,"Chance of receiving a cookie from reindeer",document.createTextNode(`${to((1-t)*o*100)}%`),"christmas"===Game.season))}0!==n.length&&e.appendChild(cn(0,"Valentine cookies left to buy",dn(n),"valentines"===Game.season));const t=function(e){let t=e*(1/Game.dropRateMult());if(Game.HasAchiev("Hide & seek champion")&&(t*=.7),Game.Has("Omelette")&&(t*=.9),Game.Has("Starspawn")&&(t*=.9),Game.hasGod){const e=Game.hasGod("seasons");1===e?t*=.9:2===e?t*=.95:3===e&&(t*=.97)}const o=1-t,a=Game.eggDrops.length-i.length,n=Game.rareEggDrops.length-r.length,s=.9*o*(1-a/Game.eggDrops.length),l=.1*o*(1-n/Game.rareEggDrops.length),c=.9*o*(a/Game.eggDrops.length)+.1*o*(n/Game.rareEggDrops.length);return[s+.9*c*(1-a/Game.eggDrops.length),l+.1*c*(1-n/Game.rareEggDrops.length)]};0!==i.length&&(e.appendChild(cn(0,"Normal easter eggs left to unlock",dn(i),"easter"===Game.season)),e.appendChild(cn(0,"Chance of receiving an egg from wrinkler/golden cookie",document.createTextNode(`${to(100*t(.98)[0])}% / ${to(100*t(.9)[0])}%`),"easter"===Game.season))),0!==r.length&&(e.appendChild(cn(0,"Rare easter eggs left to unlock",dn(r),"easter"===Game.season)),e.appendChild(cn(0,"Chance of receiving a rare egg from wrinkler/golden cookie",document.createTextNode(`${to(100*t(.98)[1])}% / ${to(100*t(.9)[1])}%`),"easter"===Game.season))),"christmas"===Game.season&&e.appendChild(cn(0,"Reindeer reward",document.createTextNode(to(Oe)),!0)),s&&e.appendChild(ln("withTooltip","Chocolate egg cookies",document.createTextNode(to(De)),"ChoEggTooltipPlaceholder")),l&&e.appendChild(ln("basic","Century egg multiplier",document.createTextNode(Math.round(1e4*(Ne-1))/100+"%")))}return e}()),t.appendChild(sn("Achievements","Achievs")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Achievs&&Object.keys(Game.Objects).forEach((e=>{const o=je[e];t.appendChild(ln("basic",e,o.AmountNeeded<101?document.createTextNode(`Next achievement in ${o.AmountNeeded}, price: ${to(o.price)}`):document.createTextNode("No new achievement for next 100 buildings")))})),t.appendChild(sn("Miscellaneous","Misc")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Misc){if(t.appendChild(ln("basic",`Average cookies per second (past ${xo[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist]<60?`${xo[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist]} seconds`:xo[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist]/60+(3===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist?" minute":" minutes")})`,document.createTextNode(to(Ro(),3)))),t.appendChild(ln("basic",`Average cookie clicks per second (past ${To[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist]}${0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist?" second":" seconds"})`,document.createTextNode(to(Ve,1)))),t.appendChild(ln("basic",`Cookies from clicking (past ${To[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist]}${0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist?" second":" seconds"})`,document.createTextNode(to(P.calcSum(Ve*To[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist]))))),Game.Has("Fortune cookies")){const e=[];Object.keys(la).forEach((t=>{Game.Has(la[t])||e.push(la[t])})),0!==e.length&&t.appendChild(ln("basic","Fortune Upgrades Left to Buy",dn(e)))}if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ShowMissedGC&&t.appendChild(ln("basic","Missed golden cookies",document.createTextNode(to(Game.missedGoldenClicks)))),Game.prefs.autosave){const e=document.createElement("span");e.id="CMStatsAutosaveTimer",e.innerText=Game.sayTime(60*Game.fps-(Game.OnAscend?0:Game.T%(60*Game.fps)),4),t.appendChild(ln("basic","Time till autosave",e))}}l("menu").insertBefore(t,l("menu").childNodes[2]),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingUpgrades&&l("menu").childNodes.forEach((e=>{if(e.children[0])if("Prestige"===e.children[0].innerHTML&&Xe){const t=Xe.match(new RegExp("div","g")||0).length/2,o=document.createElement("div");o.id="CMMissingUpgradesPrestigeTitle",o.className="listing";const a=document.createElement("div");a.innerHTML=`<b>Missing Prestige upgrades:</b> ${t}/${Game.PrestigeUpgrades.length} (${Math.floor(t/Game.PrestigeUpgrades.length*100)}%)`,o.appendChild(a),e.appendChild(o);const n=document.createElement("div");n.className="listing crateBox",n.innerHTML=Xe,e.appendChild(n)}else if("Upgrades"===e.children[0].innerHTML){if(_e){const t=_e.match(new RegExp("div","g")||0).length/2,o=document.createElement("div");o.id="CMMissingUpgradesTitle",o.className="listing";const a=document.createElement("div");a.innerHTML=`<b>Missing normal upgrades:</b> ${t}/${Game.UpgradesByPool[""].length+Game.UpgradesByPool.tech.length} (${Math.floor(t/(Game.UpgradesByPool[""].length+Game.UpgradesByPool.tech.length)*100)}%)`,o.appendChild(a),e.insertBefore(o,e.childNodes[3]);const n=document.createElement("div");n.className="listing crateBox",n.innerHTML=_e,e.insertBefore(n,document.getElementById("CMMissingUpgradesTitle").nextSibling)}if(Qe){const t=Qe.match(new RegExp("div","g")||0).length/2,o=document.createElement("div");o.id="CMMissingUpgradesCookiesTitle",o.className="listing";const a=document.createElement("div");a.innerHTML=`<b>Missing Cookie upgrades:</b> ${t}/${Game.UpgradesByPool.cookie.length} (${Math.floor(t/Game.UpgradesByPool.cookie.length*100)}%)`,o.appendChild(a),e.appendChild(o);const n=document.createElement("div");n.className="listing crateBox",n.innerHTML=Qe,e.appendChild(n)}}})),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingAchievements&&function(){let e;Object.values(document.querySelectorAll("div.title")).forEach((t=>{t.textContent.includes("Achievements")&&(e=t.parentElement.querySelectorAll("div.listing.crateBox")[0])})),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingAchievements&&Object.values(e.children).forEach((e=>{if(!e.className.includes("enabled")){const t=e.onclick.toString().split(/\[(.*)\]/gi)[1],{icon:o}=Game.AchievementsById[t];e.style.backgroundPosition=`${48*-o[0]}px ${48*-o[1]}px`,e.onmouseover=function(){Game.mouseDown||(Game.setOnCrate(this),Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>function(e){const t=[];"shadow"===e.pool?t.push("Shadow Achievement","#9700cf"):t.push("Achievement",0),t.push("Locked",0);let o=0;(Game.Has("Neuromancy")||Game.sesame&&"debug"===e.pool)&&(o=1),o&&0===e.won?t.push("Click to win!","#00c462"):o&&e.won>0&&t.push("Click to lose!","#00c462");let{icon:a}=e;e.iconFunction&&(a=e.iconFunction());let{desc:n}=e;e.descFunc&&(n=e.descFunc("stats"));let i="";for(let e=0;e<t.length;e+=2)e%2==0&&(i+=` <div class="tag" style="color:${0===t[e+1]?"#fff":t[e+1]};">[${t[e]}]</div>`);return i=i.substring(1),`<div style="padding:8px 4px;min-width:350px;opacity:0.5">\n <div class="icon" style="float:left;margin-left:-8px;margin-top:-8px;background-position:${48*-a[0]}px ${48*-a[1]}px;"></div>\n <div class="name">${e.name}</div>\n ${i}<div class="line"></div><div class="description">${n}</div></div>\n ${Game.sesame?`<div style="font-size:9px;">Id : ${e.id} | Order : ${Math.floor(e.order)}${e.tier?` | Tier : ${e.tier}`:""}</div>`:""}`}(Game.AchievementsById[t])),"top"),Game.tooltip.wobble())}}}))}()}function pn(e){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos){const t=parseInt(l("CMTimerBar").style.height,10);Game.mouseY-=t,e(),Game.mouseY+=t}else e()}function un(){Jt.Beautify=Beautify,Beautify=to,Jt.CalculateGains=Game.CalculateGains,Game.CalculateGains=function(){Jt.CalculateGains(),ce=1,Zt=Date.now(),eo=Date.now()},Jt.tooltip={},Jt.tooltip.draw=Game.tooltip.draw,Jt.tooltip.drawMod=new Function(`return ${Game.tooltip.draw.toString().split("this").join("Game.tooltip")}`)(),Game.tooltip.draw=function(e,t,o){Jt.tooltip.drawMod(e,t,o)},Jt.tooltip.update=Game.tooltip.update,Jt.tooltip.updateMod=new Function(`return ${Game.tooltip.update.toString().split("this.").join("Game.tooltip.")}`)(),Game.tooltip.update=function(){Jt.tooltip.updateMod(),function(){if("store"===Game.tooltip.origin){let e=0;1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLucky&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos&&null!==l("CMDispTooltipWarningParent")&&(e=l("CMDispTooltipWarningParent").clientHeight-4),Game.tooltip.tta.style.top=`${Math.min(parseInt(Game.tooltip.tta.style.top,10),l("game").clientHeight+l("topBar").clientHeight-Game.tooltip.tt.clientHeight-e-46)}px`}}()},Jt.UpdateWrinklers=Game.UpdateWrinklers,Game.UpdateWrinklers=function(){pn(Jt.UpdateWrinklers)},Jt.UpdateSpecial=Game.UpdateSpecial,Game.UpdateSpecial=function(){pn(Jt.UpdateSpecial)},l("bigCookie").removeEventListener("click",Game.ClickCookie,!1),l("bigCookie").addEventListener("click",(e=>{pn((()=>Game.ClickCookie(e,0)))}),!1),Jt.RebuildUpgrades=Game.RebuildUpgrades,Game.RebuildUpgrades=function(){Jt.RebuildUpgrades(),Kt=[],Object.keys(Game.UpgradesInStore).forEach((e=>{null!==l(`upgrade${e}`).onmouseover&&(Kt[e]=l(`upgrade${e}`).onmouseover,l(`upgrade${e}`).onmouseover=function(){Game.mouseDown||(Game.setOnCrate(this),Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("u",`${e}`)),"store"),Game.tooltip.wobble())})})),Game.CalculateGains()},Jt.ClickProduct=Game.ClickProduct,Game.ClickProduct=function(e){(!Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BulkBuyBlock||Game.ObjectsById[e].bulkPrice<=Game.cookies||-1===Game.buyMode)&&Jt.ClickProduct(e)},Jt.DescribeDragonAura=Game.DescribeDragonAura,Game.DescribeDragonAura=function(e){Jt.DescribeDragonAura(e),function(e){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.DragonAuraInfo){const[t,o]=function(e){ta(),l("promptContent").children[0].innerHTML.includes("secondary")?ie=e:ne=e;let t=0;if(ne!==ue||ie!==he)for(let e=Game.ObjectsById.length-1;e>-1;--e)if(Game.ObjectsById[e].amount>0){const o=Ct[Game.ObjectsById[e].name].name;Ct[o].amount-=1,J-=1,t=Ct[o].basePrice*Game.priceIncrease**Math.max(0,Ct[o].amount-1-Ct[o].free),t=Game.modifyBuildingPrice(Ct[o],t),t=Math.ceil(t);break}const o=te;return sa(),ha(),o!==te&&sa(),[me-Game.cookiesPs,t]}(e),a=Uo(o/(t+Game.cookiesPs));let n;n=0===Game.cookiesPs?to(1/0):to(t/Game.cookiesPs*100),l("dragonAuraInfo").style.minHeight="60px",l("dragonAuraInfo").style.margin="8px",l("dragonAuraInfo").appendChild(document.createElement("div")).className="line";const i=document.createElement("div");i.style.minWidth="200px",i.style.textAlign="center",i.textContent=`Picking this aura will change CPS by ${to(t)} (${n}% of current CPS).`,l("dragonAuraInfo").appendChild(i);const r=document.createElement("div");r.style.minWidth="200px",r.style.textAlign="center",r.textContent=`It will take ${a} to recover the cost.`,l("dragonAuraInfo").appendChild(r)}}(e)},Jt.ToggleSpecialMenu=Game.ToggleSpecialMenu,Game.ToggleSpecialMenu=function(e){Jt.ToggleSpecialMenu(e),function(){if(null!==(l("specialPopup").className.match(/onScreen/)&&l("specialPopup").children[0].style.background.match(/dragon/)))for(let e=0;e<l("specialPopup").childNodes.length;e++)"optionBox"===l("specialPopup").childNodes[e].className&&(l("specialPopup").children[e].onmouseover=function(){qa(),Game.tooltip.dynamic=1,Game.tooltip.draw(l("specialPopup"),`<div style="min-width:200px;text-align:center;">${fe}</div>`,"this"),Game.tooltip.wobble()},l("specialPopup").children[e].onmouseout=function(){Game.tooltip.shouldHide=1})}()},Jt.UpdateMenu=Game.UpdateMenu,Game.UpdateMenu=function(){void 0!==s().picker&&void 0!==s().picker.owner||(Jt.UpdateMenu(),function(){const e=document.createElement("div");e.className="title","stats"===Game.onMenu?Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Stats&&(e.textContent="Cookie Monster Statistics",mn(e)):"prefs"===Game.onMenu&&l("menu").childNodes[2].insertBefore(an(),l("menu").childNodes[2].childNodes[l("menu").childNodes[2].childNodes.length-1])}())},Jt.sayTime=Game.sayTime,bo=function(e,t){return Number.isNaN(e)||e<=0?Jt.sayTime(e,t):Uo(e/Game.fps,1)},Jt.Logic=Game.Logic,Game.Logic=function(){Jt.Logic();let e="Cookie Clicker";"fools"===Game.season&&(e="Cookie Baker"),Ao=`${Game.OnAscend?"Ascending! ":""}${to(Game.cookies)} ${1===Game.cookies?"cookie":"cookies"} - ${e}`,function(){if(Game.OnAscend||0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title)document.title=Ao;else if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title){let e,t,o,a=!1,n=!1;e=ct?ct.wrath?`[W${Math.ceil(ct.life/Game.fps)}]`:`[G${Math.ceil(ct.life/Game.fps)}]`:Game.Has("Golden switch [off]")?"[GS]":`[${Number(l("CMTimerBarGCMinBar").textContent)<0?"!":""}${Math.ceil((Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.time)/Game.fps)}]`,Ht&&(a=!0,t="[F]"),"christmas"===Game.season&&(n=!0,o=Ut?`[R${Math.ceil(dt.life/Game.fps)}]`:`[${Number(l("CMTimerBarRenMinBar").textContent)<0?"!":""}${Math.ceil((Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.time)/Game.fps)}]`);let i=Ao;"["===i.charAt(0)&&(i=i.substring(i.lastIndexOf("]")+1)),document.title=`${e+(a?t:"")+(n?o:"")} ${i}`}else if(2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title){let e="",t=!1;ct&&(t=!0,ct.wrath?e+=`[W${Math.ceil(ct.life/Game.fps)}]`:e+=`[G${Math.ceil(ct.life/Game.fps)}]`),Ht&&(t=!0,e+="[F]"),"christmas"===Game.season&&Ut&&(e+=`[R${Math.ceil(dt.life/Game.fps)}]`,t=!0),t&&(e+=" - ");let o="Cookie Clicker";"fools"===Game.season&&(o="Cookie Baker"),e+=o,document.title=e}}(),function(){const e=Math.max(0,Game.HowManyCookiesReset(Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned))+1)-(Game.cookiesEarned+Game.cookiesReset)),t=Game.sayTime((Date.now()-Game.startDate)/1e3*Game.fps,-1);let o=`You've been on this run for <b>${""===t?"not very long":t}</b>.<br>\n <div class="line"></div>`;Game.prestige>0&&(o+=`Your prestige level is currently <b>${to(Game.prestige)}</b>.<br>(CpS +${to(Game.prestige)}%)\n <div class="line"></div>`),o+=q<1?"Ascending now would grant you no prestige.":q<2?"Ascending now would grant you<br><b>1 prestige level</b> (+1% CpS)<br>and <b>1 heavenly chip</b> to spend.":`Ascending now would grant you<br><b>${to(q)} prestige levels</b> (+${to(q)}% CpS)<br>and <b>${to(q)} heavenly chips</b> to spend.`,o+=`<div class="line"></div>\n You need <b>${to(e)} more cookies</b> for the next level.<br>\n ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipAscendButton?`<div class='line'></div>It takes ${mt} to reach the next level and you were making ${to(Pe,2)} chips on average in the last 5 seconds.<br>`:""}`,l("ascendTooltip").innerHTML=o}()}}function hn(){window.CookieMonsterData={},Game.mods.cookieMonsterFramework.listeners.optionsMenu.push(an),Va(),Wa(),Ha(),Nt=Object.keys(Game.mods).length,Qt=document.createElement("style"),Qt.type="text/css",Qt.id="CMCSS",document.head.appendChild(Qt),function(){const e=document.createElement("div");e.id="CMBotBar",e.style.height="69px",e.style.width="100%",e.style.position="absolute",e.style.display="none",e.style.backgroundColor="#262224",e.style.backgroundImage="linear-gradient(to bottom, #4d4548, #000000)",e.style.borderTop="1px solid black",e.style.overflow="auto",e.style.textShadow="-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black";const t=e.appendChild(document.createElement("table"));t.style.width="100%",t.style.textAlign="center",t.style.whiteSpace="nowrap";const o=t.appendChild(document.createElement("tbody")),a=function(e,t){const o=document.createElement("td");return o.style.textAlign="right",o.className=oo+t,o.textContent=e,o},n=o.appendChild(document.createElement("tr"));n.style.fontWeight="bold",n.appendChild(a("CM 2.052.10",ro)),o.appendChild(document.createElement("tr")).appendChild(a("Bonus Income",no)),o.appendChild(document.createElement("tr")).appendChild(a("Payback Period",no)),o.appendChild(document.createElement("tr")).appendChild(a("Time Left",no)),l("wrapper").appendChild(e),Object.keys(Game.Objects).forEach((e=>{Vo(e)}))}(),function(){const e=document.createElement("div");e.id="CMTimerBar",e.style.position="absolute",e.style.display="none",e.style.height="0px",e.style.fontSize="10px",e.style.fontWeight="bold",e.style.backgroundColor="black";const t=zo("CMTimerBarAutosave","Autosave",[{id:"CMTimerBarAutosaveBar",colour:co}]);e.appendChild(t);const o=zo("CMTimerBarGC","Next Cookie",[{id:"CMTimerBarGCMinBar",colour:mo},{id:"CMTimerBarGCBar",colour:co}]);e.appendChild(o);const a=zo("CMTimerBarRen","Next Reindeer",[{id:"CMTimerBarRenMinBar",colour:mo},{id:"CMTimerBarRenBar",colour:so}]);e.appendChild(a);const n=document.createElement("div");n.id="CMTimerBarBuffTimers",e.appendChild(n),l("wrapper").appendChild(e)}(),function(){const e=document.createElement("div");e.id="CMUpgradeBar",e.style.width="100%",e.style.backgroundColor="black",e.style.textAlign="center",e.style.fontWeight="bold",e.style.display="none",e.style.zIndex="21",e.onmouseout=function(){Game.tooltip.hide()};const t=document.createElement("div");t.appendChild(function(){const e=document.createElement("div");e.style.minWidth="330px",e.style.marginBottom="4px";const t=document.createElement("div");t.className="name",t.style.marginBottom="4px",t.textContent="Legend",e.appendChild(t);const o=function(e,t){const o=document.createElement("div");o.style.verticalAlign="middle";const a=document.createElement("span");return a.className=ao+e,a.style.display="inline-block",a.style.height="10px",a.style.width="10px",a.style.marginRight="4px",o.appendChild(a),o.appendChild(document.createTextNode(t)),o};return e.appendChild(o(no,"Better than the best PP of a building option")),e.appendChild(o(io,"Same as the best PP building option")),e.appendChild(o(ro,"Within the top 10 of PP for buildings")),e.appendChild(o(so,"Within the top 20 of PP for buildings")),e.appendChild(o(lo,"Within the top 30 of PP for buildings")),e.appendChild(o(co,"Outside of the top 30 of PP for buildings")),e.appendChild(o(mo,"Negative or infinity PP")),e}()),e.onmouseover=function(){Game.tooltip.draw(this,escape(t.innerHTML),"store")};const o=function(e,t){const o=document.createElement("span");return o.id=e,o.className=oo+t,o.style.width="14.28571428571429%",o.style.display="inline-block",o.textContent="0",o};e.appendChild(o("CMUpgradeBarBlue",no)),e.appendChild(o("CMUpgradeBarGreen",io)),e.appendChild(o("CMUpgradeBarYellow",ro)),e.appendChild(o("CMUpgradeBarOrange",so)),e.appendChild(o("CMUpgradeBarRed",lo)),e.appendChild(o("CMUpgradeBarPurple",co)),e.appendChild(o("CMUpgradeBarGray",mo)),l("upgrades").parentNode.insertBefore(e,l("upgrades").parentNode.childNodes[3])}(),function(){const e=document.createElement("div");e.id="CMSectionHidButtons",e.style.textAlign="center";const t=document.createElement("a");t.className="option",t.onclick=function(){"flex"===l("upgrades").style.display?(l("upgrades").style.display="none",l("toggleUpgrades").style.display="none",l("techUpgrades").style.display="none",l("vaultUpgrades").style.display="none"):(l("upgrades").style.display="flex",0!==l("toggleUpgrades").children.length&&(l("toggleUpgrades").style.display="block"),0!==l("techUpgrades").children.length&&(l("techUpgrades").style.display="block"),0!==l("vaultUpgrades").children.length&&(l("vaultUpgrades").style.display="block"))},t.textContent="Hide/Show Upgrades",e.appendChild(t);const o=document.createElement("a");o.className="option",o.onclick=function(){"grid"===l("products").style.display?l("products").style.display="none":l("products").style.display="grid"},o.textContent="Hide/Show Buildings",e.appendChild(o),l("store").insertBefore(e,l("store").childNodes[2])}(),function(){const e=document.createElement("link");e.id="CMFavicon",e.rel="shortcut icon",e.href="https://orteil.dashnet.org/cookieclicker/favicon.ico",document.getElementsByTagName("head")[0].appendChild(e)}(),Object.keys(go).forEach((e=>{!function(e,t,o){const a=document.createElement("div");a.id=e;const n=document.createElement("div");n.style.minWidth=o,n.style.marginBottom="4px";const i=document.createElement("div");i.style.textAlign="left",i.textContent=t,n.appendChild(i),a.appendChild(n),fo[e]=a}(go[e][0],go[e][1],go[e][2])})),function(){const e=document.createElement("a");e.id="PopAllNormalWrinklerButton",e.textContent="Pop All Normal",e.className="option",e.onclick=function(){Ra()},e.onmouseout=function(){Game.tooltip.shouldHide=1},e.onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("wb","PopAllNormal")),"this"),Game.tooltip.wobble()},l("sectionLeftExtra").children[0].append(e);const t=document.createElement("a");t.id="PopFattestWrinklerButton",t.textContent="Pop Single Fattest",t.className="option",t.onclick=function(){null!==He[1]&&(Game.wrinklers[He[1]].hp=0)},t.onmouseout=function(){Game.tooltip.shouldHide=1},t.onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("wb","PopFattest")),"this"),Game.tooltip.wobble()},l("sectionLeftExtra").children[0].append(t)}(),l("products").style.display="grid",l("storeBulk").style.gridRow="1/1",l("upgrades").style.display="flex",l("upgrades").style["flex-wrap"]="wrap",Object.keys(l("rows").children).forEach((e=>{const t=l("rows").children[e].children[1],o=document.createElement("div");o.id=`productLock${Number(e)+1}`,o.className="productButton",o.innerHTML="Lock",o.onclick=function(){!function(e){"Lock"===l(`productLock${e}`).innerHTML?(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.push(e.toString()),l(`row${e}`).style.pointerEvents="none",l(`row${e}`).style.opacity="0.4",l(`productLock${e}`).innerHTML="Unlock",l(`productLock${e}`).style.pointerEvents="auto"):(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.includes(e.toString())&&(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.filter((t=>t!==e.toString()))),l(`productLock${e}`).innerHTML="Lock",l(`row${e}`).style.pointerEvents="auto",l(`row${e}`).style.opacity="1")}(Number(e)+1)},t.appendChild(o)})),Object.keys(Game.Objects).forEach((e=>{const t=Game.Objects[e];null!==l(`product${t.id}`).onmouseover&&(qt[e]=l(`product${t.id}`).onmouseover,l(`product${t.id}`).onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("b",`${e}`)),"store"),Game.tooltip.wobble()})})),Game.canLumps()&&(Ot=l("lumps").onmouseover,l("lumps").onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("s","Lump")),"this"),Game.tooltip.wobble()}),$t=Game.LoadMinigames,Game.LoadMinigames=function(){$t(),Game.Objects.Farm.minigameLoaded&&(l("gardenTool-1").onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("ha","HarvestAllButton")),"this"),Game.tooltip.wobble()},Array.from(l("gardenPlot").children).forEach((e=>{const t=e.id.slice(-3);e.onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("p",[`${t[0]}`,`${t[2]}`])),"this"),Game.tooltip.wobble()}}))),_a(),function(){if(Game.Objects.Bank.minigameLoaded)for(let e=0;e<Game.Objects.Bank.minigame.goodsById.length;e++)l(`bankGood-${e}`).firstChild.onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("sm",e)),"this"),Game.tooltip.wobble()}}(),function(){if(Game.Objects.Temple.minigameLoaded){for(let e=0;e<11;e+=1)l(`templeGod${e}`).onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("pag",e)),"this"),Game.tooltip.wobble()};for(let e=0;e<3;e+=1)l(`templeSlot${e}`).onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("pas",[e,Game.Objects.Temple.minigame.slot[e]])),"this"),Game.tooltip.wobble()}}}(),Qa()},Game.LoadMinigames(),l("backgroundLeftCanvas").onmouseover=function(){Co=1},l("backgroundLeftCanvas").onmouseout=function(){Co=0,Game.tooltip.hide(),Object.keys(Game.wrinklers).forEach((e=>{yo[e]=0}))},un(),Qa(),Game.CalculateGains(),ko=Game.OnAscend,Game.prefs.popups?Game.Popup("Cookie Monster version 2.052.10 loaded!"):Game.Notify("Cookie Monster version 2.052.10 loaded!","","",1,1),Game.Win("Third-party")}function gn(e,t){if(!Game.Objects.Temple.minigameLoaded)return 0;ta();const{minigame:o}=Game.Objects.Temple,a=o.godsById[e].slot;"0"===a?re=o.slot[t]:"1"===a?se=o.slot[t]:"2"===a&&(le=o.slot[t]),0===t?re=e:1===t?se=e:2===t&&(le=e);const n=te;return sa(),ha(),n!==te&&sa(),me-Game.cookiesPs}function fn(){if(Oo!==Game.OnAscend&&(Oo=Game.OnAscend,Game.OnAscend?(l("game").style.bottom="0px",1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar&&(l("CMBotBar").style.display="none"),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&(l("CMTimerBar").style.display="none")):(en(),qo()),Xo()),!Game.OnAscend&&0===Game.AscendTimer){Nt!==Object.keys(Game.mods).length&&(Va(),Ha(),Nt=Object.keys(Game.mods).length),ce&&($a(!0),Pa(),Game.Has("Golden switch [off]")?(ta(),Mt["Golden switch [off]"].bought=0,sa(),Se=me):Se=Game.cookiesPs,Ga({CacheNoGoldSwitchCookiesPS:Se}),ja(),Wa(),La(),Oa(),qa(),function(){for(let e=0;e<11;e+=1)for(let t=0;t<3;t+=1)kt[e][t]=gn(e,t);Ga({CacheGods:kt})}(),Aa(),function(){let e=0;if(Game.Objects.Bank.minigameLoaded){const t=Game.Objects.Bank.minigame.goods;let o=0;Object.keys(t).forEach((e=>{const a=t[e];o+=a.stock*a.val})),e+=o*Game.cookiesPsRawHighest}e+=function(){let e=0;ta();let t=2;5!==ne&&18!==ne||(t-=1),5!==ie&&18!==ie||(t-=1),ne=5,ie=18;for(let e=0;e<t;++e){let e="Cursor";Object.keys(Ct).forEach((t=>{Ct[t].amount>0&&(e=t)})),Ct[e].amount-=1,J-=1}return Object.keys(Ct).forEach((t=>{const o=Ct[t];e+=Ft(Game.Objects[o.name],Game.Objects[t].basePrice,o.amount,Game.Objects[t].free,o.amount)})),e}(),ft=e,Ga({CacheSellForChoEgg:ft})}(),ce=0);const e=Game.auraMult("Fierce Hoarder")>0;!K&&e?(K=!0,Y=1):K&&!e&&(K=!1,Y=1),Y&&(Ba(),Y=0),function(){Ua(),Sa(),$a(!1),function(){Re=0;let e=0;Object.keys(Game.wrinklers).forEach((t=>{2===Game.wrinklers[t].phase&&(e+=1)}));let t=1;if(Ct.Temple.minigameLoaded){const e=Game.hasGod("scorn");1===e?t*=1.15:2===e?t*=1.1:3===e&&(t*=1.05)}Ie=e,Re=e*(.05*e*1.1)*(.05*Game.Has("Sacrilegious corruption")+1)*(.05*Game.Has("Wrinklerspawn")+1)*t,Ga({CacheCurrWrinklerCount:Ie,CacheCurrWrinklerCPSMult:Re})}(),va(),Da();const e=Game.HowManyCookiesReset(Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned))+1)-(Game.cookiesEarned+Game.cookiesReset);mt=Uo(e/Ro())}(),Ht!==(Game.TickerEffect&&"fortune"===Game.TickerEffect.type)&&(Ht=Game.TickerEffect&&"fortune"===Game.TickerEffect.type,Ht&&(v.createFlash("cookieMonsterMod",3,"FortuneFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FortuneSoundURL,"FortuneSound","FortuneVolume",!1),v.createNotification("cookieMonsterMod","FortuneNotification","Fortune Cookie found","A Fortune Cookie has appeared on the Ticker."))),Ut!==Game.shimmerTypes.reindeer.spawned&&(Ut=Game.shimmerTypes.reindeer.spawned,Object.keys(Game.shimmers).forEach((e=>{Game.shimmers[e].spawnLead&&"reindeer"===Game.shimmers[e].type&&(dt=Game.shimmers[e])})),v.createFlash("cookieMonsterMod",3,"SeaFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SeaSoundURL,"SeaSound","SeaVolume",!1),v.createNotification("cookieMonsterMod","SeaNotification","Reindeer sighted!","A Reindeer has spawned. Click it now!")),Game.Objects.Farm.minigameLoaded&&Rt!==Game.Objects.Farm.minigame.nextStep&&(0!==Rt&&Rt<Date.now()&&(v.createFlash("cookieMonsterMod",3,"GardFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GardSoundURL,"GardSound","GardVolume",!1)),Rt=Game.Objects.Farm.minigame.nextStep),function(){if(Game.Objects["Wizard tower"].minigameLoaded&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GrimoireBar){const{minigame:e}=Game.Objects["Wizard tower"];e.magic<e.magicM?Vt=!1:Vt||(Vt=!0,v.createFlash("cookieMonsterMod",3,"MagicFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MagicSoundURL,"MagicSound","MagicVolume",!1),v.createNotification("cookieMonsterMod","MagicNotification","Magic Meter full","Your Magic Meter is full. Cast a spell!"))}}(),function(){if(Game.elderWrath>0){let e=0;Object.keys(Game.wrinklers).forEach((t=>{2===Game.wrinklers[t].phase&&(e+=1)})),e>Xt?(Xt=e,e===Game.getWrinklersMax()&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxFlash?v.createFlash("cookieMonsterMod",3,"WrinklerMaxFlash",!1):v.createFlash("cookieMonsterMod",3,"WrinklerFlash",!1),e===Game.getWrinklersMax()&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxSound?v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxSoundURL,"WrinklerMaxSound","WrinklerMaxVolume",!1):v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerSoundURL,"WrinklerSound","WrinklerVolume",!1),e===Game.getWrinklersMax()&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxNotification?v.createNotification("cookieMonsterMod","WrinklerMaxNotification","Maximum Wrinklers Reached","You have reached your maximum ammount of wrinklers"):v.createNotification("cookieMonsterMod","WrinklerNotification","A Wrinkler appeared","A new wrinkler has appeared")):Xt=e}}()}_t=0,gt={},Object.keys(Game.shimmers).forEach((e=>{gt[Game.shimmers[e].id]=Game.shimmers[e],Game.shimmers[e].spawnLead&&"golden"===Game.shimmers[e].type&&(ct=Game.shimmers[e],_t+=1)})),Object.keys(Lo).forEach((e=>{void 0===gt[e]&&(Lo[e].parentNode.removeChild(Lo[e]),delete Lo[e])})),It!==Game.shimmerTypes.golden.n?(It=Game.shimmerTypes.golden.n,It&&(zt<_t&&(v.createFlash("cookieMonsterMod",3,"GCFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCSoundURL,"GCSound","GCVolume",!1),v.createNotification("cookieMonsterMod","GCNotification","Golden Cookie Spawned","A Golden Cookie has spawned. Click it now!")),Object.keys(Game.shimmers).forEach((e=>{void 0===Lo[Game.shimmers[e].id]&&function(e){const t=document.createElement("div");t.id=`GCTimer${e.id}`,t.style.width="96px",t.style.height="96px",t.style.position="absolute",t.style.zIndex="10000000001",t.style.textAlign="center",t.style.lineHeight="96px",t.style.fontFamily='"Kavoon", Georgia, serif',t.style.fontSize="35px",t.style.cursor="pointer",t.style.display="block",t.style.pointerEvents="none",0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer&&(t.style.display="none"),t.style.left=e.l.style.left,t.style.top=e.l.style.top,t.onclick=function(){e.pop()},t.onmouseover=function(){e.l.style.filter="brightness(125%) drop-shadow(0px 0px 3px rgba(255,255,255,1))",e.l.style.webkitFilter="brightness(125%) drop-shadow(0px 0px 3px rgba(255,255,255,1))"},t.onmouseout=function(){e.l.style.filter="",e.l.style.webkitFilter=""},Lo[e.id]=t,l("shimmers").appendChild(t)}(Game.shimmers[e])}))),za(),zt=_t,0===_t&&(ct=0)):1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer&&It&&Object.keys(Lo).forEach((e=>{Lo[e].style.opacity=gt[e].l.style.opacity,Lo[e].style.transform=gt[e].l.style.transform,Lo[e].textContent=Math.ceil(gt[e].life/Game.fps)}))}const kn={Favourite:1,Calculation:1,Notation:1,Colours:1,BarsDisplay:1,Tooltip:1,Statistics:1,Notification:1,NotificationGeneral:1,NotificationGC:1,NotificationFC:1,NotificationSea:1,NotificationGard:1,NotificationMagi:1,NotificationWrink:1,NotificationWrinkMax:1,Miscellaneous:1,Lucky:1,Chain:1,Spells:1,Garden:1,Prestige:1,Wrink:1,Sea:1,Achievs:1,Misc:1,infoMenu:1,optionsMenu:1};function Cn(e){Va(),w.loadMod("cookieMonsterMod",e,tn,kn,fn),void 0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames&&(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames=[]),on();for(let e=0;e<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.length;e++){const t=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames[e];l(`row${t}`).style.pointerEvents="none",l(`row${t}`).style.opacity="0.4",l(`productLock${t}`).innerHTML="Unlock",l(`productLock${t}`).style.pointerEvents="auto"}void 0!==Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.version&&"2.052.10"!==Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.version&&(Game.prefs.popups?Game.Popup("A new version of Cookie Monster has been loaded, check out the release notes in the info tab!"):Game.Notify("A new version of Cookie Monster has been loaded, check out the release notes in the info tab!","","",0,1))}const Mn={init:function(){let e=!0;M(),window.cookieMonsterFrameworkData.isInitializing=!0,y("cookieMonsterMod"),Game.version!==Number("2.052")&&(e=confirm("Cookie Monster version 2.052.10 is meant for Game version 2.052. Loading a different version may cause errors. Do you still want to load Cookie Monster?")),e&&(hn(),Game.registerHook("click",ya),Game.registerHook("draw",Ma),Game.registerHook("logic",fn),void 0===Game.modSaveData.cookieMonsterMod&&Cn("{}"))},load:Cn,save:function(){const e=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod;return e.version="2.052.10",JSON.stringify(e)}};"undefined"!=typeof Steam?setTimeout((function(){Game.registerMod("CookieMonster",Mn),window.cookieMonsterFrameworkData.isInitializing=!1}),2e3):(Game.registerMod("CookieMonster",Mn),window.cookieMonsterFrameworkData.isInitializing=!1)})()})(); //# sourceMappingURL=https://cookiemonsterteam.github.io/CookieMonster/dist/CookieMonster.js.map \ No newline at end of file diff --git a/dist/CookieMonster.js.map b/dist/CookieMonster.js.map index b0787263..346dcaf8 100644 --- a/dist/CookieMonster.js.map +++ b/dist/CookieMonster.js.map @@ -1 +1 @@ -{"version":3,"file":"CookieMonster.js","mappings":"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AQtuB,KAAKgE,MAAMsqB,EAAQnB,GACvBiC,EAAiB,IACnBC,GAAQf,EACRc,GAAkB,EAEtB,CACA,OAAOC,CACT,CClCO,MAAMK,GAAS,CAAC,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAGhDC,GAAa,CACxB,GACA,GACA,IACA,IACA,KACA,QACA,QACA,OACA,OACA,MACA,MACA,MACA,QACA,SACA,SACA,cACA,UACA,SACA,YACA,UACA,WACA,SACA,WACA,YACA,YACA,kBAIWC,GAAwB,CACnC,GACA,IACA,IACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,KACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,KACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,KACA,OC3IK,IAAIC,GAEAC,GAGAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAGAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GCjBAC,GDFAC,GAAqB,GAErBC,GAAwB,GACxBC,GAAuB,GAOvBC,GAAkB,CAAC,EAanBC,GAAyBC,KAAKC,MAI9BC,GAAyBF,KAAKC,MEhB1B,SAAS,GAASE,EAAKC,EAAQ1T,GAC5C,MAAM2T,EACJ3U,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwT,cAAgB,EACtF,GAAIH,IAAQI,IACV,MAAO,WAET,QAAmB,IAARJ,EACT,MAAO,IAET,GAAkF,IAA9EzU,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS0T,MACtE,OAAOV,GAAgBW,SAASN,EAAKC,GAEvC,GAAIM,OAAOC,SAASR,GAAM,CACxB,GAAIA,EAAM,EACR,MAAO,IAAI,GAAStxB,KAAKuN,IAAI+jB,MAE/B,IAAIS,EAAS,GACb,GAAY,IAART,EACF,OAAOA,EAAIpxB,WAEb,GACEoxB,EAAM,MACNA,EAAMzU,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS+T,YAK1E,OAFED,EADElV,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgU,eAC7DX,EAAIY,eAAe,MAChBZ,EAAIY,eAAe,MAC1BH,EAET,GACiF,IAA9ElV,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS0T,QAClE9T,GACQ,IAAXA,EAGAkU,EAAST,EAAIa,cAAcX,GAAUtxB,WAAW7B,QAAQ,IAAK,SACxD,CACL,MAAM+zB,EAAcd,EAAIa,gBAAgBjyB,WAClCmyB,EAAwBryB,KAAKgE,MAAMouB,EAAYxX,MAAMwX,EAAYt3B,QAAQ,KAAO,GAAK,GAC3Fi3B,GAAUT,EAAMO,OAAO,KAA6B,EAAxBQ,IAA8BC,QAAQd,GAGe,IAA9E3U,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS0T,QAClE9T,GACQ,IAAXA,EAGIyT,GAAO,KAAQA,EAAMO,OAAO,KAAqB,EAAhBnC,GAAO73B,QAC1Ck6B,GAAU,IAAIrC,GAAO2C,KAChBN,EAAS,GAAST,EAAK,EAAG,GAE8C,IAA9EzU,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS0T,QAClE9T,GACQ,IAAXA,EAGIyT,GAAO,KAAQA,EAAMO,OAAO,KAAyB,EAApBlC,GAAW93B,QAC9Ck6B,GAAU,IAAIpC,GAAW0C,KACpBN,EAAS,GAAST,EAAK,EAAG,GAE8C,IAA9EzU,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS0T,QAClE9T,GACQ,IAAXA,EAGIyT,GAAO,KAAQA,EAAMO,OAAO,KAAoC,EAA/BjC,GAAsB/3B,QACzDk6B,GAAU,IAAInC,GAAsByC,KAC/BN,EAAS,GAAST,EAAK,EAAG,IAE8C,IAA9EzU,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS0T,QAClE9T,GACQ,IAAXA,KAGAkU,GAAU,IAA4B,EAAxBM,EAElB,CAQA,MAPe,KAAXN,IAEFt5B,QAAQ85B,IAAI,2DAA2DjB,KACvES,EAASd,GAAgBW,SAASN,EAAKC,IAErC1U,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgU,iBACtEF,EAASA,EAAO1zB,QAAQ,IAAK,MACxB0zB,CACT,CAEA,OADAt5B,QAAQ85B,IAAI,2DAA2DjB,KAChEL,GAAgBW,SAASN,EAAKC,EACvC,CD5FO,MAAMiB,GAAgB,SAChBC,GAAgB,SAMhBC,GAAa,OACbC,GAAc,QACdC,GAAe,SACfC,GAAe,SACfC,GAAY,MACZC,GAAe,SACfC,GAAa,OACbC,GAAa,OACbC,GAAc,QACdC,GAAkB,CAC7BT,GACAC,GACAC,GACAC,GACAC,GACAC,GACAE,GACAC,GACAF,IAUWI,GAAc,CACzB,CAAC,6BAA8B,oCAAqC,SACpE,CACE,2CACA,6EACA,SAEF,CACE,6BACA,qPACA,SAEF,CACE,8BACA,kEACA,SAEF,CACE,kCACA,2PACA,SAEF,CACE,0BACA,gLACA,SAEF,CACE,2BACA,uOACA,SAEF,CAAC,4BAA6B,2CAA4C,SAC1E,CACE,8BACA,uHACA,UAGSC,GAAwB,CAAC,EAM/B,IAUIC,GAVAC,GAAsB,EACtBC,IAAmB,EAOnBC,GAA4B,GAG5BC,GAAY,WAAa,EAKzBC,GAAmB,EACnBC,GAAsB,EACtBC,GAA4B,EAMhC,MAAMC,GAAc,CAAC,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,MAC9CC,GAAa,CAAC,EAAG,EAAG,GAAI,GAAI,IAK5BC,GAAc,CACzBC,OAAQrB,GACR,iBAAkBM,GAClB,eAAgBP,GAChBuB,KAAMpB,GACN,eAAgBJ,GAChByB,aAAclB,IAMT,IAOImB,GACAC,GACAC,GACAC,GACAC,GAEAC,GACAC,GAdAC,GAAW,CAAC,EAKZC,GAAQ,GEnHJ,SAASC,KACtB,IAkDIC,EAlDA73B,EAAS4f,KAAKyS,QACG,IAAjBzS,KAAKkY,QACPnB,GAAsB32B,EAEtBA,EAAS22B,GAEI,IAAX32B,EAAcA,EAASotB,GACP,KAAXptB,EAAeA,EAASqtB,GACb,MAAXrtB,IAAgBA,EAASstB,IAGlC7hB,EAAE,cAAchJ,MAAMs1B,eAAe,SACrCtsB,EAAE,eAAehJ,MAAMs1B,eAAe,SACtCtsB,EAAE,gBAAgBhJ,MAAMs1B,eAAe,SAElB,IAAjBnY,KAAKkY,QACiF,IAApFlY,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgX,aACtE75B,OAAO6C,KAAKhB,GAAQ+f,SAASplB,IAC3B8Q,EAAE,eAAemU,KAAKoR,QAAQr2B,GAAGqlB,MAAMvd,MAAMyF,MAC3C0X,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SACzD,SAAShhB,EAAOrF,GAAGs9B,SACpB,IAELxsB,EAAE,YAAY2jB,MAAkB3sB,MAAMyF,MACpC0X,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS0U,aAEtEv3B,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IACjC8Q,EAAE,eAAemU,KAAKoR,QAAQr2B,GAAGqlB,MAAMvd,MAAMs1B,eAAe,QAAQ,KAG7C,IAAlBnY,KAAKkY,SACd35B,OAAO6C,KAAKosB,IAAerN,SAASplB,IAClC,MAAMykB,EAAIQ,KAAKoR,QAAQr2B,GACvB8Q,EAAE,eAAe2T,EAAEY,MAAMvd,MAAMyF,MAAQ,GASvCuD,EAAE,eAAe2T,EAAEY,MAAM1I,UAAY,GACnCqa,GAAavS,EAAGA,EAAEyS,UAAWzS,EAAE2S,OAAQ3S,EAAE0S,KAAMlS,KAAKyS,QAAS,GAC9D,IAQc,IAAjBzS,KAAKkY,SACJlY,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkX,cAWiB,IAAtFtY,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkX,eAEpEL,EAAM15B,OAAO6C,KAAKosB,IAAetuB,KAAKq5B,IACpC,MAAM/Y,EAAI,CAAC,EAIX,OAHAA,EAAElgB,KAAOi5B,EACT/Y,EAAEzT,GAAKyhB,GAAc+K,GAAGxsB,GACxByT,EAAE6Y,OAAS7K,GAAc+K,GAAGF,OACrB7Y,CAAC,IAGVyY,EAAIO,MAAK,CAAC/0B,EAAGP,IACXozB,GAAgBr4B,QAAQwF,EAAE40B,UAAY/B,GAAgBr4B,QAAQiF,EAAEm1B,QAC5D50B,EAAEsI,GAAK7I,EAAE6I,GACTuqB,GAAgBr4B,QAAQwF,EAAE40B,QAAU/B,GAAgBr4B,QAAQiF,EAAEm1B,WAGkB,IAAtFrY,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkX,eAEpEL,EAAM15B,OAAO6C,KAAKhB,GAAQlB,KAAKq5B,IAC7B,MAAM/Y,EAAI,CAAC,EAIX,OAHAA,EAAElgB,KAAOi5B,EACT/Y,EAAEzT,GAAK3L,EAAOm4B,GAAGxsB,GACjByT,EAAE6Y,OAASj4B,EAAOm4B,GAAGF,OACd7Y,CAAC,IAGVyY,EAAIO,MAAK,CAAC/0B,EAAGP,IACXozB,GAAgBr4B,QAAQwF,EAAE40B,UAAY/B,GAAgBr4B,QAAQiF,EAAEm1B,QAC5D50B,EAAEsI,GAAK7I,EAAE6I,GACTuqB,GAAgBr4B,QAAQwF,EAAE40B,QAAU/B,GAAgBr4B,QAAQiF,EAAEm1B,WAGkB,IAAtFrY,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkX,gBAEpEL,EAAM15B,OAAO6C,KAAKusB,IAA6BzuB,KAAKq5B,IAClD,MAAM/Y,EAAI,CAAC,EAKX,OAJAA,EAAElgB,KAAOi5B,EACT/Y,EAAEY,GAAKJ,KAAKoR,QAAQmH,GAAGnY,GACvBZ,EAAEiZ,gBAAkB9K,GAA4B4K,GAAGG,aACnDlZ,EAAEmZ,eAAiBhL,GAA4B4K,GAAG9G,MAC3CjS,CAAC,IAGVyY,EAAIO,MAAK,CAAC/0B,EAAGP,IAAMO,EAAE2c,GAAKld,EAAEkd,KAI5B6X,EAAIO,MACF,CAAC/0B,EAAGP,KACqB,MAAtBO,EAAEg1B,gBAA0Bh1B,EAAEk1B,eAAiB9D,MACzB,MAAtB3xB,EAAEu1B,gBAA0Bv1B,EAAEy1B,eAAiB9D,SA3DpDoD,EAAM15B,OAAO6C,KAAKosB,IAAetuB,KAAKq5B,IACpC,MAAM/Y,EAAI,CAAC,EAGX,OAFAA,EAAElgB,KAAOi5B,EACT/Y,EAAEY,GAAKJ,KAAKoR,QAAQmH,GAAGnY,GAChBZ,CAAC,IAGVyY,EAAIO,MAAK,CAAC/0B,EAAGP,IAAMO,EAAE2c,GAAKld,EAAEkd,MA0D9B,IAAK,IAAIxb,EAAI,EAAGA,EAAIqzB,EAAIj9B,OAAQ4J,IAC9Bob,KAAKoR,QAAQ6G,EAAIrzB,GAAGtF,MAAMuM,EAAEhJ,MAAM+1B,QAAU,GAAGh0B,EAAI,KAAKA,EAAI,GAEhE,CC3Ie,SAASi0B,KACtBt6B,OAAOu6B,OAAOz/B,SAAS0/B,uBAAuB,iBAAiB5Y,SAAS6Y,IAEpEhZ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6X,uBACrD,aAAfD,EAAQ5Y,GAER4Y,EAAQn2B,MAAMiG,OAAS,OACC,kBAAfkwB,EAAQ5Y,IACjB4Y,EAAQn2B,MAAMiG,OAAS,GACvBkwB,EAAQn2B,MAAMq2B,UAAY,OACF,aAAfF,EAAQ5Y,IACjB4Y,EAAQn2B,MAAMiG,OAAS,GACnBkwB,EAAQx9B,UAAUmrB,SAAS,WAC7BqS,EAAQn2B,MAAMq2B,UAAY,OAE1BF,EAAQn2B,MAAMq2B,UAAY,SAG5BF,EAAQn2B,MAAMiG,OAAS,GACvBkwB,EAAQn2B,MAAMq2B,UAAY,OAC5B,GAEJ,CCRe,SAASC,KAEtB,GAAInZ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgY,YAAc,EAAG,CACvF,IAAIC,EAAO,EACPC,EAAQ,EACRC,EAAS,EACTC,EAAS,EACTC,EAAM,EACNC,EAAS,EACTC,EAAO,EAEXp7B,OAAO6C,KAAK4e,KAAK4Z,iBAAiBzZ,SAASplB,IACzC,MAAM8+B,EAAK7Z,KAAK4Z,gBAAgB7+B,GAChC,IAAI++B,GAAc,EAClB,IAAK,IAAIC,EAAI,EAAGA,EAAIluB,EAAE,UAAU9Q,KAAKi/B,WAAWh/B,OAAQ++B,GAAK,EAC3D,IAAyE,IAArEluB,EAAE,UAAU9Q,KAAKi/B,WAAWD,GAAGv+B,UAAUyC,QAAQ23B,IAAuB,CAC1E/pB,EAAE,UAAU9Q,KAAKi/B,WAAWD,GAAGv+B,UAAYo6B,GAAgB3H,GAAc4L,EAAGv6B,MAAM+4B,OAClFyB,GAAc,EACd,KACF,CAEF,IAAKA,EAAa,CAChB,MAAMvT,EAAMltB,SAAS4D,cAAc,OACnCspB,EAAI1jB,MAAMgG,MAAQ,OAClB0d,EAAI1jB,MAAMiG,OAAS,OACnByd,EAAI/qB,UAAYo6B,GAAgB3H,GAAc4L,EAAGv6B,MAAM+4B,OACvDxsB,EAAE,UAAU9Q,KAAK+a,YAAYyQ,EAC/B,CACI0H,GAAc4L,EAAGv6B,MAAM+4B,SAAWxC,GAAYwD,GAAQ,EACjDpL,GAAc4L,EAAGv6B,MAAM+4B,SAAWvC,GAAawD,GAAS,EACxDrL,GAAc4L,EAAGv6B,MAAM+4B,SAAWtC,GAAcwD,GAAU,EAC1DtL,GAAc4L,EAAGv6B,MAAM+4B,SAAWrC,GAAcwD,GAAU,EAC1DvL,GAAc4L,EAAGv6B,MAAM+4B,SAAWpC,GAAWwD,GAAO,EACpDxL,GAAc4L,EAAGv6B,MAAM+4B,SAAWnC,GAAcwD,GAAU,EAC1DzL,GAAc4L,EAAGv6B,MAAM+4B,SAAWlC,KAAYwD,GAAQ,EAAC,IAGlE9tB,EAAE,oBAAoBzN,YAAci7B,EACpCxtB,EAAE,qBAAqBzN,YAAck7B,EACrCztB,EAAE,sBAAsBzN,YAAcm7B,EACtC1tB,EAAE,sBAAsBzN,YAAco7B,EACtC3tB,EAAE,mBAAmBzN,YAAcq7B,EACnC5tB,EAAE,sBAAsBzN,YAAcs7B,EACtC7tB,EAAE,oBAAoBzN,YAAcu7B,CACtC,CAEA,MAAM1B,EAAM,GAGZ,IAAK,IAAIrzB,EAAI,EAAGA,EAAIob,KAAK4Z,gBAAgB5+B,OAAQ4J,GAAK,EAAG,CACvD,MAAM4a,EAAI,CAAC,EACXA,EAAElgB,KAAO0gB,KAAK4Z,gBAAgBh1B,GAAGtF,KACjCkgB,EAAEiS,MAAQzR,KAAK4Z,gBAAgBh1B,GAAGqtB,UAClCzS,EAAEzT,GAAKkiB,GAAczO,EAAElgB,MAAMyM,GAC7ByT,EAAE6Y,OAASpK,GAAczO,EAAElgB,MAAM+4B,OACjCJ,EAAIp7B,KAAK2iB,EACX,CAEIQ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6Y,aAEtEhC,EAAIO,MAAK,CAAC/0B,EAAGP,IACXozB,GAAgBr4B,QAAQwF,EAAE40B,UAAY/B,GAAgBr4B,QAAQiF,EAAEm1B,QAC5D50B,EAAEsI,GAAK7I,EAAE6I,GACTuqB,GAAgBr4B,QAAQwF,EAAE40B,QAAU/B,GAAgBr4B,QAAQiF,EAAEm1B,UAGpEJ,EAAIO,MAAK,CAAC/0B,EAAGP,IAAMO,EAAEguB,MAAQvuB,EAAEuuB,QAGjC,MAAMyI,EAAc,SAAUC,EAAMC,GAClC,OAAOD,EAAKE,WAAWn+B,GAAMA,EAAEoD,OAAS86B,EAAQ96B,MAClD,EACA,IAAK,IAAIsF,EAAI,EAAGA,EAAIob,KAAK4Z,gBAAgB5+B,OAAQ4J,GAAK,EACpDiH,EAAE,UAAUjH,KAAK/B,MAAMy3B,MAAQJ,EAAYjC,EAAKjY,KAAK4Z,gBAAgBh1B,IAAM,CAE/E,CCxFe,SAAS21B,GAAWC,EAAMC,GAEvC,IAAIC,EAAgBF,EACpB,GAAIA,IAAS3F,IAAU,OAAO2F,EAC9B,GAAIA,EAAO,EAAG,MAAO,uBACrBE,EAAgBv3B,KAAKiL,KAAKosB,GAC1B,MAAM31B,EAAI1B,KAAKgE,MAAMuzB,EAAgB,SAC/Brb,EAAIlc,KAAKgE,MAAOuzB,EAAgB,QAAY,OAC5C3zB,EAAI5D,KAAKgE,MAAQuzB,EAAgB,QAAY,MAAS,MACtDx/B,EAAIiI,KAAKgE,MAASuzB,EAAgB,QAAY,MAAS,KAAQ,IAC/DzzB,EAAI9D,KAAKgE,MAASuzB,EAAgB,QAAY,MAAS,KAAQ,IACrE,IAAIv+B,EAAM,GAEV,GAAuF,IAAnF6jB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASuZ,WAAkB,CACxF,GAAID,EAAgB,OAAW,OAAOD,EAAa,kBAAoB,SACvEt+B,GAAO0I,EAAI,EAAOA,GAAK41B,EAAoB,IAAN51B,EAAU,QAAU,SAAY,KAAtD,KAAiE,IAC5E1I,EAAInB,OAAS,GAAKqkB,EAAI,KACxBljB,GAAUkjB,GAAKob,EAAoB,IAANpb,EAAU,OAAS,QAAW,KAApD,OACLljB,EAAInB,OAAS,GAAK+L,EAAI,KACxB5K,GAAU4K,GAAK0zB,EAAoB,IAAN1zB,EAAU,QAAU,SAAY,KAAtD,OACL5K,EAAInB,OAAS,GAAKE,EAAI,KACxBiB,GAAUjB,GAAKu/B,EAAoB,IAANv/B,EAAU,UAAY,WAAc,KAA1D,MACTiB,GAAO8K,GAAKwzB,EAAoB,IAANxzB,EAAU,UAAY,WAAc,IAChE,MAAO,GAAuF,IAAnF+Y,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASuZ,WAAkB,CAC/F,GAAID,EAAgB,SAAY,MAAO,iBACvCv+B,IAAW0I,EAAI,GAAK,IAAM,IAAMA,EAAzB,IACP1I,IAAWkjB,EAAI,GAAK,IAAM,IAAMA,EAAzB,IACPljB,IAAW4K,EAAI,GAAK,IAAM,IAAMA,EAAzB,IACP5K,IAAWjB,EAAI,GAAK,IAAM,IAAMA,EAAzB,IACPiB,IAAQ8K,EAAI,GAAK,IAAM,IAAMA,CAC/B,KAAO,CAEL,GAAIyzB,EAAgB,OAAW,OAAOD,EAAa,kBAAoB,SACnE51B,EAAI,GACN1I,GAAU0I,GAAK41B,EAAoB,IAAN51B,EAAU,QAAU,SAAY,KAAtD,KACP1I,GAAUkjB,GAAKob,EAAoB,IAANpb,EAAU,OAAS,QAAW,MAClDA,EAAI,GACbljB,GAAUkjB,GAAKob,EAAoB,IAANpb,EAAU,OAAS,QAAW,KAApD,KACPljB,GAAU4K,GAAK0zB,EAAoB,IAAN1zB,EAAU,QAAU,SAAY,MACpDA,EAAI,GACb5K,GAAU4K,GAAK0zB,EAAoB,IAAN1zB,EAAU,QAAU,SAAY,KAAtD,KACP5K,GAAUjB,GAAKu/B,EAAoB,IAANv/B,EAAU,UAAY,WAAc,MACxDA,EAAI,GACbiB,GAAUjB,GAAKu/B,EAAoB,IAANv/B,EAAU,UAAY,WAAc,KAA1D,KACPiB,GAAO8K,GAAKwzB,EAAoB,IAANxzB,EAAU,UAAY,WAAc,MAE9D9K,GAAO8K,GAAKwzB,EAAoB,IAANxzB,EAAU,UAAY,WAAc,IAElE,CACA,OAAO9K,CACT,CChDe,SAASy+B,GAAcJ,GACpC,IAAInC,EACAxP,EAYJ,OAXI2R,GAAQ,GAER3R,EADqF,IAAnF7I,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASuZ,WAC/D,iBACG,QACZtC,EAASvC,KAETjN,EAAO0R,GAAWC,GACFnC,EAAZmC,EAAO,IAAcvE,GAChBuE,EAAO,GAAaxE,GACfD,IAET,CAAElN,OAAMwP,SACjB,CCZe,SAASwC,KACtB,OAAI7a,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS0Z,QAC/DhQ,EAE6E,IAAlF9K,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,UAC/D/a,KAAKgb,WAAa,EAAIhb,KAAKib,WAEkD,IAAlFjb,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,UAC/D/a,KAAKgb,WAAajN,IAA4B,EAA6B,IAAzBC,KAE1B,OAA7BF,GAAsB,IAE4D,IAAlF9N,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,WAClB,IAAlD/a,KAAKkb,UAAUpN,GAAsB,IAAI1yB,KAGvC4kB,KAAKgb,WACwB,EAA3BjN,GAAgCC,IAC/B,EAA6B,IAAzBA,KAIXhO,KAAKgb,WACJjN,GAA2BC,IAA0B,EAA6B,IAAzBA,IAE9D,CC7Be,SAASmN,KACtB,OAAsF,IAAlFnb,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,UAC/DnN,GAE6E,IAAlF5N,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,UAC/DjN,GAAsB,GAExB,CACT,CCLO,SAASsN,GAAYhb,EAAI9gB,EAAM+7B,GACpC,MAAMC,EAAWjiC,SAAS4D,cAAc,OACxCq+B,EAASlb,GAAKA,EACdkb,EAASz4B,MAAMiG,OAAS,OACxBwyB,EAASz4B,MAAM04B,OAAS,WACxBD,EAASz4B,MAAM8H,SAAW,WAE1B,MAAM4b,EAAMltB,SAAS4D,cAAc,OACnCspB,EAAI1jB,MAAMgG,MAAQ,OAClB0d,EAAI1jB,MAAMiG,OAAS,OACnByd,EAAI1jB,MAAM04B,OAAS,OACnBhV,EAAI1jB,MAAM8H,SAAW,WACrB4b,EAAI1jB,MAAMmC,KAAO,MACjBuhB,EAAI1jB,MAAMoC,IAAM,MAChBshB,EAAI1jB,MAAM2a,MAAQ,MAClB+I,EAAI1jB,MAAMwV,OAAS,MAEnB,MAAMjd,EAAO/B,SAAS4D,cAAc,QACpC7B,EAAKyH,MAAM2U,QAAU,eACrBpc,EAAKyH,MAAM6V,UAAY,QACvBtd,EAAKyH,MAAMihB,SAAW,OACtB1oB,EAAKyH,MAAMgG,MAAQ,QACnBzN,EAAKyH,MAAM24B,YAAc,MACzBpgC,EAAKyH,MAAMkhB,cAAgB,WAC3B3oB,EAAKgD,YAAckB,EACnBinB,EAAIzQ,YAAY1a,GAEhB,IAAK,IAAIL,EAAI,EAAGA,EAAIsgC,EAAKrgC,OAAQD,IAAK,CACpC,MAAM0gC,EAAYpiC,SAAS4D,cAAc,QACzCw+B,EAAUrb,GAAKib,EAAKtgC,GAAGqlB,GACvBqb,EAAU54B,MAAM2U,QAAU,eAC1BikB,EAAU54B,MAAMiG,OAAS,OACzB2yB,EAAU54B,MAAMkhB,cAAgB,WAChC0X,EAAU54B,MAAM6V,UAAY,SACxB2iB,EAAKrgC,OAAS,IAAMD,IACtB0gC,EAAU54B,MAAM64B,qBAAuB,OACvCD,EAAU54B,MAAM84B,wBAA0B,aAEd,IAAnBN,EAAKtgC,GAAGs9B,SACjBoD,EAAUjgC,UAAYo6B,GAAgByF,EAAKtgC,GAAGs9B,QAEhD9R,EAAIzQ,YAAY2lB,EAClB,CAEA,MAAMG,EAAQviC,SAAS4D,cAAc,QAQrC,OAPA2+B,EAAMxb,GAAK,GAAGA,QACdwb,EAAM/4B,MAAMg5B,WAAa,MACzBD,EAAM/4B,MAAMkhB,cAAgB,WAC5BwC,EAAIzQ,YAAY8lB,GAEhBN,EAASxlB,YAAYyQ,GAEd+U,CACT,CAMO,SAASQ,GAA2BC,GACzC,GAAsB,OAAlBlwB,EAAE,YAAsB,CAC1B,MAAMzQ,EAAOyQ,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GACtDgC,EAAQnwB,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GACvDjuB,EAAKF,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GACpDQ,EAAO3uB,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GAEtDj/B,EAAIghC,EACJE,EAAS7gC,EAAK0a,YAAYzc,SAAS4D,cAAc,OACvDg/B,EAAOnmB,YACLzc,SAASwf,eAAe,IAAuB,IAApB9d,EAAEkD,QAAQ,KAAclD,EAAEmhC,UAAU,EAAGnhC,EAAEkD,QAAQ,MAAQlD,QAGzEkhC,EAAOnmB,YAAYzc,SAAS4D,cAAc,SAClDzB,UAAYm6B,aAEjBsG,EAAOnmB,YAAYzc,SAASwf,eAAe,MAC3Czd,EAAK+gC,UAAUt5B,MAAMu5B,YAAc,MACnCJ,EAAMlmB,YAAYzc,SAAS4D,cAAc,OACzC++B,EAAMG,UAAUt5B,MAAMu5B,YAAc,MACpCrwB,EAAG+J,YAAYzc,SAAS4D,cAAc,OACtC8O,EAAGowB,UAAUt5B,MAAMu5B,YAAc,MACjC5B,EAAK1kB,YAAYzc,SAAS4D,cAAc,OACxCu9B,EAAK2B,UAAUt5B,MAAMu5B,YAAc,KACrC,CACF,CChCO,SAASC,KACd,GACiF,IAA/Erc,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkb,QACpE9O,IACiB,IAAjBxN,KAAKkY,QACL,CACA,IAAIqE,EAAQ,EACZh+B,OAAO6C,KAAKosB,IAAerN,SAASplB,IAClC,IAmBIyhC,EAnBAp8B,EAAS4f,KAAKyS,QACG,IAAjBzS,KAAKkY,QACPpB,GAAmB12B,EAEnBA,EAAS02B,GAEI,IAAX12B,IAAcA,EAASotB,IACZ,KAAXptB,IAAeA,EAASqtB,IACb,MAAXrtB,IAAgBA,EAASstB,IAC7B6O,GAAS,EACT1wB,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GAAGA,WAChDuC,GACAvC,WAAW,GAAG57B,YAAc4hB,KAAKoR,QAAQr2B,GAAGo3B,OAC9CtmB,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GAAGA,WAAWuC,GAAOn+B,YAAc,GAChFgC,EAAOrF,GAAGihC,MACV,GAEFnwB,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GAAGA,WAAWuC,GAAO/gC,UAClEm6B,GAAgBv1B,EAAOrF,GAAGs9B,OAG1BmE,EADExc,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASqb,cAC3DlC,GAAWp3B,KAAKC,MAAMhD,EAAOrF,GAAGgR,KAC7B,GAAS5I,KAAKC,MAAMhD,EAAOrF,GAAGgR,IAAK,GACnDF,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GAAGA,WAAWuC,GAAOn+B,YAAco+B,EAClF,MAAME,EAAa9B,IAChB5a,KAAKoR,QAAQr2B,GAAG4hC,WAAa3c,KAAK4c,QAAUzB,OAAyBN,MAExEhvB,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GAAGA,WAAWuC,GAAO/gC,UAClEm6B,GAAgB+G,EAAWrE,OACL,UAApBqE,EAAW7T,MAAoB7I,KAAK4c,QAAU5c,KAAKoR,QAAQr2B,GAAG4hC,UAChE9wB,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GAAGA,WAChDuC,GACAn+B,YAAc,GAAGs+B,EAAW7T,oBAE9Bhd,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GAAGA,WAAWuC,GAAOn+B,YAClEs+B,EAAW7T,IAAI,GAEvB,CACF,CCvGe,SAASgU,KACtB7c,KAAK8c,WAAWp0B,OAAOG,MAAQmX,KAAK8c,WAAWp0B,OAAO2Q,WAAWhU,YACjE2a,KAAK8c,WAAWp0B,OAAOI,OAASkX,KAAK8c,WAAWp0B,OAAO2Q,WAAW/T,aAClE0a,KAAK+c,eAAer0B,OAAOG,MAAQmX,KAAK+c,eAAer0B,OAAO2Q,WAAWhU,YACzE2a,KAAK+c,eAAer0B,OAAOI,OAASkX,KAAK+c,eAAer0B,OAAO2Q,WAAW/T,aAC1E0a,KAAKgd,gBACP,CCJO,SAASC,KAEmE,IAA/Ejd,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkb,QACa,IAAjFtc,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS8b,UACgB,IAApFld,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS+b,aAEpEtxB,EAAE,YAAYhJ,MAAMwV,OAASxM,EAAE,cAAchJ,MAAMiG,OACnD+C,EAAE,QAAQhJ,MAAMwV,OAAS,GAAG2c,OAAOnpB,EAAE,cAAchJ,MAAMiG,OAAOtH,QAAQ,KAAM,KAAO,QACG,IAA/Ewe,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkb,QAC7EzwB,EAAE,YAAYhJ,MAAMwV,OAAS,MAC7BxM,EAAE,QAAQhJ,MAAMwV,OAAS,QAEwD,IAAjF2H,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS8b,UACgB,IAApFld,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS+b,YAEpEtxB,EAAE,QAAQhJ,MAAMwV,OAASxM,EAAE,cAAchJ,MAAMiG,OAG/C+C,EAAE,QAAQhJ,MAAMwV,OAAS,MAIwD,IAAjF2H,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS8b,UACgB,IAApFld,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS+b,YAEpEtxB,EAAE,eAAehJ,MAAMoC,IAAM4G,EAAE,cAAchJ,MAAMiG,OAEnD+C,EAAE,eAAehJ,MAAMoC,IAAM,GAG/B43B,IACF,CAKO,SAASO,KACuE,IAAjFpd,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS8b,SACtErxB,EAAE,cAAchJ,MAAM2U,QAAU,GAC7B3L,EAAE,cAAchJ,MAAM2U,QAAU,OACrCylB,IACF,CC3Ce,SAASI,KACtBnR,GAAkBlM,KAAKsd,WACvBnR,GAAmBnM,KAAKud,WAC1B,CCHe,SAASC,GAAgBC,GACtC,MAAM5D,EAAK7Z,KAAK0d,aAAaD,GACvBE,EAAM,CAAC,EAEb,OADAA,EAAIr+B,KAAOu6B,EAAGv6B,KACPq+B,CACT,CCJe,SAASC,GAAoB/D,GAC1C,IAAIgE,EAAO,EAwBX,GAvBAt/B,OAAO6C,KAAKy4B,EAAGiE,gBAAgB3d,SAASplB,IACtC,IAAKilB,KAAK+d,MAAMlE,EAAGiE,eAAe/iC,GAAG81B,MAAMmN,SAAWvN,GAAOoJ,EAAGiE,eAAe/iC,GAAGuE,MAAO,CACvF,IAAI2+B,EAAW,EAGU,IAAvBje,KAAK2Q,eACLF,GAAOoJ,EAAGqE,mBACVzN,GAAOzQ,KAAK+d,MAAMlE,EAAGiE,eAAe/iC,GAAG81B,MAAMqN,oBAE7CD,GAAsB,IAAVpE,EAAGzZ,GAAW,GAAqB,IAAd,GAAKyZ,EAAGzZ,KAC3Cyd,GAAQI,CACV,KAEF1/B,OAAO6C,KAAKy4B,EAAGsE,WAAWhe,SAASplB,IACjC,GAAI01B,GAAOoJ,EAAGsE,UAAUpjC,GAAGuE,MAAO,CAChC,MAAM8+B,EAAMvE,EAAGsE,UAAUpjC,GACrBqjC,EAAIC,aAAa/+B,OAASu6B,EAAGv6B,KAAMu+B,GAAQ,EAAI,IAAOO,EAAIE,aAAanM,OAClEiM,EAAIE,aAAah/B,OAASu6B,EAAGv6B,OAAMu+B,GAAQ,EAAI,KAAQO,EAAIC,aAAalM,OACnF,KAEE0H,EAAGjI,SAAWnB,GAAOoJ,EAAGjI,QAAQtyB,QAAOu+B,GAAQ,MAC/ChE,EAAG0E,SAAW9N,GAAOoJ,EAAG0E,QAAQj/B,QAClCu+B,GAAQ,EAAgC,IAA5BhO,GAAW2O,QAAQrM,QAAiB,GAAK0H,EAAGzZ,GAAK,KACnB,iBAAjCyZ,EAAGiE,eAAeW,YACR,IAAf5E,EAAG6E,SAAiBjO,GAAOoJ,EAAGiE,eAAeW,WAAWn/B,MAC1D,OAAQ0gB,KAAK6J,YACX,QACEgU,GAAQ,EACR,MACF,KAAK,EACHA,GAAQ,KACR,MACF,KAAK,EACHA,GAAQ,KACR,MACF,KAAK,EACHA,GAAQ,KAKhB,OAAOA,CACT,CCrCe,SAASc,GAAoB5C,GAC1C,MAAMlC,EAAK7Z,KAAKoR,QAAQ2K,GAClB4B,EAAM,CAAC,EA8Fb,MA7FgB,WAAZ9D,EAAGv6B,KACLq+B,EAAIiB,IAAM,SAAUlO,GAClB,IAAI3uB,EAAM,EACN0uB,GAAO,sBAAqB1uB,GAAO,IACnC0uB,GAAO,qBAAoB1uB,GAAO,GAClC0uB,GAAO,qBAAoB1uB,GAAO,IAClC0uB,GAAO,sBAAqB1uB,GAAO,IACnC0uB,GAAO,yBAAwB1uB,GAAO,IACtC0uB,GAAO,yBAAwB1uB,GAAO,IACtC0uB,GAAO,wBAAuB1uB,GAAO,IACrC0uB,GAAO,wBAAuB1uB,GAAO,IACrC0uB,GAAO,uBAAsB1uB,GAAO,IACpC0uB,GAAO,uBAAsB1uB,GAAO,IACpC0uB,GAAO,uBAAsB1uB,GAAO,IACpC0uB,GAAO,yBAAwB1uB,GAAO,IACtC0uB,GAAO,wBAAuB1uB,GAAO,IACzC,IAAI87B,EAAO,EACPpJ,EAAM,EAQV,OAPAl2B,OAAO6C,KAAKyuB,IAAY1P,SAASplB,IACJ,WAAvB80B,GAAW90B,GAAGuE,OAAmBm1B,GAAO5E,GAAW90B,GAAGo3B,OAAM,IAElEpwB,GAAO0yB,EACPoJ,GAAQD,GAAoBlN,GAC5BmN,GAAQ7d,KAAK6e,SAAS,UACtBhB,GAAQtN,GAAO,aAEbvQ,KAAK8e,WACH,GACArO,GAAO,2BACLA,GAAO,kCACPA,GAAO,gBACT1uB,GACE87B,CAER,EACqB,YAAZhE,EAAGv6B,KACZq+B,EAAIiB,IAAM,SAAUlO,GAClB,IAAImN,EAAO,EAYX,GAXAt/B,OAAO6C,KAAK4e,KAAK+e,kBAAkB5e,SAASplB,IACtC01B,GAAOzQ,KAAK+e,iBAAiBhkC,MAAK8iC,GAAQ,EAAC,IAE7CpN,GAAO,oCAAmCoN,GAAQ,GAClDpN,GAAO,yBAAwBoN,GAAQ,GACvCpN,GAAO,kBAAiBoN,GAAQ,GAEhCpN,GAAO,wBAAuBoN,GAAQ,MAE1CA,GAAQtN,GAAO,cAEXE,GAAO,cACT,IAAK,IAAI11B,EAAI,EAAGA,EAAIilB,KAAKgf,eAAeC,OAAOjkC,OAAQD,IACjD01B,GAAOzQ,KAAKgf,eAAeC,OAAOlkC,GAAGuE,QAAOu+B,GAAQ,MAI5DA,GAAQD,GAAoBlN,GAE5B,IAAI3uB,EAAM,EACN0uB,GAAO,cAAa1uB,GAAmC,IAA5B8tB,GAAW2O,QAAQrM,QAC9C1B,GAAO,yBAAwB1uB,GAAmC,IAA5B8tB,GAAW2O,QAAQrM,QACzD1B,GAAO,gBAAe1uB,GAAkC,IAA3B8tB,GAAWqP,OAAO/M,QAEnD,IAAIsC,EAAM,EASV,OARAl2B,OAAO6C,KAAKyuB,IAAY1P,SAASplB,IACJ,YAAvB80B,GAAW90B,GAAGuE,OAAoBm1B,GAAO5E,GAAW90B,GAAGo3B,OAAM,IAGnE0L,GAAQ,EAAqC,IAAjC7N,GAAY,mBAA4ByE,EAEpDoJ,GAAQ7d,KAAK6e,SAAShF,EAAGv6B,OAEjBu6B,EAAGsF,QAAUp9B,GAAO87B,CAC9B,EAEAF,EAAIiB,IAAM,SAAUlO,GAClB,IAAImN,EAAO,EAGX,OAFAA,GAAQD,GAAoBlN,GAC5BmN,GAAQ7d,KAAK6e,SAASnO,EAAGpxB,MAClBoxB,EAAG0O,QAAUvB,CACtB,EAIFF,EAAIwB,QAAUtF,EAAGsF,QACjBxB,EAAIr+B,KAAOu6B,EAAGv6B,KACdq+B,EAAIG,eAAiBjE,EAAGiE,eACxBH,EAAIQ,UAAYtE,EAAGsE,UACnBR,EAAI/L,QAAUiI,EAAGjI,QACjB+L,EAAIY,QAAU1E,EAAG0E,QACjBZ,EAAIyB,QAAUvF,EAAGsF,QACjBxB,EAAIvd,GAAKyZ,EAAGzZ,GACZud,EAAIe,QAAU7E,EAAG6E,QACjBf,EAAIO,iBAAmBrE,EAAGqE,iBACnBP,CACT,CCrGe,SAAS0B,GAAYC,GAClC,MAAMzF,EAAK7Z,KAAKuf,SAASD,GACnB3B,EAAM,CAAC,EA4Bb,OA1BAA,EAAI6B,MAAQ3F,EAAG2F,MACU,mBAAd7B,EAAI6B,QACG,0BAAZ3F,EAAGv6B,KACLq+B,EAAI6B,MAAQ,WACV,IAAIxhC,EAAI,EAIR,OAHAO,OAAO6C,KAAKyuB,IAAY1P,SAASplB,IAC3B80B,GAAW90B,GAAG0kC,OAAS,KAAIzhC,GAAK,EAAC,IAEhCA,CACT,EAEA2/B,EAAI6B,MAAQ,WACV,IAAIE,EAAM,EAEV,GADIjP,GAAO,cAAaiP,EAAM,GAC1B1f,KAAKiR,OAAQ,CACf,MAAMa,EAASd,GAAU,WACV,IAAXc,EAAc4N,GAAO,IACL,IAAX5N,EAAc4N,GAAO,IACV,IAAX5N,IAAc4N,GAAO,IAChC,CACA,OAAOA,CACT,GAGJ/B,EAAI/M,KAAOiJ,EAAGjJ,KACd+M,EAAIr+B,KAAOu6B,EAAGv6B,KACPq+B,CACT,CCde,SAASgC,KAEtBvU,EAAmBpL,KAAK4f,cACxBvU,GAAarL,KAAK6f,QAClBvU,GAAuBtL,KAAK8f,kBAC5BvU,GAAmBvL,KAAK+f,cACxBvU,GAAcxL,KAAKggB,SAGnBzhC,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IACjC,MAAM8+B,EAAK7Z,KAAKoR,QAAQr2B,GACxB,IAAI4iC,EAAM9N,GAAW90B,QACTI,IAARwiC,IAEF9N,GAAW90B,GAAK4jC,GAAoB5jC,GACpC4iC,EAAM9N,GAAW90B,GACjB+gC,GAA2B/gC,IAE7B4iC,EAAIxL,OAAS0H,EAAG1H,OAChBwL,EAAI8B,MAAQ5F,EAAG4F,MACf9B,EAAIsC,aAAepG,EAAGoG,aACtBtC,EAAI1L,UAAY4H,EAAG5H,UACnB0L,EAAIzL,KAAO2H,EAAG3H,KACV2H,EAAGhI,iBACW,WAAZgI,EAAGv6B,OACLqsB,GAAUkO,EAAG1I,SAAS+O,KAAK,GAC3BtU,GAAUiO,EAAG1I,SAAS+O,KAAK,GAC3BrU,GAAUgO,EAAG1I,SAAS+O,KAAK,IAE7BvC,EAAI9L,eAAiBgI,EAAGhI,eACxB8L,EAAIxM,SAAW0I,EAAG1I,UAEpBtB,GAAW90B,GAAK4iC,CAAG,IAIrBp/B,OAAO6C,KAAK4e,KAAKuf,UAAUpf,SAASplB,IAClC,MAAM8+B,EAAK7Z,KAAKuf,SAASxkC,GACzB,IAAI4iC,EAAM7N,GAAY/0B,QACVI,IAARwiC,IACF7N,GAAY/0B,GAAKskC,GAAYtkC,GAC7B4iC,EAAM7N,GAAY/0B,IAEpB4iC,EAAI7M,OAAS+I,EAAG/I,OAChBhB,GAAY/0B,GAAK4iC,CAAG,IAItBp/B,OAAO6C,KAAK4e,KAAK0d,cAAcvd,SAASplB,IACtC,MAAM8+B,EAAK7Z,KAAK0d,aAAa3iC,GAC7B,IAAI4iC,EAAM5N,GAAgBh1B,QACdI,IAARwiC,IACF5N,GAAgBh1B,GAAKyiC,GAAgBziC,GACrC4iC,EAAM5N,GAAgBh1B,IAExB4iC,EAAIwC,IAAMtG,EAAGsG,IACbpQ,GAAgBh1B,GAAK4iC,CAAG,IAI1BN,KACA5R,GAAgBS,GAChBR,GAAiBS,EACnB,CCxDO,SAASiU,GAAoBvX,GAClC,MAAMtC,EAAMltB,SAAS4D,cAAc,OAKnC,OAJAspB,EAAI1jB,MAAMw9B,WAAa,OACvB9Z,EAAInG,GAAK,GAAGyI,SACZtC,EAAI/qB,UAAYm6B,aAChBpP,EAAInoB,YAAcyqB,EACXtC,CACT,CA4GO,SAAS+Z,GAAgCrZ,GAC9CA,EAAQnR,YAAYsqB,GAAoB,iBACxC,MAAMG,EAASlnC,SAAS4D,cAAc,OACtCsjC,EAAO19B,MAAM29B,aAAe,MAC5BD,EAAO19B,MAAMyF,MAAQ,QACrBi4B,EAAOngB,GAAK,kBACZ6G,EAAQnR,YAAYyqB,GAEpBtZ,EAAQnR,YAAYsqB,GAAoB,4BACxCnZ,EAAQkV,UAAUt5B,MAAM2U,QAAU,OAClC,MAAMipB,EAAQpnC,SAAS4D,cAAc,OACrCwjC,EAAM59B,MAAM29B,aAAe,MAC3BC,EAAM59B,MAAMyF,MAAQ,QACpBm4B,EAAM59B,MAAM2U,QAAU,OACtBipB,EAAMrgB,GAAK,0BACX6G,EAAQnR,YAAY2qB,GAEpBxZ,EAAQnR,YAAYsqB,GAAoB,mBACxC,MAAMr0B,EAAK1S,SAAS4D,cAAc,OAClC8O,EAAGlJ,MAAM29B,aAAe,MACxBz0B,EAAGqU,GAAK,cACR6G,EAAQnR,YAAY/J,GAEpBkb,EAAQnR,YAAYsqB,GAAoB,cACxC,MAAM5F,EAAOnhC,SAAS4D,cAAc,OAIpC,GAHAu9B,EAAKpa,GAAK,gBACV6G,EAAQnR,YAAY0kB,GAEA,MAAhB/C,GAAqB,CACvBxQ,EAAQnR,YAAYsqB,GAAoB,0CACxCnZ,EAAQkV,UAAU/b,GAAK,gCACvB,MAAMsgB,EAAarnC,SAAS4D,cAAc,OAC1CyjC,EAAWtgB,GAAK,0BAChB6G,EAAQnR,YAAY4qB,EACtB,CACA,GAAoB,MAAhBjJ,GAAqB,CACvBxQ,EAAQnR,YAAYsqB,GAAoB,sDACxCnZ,EAAQkV,UAAU/b,GAAK,iCACvB,MAAMsgB,EAAarnC,SAAS4D,cAAc,OAC1CyjC,EAAWtgB,GAAK,2BAChB6G,EAAQnR,YAAY4qB,EACtB,CACF,CC3Ke,SAASC,GAAW9G,EAAIpI,GACrC,IAAI4G,EAAS,GA4Bb,OA1BsCA,EAAlCwB,EAAG9tB,IAAM,GAAK8tB,EAAG9tB,KAAO8oB,IAAmBsB,GACtC0D,EAAG9tB,GAAKwjB,GAAqBsG,GAC7BgE,EAAG9tB,KAAOwjB,GAAqBuG,GAC/B+D,EAAG9tB,GAAK0jB,GAAa,IAAI,GAAasG,GACtC8D,EAAG9tB,GAAK0jB,GAAa,IAAI,GAAauG,GACtC6D,EAAG9tB,GAAK0jB,GAAa,IAAI,GAAawG,GACjCC,GAMN,IAFNlB,OACEhV,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwf,sBAIpEnP,EAAQoJ,KACR7F,OACEhV,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwf,uBAGtEvI,EAASxC,IAGT7V,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASyf,uBAClEpP,EAAQzR,KAAK4c,QAAU,IAAGvE,EAASpC,IAElCoC,CACT,CC7Ce,SAASyI,KACtB,IAAIjD,EAAO,EAIX,OAHAt/B,OAAO6C,KAAK4e,KAAK+gB,OAAO5gB,SAASplB,SACM,IAA1BilB,KAAK+gB,MAAMhmC,GAAGimC,UAAyBnD,GAAQ7d,KAAK+gB,MAAMhmC,GAAGimC,QAAO,IAE1EnD,CACT,CCFe,SAASoD,GAAOhR,GACzBF,GAAgBE,IACgB,IAA9BF,GAAgBE,GAAMkQ,MACxBpQ,GAAgBE,GAAMkQ,IAAM,EACS,WAAjCngB,KAAK0d,aAAazN,GAAMW,OAAmBtF,IAAwB,GAG7E,CCWe,SAAS4V,KACtBlV,GAAe,EACf,IAAI6R,EAAO,EAEX,MAAMsD,EAAO,CAAC,EACd5iC,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IACjC,GAAIilB,KAAKoR,QAAQr2B,GAAG82B,gBAAkB7R,KAAKoR,QAAQr2B,GAAGo2B,SAASgQ,KAAM,CACnE,MAAMC,EAASphB,KAAKoR,QAAQr2B,GAAGo2B,SAASgQ,KACxC5iC,OAAO6C,KAAKggC,GAAQjhB,SAASkhB,IACvBF,EAAKE,GAAKF,EAAKE,IAAOD,EAAOC,GAC5BF,EAAKE,GAAMD,EAAOC,EAAG,GAE9B,KAEFtV,GAAUoV,EAEiB,IAAvBnhB,KAAK2Q,gBACPkN,GAAkC,IAA1B71B,WAAWwjB,IAAsBD,GCpC9B,WACb,IAAI+V,EAAe,EAWnB,GAVI7Q,GAAO,0BAAyB6Q,GAAgB,KAChD7Q,GAAO,2BAA0B6Q,GAAgB,IACjD7Q,GAAO,qBAAoB6Q,GAAgB,KAC3C7Q,GAAO,4BAA2B6Q,GAAgB,KAClD7Q,GAAO,kBAAiB6Q,GAAgB,KAE5CA,GAAgB,EAAgC,IAA5BtR,GAAY,cAC5BS,GAAO,iBAAgB6Q,GAAgB,MACvC7Q,GAAO,kBAAiB6Q,GAAgB,MACxC7Q,GAAO,kBAAiB6Q,GAAgB,MACxCthB,KAAKiR,OAAQ,CACf,MAAMa,EAASd,GAAU,YACV,IAAXc,EAAcwP,GAAgB,GACd,IAAXxP,EAAcwP,GAAgB,GACnB,IAAXxP,IAAcwP,GAAgB,GACzC,CACA,OAAOA,CACT,CDiBgEC,IAE9D1D,GAAQtN,GAAO,OAEXE,GAAO,YAAqC,IAAvBzQ,KAAK2Q,gBAAqBkN,GAAQ,EAAI,IAAO7d,KAAKwhB,SAE3EjjC,OAAO6C,KAAK4e,KAAKyhB,gBAAgBthB,SAASplB,IACxC,MAAM8+B,EAAK7Z,KAAKyhB,eAAe1mC,GAC3B01B,GAAOoJ,EAAGv6B,QAIY,mBAAbu6B,EAAG2F,MACZ3B,GAAQ,EAAuD,IAAnD/N,GAAY+J,EAAGv6B,MAAMkgC,MAAM1P,GAAY+J,EAAGv6B,OACjDu+B,GAAQ,EAAe,IAAXhE,EAAG2F,MACxB,IAGE/O,GAAO,iCAAgCoN,GAAQ,MAC/CpN,GAAO,0BAAyBoN,GAAQ,MACxCpN,GAAO,sBAAqBoN,GAAQ,MACpCpN,GAAO,iBAAgBoN,GAAQ,MAC/BpN,GAAO,kBAAiBoN,GAAQ,MAEhCpN,GAAO,yBAAwBoN,GAAQ,MACvCpN,GAAO,wBAAuBoN,GAAQ,MACtCpN,GAAO,oBAAmBoN,GAAQ,MAClCpN,GAAO,sBAAqBoN,GAAQ,MACpCpN,GAAO,sBAAqBoN,GAAQ,KAEpCpN,GAAO,kBAAiBoN,GAAQ,MAChCpN,GAAO,kBAAiBoN,GAAQ,MAEhCpN,GAAO,kBAAiBoN,GAAQ,MAGpC,IAAI6D,EAAY,EAChB,GAAI1Q,GAAW,CACb,IAAIc,EAASd,GAAU,cACR,IAAXc,EAAc+L,GAAQ,KACN,IAAX/L,EAAc+L,GAAQ,IACX,IAAX/L,IAAc+L,GAAQ,MAE/B/L,EAASd,GAAU,QACJ,IAAXc,EACF+L,GAAQ,EAAI,IAAO16B,KAAKw+B,IAAKtN,GAAyB,IAAO,MAAiBlxB,KAAKuT,GAAK,GACtE,IAAXob,EACP+L,GAAQ,EAAI,IAAO16B,KAAKw+B,IAAKtN,GAAyB,IAAO,MAAkBlxB,KAAKuT,GAAK,GACvE,IAAXob,IACP+L,GAAQ,EAAI,IAAO16B,KAAKw+B,IAAKtN,GAAyB,IAAO,MAAkBlxB,KAAKuT,GAAK,IAE3Fob,EAASd,GAAU,aACJ,IAAXc,EAAc4P,GAAa,IACX,IAAX5P,EAAc4P,GAAa,IAChB,IAAX5P,IAAc4P,GAAa,KAEpC5P,EAASd,GAAU,YACJ,IAAXc,EAAc4P,GAAa,IACX,IAAX5P,EAAc4P,GAAa,KAChB,IAAX5P,IAAc4P,GAAa,MAEpC5P,EAASd,GAAU,SACJ,IAAXc,EAAc4P,GAAa,IACX,IAAX5P,EAAc4P,GAAa,IAChB,IAAX5P,IAAc4P,GAAa,IACtC,CAEIjR,GAAO,oBAAmBoN,GAAQ,EAA4B,KAAvB7d,KAAK4hB,WAAa,IAE7D,MAAMC,EAAevW,GAAuB,GAC5C,IAAIwW,EAAW,EAIf,GAHIrR,GAAO,8BAA6BqR,GAAY,MAEpDA,GAAY,EAAoC,IAAhC9R,GAAY,kBACxBgB,GAAW,CACb,MAAMc,EAASd,GAAU,UACV,IAAXc,EAAcgQ,GAAY,IACV,IAAXhQ,EAAcgQ,GAAY,KACf,IAAXhQ,IAAcgQ,GAAY,KACrC,CACAA,GAAYvR,GAAO,QAEnB,IAAIwR,EAAU,EAEVtR,GAAO,oBAAmBsR,GAAW,EAAmB,GAAfF,EAAqBC,GAC9DrR,GAAO,oBAAmBsR,GAAW,EAAmB,KAAfF,EAAuBC,GAChErR,GAAO,sBAAqBsR,GAAW,EAAmB,IAAfF,EAAsBC,GACjErR,GAAO,sBAAqBsR,GAAW,EAAmB,KAAfF,EAAuBC,GAClErR,GAAO,qBAAoBsR,GAAW,EAAmB,GAAfF,EAAqBC,GAC/DrR,GAAO,wBAAuBsR,GAAW,EAAmB,GAAfF,EAAqBC,GAClErR,GAAO,wBAAuBsR,GAAW,EAAmB,GAAfF,EAAqBC,GAClErR,GAAO,oBAAmBsR,GAAW,EAAmB,GAAfF,EAAqBC,GAC9DrR,GAAO,wBAAuBsR,GAAW,EAAmB,GAAfF,EAAqBC,GAClErR,GAAO,+CACTsR,GAAW,EAAmB,KAAfF,EAAuBC,GACpCrR,GAAO,uBAAsBsR,GAAW,EAAmB,IAAfF,EAAsBC,GAClErR,GAAO,qBAAoBsR,GAAW,EAAmB,KAAfF,EAAuBC,GACjErR,GAAO,uBAAsBsR,GAAW,EAAmB,KAAfF,EAAuBC,GACnErR,GAAO,mBAAkBsR,GAAW,EAAmB,IAAfF,EAAsBC,GAC9DrR,GAAO,wBAAuBsR,GAAW,EAAmB,KAAfF,EAAuBC,GACpErR,GAAO,mBAAkBsR,GAAW,EAAmB,GAAfF,EAAqBC,GAC7DrR,GAAO,kBAAiBsR,GAAW,EAAmB,IAAfF,EAAsBC,GAEjEvjC,OAAO6C,KAAKyuB,IAAY1P,SAASplB,IAC/B,MAAM8+B,EAAKhK,GAAW90B,GACtB,IAAIinC,EAAYnI,EAAG+E,IAAI/E,GACI,IAAvB7Z,KAAK2Q,gBAAqBqR,IAAc,EAAe,IAAXnI,EAAG4F,OAAgBiC,GACnD,YAAZ7H,EAAGv6B,MAAsBmxB,GAAO,sDAClCuR,GAAa,EAAI,IAAOH,EAAeC,GACzC9V,IAAgB6N,EAAG1H,OAAS6P,CAAS,IAGnCvR,GAAO,WAAUzE,IAAgB,GAErC6R,GAAQkE,EAER,IAAIE,EAAU,EAad,GAZIxR,GAAO,iBAAgBwR,GAAW,MAClCxR,GAAO,cAAawR,GAAW,MAC/BxR,GAAO,gBAAewR,GAAW,MACjCxR,GAAO,eAAcwR,GAAW,MAChCxR,GAAO,eAAcwR,GAAW,MAChCxR,GAAO,iBAAgBwR,GAAW,MAClCxR,GAAO,mBAAkBwR,GAAW,MACpCxR,GAAO,gBAAewR,GAAW,MACjCxR,GAAO,eAAcwR,GAAW,MAChCxR,GAAO,eAAcwR,GAAW,MAChCxR,GAAO,gBAAewR,GAAW,MACjCxR,GAAO,eAAcwR,GAAW,MAChCxR,GAAO,eAAgB,CAEzB,IAAIyR,EACmE,GAApE/+B,KAAKgE,OAAOqtB,GAAyBxU,KAAKmiB,WAAa,IAAO,IAAY,GAAK,GAAK,GACvFD,EAAM/+B,KAAKyD,IAAIs7B,EAAK,KAEpB7U,GAAe,EAAiC,IAA5B,GAAK,EAAI6U,EAAM,MAAQ,GAC3CD,GAAW5U,EACb,CACAwQ,GAAQoE,EAEJxR,GAAO,kBAAiBoN,GAAQ,EAAgC,IAA5B16B,KAAKyD,IAAI,IAAKoZ,KAAKoiB,QAG3DvE,GAAQ,EAAI7N,GAAY,oBAExB,MAAMqS,EAAerW,GAAe6R,EACpCt/B,OAAO6C,KAAK4e,KAAKsiB,iBAAiBniB,SAASplB,IACrCsnC,GAAgBriB,KAAKsiB,gBAAgBvnC,GAAGwnC,WAAWtB,GAAOjhB,KAAKsiB,gBAAgBvnC,GAAGuE,KAAK,IAG7F2sB,GAAkBoW,EAElB,MAAM,EAAErkC,GAAMgiB,KAAKwiB,aAAaC,OAC1BC,EAAW1S,GAAY,oBAC7B,IAAK,IAAIj1B,EAAI,EAAGA,EAAIiD,EAAGjD,IACrB8iC,GAAQ,EAAe,KAAX6E,EAGd,MAAMpjC,EAAO0gB,KAAK2iB,WAAWtnC,cAM7B,GALa,WAATiE,EAAmBu+B,GAAQ,IACb,WAATv+B,IAAmBu+B,GAAQ,KAEhCpN,GAAO,oBAAmBoN,GAAQ,KAElCpN,GAAO,uBAAwB,CACjC,IAAImS,EAAmB,IACvB,GAAInS,GAAO,iBAAkB,CAC3B,MAAMoS,EAAW7iB,KAAK8iB,qBACtBvkC,OAAO6C,KAAKyhC,GAAU1iB,SAASplB,IACzB01B,GAAOoS,EAAS9nC,MAAK6nC,GAAoB,GAAG,GAEpD,CACA/E,GAAQ+E,CACV,CACA,GAAInS,GAAO,yBAA0B,CACnC,IAAIsS,EAAW,GACXtS,GAAO,yBAAwBsS,GAAY,IAC3CtS,GAAO,oBAAmBsS,GAAY,KACtCtS,GAAO,sBAAqBsS,GAAY,KACxCtS,GAAO,qBAAoBsS,GAAY,KAC3ClF,GAAQ,EAAIkF,CACd,CAEItS,GAAO,uBAAsBoN,GAAQ,KACrCpN,GAAO,wBAAuBoN,GAAQ,GAE1C7R,GAAehM,KAAKgjB,kBAAkB,MAAOhX,IAE7C6R,GAAQiD,KAER9U,IAAgB6R,CAGlB,CEzOO,MAAMoF,GAAW,CACtB,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,gBAIWC,GAAe,CAC1B,gBACA,gBACA,cACA,gBACA,kBACA,kBACA,kBAIWC,GAAgB,CAC3B,0BACA,qBACA,mBACA,iBACA,sBACA,gBACA,oBAIWC,GAAa,CACxB,sBACA,wBACA,sBACA,yBACA,wBACA,yBACA,wBAIWC,GAAa,CACxB,qBACA,oBACA,oBACA,yBACA,cACA,WACA,eCnEa,SAASC,GAAarT,GACnC,OAAOF,GAAgBE,GAAQF,GAAgBE,GAAMkQ,IAAM,CAC7D,CCIe,SAASoD,KACtB,IAAIC,EAAW,EACfjlC,OAAO6C,KAAK4e,KAAK+e,kBAAkB5e,SAASplB,IACtC01B,GAAOzQ,KAAK+e,iBAAiBhkC,MAAKyoC,GAAY,EAAC,KAEhDF,GAAa,UAAYE,GAAY,GAAGvC,GAAO,UAC/CqC,GAAa,YAAcE,GAAY,IAAIvC,GAAO,WAEvD,IAAIwC,EAAiB,EACjBC,EAAgB,EAChBC,EAAS,EACTC,EAAY,IAChBrlC,OAAO6C,KAAKyuB,IAAY1P,SAASplB,IAC/B0oC,GAAkB5T,GAAW90B,GAAGo3B,OAChCyR,EAAYzgC,KAAKyD,IAAIipB,GAAW90B,GAAGo3B,OAAQyR,GACtCN,GAAa,kBAEdzT,GAAW90B,GAAGo3B,OACdhvB,KAAKyD,IAAI,IAAK,IAAMoZ,KAAK6jB,YAAY7oC,OAASglB,KAAKoR,QAAQr2B,GAAGqlB,GAAK,MAEnEsjB,EAAgB,GAEfJ,GAAa,YACZzT,GAAW90B,GAAGo3B,OAA0D,IAAhDnS,KAAK6jB,YAAY7oC,OAASglB,KAAKoR,QAAQr2B,GAAGqlB,MAAUujB,EAAS,EAC3F,IAEEC,GAAa,GAAG3C,GAAO,uBACL,IAAlByC,GAAqBzC,GAAO,iBACjB,IAAX0C,GAAc1C,GAAO,WACrB2C,GAAa,KAAK3C,GAAO,cACzB2C,GAAa,KAAK3C,GAAO,yBACzB2C,GAAa,KAAK3C,GAAO,gBACzB2C,GAAa,KAAK3C,GAAO,2BACzB2C,GAAa,KAAK3C,GAAO,iBACzB2C,GAAa,KAAK3C,GAAO,4BACzB2C,GAAa,KAAK3C,GAAO,oBACzB2C,GAAa,KAAK3C,GAAO,+BACzB2C,GAAa,KAAK3C,GAAO,kBACzB2C,GAAa,KAAK3C,GAAO,6BACzB2C,GAAa,KAAK3C,GAAO,iBACzB2C,GAAa,KAAK3C,GAAO,4BACzB2C,GAAa,KAAK3C,GAAO,kBAEzBwC,GAAkB,KAAKxC,GAAO,WAC9BwC,GAAkB,KAAKxC,GAAO,aAC9BwC,GAAkB,KAAMxC,GAAO,YAC/BwC,GAAkB,MAAMxC,GAAO,sBAC/BwC,GAAkB,KAAMxC,GAAO,gBAC/BwC,GAAkB,MAAMxC,GAAO,gBAC/BwC,GAAkB,KAAOxC,GAAO,UAEhC7V,GAAoB,IAAI6V,GAAO,YAC/B7V,GAAoB,IAAI6V,GAAO,aAC/B7V,GAAoB,KAAK6V,GAAO,YAChC7V,GAAoB,KAAK6V,GAAO,oBAChC7V,GAAoB,KAAK6V,GAAO,oBAChC7V,GAAoB,KAAK6V,GAAO,oCAChC7V,GAAoB,KAAK6V,GAAO,UAChC7V,GAAoB,KAAK6V,GAAO,kBAChC7V,GAAoB,KAAK6V,GAAO,0BAEhCwC,GAAkB,KAAQrY,GAAoB,KAAK6V,GAAO,YAC1DwC,GAAkB,KAAQrY,GAAoB,KAAK6V,GAAO,qBAE1DpR,GAAWiU,OAAO3R,OAAStC,GAAW2O,QAAQrM,QAAU,KAAK8O,GAAO,qBAExE,IAAI8C,GAAkB,EACtBxlC,OAAO6C,KAAK8hC,IAAc/iB,SAASplB,IAC5B01B,GAAOyS,GAAanoC,MAAKgpC,GAAkB,EAAK,IAEnDA,GAAiB9C,GAAO,kBAE5B,IAAI+C,GAAmB,EAMvB,GALAzlC,OAAO6C,KAAK+hC,IAAehjB,SAASplB,IAC7B01B,GAAO0S,GAAcpoC,MAAKipC,GAAmB,EAAK,IAErDA,GAAkB/C,GAAO,eAEzBxQ,GAAO,mBAAoB,CAC7B,MAAMwT,EAAOjkB,KAAK+d,MAAMnM,QAAQiR,SAChC,IAAIqB,EAAW,EACf3lC,OAAO6C,KAAK6iC,GAAM9jB,SAASplB,IACrB01B,GAAOwT,EAAKlpC,GAAGuE,QAAO4kC,GAAY,EAAC,IAErCA,GAAYD,EAAKjpC,QAAQimC,GAAO,YACtC,CACF,CCpFe,SAASkD,GAAwB3S,EAAUW,GACxDwN,KACA9P,GAAW2B,GAAUW,QAAUA,EAC/B,MAAM0H,EAAKhK,GAAW2B,GAEL,WAAbA,GACEqI,EAAG1H,QAAU,GAAG8O,GAAO,SACvBpH,EAAG1H,QAAU,GAAG8O,GAAO,gBACvBpH,EAAG1H,QAAU,IAAI8O,GAAO,eACxBpH,EAAG1H,QAAU,KAAK8O,GAAO,mBACzBpH,EAAG1H,QAAU,KAAK8O,GAAO,eACzBpH,EAAG1H,QAAU,KAAK8O,GAAO,uBACzBpH,EAAG1H,QAAU,KAAK8O,GAAO,SACzBpH,EAAG1H,QAAU,KAAK8O,GAAO,kCACzBpH,EAAG1H,QAAU,KAAK8O,GAAO,iCACzBpH,EAAG1H,QAAU,KAAK8O,GAAO,wBACzBpH,EAAG1H,QAAU,KAAK8O,GAAO,wBACzBpH,EAAG1H,QAAU,KAAK8O,GAAO,eACzBpH,EAAG1H,QAAU,KAAM8O,GAAO,wBAE9B1iC,OAAO6C,KAAK4e,KAAKoR,QAAQyI,EAAGv6B,MAAM8kC,eAAejkB,SAAS4Z,IACpDF,EAAG1H,QAAUnS,KAAK+d,MAAM/d,KAAKoR,QAAQyI,EAAGv6B,MAAM8kC,cAAcrK,GAAGlJ,MAAMwT,cACvEpD,GAAOjhB,KAAKoR,QAAQyI,EAAGv6B,MAAM8kC,cAAcrK,GAAGz6B,KAChD,IAIJ,MAAMglC,EAAwBhZ,GAU9B,OARA4V,KAEAqC,KAEIe,IAA0BhZ,IAC5B4V,KAGKlV,GAAehM,KAAKgb,SAC7B,CC5Ce,SAASuJ,GAA4BC,EAAcC,EAAUC,GAC1E,IAAIC,EAAQH,EACRjI,EAAQ,EACZ,KAAOoI,EAAQD,GACbC,GAAqE,KAA5DxhC,KAAK2D,IAAI,MAAQ69B,EAAQxhC,KAAK2D,IAAI29B,EAAU,OAAS,IAC9DlI,GAAS,EAEX,OAAOA,EAAQvc,KAAKwB,GACtB,CCVe,SAASojB,KACkB,OAApC/4B,EAAE,gCACoF,IAApFmU,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASyjB,aACtEh5B,EAAE,8BAA8BhJ,MAAMoC,IAAM,OAC5C4G,EAAE,8BAA8BhJ,MAAM04B,OAAS,WAC/C1vB,EAAE,8BAA8BhJ,MAAMqK,QAAU,YAEhDrB,EAAE,8BAA8BhJ,MAAM2a,MAAQ,OAC9C3R,EAAE,8BAA8BhJ,MAAM04B,OAAS,MAC/C1vB,EAAE,8BAA8BhJ,MAAMqK,QAAU,WAGtD,CCDe,SAAS43B,KAEtB,GADAnF,KACyC,SAArC9zB,EAAE,iBAAiBhJ,MAAM2U,SAAsB3L,EAAE,iBAAkB,CACrEA,EAAE,iBAAiB6L,UAAY,GAC/B,MAAMqtB,EZHH,WACLl5B,EAAE,WAAWjO,WAAWiF,MAAMmiC,cAAgB,MAC9C,MAAMD,EAAa1rC,SAAS4D,cAAc,OAM1C,OALA8nC,EAAWliC,MAAMgU,OAAS,YAC1BkuB,EAAWliC,MAAMqK,QAAU,MAC3B63B,EAAWliC,MAAM04B,OAAS,WAC1BwJ,EAAW3kB,GAAK,kBAChB2kB,EAAWvpC,UAAYm6B,aAChBoP,CACT,CYNuB,GACnBl5B,EAAE,iBAAiBiK,YAAYivB,GAEX,MAAhBtN,GCIO,WACb,IAAIr3B,EAaJ,GAZqB,IAAjB4f,KAAKkY,QACPlB,GAA4B52B,EAE5BA,EAAS42B,GAEU,IAAjBhX,KAAKyS,QAAeryB,EAASotB,GACP,KAAjBxN,KAAKyS,QAAgBryB,EAASqtB,GACb,MAAjBzN,KAAKyS,UAAiBryB,EAASstB,IAExC6J,GAAevX,KAAKoR,QAAQsG,IAAaiF,UACzCnF,GAAqBp3B,EAAOs3B,IAAasE,MAGqD,IAA5Fhc,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6jB,qBACnD,IAAjBjlB,KAAKkY,QACL,CAIA,GAFA,GADmBrsB,EAAE,oBAKjB,IADFmU,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6jB,qBAEnD,IAAjBjlB,KAAKkY,QACL,CACArsB,EAAE,mBAAmBzN,YAAc,GAASo5B,GAAoB,GAChE,MAAM0N,EAAW/hC,KAAKC,MAAOo0B,GAAqBxX,KAAKgb,UAAa,KAChEhG,OAAOC,SAASiQ,IAA0B,IAAbA,EAC/Br5B,EAAE,mBAAmBzN,aAAe,KAAK8mC,EAAW,kBAEpDr5B,EAAE,mBAAmBzN,aAAe,OAClC4hB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgU,eAChE,IACA,oBAGRvpB,EAAE,mBAAmBrQ,UAAYm6B,GAAgBv1B,EAAOs3B,IAAaW,OACjErY,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASqb,cACtE5wB,EAAE,eAAezN,YAAcm8B,GAAWn6B,EAAOs3B,IAAa3rB,IAC3DF,EAAE,eAAezN,YAAc,GAASgC,EAAOs3B,IAAa3rB,GAAI,GACrEF,EAAE,eAAerQ,UAAYm6B,GAAgBv1B,EAAOs3B,IAAaW,OACjE,MAAMqE,EAAa9B,IAChBrD,IAAgBvX,KAAK4c,QAAUzB,OAAyBN,MAE3DhvB,EAAE,iBAAiBzN,YAAcs+B,EAAW7T,KACpB,UAApB6T,EAAW7T,MAAoB7I,KAAK4c,QAAUx8B,EAAOs3B,IAAajG,MACpE5lB,EAAE,iBAAiBzN,YAAc,GAAGs+B,EAAW7T,oBAC1Chd,EAAE,iBAAiBzN,YAAcs+B,EAAW7T,KACnDhd,EAAE,iBAAiBrQ,UAAYm6B,GAAgB+G,EAAWrE,MAC5D,CAGAxsB,EAAE,iCAAiChJ,MAAM2U,QAAU,OACnD3L,EAAE,iBAAiBhJ,MAAM29B,aAAe,MAGxC,IAAK,MAAMzlC,KAAKwD,OAAO6C,KAAK4e,KAAKoR,QAAQsG,IAAayN,mBACpD,IAAKnlB,KAAKolB,UAAUplB,KAAKoR,QAAQsG,IAAayN,kBAAkBpqC,GAAGsqC,OAAO/lC,MAAO,CAC/E,MAAMgmC,EAAuBtlB,KAAKoR,QAAQsG,IAAayN,kBAAkBpqC,GACzE8Q,EAAE,iBAAiBhJ,MAAM29B,aAAe,MACxC30B,EAAE,iCAAiChJ,MAAM2U,QAAU,GACnD3L,EAAE,2BAA2BrQ,UAAY,kBAAkBk8B,KAC3D7rB,EAAE,2BAA2BzN,YAAc,GACzCknC,EAAqB5F,IAAM7P,GAAW6H,IAAauI,aACnD,IAEFp0B,EAAE,2BAA2BhJ,MAAMyF,MAAQ,QAC3C,KACF,CAGF,MAAMi9B,EAAkB5X,GAA4B+J,IACpD,GAAI6N,EAAgB7M,aAAe,IAAK,CAItC,IAAI8M,EAHJ35B,EAAE,2BAA2BhJ,MAAM29B,aAAe,MAClD30B,EAAE,kCAAkChJ,MAAM2U,QAAU,GAIlDguB,EADExlB,KAAKgb,UAEL73B,KAAK2D,IAAIy+B,EAAgB9T,OAASzR,KAAK4c,QAAUzB,MAAuB,GACtEnb,KAAKgb,UACPuK,EAAgB9T,MACd0S,GAAwBzM,GAAa6N,EAAgB7M,cAGvD6M,EAAgB9T,MAChB0S,GAAwBzM,GAAa6N,EAAgB7M,cAEzD7sB,EAAE,4BAA4BzN,YAAc,GAAG,GAC7CmnC,EAAgB7M,mBACX,GAAS6M,EAAgB9T,YAChC5lB,EAAE,4BAA4BhJ,MAAMyF,MAAQ,QAC5C,MAAMm9B,EAASpsC,SAAS4D,cAAc,QAClC+iB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASqb,cACtEgJ,EAAOrnC,YAAcm8B,GAAWiL,GAC7BC,EAAOrnC,YAAc,GAASonC,GACnCC,EAAOjqC,UAAYm6B,GAAgBgL,GAAW,CAAE50B,GAAIy5B,GAAcD,EAAgB9T,OAClF5lB,EAAE,4BAA4BiK,YAAY2vB,EAC5C,MACE55B,EAAE,kCAAkChJ,MAAM2U,QAAU,OACpD3L,EAAE,2BAA2BhJ,MAAM29B,aAAe,KAEtD,MAAO30B,EAAE,iBAAiBhJ,MAAM2U,QAAU,MAC5C,CD3GMkuB,GACyB,MAAhBjO,GENA,WAQb,GANA,GADmB5rB,EAAE,oBAGrB2rB,GAAqBvJ,GAAcjO,KAAK4Z,gBAAgBlC,IAAap4B,MAAM08B,MAC3EzE,GAAevX,KAAKuf,SAASvf,KAAK4Z,gBAAgBlC,IAAap4B,MAAMqmC,WACrEhO,GAAoB1J,GAAcjO,KAAK4Z,gBAAgBlC,IAAap4B,MAAMsmC,WAGoB,IAA5F5lB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6jB,oBACpE,CACAp5B,EAAE,mBAAmBzN,YAAc,GAASo5B,GAAoB,GAChE,MAAM0N,EAAW/hC,KAAKC,MAAOo0B,GAAqBxX,KAAKgb,UAAa,KAE3B,MAArCnvB,EAAE,mBAAmBzN,aACvByN,EAAE,qBAAqBhJ,MAAM2U,QAAU,OACvC3L,EAAE,mBAAmBhJ,MAAM2U,QAAU,OACrC3L,EAAE,uBAAuBhJ,MAAM2U,QAAU,OACzC3L,EAAE,eAAehJ,MAAM2U,QAAU,SAE7Bwd,OAAOC,SAASiQ,IAA0B,IAAbA,EAC/Br5B,EAAE,mBAAmBzN,aAAe,KAAK8mC,EAAW,kBAEpDr5B,EAAE,mBAAmBzN,aAAe,OAClC4hB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgU,eAChE,IACA,oBAGRvpB,EAAE,mBAAmBrQ,UACnBm6B,GAAgB1H,GAAcjO,KAAK4Z,gBAAgBlC,IAAap4B,MAAM+4B,QAItEV,KACF9rB,EAAE,2BAA2BzN,YAAc,GAASu5B,IACpD9rB,EAAE,2BAA2BhJ,MAAM2U,QAAU,QAC7C3L,EAAE,2BAA2Bg6B,gBAAgBhjC,MAAM2U,QAAU,UAG1DggB,IAAsBG,IACzB9rB,EAAE,eAAezN,YAAc,GAAG,GAASm5B,GAAeI,aAC1D9rB,EAAE,eAAehJ,MAAMyF,MAAQ,QAC/BuD,EAAE,uBAAuBhJ,MAAM2U,QAAU,QACzC3L,EAAE,eAAehJ,MAAM2U,QAAU,UAE7BwI,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASqb,cACtE5wB,EAAE,eAAezN,YAAcm8B,GAC7BtM,GAAcjO,KAAK4Z,gBAAgBlC,IAAap4B,MAAMyM,IAGxDF,EAAE,eAAezN,YAAc,GAC7B6vB,GAAcjO,KAAK4Z,gBAAgBlC,IAAap4B,MAAMyM,GACtD,GAEJF,EAAE,eAAerQ,UACfm6B,GAAgB1H,GAAcjO,KAAK4Z,gBAAgBlC,IAAap4B,MAAM+4B,QAE1E,MAAMqE,EAAa9B,IAChBrD,IAAgBvX,KAAK4c,QAAUzB,OAAyBN,MAY3D,GAVAhvB,EAAE,iBAAiBzN,YAAcs+B,EAAW7T,KAEtB,UAApB6T,EAAW7T,MACX7I,KAAK4c,QAAU5c,KAAK4Z,gBAAgBlC,IAAaiO,WAEjD95B,EAAE,iBAAiBzN,YAAc,GAAGs+B,EAAW7T,oBAC1Chd,EAAE,iBAAiBzN,YAAcs+B,EAAW7T,KACnDhd,EAAE,iBAAiBrQ,UAAYm6B,GAAgB+G,EAAWrE,OAGX,kBAA3CrY,KAAK4Z,gBAAgBlC,IAAap4B,KAA0B,CAC9DuM,EAAE,mBAAmBswB,UAAUt5B,MAAM29B,aAAe,MACpD30B,EAAE,mBAAmBiK,YACnB,GAA2B,yCAE7B,MAAMgwB,EAAYzsC,SAAS4D,cAAc,OACzC6oC,EAAUjjC,MAAMyF,MAAQ,QACxBw9B,EAAU1nC,YAAc,GAAG,GAAwB,IAAf4hB,KAAK4c,cAAqB,GAASrP,MACvE1hB,EAAE,mBAAmBiK,YAAYgwB,EACnC,CACF,MAAOj6B,EAAE,iBAAiBhJ,MAAM2U,QAAU,MAC5C,CF3EMuuB,GACyB,MAAhBtO,GGpBA,WACb,GAAwF,IAApFzX,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS4kB,YAAmB,CACzF,MAAMjB,EAAal5B,EAAE,mBAErBk5B,EAAWjvB,YAAY,GAA2B,uBAElD,MAAMmwB,EAAW5sC,SAAS4D,cAAc,OACxCgpC,EAAS7lB,GAAK,gBACd2kB,EAAWjvB,YAAYmwB,GACvB,MAAMC,ECAK,KADuB9qC,EDCD4kB,KAAKmmB,iBCC/B,CAAEtd,KAAM,SAAUwP,OAAQlC,IAEtB,IAAT/6B,EACK,CAAEytB,KAAM,aAAcwP,OAAQvC,IAE1B,IAAT16B,EACK,CAAEytB,KAAM,SAAUwP,OAAQtC,IAEtB,IAAT36B,EACK,CAAEytB,KAAM,QAASwP,OAAQrC,IAErB,IAAT56B,EACK,CAAEytB,KAAM,cAAewP,OAAQnC,IAEjC,CAAErN,KAAM,qBAAsBwP,OAAQpC,IDd3CgQ,EAAS7nC,YAAc8nC,EAAWrd,KAClCod,EAASzqC,UAAYm6B,GAAgBuQ,EAAW7N,MAClD,MAAOxsB,EAAE,iBAAiBhJ,MAAM2U,QAAU,OCJ7B,IAAuBpc,CDKtC,CHQMgrC,GACyB,MAAhB3O,GKnBA,WACb,MAAM,SAAEtG,GAAanR,KAAKoR,QAAQ,gBAC5BiV,EAAYlV,EAASmV,aAAanV,EAASoV,WAAW7O,KAE5D,GACsF,IAApF1X,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASolB,aACpEH,GAAalV,EAASsV,OACtB,CACA,MAAM1B,EAAal5B,EAAE,mBAGrBk5B,EAAWjvB,YAAY,GAA2B,cAClD,MAAM0kB,EAAOnhC,SAAS4D,cAAc,OACpCu9B,EAAKpa,GAAK,gBACV2kB,EAAWjvB,YAAY0kB,GACvB,MAAMkC,EAAa9B,GACjB2J,GAA4BpT,EAASwT,MAAOxT,EAASsV,OAAQJ,IAM/D,GAJA7L,EAAKp8B,YAAcs+B,EAAW7T,KAC9B2R,EAAKh/B,UAAYm6B,GAAgB+G,EAAWrE,OAGxCgO,GAAalV,EAASwT,MAAO,CAC/BI,EAAWjvB,YAAY,GAA2B,iBAClD,MAAM4wB,EAAUrtC,SAAS4D,cAAc,OACvCypC,EAAQtmB,GAAK,mBACb2kB,EAAWjvB,YAAY4wB,GACvB,MAAMC,EAAgB/L,GACpB2J,GACEphC,KAAK2D,IAAI,EAAGqqB,EAASwT,MAAQ0B,GAC7BlV,EAASsV,OACTtV,EAASwT,QAGb+B,EAAQtoC,YAAcuoC,EAAc9d,KACpC6d,EAAQlrC,UAAYm6B,GAAgBgR,EAActO,MACpD,CAGA,GAAoB,MAAhBX,GAAqB,CACvBqN,EAAWjvB,YAAY,GAA2B,8BAClD,MAAM8wB,EAAUvtC,SAAS4D,cAAc,OACvC2pC,EAAQxmB,GAAK,IACb2kB,EAAWjvB,YAAY8wB,GACvB,MAAMC,EAASxtC,SAAS4D,cAAc,QACtC4pC,EAAOhkC,MAAMyF,MAAQ,UACrBu+B,EAAOzoC,YAAc,GACnB+E,KAAK2D,IAAI3D,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,IAAK,GAClE,GAEF4L,EAAQ9wB,YAAY+wB,GACpB,MAAMC,EAAYztC,SAAS4D,cAAc,QACzC6pC,EAAU1oC,YAAc,MACxBwoC,EAAQ9wB,YAAYgxB,GACpB,MAAMC,EAAO1tC,SAAS4D,cAAc,QACpC8pC,EAAKlkC,MAAMyF,MAAQ,MACnBy+B,EAAK3oC,YAAc,GACjB+E,KAAKyD,IAAIoZ,KAAK4c,QAASz5B,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,IAAM,IACjF,GAEF4L,EAAQ9wB,YAAYixB,EACtB,CAEAl7B,EAAE,iBAAiBiK,YAAYivB,EACjC,MAAOl5B,EAAE,iBAAiBhJ,MAAM2U,QAAU,MAC5C,CL7CMwvB,GACyB,MAAhBvP,GMvBA,WACb,MAAM,SAAEtG,GAAanR,KAAKoR,QAAQ6V,KAClC,GACEjnB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS8lB,cACf,IAArD/V,EAASgW,KAAKzP,GAAY,IAAIA,GAAY,IAAI,GAC9C,CACA,MAAM0P,EACJjW,EAASgW,KAAKzP,GAAY,IAAIA,GAAY,IAAI,GAC9CvG,EAASkW,WAAWlW,EAASgW,KAAKzP,GAAY,IAAIA,GAAY,IAAI,GAAK,GAAG0P,OACtEE,EACJnW,EAASkW,WAAWlW,EAASgW,KAAKzP,GAAY,IAAIA,GAAY,IAAI,GAAK,GAAGp4B,KAC5EuM,EAAE,mBAAmBiK,YAAY,GAA2B,+BAC5D,MAAM+wB,EAASxtC,SAAS4D,cAAc,OACtC4pC,EAAOzmB,GAAK,uBACZvU,EAAE,mBAAmBiK,YAAY+wB,GACf,cAAdS,GAA2C,oBAAdA,EAC/Bz7B,EAAE,wBAAwBzN,YAAc,GACtCgpC,EAAS,GAASjkC,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,IAAM,SACxE,GAA0B,GAAjBhb,KAAKgb,UAAiB,KACd,cAAdsM,EACTz7B,EAAE,wBAAwBzN,YAAc,GACtCgpC,EAAS,GAASjkC,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,KAAO,SACzE,GAA0B,GAAjBhb,KAAKgb,UAAiB,MACd,cAAdsM,EACTz7B,EAAE,wBAAwBzN,YAAc,GACtCgpC,EAAS,GAASjkC,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,KAAO,SACzE,GAA0B,GAAjBhb,KAAKgb,UAAiB,MACd,cAAdsM,EACTz7B,EAAE,wBAAwBzN,YAAc,GACtCgpC,EAAS,GAASjkC,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,MAAQ,SAC1E,GAA0B,GAAjBhb,KAAKgb,UAAiB,OAChCnvB,EAAE,iBAAiBhJ,MAAM2U,QAAU,MAC5C,MAAO3L,EAAE,iBAAiBhJ,MAAM2U,QAAU,MAC5C,CNTM+vB,GACyB,OAAhB9P,GOzBA,WACb,MAAM,SAAEtG,GAAanR,KAAKoR,QAAQ6V,KAClC,GAAIjnB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS4kB,YAAa,CACnFn6B,EAAE,mBAAmBiK,YAAY,GAA2B,oCAC5D,IAAI0xB,EAAY,EACZC,EAAS,EACTznB,KAAK5e,KAAK,KAAO4e,KAAK5e,KAAK,MAAKqmC,EAAS,GAC7C,IAAK,IAAI5iC,EAAI,EAAGA,EAAI,EAAGA,IACrB,IAAK,IAAID,EAAI,EAAGA,EAAI,EAAGA,IACrB,GAAIusB,EAASgW,KAAKtiC,GAAGD,GAAG,IAAM,EAAG,CAC/B,MAAM8iC,EAAOvW,EAASgW,KAAKtiC,GAAGD,GACxBi1B,EAAK1I,EAASkW,WAAWK,EAAK,GAAK,GACnCJ,EAAYzN,EAAGv6B,KAErB,IAAIi9B,GAAQ,EACRkL,GAAU5N,EAAG8N,WAAUpL,GAAQ,GAC/BmL,EAAK,GAAK7N,EAAG+N,aAAYrL,GAAQ,GACjCA,GAAuB,cAAd+K,EACXE,GAAarkC,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,IACvDuB,GAAuB,cAAd+K,GAA4C,oBAAdA,EACjDE,GAAarkC,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,GACxDuB,GAAuB,cAAd+K,EAClBE,GAAarkC,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,IACxDuB,GAAuB,cAAd+K,IAClBE,GAAarkC,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,KAErE,CAGJnvB,EAAE,mBAAmBiK,YAAYzc,SAASwf,eAAe,GAAS2uB,IACpE,MAAO37B,EAAE,iBAAiBhJ,MAAM2U,QAAU,MAC5C,CPLMqwB,GACyB,OAAhBpQ,GQ1BA,WACb5rB,EAAE,WAAW6L,UAAY,GACzB7L,EAAE,WAAWiK,YAAY,GAA2B,YAEpD,MAAMgyB,EAAiBzuC,SAAS4D,cAAc,OAC9C6qC,EAAe1nB,GAAK,mBACA,iBAAhBsX,GACFoQ,EAAe1pC,YAAc,GAASyvB,IACb,eAAhB6J,KACToQ,EAAe1pC,YAAc,GAAS0vB,GAAsB,KAG9DjiB,EAAE,WAAWiK,YAAYgyB,EAC3B,CRcMC,IACyB,QAAhBtQ,IAA0C,QAAhBA,KAA6C,IAApBC,GAAY,KS3B/D,WACb,GAA4F,IAAxF1X,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS4mB,gBAAuB,CAC7F,MAAMjD,EAAal5B,EAAE,mBACrB,IAAIo8B,EACuBA,EAAP,QAAhBxQ,GAA+BC,GAAY,GAClCA,GAGbqN,EAAWjvB,YAAY,GAA2B,0BAClD,MAAMoyB,EAAO7uC,SAAS4D,cAAc,OAEpC,GADAirC,EAAK9nB,GAAK,6BACkB,IAAxBwP,GAAUqY,GAAO,GAAU,CAC7BC,EAAK9pC,YAAc,GAASwxB,GAAUqY,GAAO,IAC7C,MAAM/C,EAAW/hC,KAAKC,MAAOwsB,GAAUqY,GAAO,GAAKjoB,KAAKgb,UAAa,KACjEhG,OAAOC,SAASiQ,IAA0B,IAAbA,EAC/BgD,EAAK9pC,aAAe,KAAK8mC,EAAW,kBAEpCgD,EAAK9pC,aAAe,OAClB4hB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgU,eAChE,IACA,mBAGV,MAAO8S,EAAK9pC,YAAc,mBAC1B2mC,EAAWjvB,YAAYoyB,GAEvBnD,EAAWjvB,YAAY,GAA2B,0BAClD,MAAMqyB,EAAO9uC,SAAS4D,cAAc,OAEpC,GADAkrC,EAAK/nB,GAAK,6BACkB,IAAxBwP,GAAUqY,GAAO,GAAU,CAC7BE,EAAK/pC,YAAc,GAASwxB,GAAUqY,GAAO,IAC7C,MAAM/C,EAAW/hC,KAAKC,MAAOwsB,GAAUqY,GAAO,GAAKjoB,KAAKgb,UAAa,KACjEhG,OAAOC,SAASiQ,IAA0B,IAAbA,EAC/BiD,EAAK/pC,aAAe,KAAK8mC,EAAW,kBAEpCiD,EAAK/pC,aAAe,OAClB4hB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgU,eAChE,IACA,mBAGV,MAAO+S,EAAK/pC,YAAc,mBAC1B2mC,EAAWjvB,YAAYqyB,GAEvBpD,EAAWjvB,YAAY,GAA2B,0BAClD,MAAMsyB,EAAO/uC,SAAS4D,cAAc,OAEpC,GADAmrC,EAAKhoB,GAAK,6BACkB,IAAxBwP,GAAUqY,GAAO,GAAU,CAC7BG,EAAKhqC,YAAc,GAASwxB,GAAUqY,GAAO,IAC7C,MAAM/C,EAAW/hC,KAAKC,MAAOwsB,GAAUqY,GAAO,GAAKjoB,KAAKgb,UAAa,KACjEhG,OAAOC,SAASiQ,IAA0B,IAAbA,EAC/BkD,EAAKhqC,aAAe,KAAK8mC,EAAW,kBAEpCkD,EAAKhqC,aAAe,OAClB4hB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgU,eAChE,IACA,mBAGV,MAAOgT,EAAKhqC,YAAc,mBAC1B2mC,EAAWjvB,YAAYsyB,GAEvBv8B,EAAE,iBAAiBiK,YAAYivB,EACjC,MAAOl5B,EAAE,iBAAiBhJ,MAAM2U,QAAU,MAC5C,CTpCM6wB,GUzBS,WACb,GAAoB,MAAhB5Q,IAAuC,MAAhBA,GAAqB,CACgB,OAA1Dp+B,SAASkrB,eAAe,gCAC1B1Y,EAAE,iBAAiBiK,YtB+BlB,WACL,MAAMwyB,EAAcjvC,SAAS4D,cAAc,OAC3CqrC,EAAYzlC,MAAM8H,SAAW,WAC7B29B,EAAYzlC,MAAM2U,QAAU,QAC5B8wB,EAAYzlC,MAAMmC,KAAO,OACzBsjC,EAAYzlC,MAAMwV,OAAS,OAC3BiwB,EAAYloB,GAAK,6BAEjB,MAAMmoB,EAAS,SAAUC,EAAOnQ,EAAQoQ,EAAgBC,EAAeC,GACrE,MAAM10B,EAAM5a,SAAS4D,cAAc,OACnCgX,EAAImM,GAAKooB,EACTv0B,EAAIpR,MAAM2U,QAAU,OACpBvD,EAAIpR,MAAM+lC,WAAa,wBACvB30B,EAAIzY,UnBlDuB,WmBkDO68B,EAClCpkB,EAAIpR,MAAMqK,QAAU,MACpB+G,EAAIpR,MAAMqB,WAAa,8BACvB,MAAM2kC,EAAWxvC,SAAS4D,cAAc,OACxCgX,EAAI6B,YAAY+yB,GAChB,MAAMC,EAAYzvC,SAAS4D,cAAc,QACzC6rC,EAAUttC,UAAYm6B,GAAgB0C,EACtCyQ,EAAUjmC,MAAMw9B,WAAa,OAC7ByI,EAAU1qC,YAAcqqC,EACxBI,EAAS/yB,YAAYgzB,GACrBD,EAAS/yB,YAAYzc,SAASwf,eAAe6vB,IAC7C,MAAMK,EAAa1vC,SAAS4D,cAAc,OAC1CgX,EAAI6B,YAAYizB,GAChB,MAAMC,EAAc3vC,SAAS4D,cAAc,QAI3C,OAHA+rC,EAAY5oB,GAAKuoB,EACjBI,EAAWjzB,YAAYzc,SAASwf,eAAe,cAC/CkwB,EAAWjzB,YAAYkzB,GAChB/0B,CACT,EA8DA,OA5DAq0B,EAAYxyB,YACVyyB,EACE,yBACAtS,GACA,YACA,uFACA,+BAGJqS,EAAY1qC,WAAWiF,MAAM29B,aAAe,MAC5C8H,EAAYxyB,YACVyyB,EACE,+BACAxS,GACA,YACA,gGACA,qCAGJuS,EAAYnM,UAAUt5B,MAAM29B,aAAe,MAC3C8H,EAAYxyB,YACVyyB,EACE,2BACArS,GACA,YACA,oGACA,iCAGJoS,EAAYnM,UAAUt5B,MAAM29B,aAAe,MAC3C8H,EAAYxyB,YACVyyB,EACE,iCACArS,GACA,YACA,6GACA,uCAGJoS,EAAYnM,UAAUt5B,MAAM29B,aAAe,MAC3C8H,EAAYxyB,YACVyyB,EACE,2BACArS,GACA,YACA,qJACA,iCAGJoS,EAAYnM,UAAUt5B,MAAM29B,aAAe,MAC3C8H,EAAYxyB,YACVyyB,EACE,wBACAtS,GACA,YACA,2EAA2EjW,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6nB,8BAC/I,8BAIGX,CACT,CsB7HqC,IAC/B1D,MAGsF,IAApF5kB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASyjB,YACtEh5B,EAAE,8BAA8BhJ,MAAM2a,MAAQ,MAC3C3R,EAAE,8BAA8BhJ,MAAMoC,IAAM,GAAG4G,EAAE,WAAWvG,iBAEjEuG,EAAE,8BAA8BhJ,MAAMgG,MAAWgD,EAAE,WAAWxG,YAAc,EAA9B,KAE9C,MAAM8sB,EAASnS,KAAK4c,QAAUzB,KAAuB5D,GAC/C2R,EAAkBlpB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAChF+nB,YACC3R,GACA,EACJ,IAAI4R,EAAa9c,GACjB,GAAwF,IAApFtM,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS+nB,YAAmB,CACzF,IAAIE,EAAc7R,GAClB6R,GAAevI,KACfsI,GAA6B,GAAdC,EAAmB,GAAM,GAC1C,CAWA,GAT0F,IAAtFrpB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkoB,eAClEnX,EAASiX,IAA+B,MAAhB3R,IAAwC,IAAjBzX,KAAKkY,UACtDrsB,EAAE,0BAA0BhJ,MAAM2U,QAAU,GAC5C3L,EAAE,8BAA8BzN,YAAc,GAAG,GAC/CgrC,EAAajX,OACToI,IAAY6O,EAAajX,IAAW0I,KAAWqO,QAElDr9B,EAAE,0BAA0BhJ,MAAM2U,QAAU,OAG2C,IAA5FwI,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmoB,oBACpE,CACA,MAAMC,EAAgC,EAAbJ,EACrBjX,EAASqX,IAAqC,MAAhB/R,IAAwC,IAAjBzX,KAAKkY,UAC5DrsB,EAAE,gCAAgChJ,MAAM2U,QAAU,GAClD3L,EAAE,oCAAoCzN,YAAc,GAAG,GACrDorC,EAAmBrX,OACfoI,IAAYiP,EAAmBrX,IAAW0I,KAAWqO,QACtDr9B,EAAE,gCAAgChJ,MAAM2U,QAAU,MAC3D,MAAO3L,EAAE,gCAAgChJ,MAAM2U,QAAU,OAEzD,GAA4F,IAAxFwI,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASqoB,gBAAuB,CAC7F,MAAMC,EAA4B,EAAbN,EACjBjX,EAASuX,IAAiC,MAAhBjS,IAAwC,IAAjBzX,KAAKkY,UACxDrsB,EAAE,4BAA4BhJ,MAAM2U,QAAU,GAC9C3L,EAAE,gCAAgCzN,YAAc,GAAG,GACjDsrC,EAAevX,OACXoI,IAAYmP,EAAevX,IAAW0I,KAAWqO,QAClDr9B,EAAE,4BAA4BhJ,MAAM2U,QAAU,MACvD,MAAO3L,EAAE,4BAA4BhJ,MAAM2U,QAAU,OAErD,GAEE,IADAwI,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASuoB,sBAEpE,CACA,MAAMC,EAAkC,EAAbR,EAAiB,EACxCjX,EAASyX,IAAuC,MAAhBnS,IAAwC,IAAjBzX,KAAKkY,UAC9DrsB,EAAE,kCAAkChJ,MAAM2U,QAAU,GACpD3L,EAAE,sCAAsCzN,YAAc,GAAG,GACvDwrC,EAAqBzX,OACjBoI,IAAYqP,EAAqBzX,IAAW0I,KAAWqO,QACxDr9B,EAAE,kCAAkChJ,MAAM2U,QAAU,MAC7D,MAAO3L,EAAE,kCAAkChJ,MAAM2U,QAAU,OAG+B,IAAxFwI,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASyoB,iBACpE7pB,KAAKoR,QAAQ,gBAAgBS,gBAEzB/E,IAAgBqF,EAASrF,KAAiC,MAAhB2K,IAAwC,IAAjBzX,KAAKkY,UACxErsB,EAAE,4BAA4BhJ,MAAM2U,QAAU,GAC9C3L,EAAE,gCAAgCzN,YAAc,GAAG,GACjD0uB,GAAeqF,OACXoI,IAAYzN,GAAeqF,IAAW0I,KAAWqO,QAEpDr9B,EAAE,4BAA4BhJ,MAAM2U,QAAU,OAEjDwI,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6nB,aAAe,GAEnF9W,EACEnS,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6nB,aAClEpO,OACa,MAAhBpD,IAAwC,IAAjBzX,KAAKkY,UAE7BrsB,EAAE,yBAAyBhJ,MAAM2U,QAAU,GAE3C3L,EACE,yBACA0U,SAAS,GAAGniB,YAAc,2EAA2E4hB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6nB,8BAC3Kp9B,EAAE,6BAA6BzN,YAAc,GAAG,GAC9C4hB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6nB,aAClEpO,KACA1I,OACEoI,IACHva,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6nB,aACnEpO,KACA1I,IACC0I,KAAWqO,QAGbr9B,EAAE,yBAAyBhJ,MAAM2U,QAAU,MACpD,MAA+C,OAApC3L,EAAE,+BACXA,EAAE,8BAA8B3J,QAEpC,CVjFI4nC,EACF,MAAkC,OAAvBj+B,EAAE,kBAE6B,OAApCA,EAAE,+BACJA,EAAE,8BAA8B3J,QAGtC,CWjCe,SAAS6nC,KAEtB,GACE/pB,KAAKgqB,MAAMC,UACXjqB,KAAKkqB,MAAQ,IAAO,GACJ,UAAhBlqB,KAAKwD,QACLxD,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS+oB,MACpE,CACA,MAAMvO,EAAQviC,SAASkrB,eAAe,wBAClCqX,IACFA,EAAMhV,UAAY5G,KAAKoqB,QAAmB,GAAXpqB,KAAKwB,IAAYxB,KAAKqqB,GAAgB,GAAXrqB,KAAKwB,KAAY,GAE/E,CAGAwW,KACAmB,KACAN,KCwBK,WACL,GAAqF,IAAjF7Y,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS8b,SAAgB,CAEtF,MAAMoN,EAAiBz+B,EAAE,cAAcxG,YAAc,IAE/CklC,EAAiB1+B,EAAE,cAAcxG,YAAc,IACrD,IAAImlC,EAAiB,EAErB,GACExqB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASqpB,kBACpEzqB,KAAKgqB,MAAMC,SACX,CACA,MAAMS,GACQ,GAAX1qB,KAAKwB,KAAYxB,KAAK2qB,SAAW,EAAI3qB,KAAKqqB,GAAgB,GAAXrqB,KAAKwB,OAAcxB,KAAKwB,IAC1E3V,EAAE,sBAAsBhJ,MAAM2U,QAAU,GACxC3L,EAAE,yBAAyBhJ,MAAMgG,MAAQ,GAAG1F,KAAKC,MAC9CsnC,GACEH,EAAqE,EAApDpnC,KAAKiL,KAAKs8B,GAAsBrnC,WAAWrI,QAC7D,QAGFglB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwpB,iBAAmB,EAEvF/+B,EAAE,yBAAyBzN,YAAc+E,KAAKiL,KAAKs8B,GAC9C7+B,EAAE,yBAAyBzN,YAAc,GAChDyN,EAAE,0BAA0BzN,YAAc+E,KAAKiL,KAAKs8B,GACpDF,GAAkB,CACpB,MAAO3+B,EAAE,sBAAsBhJ,MAAM2U,QAAU,OAG/C,GAAyC,IAArCwI,KAAKwiB,aAAaC,OAAOoI,SAAkB7qB,KAAK8qB,IAAI,uBA+CjDj/B,EAAE,gBAAgBhJ,MAAM2U,QAAU,WA/CuC,CAC9E3L,EAAE,gBAAgBhJ,MAAM2U,QAAU,GAClC3L,EAAE,sBAAsBhJ,MAAMgG,MAAQ,GAAG1F,KAAKC,MAC3CD,KAAK2D,IAAI,EAAGkZ,KAAKwiB,aAAaC,OAAOsI,QAAU/qB,KAAKwiB,aAAaC,OAAOjI,MACvE8P,EACAtqB,KAAKwiB,aAAaC,OAAOuI,aAEzBhrB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwpB,iBAAmB,EACzF/+B,EAAE,sBAAsBzN,YAAc+E,KAAKiL,MACxC4R,KAAKwiB,aAAaC,OAAOsI,QAAU/qB,KAAKwiB,aAAaC,OAAOjI,MAAQxa,KAAKwB,KAEzE3V,EAAE,sBAAsBzN,YAAc,GACvC4hB,KAAKwiB,aAAaC,OAAOsI,UAAY/qB,KAAKwiB,aAAaC,OAAOuI,SAChEn/B,EAAE,sBAAsBhJ,MAAM64B,qBAAuB,OACrD7vB,EAAE,sBAAsBhJ,MAAM84B,wBAA0B,SAExD9vB,EAAE,sBAAsBhJ,MAAM64B,qBAAuB,GACrD7vB,EAAE,sBAAsBhJ,MAAM84B,wBAA0B,IAE1D9vB,EAAE,mBAAmBhJ,MAAMgG,MAAQ,GAAG1F,KAAKC,MACxCD,KAAKyD,IACJoZ,KAAKwiB,aAAaC,OAAOuI,QAAUhrB,KAAKwiB,aAAaC,OAAOsI,QAC5D/qB,KAAKwiB,aAAaC,OAAOuI,QAAUhrB,KAAKwiB,aAAaC,OAAOjI,MAE5D8P,EACAtqB,KAAKwiB,aAAaC,OAAOuI,aAEzBhrB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwpB,iBAAmB,EACzF/+B,EAAE,mBAAmBzN,YAAc+E,KAAKiL,KACtCjL,KAAKyD,IACHoZ,KAAKwiB,aAAaC,OAAOuI,QAAUhrB,KAAKwiB,aAAaC,OAAOsI,QAC5D/qB,KAAKwiB,aAAaC,OAAOuI,QAAUhrB,KAAKwiB,aAAaC,OAAOjI,MAC1Dxa,KAAKwB,KAER3V,EAAE,mBAAmBzN,YAAc,GACxC,MAAM6sC,EACJ9nC,KAAK2D,IACH,GACCkZ,KAAKwiB,aAAaC,OAAOjI,KAAOxa,KAAKwiB,aAAaC,OAAOsI,UACvD/qB,KAAKwiB,aAAaC,OAAOuI,QAAUhrB,KAAKwiB,aAAaC,OAAOsI,WAC5D,EACPl/B,EAAE,oBAAoBzN,YAAc,GAAG+E,KAAKiL,MACzC4R,KAAKwiB,aAAaC,OAAOuI,QAAUhrB,KAAKwiB,aAAaC,OAAOjI,MAAQxa,KAAKwB,QACvEypB,EAAgB,IAAO,IAAM,KAAKA,EAAc5V,eAAe,KAAM,CACxExyB,MAAO,cAET2nC,GAAkB,CACpB,CAGA,GAAoB,cAAhBxqB,KAAKkrB,QAAiE,IAAvClrB,KAAKwiB,aAAa2I,SAASN,QAAe,CAC3Eh/B,EAAE,iBAAiBhJ,MAAM2U,QAAU,GACnC3L,EAAE,uBAAuBhJ,MAAMgG,MAAQ,GAAG1F,KAAKC,MAC5CD,KAAK2D,IAAI,EAAGkZ,KAAKwiB,aAAa2I,SAASJ,QAAU/qB,KAAKwiB,aAAa2I,SAAS3Q,MAC3E8P,EACAtqB,KAAKwiB,aAAa2I,SAASH,aAE3BhrB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwpB,iBAAmB,EACzF/+B,EAAE,uBAAuBzN,YAAc+E,KAAKiL,MACzC4R,KAAKwiB,aAAa2I,SAASJ,QAAU/qB,KAAKwiB,aAAa2I,SAAS3Q,MAAQxa,KAAKwB,KAE7E3V,EAAE,uBAAuBzN,YAAc,GAC5CyN,EAAE,oBAAoBhJ,MAAMgG,MAAQ,GAAG1F,KAAKC,MACzCD,KAAKyD,IACJoZ,KAAKwiB,aAAa2I,SAASH,QAAUhrB,KAAKwiB,aAAa2I,SAASJ,QAChE/qB,KAAKwiB,aAAa2I,SAASH,QAAUhrB,KAAKwiB,aAAa2I,SAAS3Q,MAEhE8P,EACAtqB,KAAKwiB,aAAa2I,SAASH,aAE3BhrB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwpB,iBAAmB,EACzF/+B,EAAE,oBAAoBzN,YAAc+E,KAAKiL,KACvCjL,KAAKyD,IACHoZ,KAAKwiB,aAAa2I,SAASH,QAAUhrB,KAAKwiB,aAAa2I,SAASJ,QAChE/qB,KAAKwiB,aAAa2I,SAASH,QAAUhrB,KAAKwiB,aAAa2I,SAAS3Q,MAC9Dxa,KAAKwB,KAER3V,EAAE,oBAAoBzN,YAAc,GACzC,MAAM6sC,EACJ9nC,KAAK2D,IACH,GACCkZ,KAAKwiB,aAAa2I,SAAS3Q,KAAOxa,KAAKwiB,aAAa2I,SAASJ,UAC3D/qB,KAAKwiB,aAAa2I,SAASH,QAAUhrB,KAAKwiB,aAAa2I,SAASJ,WAChE,EACPl/B,EAAE,qBAAqBzN,YAAc,GAAG+E,KAAKiL,MAC1C4R,KAAKwiB,aAAa2I,SAASH,QAAUhrB,KAAKwiB,aAAa2I,SAAS3Q,MAAQxa,KAAKwB,QAC3EypB,EAAgB,IAAO,IAAM,KAAKA,EAAc5V,eAAe,KAAM,CACxExyB,MAAO,cAET2nC,GAAkB,CACpB,MACE3+B,EAAE,iBAAiBhJ,MAAM2U,QAAU,OAIrC,MAAM4zB,EAAgB,CAAC,EACvBv/B,EAAE,wBAAwB6L,UAAY,GACtCnZ,OAAO6C,KAAK4e,KAAK+gB,OAAO5gB,SAASplB,IAC/B,GAAIilB,KAAK+gB,MAAMhmC,GAAI,CACjB,MAAM6gC,EAAQR,GAAYpb,KAAK+gB,MAAMhmC,GAAGuE,KAAM0gB,KAAK+gB,MAAMhmC,GAAGuE,KAAM,CAChE,CAAE8gB,GAAI,GAAGJ,KAAK+gB,MAAMhmC,GAAGuE,aAEzBs8B,EAAM/4B,MAAM2U,QAAU,GACtB,IAAI6zB,EAAc,GAGhBA,OAD6C,IAApClU,GAAYnX,KAAK+gB,MAAMhmC,GAAGuE,MACrB63B,GAAYnX,KAAK+gB,MAAMhmC,GAAGuE,MACrB42B,GACrB0F,EAAMO,UAAU5b,SAAS,GAAG/kB,UAAYo6B,GAAgByV,EACxDzP,EAAMO,UAAU5b,SAAS,GAAG1d,MAAMyF,MAAQ,QAEgD,IAAxF0X,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwpB,gBAEpEhP,EAAMO,UAAU5b,SAAS,GAAGniB,YAAc,GAAG+E,KAAKC,MACzC4c,KAAK+gB,MAAMhmC,GAAGy/B,KAAOxa,KAAK+gB,MAAMhmC,GAAGiwC,QAA1C,QAECpP,EAAMO,UAAU5b,SAAS,GAAGniB,YAAc,GAC/Cw9B,EAAMO,UAAU5b,SAAS,GAAG1d,MAAMgG,MAAQ,GAAG1F,KAAKC,MAC/C4c,KAAK+gB,MAAMhmC,GAAGy/B,MACZ+P,EAA8E,EAA7DpnC,KAAKiL,KAAK4R,KAAK+gB,MAAMhmC,GAAGy/B,KAAOxa,KAAKwB,KAAKne,WAAWrI,QACtEglB,KAAK+gB,MAAMhmC,GAAGiwC,aAElBpP,EAAMO,UAAU5b,SAAS,GAAGniB,YAAc+E,KAAKiL,KAAK4R,KAAK+gB,MAAMhmC,GAAGy/B,KAAOxa,KAAKwB,KAC9EgpB,GAAkB,EAClBY,EAAcprB,KAAK+gB,MAAMhmC,GAAGuE,MAAQs8B,CACtC,KAEFr9B,OAAO6C,KAAKgqC,GAAejrB,SAASplB,IAClC8Q,EAAE,wBAAwBiK,YAAYs1B,EAAcrwC,GAAG,IAGlC,IAAnByvC,IACF3+B,EAAE,cAAchJ,MAAMiG,OAA6B,GAAjB0hC,EAAsB,EAAzB,MAE7B3S,KAAuB2S,IACzB3S,GAAqB2S,EACrBvN,KAEJ,CACF,CD9LEqO,GAGAjP,KAGAyI,KE3BK,WACL,GACuF,IAArF9kB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmqB,cAC5C,IAAxB7U,GACA,CAEA,IAAI8U,GAAiB,EACrBjtC,OAAO6C,KAAK4e,KAAKkb,WAAW/a,SAASplB,IACnC,MAAM8+B,EAAK7Z,KAAKkb,UAAUngC,GAC1B,GAAI8+B,EAAG4R,MAAQ,GAAK5R,EAAG6R,UAErB,GADAF,GAAiB,EACoB,IAAjC5U,GAA0B77B,SAA6CI,IAAjCy7B,GAA0B77B,GAAkB,CACpF,MAAM4wC,EAActyC,SAAS4D,cAAc,OACrC2uC,EAAWvyC,SAAS4D,cAAc,OACxC2uC,EAAS/oC,MAAMgpC,SAAW,QAC1BD,EAAS/oC,MAAM29B,aAAe,MAC9B,MAAMja,EAAMltB,SAAS4D,cAAc,OACnCspB,EAAI1jB,MAAM6V,UAAY,SACtB6N,EAAInG,GAAK,oBACTwrB,EAAS91B,YAAYyQ,GACrBolB,EAAY71B,YAAY81B,GACxB5rB,KAAKiH,QAAQhV,KAAKxY,KAAM4oB,OAAOspB,EAAYj0B,YAC3Cif,GAAkB57B,EAClB67B,GAA0B77B,GAAK,CACjC,OAEA67B,GAA0B77B,GAAK,CACjC,IAEGywC,GACHxrB,KAAKiH,QAAQxV,MAEjB,CACF,CFHEq6B,GEUK,WACL,GACuF,IAArF9rB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmqB,cACzC,OAA3B1/B,EAAE,qBACF,CACA,IAAI,OAAEkgC,GAAW/rB,KAAKkb,UAAUvE,IAC5BqV,EAAS,IAKb,GAJIhsB,KAAK8qB,IAAI,6BAA4BkB,GAAU,MACN,IAAzChsB,KAAKkb,UAAUvE,IAAiBv7B,OAAY4wC,GAAU,GAC1DD,GAAUC,EACNhsB,KAAK8qB,IAAI,mBAAkBiB,GAAU,MACrClc,GAAWqB,OAAOW,eAAgB,CACpC,MAAMC,EAAS9R,KAAKiR,OAAO,SACZ,IAAXa,EAAcia,GAAU,KACR,IAAXja,EAAcia,GAAU,IACb,IAAXja,IAAcia,GAAU,KACnC,CACAlgC,EAAE,qBAAqBzN,YAAc,GAAS2tC,EAChD,CACF,CF5BEE,GGtCEjsB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS8qB,SACpD,UAAhBlsB,KAAKwD,SACJxD,KAAKkqB,MAAQ,IAAiB,EAAXlqB,KAAKwB,MAAa,IACrCxB,KAAKkqB,MAAQ,GAAKlqB,KAAKwB,KAAQ,GAEhCxB,KAAKiE,aHuCPyF,GACF,CIjDe,SAASyiB,KAEtBriB,EAA8BsiB,UAAUpsB,KAAKqsB,iBAC/C,CCYO,MAAMC,GACX3sB,YAAY4sB,GACV9yC,KAAK8yC,UAAYA,EACjB9yC,KAAK+yC,MAAQ,EACf,CAEAJ,UAAUK,GACJhzC,KAAK+yC,MAAM3vC,KAAK4vC,GAAYhzC,KAAK8yC,WACnC9yC,KAAK+yC,MAAM9tB,OAEf,CAOAguB,YAAYC,GACV,IAAInS,EAAOmS,EACPnS,EAAO/gC,KAAK8yC,YAAW/R,EAAO/gC,KAAK8yC,WACnC/R,EAAO/gC,KAAK+yC,MAAMxxC,SAAQw/B,EAAO/gC,KAAK+yC,MAAMxxC,QAChD,IAAIqM,EAAM,EACV,IAAK,IAAItM,EAAItB,KAAK+yC,MAAMxxC,OAAS,EAAGD,GAAK,GAAKA,EAAItB,KAAK+yC,MAAMxxC,OAAS,EAAIw/B,EAAMz/B,IAC9EsM,GAAO5N,KAAK+yC,MAAMzxC,GAEpB,OAAY,IAARsM,EACK,EAEFA,EAAMmzB,CACf,CAEAoS,QAAQD,GACN,IAAInS,EAAOmS,EAGX,OAFInS,EAAO/gC,KAAK8yC,YAAW/R,EAAO/gC,KAAK8yC,WACnC/R,EAAO/gC,KAAK+yC,MAAMxxC,SAAQw/B,EAAO/gC,KAAK+yC,MAAMxxC,QACnC,IAATw/B,EAAmB,EAChB/gC,KAAK+yC,MAAMzuB,OAAOyc,GAAMqS,QAAO,CAACppC,EAAGP,IAAMO,EAAIP,GAAG,EACzD,EChDa,SAAS4pC,GAAaC,GAC7B,UAAWvzC,OAAOwzC,oBACtBxzC,OAAOwzC,kBAAkBC,MAAQ,CAAC,GAGpC1uC,OAAO6C,KAAK2rC,GAAQ5sB,SAAS7gB,IAC3B,MAAM4tC,EAAa5tC,EAAKkC,QAAQ,SAAU,SAEd,IAAjBurC,EAAOztC,GAChB9F,OAAOwzC,kBAAkBC,MAAMC,QAAc/xC,EAG7C3B,OAAOwzC,kBAAkBC,MAAMC,GAAc9wC,KAAKC,MAAMD,KAAKulB,UAAUorB,EAAOztC,IAChF,GAEJ,CCce,SAAS6tC,KACtB,MAAMC,EAAWjqC,KAAKgE,MAAMmtB,KAAKC,MAAQ,KAEzC,GAAKvU,KAAKqqB,EAAIrqB,KAAKwB,IAAO,GAAM,EAAG,CACjC,IAAI6rB,EAAcrtB,KAAK4c,QAAUjN,GAC7B3P,KAAKib,UAAY,IAAGoS,GAAezf,IACvCsB,GAAyB/rB,KAAK2D,IAAIkZ,KAAKstB,cAAeD,GACtDA,GAAe,IAGf,MAAME,EAAWH,EAAW/iB,EACtBmjB,EAAcrqC,KAAK2D,IAAI,EAAGkZ,KAAK4c,QAAUtS,GAAoBijB,EAC7DE,EAAetqC,KAAK2D,IAAI,EAAG8mB,GAAsBrD,GAAyBgjB,EAC1EG,EACJvqC,KAAK2D,IAAI,EAAGgnB,GAAsB,GAAKtD,GAAgC+iB,EACnEI,EAAgBxqC,KAAK2D,IAAI,EAAGumC,EAAc9f,IAAmBggB,EAC7DK,GAAiB5tB,KAAK6tB,aAAepjB,GAAmB8iB,EAC9D,IAAK,IAAIxyC,EAAI,EAAGA,EAAIwyC,EAAUxyC,IAC5BgvB,EAAYqiB,UAAUoB,GACtBxjB,EAAUoiB,UAAUqB,GACpBxjB,EAAiBmiB,UAAUsB,GAC3BxjB,EAAWkiB,UAAUuB,GACrBxjB,EAAWiiB,UAAUwB,GAIvBvjB,EAAoB+iB,EACpB9iB,EAAmBtK,KAAK4c,QACxBrS,EAAwBqD,GACxBpD,EAA+BsD,GAAsB,GACrDP,GAAkB8f,EAClB5iB,EAAkBzK,KAAK6tB,aAGvB,MAAMC,EACJ7W,GAAYjX,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2sB,YAClFrjB,EAAuBX,EAAY2iB,YAAYoB,GAC/CnjB,EAAwBX,EAAU0iB,YAAYoB,GAC9CljB,EAA+BX,EAAiByiB,YAAYoB,GAC5DjjB,EAAyBX,EAAWwiB,YAAYoB,GAChDhjB,EAAkBJ,EACoE,IAAlF1K,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,YACtEjQ,GAAmBH,GACiE,IAAlF3K,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,YACtEjQ,GAAmBF,GAErB,MAAMojB,EAAShuB,KAAKiuB,YAAY,mBAAqBjuB,KAAK8qB,IAAI,iBAM5D3b,GAHA6e,GACkF,IAAlFhuB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,UAGlErQ,EAAuBC,GAAyBqjB,EAASnjB,EAAyB,GACvDC,EAG/BoD,GAAqB/D,EAAWuiB,YAC9BxV,GAAWlX,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS8sB,eAEnF,CAEApB,GAAa,CACX5d,uBAAsB,GACtB7E,kBAAiB,EACjBC,iBAAgB,EAChBC,sBAAqB,EACrBC,6BAA4B,EAC5B+C,gBAAe,GACf9C,gBAAe,EACfC,qBAAoB,EACpBC,sBAAqB,EACrBC,6BAA4B,EAC5BC,uBAAsB,EACtBC,gBAAe,EACfqE,sBAAqB,GACrBjB,mBAAkB,IAEtB,CCxGe,SAASigB,GAAiBnc,EAAOC,EAAW/nB,EAAOgoB,EAAMgT,GACtE,IAAIkJ,EAAe,EACnB,IAAK,IAAIrzC,EAAIoI,KAAK2D,IAAI,EAAGoD,GAAQnP,EAAIoI,KAAK2D,IAAI,EAAGoD,EAAQg7B,GAAWnqC,IAClEqzC,GAAgBpuB,KAAK0S,eAAiBvvB,KAAK2D,IAAI,EAAG/L,EAAIm3B,GAExD,IAAIT,EAAQQ,EAAYmc,EAExB,OADA3c,EAAQzR,KAAK2S,oBAAoB3S,KAAKoR,QAAQY,GAAQP,GAC/CtuB,KAAKiL,KAAKqjB,EACnB,CCEA,SAAS4c,GAAYjuC,EAAQ+xB,GAC3B5zB,OAAO6C,KAAKhB,GAAQ+f,SAASplB,IAC3B,GACEilB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASktB,eACzD,IAAXnc,EAEA/xB,EAAOrF,GAAGs9B,OAASlC,OAJrB,CAQA/1B,EAAOrF,GAAGs9B,OAASsI,GACjBvgC,EAAOrF,GACPozC,GACEpzC,EACAilB,KAAKoR,QAAQr2B,GAAGk3B,UAChBjS,KAAKoR,QAAQr2B,GAAGo3B,OAChBnS,KAAKoR,QAAQr2B,GAAGm3B,KAChBC,IAIJ,IACE,IAAI4H,EAAI,EACRA,EAAI/Z,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmtB,aACxExU,IAEI35B,EAAOrF,GAAGgR,KAAO0jB,GAAasK,GAAG,KAAI35B,EAAOrF,GAAGs9B,OAASlC,GAlB9D,CAmBA,GAEJ,CAEA,SAASqY,GAAQpuC,EAAQ+xB,GACvB5zB,OAAO6C,KAAKhB,GAAQ+f,SAASplB,IAC3B,MAAM02B,EAAQ0c,GACZpzC,EACAilB,KAAKoR,QAAQr2B,GAAGk3B,UAChBjS,KAAKoR,QAAQr2B,GAAGo3B,OAChBnS,KAAKoR,QAAQr2B,GAAGm3B,KAChBC,GAEEnS,KAAKgb,UACP56B,EAAOrF,GAAGgR,GACR5I,KAAK2D,IAAI2qB,GAASzR,KAAK4c,QAAUzB,MAAuB,GAAKnb,KAAKgb,UAClEvJ,EAAQrxB,EAAOrF,GAAGihC,MACf57B,EAAOrF,GAAGgR,GAAK0lB,EAAQrxB,EAAOrF,GAAGihC,MAGpChc,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASktB,eACzD,IAAXnc,GAGF1C,GAAa5yB,KAAK,CAACuD,EAAOrF,GAAGgR,GAAIomB,EAAQV,GAAO,GAEtD,CC7De,SAAS,MDmET,WACblC,GAAasF,IACbpF,GAAe,QAGb,IADOzP,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmtB,eAG3EvuB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmtB,aAAe,GAGrFC,GAAQhhB,GAAe,GACvBghB,GAAQ/gB,GAAgB,IACxB+gB,GAAQ9gB,GAAiB,KAGzB+B,GAAa+I,MAAK,CAAC/0B,EAAGP,IAAMO,EAAE,GAAKP,EAAE,KACrC,IAAIurC,EAAazuB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmtB,aACrF,GAAIvuB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASyf,sBACtE,KAAOpR,GAAagf,GAAY,GAAKzuB,KAAK4c,UACxC6R,GAAc,EACVhf,GAAaz0B,SAAWyzC,EAAa,KAK7Clf,GAAaE,GAAagf,GAAY,GACtCjf,GAAiBC,GAAagf,GAAY,GAE1CJ,GAAY7gB,GAAe,GAC3B6gB,GAAY5gB,GAAgB,IAC5B4gB,GAAY3gB,GAAiB,KAE7Bof,GAAa,CAAEvd,WAAU,kBAAgB,gBAAc,IACzD,CCnGEmf,GCHAnwC,OAAO6C,KAAK6sB,IAAe9N,SAASplB,IAC9BilB,KAAKgb,UACP/M,GAAclzB,GAAGgR,GACf5I,KAAK2D,IAAIkZ,KAAKuf,SAASxkC,GAAG4qC,YAAc3lB,KAAK4c,QAAUzB,MAAuB,GAC5Enb,KAAKgb,UACPhb,KAAKuf,SAASxkC,GAAG4qC,WAAa1X,GAAclzB,GAAGihC,MAC5C/N,GAAclzB,GAAGgR,GAAKiU,KAAKuf,SAASxkC,GAAG4qC,WAAa1X,GAAclzB,GAAGihC,MACxEhH,OAAOvZ,MAAMwS,GAAclzB,GAAGgR,MAAKkiB,GAAclzB,GAAGgR,GAAK8oB,KAE7D5G,GAAclzB,GAAGs9B,OAASsI,GAAW1S,GAAclzB,GAAIilB,KAAKuf,SAASxkC,GAAG4qC,WAAW,IDJrFnsC,OAAOwzC,kBAAkB2B,SAAWvyC,KAAKC,MAAMD,KAAKulB,UAAU6L,KAC9Dh0B,OAAOwzC,kBAAkB4B,UAAYxyC,KAAKC,MAAMD,KAAKulB,UAAU8L,KAC/Dj0B,OAAOwzC,kBAAkB6B,WAAazyC,KAAKC,MAAMD,KAAKulB,UAAU+L,KAChEl0B,OAAOwzC,kBAAkBzN,SAAW,GACpChhC,OAAOuwC,QAAQ7gB,IAAe9N,SAASplB,IACrCvB,OAAOwzC,kBAAkBzN,SAASxkC,EAAE,IAAMqB,KAAKC,MAAMD,KAAKulB,UAAU5mB,EAAE,IAAI,GAE9E,CE6Fe,SAASg0C,GAAuB3U,GAC7C,GACkC,WAAhCpa,KAAKuf,SAASnF,GAASxJ,MACY,IAAlC5Q,KAAKuf,SAASnF,GAAStJ,QACtB9Q,KAAKuf,SAASnF,GAAS4U,UACS,aAAhChvB,KAAKuf,SAASnF,GAASxJ,KACzB,CACA+O,KACkC,yBAA9B7P,GAAYsK,GAAS96B,KACvBwwB,GAAY,yBAAZ,OAA8C,EACP,uBAA9BA,GAAYsK,GAAS96B,KAC9BwwB,GAAY,uBAAZ,OAA4C,EAE5CA,GAAYsK,GAAStJ,QAAUhB,GAAYsK,GAAStJ,OAAS,GAAK,EAEhE9Q,KAAKivB,qBAAqBjvB,KAAKuf,SAASnF,GAASxJ,QAAOxF,GAAoB,GAEhE,iBAAZgP,GACF/O,IAAc,EACVA,GAAa,GAAG4V,GAAO,aACvB5V,IAAc,GAAG4V,GAAO,kBACP,mBAAZ7G,EACT6G,GAAO,cACc,yBAAZ7G,EACT6G,GAAO,kBACc,iBAAZ7G,GACT6G,GAAO,aAGT,MAAMqD,EAAwBhZ,GAE9B4V,KAEAqC,KAEIe,IAA0BhZ,IAC5B4V,KAGF,MAAMgO,EAnIV,WACE,IAAIntC,EAAM,EACN0uB,GAAO,sBAAqB1uB,GAAO,IACnC0uB,GAAO,qBAAoB1uB,GAAO,GAClC0uB,GAAO,qBAAoB1uB,GAAO,IAClC0uB,GAAO,sBAAqB1uB,GAAO,IACnC0uB,GAAO,yBAAwB1uB,GAAO,IACtC0uB,GAAO,yBAAwB1uB,GAAO,IACtC0uB,GAAO,wBAAuB1uB,GAAO,IACrC0uB,GAAO,wBAAuB1uB,GAAO,IACrC0uB,GAAO,uBAAsB1uB,GAAO,IACpC0uB,GAAO,uBAAsB1uB,GAAO,IACpC0uB,GAAO,uBAAsB1uB,GAAO,IACpC0uB,GAAO,yBAAwB1uB,GAAO,IACtC0uB,GAAO,wBAAuB1uB,GAAO,IACzC,IAAI0yB,EAAM,EACVl2B,OAAO6C,KAAKyuB,IAAY1P,SAASplB,IAC/B05B,GAAO5E,GAAW90B,GAAGo3B,MAAM,IAE7BsC,GAAO5E,GAAWiU,OAAO3R,OACzBpwB,GAAO0yB,EAGHhE,GAAO,mBAAkB1uB,GAAsB,IAAfiqB,IAChCyE,GAAO,gBAAe1uB,GAAsB,IAAfiqB,IAC7ByE,GAAO,oBAAmB1uB,GAAsB,IAAfiqB,IACjCyE,GAAO,sBAAqB1uB,GAAsB,IAAfiqB,IACnCyE,GAAO,uBAAsB1uB,GAAsB,IAAfiqB,IACpCyE,GAAO,mBAAkB1uB,GAAsB,IAAfiqB,IAChCyE,GAAO,qBAAoB1uB,GAAsB,IAAfiqB,IAClCyE,GAAO,sBAAqB1uB,GAAsB,IAAfiqB,IACnCyE,GAAO,sBAAqB1uB,GAAsB,IAAfiqB,IACnCyE,GAAO,qBAAoB1uB,GAAsB,IAAfiqB,IAClCyE,GAAO,yBAAwB1uB,GAAsB,IAAfiqB,IACtCyE,GAAO,sBAAqB1uB,GAAsB,IAAfiqB,IACnCyE,GAAO,sBAAqB1uB,GAAsB,IAAfiqB,IACnCyE,GAAO,qBAAoB1uB,GAAsB,IAAfiqB,IAClCyE,GAAO,qBAAoB1uB,GAAsB,IAAfiqB,IAElCyE,GAAO,kBAAiB1uB,GAAsB,IAAfiqB,IAEnC,IAAI6R,EAAO,EAWX,GAVIpN,GAAO,qBAAoBoN,GAAQ,KACnCpN,GAAO,gBAAeoN,GAAQ,KAC9BpN,GAAO,iBAAgBoN,GAAQ,KAC/BpN,GAAO,iBAAgBoN,GAAQ,MAE/BpN,GAAO,iBACToN,GAAQ,EAAI,IAAO16B,KAAKyD,IAAIoZ,KAAKoR,QAAQ0S,OAAOrE,MAAOhP,GAAO,mBAAqB,GAAK,KAG1FoN,GAAQtN,GAAO,SACXV,GAAWqB,OAAOW,gBAChBb,GAAW,CACb,MAAMc,EAASd,GAAU,SACV,IAAXc,EAAc+L,GAAQ,KACN,IAAX/L,EAAc+L,GAAQ,IACX,IAAX/L,IAAc+L,GAAQ,KACjC,CAGFt/B,OAAO6C,KAAK4e,KAAK+gB,OAAO5gB,SAASplB,SACQ,IAA5BilB,KAAK+gB,MAAMhmC,GAAGo0C,YAA2BtR,GAAQ7d,KAAK+gB,MAAMhmC,GAAGo0C,UAAS,IAIrFtR,GAAQ,EAAmC,IAA/B7N,GAAY,iBAGxB,IAAIof,EACFvR,EACA7d,KAAK8e,WACH,EACArO,GAAO,2BACLA,GAAO,kCACPA,GAAO,gBACT1uB,GAOJ,OAJAqtC,EAAMpvB,KAAKgjB,kBAAkB,kBAAmBoM,GAE5CpvB,KAAK2R,QAAQ,mBAAkByd,EAAMpvB,KAAK+gB,MAAM,iBAAiBvB,OAE9D4P,CACT,CA+CyBC,GAAarvB,KAAKqsB,iBACvC,OAAI6C,EACK,CAACljB,GAAehM,KAAKgb,UAAWkU,GAElC,CAACljB,GAAehM,KAAKgb,UAC9B,CACA,MAAO,EACT,CCxIA,SAASsU,GAAoBnd,GAC3B,MAAMod,EAAS,CAAC,EAQhB,OAPAhxC,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IACjCw0C,EAAOx0C,GAAK,CAAC,EACbw0C,EAAOx0C,GAAGihC,MAAQmI,GAAwBppC,EAAGo3B,GAC9B,IAAXA,IACFlH,EAA2B,EAC7B,IAEKskB,CACT,CA+BO,SAASC,KACdjxC,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IACjCyyB,GAAczyB,GAAG02B,MAAQ0c,GACvBpzC,EACAilB,KAAKoR,QAAQr2B,GAAGk3B,UAChBjS,KAAKoR,QAAQr2B,GAAGo3B,OAChBnS,KAAKoR,QAAQr2B,GAAGm3B,KAChB,GAEFzE,GAAe1yB,GAAG02B,MAAQ0c,GACxBpzC,EACAilB,KAAKoR,QAAQr2B,GAAGk3B,UAChBjS,KAAKoR,QAAQr2B,GAAGo3B,OAChBnS,KAAKoR,QAAQr2B,GAAGm3B,KAChB,IAEFxE,GAAgB3yB,GAAG02B,MAAQ0c,GACzBpzC,EACAilB,KAAKoR,QAAQr2B,GAAGk3B,UAChBjS,KAAKoR,QAAQr2B,GAAGo3B,OAChBnS,KAAKoR,QAAQr2B,GAAGm3B,KAChB,KAEFvE,GAA4B5yB,GAAG02B,MAAQ0c,GACrCpzC,EACAilB,KAAKoR,QAAQr2B,GAAGk3B,UAChBjS,KAAKoR,QAAQr2B,GAAGo3B,OAChBnS,KAAKoR,QAAQr2B,GAAGm3B,KAChBvE,GAA4B5yB,GAAG29B,aAChC,IAGHoU,GAAa,CAAEnf,4BAA2B,IAC5C,CAMO,SAAS8hB,KAEdjiB,GAAgB8hB,GAAoB,GACpC7hB,GAAiB6hB,GAAoB,IACrC5hB,GAAkB4hB,GAAoB,KApExC,WACErhB,GAAgB,CAAC,EACjB,IAAK,IAAIlzB,EAAI,EAAGA,EAAIilB,KAAK4Z,gBAAgB5+B,OAAQD,IAAK,CACpD,MAAMukC,EAActf,KAAK4Z,gBAAgB7+B,GAAGuE,KACtCowC,EAAcX,GAAuBzP,GACvB,iBAAhBA,GACFrR,GAAcqR,GAAe,CAC3BtD,MAAOhc,KAAKgb,UAAYtQ,GAE4D,IAAlF1K,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,UACtE9M,GAAcqR,GAAatD,OAASrR,EACqD,IAAlF3K,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,YAC3E9M,GAAcqR,GAAatD,OAASpR,GACjCoK,OAAOC,SAAShH,GAAcqR,GAAatD,SAAQ/N,GAAcqR,GAAatD,MAAQ,KAE3F/N,GAAcqR,GAAe,CAAC,EAC1BoQ,EAAY,KAAIzhB,GAAcqR,GAAatD,MAAQ0T,EAAY,IAC/DA,EAAY,KAAIzhB,GAAcqR,GAAasG,WAAa8J,EAAY,IAE5E,CACF,CAmDEC,EACF,CCnFO,SAASC,GAAqBC,EAAOC,EAAWjS,GACrD,IAAIkS,EAAiB,EACjBvd,EAAO,EACPwd,EAAW,EACXC,EAAe,EACfC,EAAQ,EAAI/sC,KAAK2D,IAAI,EAAG3D,KAAKiL,KAAKjL,KAAKuyB,IAAI1V,KAAK4c,SAAWz5B,KAAKgtC,MAAQ,IAC5E,KAAOH,EAAWF,EAAYjS,GAC5BrL,EAAOrvB,KAAK2D,IACV+oC,EACA1sC,KAAKyD,IAAIzD,KAAKgE,MAAO,EAAI,EAAK,IAAM+oC,EAAQL,EAAQhS,GAAOiS,EAAYjS,IAEzEmS,EAAW7sC,KAAK2D,IACd+oC,EACA1sC,KAAKyD,IAAIzD,KAAKgE,MAAO,EAAI,EAAK,KAAO+oC,EAAQ,GAAKL,EAAQhS,GAAOiS,EAAYjS,IAE/EoS,EAAe9sC,KAAKgE,MAAO,EAAI,EAAK,KAAO+oC,EAAQ,GAAKL,EAAQhS,GAChEkS,GAAkBvd,EAClB0d,GAAS,EAEX,MAAO,CAACH,EAAgBvd,EAAMyd,EAChC,CAkBO,SAASG,KACd,IAAIN,EAAyC,GAA7B9iB,GAAkC,GAAK,EAAIC,GAE3D,MAAMojB,EAAcvP,KAChBuP,EAAc,EAAGP,GAAaO,EAC7BP,EAAY,EAEjBthB,GAAsBohB,GAAqB,EAAGE,EAAW5iB,IACzDoB,GAA+C,EAAzBE,GAAoB,GAAUtB,GACpDqB,GAAyBC,GAAoB,GAAK,GAAK,GAAK,EAAIvB,GAEhE0B,GAA2BihB,GAAqB,EAAGE,EAAW3iB,IAC9DsB,GAAyD,EAA9BE,GAAyB,GAAUxB,GAC9DuB,GACEC,GAAyB,GAAK,GAAK,GAAK,EAAI1B,GAE9C6B,GAA4B8gB,GAAqB,EAAe,EAAZE,EAAe5iB,IACnE0B,GAA2D,EAA/BE,GAA0B,GAAU5B,GAChE2B,GACEC,GAA0B,GAAK,GAAK,GAAK,EAAI7B,GAE/CgC,GAAiC2gB,GAAqB,EAAe,EAAZE,EAAe3iB,IACxE4B,GAAqE,EAApCE,GAA+B,GAAU9B,GAC1E6B,GACEC,GAA+B,GAAK,GAAK,GAAK,EAAIhC,GAEpD6f,GAAa,CACXte,oBAAmB,GACnBF,mBAAkB,GAClBC,uBAAsB,GACtBI,yBAAwB,GACxBF,wBAAuB,GACvBC,4BAA2B,GAC3BI,0BAAyB,GACzBF,yBAAwB,GACxBC,6BAA4B,GAC5BI,+BAA8B,GAC9BF,8BAA6B,GAC7BC,kCAAiC,IAErC,CC9Fe,SAASshB,KACtB,MAAMlD,EAAWjqC,KAAKgE,MAAMmtB,KAAKC,MAAQ,KAEzC,GAAKvU,KAAKqqB,EAAIrqB,KAAKwB,IAAO,GAAM,EAAG,CACjC,MAAM+uB,EAAavwB,KAAKwwB,gBAAgBxwB,KAAKywB,cAEvCC,EADiBvtC,KAAKgE,MAAM6Y,KAAKwwB,gBAAgBxwB,KAAKywB,aAAezwB,KAAKstB,gBACxCnqC,KAAKgE,MAAMopC,GAG7ChD,EAAWH,EAAWriB,EACtB4lB,EAAuBxtC,KAAK2D,IAAI,EAAG4pC,EAAiB1lB,GAA0BuiB,EACpF,IAAK,IAAIxyC,EAAI,EAAGA,EAAIwyC,EAAUxyC,IAC5BqvB,EAAkBgiB,UAAUuE,GAI9B5lB,EAAyBqiB,EACzBpiB,EAAyB0lB,EAGzBtjB,GAAmBhD,EAAkBsiB,YAAY,EACnD,CAEAI,GAAa,CAAE/hB,uBAAsB,yBAAwB,mBAAkB,IACjF,CCvBe,SAAS6lB,KACtBziB,GAAuB,GACvBE,GAA8B,GAC9BD,GAA+B,GAC/B,MAAM6V,EAAO,GAEb1lC,OAAO6C,KAAK4e,KAAKuf,UAAUpf,SAASplB,IAClCkpC,EAAKpnC,KAAKmjB,KAAKuf,SAASxkC,GAAG,IAO7BkpC,EAAKzL,MALW,SAAU/0B,EAAGP,GAC3B,OAAIO,EAAE62B,MAAQp3B,EAAEo3B,MAAc,EAC1B72B,EAAE62B,MAAQp3B,EAAEo3B,OAAe,EACxB,CACT,IAGA/7B,OAAO6C,KAAK6iC,GAAM9jB,SAASplB,IACzB,MAAM8+B,EAAKoK,EAAKlpC,GAEhB,GAAkB,IAAd8+B,EAAG/I,OAAc,CACnB,IAAI30B,EAAM,GAEVA,GC+CC,SAAsB09B,GAC3B,IAAIgX,EAAU,wBACE,aAAZhX,EAAGjJ,OAAqBigB,GAAW,aAEvC,IAAIC,EAAU,EACT9wB,KAAKgqB,MAAM+G,SAAQD,EAAU,GAC9BA,IAASD,GAAW,YAExB,IAAI,KAAEG,GAASnX,EACXA,EAAGoX,eAAcD,EAAOnX,EAAGoX,gBAC/B,MAAMhqB,EAAU,0DAA0D4S,EAAGzZ,kBAC7E,MAAO,eAAeywB,SACrB7wB,KAAKkxB,kBAAkBjqB,EAAS,OAAO,kBAC3B+pB,EAAK,GAAK,yBAAyBA,EAAK,OAAS,yBACjD,IAAVA,EAAK,QACS,IAAVA,EAAK,mBAEd,CDhEaG,CAAatX,GAEJ,aAAZA,EAAGjJ,KAAqBxC,IAAgCjyB,EACvC,WAAZ09B,EAAGjJ,KAAmBvC,IAA+BlyB,EACzC,WAAZ09B,EAAGjJ,MAAiC,WAAZiJ,EAAGjJ,MAAiC,UAAZiJ,EAAGjJ,OAC1DzC,IAAwBhyB,EAE5B,IAEJ,CErCe,SAASi1C,KACtB,GAAoB,cAAhBpxB,KAAKkrB,OAAwB,CAC/B,IAAI3tC,EAAuB,GAAjByiB,KAAKgb,UACXhb,KAAK2R,QAAQ,kBAAiBp0B,GAAO,IACrCyiB,KAAK2R,QAAQ,YAAWp0B,GAAO,KACnC+vB,GAAenqB,KAAK2D,IAAI,GAAIvJ,GACxByiB,KAAK8qB,IAAI,gCAA+Bxd,IAAgB,EAC9D,CAEAwf,GAAa,CAAExf,aAAY,IAC7B,CCOO,SAAS+jB,KACd/kB,GAA2C,IAA7BU,GAAoC,IAClDV,IAAcW,GACd,MAAMojB,EAAcvP,KAChBuP,EAAc,EAAG/jB,IAAc+jB,EAC9B/jB,GAAa,EAClBC,GAAmBW,IAAuC,IAAbZ,IAAqB,GAClEE,GAAwBW,IAAsC,IAAbb,IAAqB,GACtEG,GAAgC,EAAbH,GACnBI,GAAyBQ,IAA6C,IAAnBT,IAA2B,GAC9EE,GAA8BQ,IAA4C,IAAnBV,IAA2B,GAClFG,GAA4B,EAAbN,GACfO,GAAoC,IAAfD,GAErBE,GAAe,EACf,IAAIhmB,EAAM,EACN9I,EAAI,EACRO,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IAC7BilB,KAAKoR,QAAQr2B,GAAGo3B,OAASrrB,IAAKA,EAAMkZ,KAAKoR,QAAQr2B,GAAGo3B,QACpDnS,KAAKoR,QAAQr2B,GAAGo3B,OAAS,IAAGn0B,GAAK,EAAC,IAExCO,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,KAE9BilB,KAAKoR,QAAQr2B,GAAGo3B,OAASrrB,GAAa,IAAN9I,IACjCgiB,KAAKoR,QAAQr2B,GAAGo3B,OAAS,KACD,EAAxBnS,KAAKoR,QAAQr2B,GAAG02B,MAAY3E,KAE5BA,GAAuC,EAAxB9M,KAAKoR,QAAQr2B,GAAG02B,MAC/B1E,GAAuBhyB,EACzB,IAGF+xC,GAAa,CACXxgB,WAAU,GACVC,iBAAgB,GAChBC,sBAAqB,GACrBC,iBAAgB,GAChBC,uBAAsB,GACtBC,4BAA2B,GAC3BC,aAAY,GACZC,mBAAkB,GAClBC,aAAY,GACZC,qBAAoB,IAExB,CAKO,SAASukB,KACd,IAAIC,EAAa,EACbC,EAAY,EACZ3T,EAAO,EAGPpN,GAAO,4BAA2BoN,GAAQ,MAC1CpN,GAAO,iBAAgBoN,GAAQ,MAEnC0T,GAAc,EAA+C,GAA3CvxB,KAAK0iB,SAAS,2BAChC6O,GAAcvxB,KAAKyxB,IAAI,oBACvBD,GAAa,EAAuC,GAAnCxxB,KAAK0iB,SAAS,mBAC/B8O,GAAaxxB,KAAKyxB,IAAI,mBAGtBvkB,GAAyB2Q,EAAO0T,EAChCpkB,GAAwB0Q,EAAO2T,EAM/BvkB,GAAoC,EACD,IAA/BjN,KAAKwiB,aAAaC,OAAOzkC,IAC3BivB,IAAqC,EAAwC,KAApCjN,KAAK0iB,SAAS,qBAGzDoK,GAAa,CACX5f,uBAAsB,GACtBC,sBAAqB,GACrBF,kCAAiC,IAErC,CCjGe,SAASykB,GAA6BC,GACnD,MAAMpC,EAAS,CAAC,EAEhBhxC,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IACjC,GACsD,IAApDwD,OAAO6C,KAAKusB,IAA6B3yB,QACzC2yB,GAA4B5yB,GAAG62C,YAAc5xB,KAAKoR,QAAQr2B,GAAGo3B,SAC5Dwf,EAEDpC,EAAOx0C,GAAK,CACV29B,aAAc/K,GAA4B5yB,GAAG62C,YAAc5xB,KAAKoR,QAAQr2B,GAAGo3B,OAC3Eyf,YAAajkB,GAA4B5yB,GAAG62C,YAC5CngB,MAAO0c,GACLpzC,EACAilB,KAAKoR,QAAQr2B,GAAGk3B,UAChBjS,KAAKoR,QAAQr2B,GAAGo3B,OAChBnS,KAAKoR,QAAQr2B,GAAGm3B,KAChBvE,GAA4B5yB,GAAG62C,YAAc5xB,KAAKoR,QAAQr2B,GAAGo3B,aAG5D,CACL,MAAM0f,EC3BG,SAA6CrgB,GAC1D,MAAMsgB,EAAsB9xB,KAAK8f,kBACjC,IAAIiS,EAAQ,IACRC,EAAsB,IAC1B,KAAOD,GAAS,GAEd,GADA5N,GAAwB3S,EAAUugB,GAC9BzmB,GAAuBwmB,EACzBE,EAAsBD,EACtBA,GAAS,OACJ,IAAc,MAAVA,EACT,OAAO,IAGP,IADAA,GAAS,EACFA,GAASC,GAAqB,CAEnC,GADA7N,GAAwB3S,EAAUugB,GAC9BzmB,GAAuBwmB,EACzB,OAAOC,EAETA,GAAS,CACX,CACF,CAEF,OAAO,GACT,CDIuBE,CAAoCl3C,GACrDw0C,EAAOx0C,GAAK,CACV29B,aAAcmZ,EACdD,YAAa5xB,KAAKoR,QAAQr2B,GAAGo3B,OAAS0f,EACtCpgB,MAAO0c,GACLpzC,EACAilB,KAAKoR,QAAQr2B,GAAGk3B,UAChBjS,KAAKoR,QAAQr2B,GAAGo3B,OAChBnS,KAAKoR,QAAQr2B,GAAGm3B,KAChB2f,GAGN,KAEFlkB,GAA8B4hB,EAE9BzC,GAAa,CAAEnf,4BAA2B,IAC5C,CE9Be,SAASukB,KACtBtkB,GAAsB,EACtBC,GAAuB,EACvBC,GAAwB,CAAC,EAAG,MAC5B,IAAK,IAAI/yB,EAAI,EAAGA,EAAIilB,KAAKkb,UAAUlgC,OAAQD,IAAK,CAC9C,IAAI,OAAEgxC,GAAW/rB,KAAKkb,UAAUngC,GAC5BixC,EAAS,IAKb,GAJIhsB,KAAK8qB,IAAI,6BAA4BkB,GAAU,MACpB,IAA3BhsB,KAAKkb,UAAUngC,GAAGK,OAAY4wC,GAAU,GAC5CD,GAAUC,EACNhsB,KAAK8qB,IAAI,mBAAkBiB,GAAU,MACrClc,GAAWqB,OAAOW,eAAgB,CACpC,MAAMC,EAAS9R,KAAKiR,OAAO,SACZ,IAAXa,EAAcia,GAAU,KACR,IAAXja,EAAcia,GAAU,IACb,IAAXja,IAAcia,GAAU,KACnC,CACAne,IAAuBme,EACQ,IAA3B/rB,KAAKkb,UAAUngC,GAAGK,OACpByyB,IAAwBke,EACpBA,EAASje,GAAsB,KAAIA,GAAwB,CAACie,EAAQhxC,IAE5E,CAEA+xC,GAAa,CAAElf,oBAAmB,wBAAsB,yBAAuB,IACjF,CCxBe,SAASukB,KACtB9U,KACA6U,KACAb,KACAC,KACAlB,KACAQ,KACAQ,KlBqCArnB,EAAc,IAAIuiB,GAAWrV,GAAYA,GAAYj8B,OAAS,IAC9DgvB,EAAY,IAAIsiB,GAAWrV,GAAYA,GAAYj8B,OAAS,IAC5DivB,EAAmB,IAAIqiB,GAAWrV,GAAYA,GAAYj8B,OAAS,IACnEkvB,EAAa,IAAIoiB,GAAWrV,GAAYA,GAAYj8B,OAAS,IAC7DmvB,EAAa,IAAImiB,GAAWpV,GAAWA,GAAWl8B,OAAS,IkBtC3DovB,EAAoB,IAAIkiB,GAAW,GACnCxiB,EAAgC,IAAIwiB,GAA+C,GAApCpV,GAAWA,GAAWl8B,OAAS,IAC9Es1C,KACAoB,KACAvE,KACAsC,KACAD,KACA,IACF,CChCe,SAAS4C,KACtB7zC,OAAO6C,KAAK4e,KAAKkb,WAAW/a,SAASplB,IAC/BilB,KAAKkb,UAAUngC,GAAGgxC,OAAS,GAAgC,IAA3B/rB,KAAKkb,UAAUngC,GAAGK,OACpD4kB,KAAKkb,UAAUngC,GAAGs3C,GAAK,EACzB,GAEJ,CC0BO,SAASC,GAAcl3C,EAAMkE,GAClC,GAAa,MAATlE,EAAc,CAIhB,GAFAyQ,EAAE,WAAW6L,UAAYsI,KAAKoR,QAAQ9xB,GAAM2nB,UAE4C,IAApFjH,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmxB,YAAmB,CACzF,MAAMC,EAAarE,GACjB7uC,EACA0gB,KAAKoR,QAAQ9xB,GAAM2yB,UACnB,EACAjS,KAAKoR,QAAQ9xB,GAAM4yB,KACnBlS,KAAKoR,QAAQ9xB,GAAM6yB,QAEfsgB,EAAiBD,EAAaxyB,KAAKoR,QAAQ9xB,GAAM2gC,aACnDwS,EAAiB,IACnB5mC,EAAE,WAAW6L,UAAY7L,EAAE,WACxB6L,UAAUjW,MAAM,gBAChB6C,KACC,wBAAwB,GAASmuC,UACA,IAA/BtvC,KAAKgE,MAAMsrC,GAAwB,SAAW,+BAE9C7X,IACG4X,EAAaxyB,KAAKoR,QAAQ9xB,GAAM2gC,eAC9BjgB,KAAKoR,QAAQ9xB,GAAMozC,eAAiB1yB,KAAK2yB,gBAC5C9pB,eAIZ,EACsB,IAAlB7I,KAAKkY,UASPrsB,EAAE,WAAW6L,UAAY7L,EAAE,WACxB6L,UAAUjW,MAAM,GAASue,KAAKoR,QAAQ9xB,GAAMq9B,YAC5Cr4B,KACC,IACG0b,KAAKoR,QAAQ9xB,GACd0gB,KAAKoR,QAAQ9xB,GAAM2yB,UACnBjS,KAAKoR,QAAQ9xB,GAAM6yB,OACnBnS,KAAKoR,QAAQ9xB,GAAM4yB,KACnBlS,KAAKyS,QACL,KAIV,MAAO,GAAa,MAATr3B,EAAc,CAEvB,IAAK4kB,KAAK4Z,gBAAgBt6B,GAAO,MAAO,GACxCuM,EAAE,WAAW6L,UAAYsI,KAAK4yB,aAAa5yB,KAAK4Z,gBAAgBt6B,GAAO,QACzE,KAAoB,MAATlE,EAAcyQ,EAAE,WAAW6L,UAAYsI,KAAK6yB,cAErC,MAATz3C,EACPyQ,EAAE,WAAW6L,UAAYsI,KAAKoR,QAAQ,gBAAgBD,SAAS2hB,aAAaxzC,EAAnD0gB,GAET,MAAT5kB,EACPyQ,EAAE,WAAW6L,UAAYsI,KAAK6jB,YAAY,GAAG1S,SAAS4hB,YAAYzzC,EAAK,GAAIA,EAAK,GAAvD0gB,GAET,OAAT5kB,EAAeyQ,EAAE,WAAW6L,UAAYsI,KAAK6jB,YAAY,GAAG1S,SAAS6hB,YAAY,EAAzChzB,GAC/B,OAAT5kB,EAAeyQ,EAAE,WAAW6L,UAAY,GAC/B,QAATtc,EAAgByQ,EAAE,WAAW6L,UAAYsI,KAAKoR,QAAQF,OAAOC,SAAS8hB,WAAW3zC,EAAxC0gB,GAChC,QAAT5kB,IACPyQ,EAAE,WAAW6L,UAAYsI,KAAKoR,QAAQF,OAAOC,SAAS+hB,YAAY5zC,EAAK,GAA9C0gB,IAG3B,GACY,MAAT5kB,GAAiC,IAAjB4kB,KAAKkY,SACb,MAAT98B,GACS,MAATA,GACS,MAATA,GACU,MAATA,IAAiB4kB,KAAK5e,KAAK,KACnB,OAAThG,GACS,OAATA,GACS,QAATA,GACU,QAATA,IAA+B,IAAbkE,EAAK,GACxB,CACA,MAAM6zC,EAAO95C,SAAS4D,cAAc,OACpCk2C,EAAK/yB,GAAK,gBACVvU,EAAE,WAAWiK,YAAYq9B,EAC3B,CAQA,OALA1b,GAAcr8B,EACds8B,GAAcp4B,EAEdwlC,KAEOj5B,EAAE,WAAW6L,SACtB,CC/GO,SAAS07B,KAEoE,IAAhFpzB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASiyB,SACpE1f,GAAwB,EAEpBvE,GAA0BkkB,MAC5BznC,EAAE,aAAa0nC,KACb,4EAEF1nC,EAAE,aAAa0nC,KACb,6EACC1nC,EAAE,aAAa0nC,KAAO,sDAC/B,CCnBe,SAASC,KAEtB3jB,GAAa,GACbtxB,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IACjC80B,GAAW90B,GAAK4jC,GAAoB5jC,EAAE,IAIxC+0B,GAAc,GACdvxB,OAAO6C,KAAK4e,KAAKuf,UAAUpf,SAASplB,IAClC+0B,GAAY/0B,GAAKskC,GAAYtkC,EAAE,IAIjCg1B,GAAkB,GAClBxxB,OAAO6C,KAAK4e,KAAK0d,cAAcvd,SAASplB,IACtCg1B,GAAgBh1B,GAAKyiC,GAAgBziC,EAAE,IAEzC4kC,IACF,CCxBe,SAAS8T,KAClBzzB,KAAKoR,QAAQ,gBAAgBS,gBAC/BtzB,OAAO6C,KAAK4e,KAAKoR,QAAQ,gBAAgBD,SAASoV,YAAYpmB,SAASplB,IAC1B,OAAvC8Q,EAAE,gBAAgB9Q,KAAKisB,cACzBkN,GAAsBn5B,GAAK8Q,EAAE,gBAAgB9Q,KAAKisB,YAClDnb,EAAE,gBAAgB9Q,KAAKisB,YAAc,WACnChH,KAAKiH,QAAQysB,QAAU,EACvB1zB,KAAKiH,QAAQhV,KAAKxY,MAAM,IAAM64C,GAAc,IAAK,GAAGv3C,MAAM,QAC1DilB,KAAKiH,QAAQ0sB,QACf,EACF,GAGN,CCLA,SAASC,KACP,IAAKtgB,IAAgCtT,KAAKoR,QAAQ,gBAAgBS,eAAgB,CAChF,MAAM,SAAEV,GAAanR,KAAKoR,QAAQ,gBAClCgC,GAAqBjC,EAASlf,KAC9B+N,KAAKoR,QAAQ,gBAAgBD,SAASlf,KAAO,WAC3CmhB,KAEsF,IAApFpT,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASyyB,aACpE1iB,EAASwT,MAAQxT,EAASsV,QAC1BzmB,KAAKkqB,MAAQ,GAAM,IAEnB/Y,EAAS2iB,cAAcp8B,WAAa,KAAK6iB,GACvCgK,GAA4BpT,EAASwT,MAAOxT,EAASsV,OAAQtV,EAASsV,YAExEtV,EAAS4iB,UAAUlxC,MAAMgG,MAAQ,MAErC,EACAyqB,IAA+B,CACjC,CACF,CA6Be,SAAS0gB,MAxBxB,WACE,IAAK3gB,IAAkCrT,KAAKoR,QAAQ,gBAAgBS,eAAgB,CAClF,MAAM,SAAEV,GAAanR,KAAKoR,QAAQ,gBAClC8B,GAAuB/B,EAAS8iB,OAChC9gB,GAA0B,IAAI32B,SAC5B,UAAU20B,EAAS8iB,OAChB5wC,WACA5B,MAAM,SACN6C,KAAK,8CAEV0b,KAAKoR,QAAQ,gBAAgBD,SAAS8iB,OAAS,WAC7C9gB,KACAsgB,KACAngB,IAA+B,EAC/BsgB,KAEAvgB,IAAiC,CACnC,CACF,CACF,CAME6gB,GACAN,IACF,CCtDe,SAASO,KACtB,GAAI/nB,KAAyBpM,KAAKmQ,aAAerE,GAAW,CAC1D,GACE9L,KAAKmQ,YAAc,IACnBnQ,KAAKo0B,aAAap0B,KAAKmQ,aAAakkB,IAAIhxC,WAAWsjB,SAAS,aAC5D,CACA,MAAM2tB,EAAct0B,KAAKo0B,aAAap0B,KAAKmQ,aAAakkB,IACrDhxC,WACA5H,MAAM,mBACT,IAAI2E,EACc,OAAhBk0C,EAAuBA,EAAY,GAAKt0B,KAAK6jB,YAAY7jB,KAAKmQ,YAAc,GAAG7wB,KACjF,MAAM6yB,EAASnS,KAAKo0B,aAAap0B,KAAKmQ,aAAakkB,IAChDhxC,WACA5H,MAAM,sBAAsB,GAC/B,GAAe,MAAX2E,EAEF,GADAA,EAASA,EAAOm0C,WAAW,IAAK,IAC5Bv0B,KAAKoR,QAAQhxB,GAAQ+xB,OAASA,EAChC9F,GAAyB,mCACpB,CACL,IAAImoB,EAAO,EACX7U,KACA,IAAK,IAAI5kC,EAAI,EAAGA,EAAIo3B,EAAQp3B,IAAK,CAC/B,IAAI02B,EACF5B,GAAWzvB,GAAQ6xB,UACnBjS,KAAK0S,eACHvvB,KAAK2D,IAAI,EAAG+oB,GAAWzvB,GAAQ+xB,OAAS,EAAItC,GAAWzvB,GAAQ8xB,MACnET,EAAQzR,KAAK2S,oBAAoB9C,GAAWzvB,GAASqxB,GACrDA,EAAQtuB,KAAKiL,KAAKqjB,GAClB+iB,GAAQ/iB,EACR5B,GAAWzvB,GAAQ+xB,QAAU,CAC/B,CACA9F,GAAyB,kBAAkB,GAASmoB,IACtD,KACK,CACL,IAAIA,EAAO,EACX7U,KACAphC,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAAS4Z,IAEjC,GADA35B,EAAS25B,EACL/Z,KAAKoR,QAAQhxB,GAAQ+xB,OAASA,EAChC9F,GAAyB,mCAD3B,CAIA,IAAK,IAAItxB,EAAI,EAAGA,EAAIo3B,EAAQp3B,IAAK,CAC/B,IAAI02B,EACF5B,GAAWzvB,GAAQ6xB,UACnBjS,KAAK0S,eACHvvB,KAAK2D,IAAI,EAAG+oB,GAAWzvB,GAAQ+xB,OAAS,EAAItC,GAAWzvB,GAAQ8xB,MACnET,EAAQzR,KAAK2S,oBAAoB9C,GAAWzvB,GAASqxB,GACrDA,EAAQtuB,KAAKiL,KAAKqjB,GAClB+iB,GAAQ/iB,EACR5B,GAAWzvB,GAAQ+xB,QAAU,CAC/B,CACA9F,GAAyB,kBAAkB,GAASmoB,IAXpD,CAW2D,GAE/D,CACF,CACApoB,GAAuBpM,KAAKmQ,WAC9B,CAEA2c,GAAa,CAAE1gB,qBAAoB,IACrC,CCpEO,MAAMqoB,GAAe,CAC1BC,UAAW,qBACXC,YAAa,cACbC,SAAU,WACVC,QAAS,4BACTC,YAAa,+BACbC,QAAS,WACTC,WAAY,aACZ3rB,aAAc,gBACd4rB,cAAe,iBAIJC,GAA2B,CACtCC,oBAAqB,wBACrBC,eAAgB,gBAChBC,eAAgB,iBAChBC,gBAAiB,iBACjBC,iBAAkB,cAClBC,iBAAkB,iBAClBC,kBAAmB,WACnBC,qBAAsB,qBCKxB,GAvBA,SAAsCC,GACpC,GAAoB,IAAhBA,EAAmB,CAErB,MAAMC,EAA2B,WAC/B,IACEvsB,aAAawsB,oBAAoBC,MAGnC,CAFE,MAAO55C,GACP,OAAO,CACT,CACA,OAAO,CACT,EAGM,iBAAkB1C,OAEbo8C,IACTvsB,aAAawsB,oBAAoBC,OAEjCzsB,aAAawsB,oBAJbj6C,QAAQ85B,IAAI,+CAMhB,CACF,ECnBe,SAASqgB,KACtBC,cACAh2B,KAAKi2B,eACLj2B,KAAKk2B,kBAEL7Z,KACArE,KACAmB,IACF,CCTe,SAASgd,KAC6D,IAA/En2B,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkb,QACtEzwB,EAAE,YAAYhJ,MAAM2U,QAAU,GAC9B6kB,MAEAxwB,EAAE,YAAYhJ,MAAM2U,QAAU,OAEhCylB,IACF,CCKA,MAy6BA,GAz6BiB,CAEfnC,QAAS,IAAItR,EACX,EACA,OACA,cACA,CAAC,6BAA8B,8BAC/B,kFACA,GAEFukB,WAAY,IAAIvkB,EACd,EACA,OACA,cACA,CACE,0BACA,0BACA,0BACA,yBACA,yBACA,0BACA,0BACA,2BAEF,4DACA,GAEF0kB,cAAe,IAAI1kB,EACjB,EACA,OACA,cACA,CACE,4BACA,4BACA,6BACA,6BACA,8BAEF,uDACA,GAEFuR,UAAW,IAAIvR,EACb,EACA,OACA,cACA,CACE,+BACA,8BACA,6CAEF,qGACA,GACA,KACEsC,IAAY,CAAI,IAKpBgJ,MAAO,IAAItL,EACT,EACA,OACA,WACA,CACE,uBACA,SACA,cACA,4BACA,sBACA,wBAEF,yCACA,GACA,KACEusB,IAAc,IAGlBnhB,cAAe,IAAIpL,EACjB,EACA,OACA,WACA,CAAC,aAAc,aAAc,cAC7B,oIACA,GACA,KACEusB,IAAc,IAGlB3gB,eAAgB,IAAI5L,EAClB,EACA,OACA,WACA,CAAC,4BAA6B,mBAC9B,qDACA,GACA,KACEusB,IAAc,IAGlB5gB,YAAa,IAAI3L,EACf,OACA,WACA,WACA,2BACA,8KACA,EACA,WAEFmR,WAAY,IAAInR,EACd,EACA,OACA,WACA,CAAC,0BAA2B,sBAAuB,iBACnD,0BACA,GAEF4sB,aAAc,IAAI5sB,EAChB,EACA,OACA,WACA,CAAC,oBAAqB,oBACtB,mEACA,GACA,KCtIuF,IAArFxJ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASg1B,aACtEp2B,KAAKoqB,QAAUvT,GACZ7W,KAAKoqB,QAAUhW,GAAgBgW,ODqIZ,IAGxB3N,cAAe,IAAIjT,EACjB,EACA,OACA,WACA,CAAC,yBAA0B,mBAC3B,sKACA,GAIF4O,YAAa,IAAI5O,EACf,EACA,OACA,UACA,CAAC,uBAAwB,uBACzB,yBACA,GACA,KACEwO,IAAiB,IAGrB6I,sBAAuB,IAAIrX,EACzB,EACA,OACA,UACA,CAAC,2BAA4B,sBAC7B,0KACA,GAEF+kB,aAAc,IAAI/kB,EAChB,EACA,OACA,UACA,CACE,mBACA,kBACA,0BACA,gCAEF,sGACA,GAEF8kB,cAAe,IAAI9kB,EACjB,EACA,OACA,UACA,CAAC,mBAAoB,mBA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AoC,mCACrC,6CACA,GAEF+hB,aAAc,IAAI/hB,EAChB,EACA,OACA,UACA,CAAC,uBAAwB,uBACzB,oEACA,GAEFwc,YAAa,IAAIxc,EACf,EACA,OACA,UACA,CAAC,yBAA0B,yBAC3B,4DACA,GAEF0d,aAAc,IAAI1d,EAChB,EACA,OACA,UACA,CAAC,2BAA4B,2BAC7B,yDACA,GAEFwe,gBAAiB,IAAIxe,EACnB,EACA,OACA,UACA,CAAC,uBAAwB,uBACzB,iDACA,GAEFitB,oBAAqB,IAAIjtB,EACvB,EACA,OACA,UACA,CAAC,qCAAsC,qCACvC,+CACA,GAIF2gB,MAAO,IAAI3gB,EACT,EACA,OACA,aACA,CAAC,iBAAkB,iBACnB,oCACA,GAEFktB,gBAAiB,IAAIltB,EACnB,EACA,OACA,aACA,CAAC,uBAAwB,uBACzB,6CACA,GAEFmtB,oBAAqB,IAAIntB,EACvB,EACA,OACA,aACA,CAAC,2BAA4B,kCAC7B,yDACA,GAEF0iB,QAAS,IAAI1iB,EACX,EACA,OACA,aACA,CAAC,mCAAoC,+BACrC,wCACA,GAEFotB,oBAAqB,IAAIptB,EACvB,EACA,WACA,aACA,0BACA,8GACA,EACAqL,KAEFgiB,aAAc,IAAIrtB,EAChB,EACA,OACA,aACA,CAAC,gBAAiB,gBAClB,4FACA,GAIFuO,MAAO,IAAIvO,EACT,EACA,OACA,sBACA,CAAC,YAAa,WAAY,8BAC1B,8LACA,GAEFxG,aAAc,IAAIwG,EAChB,EACA,OACA,sBACA,CAAC,mCAAoC,mCACrC,kLACA,GAEFstB,eAAgB,IAAIttB,EAClB,EACA,OACA,iBACA,CAAC,mBAAoB,mBACrB,mDACA,GACA,KACE,GACExJ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS01B,eACrE,IAGLC,QAAS,IAAIvtB,EACX,EACA,OACA,iBACA,CAAC,YAAa,YACd,iCACA,GAEFwtB,cAAe,IAAIxtB,EACjB,UACA,SACA,iBACA,wDAEFytB,QAAS,IAAIztB,EACX,EACA,OACA,iBACA,CAAC,YAAa,YACd,iCACA,GAEF0tB,SAAU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","sources":["webpack:///./node_modules/@eastdesire/jscolor/jscolor.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/baseSetting.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/notifications/prompt.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/notifications/flash.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/savingAndLoading/saveFramework.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/toggles/toggleHeader.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/notifications/sound.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/toggleConfigVolume.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/menuSections/addMenu.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/menuSections/info/addInfoMenuSection.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/menuSections/info/createFrameworkInfoMenuSection.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/data/modInfo.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/draw/drawLoop.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/data/headers.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/savingAndLoading/loadMod.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/savingAndLoading/createSaveDataObject.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/logic/logicLoop.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/data/settings.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/load.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/cookieMonsterFramework.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/init.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/init/createFlashScreen.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/save.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/index.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/init/initModFramework.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/init/registerMod.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/listings/createInfoListing.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/listings/createOptionListing.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/listings/createOptionsFavouriteStar.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/toggles/toggleFavourite.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/toggleConfig.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/toggleConfigKeycode.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/listings/createOptionsSubHeader.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/createModMenuSection.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/notifications/notification.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingColours.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingInputNumber.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingStandard.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingStandardWithFunc.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingVolume.js","webpack:///./src/Config/Toggles/ToggleWrinklerButtons.js","webpack:///./src/Cache/VariablesAndData.js","webpack:///./src/Sim/VariablesAndData.js","webpack:///./src/Sim/ReplacedGameFunctions/SimAuraMult.js","webpack:///./src/Sim/ReplacedGameFunctions/SimGetSellMultiplier.js","webpack:///./src/Sim/ReplacedGameFunctions/SimEff.js","webpack:///./src/Sim/ReplacedGameFunctions/SimHas.js","webpack:///./src/Sim/ReplacedGameFunctions/SimHasAura.js","webpack:///./src/Sim/ReplacedGameFunctions/SimHasGod.js","webpack:///./src/Sim/ReplacedGameFunctions/SimModifyBuidlingPrice.js","webpack:///./src/Sim/SimulationEvents/SellBuilding.js","webpack:///./src/Data/Scales.js","webpack:///./src/Main/VariablesAndData.js","webpack:///./src/Disp/VariablesAndData.js","webpack:///./src/Disp/BeautifyAndFormatting/Beautify.js","webpack:///./src/Disp/BuildingsUpgrades/Buildings.js","webpack:///./src/Disp/BuildingsUpgrades/UpdateUpgradeSectionsHeight.js","webpack:///./src/Disp/BuildingsUpgrades/Upgrades.js","webpack:///./src/Disp/BeautifyAndFormatting/FormatTime.js","webpack:///./src/Disp/BeautifyAndFormatting/GetTimeColour.js","webpack:///./src/Disp/HelperFunctions/GetCPS.js","webpack:///./src/Disp/HelperFunctions/GetWrinkConfigBank.js","webpack:///./src/Disp/InfoBars/CreateDOMElements.js","webpack:///./src/Disp/InfoBars/BottomBar.js","webpack:///./src/Disp/HelperFunctions/UpdateBackground.js","webpack:///./src/Config/SpecificToggles.js","webpack:///./src/Cache/Dragon/CacheDragonAuras.js","webpack:///./src/Sim/InitializeData/InitAchievement.js","webpack:///./src/Sim/ReplacedGameFunctions/SimGetTieredCpsMult.js","webpack:///./src/Sim/InitializeData/InitialBuildingData.js","webpack:///./src/Sim/InitializeData/InitUpgrade.js","webpack:///./src/Sim/SimulationData/CopyData.js","webpack:///./src/Disp/Tooltips/CreateTooltip.js","webpack:///./src/Cache/PP/ColourOfPP.js","webpack:///./src/Cache/CPS/GetCPSBuffMult.js","webpack:///./src/Sim/SimulationData/SimWin.js","webpack:///./src/Sim/Calculations/CalculateGains.js","webpack:///./src/Sim/ReplacedGameFunctions/SimGetHeavenlyMultiplier.js","webpack:///./src/Data/Gamedata.js","webpack:///./src/Sim/ReplacedGameFunctions/SimHasAchiev.js","webpack:///./src/Sim/Calculations/CheckOtherAchiev.js","webpack:///./src/Sim/SimulationEvents/BuyBuildingBonusIncome.js","webpack:///./src/Disp/HelperFunctions/CalculateGrimoireRefillTime.js","webpack:///./src/Config/Toggles/ToggleToolWarnPos.js","webpack:///./src/Disp/Tooltips/UpdateTooltips.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/Building.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/Upgrade.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/SugarLump.js","webpack:///./src/Disp/HelperFunctions/GetLumpColour.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/Grimoire.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/GardenPlots.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/HarvestAll.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/WrinklerButton.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/PantheonGods.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/Warnings.js","webpack:///./src/Disp/DrawHook.js","webpack:///./src/Disp/InfoBars/TimerBar.js","webpack:///./src/Disp/Tooltips/WrinklerTooltips.js","webpack:///./src/Disp/MenuSections/Refreshmenu.js","webpack:///./src/Main/ClickHook.js","webpack:///./src/Cache/CPS/AverageQueue.js","webpack:///./src/Cache/FillCMDCache.js","webpack:///./src/Cache/CPS/CPS.js","webpack:///./src/Sim/SimulationEvents/BuyBuilding.js","webpack:///./src/Cache/PP/Building.js","webpack:///./src/Cache/PP/PP.js","webpack:///./src/Cache/PP/Upgrade.js","webpack:///./src/Sim/SimulationEvents/BuyUpgrades.js","webpack:///./src/Cache/PriceAndIncome/PriceAndIncome.js","webpack:///./src/Cache/Stats/ChainCookies.js","webpack:///./src/Cache/Stats/HeavenlyChips.js","webpack:///./src/Cache/Stats/MissingUpgrades.js","webpack:///./src/Disp/MenuSections/Statistics/CreateMissingUpgrades.js","webpack:///./src/Cache/Stats/Reindeer.js","webpack:///./src/Cache/Stats/Stats.js","webpack:///./src/Cache/TillNextAchievement/AllAmountTillNextAchievement.js","webpack:///./src/Cache/TillNextAchievement/IndividualAmountTillNextAchievement.js","webpack:///./src/Cache/Wrinklers/Wrinklers.js","webpack:///./src/Cache/CacheInit.js","webpack:///./src/Disp/HelperFunctions/PopWrinklers.js","webpack:///./src/Disp/Tooltips/Tooltip.js","webpack:///./src/Disp/TabTitle/FavIcon.js","webpack:///./src/Sim/InitializeData/InitData.js","webpack:///./src/Main/ReplaceGameElements/TooltipGrimoire.js","webpack:///./src/Main/ReplaceGameElements/NativeGrimoire.js","webpack:///./src/Cache/Dragon/Dragon.js","webpack:///./src/Data/Sectionheaders.js","webpack:///./src/Config/CheckNotificationPermissions.js","webpack:///./src/Disp/HelperFunctions/RefreshScale.js","webpack:///./src/Config/Toggles/ToggleBotBar.js","webpack:///./src/Data/settings.js","webpack:///./src/Config/Toggles/ToggleDetailedTime.js","webpack:///./src/Config/Toggles/ToggleUpgradeBarAndColour.js","webpack:///./src/Config/Toggles/ToggleUpgradeBarFixedPos.js","webpack:///./src/Config/Toggles/ToggleGCTimer.js","webpack:///./src/Config/Toggles/ToggleSectionHideButtons.js","webpack:///./src/Disp/HelperFunctions/UpdateColours.js","webpack:///./src/Disp/MenuSections/createMenuOptions.js","webpack:///./src/Disp/HelperFunctions/CalculateLuckyLevels.js","webpack:///./src/Disp/MenuSections/Statistics/CreateDOMElements.js","webpack:///./src/Config/ToggleSetting.js","webpack:///./src/Disp/MenuSections/Statistics/AddStatsPage.js","webpack:///./src/Disp/MenuSections/Statistics/CreateStatsSections.js","webpack:///./src/Sim/SimulationEvents/ResetAscension.js","webpack:///./src/Disp/MenuSections/Statistics/CreateMissingAchievements.js","webpack:///./src/Main/ReplaceGameFunctions/FixMouse.js","webpack:///./src/Main/ReplaceGameFunctions/ReplaceNative.js","webpack:///./src/Disp/Tooltips/PositionLocation.js","webpack:///./src/Main/ReplaceGameElements/TooltipUpgrades.js","webpack:///./src/Disp/Dragon/Dragon.js","webpack:///./src/Sim/SimulationEvents/AuraChange.js","webpack:///./src/Disp/MenuSections/AddMenus.js","webpack:///./src/Disp/TabTitle/TabTitle.js","webpack:///./src/Disp/Tooltips/AscendButton.js","webpack:///./src/Main/Initialization.js","webpack:///./src/Disp/Initialization/CssArea.js","webpack:///./src/Disp/BuildingsUpgrades/UpgradeBar.js","webpack:///./src/Disp/Initialization/CreateSectionHideButtons.js","webpack:///./src/Disp/Initialization/CreateWrinklerButton.js","webpack:///./src/Disp/Initialization/UpdateBuildingUpgradeStyle.js","webpack:///./src/Disp/buildingTiles/createBuildingLockButtons.js","webpack:///./src/Disp/buildingTiles/toggleBuildingLock.js","webpack:///./src/Main/ReplaceGameElements/Tooltips.js","webpack:///./src/Main/WrinklerArea/AddDetectArea.js","webpack:///./src/Sim/SimulationEvents/GodChange.js","webpack:///./src/Main/LoopHook.js","webpack:///./src/Disp/HelperFunctions/UpdateAscendState.js","webpack:///./src/Cache/CPS/NoGoldSwitchCPS.js","webpack:///./src/Sim/Calculations/NoGoldenSwitchCalc.js","webpack:///./src/Cache/PantheonGods/CacheGods.js","webpack:///./src/Cache/CPS/SellChoEgg.js","webpack:///./src/Sim/SimulationEvents/SellBuildingForChoEgg.js","webpack:///./src/Cache/CacheLoop.js","webpack:///./src/Cache/CPS/CurrWrinklerCPS.js","webpack:///./src/Main/CheckStates/Ticker.js","webpack:///./src/Main/CheckStates/Season.js","webpack:///./src/Main/CheckStates/Garden.js","webpack:///./src/Main/CheckStates/Grimoire.js","webpack:///./src/Main/CheckStates/Wrinkler.js","webpack:///./src/Main/CheckStates/GoldenCookie.js","webpack:///./src/Disp/GoldenCookieTimers/GoldenCookieTimers.js","webpack:///./src/Data/headers.js","webpack:///./src/InitSaveLoad/load.js","webpack:///./src/CookieMonster.js","webpack:///./src/InitSaveLoad/init.js","webpack:///./src/Data/Moddata.js","webpack:///./src/InitSaveLoad/save.js"],"sourcesContent":["/**\r\n * jscolor - JavaScript Color Picker\r\n *\r\n * @link http://jscolor.com\r\n * @license For open source use: GPLv3\r\n * For commercial use: JSColor Commercial License\r\n * @author Jan Odvarko - East Desire\r\n *\r\n * See usage examples at http://jscolor.com/examples/\r\n */\r\n\r\n\r\n(function (global, factory) {\r\n\r\n\t'use strict';\r\n\r\n\tif (typeof module === 'object' && typeof module.exports === 'object') {\r\n\t\t// Export jscolor as a module\r\n\t\tmodule.exports = global.document ?\r\n\t\t\tfactory (global) :\r\n\t\t\tfunction (win) {\r\n\t\t\t\tif (!win.document) {\r\n\t\t\t\t\tthrow new Error('jscolor needs a window with document');\r\n\t\t\t\t}\r\n\t\t\t\treturn factory(win);\r\n\t\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\t// Default use (no module export)\r\n\tfactory(global);\r\n\r\n})(typeof window !== 'undefined' ? window : this, function (window) { // BEGIN factory\r\n\r\n// BEGIN jscolor code\r\n\r\n\r\n'use strict';\r\n\r\n\r\nvar jscolor = (function () { // BEGIN jscolor\r\n\r\nvar jsc = {\r\n\r\n\r\n\tinitialized : false,\r\n\r\n\tinstances : [], // created instances of jscolor\r\n\r\n\treadyQueue : [], // functions waiting to be called after init\r\n\r\n\r\n\tregister : function () {\r\n\t\tif (typeof window !== 'undefined' && window.document) {\r\n\t\t\twindow.document.addEventListener('DOMContentLoaded', jsc.pub.init, false);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tinstallBySelector : function (selector, rootNode) {\r\n\t\trootNode = rootNode ? jsc.node(rootNode) : window.document;\r\n\t\tif (!rootNode) {\r\n\t\t\tthrow new Error('Missing root node');\r\n\t\t}\r\n\r\n\t\tvar elms = rootNode.querySelectorAll(selector);\r\n\r\n\t\t// for backward compatibility with DEPRECATED installation/configuration using className\r\n\t\tvar matchClass = new RegExp('(^|\\\\s)(' + jsc.pub.lookupClass + ')(\\\\s*(\\\\{[^}]*\\\\})|\\\\s|$)', 'i');\r\n\r\n\t\tfor (var i = 0; i < elms.length; i += 1) {\r\n\r\n\t\t\tif (elms[i].jscolor && elms[i].jscolor instanceof jsc.pub) {\r\n\t\t\t\tcontinue; // jscolor already installed on this element\r\n\t\t\t}\r\n\r\n\t\t\tif (elms[i].type !== undefined && elms[i].type.toLowerCase() == 'color' && jsc.isColorAttrSupported) {\r\n\t\t\t\tcontinue; // skips inputs of type 'color' if supported by the browser\r\n\t\t\t}\r\n\r\n\t\t\tvar dataOpts, m;\r\n\r\n\t\t\tif (\r\n\t\t\t\t(dataOpts = jsc.getDataAttr(elms[i], 'jscolor')) !== null ||\r\n\t\t\t\t(elms[i].className && (m = elms[i].className.match(matchClass))) // installation using className (DEPRECATED)\r\n\t\t\t) {\r\n\t\t\t\tvar targetElm = elms[i];\r\n\r\n\t\t\t\tvar optsStr = '';\r\n\t\t\t\tif (dataOpts !== null) {\r\n\t\t\t\t\toptsStr = dataOpts;\r\n\r\n\t\t\t\t} else if (m) { // installation using className (DEPRECATED)\r\n\t\t\t\t\tconsole.warn('Installation using class name is DEPRECATED. Use data-jscolor=\"\" attribute instead.' + jsc.docsRef);\r\n\t\t\t\t\tif (m[4]) {\r\n\t\t\t\t\t\toptsStr = m[4];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar opts = null;\r\n\t\t\t\tif (optsStr.trim()) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\topts = jsc.parseOptionsStr(optsStr);\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tconsole.warn(e + '\\n' + optsStr);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tnew jsc.pub(targetElm, opts);\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tparseOptionsStr : function (str) {\r\n\t\tvar opts = null;\r\n\r\n\t\ttry {\r\n\t\t\topts = JSON.parse(str);\r\n\r\n\t\t} catch (eParse) {\r\n\t\t\tif (!jsc.pub.looseJSON) {\r\n\t\t\t\tthrow new Error('Could not parse jscolor options as JSON: ' + eParse);\r\n\t\t\t} else {\r\n\t\t\t\t// loose JSON syntax is enabled -> try to evaluate the options string as JavaScript object\r\n\t\t\t\ttry {\r\n\t\t\t\t\topts = (new Function ('var opts = (' + str + '); return typeof opts === \"object\" ? opts : {};'))();\r\n\t\t\t\t} catch (eEval) {\r\n\t\t\t\t\tthrow new Error('Could not evaluate jscolor options: ' + eEval);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn opts;\r\n\t},\r\n\r\n\r\n\tgetInstances : function () {\r\n\t\tvar inst = [];\r\n\t\tfor (var i = 0; i < jsc.instances.length; i += 1) {\r\n\t\t\t// if the targetElement still exists, the instance is considered \"alive\"\r\n\t\t\tif (jsc.instances[i] && jsc.instances[i].targetElement) {\r\n\t\t\t\tinst.push(jsc.instances[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn inst;\r\n\t},\r\n\r\n\r\n\tcreateEl : function (tagName) {\r\n\t\tvar el = window.document.createElement(tagName);\r\n\t\tjsc.setData(el, 'gui', true);\r\n\t\treturn el;\r\n\t},\r\n\r\n\r\n\tnode : function (nodeOrSelector) {\r\n\t\tif (!nodeOrSelector) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif (typeof nodeOrSelector === 'string') {\r\n\t\t\t// query selector\r\n\t\t\tvar sel = nodeOrSelector;\r\n\t\t\tvar el = null;\r\n\t\t\ttry {\r\n\t\t\t\tel = window.document.querySelector(sel);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tconsole.warn(e);\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tif (!el) {\r\n\t\t\t\tconsole.warn('No element matches the selector: %s', sel);\r\n\t\t\t}\r\n\t\t\treturn el;\r\n\t\t}\r\n\r\n\t\tif (jsc.isNode(nodeOrSelector)) {\r\n\t\t\t// DOM node\r\n\t\t\treturn nodeOrSelector;\r\n\t\t}\r\n\r\n\t\tconsole.warn('Invalid node of type %s: %s', typeof nodeOrSelector, nodeOrSelector);\r\n\t\treturn null;\r\n\t},\r\n\r\n\r\n\t// See https://stackoverflow.com/questions/384286/\r\n\tisNode : function (val) {\r\n\t\tif (typeof Node === 'object') {\r\n\t\t\treturn val instanceof Node;\r\n\t\t}\r\n\t\treturn val && typeof val === 'object' && typeof val.nodeType === 'number' && typeof val.nodeName === 'string';\r\n\t},\r\n\r\n\r\n\tnodeName : function (node) {\r\n\t\tif (node && node.nodeName) {\r\n\t\t\treturn node.nodeName.toLowerCase();\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\r\n\tremoveChildren : function (node) {\r\n\t\twhile (node.firstChild) {\r\n\t\t\tnode.removeChild(node.firstChild);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tisTextInput : function (el) {\r\n\t\treturn el && jsc.nodeName(el) === 'input' && el.type.toLowerCase() === 'text';\r\n\t},\r\n\r\n\r\n\tisButton : function (el) {\r\n\t\tif (!el) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tvar n = jsc.nodeName(el);\r\n\t\treturn (\r\n\t\t\t(n === 'button') ||\r\n\t\t\t(n === 'input' && ['button', 'submit', 'reset'].indexOf(el.type.toLowerCase()) > -1)\r\n\t\t);\r\n\t},\r\n\r\n\r\n\tisButtonEmpty : function (el) {\r\n\t\tswitch (jsc.nodeName(el)) {\r\n\t\t\tcase 'input': return (!el.value || el.value.trim() === '');\r\n\t\t\tcase 'button': return (el.textContent.trim() === '');\r\n\t\t}\r\n\t\treturn null; // could not determine element's text\r\n\t},\r\n\r\n\r\n\t// See https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\r\n\tisPassiveEventSupported : (function () {\r\n\t\tvar supported = false;\r\n\r\n\t\ttry {\r\n\t\t\tvar opts = Object.defineProperty({}, 'passive', {\r\n\t\t\t\tget: function () { supported = true; }\r\n\t\t\t});\r\n\t\t\twindow.addEventListener('testPassive', null, opts);\r\n\t\t\twindow.removeEventListener('testPassive', null, opts);\r\n\t\t} catch (e) {}\r\n\r\n\t\treturn supported;\r\n\t})(),\r\n\r\n\r\n\tisColorAttrSupported : (function () {\r\n\t\tvar elm = window.document.createElement('input');\r\n\t\tif (elm.setAttribute) {\r\n\t\t\telm.setAttribute('type', 'color');\r\n\t\t\tif (elm.type.toLowerCase() == 'color') {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t})(),\r\n\r\n\r\n\tdataProp : '_data_jscolor',\r\n\r\n\r\n\t// usage:\r\n\t// setData(obj, prop, value)\r\n\t// setData(obj, {prop:value, ...})\r\n\t//\r\n\tsetData : function () {\r\n\t\tvar obj = arguments[0];\r\n\r\n\t\tif (arguments.length === 3) {\r\n\t\t\t// setting a single property\r\n\t\t\tvar data = obj.hasOwnProperty(jsc.dataProp) ? obj[jsc.dataProp] : (obj[jsc.dataProp] = {});\r\n\t\t\tvar prop = arguments[1];\r\n\t\t\tvar value = arguments[2];\r\n\r\n\t\t\tdata[prop] = value;\r\n\t\t\treturn true;\r\n\r\n\t\t} else if (arguments.length === 2 && typeof arguments[1] === 'object') {\r\n\t\t\t// setting multiple properties\r\n\t\t\tvar data = obj.hasOwnProperty(jsc.dataProp) ? obj[jsc.dataProp] : (obj[jsc.dataProp] = {});\r\n\t\t\tvar map = arguments[1];\r\n\r\n\t\t\tfor (var prop in map) {\r\n\t\t\t\tif (map.hasOwnProperty(prop)) {\r\n\t\t\t\t\tdata[prop] = map[prop];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tthrow new Error('Invalid arguments');\r\n\t},\r\n\r\n\r\n\t// usage:\r\n\t// removeData(obj, prop, [prop...])\r\n\t//\r\n\tremoveData : function () {\r\n\t\tvar obj = arguments[0];\r\n\t\tif (!obj.hasOwnProperty(jsc.dataProp)) {\r\n\t\t\treturn true; // data object does not exist\r\n\t\t}\r\n\t\tfor (var i = 1; i < arguments.length; i += 1) {\r\n\t\t\tvar prop = arguments[i];\r\n\t\t\tdelete obj[jsc.dataProp][prop];\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n\r\n\r\n\tgetData : function (obj, prop, setDefault) {\r\n\t\tif (!obj.hasOwnProperty(jsc.dataProp)) {\r\n\t\t\t// data object does not exist\r\n\t\t\tif (setDefault !== undefined) {\r\n\t\t\t\tobj[jsc.dataProp] = {}; // create data object\r\n\t\t\t} else {\r\n\t\t\t\treturn undefined; // no value to return\r\n\t\t\t}\r\n\t\t}\r\n\t\tvar data = obj[jsc.dataProp];\r\n\r\n\t\tif (!data.hasOwnProperty(prop) && setDefault !== undefined) {\r\n\t\t\tdata[prop] = setDefault;\r\n\t\t}\r\n\t\treturn data[prop];\r\n\t},\r\n\r\n\r\n\tgetDataAttr : function (el, name) {\r\n\t\tvar attrName = 'data-' + name;\r\n\t\tvar attrValue = el.getAttribute(attrName);\r\n\t\treturn attrValue;\r\n\t},\r\n\r\n\r\n\tsetDataAttr : function (el, name, value) {\r\n\t\tvar attrName = 'data-' + name;\r\n\t\tel.setAttribute(attrName, value);\r\n\t},\r\n\r\n\r\n\t_attachedGroupEvents : {},\r\n\r\n\r\n\tattachGroupEvent : function (groupName, el, evnt, func) {\r\n\t\tif (!jsc._attachedGroupEvents.hasOwnProperty(groupName)) {\r\n\t\t\tjsc._attachedGroupEvents[groupName] = [];\r\n\t\t}\r\n\t\tjsc._attachedGroupEvents[groupName].push([el, evnt, func]);\r\n\t\tel.addEventListener(evnt, func, false);\r\n\t},\r\n\r\n\r\n\tdetachGroupEvents : function (groupName) {\r\n\t\tif (jsc._attachedGroupEvents.hasOwnProperty(groupName)) {\r\n\t\t\tfor (var i = 0; i < jsc._attachedGroupEvents[groupName].length; i += 1) {\r\n\t\t\t\tvar evt = jsc._attachedGroupEvents[groupName][i];\r\n\t\t\t\tevt[0].removeEventListener(evt[1], evt[2], false);\r\n\t\t\t}\r\n\t\t\tdelete jsc._attachedGroupEvents[groupName];\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tpreventDefault : function (e) {\r\n\t\tif (e.preventDefault) { e.preventDefault(); }\r\n\t\te.returnValue = false;\r\n\t},\r\n\r\n\r\n\tcaptureTarget : function (target) {\r\n\t\t// IE\r\n\t\tif (target.setCapture) {\r\n\t\t\tjsc._capturedTarget = target;\r\n\t\t\tjsc._capturedTarget.setCapture();\r\n\t\t}\r\n\t},\r\n\r\n\r\n\treleaseTarget : function () {\r\n\t\t// IE\r\n\t\tif (jsc._capturedTarget) {\r\n\t\t\tjsc._capturedTarget.releaseCapture();\r\n\t\t\tjsc._capturedTarget = null;\r\n\t\t}\r\n\t},\r\n\r\n\r\n\ttriggerEvent : function (el, eventName, bubbles, cancelable) {\r\n\t\tif (!el) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar ev = null;\r\n\r\n\t\tif (typeof Event === 'function') {\r\n\t\t\tev = new Event(eventName, {\r\n\t\t\t\tbubbles: bubbles,\r\n\t\t\t\tcancelable: cancelable\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\t// IE\r\n\t\t\tev = window.document.createEvent('Event');\r\n\t\t\tev.initEvent(eventName, bubbles, cancelable);\r\n\t\t}\r\n\r\n\t\tif (!ev) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// so that we know that the event was triggered internally\r\n\t\tjsc.setData(ev, 'internal', true);\r\n\r\n\t\tel.dispatchEvent(ev);\r\n\t\treturn true;\r\n\t},\r\n\r\n\r\n\ttriggerInputEvent : function (el, eventName, bubbles, cancelable) {\r\n\t\tif (!el) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (jsc.isTextInput(el)) {\r\n\t\t\tjsc.triggerEvent(el, eventName, bubbles, cancelable);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\teventKey : function (ev) {\r\n\t\tvar keys = {\r\n\t\t\t9: 'Tab',\r\n\t\t\t13: 'Enter',\r\n\t\t\t27: 'Escape',\r\n\t\t};\r\n\t\tif (typeof ev.code === 'string') {\r\n\t\t\treturn ev.code;\r\n\t\t} else if (ev.keyCode !== undefined && keys.hasOwnProperty(ev.keyCode)) {\r\n\t\t\treturn keys[ev.keyCode];\r\n\t\t}\r\n\t\treturn null;\r\n\t},\r\n\r\n\r\n\tstrList : function (str) {\r\n\t\tif (!str) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t\treturn str.replace(/^\\s+|\\s+$/g, '').split(/\\s+/);\r\n\t},\r\n\r\n\r\n\t// The className parameter (str) can only contain a single class name\r\n\thasClass : function (elm, className) {\r\n\t\tif (!className) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (elm.classList !== undefined) {\r\n\t\t\treturn elm.classList.contains(className);\r\n\t\t}\r\n\t\t// polyfill\r\n\t\treturn -1 != (' ' + elm.className.replace(/\\s+/g, ' ') + ' ').indexOf(' ' + className + ' ');\r\n\t},\r\n\r\n\r\n\t// The className parameter (str) can contain multiple class names separated by whitespace\r\n\taddClass : function (elm, className) {\r\n\t\tvar classNames = jsc.strList(className);\r\n\r\n\t\tif (elm.classList !== undefined) {\r\n\t\t\tfor (var i = 0; i < classNames.length; i += 1) {\r\n\t\t\t\telm.classList.add(classNames[i]);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// polyfill\r\n\t\tfor (var i = 0; i < classNames.length; i += 1) {\r\n\t\t\tif (!jsc.hasClass(elm, classNames[i])) {\r\n\t\t\t\telm.className += (elm.className ? ' ' : '') + classNames[i];\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t// The className parameter (str) can contain multiple class names separated by whitespace\r\n\tremoveClass : function (elm, className) {\r\n\t\tvar classNames = jsc.strList(className);\r\n\r\n\t\tif (elm.classList !== undefined) {\r\n\t\t\tfor (var i = 0; i < classNames.length; i += 1) {\r\n\t\t\t\telm.classList.remove(classNames[i]);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// polyfill\r\n\t\tfor (var i = 0; i < classNames.length; i += 1) {\r\n\t\t\tvar repl = new RegExp(\r\n\t\t\t\t'^\\\\s*' + classNames[i] + '\\\\s*|' +\r\n\t\t\t\t'\\\\s*' + classNames[i] + '\\\\s*$|' +\r\n\t\t\t\t'\\\\s+' + classNames[i] + '(\\\\s+)',\r\n\t\t\t\t'g'\r\n\t\t\t);\r\n\t\t\telm.className = elm.className.replace(repl, '$1');\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tgetCompStyle : function (elm) {\r\n\t\tvar compStyle = window.getComputedStyle ? window.getComputedStyle(elm) : elm.currentStyle;\r\n\r\n\t\t// Note: In Firefox, getComputedStyle returns null in a hidden iframe,\r\n\t\t// that's why we need to check if the returned value is non-empty\r\n\t\tif (!compStyle) {\r\n\t\t\treturn {};\r\n\t\t}\r\n\t\treturn compStyle;\r\n\t},\r\n\r\n\r\n\t// Note:\r\n\t// Setting a property to NULL reverts it to the state before it was first set\r\n\t// with the 'reversible' flag enabled\r\n\t//\r\n\tsetStyle : function (elm, styles, important, reversible) {\r\n\t\t// using '' for standard priority (IE10 apparently doesn't like value undefined)\r\n\t\tvar priority = important ? 'important' : '';\r\n\t\tvar origStyle = null;\r\n\r\n\t\tfor (var prop in styles) {\r\n\t\t\tif (styles.hasOwnProperty(prop)) {\r\n\t\t\t\tvar setVal = null;\r\n\r\n\t\t\t\tif (styles[prop] === null) {\r\n\t\t\t\t\t// reverting a property value\r\n\r\n\t\t\t\t\tif (!origStyle) {\r\n\t\t\t\t\t\t// get the original style object, but dont't try to create it if it doesn't exist\r\n\t\t\t\t\t\torigStyle = jsc.getData(elm, 'origStyle');\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (origStyle && origStyle.hasOwnProperty(prop)) {\r\n\t\t\t\t\t\t// we have property's original value -> use it\r\n\t\t\t\t\t\tsetVal = origStyle[prop];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// setting a property value\r\n\r\n\t\t\t\t\tif (reversible) {\r\n\t\t\t\t\t\tif (!origStyle) {\r\n\t\t\t\t\t\t\t// get the original style object and if it doesn't exist, create it\r\n\t\t\t\t\t\t\torigStyle = jsc.getData(elm, 'origStyle', {});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!origStyle.hasOwnProperty(prop)) {\r\n\t\t\t\t\t\t\t// original property value not yet stored -> store it\r\n\t\t\t\t\t\t\torigStyle[prop] = elm.style[prop];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tsetVal = styles[prop];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (setVal !== null) {\r\n\t\t\t\t\telm.style.setProperty(prop, setVal, priority);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\thexColor : function (r, g, b) {\r\n\t\treturn '#' + (\r\n\t\t\t('0' + Math.round(r).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(g).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(b).toString(16)).substr(-2)\r\n\t\t).toUpperCase();\r\n\t},\r\n\r\n\r\n\thexaColor : function (r, g, b, a) {\r\n\t\treturn '#' + (\r\n\t\t\t('0' + Math.round(r).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(g).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(b).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(a * 255).toString(16)).substr(-2)\r\n\t\t).toUpperCase();\r\n\t},\r\n\r\n\r\n\trgbColor : function (r, g, b) {\r\n\t\treturn 'rgb(' +\r\n\t\t\tMath.round(r) + ',' +\r\n\t\t\tMath.round(g) + ',' +\r\n\t\t\tMath.round(b) +\r\n\t\t')';\r\n\t},\r\n\r\n\r\n\trgbaColor : function (r, g, b, a) {\r\n\t\treturn 'rgba(' +\r\n\t\t\tMath.round(r) + ',' +\r\n\t\t\tMath.round(g) + ',' +\r\n\t\t\tMath.round(b) + ',' +\r\n\t\t\t(Math.round((a===undefined || a===null ? 1 : a) * 100) / 100) +\r\n\t\t')';\r\n\t},\r\n\r\n\r\n\tlinearGradient : (function () {\r\n\r\n\t\tfunction getFuncName () {\r\n\t\t\tvar stdName = 'linear-gradient';\r\n\t\t\tvar prefixes = ['', '-webkit-', '-moz-', '-o-', '-ms-'];\r\n\t\t\tvar helper = window.document.createElement('div');\r\n\r\n\t\t\tfor (var i = 0; i < prefixes.length; i += 1) {\r\n\t\t\t\tvar tryFunc = prefixes[i] + stdName;\r\n\t\t\t\tvar tryVal = tryFunc + '(to right, rgba(0,0,0,0), rgba(0,0,0,0))';\r\n\r\n\t\t\t\thelper.style.background = tryVal;\r\n\t\t\t\tif (helper.style.background) { // CSS background successfully set -> function name is supported\r\n\t\t\t\t\treturn tryFunc;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn stdName; // fallback to standard 'linear-gradient' without vendor prefix\r\n\t\t}\r\n\r\n\t\tvar funcName = getFuncName();\r\n\r\n\t\treturn function () {\r\n\t\t\treturn funcName + '(' + Array.prototype.join.call(arguments, ', ') + ')';\r\n\t\t};\r\n\r\n\t})(),\r\n\r\n\r\n\tsetBorderRadius : function (elm, value) {\r\n\t\tjsc.setStyle(elm, {'border-radius' : value || '0'});\r\n\t},\r\n\r\n\r\n\tsetBoxShadow : function (elm, value) {\r\n\t\tjsc.setStyle(elm, {'box-shadow': value || 'none'});\r\n\t},\r\n\r\n\r\n\tgetElementPos : function (e, relativeToViewport) {\r\n\t\tvar x=0, y=0;\r\n\t\tvar rect = e.getBoundingClientRect();\r\n\t\tx = rect.left;\r\n\t\ty = rect.top;\r\n\t\tif (!relativeToViewport) {\r\n\t\t\tvar viewPos = jsc.getViewPos();\r\n\t\t\tx += viewPos[0];\r\n\t\t\ty += viewPos[1];\r\n\t\t}\r\n\t\treturn [x, y];\r\n\t},\r\n\r\n\r\n\tgetElementSize : function (e) {\r\n\t\treturn [e.offsetWidth, e.offsetHeight];\r\n\t},\r\n\r\n\r\n\t// get pointer's X/Y coordinates relative to viewport\r\n\tgetAbsPointerPos : function (e) {\r\n\t\tvar x = 0, y = 0;\r\n\t\tif (typeof e.changedTouches !== 'undefined' && e.changedTouches.length) {\r\n\t\t\t// touch devices\r\n\t\t\tx = e.changedTouches[0].clientX;\r\n\t\t\ty = e.changedTouches[0].clientY;\r\n\t\t} else if (typeof e.clientX === 'number') {\r\n\t\t\tx = e.clientX;\r\n\t\t\ty = e.clientY;\r\n\t\t}\r\n\t\treturn { x: x, y: y };\r\n\t},\r\n\r\n\r\n\t// get pointer's X/Y coordinates relative to target element\r\n\tgetRelPointerPos : function (e) {\r\n\t\tvar target = e.target || e.srcElement;\r\n\t\tvar targetRect = target.getBoundingClientRect();\r\n\r\n\t\tvar x = 0, y = 0;\r\n\r\n\t\tvar clientX = 0, clientY = 0;\r\n\t\tif (typeof e.changedTouches !== 'undefined' && e.changedTouches.length) {\r\n\t\t\t// touch devices\r\n\t\t\tclientX = e.changedTouches[0].clientX;\r\n\t\t\tclientY = e.changedTouches[0].clientY;\r\n\t\t} else if (typeof e.clientX === 'number') {\r\n\t\t\tclientX = e.clientX;\r\n\t\t\tclientY = e.clientY;\r\n\t\t}\r\n\r\n\t\tx = clientX - targetRect.left;\r\n\t\ty = clientY - targetRect.top;\r\n\t\treturn { x: x, y: y };\r\n\t},\r\n\r\n\r\n\tgetViewPos : function () {\r\n\t\tvar doc = window.document.documentElement;\r\n\t\treturn [\r\n\t\t\t(window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0),\r\n\t\t\t(window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0)\r\n\t\t];\r\n\t},\r\n\r\n\r\n\tgetViewSize : function () {\r\n\t\tvar doc = window.document.documentElement;\r\n\t\treturn [\r\n\t\t\t(window.innerWidth || doc.clientWidth),\r\n\t\t\t(window.innerHeight || doc.clientHeight),\r\n\t\t];\r\n\t},\r\n\r\n\r\n\t// r: 0-255\r\n\t// g: 0-255\r\n\t// b: 0-255\r\n\t//\r\n\t// returns: [ 0-360, 0-100, 0-100 ]\r\n\t//\r\n\tRGB_HSV : function (r, g, b) {\r\n\t\tr /= 255;\r\n\t\tg /= 255;\r\n\t\tb /= 255;\r\n\t\tvar n = Math.min(Math.min(r,g),b);\r\n\t\tvar v = Math.max(Math.max(r,g),b);\r\n\t\tvar m = v - n;\r\n\t\tif (m === 0) { return [ null, 0, 100 * v ]; }\r\n\t\tvar h = r===n ? 3+(b-g)/m : (g===n ? 5+(r-b)/m : 1+(g-r)/m);\r\n\t\treturn [\r\n\t\t\t60 * (h===6?0:h),\r\n\t\t\t100 * (m/v),\r\n\t\t\t100 * v\r\n\t\t];\r\n\t},\r\n\r\n\r\n\t// h: 0-360\r\n\t// s: 0-100\r\n\t// v: 0-100\r\n\t//\r\n\t// returns: [ 0-255, 0-255, 0-255 ]\r\n\t//\r\n\tHSV_RGB : function (h, s, v) {\r\n\t\tvar u = 255 * (v / 100);\r\n\r\n\t\tif (h === null) {\r\n\t\t\treturn [ u, u, u ];\r\n\t\t}\r\n\r\n\t\th /= 60;\r\n\t\ts /= 100;\r\n\r\n\t\tvar i = Math.floor(h);\r\n\t\tvar f = i%2 ? h-i : 1-(h-i);\r\n\t\tvar m = u * (1 - s);\r\n\t\tvar n = u * (1 - s * f);\r\n\t\tswitch (i) {\r\n\t\t\tcase 6:\r\n\t\t\tcase 0: return [u,n,m];\r\n\t\t\tcase 1: return [n,u,m];\r\n\t\t\tcase 2: return [m,u,n];\r\n\t\t\tcase 3: return [m,n,u];\r\n\t\t\tcase 4: return [n,m,u];\r\n\t\t\tcase 5: return [u,m,n];\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tparseColorString : function (str) {\r\n\t\tvar ret = {\r\n\t\t\trgba: null,\r\n\t\t\tformat: null // 'hex' | 'hexa' | 'rgb' | 'rgba'\r\n\t\t};\r\n\r\n\t\tvar m;\r\n\r\n\t\tif (m = str.match(/^\\W*([0-9A-F]{3,8})\\W*$/i)) {\r\n\t\t\t// HEX notation\r\n\r\n\t\t\tif (m[1].length === 8) {\r\n\t\t\t\t// 8-char notation (= with alpha)\r\n\t\t\t\tret.format = 'hexa';\r\n\t\t\t\tret.rgba = [\r\n\t\t\t\t\tparseInt(m[1].substr(0,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(2,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(4,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(6,2),16) / 255\r\n\t\t\t\t];\r\n\r\n\t\t\t} else if (m[1].length === 6) {\r\n\t\t\t\t// 6-char notation\r\n\t\t\t\tret.format = 'hex';\r\n\t\t\t\tret.rgba = [\r\n\t\t\t\t\tparseInt(m[1].substr(0,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(2,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(4,2),16),\r\n\t\t\t\t\tnull\r\n\t\t\t\t];\r\n\r\n\t\t\t} else if (m[1].length === 3) {\r\n\t\t\t\t// 3-char notation\r\n\t\t\t\tret.format = 'hex';\r\n\t\t\t\tret.rgba = [\r\n\t\t\t\t\tparseInt(m[1].charAt(0) + m[1].charAt(0),16),\r\n\t\t\t\t\tparseInt(m[1].charAt(1) + m[1].charAt(1),16),\r\n\t\t\t\t\tparseInt(m[1].charAt(2) + m[1].charAt(2),16),\r\n\t\t\t\t\tnull\r\n\t\t\t\t];\r\n\r\n\t\t\t} else {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\treturn ret;\r\n\t\t}\r\n\r\n\t\tif (m = str.match(/^\\W*rgba?\\(([^)]*)\\)\\W*$/i)) {\r\n\t\t\t// rgb(...) or rgba(...) notation\r\n\r\n\t\t\tvar par = m[1].split(',');\r\n\t\t\tvar re = /^\\s*(\\d+|\\d*\\.\\d+|\\d+\\.\\d*)\\s*$/;\r\n\t\t\tvar mR, mG, mB, mA;\r\n\t\t\tif (\r\n\t\t\t\tpar.length >= 3 &&\r\n\t\t\t\t(mR = par[0].match(re)) &&\r\n\t\t\t\t(mG = par[1].match(re)) &&\r\n\t\t\t\t(mB = par[2].match(re))\r\n\t\t\t) {\r\n\t\t\t\tret.format = 'rgb';\r\n\t\t\t\tret.rgba = [\r\n\t\t\t\t\tparseFloat(mR[1]) || 0,\r\n\t\t\t\t\tparseFloat(mG[1]) || 0,\r\n\t\t\t\t\tparseFloat(mB[1]) || 0,\r\n\t\t\t\t\tnull\r\n\t\t\t\t];\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tpar.length >= 4 &&\r\n\t\t\t\t\t(mA = par[3].match(re))\r\n\t\t\t\t) {\r\n\t\t\t\t\tret.format = 'rgba';\r\n\t\t\t\t\tret.rgba[3] = parseFloat(mA[1]) || 0;\r\n\t\t\t\t}\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\r\n\tparsePaletteValue : function (mixed) {\r\n\t\tvar vals = [];\r\n\r\n\t\tif (typeof mixed === 'string') { // input is a string of space separated color values\r\n\t\t\t// rgb() and rgba() may contain spaces too, so let's find all color values by regex\r\n\t\t\tmixed.replace(/#[0-9A-F]{3}([0-9A-F]{3})?|rgba?\\(([^)]*)\\)/ig, function (val) {\r\n\t\t\t\tvals.push(val);\r\n\t\t\t});\r\n\t\t} else if (Array.isArray(mixed)) { // input is an array of color values\r\n\t\t\tvals = mixed;\r\n\t\t}\r\n\r\n\t\t// convert all values into uniform color format\r\n\r\n\t\tvar colors = [];\r\n\r\n\t\tfor (var i = 0; i < vals.length; i++) {\r\n\t\t\tvar color = jsc.parseColorString(vals[i]);\r\n\t\t\tif (color) {\r\n\t\t\t\tcolors.push(color);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn colors;\r\n\t},\r\n\r\n\r\n\tcontainsTranparentColor : function (colors) {\r\n\t\tfor (var i = 0; i < colors.length; i++) {\r\n\t\t\tvar a = colors[i].rgba[3];\r\n\t\t\tif (a !== null && a < 1.0) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\r\n\tisAlphaFormat : function (format) {\r\n\t\tswitch (format.toLowerCase()) {\r\n\t\tcase 'hexa':\r\n\t\tcase 'rgba':\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\r\n\t// Canvas scaling for retina displays\r\n\t//\r\n\t// adapted from https://www.html5rocks.com/en/tutorials/canvas/hidpi/\r\n\t//\r\n\tscaleCanvasForHighDPR : function (canvas) {\r\n\t\tvar dpr = window.devicePixelRatio || 1;\r\n\t\tcanvas.width *= dpr;\r\n\t\tcanvas.height *= dpr;\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\t\tctx.scale(dpr, dpr);\r\n\t},\r\n\r\n\r\n\tgenColorPreviewCanvas : function (color, separatorPos, specWidth, scaleForHighDPR) {\r\n\r\n\t\tvar sepW = Math.round(jsc.pub.previewSeparator.length);\r\n\t\tvar sqSize = jsc.pub.chessboardSize;\r\n\t\tvar sqColor1 = jsc.pub.chessboardColor1;\r\n\t\tvar sqColor2 = jsc.pub.chessboardColor2;\r\n\r\n\t\tvar cWidth = specWidth ? specWidth : sqSize * 2;\r\n\t\tvar cHeight = sqSize * 2;\r\n\r\n\t\tvar canvas = jsc.createEl('canvas');\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\r\n\t\tcanvas.width = cWidth;\r\n\t\tcanvas.height = cHeight;\r\n\t\tif (scaleForHighDPR) {\r\n\t\t\tjsc.scaleCanvasForHighDPR(canvas);\r\n\t\t}\r\n\r\n\t\t// transparency chessboard - background\r\n\t\tctx.fillStyle = sqColor1;\r\n\t\tctx.fillRect(0, 0, cWidth, cHeight);\r\n\r\n\t\t// transparency chessboard - squares\r\n\t\tctx.fillStyle = sqColor2;\r\n\t\tfor (var x = 0; x < cWidth; x += sqSize * 2) {\r\n\t\t\tctx.fillRect(x, 0, sqSize, sqSize);\r\n\t\t\tctx.fillRect(x + sqSize, sqSize, sqSize, sqSize);\r\n\t\t}\r\n\r\n\t\tif (color) {\r\n\t\t\t// actual color in foreground\r\n\t\t\tctx.fillStyle = color;\r\n\t\t\tctx.fillRect(0, 0, cWidth, cHeight);\r\n\t\t}\r\n\r\n\t\tvar start = null;\r\n\t\tswitch (separatorPos) {\r\n\t\t\tcase 'left':\r\n\t\t\t\tstart = 0;\r\n\t\t\t\tctx.clearRect(0, 0, sepW/2, cHeight);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'right':\r\n\t\t\t\tstart = cWidth - sepW;\r\n\t\t\t\tctx.clearRect(cWidth - (sepW/2), 0, sepW/2, cHeight);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tif (start !== null) {\r\n\t\t\tctx.lineWidth = 1;\r\n\t\t\tfor (var i = 0; i < jsc.pub.previewSeparator.length; i += 1) {\r\n\t\t\t\tctx.beginPath();\r\n\t\t\t\tctx.strokeStyle = jsc.pub.previewSeparator[i];\r\n\t\t\t\tctx.moveTo(0.5 + start + i, 0);\r\n\t\t\t\tctx.lineTo(0.5 + start + i, cHeight);\r\n\t\t\t\tctx.stroke();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tcanvas: canvas,\r\n\t\t\twidth: cWidth,\r\n\t\t\theight: cHeight,\r\n\t\t};\r\n\t},\r\n\r\n\r\n\t// if position or width is not set => fill the entire element (0%-100%)\r\n\tgenColorPreviewGradient : function (color, position, width) {\r\n\t\tvar params = [];\r\n\r\n\t\tif (position && width) {\r\n\t\t\tparams = [\r\n\t\t\t\t'to ' + {'left':'right', 'right':'left'}[position],\r\n\t\t\t\tcolor + ' 0%',\r\n\t\t\t\tcolor + ' ' + width + 'px',\r\n\t\t\t\t'rgba(0,0,0,0) ' + (width + 1) + 'px',\r\n\t\t\t\t'rgba(0,0,0,0) 100%',\r\n\t\t\t];\r\n\t\t} else {\r\n\t\t\tparams = [\r\n\t\t\t\t'to right',\r\n\t\t\t\tcolor + ' 0%',\r\n\t\t\t\tcolor + ' 100%',\r\n\t\t\t];\r\n\t\t}\r\n\r\n\t\treturn jsc.linearGradient.apply(this, params);\r\n\t},\r\n\r\n\r\n\tredrawPosition : function () {\r\n\r\n\t\tif (!jsc.picker || !jsc.picker.owner) {\r\n\t\t\treturn; // picker is not shown\r\n\t\t}\r\n\r\n\t\tvar thisObj = jsc.picker.owner;\r\n\r\n\t\tvar tp, vp;\r\n\r\n\t\tif (thisObj.fixed) {\r\n\t\t\t// Fixed elements are positioned relative to viewport,\r\n\t\t\t// therefore we can ignore the scroll offset\r\n\t\t\ttp = jsc.getElementPos(thisObj.targetElement, true); // target pos\r\n\t\t\tvp = [0, 0]; // view pos\r\n\t\t} else {\r\n\t\t\ttp = jsc.getElementPos(thisObj.targetElement); // target pos\r\n\t\t\tvp = jsc.getViewPos(); // view pos\r\n\t\t}\r\n\r\n\t\tvar ts = jsc.getElementSize(thisObj.targetElement); // target size\r\n\t\tvar vs = jsc.getViewSize(); // view size\r\n\t\tvar pd = jsc.getPickerDims(thisObj);\r\n\t\tvar ps = [pd.borderW, pd.borderH]; // picker outer size\r\n\t\tvar a, b, c;\r\n\t\tswitch (thisObj.position.toLowerCase()) {\r\n\t\t\tcase 'left': a=1; b=0; c=-1; break;\r\n\t\t\tcase 'right':a=1; b=0; c=1; break;\r\n\t\t\tcase 'top': a=0; b=1; c=-1; break;\r\n\t\t\tdefault: a=0; b=1; c=1; break;\r\n\t\t}\r\n\t\tvar l = (ts[b]+ps[b])/2;\r\n\r\n\t\t// compute picker position\r\n\t\tif (!thisObj.smartPosition) {\r\n\t\t\tvar pp = [\r\n\t\t\t\ttp[a],\r\n\t\t\t\ttp[b]+ts[b]-l+l*c\r\n\t\t\t];\r\n\t\t} else {\r\n\t\t\tvar pp = [\r\n\t\t\t\t-vp[a]+tp[a]+ps[a] > vs[a] ?\r\n\t\t\t\t\t(-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) :\r\n\t\t\t\t\ttp[a],\r\n\t\t\t\t-vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ?\r\n\t\t\t\t\t(-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) :\r\n\t\t\t\t\t(tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c)\r\n\t\t\t];\r\n\t\t}\r\n\r\n\t\tvar x = pp[a];\r\n\t\tvar y = pp[b];\r\n\t\tvar positionValue = thisObj.fixed ? 'fixed' : 'absolute';\r\n\t\tvar contractShadow =\r\n\t\t\t(pp[0] + ps[0] > tp[0] || pp[0] < tp[0] + ts[0]) &&\r\n\t\t\t(pp[1] + ps[1] < tp[1] + ts[1]);\r\n\r\n\t\tjsc._drawPosition(thisObj, x, y, positionValue, contractShadow);\r\n\t},\r\n\r\n\r\n\t_drawPosition : function (thisObj, x, y, positionValue, contractShadow) {\r\n\t\tvar vShadow = contractShadow ? 0 : thisObj.shadowBlur; // px\r\n\r\n\t\tjsc.picker.wrap.style.position = positionValue;\r\n\t\tjsc.picker.wrap.style.left = x + 'px';\r\n\t\tjsc.picker.wrap.style.top = y + 'px';\r\n\r\n\t\tjsc.setBoxShadow(\r\n\t\t\tjsc.picker.boxS,\r\n\t\t\tthisObj.shadow ?\r\n\t\t\t\tnew jsc.BoxShadow(0, vShadow, thisObj.shadowBlur, 0, thisObj.shadowColor) :\r\n\t\t\t\tnull);\r\n\t},\r\n\r\n\r\n\tgetPickerDims : function (thisObj) {\r\n\t\tvar w = 2 * thisObj.controlBorderWidth + thisObj.width;\r\n\t\tvar h = 2 * thisObj.controlBorderWidth + thisObj.height;\r\n\r\n\t\tvar sliderSpace = 2 * thisObj.controlBorderWidth + 2 * jsc.getControlPadding(thisObj) + thisObj.sliderSize;\r\n\r\n\t\tif (jsc.getSliderChannel(thisObj)) {\r\n\t\t\tw += sliderSpace;\r\n\t\t}\r\n\t\tif (thisObj.hasAlphaChannel()) {\r\n\t\t\tw += sliderSpace;\r\n\t\t}\r\n\r\n\t\tvar pal = jsc.getPaletteDims(thisObj, w);\r\n\r\n\t\tif (pal.height) {\r\n\t\t\th += pal.height + thisObj.padding;\r\n\t\t}\r\n\t\tif (thisObj.closeButton) {\r\n\t\t\th += 2 * thisObj.controlBorderWidth + thisObj.padding + thisObj.buttonHeight;\r\n\t\t}\r\n\r\n\t\tvar pW = w + (2 * thisObj.padding);\r\n\t\tvar pH = h + (2 * thisObj.padding);\r\n\r\n\t\treturn {\r\n\t\t\tcontentW: w,\r\n\t\t\tcontentH: h,\r\n\t\t\tpaddedW: pW,\r\n\t\t\tpaddedH: pH,\r\n\t\t\tborderW: pW + (2 * thisObj.borderWidth),\r\n\t\t\tborderH: pH + (2 * thisObj.borderWidth),\r\n\t\t\tpalette: pal,\r\n\t\t};\r\n\t},\r\n\r\n\r\n\tgetPaletteDims : function (thisObj, width) {\r\n\t\tvar cols = 0, rows = 0, cellW = 0, cellH = 0, height = 0;\r\n\t\tvar sampleCount = thisObj._palette ? thisObj._palette.length : 0;\r\n\r\n\t\tif (sampleCount) {\r\n\t\t\tcols = thisObj.paletteCols;\r\n\t\t\trows = cols > 0 ? Math.ceil(sampleCount / cols) : 0;\r\n\r\n\t\t\t// color sample's dimensions (includes border)\r\n\t\t\tcellW = Math.max(1, Math.floor((width - ((cols - 1) * thisObj.paletteSpacing)) / cols));\r\n\t\t\tcellH = thisObj.paletteHeight ? Math.min(thisObj.paletteHeight, cellW) : cellW;\r\n\t\t}\r\n\r\n\t\tif (rows) {\r\n\t\t\theight =\r\n\t\t\t\trows * cellH +\r\n\t\t\t\t(rows - 1) * thisObj.paletteSpacing;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tcols: cols,\r\n\t\t\trows: rows,\r\n\t\t\tcellW: cellW,\r\n\t\t\tcellH: cellH,\r\n\t\t\twidth: width,\r\n\t\t\theight: height,\r\n\t\t};\r\n\t},\r\n\r\n\r\n\tgetControlPadding : function (thisObj) {\r\n\t\treturn Math.max(\r\n\t\t\tthisObj.padding / 2,\r\n\t\t\t(2 * thisObj.pointerBorderWidth + thisObj.pointerThickness) - thisObj.controlBorderWidth\r\n\t\t);\r\n\t},\r\n\r\n\r\n\tgetPadYChannel : function (thisObj) {\r\n\t\tswitch (thisObj.mode.charAt(1).toLowerCase()) {\r\n\t\t\tcase 'v': return 'v'; break;\r\n\t\t}\r\n\t\treturn 's';\r\n\t},\r\n\r\n\r\n\tgetSliderChannel : function (thisObj) {\r\n\t\tif (thisObj.mode.length > 2) {\r\n\t\t\tswitch (thisObj.mode.charAt(2).toLowerCase()) {\r\n\t\t\t\tcase 's': return 's'; break;\r\n\t\t\t\tcase 'v': return 'v'; break;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t},\r\n\r\n\r\n\t// calls function specified in picker's property\r\n\ttriggerCallback : function (thisObj, prop) {\r\n\t\tif (!thisObj[prop]) {\r\n\t\t\treturn; // callback func not specified\r\n\t\t}\r\n\t\tvar callback = null;\r\n\r\n\t\tif (typeof thisObj[prop] === 'string') {\r\n\t\t\t// string with code\r\n\t\t\ttry {\r\n\t\t\t\tcallback = new Function (thisObj[prop]);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tconsole.error(e);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// function\r\n\t\t\tcallback = thisObj[prop];\r\n\t\t}\r\n\r\n\t\tif (callback) {\r\n\t\t\tcallback.call(thisObj);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t// Triggers a color change related event(s) on all picker instances.\r\n\t// It is possible to specify multiple events separated with a space.\r\n\ttriggerGlobal : function (eventNames) {\r\n\t\tvar inst = jsc.getInstances();\r\n\t\tfor (var i = 0; i < inst.length; i += 1) {\r\n\t\t\tinst[i].trigger(eventNames);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t_pointerMoveEvent : {\r\n\t\tmouse: 'mousemove',\r\n\t\ttouch: 'touchmove'\r\n\t},\r\n\t_pointerEndEvent : {\r\n\t\tmouse: 'mouseup',\r\n\t\ttouch: 'touchend'\r\n\t},\r\n\r\n\r\n\t_pointerOrigin : null,\r\n\t_capturedTarget : null,\r\n\r\n\r\n\tonDocumentKeyUp : function (e) {\r\n\t\tif (['Tab', 'Escape'].indexOf(jsc.eventKey(e)) !== -1) {\r\n\t\t\tif (jsc.picker && jsc.picker.owner) {\r\n\t\t\t\tjsc.picker.owner.tryHide();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonWindowResize : function (e) {\r\n\t\tjsc.redrawPosition();\r\n\t},\r\n\r\n\r\n\tonWindowScroll : function (e) {\r\n\t\tjsc.redrawPosition();\r\n\t},\r\n\r\n\r\n\tonParentScroll : function (e) {\r\n\t\t// hide the picker when one of the parent elements is scrolled\r\n\t\tif (jsc.picker && jsc.picker.owner) {\r\n\t\t\tjsc.picker.owner.tryHide();\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonDocumentMouseDown : function (e) {\r\n\t\tvar target = e.target || e.srcElement;\r\n\r\n\t\tif (target.jscolor && target.jscolor instanceof jsc.pub) { // clicked targetElement -> show picker\r\n\t\t\tif (target.jscolor.showOnClick && !target.disabled) {\r\n\t\t\t\ttarget.jscolor.show();\r\n\t\t\t}\r\n\t\t} else if (jsc.getData(target, 'gui')) { // clicked jscolor's GUI element\r\n\t\t\tvar control = jsc.getData(target, 'control');\r\n\t\t\tif (control) {\r\n\t\t\t\t// jscolor's control\r\n\t\t\t\tjsc.onControlPointerStart(e, target, jsc.getData(target, 'control'), 'mouse');\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// mouse is outside the picker's controls -> hide the color picker!\r\n\t\t\tif (jsc.picker && jsc.picker.owner) {\r\n\t\t\t\tjsc.picker.owner.tryHide();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonPickerTouchStart : function (e) {\r\n\t\tvar target = e.target || e.srcElement;\r\n\r\n\t\tif (jsc.getData(target, 'control')) {\r\n\t\t\tjsc.onControlPointerStart(e, target, jsc.getData(target, 'control'), 'touch');\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonControlPointerStart : function (e, target, controlName, pointerType) {\r\n\t\tvar thisObj = jsc.getData(target, 'instance');\r\n\r\n\t\tjsc.preventDefault(e);\r\n\t\tjsc.captureTarget(target);\r\n\r\n\t\tvar registerDragEvents = function (doc, offset) {\r\n\t\t\tjsc.attachGroupEvent('drag', doc, jsc._pointerMoveEvent[pointerType],\r\n\t\t\t\tjsc.onDocumentPointerMove(e, target, controlName, pointerType, offset));\r\n\t\t\tjsc.attachGroupEvent('drag', doc, jsc._pointerEndEvent[pointerType],\r\n\t\t\t\tjsc.onDocumentPointerEnd(e, target, controlName, pointerType));\r\n\t\t};\r\n\r\n\t\tregisterDragEvents(window.document, [0, 0]);\r\n\r\n\t\tif (window.parent && window.frameElement) {\r\n\t\t\tvar rect = window.frameElement.getBoundingClientRect();\r\n\t\t\tvar ofs = [-rect.left, -rect.top];\r\n\t\t\tregisterDragEvents(window.parent.window.document, ofs);\r\n\t\t}\r\n\r\n\t\tvar abs = jsc.getAbsPointerPos(e);\r\n\t\tvar rel = jsc.getRelPointerPos(e);\r\n\t\tjsc._pointerOrigin = {\r\n\t\t\tx: abs.x - rel.x,\r\n\t\t\ty: abs.y - rel.y\r\n\t\t};\r\n\r\n\t\tswitch (controlName) {\r\n\t\tcase 'pad':\r\n\t\t\t// if the value slider is at the bottom, move it up\r\n\t\t\tif (jsc.getSliderChannel(thisObj) === 'v' && thisObj.channels.v === 0) {\r\n\t\t\t\tthisObj.fromHSVA(null, null, 100, null);\r\n\t\t\t}\r\n\t\t\tjsc.setPad(thisObj, e, 0, 0);\r\n\t\t\tbreak;\r\n\r\n\t\tcase 'sld':\r\n\t\t\tjsc.setSld(thisObj, e, 0);\r\n\t\t\tbreak;\r\n\r\n\t\tcase 'asld':\r\n\t\t\tjsc.setASld(thisObj, e, 0);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tthisObj.trigger('input');\r\n\t},\r\n\r\n\r\n\tonDocumentPointerMove : function (e, target, controlName, pointerType, offset) {\r\n\t\treturn function (e) {\r\n\t\t\tvar thisObj = jsc.getData(target, 'instance');\r\n\t\t\tswitch (controlName) {\r\n\t\t\tcase 'pad':\r\n\t\t\t\tjsc.setPad(thisObj, e, offset[0], offset[1]);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'sld':\r\n\t\t\t\tjsc.setSld(thisObj, e, offset[1]);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'asld':\r\n\t\t\t\tjsc.setASld(thisObj, e, offset[1]);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tthisObj.trigger('input');\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonDocumentPointerEnd : function (e, target, controlName, pointerType) {\r\n\t\treturn function (e) {\r\n\t\t\tvar thisObj = jsc.getData(target, 'instance');\r\n\t\t\tjsc.detachGroupEvents('drag');\r\n\t\t\tjsc.releaseTarget();\r\n\r\n\t\t\t// Always trigger changes AFTER detaching outstanding mouse handlers,\r\n\t\t\t// in case some color change that occured in user-defined onChange/onInput handler\r\n\t\t\t// intruded into current mouse events\r\n\t\t\tthisObj.trigger('input');\r\n\t\t\tthisObj.trigger('change');\r\n\t\t};\r\n\t},\r\n\r\n\r\n\tonPaletteSampleClick : function (e) {\r\n\t\tvar target = e.currentTarget;\r\n\t\tvar thisObj = jsc.getData(target, 'instance');\r\n\t\tvar color = jsc.getData(target, 'color');\r\n\r\n\t\t// when format is flexible, use the original format of this color sample\r\n\t\tif (thisObj.format.toLowerCase() === 'any') {\r\n\t\t\tthisObj._setFormat(color.format); // adapt format\r\n\t\t\tif (!jsc.isAlphaFormat(thisObj.getFormat())) {\r\n\t\t\t\tcolor.rgba[3] = 1.0; // when switching to a format that doesn't support alpha, set full opacity\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// if this color doesn't specify alpha, use alpha of 1.0 (if applicable)\r\n\t\tif (color.rgba[3] === null) {\r\n\t\t\tif (thisObj.paletteSetsAlpha === true || (thisObj.paletteSetsAlpha === 'auto' && thisObj._paletteHasTransparency)) {\r\n\t\t\t\tcolor.rgba[3] = 1.0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthisObj.fromRGBA.apply(thisObj, color.rgba);\r\n\r\n\t\tthisObj.trigger('input');\r\n\t\tthisObj.trigger('change');\r\n\r\n\t\tif (thisObj.hideOnPaletteClick) {\r\n\t\t\tthisObj.hide();\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tsetPad : function (thisObj, e, ofsX, ofsY) {\r\n\t\tvar pointerAbs = jsc.getAbsPointerPos(e);\r\n\t\tvar x = ofsX + pointerAbs.x - jsc._pointerOrigin.x - thisObj.padding - thisObj.controlBorderWidth;\r\n\t\tvar y = ofsY + pointerAbs.y - jsc._pointerOrigin.y - thisObj.padding - thisObj.controlBorderWidth;\r\n\r\n\t\tvar xVal = x * (360 / (thisObj.width - 1));\r\n\t\tvar yVal = 100 - (y * (100 / (thisObj.height - 1)));\r\n\r\n\t\tswitch (jsc.getPadYChannel(thisObj)) {\r\n\t\tcase 's': thisObj.fromHSVA(xVal, yVal, null, null); break;\r\n\t\tcase 'v': thisObj.fromHSVA(xVal, null, yVal, null); break;\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tsetSld : function (thisObj, e, ofsY) {\r\n\t\tvar pointerAbs = jsc.getAbsPointerPos(e);\r\n\t\tvar y = ofsY + pointerAbs.y - jsc._pointerOrigin.y - thisObj.padding - thisObj.controlBorderWidth;\r\n\t\tvar yVal = 100 - (y * (100 / (thisObj.height - 1)));\r\n\r\n\t\tswitch (jsc.getSliderChannel(thisObj)) {\r\n\t\tcase 's': thisObj.fromHSVA(null, yVal, null, null); break;\r\n\t\tcase 'v': thisObj.fromHSVA(null, null, yVal, null); break;\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tsetASld : function (thisObj, e, ofsY) {\r\n\t\tvar pointerAbs = jsc.getAbsPointerPos(e);\r\n\t\tvar y = ofsY + pointerAbs.y - jsc._pointerOrigin.y - thisObj.padding - thisObj.controlBorderWidth;\r\n\t\tvar yVal = 1.0 - (y * (1.0 / (thisObj.height - 1)));\r\n\r\n\t\tif (yVal < 1.0) {\r\n\t\t\t// if format is flexible and the current format doesn't support alpha, switch to a suitable one\r\n\t\t\tvar fmt = thisObj.getFormat();\r\n\t\t\tif (thisObj.format.toLowerCase() === 'any' && !jsc.isAlphaFormat(fmt)) {\r\n\t\t\t\tthisObj._setFormat(fmt === 'hex' ? 'hexa' : 'rgba');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthisObj.fromHSVA(null, null, null, yVal);\r\n\t},\r\n\r\n\r\n\tcreatePadCanvas : function () {\r\n\r\n\t\tvar ret = {\r\n\t\t\telm: null,\r\n\t\t\tdraw: null\r\n\t\t};\r\n\r\n\t\tvar canvas = jsc.createEl('canvas');\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\r\n\t\tvar drawFunc = function (width, height, type) {\r\n\t\t\tcanvas.width = width;\r\n\t\t\tcanvas.height = height;\r\n\r\n\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tvar hGrad = ctx.createLinearGradient(0, 0, canvas.width, 0);\r\n\t\t\thGrad.addColorStop(0 / 6, '#F00');\r\n\t\t\thGrad.addColorStop(1 / 6, '#FF0');\r\n\t\t\thGrad.addColorStop(2 / 6, '#0F0');\r\n\t\t\thGrad.addColorStop(3 / 6, '#0FF');\r\n\t\t\thGrad.addColorStop(4 / 6, '#00F');\r\n\t\t\thGrad.addColorStop(5 / 6, '#F0F');\r\n\t\t\thGrad.addColorStop(6 / 6, '#F00');\r\n\r\n\t\t\tctx.fillStyle = hGrad;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tvar vGrad = ctx.createLinearGradient(0, 0, 0, canvas.height);\r\n\t\t\tswitch (type.toLowerCase()) {\r\n\t\t\tcase 's':\r\n\t\t\t\tvGrad.addColorStop(0, 'rgba(255,255,255,0)');\r\n\t\t\t\tvGrad.addColorStop(1, 'rgba(255,255,255,1)');\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'v':\r\n\t\t\t\tvGrad.addColorStop(0, 'rgba(0,0,0,0)');\r\n\t\t\t\tvGrad.addColorStop(1, 'rgba(0,0,0,1)');\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tctx.fillStyle = vGrad;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\t\t};\r\n\r\n\t\tret.elm = canvas;\r\n\t\tret.draw = drawFunc;\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\r\n\tcreateSliderGradient : function () {\r\n\r\n\t\tvar ret = {\r\n\t\t\telm: null,\r\n\t\t\tdraw: null\r\n\t\t};\r\n\r\n\t\tvar canvas = jsc.createEl('canvas');\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\r\n\t\tvar drawFunc = function (width, height, color1, color2) {\r\n\t\t\tcanvas.width = width;\r\n\t\t\tcanvas.height = height;\r\n\r\n\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tvar grad = ctx.createLinearGradient(0, 0, 0, canvas.height);\r\n\t\t\tgrad.addColorStop(0, color1);\r\n\t\t\tgrad.addColorStop(1, color2);\r\n\r\n\t\t\tctx.fillStyle = grad;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\t\t};\r\n\r\n\t\tret.elm = canvas;\r\n\t\tret.draw = drawFunc;\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\r\n\tcreateASliderGradient : function () {\r\n\r\n\t\tvar ret = {\r\n\t\t\telm: null,\r\n\t\t\tdraw: null\r\n\t\t};\r\n\r\n\t\tvar canvas = jsc.createEl('canvas');\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\r\n\t\tvar drawFunc = function (width, height, color) {\r\n\t\t\tcanvas.width = width;\r\n\t\t\tcanvas.height = height;\r\n\r\n\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tvar sqSize = canvas.width / 2;\r\n\t\t\tvar sqColor1 = jsc.pub.chessboardColor1;\r\n\t\t\tvar sqColor2 = jsc.pub.chessboardColor2;\r\n\r\n\t\t\t// dark gray background\r\n\t\t\tctx.fillStyle = sqColor1;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tif (sqSize > 0) { // to avoid infinite loop\r\n\t\t\t\tfor (var y = 0; y < canvas.height; y += sqSize * 2) {\r\n\t\t\t\t\t// light gray squares\r\n\t\t\t\t\tctx.fillStyle = sqColor2;\r\n\t\t\t\t\tctx.fillRect(0, y, sqSize, sqSize);\r\n\t\t\t\t\tctx.fillRect(sqSize, y + sqSize, sqSize, sqSize);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar grad = ctx.createLinearGradient(0, 0, 0, canvas.height);\r\n\t\t\tgrad.addColorStop(0, color);\r\n\t\t\tgrad.addColorStop(1, 'rgba(0,0,0,0)');\r\n\r\n\t\t\tctx.fillStyle = grad;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\t\t};\r\n\r\n\t\tret.elm = canvas;\r\n\t\tret.draw = drawFunc;\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\r\n\tBoxShadow : (function () {\r\n\t\tvar BoxShadow = function (hShadow, vShadow, blur, spread, color, inset) {\r\n\t\t\tthis.hShadow = hShadow;\r\n\t\t\tthis.vShadow = vShadow;\r\n\t\t\tthis.blur = blur;\r\n\t\t\tthis.spread = spread;\r\n\t\t\tthis.color = color;\r\n\t\t\tthis.inset = !!inset;\r\n\t\t};\r\n\r\n\t\tBoxShadow.prototype.toString = function () {\r\n\t\t\tvar vals = [\r\n\t\t\t\tMath.round(this.hShadow) + 'px',\r\n\t\t\t\tMath.round(this.vShadow) + 'px',\r\n\t\t\t\tMath.round(this.blur) + 'px',\r\n\t\t\t\tMath.round(this.spread) + 'px',\r\n\t\t\t\tthis.color\r\n\t\t\t];\r\n\t\t\tif (this.inset) {\r\n\t\t\t\tvals.push('inset');\r\n\t\t\t}\r\n\t\t\treturn vals.join(' ');\r\n\t\t};\r\n\r\n\t\treturn BoxShadow;\r\n\t})(),\r\n\r\n\r\n\tflags : {\r\n\t\tleaveValue : 1 << 0,\r\n\t\tleaveAlpha : 1 << 1,\r\n\t\tleavePreview : 1 << 2,\r\n\t},\r\n\r\n\r\n\tenumOpts : {\r\n\t\tformat: ['auto', 'any', 'hex', 'hexa', 'rgb', 'rgba'],\r\n\t\tpreviewPosition: ['left', 'right'],\r\n\t\tmode: ['hsv', 'hvs', 'hs', 'hv'],\r\n\t\tposition: ['left', 'right', 'top', 'bottom'],\r\n\t\talphaChannel: ['auto', true, false],\r\n\t\tpaletteSetsAlpha: ['auto', true, false],\r\n\t},\r\n\r\n\r\n\tdeprecatedOpts : {\r\n\t\t// <old_option>: <new_option> (<new_option> can be null)\r\n\t\t'styleElement': 'previewElement',\r\n\t\t'onFineChange': 'onInput',\r\n\t\t'overwriteImportant': 'forceStyle',\r\n\t\t'closable': 'closeButton',\r\n\t\t'insetWidth': 'controlBorderWidth',\r\n\t\t'insetColor': 'controlBorderColor',\r\n\t\t'refine': null,\r\n\t},\r\n\r\n\r\n\tdocsRef : ' ' + 'See https://jscolor.com/docs/',\r\n\r\n\r\n\t//\r\n\t// Usage:\r\n\t// var myPicker = new JSColor(<targetElement> [, <options>])\r\n\t//\r\n\t// (constructor is accessible via both 'jscolor' and 'JSColor' name)\r\n\t//\r\n\r\n\tpub : function (targetElement, opts) {\r\n\r\n\t\tvar THIS = this;\r\n\r\n\t\tif (!opts) {\r\n\t\t\topts = {};\r\n\t\t}\r\n\r\n\t\tthis.channels = {\r\n\t\t\tr: 255, // red [0-255]\r\n\t\t\tg: 255, // green [0-255]\r\n\t\t\tb: 255, // blue [0-255]\r\n\t\t\th: 0, // hue [0-360]\r\n\t\t\ts: 0, // saturation [0-100]\r\n\t\t\tv: 100, // value (brightness) [0-100]\r\n\t\t\ta: 1.0, // alpha (opacity) [0.0 - 1.0]\r\n\t\t};\r\n\r\n\t\t// General options\r\n\t\t//\r\n\t\tthis.format = 'auto'; // 'auto' | 'any' | 'hex' | 'hexa' | 'rgb' | 'rgba' - Format of the input/output value\r\n\t\tthis.value = undefined; // INITIAL color value in any supported format. To change it later, use method fromString(), fromHSVA(), fromRGBA() or channel()\r\n\t\tthis.alpha = undefined; // INITIAL alpha value. To change it later, call method channel('A', <value>)\r\n\t\tthis.random = false; // whether to randomize the initial color. Either true | false, or an array of ranges: [minV, maxV, minS, maxS, minH, maxH, minA, maxA]\r\n\t\tthis.onChange = undefined; // called when color changes. Value can be either a function or a string with JS code.\r\n\t\tthis.onInput = undefined; // called repeatedly as the color is being changed, e.g. while dragging a slider. Value can be either a function or a string with JS code.\r\n\t\tthis.valueElement = undefined; // element that will be used to display and input the color value\r\n\t\tthis.alphaElement = undefined; // element that will be used to display and input the alpha (opacity) value\r\n\t\tthis.previewElement = undefined; // element that will preview the picked color using CSS background\r\n\t\tthis.previewPosition = 'left'; // 'left' | 'right' - position of the color preview in previewElement\r\n\t\tthis.previewSize = 32; // (px) width of the color preview displayed in previewElement\r\n\t\tthis.previewPadding = 8; // (px) space between color preview and content of the previewElement\r\n\t\tthis.required = true; // whether the associated text input must always contain a color value. If false, the input can be left empty.\r\n\t\tthis.hash = true; // whether to prefix the HEX color code with # symbol (only applicable for HEX format)\r\n\t\tthis.uppercase = true; // whether to show the HEX color code in upper case (only applicable for HEX format)\r\n\t\tthis.forceStyle = true; // whether to overwrite CSS style of the previewElement using !important flag\r\n\r\n\t\t// Color Picker options\r\n\t\t//\r\n\t\tthis.width = 181; // width of the color spectrum (in px)\r\n\t\tthis.height = 101; // height of the color spectrum (in px)\r\n\t\tthis.mode = 'HSV'; // 'HSV' | 'HVS' | 'HS' | 'HV' - layout of the color picker controls\r\n\t\tthis.alphaChannel = 'auto'; // 'auto' | true | false - if alpha channel is enabled, the alpha slider will be visible. If 'auto', it will be determined according to color format\r\n\t\tthis.position = 'bottom'; // 'left' | 'right' | 'top' | 'bottom' - position relative to the target element\r\n\t\tthis.smartPosition = true; // automatically change picker position when there is not enough space for it\r\n\t\tthis.showOnClick = true; // whether to show the picker when user clicks its target element\r\n\t\tthis.hideOnLeave = true; // whether to automatically hide the picker when user leaves its target element (e.g. upon clicking the document)\r\n\t\tthis.palette = []; // colors to be displayed in the palette, specified as an array or a string of space separated color values (in any supported format)\r\n\t\tthis.paletteCols = 10; // number of columns in the palette\r\n\t\tthis.paletteSetsAlpha = 'auto'; // 'auto' | true | false - if true, palette colors that don't specify alpha will set alpha to 1.0\r\n\t\tthis.paletteHeight = 16; // maximum height (px) of a row in the palette\r\n\t\tthis.paletteSpacing = 4; // distance (px) between color samples in the palette\r\n\t\tthis.hideOnPaletteClick = false; // when set to true, clicking the palette will also hide the color picker\r\n\t\tthis.sliderSize = 16; // px\r\n\t\tthis.crossSize = 8; // px\r\n\t\tthis.closeButton = false; // whether to display the Close button\r\n\t\tthis.closeText = 'Close';\r\n\t\tthis.buttonColor = 'rgba(0,0,0,1)'; // CSS color\r\n\t\tthis.buttonHeight = 18; // px\r\n\t\tthis.padding = 12; // px\r\n\t\tthis.backgroundColor = 'rgba(255,255,255,1)'; // CSS color\r\n\t\tthis.borderWidth = 1; // px\r\n\t\tthis.borderColor = 'rgba(187,187,187,1)'; // CSS color\r\n\t\tthis.borderRadius = 8; // px\r\n\t\tthis.controlBorderWidth = 1; // px\r\n\t\tthis.controlBorderColor = 'rgba(187,187,187,1)'; // CSS color\r\n\t\tthis.shadow = true; // whether to display a shadow\r\n\t\tthis.shadowBlur = 15; // px\r\n\t\tthis.shadowColor = 'rgba(0,0,0,0.2)'; // CSS color\r\n\t\tthis.pointerColor = 'rgba(76,76,76,1)'; // CSS color\r\n\t\tthis.pointerBorderWidth = 1; // px\r\n\t\tthis.pointerBorderColor = 'rgba(255,255,255,1)'; // CSS color\r\n\t\tthis.pointerThickness = 2; // px\r\n\t\tthis.zIndex = 5000;\r\n\t\tthis.container = undefined; // where to append the color picker (BODY element by default)\r\n\r\n\t\t// Experimental\r\n\t\t//\r\n\t\tthis.minS = 0; // min allowed saturation (0 - 100)\r\n\t\tthis.maxS = 100; // max allowed saturation (0 - 100)\r\n\t\tthis.minV = 0; // min allowed value (brightness) (0 - 100)\r\n\t\tthis.maxV = 100; // max allowed value (brightness) (0 - 100)\r\n\t\tthis.minA = 0.0; // min allowed alpha (opacity) (0.0 - 1.0)\r\n\t\tthis.maxA = 1.0; // max allowed alpha (opacity) (0.0 - 1.0)\r\n\r\n\r\n\t\t// Getter: option(name)\r\n\t\t// Setter: option(name, value)\r\n\t\t// option({name:value, ...})\r\n\t\t//\r\n\t\tthis.option = function () {\r\n\t\t\tif (!arguments.length) {\r\n\t\t\t\tthrow new Error('No option specified');\r\n\t\t\t}\r\n\r\n\t\t\tif (arguments.length === 1 && typeof arguments[0] === 'string') {\r\n\t\t\t\t// getting a single option\r\n\t\t\t\ttry {\r\n\t\t\t\t\treturn getOption(arguments[0]);\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\r\n\t\t\t} else if (arguments.length >= 2 && typeof arguments[0] === 'string') {\r\n\t\t\t\t// setting a single option\r\n\t\t\t\ttry {\r\n\t\t\t\t\tif (!setOption(arguments[0], arguments[1])) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tthis.redraw(); // immediately redraws the picker, if it's displayed\r\n\t\t\t\tthis.exposeColor(); // in case some preview-related or format-related option was changed\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t} else if (arguments.length === 1 && typeof arguments[0] === 'object') {\r\n\t\t\t\t// setting multiple options\r\n\t\t\t\tvar opts = arguments[0];\r\n\t\t\t\tvar success = true;\r\n\t\t\t\tfor (var opt in opts) {\r\n\t\t\t\t\tif (opts.hasOwnProperty(opt)) {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tif (!setOption(opt, opts[opt])) {\r\n\t\t\t\t\t\t\t\tsuccess = false;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\t\t\tsuccess = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tthis.redraw(); // immediately redraws the picker, if it's displayed\r\n\t\t\t\tthis.exposeColor(); // in case some preview-related or format-related option was changed\r\n\t\t\t\treturn success;\r\n\t\t\t}\r\n\r\n\t\t\tthrow new Error('Invalid arguments');\r\n\t\t}\r\n\r\n\r\n\t\t// Getter: channel(name)\r\n\t\t// Setter: channel(name, value)\r\n\t\t//\r\n\t\tthis.channel = function (name, value) {\r\n\t\t\tif (typeof name !== 'string') {\r\n\t\t\t\tthrow new Error('Invalid value for channel name: ' + name);\r\n\t\t\t}\r\n\r\n\t\t\tif (value === undefined) {\r\n\t\t\t\t// getting channel value\r\n\t\t\t\tif (!this.channels.hasOwnProperty(name.toLowerCase())) {\r\n\t\t\t\t\tconsole.warn('Getting unknown channel: ' + name);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\treturn this.channels[name.toLowerCase()];\r\n\r\n\t\t\t} else {\r\n\t\t\t\t// setting channel value\r\n\t\t\t\tvar res = false;\r\n\t\t\t\tswitch (name.toLowerCase()) {\r\n\t\t\t\t\tcase 'r': res = this.fromRGBA(value, null, null, null); break;\r\n\t\t\t\t\tcase 'g': res = this.fromRGBA(null, value, null, null); break;\r\n\t\t\t\t\tcase 'b': res = this.fromRGBA(null, null, value, null); break;\r\n\t\t\t\t\tcase 'h': res = this.fromHSVA(value, null, null, null); break;\r\n\t\t\t\t\tcase 's': res = this.fromHSVA(null, value, null, null); break;\r\n\t\t\t\t\tcase 'v': res = this.fromHSVA(null, null, value, null); break;\r\n\t\t\t\t\tcase 'a': res = this.fromHSVA(null, null, null, value); break;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tconsole.warn('Setting unknown channel: ' + name);\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif (res) {\r\n\t\t\t\t\tthis.redraw(); // immediately redraws the picker, if it's displayed\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\r\n\t\t// Triggers given input event(s) by:\r\n\t\t// - executing on<Event> callback specified as picker's option\r\n\t\t// - triggering standard DOM event listeners attached to the value element\r\n\t\t//\r\n\t\t// It is possible to specify multiple events separated with a space.\r\n\t\t//\r\n\t\tthis.trigger = function (eventNames) {\r\n\t\t\tvar evs = jsc.strList(eventNames);\r\n\t\t\tfor (var i = 0; i < evs.length; i += 1) {\r\n\t\t\t\tvar ev = evs[i].toLowerCase();\r\n\r\n\t\t\t\t// trigger a callback\r\n\t\t\t\tvar callbackProp = null;\r\n\t\t\t\tswitch (ev) {\r\n\t\t\t\t\tcase 'input': callbackProp = 'onInput'; break;\r\n\t\t\t\t\tcase 'change': callbackProp = 'onChange'; break;\r\n\t\t\t\t}\r\n\t\t\t\tif (callbackProp) {\r\n\t\t\t\t\tjsc.triggerCallback(this, callbackProp);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// trigger standard DOM event listeners on the value element\r\n\t\t\t\tjsc.triggerInputEvent(this.valueElement, ev, true, true);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\t// h: 0-360\r\n\t\t// s: 0-100\r\n\t\t// v: 0-100\r\n\t\t// a: 0.0-1.0\r\n\t\t//\r\n\t\tthis.fromHSVA = function (h, s, v, a, flags) { // null = don't change\r\n\t\t\tif (h === undefined) { h = null; }\r\n\t\t\tif (s === undefined) { s = null; }\r\n\t\t\tif (v === undefined) { v = null; }\r\n\t\t\tif (a === undefined) { a = null; }\r\n\r\n\t\t\tif (h !== null) {\r\n\t\t\t\tif (isNaN(h)) { return false; }\r\n\t\t\t\tthis.channels.h = Math.max(0, Math.min(360, h));\r\n\t\t\t}\r\n\t\t\tif (s !== null) {\r\n\t\t\t\tif (isNaN(s)) { return false; }\r\n\t\t\t\tthis.channels.s = Math.max(0, Math.min(100, this.maxS, s), this.minS);\r\n\t\t\t}\r\n\t\t\tif (v !== null) {\r\n\t\t\t\tif (isNaN(v)) { return false; }\r\n\t\t\t\tthis.channels.v = Math.max(0, Math.min(100, this.maxV, v), this.minV);\r\n\t\t\t}\r\n\t\t\tif (a !== null) {\r\n\t\t\t\tif (isNaN(a)) { return false; }\r\n\t\t\t\tthis.channels.a = this.hasAlphaChannel() ?\r\n\t\t\t\t\tMath.max(0, Math.min(1, this.maxA, a), this.minA) :\r\n\t\t\t\t\t1.0; // if alpha channel is disabled, the color should stay 100% opaque\r\n\t\t\t}\r\n\r\n\t\t\tvar rgb = jsc.HSV_RGB(\r\n\t\t\t\tthis.channels.h,\r\n\t\t\t\tthis.channels.s,\r\n\t\t\t\tthis.channels.v\r\n\t\t\t);\r\n\t\t\tthis.channels.r = rgb[0];\r\n\t\t\tthis.channels.g = rgb[1];\r\n\t\t\tthis.channels.b = rgb[2];\r\n\r\n\t\t\tthis.exposeColor(flags);\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\r\n\t\t// r: 0-255\r\n\t\t// g: 0-255\r\n\t\t// b: 0-255\r\n\t\t// a: 0.0-1.0\r\n\t\t//\r\n\t\tthis.fromRGBA = function (r, g, b, a, flags) { // null = don't change\r\n\t\t\tif (r === undefined) { r = null; }\r\n\t\t\tif (g === undefined) { g = null; }\r\n\t\t\tif (b === undefined) { b = null; }\r\n\t\t\tif (a === undefined) { a = null; }\r\n\r\n\t\t\tif (r !== null) {\r\n\t\t\t\tif (isNaN(r)) { return false; }\r\n\t\t\t\tr = Math.max(0, Math.min(255, r));\r\n\t\t\t}\r\n\t\t\tif (g !== null) {\r\n\t\t\t\tif (isNaN(g)) { return false; }\r\n\t\t\t\tg = Math.max(0, Math.min(255, g));\r\n\t\t\t}\r\n\t\t\tif (b !== null) {\r\n\t\t\t\tif (isNaN(b)) { return false; }\r\n\t\t\t\tb = Math.max(0, Math.min(255, b));\r\n\t\t\t}\r\n\t\t\tif (a !== null) {\r\n\t\t\t\tif (isNaN(a)) { return false; }\r\n\t\t\t\tthis.channels.a = this.hasAlphaChannel() ?\r\n\t\t\t\t\tMath.max(0, Math.min(1, this.maxA, a), this.minA) :\r\n\t\t\t\t\t1.0; // if alpha channel is disabled, the color should stay 100% opaque\r\n\t\t\t}\r\n\r\n\t\t\tvar hsv = jsc.RGB_HSV(\r\n\t\t\t\tr===null ? this.channels.r : r,\r\n\t\t\t\tg===null ? this.channels.g : g,\r\n\t\t\t\tb===null ? this.channels.b : b\r\n\t\t\t);\r\n\t\t\tif (hsv[0] !== null) {\r\n\t\t\t\tthis.channels.h = Math.max(0, Math.min(360, hsv[0]));\r\n\t\t\t}\r\n\t\t\tif (hsv[2] !== 0) { // fully black color stays black through entire saturation range, so let's not change saturation\r\n\t\t\t\tthis.channels.s = Math.max(0, this.minS, Math.min(100, this.maxS, hsv[1]));\r\n\t\t\t}\r\n\t\t\tthis.channels.v = Math.max(0, this.minV, Math.min(100, this.maxV, hsv[2]));\r\n\r\n\t\t\t// update RGB according to final HSV, as some values might be trimmed\r\n\t\t\tvar rgb = jsc.HSV_RGB(this.channels.h, this.channels.s, this.channels.v);\r\n\t\t\tthis.channels.r = rgb[0];\r\n\t\t\tthis.channels.g = rgb[1];\r\n\t\t\tthis.channels.b = rgb[2];\r\n\r\n\t\t\tthis.exposeColor(flags);\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\r\n\t\t// DEPRECATED. Use .fromHSVA() instead\r\n\t\t//\r\n\t\tthis.fromHSV = function (h, s, v, flags) {\r\n\t\t\tconsole.warn('fromHSV() method is DEPRECATED. Using fromHSVA() instead.' + jsc.docsRef);\r\n\t\t\treturn this.fromHSVA(h, s, v, null, flags);\r\n\t\t};\r\n\r\n\r\n\t\t// DEPRECATED. Use .fromRGBA() instead\r\n\t\t//\r\n\t\tthis.fromRGB = function (r, g, b, flags) {\r\n\t\t\tconsole.warn('fromRGB() method is DEPRECATED. Using fromRGBA() instead.' + jsc.docsRef);\r\n\t\t\treturn this.fromRGBA(r, g, b, null, flags);\r\n\t\t};\r\n\r\n\r\n\t\tthis.fromString = function (str, flags) {\r\n\t\t\tif (!this.required && str.trim() === '') {\r\n\t\t\t\t// setting empty string to an optional color input\r\n\t\t\t\tthis.setPreviewElementBg(null);\r\n\t\t\t\tthis.setValueElementValue('');\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\tvar color = jsc.parseColorString(str);\r\n\t\t\tif (!color) {\r\n\t\t\t\treturn false; // could not parse\r\n\t\t\t}\r\n\t\t\tif (this.format.toLowerCase() === 'any') {\r\n\t\t\t\tthis._setFormat(color.format); // adapt format\r\n\t\t\t\tif (!jsc.isAlphaFormat(this.getFormat())) {\r\n\t\t\t\t\tcolor.rgba[3] = 1.0; // when switching to a format that doesn't support alpha, set full opacity\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.fromRGBA(\r\n\t\t\t\tcolor.rgba[0],\r\n\t\t\t\tcolor.rgba[1],\r\n\t\t\t\tcolor.rgba[2],\r\n\t\t\t\tcolor.rgba[3],\r\n\t\t\t\tflags\r\n\t\t\t);\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\r\n\t\tthis.randomize = function (minV, maxV, minS, maxS, minH, maxH, minA, maxA) {\r\n\t\t\tif (minV === undefined) { minV = 0; }\r\n\t\t\tif (maxV === undefined) { maxV = 100; }\r\n\t\t\tif (minS === undefined) { minS = 0; }\r\n\t\t\tif (maxS === undefined) { maxS = 100; }\r\n\t\t\tif (minH === undefined) { minH = 0; }\r\n\t\t\tif (maxH === undefined) { maxH = 359; }\r\n\t\t\tif (minA === undefined) { minA = 1; }\r\n\t\t\tif (maxA === undefined) { maxA = 1; }\r\n\r\n\t\t\tthis.fromHSVA(\r\n\t\t\t\tminH + Math.floor(Math.random() * (maxH - minH + 1)),\r\n\t\t\t\tminS + Math.floor(Math.random() * (maxS - minS + 1)),\r\n\t\t\t\tminV + Math.floor(Math.random() * (maxV - minV + 1)),\r\n\t\t\t\t((100 * minA) + Math.floor(Math.random() * (100 * (maxA - minA) + 1))) / 100\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toString = function (format) {\r\n\t\t\tif (format === undefined) {\r\n\t\t\t\tformat = this.getFormat(); // format not specified -> use the current format\r\n\t\t\t}\r\n\t\t\tswitch (format.toLowerCase()) {\r\n\t\t\t\tcase 'hex': return this.toHEXString(); break;\r\n\t\t\t\tcase 'hexa': return this.toHEXAString(); break;\r\n\t\t\t\tcase 'rgb': return this.toRGBString(); break;\r\n\t\t\t\tcase 'rgba': return this.toRGBAString(); break;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t};\r\n\r\n\r\n\t\tthis.toHEXString = function () {\r\n\t\t\treturn jsc.hexColor(\r\n\t\t\t\tthis.channels.r,\r\n\t\t\t\tthis.channels.g,\r\n\t\t\t\tthis.channels.b\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toHEXAString = function () {\r\n\t\t\treturn jsc.hexaColor(\r\n\t\t\t\tthis.channels.r,\r\n\t\t\t\tthis.channels.g,\r\n\t\t\t\tthis.channels.b,\r\n\t\t\t\tthis.channels.a\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toRGBString = function () {\r\n\t\t\treturn jsc.rgbColor(\r\n\t\t\t\tthis.channels.r,\r\n\t\t\t\tthis.channels.g,\r\n\t\t\t\tthis.channels.b\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toRGBAString = function () {\r\n\t\t\treturn jsc.rgbaColor(\r\n\t\t\t\tthis.channels.r,\r\n\t\t\t\tthis.channels.g,\r\n\t\t\t\tthis.channels.b,\r\n\t\t\t\tthis.channels.a\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toGrayscale = function () {\r\n\t\t\treturn (\r\n\t\t\t\t0.213 * this.channels.r +\r\n\t\t\t\t0.715 * this.channels.g +\r\n\t\t\t\t0.072 * this.channels.b\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toCanvas = function () {\r\n\t\t\treturn jsc.genColorPreviewCanvas(this.toRGBAString()).canvas;\r\n\t\t};\r\n\r\n\r\n\t\tthis.toDataURL = function () {\r\n\t\t\treturn this.toCanvas().toDataURL();\r\n\t\t};\r\n\r\n\r\n\t\tthis.toBackground = function () {\r\n\t\t\treturn jsc.pub.background(this.toRGBAString());\r\n\t\t};\r\n\r\n\r\n\t\tthis.isLight = function () {\r\n\t\t\treturn this.toGrayscale() > 255 / 2;\r\n\t\t};\r\n\r\n\r\n\t\tthis.hide = function () {\r\n\t\t\tif (isPickerOwner()) {\r\n\t\t\t\tdetachPicker();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.show = function () {\r\n\t\t\tdrawPicker();\r\n\t\t};\r\n\r\n\r\n\t\tthis.redraw = function () {\r\n\t\t\tif (isPickerOwner()) {\r\n\t\t\t\tdrawPicker();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.getFormat = function () {\r\n\t\t\treturn this._currentFormat;\r\n\t\t};\r\n\r\n\r\n\t\tthis._setFormat = function (format) {\r\n\t\t\tthis._currentFormat = format.toLowerCase();\r\n\t\t};\r\n\r\n\r\n\t\tthis.hasAlphaChannel = function () {\r\n\t\t\tif (this.alphaChannel === 'auto') {\r\n\t\t\t\treturn (\r\n\t\t\t\t\tthis.format.toLowerCase() === 'any' || // format can change on the fly (e.g. from hex to rgba), so let's consider the alpha channel enabled\r\n\t\t\t\t\tjsc.isAlphaFormat(this.getFormat()) || // the current format supports alpha channel\r\n\t\t\t\t\tthis.alpha !== undefined || // initial alpha value is set, so we're working with alpha channel\r\n\t\t\t\t\tthis.alphaElement !== undefined // the alpha value is redirected, so we're working with alpha channel\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\treturn this.alphaChannel; // the alpha channel is explicitly set\r\n\t\t};\r\n\r\n\r\n\t\tthis.processValueInput = function (str) {\r\n\t\t\tif (!this.fromString(str)) {\r\n\t\t\t\t// could not parse the color value - let's just expose the current color\r\n\t\t\t\tthis.exposeColor();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.processAlphaInput = function (str) {\r\n\t\t\tif (!this.fromHSVA(null, null, null, parseFloat(str))) {\r\n\t\t\t\t// could not parse the alpha value - let's just expose the current color\r\n\t\t\t\tthis.exposeColor();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.exposeColor = function (flags) {\r\n\t\t\tvar colorStr = this.toString();\r\n\t\t\tvar fmt = this.getFormat();\r\n\r\n\t\t\t// reflect current color in data- attribute\r\n\t\t\tjsc.setDataAttr(this.targetElement, 'current-color', colorStr);\r\n\r\n\t\t\tif (!(flags & jsc.flags.leaveValue) && this.valueElement) {\r\n\t\t\t\tif (fmt === 'hex' || fmt === 'hexa') {\r\n\t\t\t\t\tif (!this.uppercase) { colorStr = colorStr.toLowerCase(); }\r\n\t\t\t\t\tif (!this.hash) { colorStr = colorStr.replace(/^#/, ''); }\r\n\t\t\t\t}\r\n\t\t\t\tthis.setValueElementValue(colorStr);\r\n\t\t\t}\r\n\r\n\t\t\tif (!(flags & jsc.flags.leaveAlpha) && this.alphaElement) {\r\n\t\t\t\tvar alphaVal = Math.round(this.channels.a * 100) / 100;\r\n\t\t\t\tthis.setAlphaElementValue(alphaVal);\r\n\t\t\t}\r\n\r\n\t\t\tif (!(flags & jsc.flags.leavePreview) && this.previewElement) {\r\n\t\t\t\tvar previewPos = null; // 'left' | 'right' (null -> fill the entire element)\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tjsc.isTextInput(this.previewElement) || // text input\r\n\t\t\t\t\t(jsc.isButton(this.previewElement) && !jsc.isButtonEmpty(this.previewElement)) // button with text\r\n\t\t\t\t) {\r\n\t\t\t\t\tpreviewPos = this.previewPosition;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.setPreviewElementBg(this.toRGBAString());\r\n\t\t\t}\r\n\r\n\t\t\tif (isPickerOwner()) {\r\n\t\t\t\tredrawPad();\r\n\t\t\t\tredrawSld();\r\n\t\t\t\tredrawASld();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.setPreviewElementBg = function (color) {\r\n\t\t\tif (!this.previewElement) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar position = null; // color preview position: null | 'left' | 'right'\r\n\t\t\tvar width = null; // color preview width: px | null = fill the entire element\r\n\t\t\tif (\r\n\t\t\t\tjsc.isTextInput(this.previewElement) || // text input\r\n\t\t\t\t(jsc.isButton(this.previewElement) && !jsc.isButtonEmpty(this.previewElement)) // button with text\r\n\t\t\t) {\r\n\t\t\t\tposition = this.previewPosition;\r\n\t\t\t\twidth = this.previewSize;\r\n\t\t\t}\r\n\r\n\t\t\tvar backgrounds = [];\r\n\r\n\t\t\tif (!color) {\r\n\t\t\t\t// there is no color preview to display -> let's remove any previous background image\r\n\t\t\t\tbackgrounds.push({\r\n\t\t\t\t\timage: 'none',\r\n\t\t\t\t\tposition: 'left top',\r\n\t\t\t\t\tsize: 'auto',\r\n\t\t\t\t\trepeat: 'no-repeat',\r\n\t\t\t\t\torigin: 'padding-box',\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\t// CSS gradient for background color preview\r\n\t\t\t\tbackgrounds.push({\r\n\t\t\t\t\timage: jsc.genColorPreviewGradient(\r\n\t\t\t\t\t\tcolor,\r\n\t\t\t\t\t\tposition,\r\n\t\t\t\t\t\twidth ? width - jsc.pub.previewSeparator.length : null\r\n\t\t\t\t\t),\r\n\t\t\t\t\tposition: 'left top',\r\n\t\t\t\t\tsize: 'auto',\r\n\t\t\t\t\trepeat: position ? 'repeat-y' : 'repeat',\r\n\t\t\t\t\torigin: 'padding-box',\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// data URL of generated PNG image with a gray transparency chessboard\r\n\t\t\t\tvar preview = jsc.genColorPreviewCanvas(\r\n\t\t\t\t\t'rgba(0,0,0,0)',\r\n\t\t\t\t\tposition ? {'left':'right', 'right':'left'}[position] : null,\r\n\t\t\t\t\twidth,\r\n\t\t\t\t\ttrue\r\n\t\t\t\t);\r\n\t\t\t\tbackgrounds.push({\r\n\t\t\t\t\timage: 'url(\\'' + preview.canvas.toDataURL() + '\\')',\r\n\t\t\t\t\tposition: (position || 'left') + ' top',\r\n\t\t\t\t\tsize: preview.width + 'px ' + preview.height + 'px',\r\n\t\t\t\t\trepeat: position ? 'repeat-y' : 'repeat',\r\n\t\t\t\t\torigin: 'padding-box',\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tvar bg = {\r\n\t\t\t\timage: [],\r\n\t\t\t\tposition: [],\r\n\t\t\t\tsize: [],\r\n\t\t\t\trepeat: [],\r\n\t\t\t\torigin: [],\r\n\t\t\t};\r\n\t\t\tfor (var i = 0; i < backgrounds.length; i += 1) {\r\n\t\t\t\tbg.image.push(backgrounds[i].image);\r\n\t\t\t\tbg.position.push(backgrounds[i].position);\r\n\t\t\t\tbg.size.push(backgrounds[i].size);\r\n\t\t\t\tbg.repeat.push(backgrounds[i].repeat);\r\n\t\t\t\tbg.origin.push(backgrounds[i].origin);\r\n\t\t\t}\r\n\r\n\t\t\t// set previewElement's background-images\r\n\t\t\tvar sty = {\r\n\t\t\t\t'background-image': bg.image.join(', '),\r\n\t\t\t\t'background-position': bg.position.join(', '),\r\n\t\t\t\t'background-size': bg.size.join(', '),\r\n\t\t\t\t'background-repeat': bg.repeat.join(', '),\r\n\t\t\t\t'background-origin': bg.origin.join(', '),\r\n\t\t\t};\r\n\t\t\tjsc.setStyle(this.previewElement, sty, this.forceStyle);\r\n\r\n\r\n\t\t\t// set/restore previewElement's padding\r\n\t\t\tvar padding = {\r\n\t\t\t\tleft: null,\r\n\t\t\t\tright: null,\r\n\t\t\t};\r\n\t\t\tif (position) {\r\n\t\t\t\tpadding[position] = (this.previewSize + this.previewPadding) + 'px';\r\n\t\t\t}\r\n\r\n\t\t\tvar sty = {\r\n\t\t\t\t'padding-left': padding.left,\r\n\t\t\t\t'padding-right': padding.right,\r\n\t\t\t};\r\n\t\t\tjsc.setStyle(this.previewElement, sty, this.forceStyle, true);\r\n\t\t};\r\n\r\n\r\n\t\tthis.setValueElementValue = function (str) {\r\n\t\t\tif (this.valueElement) {\r\n\t\t\t\tif (jsc.nodeName(this.valueElement) === 'input') {\r\n\t\t\t\t\tthis.valueElement.value = str;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.valueElement.innerHTML = str;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.setAlphaElementValue = function (str) {\r\n\t\t\tif (this.alphaElement) {\r\n\t\t\t\tif (jsc.nodeName(this.alphaElement) === 'input') {\r\n\t\t\t\t\tthis.alphaElement.value = str;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.alphaElement.innerHTML = str;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis._processParentElementsInDOM = function () {\r\n\t\t\tif (this._parentElementsProcessed) { return; }\r\n\t\t\tthis._parentElementsProcessed = true;\r\n\r\n\t\t\tvar elm = this.targetElement;\r\n\t\t\tdo {\r\n\t\t\t\t// If the target element or one of its parent nodes has fixed position,\r\n\t\t\t\t// then use fixed positioning instead\r\n\t\t\t\tvar compStyle = jsc.getCompStyle(elm);\r\n\t\t\t\tif (compStyle.position && compStyle.position.toLowerCase() === 'fixed') {\r\n\t\t\t\t\tthis.fixed = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (elm !== this.targetElement) {\r\n\t\t\t\t\t// Ensure to attach onParentScroll only once to each parent element\r\n\t\t\t\t\t// (multiple targetElements can share the same parent nodes)\r\n\t\t\t\t\t//\r\n\t\t\t\t\t// Note: It's not just offsetParents that can be scrollable,\r\n\t\t\t\t\t// that's why we loop through all parent nodes\r\n\t\t\t\t\tif (!jsc.getData(elm, 'hasScrollListener')) {\r\n\t\t\t\t\t\telm.addEventListener('scroll', jsc.onParentScroll, false);\r\n\t\t\t\t\t\tjsc.setData(elm, 'hasScrollListener', true);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} while ((elm = elm.parentNode) && jsc.nodeName(elm) !== 'body');\r\n\t\t};\r\n\r\n\r\n\t\tthis.tryHide = function () {\r\n\t\t\tif (this.hideOnLeave) {\r\n\t\t\t\tthis.hide();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.set__palette = function (val) {\r\n\t\t\tthis.palette = val;\r\n\t\t\tthis._palette = jsc.parsePaletteValue(val);\r\n\t\t\tthis._paletteHasTransparency = jsc.containsTranparentColor(this._palette);\r\n\t\t};\r\n\r\n\r\n\t\tfunction setOption (option, value) {\r\n\t\t\tif (typeof option !== 'string') {\r\n\t\t\t\tthrow new Error('Invalid value for option name: ' + option);\r\n\t\t\t}\r\n\r\n\t\t\t// enum option\r\n\t\t\tif (jsc.enumOpts.hasOwnProperty(option)) {\r\n\t\t\t\tif (typeof value === 'string') { // enum string values are case insensitive\r\n\t\t\t\t\tvalue = value.toLowerCase();\r\n\t\t\t\t}\r\n\t\t\t\tif (jsc.enumOpts[option].indexOf(value) === -1) {\r\n\t\t\t\t\tthrow new Error('Option \\'' + option + '\\' has invalid value: ' + value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// deprecated option\r\n\t\t\tif (jsc.deprecatedOpts.hasOwnProperty(option)) {\r\n\t\t\t\tvar oldOpt = option;\r\n\t\t\t\tvar newOpt = jsc.deprecatedOpts[option];\r\n\t\t\t\tif (newOpt) {\r\n\t\t\t\t\t// if we have a new name for this option, let's log a warning and use the new name\r\n\t\t\t\t\tconsole.warn('Option \\'%s\\' is DEPRECATED, using \\'%s\\' instead.' + jsc.docsRef, oldOpt, newOpt);\r\n\t\t\t\t\toption = newOpt;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// new name not available for the option\r\n\t\t\t\t\tthrow new Error('Option \\'' + option + '\\' is DEPRECATED');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar setter = 'set__' + option;\r\n\r\n\t\t\tif (typeof THIS[setter] === 'function') { // a setter exists for this option\r\n\t\t\t\tTHIS[setter](value);\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t} else if (option in THIS) { // option exists as a property\r\n\t\t\t\tTHIS[option] = value;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\tthrow new Error('Unrecognized configuration option: ' + option);\r\n\t\t}\r\n\r\n\r\n\t\tfunction getOption (option) {\r\n\t\t\tif (typeof option !== 'string') {\r\n\t\t\t\tthrow new Error('Invalid value for option name: ' + option);\r\n\t\t\t}\r\n\r\n\t\t\t// deprecated option\r\n\t\t\tif (jsc.deprecatedOpts.hasOwnProperty(option)) {\r\n\t\t\t\tvar oldOpt = option;\r\n\t\t\t\tvar newOpt = jsc.deprecatedOpts[option];\r\n\t\t\t\tif (newOpt) {\r\n\t\t\t\t\t// if we have a new name for this option, let's log a warning and use the new name\r\n\t\t\t\t\tconsole.warn('Option \\'%s\\' is DEPRECATED, using \\'%s\\' instead.' + jsc.docsRef, oldOpt, newOpt);\r\n\t\t\t\t\toption = newOpt;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// new name not available for the option\r\n\t\t\t\t\tthrow new Error('Option \\'' + option + '\\' is DEPRECATED');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar getter = 'get__' + option;\r\n\r\n\t\t\tif (typeof THIS[getter] === 'function') { // a getter exists for this option\r\n\t\t\t\treturn THIS[getter](value);\r\n\r\n\t\t\t} else if (option in THIS) { // option exists as a property\r\n\t\t\t\treturn THIS[option];\r\n\t\t\t}\r\n\r\n\t\t\tthrow new Error('Unrecognized configuration option: ' + option);\r\n\t\t}\r\n\r\n\r\n\t\tfunction detachPicker () {\r\n\t\t\tjsc.removeClass(THIS.targetElement, jsc.pub.activeClassName);\r\n\t\t\tjsc.picker.wrap.parentNode.removeChild(jsc.picker.wrap);\r\n\t\t\tdelete jsc.picker.owner;\r\n\t\t}\r\n\r\n\r\n\t\tfunction drawPicker () {\r\n\r\n\t\t\t// At this point, when drawing the picker, we know what the parent elements are\r\n\t\t\t// and we can do all related DOM operations, such as registering events on them\r\n\t\t\t// or checking their positioning\r\n\t\t\tTHIS._processParentElementsInDOM();\r\n\r\n\t\t\tif (!jsc.picker) {\r\n\t\t\t\tjsc.picker = {\r\n\t\t\t\t\towner: null, // owner picker instance\r\n\t\t\t\t\twrap : jsc.createEl('div'),\r\n\t\t\t\t\tbox : jsc.createEl('div'),\r\n\t\t\t\t\tboxS : jsc.createEl('div'), // shadow area\r\n\t\t\t\t\tboxB : jsc.createEl('div'), // border\r\n\t\t\t\t\tpad : jsc.createEl('div'),\r\n\t\t\t\t\tpadB : jsc.createEl('div'), // border\r\n\t\t\t\t\tpadM : jsc.createEl('div'), // mouse/touch area\r\n\t\t\t\t\tpadCanvas : jsc.createPadCanvas(),\r\n\t\t\t\t\tcross : jsc.createEl('div'),\r\n\t\t\t\t\tcrossBY : jsc.createEl('div'), // border Y\r\n\t\t\t\t\tcrossBX : jsc.createEl('div'), // border X\r\n\t\t\t\t\tcrossLY : jsc.createEl('div'), // line Y\r\n\t\t\t\t\tcrossLX : jsc.createEl('div'), // line X\r\n\t\t\t\t\tsld : jsc.createEl('div'), // slider\r\n\t\t\t\t\tsldB : jsc.createEl('div'), // border\r\n\t\t\t\t\tsldM : jsc.createEl('div'), // mouse/touch area\r\n\t\t\t\t\tsldGrad : jsc.createSliderGradient(),\r\n\t\t\t\t\tsldPtrS : jsc.createEl('div'), // slider pointer spacer\r\n\t\t\t\t\tsldPtrIB : jsc.createEl('div'), // slider pointer inner border\r\n\t\t\t\t\tsldPtrMB : jsc.createEl('div'), // slider pointer middle border\r\n\t\t\t\t\tsldPtrOB : jsc.createEl('div'), // slider pointer outer border\r\n\t\t\t\t\tasld : jsc.createEl('div'), // alpha slider\r\n\t\t\t\t\tasldB : jsc.createEl('div'), // border\r\n\t\t\t\t\tasldM : jsc.createEl('div'), // mouse/touch area\r\n\t\t\t\t\tasldGrad : jsc.createASliderGradient(),\r\n\t\t\t\t\tasldPtrS : jsc.createEl('div'), // slider pointer spacer\r\n\t\t\t\t\tasldPtrIB : jsc.createEl('div'), // slider pointer inner border\r\n\t\t\t\t\tasldPtrMB : jsc.createEl('div'), // slider pointer middle border\r\n\t\t\t\t\tasldPtrOB : jsc.createEl('div'), // slider pointer outer border\r\n\t\t\t\t\tpal : jsc.createEl('div'), // palette\r\n\t\t\t\t\tbtn : jsc.createEl('div'),\r\n\t\t\t\t\tbtnT : jsc.createEl('span'), // text\r\n\t\t\t\t};\r\n\r\n\t\t\t\tjsc.picker.pad.appendChild(jsc.picker.padCanvas.elm);\r\n\t\t\t\tjsc.picker.padB.appendChild(jsc.picker.pad);\r\n\t\t\t\tjsc.picker.cross.appendChild(jsc.picker.crossBY);\r\n\t\t\t\tjsc.picker.cross.appendChild(jsc.picker.crossBX);\r\n\t\t\t\tjsc.picker.cross.appendChild(jsc.picker.crossLY);\r\n\t\t\t\tjsc.picker.cross.appendChild(jsc.picker.crossLX);\r\n\t\t\t\tjsc.picker.padB.appendChild(jsc.picker.cross);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.padB);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.padM);\r\n\r\n\t\t\t\tjsc.picker.sld.appendChild(jsc.picker.sldGrad.elm);\r\n\t\t\t\tjsc.picker.sldB.appendChild(jsc.picker.sld);\r\n\t\t\t\tjsc.picker.sldB.appendChild(jsc.picker.sldPtrOB);\r\n\t\t\t\tjsc.picker.sldPtrOB.appendChild(jsc.picker.sldPtrMB);\r\n\t\t\t\tjsc.picker.sldPtrMB.appendChild(jsc.picker.sldPtrIB);\r\n\t\t\t\tjsc.picker.sldPtrIB.appendChild(jsc.picker.sldPtrS);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.sldB);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.sldM);\r\n\r\n\t\t\t\tjsc.picker.asld.appendChild(jsc.picker.asldGrad.elm);\r\n\t\t\t\tjsc.picker.asldB.appendChild(jsc.picker.asld);\r\n\t\t\t\tjsc.picker.asldB.appendChild(jsc.picker.asldPtrOB);\r\n\t\t\t\tjsc.picker.asldPtrOB.appendChild(jsc.picker.asldPtrMB);\r\n\t\t\t\tjsc.picker.asldPtrMB.appendChild(jsc.picker.asldPtrIB);\r\n\t\t\t\tjsc.picker.asldPtrIB.appendChild(jsc.picker.asldPtrS);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.asldB);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.asldM);\r\n\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.pal);\r\n\r\n\t\t\t\tjsc.picker.btn.appendChild(jsc.picker.btnT);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.btn);\r\n\r\n\t\t\t\tjsc.picker.boxB.appendChild(jsc.picker.box);\r\n\t\t\t\tjsc.picker.wrap.appendChild(jsc.picker.boxS);\r\n\t\t\t\tjsc.picker.wrap.appendChild(jsc.picker.boxB);\r\n\r\n\t\t\t\tjsc.picker.wrap.addEventListener('touchstart', jsc.onPickerTouchStart,\r\n\t\t\t\t\tjsc.isPassiveEventSupported ? {passive: false} : false);\r\n\t\t\t}\r\n\r\n\t\t\tvar p = jsc.picker;\r\n\r\n\t\t\tvar displaySlider = !!jsc.getSliderChannel(THIS);\r\n\t\t\tvar displayAlphaSlider = THIS.hasAlphaChannel();\r\n\t\t\tvar pickerDims = jsc.getPickerDims(THIS);\r\n\t\t\tvar crossOuterSize = (2 * THIS.pointerBorderWidth + THIS.pointerThickness + 2 * THIS.crossSize);\r\n\t\t\tvar controlPadding = jsc.getControlPadding(THIS);\r\n\t\t\tvar borderRadius = Math.min(\r\n\t\t\t\tTHIS.borderRadius,\r\n\t\t\t\tMath.round(THIS.padding * Math.PI)); // px\r\n\t\t\tvar padCursor = 'crosshair';\r\n\r\n\t\t\t// wrap\r\n\t\t\tp.wrap.className = 'jscolor-picker-wrap';\r\n\t\t\tp.wrap.style.clear = 'both';\r\n\t\t\tp.wrap.style.width = pickerDims.borderW + 'px';\r\n\t\t\tp.wrap.style.height = pickerDims.borderH + 'px';\r\n\t\t\tp.wrap.style.zIndex = THIS.zIndex;\r\n\r\n\t\t\t// picker\r\n\t\t\tp.box.className = 'jscolor-picker';\r\n\t\t\tp.box.style.width = pickerDims.paddedW + 'px';\r\n\t\t\tp.box.style.height = pickerDims.paddedH + 'px';\r\n\t\t\tp.box.style.position = 'relative';\r\n\r\n\t\t\t// picker shadow\r\n\t\t\tp.boxS.className = 'jscolor-picker-shadow';\r\n\t\t\tp.boxS.style.position = 'absolute';\r\n\t\t\tp.boxS.style.left = '0';\r\n\t\t\tp.boxS.style.top = '0';\r\n\t\t\tp.boxS.style.width = '100%';\r\n\t\t\tp.boxS.style.height = '100%';\r\n\t\t\tjsc.setBorderRadius(p.boxS, borderRadius + 'px');\r\n\r\n\t\t\t// picker border\r\n\t\t\tp.boxB.className = 'jscolor-picker-border';\r\n\t\t\tp.boxB.style.position = 'relative';\r\n\t\t\tp.boxB.style.border = THIS.borderWidth + 'px solid';\r\n\t\t\tp.boxB.style.borderColor = THIS.borderColor;\r\n\t\t\tp.boxB.style.background = THIS.backgroundColor;\r\n\t\t\tjsc.setBorderRadius(p.boxB, borderRadius + 'px');\r\n\r\n\t\t\t// IE hack:\r\n\t\t\t// If the element is transparent, IE will trigger the event on the elements under it,\r\n\t\t\t// e.g. on Canvas or on elements with border\r\n\t\t\tp.padM.style.background = 'rgba(255,0,0,.2)';\r\n\t\t\tp.sldM.style.background = 'rgba(0,255,0,.2)';\r\n\t\t\tp.asldM.style.background = 'rgba(0,0,255,.2)';\r\n\r\n\t\t\tp.padM.style.opacity =\r\n\t\t\tp.sldM.style.opacity =\r\n\t\t\tp.asldM.style.opacity =\r\n\t\t\t\t'0';\r\n\r\n\t\t\t// pad\r\n\t\t\tp.pad.style.position = 'relative';\r\n\t\t\tp.pad.style.width = THIS.width + 'px';\r\n\t\t\tp.pad.style.height = THIS.height + 'px';\r\n\r\n\t\t\t// pad - color spectrum (HSV and HVS)\r\n\t\t\tp.padCanvas.draw(THIS.width, THIS.height, jsc.getPadYChannel(THIS));\r\n\r\n\t\t\t// pad border\r\n\t\t\tp.padB.style.position = 'absolute';\r\n\t\t\tp.padB.style.left = THIS.padding + 'px';\r\n\t\t\tp.padB.style.top = THIS.padding + 'px';\r\n\t\t\tp.padB.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\tp.padB.style.borderColor = THIS.controlBorderColor;\r\n\r\n\t\t\t// pad mouse area\r\n\t\t\tp.padM.style.position = 'absolute';\r\n\t\t\tp.padM.style.left = 0 + 'px';\r\n\t\t\tp.padM.style.top = 0 + 'px';\r\n\t\t\tp.padM.style.width = (THIS.padding + 2 * THIS.controlBorderWidth + THIS.width + controlPadding) + 'px';\r\n\t\t\tp.padM.style.height = (2 * THIS.controlBorderWidth + 2 * THIS.padding + THIS.height) + 'px';\r\n\t\t\tp.padM.style.cursor = padCursor;\r\n\t\t\tjsc.setData(p.padM, {\r\n\t\t\t\tinstance: THIS,\r\n\t\t\t\tcontrol: 'pad',\r\n\t\t\t})\r\n\r\n\t\t\t// pad cross\r\n\t\t\tp.cross.style.position = 'absolute';\r\n\t\t\tp.cross.style.left =\r\n\t\t\tp.cross.style.top =\r\n\t\t\t\t'0';\r\n\t\t\tp.cross.style.width =\r\n\t\t\tp.cross.style.height =\r\n\t\t\t\tcrossOuterSize + 'px';\r\n\r\n\t\t\t// pad cross border Y and X\r\n\t\t\tp.crossBY.style.position =\r\n\t\t\tp.crossBX.style.position =\r\n\t\t\t\t'absolute';\r\n\t\t\tp.crossBY.style.background =\r\n\t\t\tp.crossBX.style.background =\r\n\t\t\t\tTHIS.pointerBorderColor;\r\n\t\t\tp.crossBY.style.width =\r\n\t\t\tp.crossBX.style.height =\r\n\t\t\t\t(2 * THIS.pointerBorderWidth + THIS.pointerThickness) + 'px';\r\n\t\t\tp.crossBY.style.height =\r\n\t\t\tp.crossBX.style.width =\r\n\t\t\t\tcrossOuterSize + 'px';\r\n\t\t\tp.crossBY.style.left =\r\n\t\t\tp.crossBX.style.top =\r\n\t\t\t\t(Math.floor(crossOuterSize / 2) - Math.floor(THIS.pointerThickness / 2) - THIS.pointerBorderWidth) + 'px';\r\n\t\t\tp.crossBY.style.top =\r\n\t\t\tp.crossBX.style.left =\r\n\t\t\t\t'0';\r\n\r\n\t\t\t// pad cross line Y and X\r\n\t\t\tp.crossLY.style.position =\r\n\t\t\tp.crossLX.style.position =\r\n\t\t\t\t'absolute';\r\n\t\t\tp.crossLY.style.background =\r\n\t\t\tp.crossLX.style.background =\r\n\t\t\t\tTHIS.pointerColor;\r\n\t\t\tp.crossLY.style.height =\r\n\t\t\tp.crossLX.style.width =\r\n\t\t\t\t(crossOuterSize - 2 * THIS.pointerBorderWidth) + 'px';\r\n\t\t\tp.crossLY.style.width =\r\n\t\t\tp.crossLX.style.height =\r\n\t\t\t\tTHIS.pointerThickness + 'px';\r\n\t\t\tp.crossLY.style.left =\r\n\t\t\tp.crossLX.style.top =\r\n\t\t\t\t(Math.floor(crossOuterSize / 2) - Math.floor(THIS.pointerThickness / 2)) + 'px';\r\n\t\t\tp.crossLY.style.top =\r\n\t\t\tp.crossLX.style.left =\r\n\t\t\t\tTHIS.pointerBorderWidth + 'px';\r\n\r\n\r\n\t\t\t// slider\r\n\t\t\tp.sld.style.overflow = 'hidden';\r\n\t\t\tp.sld.style.width = THIS.sliderSize + 'px';\r\n\t\t\tp.sld.style.height = THIS.height + 'px';\r\n\r\n\t\t\t// slider gradient\r\n\t\t\tp.sldGrad.draw(THIS.sliderSize, THIS.height, '#000', '#000');\r\n\r\n\t\t\t// slider border\r\n\t\t\tp.sldB.style.display = displaySlider ? 'block' : 'none';\r\n\t\t\tp.sldB.style.position = 'absolute';\r\n\t\t\tp.sldB.style.left = (THIS.padding + THIS.width + 2 * THIS.controlBorderWidth + 2 * controlPadding) + 'px';\r\n\t\t\tp.sldB.style.top = THIS.padding + 'px';\r\n\t\t\tp.sldB.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\tp.sldB.style.borderColor = THIS.controlBorderColor;\r\n\r\n\t\t\t// slider mouse area\r\n\t\t\tp.sldM.style.display = displaySlider ? 'block' : 'none';\r\n\t\t\tp.sldM.style.position = 'absolute';\r\n\t\t\tp.sldM.style.left = (THIS.padding + THIS.width + 2 * THIS.controlBorderWidth + controlPadding) + 'px';\r\n\t\t\tp.sldM.style.top = 0 + 'px';\r\n\t\t\tp.sldM.style.width = (\r\n\t\t\t\t\t(THIS.sliderSize + 2 * controlPadding + 2 * THIS.controlBorderWidth) +\r\n\t\t\t\t\t(displayAlphaSlider ? 0 : Math.max(0, THIS.padding - controlPadding)) // remaining padding to the right edge\r\n\t\t\t\t) + 'px';\r\n\t\t\tp.sldM.style.height = (2 * THIS.controlBorderWidth + 2 * THIS.padding + THIS.height) + 'px';\r\n\t\t\tp.sldM.style.cursor = 'default';\r\n\t\t\tjsc.setData(p.sldM, {\r\n\t\t\t\tinstance: THIS,\r\n\t\t\t\tcontrol: 'sld',\r\n\t\t\t});\r\n\r\n\t\t\t// slider pointer inner and outer border\r\n\t\t\tp.sldPtrIB.style.border =\r\n\t\t\tp.sldPtrOB.style.border =\r\n\t\t\t\tTHIS.pointerBorderWidth + 'px solid ' + THIS.pointerBorderColor;\r\n\r\n\t\t\t// slider pointer outer border\r\n\t\t\tp.sldPtrOB.style.position = 'absolute';\r\n\t\t\tp.sldPtrOB.style.left = -(2 * THIS.pointerBorderWidth + THIS.pointerThickness) + 'px';\r\n\t\t\tp.sldPtrOB.style.top = '0';\r\n\r\n\t\t\t// slider pointer middle border\r\n\t\t\tp.sldPtrMB.style.border = THIS.pointerThickness + 'px solid ' + THIS.pointerColor;\r\n\r\n\t\t\t// slider pointer spacer\r\n\t\t\tp.sldPtrS.style.width = THIS.sliderSize + 'px';\r\n\t\t\tp.sldPtrS.style.height = jsc.pub.sliderInnerSpace + 'px';\r\n\r\n\r\n\t\t\t// alpha slider\r\n\t\t\tp.asld.style.overflow = 'hidden';\r\n\t\t\tp.asld.style.width = THIS.sliderSize + 'px';\r\n\t\t\tp.asld.style.height = THIS.height + 'px';\r\n\r\n\t\t\t// alpha slider gradient\r\n\t\t\tp.asldGrad.draw(THIS.sliderSize, THIS.height, '#000');\r\n\r\n\t\t\t// alpha slider border\r\n\t\t\tp.asldB.style.display = displayAlphaSlider ? 'block' : 'none';\r\n\t\t\tp.asldB.style.position = 'absolute';\r\n\t\t\tp.asldB.style.left = (\r\n\t\t\t\t\t(THIS.padding + THIS.width + 2 * THIS.controlBorderWidth + controlPadding) +\r\n\t\t\t\t\t(displaySlider ? (THIS.sliderSize + 3 * controlPadding + 2 * THIS.controlBorderWidth) : 0)\r\n\t\t\t\t) + 'px';\r\n\t\t\tp.asldB.style.top = THIS.padding + 'px';\r\n\t\t\tp.asldB.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\tp.asldB.style.borderColor = THIS.controlBorderColor;\r\n\r\n\t\t\t// alpha slider mouse area\r\n\t\t\tp.asldM.style.display = displayAlphaSlider ? 'block' : 'none';\r\n\t\t\tp.asldM.style.position = 'absolute';\r\n\t\t\tp.asldM.style.left = (\r\n\t\t\t\t\t(THIS.padding + THIS.width + 2 * THIS.controlBorderWidth + controlPadding) +\r\n\t\t\t\t\t(displaySlider ? (THIS.sliderSize + 2 * controlPadding + 2 * THIS.controlBorderWidth) : 0)\r\n\t\t\t\t) + 'px';\r\n\t\t\tp.asldM.style.top = 0 + 'px';\r\n\t\t\tp.asldM.style.width = (\r\n\t\t\t\t\t(THIS.sliderSize + 2 * controlPadding + 2 * THIS.controlBorderWidth) +\r\n\t\t\t\t\tMath.max(0, THIS.padding - controlPadding) // remaining padding to the right edge\r\n\t\t\t\t) + 'px';\r\n\t\t\tp.asldM.style.height = (2 * THIS.controlBorderWidth + 2 * THIS.padding + THIS.height) + 'px';\r\n\t\t\tp.asldM.style.cursor = 'default';\r\n\t\t\tjsc.setData(p.asldM, {\r\n\t\t\t\tinstance: THIS,\r\n\t\t\t\tcontrol: 'asld',\r\n\t\t\t})\r\n\r\n\t\t\t// alpha slider pointer inner and outer border\r\n\t\t\tp.asldPtrIB.style.border =\r\n\t\t\tp.asldPtrOB.style.border =\r\n\t\t\t\tTHIS.pointerBorderWidth + 'px solid ' + THIS.pointerBorderColor;\r\n\r\n\t\t\t// alpha slider pointer outer border\r\n\t\t\tp.asldPtrOB.style.position = 'absolute';\r\n\t\t\tp.asldPtrOB.style.left = -(2 * THIS.pointerBorderWidth + THIS.pointerThickness) + 'px';\r\n\t\t\tp.asldPtrOB.style.top = '0';\r\n\r\n\t\t\t// alpha slider pointer middle border\r\n\t\t\tp.asldPtrMB.style.border = THIS.pointerThickness + 'px solid ' + THIS.pointerColor;\r\n\r\n\t\t\t// alpha slider pointer spacer\r\n\t\t\tp.asldPtrS.style.width = THIS.sliderSize + 'px';\r\n\t\t\tp.asldPtrS.style.height = jsc.pub.sliderInnerSpace + 'px';\r\n\r\n\r\n\t\t\t// palette\r\n\t\t\tp.pal.className = 'jscolor-palette';\r\n\t\t\tp.pal.style.display = pickerDims.palette.rows ? 'block' : 'none';\r\n\t\t\tp.pal.style.position = 'absolute';\r\n\t\t\tp.pal.style.left = THIS.padding + 'px';\r\n\t\t\tp.pal.style.top = (2 * THIS.controlBorderWidth + 2 * THIS.padding + THIS.height) + 'px';\r\n\r\n\t\t\t// palette's color samples\r\n\r\n\t\t\tp.pal.innerHTML = '';\r\n\r\n\t\t\tvar chessboard = jsc.genColorPreviewCanvas('rgba(0,0,0,0)');\r\n\r\n\t\t\tvar si = 0; // color sample's index\r\n\t\t\tfor (var r = 0; r < pickerDims.palette.rows; r++) {\r\n\t\t\t\tfor (var c = 0; c < pickerDims.palette.cols && si < THIS._palette.length; c++, si++) {\r\n\t\t\t\t\tvar sampleColor = THIS._palette[si];\r\n\t\t\t\t\tvar sampleCssColor = jsc.rgbaColor.apply(null, sampleColor.rgba);\r\n\r\n\t\t\t\t\tvar sc = jsc.createEl('div'); // color sample's color\r\n\t\t\t\t\tsc.style.width = (pickerDims.palette.cellW - 2 * THIS.controlBorderWidth) + 'px';\r\n\t\t\t\t\tsc.style.height = (pickerDims.palette.cellH - 2 * THIS.controlBorderWidth) + 'px';\r\n\t\t\t\t\tsc.style.backgroundColor = sampleCssColor;\r\n\r\n\t\t\t\t\tvar sw = jsc.createEl('div'); // color sample's wrap\r\n\t\t\t\t\tsw.className = 'jscolor-palette-sample';\r\n\t\t\t\t\tsw.style.display = 'block';\r\n\t\t\t\t\tsw.style.position = 'absolute';\r\n\t\t\t\t\tsw.style.left = (\r\n\t\t\t\t\t\t\tpickerDims.palette.cols <= 1 ? 0 :\r\n\t\t\t\t\t\t\tMath.round(10 * (c * ((pickerDims.contentW - pickerDims.palette.cellW) / (pickerDims.palette.cols - 1)))) / 10\r\n\t\t\t\t\t\t) + 'px';\r\n\t\t\t\t\tsw.style.top = (r * (pickerDims.palette.cellH + THIS.paletteSpacing)) + 'px';\r\n\t\t\t\t\tsw.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\t\t\tsw.style.borderColor = THIS.controlBorderColor;\r\n\t\t\t\t\tsw.style.cursor = 'pointer';\r\n\t\t\t\t\tif (sampleColor.rgba[3] !== null && sampleColor.rgba[3] < 1.0) { // only create chessboard background if the sample has transparency\r\n\t\t\t\t\t\tsw.style.backgroundImage = 'url(\\'' + chessboard.canvas.toDataURL() + '\\')';\r\n\t\t\t\t\t\tsw.style.backgroundRepeat = 'repeat';\r\n\t\t\t\t\t\tsw.style.backgroundPosition = 'center center';\r\n\t\t\t\t\t}\r\n\t\t\t\t\tjsc.setData(sw, {\r\n\t\t\t\t\t\tinstance: THIS,\r\n\t\t\t\t\t\tcontrol: 'palette-sample',\r\n\t\t\t\t\t\tcolor: sampleColor,\r\n\t\t\t\t\t})\r\n\t\t\t\t\tsw.addEventListener('click', jsc.onPaletteSampleClick, false);\r\n\t\t\t\t\tsw.appendChild(sc);\r\n\t\t\t\t\tp.pal.appendChild(sw);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\r\n\t\t\t// the Close button\r\n\t\t\tfunction setBtnBorder () {\r\n\t\t\t\tvar insetColors = THIS.controlBorderColor.split(/\\s+/);\r\n\t\t\t\tvar outsetColor = insetColors.length < 2 ? insetColors[0] : insetColors[1] + ' ' + insetColors[0] + ' ' + insetColors[0] + ' ' + insetColors[1];\r\n\t\t\t\tp.btn.style.borderColor = outsetColor;\r\n\t\t\t}\r\n\t\t\tvar btnPadding = 15; // px\r\n\t\t\tp.btn.className = 'jscolor-btn-close';\r\n\t\t\tp.btn.style.display = THIS.closeButton ? 'block' : 'none';\r\n\t\t\tp.btn.style.position = 'absolute';\r\n\t\t\tp.btn.style.left = THIS.padding + 'px';\r\n\t\t\tp.btn.style.bottom = THIS.padding + 'px';\r\n\t\t\tp.btn.style.padding = '0 ' + btnPadding + 'px';\r\n\t\t\tp.btn.style.maxWidth = (pickerDims.contentW - 2 * THIS.controlBorderWidth - 2 * btnPadding) + 'px';\r\n\t\t\tp.btn.style.overflow = 'hidden';\r\n\t\t\tp.btn.style.height = THIS.buttonHeight + 'px';\r\n\t\t\tp.btn.style.whiteSpace = 'nowrap';\r\n\t\t\tp.btn.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\tsetBtnBorder();\r\n\t\t\tp.btn.style.color = THIS.buttonColor;\r\n\t\t\tp.btn.style.font = '12px sans-serif';\r\n\t\t\tp.btn.style.textAlign = 'center';\r\n\t\t\tp.btn.style.cursor = 'pointer';\r\n\t\t\tp.btn.onmousedown = function () {\r\n\t\t\t\tTHIS.hide();\r\n\t\t\t};\r\n\t\t\tp.btnT.style.lineHeight = THIS.buttonHeight + 'px';\r\n\t\t\tp.btnT.innerHTML = '';\r\n\t\t\tp.btnT.appendChild(window.document.createTextNode(THIS.closeText));\r\n\r\n\t\t\t// reposition the pointers\r\n\t\t\tredrawPad();\r\n\t\t\tredrawSld();\r\n\t\t\tredrawASld();\r\n\r\n\t\t\t// If we are changing the owner without first closing the picker,\r\n\t\t\t// make sure to first deal with the old owner\r\n\t\t\tif (jsc.picker.owner && jsc.picker.owner !== THIS) {\r\n\t\t\t\tjsc.removeClass(jsc.picker.owner.targetElement, jsc.pub.activeClassName);\r\n\t\t\t}\r\n\r\n\t\t\t// Set a new picker owner\r\n\t\t\tjsc.picker.owner = THIS;\r\n\r\n\t\t\t// The redrawPosition() method needs picker.owner to be set, that's why we call it here,\r\n\t\t\t// after setting the owner\r\n\t\t\tif (THIS.container === window.document.body) {\r\n\t\t\t\tjsc.redrawPosition();\r\n\t\t\t} else {\r\n\t\t\t\tjsc._drawPosition(THIS, 0, 0, 'relative', false);\r\n\t\t\t}\r\n\r\n\t\t\tif (p.wrap.parentNode !== THIS.container) {\r\n\t\t\t\tTHIS.container.appendChild(p.wrap);\r\n\t\t\t}\r\n\r\n\t\t\tjsc.addClass(THIS.targetElement, jsc.pub.activeClassName);\r\n\t\t}\r\n\r\n\r\n\t\tfunction redrawPad () {\r\n\t\t\t// redraw the pad pointer\r\n\t\t\tvar yChannel = jsc.getPadYChannel(THIS);\r\n\t\t\tvar x = Math.round((THIS.channels.h / 360) * (THIS.width - 1));\r\n\t\t\tvar y = Math.round((1 - THIS.channels[yChannel] / 100) * (THIS.height - 1));\r\n\t\t\tvar crossOuterSize = (2 * THIS.pointerBorderWidth + THIS.pointerThickness + 2 * THIS.crossSize);\r\n\t\t\tvar ofs = -Math.floor(crossOuterSize / 2);\r\n\t\t\tjsc.picker.cross.style.left = (x + ofs) + 'px';\r\n\t\t\tjsc.picker.cross.style.top = (y + ofs) + 'px';\r\n\r\n\t\t\t// redraw the slider\r\n\t\t\tswitch (jsc.getSliderChannel(THIS)) {\r\n\t\t\tcase 's':\r\n\t\t\t\tvar rgb1 = jsc.HSV_RGB(THIS.channels.h, 100, THIS.channels.v);\r\n\t\t\t\tvar rgb2 = jsc.HSV_RGB(THIS.channels.h, 0, THIS.channels.v);\r\n\t\t\t\tvar color1 = 'rgb(' +\r\n\t\t\t\t\tMath.round(rgb1[0]) + ',' +\r\n\t\t\t\t\tMath.round(rgb1[1]) + ',' +\r\n\t\t\t\t\tMath.round(rgb1[2]) + ')';\r\n\t\t\t\tvar color2 = 'rgb(' +\r\n\t\t\t\t\tMath.round(rgb2[0]) + ',' +\r\n\t\t\t\t\tMath.round(rgb2[1]) + ',' +\r\n\t\t\t\t\tMath.round(rgb2[2]) + ')';\r\n\t\t\t\tjsc.picker.sldGrad.draw(THIS.sliderSize, THIS.height, color1, color2);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'v':\r\n\t\t\t\tvar rgb = jsc.HSV_RGB(THIS.channels.h, THIS.channels.s, 100);\r\n\t\t\t\tvar color1 = 'rgb(' +\r\n\t\t\t\t\tMath.round(rgb[0]) + ',' +\r\n\t\t\t\t\tMath.round(rgb[1]) + ',' +\r\n\t\t\t\t\tMath.round(rgb[2]) + ')';\r\n\t\t\t\tvar color2 = '#000';\r\n\t\t\t\tjsc.picker.sldGrad.draw(THIS.sliderSize, THIS.height, color1, color2);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\t// redraw the alpha slider\r\n\t\t\tjsc.picker.asldGrad.draw(THIS.sliderSize, THIS.height, THIS.toHEXString());\r\n\t\t}\r\n\r\n\r\n\t\tfunction redrawSld () {\r\n\t\t\tvar sldChannel = jsc.getSliderChannel(THIS);\r\n\t\t\tif (sldChannel) {\r\n\t\t\t\t// redraw the slider pointer\r\n\t\t\t\tvar y = Math.round((1 - THIS.channels[sldChannel] / 100) * (THIS.height - 1));\r\n\t\t\t\tjsc.picker.sldPtrOB.style.top = (y - (2 * THIS.pointerBorderWidth + THIS.pointerThickness) - Math.floor(jsc.pub.sliderInnerSpace / 2)) + 'px';\r\n\t\t\t}\r\n\r\n\t\t\t// redraw the alpha slider\r\n\t\t\tjsc.picker.asldGrad.draw(THIS.sliderSize, THIS.height, THIS.toHEXString());\r\n\t\t}\r\n\r\n\r\n\t\tfunction redrawASld () {\r\n\t\t\tvar y = Math.round((1 - THIS.channels.a) * (THIS.height - 1));\r\n\t\t\tjsc.picker.asldPtrOB.style.top = (y - (2 * THIS.pointerBorderWidth + THIS.pointerThickness) - Math.floor(jsc.pub.sliderInnerSpace / 2)) + 'px';\r\n\t\t}\r\n\r\n\r\n\t\tfunction isPickerOwner () {\r\n\t\t\treturn jsc.picker && jsc.picker.owner === THIS;\r\n\t\t}\r\n\r\n\r\n\t\tfunction onValueKeyDown (ev) {\r\n\t\t\tif (jsc.eventKey(ev) === 'Enter') {\r\n\t\t\t\tif (THIS.valueElement) {\r\n\t\t\t\t\tTHIS.processValueInput(THIS.valueElement.value);\r\n\t\t\t\t}\r\n\t\t\t\tTHIS.tryHide();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction onAlphaKeyDown (ev) {\r\n\t\t\tif (jsc.eventKey(ev) === 'Enter') {\r\n\t\t\t\tif (THIS.alphaElement) {\r\n\t\t\t\t\tTHIS.processAlphaInput(THIS.alphaElement.value);\r\n\t\t\t\t}\r\n\t\t\t\tTHIS.tryHide();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction onValueChange (ev) {\r\n\t\t\tif (jsc.getData(ev, 'internal')) {\r\n\t\t\t\treturn; // skip if the event was internally triggered by jscolor\r\n\t\t\t}\r\n\r\n\t\t\tvar oldVal = THIS.valueElement.value;\r\n\r\n\t\t\tTHIS.processValueInput(THIS.valueElement.value); // this might change the value\r\n\r\n\t\t\tjsc.triggerCallback(THIS, 'onChange');\r\n\r\n\t\t\tif (THIS.valueElement.value !== oldVal) {\r\n\t\t\t\t// value was additionally changed -> let's trigger the change event again, even though it was natively dispatched\r\n\t\t\t\tjsc.triggerInputEvent(THIS.valueElement, 'change', true, true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction onAlphaChange (ev) {\r\n\t\t\tif (jsc.getData(ev, 'internal')) {\r\n\t\t\t\treturn; // skip if the event was internally triggered by jscolor\r\n\t\t\t}\r\n\r\n\t\t\tvar oldVal = THIS.alphaElement.value;\r\n\r\n\t\t\tTHIS.processAlphaInput(THIS.alphaElement.value); // this might change the value\r\n\r\n\t\t\tjsc.triggerCallback(THIS, 'onChange');\r\n\r\n\t\t\t// triggering valueElement's onChange (because changing alpha changes the entire color, e.g. with rgba format)\r\n\t\t\tjsc.triggerInputEvent(THIS.valueElement, 'change', true, true);\r\n\r\n\t\t\tif (THIS.alphaElement.value !== oldVal) {\r\n\t\t\t\t// value was additionally changed -> let's trigger the change event again, even though it was natively dispatched\r\n\t\t\t\tjsc.triggerInputEvent(THIS.alphaElement, 'change', true, true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction onValueInput (ev) {\r\n\t\t\tif (jsc.getData(ev, 'internal')) {\r\n\t\t\t\treturn; // skip if the event was internally triggered by jscolor\r\n\t\t\t}\r\n\r\n\t\t\tif (THIS.valueElement) {\r\n\t\t\t\tTHIS.fromString(THIS.valueElement.value, jsc.flags.leaveValue);\r\n\t\t\t}\r\n\r\n\t\t\tjsc.triggerCallback(THIS, 'onInput');\r\n\r\n\t\t\t// triggering valueElement's onInput\r\n\t\t\t// (not needed, it was dispatched normally by the browser)\r\n\t\t}\r\n\r\n\r\n\t\tfunction onAlphaInput (ev) {\r\n\t\t\tif (jsc.getData(ev, 'internal')) {\r\n\t\t\t\treturn; // skip if the event was internally triggered by jscolor\r\n\t\t\t}\r\n\r\n\t\t\tif (THIS.alphaElement) {\r\n\t\t\t\tTHIS.fromHSVA(null, null, null, parseFloat(THIS.alphaElement.value), jsc.flags.leaveAlpha);\r\n\t\t\t}\r\n\r\n\t\t\tjsc.triggerCallback(THIS, 'onInput');\r\n\r\n\t\t\t// triggering valueElement's onInput (because changing alpha changes the entire color, e.g. with rgba format)\r\n\t\t\tjsc.triggerInputEvent(THIS.valueElement, 'input', true, true);\r\n\t\t}\r\n\r\n\r\n\t\t// let's process the DEPRECATED 'options' property (this will be later removed)\r\n\t\tif (jsc.pub.options) {\r\n\t\t\t// let's set custom default options, if specified\r\n\t\t\tfor (var opt in jsc.pub.options) {\r\n\t\t\t\tif (jsc.pub.options.hasOwnProperty(opt)) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tsetOption(opt, jsc.pub.options[opt]);\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\t// let's apply configuration presets\r\n\t\t//\r\n\t\tvar presetsArr = [];\r\n\r\n\t\tif (opts.preset) {\r\n\t\t\tif (typeof opts.preset === 'string') {\r\n\t\t\t\tpresetsArr = opts.preset.split(/\\s+/);\r\n\t\t\t} else if (Array.isArray(opts.preset)) {\r\n\t\t\t\tpresetsArr = opts.preset.slice(); // slice() to clone\r\n\t\t\t} else {\r\n\t\t\t\tconsole.warn('Unrecognized preset value');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// always use the 'default' preset. If it's not listed, append it to the end.\r\n\t\tif (presetsArr.indexOf('default') === -1) {\r\n\t\t\tpresetsArr.push('default');\r\n\t\t}\r\n\r\n\t\t// let's apply the presets in reverse order, so that should there be any overlapping options,\r\n\t\t// the formerly listed preset will override the latter\r\n\t\tfor (var i = presetsArr.length - 1; i >= 0; i -= 1) {\r\n\t\t\tvar pres = presetsArr[i];\r\n\t\t\tif (!pres) {\r\n\t\t\t\tcontinue; // preset is empty string\r\n\t\t\t}\r\n\t\t\tif (!jsc.pub.presets.hasOwnProperty(pres)) {\r\n\t\t\t\tconsole.warn('Unknown preset: %s', pres);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tfor (var opt in jsc.pub.presets[pres]) {\r\n\t\t\t\tif (jsc.pub.presets[pres].hasOwnProperty(opt)) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tsetOption(opt, jsc.pub.presets[pres][opt]);\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\t// let's set specific options for this color picker\r\n\t\tvar nonProperties = [\r\n\t\t\t// these options won't be set as instance properties\r\n\t\t\t'preset',\r\n\t\t];\r\n\t\tfor (var opt in opts) {\r\n\t\t\tif (opts.hasOwnProperty(opt)) {\r\n\t\t\t\tif (nonProperties.indexOf(opt) === -1) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tsetOption(opt, opts[opt]);\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\t//\r\n\t\t// Install the color picker on chosen element(s)\r\n\t\t//\r\n\r\n\r\n\t\t// Determine picker's container element\r\n\t\tif (this.container === undefined) {\r\n\t\t\tthis.container = window.document.body; // default container is BODY element\r\n\r\n\t\t} else { // explicitly set to custom element\r\n\t\t\tthis.container = jsc.node(this.container);\r\n\t\t}\r\n\r\n\t\tif (!this.container) {\r\n\t\t\tthrow new Error('Cannot instantiate color picker without a container element');\r\n\t\t}\r\n\r\n\r\n\t\t// Fetch the target element\r\n\t\tthis.targetElement = jsc.node(targetElement);\r\n\r\n\t\tif (!this.targetElement) {\r\n\t\t\t// temporarily customized error message to help with migrating from versions prior to 2.2\r\n\t\t\tif (typeof targetElement === 'string' && /^[a-zA-Z][\\w:.-]*$/.test(targetElement)) {\r\n\t\t\t\t// targetElement looks like valid ID\r\n\t\t\t\tvar possiblyId = targetElement;\r\n\t\t\t\tthrow new Error('If \\'' + possiblyId + '\\' is supposed to be an ID, please use \\'#' + possiblyId + '\\' or any valid CSS selector.');\r\n\t\t\t}\r\n\r\n\t\t\tthrow new Error('Cannot instantiate color picker without a target element');\r\n\t\t}\r\n\r\n\t\tif (this.targetElement.jscolor && this.targetElement.jscolor instanceof jsc.pub) {\r\n\t\t\tthrow new Error('Color picker already installed on this element');\r\n\t\t}\r\n\r\n\r\n\t\t// link this instance with the target element\r\n\t\tthis.targetElement.jscolor = this;\r\n\t\tjsc.addClass(this.targetElement, jsc.pub.className);\r\n\r\n\t\t// register this instance\r\n\t\tjsc.instances.push(this);\r\n\r\n\r\n\t\t// if target is BUTTON\r\n\t\tif (jsc.isButton(this.targetElement)) {\r\n\r\n\t\t\tif (this.targetElement.type.toLowerCase() !== 'button') {\r\n\t\t\t\t// on buttons, always force type to be 'button', e.g. in situations the target <button> has no type\r\n\t\t\t\t// and thus defaults to 'submit' and would submit the form when clicked\r\n\t\t\t\tthis.targetElement.type = 'button';\r\n\t\t\t}\r\n\r\n\t\t\tif (jsc.isButtonEmpty(this.targetElement)) { // empty button\r\n\t\t\t\t// it is important to clear element's contents first.\r\n\t\t\t\t// if we're re-instantiating color pickers on DOM that has been modified by changing page's innerHTML,\r\n\t\t\t\t// we would keep adding more non-breaking spaces to element's content (because element's contents survive\r\n\t\t\t\t// innerHTML changes, but picker instances don't)\r\n\t\t\t\tjsc.removeChildren(this.targetElement);\r\n\r\n\t\t\t\t// let's insert a non-breaking space\r\n\t\t\t\tthis.targetElement.appendChild(window.document.createTextNode('\\xa0'));\r\n\r\n\t\t\t\t// set min-width = previewSize, if not already greater\r\n\t\t\t\tvar compStyle = jsc.getCompStyle(this.targetElement);\r\n\t\t\t\tvar currMinWidth = parseFloat(compStyle['min-width']) || 0;\r\n\t\t\t\tif (currMinWidth < this.previewSize) {\r\n\t\t\t\t\tjsc.setStyle(this.targetElement, {\r\n\t\t\t\t\t\t'min-width': this.previewSize + 'px',\r\n\t\t\t\t\t}, this.forceStyle);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Determine the value element\r\n\t\tif (this.valueElement === undefined) {\r\n\t\t\tif (jsc.isTextInput(this.targetElement)) {\r\n\t\t\t\t// for text inputs, default valueElement is targetElement\r\n\t\t\t\tthis.valueElement = this.targetElement;\r\n\t\t\t} else {\r\n\t\t\t\t// leave it undefined\r\n\t\t\t}\r\n\r\n\t\t} else if (this.valueElement === null) { // explicitly set to null\r\n\t\t\t// leave it null\r\n\r\n\t\t} else { // explicitly set to custom element\r\n\t\t\tthis.valueElement = jsc.node(this.valueElement);\r\n\t\t}\r\n\r\n\t\t// Determine the alpha element\r\n\t\tif (this.alphaElement) {\r\n\t\t\tthis.alphaElement = jsc.node(this.alphaElement);\r\n\t\t}\r\n\r\n\t\t// Determine the preview element\r\n\t\tif (this.previewElement === undefined) {\r\n\t\t\tthis.previewElement = this.targetElement; // default previewElement is targetElement\r\n\r\n\t\t} else if (this.previewElement === null) { // explicitly set to null\r\n\t\t\t// leave it null\r\n\r\n\t\t} else { // explicitly set to custom element\r\n\t\t\tthis.previewElement = jsc.node(this.previewElement);\r\n\t\t}\r\n\r\n\t\t// valueElement\r\n\t\tif (this.valueElement && jsc.isTextInput(this.valueElement)) {\r\n\r\n\t\t\t// If the value element has onInput event already set, we need to detach it and attach AFTER our listener.\r\n\t\t\t// otherwise the picker instance would still contain the old color when accessed from the onInput handler.\r\n\t\t\tvar valueElementOrigEvents = {\r\n\t\t\t\tonInput: this.valueElement.oninput\r\n\t\t\t};\r\n\t\t\tthis.valueElement.oninput = null;\r\n\r\n\t\t\tthis.valueElement.addEventListener('keydown', onValueKeyDown, false);\r\n\t\t\tthis.valueElement.addEventListener('change', onValueChange, false);\r\n\t\t\tthis.valueElement.addEventListener('input', onValueInput, false);\r\n\t\t\t// the original event listener must be attached AFTER our handler (to let it first set picker's color)\r\n\t\t\tif (valueElementOrigEvents.onInput) {\r\n\t\t\t\tthis.valueElement.addEventListener('input', valueElementOrigEvents.onInput, false);\r\n\t\t\t}\r\n\r\n\t\t\tthis.valueElement.setAttribute('autocomplete', 'off');\r\n\t\t\tthis.valueElement.setAttribute('autocorrect', 'off');\r\n\t\t\tthis.valueElement.setAttribute('autocapitalize', 'off');\r\n\t\t\tthis.valueElement.setAttribute('spellcheck', false);\r\n\t\t}\r\n\r\n\t\t// alphaElement\r\n\t\tif (this.alphaElement && jsc.isTextInput(this.alphaElement)) {\r\n\t\t\tthis.alphaElement.addEventListener('keydown', onAlphaKeyDown, false);\r\n\t\t\tthis.alphaElement.addEventListener('change', onAlphaChange, false);\r\n\t\t\tthis.alphaElement.addEventListener('input', onAlphaInput, false);\r\n\r\n\t\t\tthis.alphaElement.setAttribute('autocomplete', 'off');\r\n\t\t\tthis.alphaElement.setAttribute('autocorrect', 'off');\r\n\t\t\tthis.alphaElement.setAttribute('autocapitalize', 'off');\r\n\t\t\tthis.alphaElement.setAttribute('spellcheck', false);\r\n\t\t}\r\n\r\n\t\t// determine initial color value\r\n\t\t//\r\n\t\tvar initValue = 'FFFFFF';\r\n\r\n\t\tif (this.value !== undefined) {\r\n\t\t\tinitValue = this.value; // get initial color from the 'value' property\r\n\t\t} else if (this.valueElement && this.valueElement.value !== undefined) {\r\n\t\t\tinitValue = this.valueElement.value; // get initial color from valueElement's value\r\n\t\t}\r\n\r\n\t\t// determine initial alpha value\r\n\t\t//\r\n\t\tvar initAlpha = undefined;\r\n\r\n\t\tif (this.alpha !== undefined) {\r\n\t\t\tinitAlpha = (''+this.alpha); // get initial alpha value from the 'alpha' property\r\n\t\t} else if (this.alphaElement && this.alphaElement.value !== undefined) {\r\n\t\t\tinitAlpha = this.alphaElement.value; // get initial color from alphaElement's value\r\n\t\t}\r\n\r\n\t\t// determine current format based on the initial color value\r\n\t\t//\r\n\t\tthis._currentFormat = null;\r\n\r\n\t\tif (['auto', 'any'].indexOf(this.format.toLowerCase()) > -1) {\r\n\t\t\t// format is 'auto' or 'any' -> let's auto-detect current format\r\n\t\t\tvar color = jsc.parseColorString(initValue);\r\n\t\t\tthis._currentFormat = color ? color.format : 'hex';\r\n\t\t} else {\r\n\t\t\t// format is specified\r\n\t\t\tthis._currentFormat = this.format.toLowerCase();\r\n\t\t}\r\n\r\n\r\n\t\t// let's parse the initial color value and expose color's preview\r\n\t\tthis.processValueInput(initValue);\r\n\r\n\t\t// let's also parse and expose the initial alpha value, if any\r\n\t\t//\r\n\t\t// Note: If the initial color value contains alpha value in it (e.g. in rgba format),\r\n\t\t// this will overwrite it. So we should only process alpha input if there was initial\r\n\t\t// alpha explicitly set, otherwise we could needlessly lose initial value's alpha\r\n\t\tif (initAlpha !== undefined) {\r\n\t\t\tthis.processAlphaInput(initAlpha);\r\n\t\t}\r\n\r\n\t\tif (this.random) {\r\n\t\t\t// randomize the initial color value\r\n\t\t\tthis.randomize.apply(this, Array.isArray(this.random) ? this.random : []);\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n\r\n//================================\r\n// Public properties and methods\r\n//================================\r\n\r\n//\r\n// These will be publicly available via jscolor.<name> and JSColor.<name>\r\n//\r\n\r\n\r\n// class that will be set to elements having jscolor installed on them\r\njsc.pub.className = 'jscolor';\r\n\r\n\r\n// class that will be set to elements having jscolor active on them\r\njsc.pub.activeClassName = 'jscolor-active';\r\n\r\n\r\n// whether to try to parse the options string by evaluating it using 'new Function()'\r\n// in case it could not be parsed with JSON.parse()\r\njsc.pub.looseJSON = true;\r\n\r\n\r\n// presets\r\njsc.pub.presets = {};\r\n\r\n// built-in presets\r\njsc.pub.presets['default'] = {}; // baseline for customization\r\n\r\njsc.pub.presets['light'] = { // default color scheme\r\n\tbackgroundColor: 'rgba(255,255,255,1)',\r\n\tcontrolBorderColor: 'rgba(187,187,187,1)',\r\n\tbuttonColor: 'rgba(0,0,0,1)',\r\n};\r\njsc.pub.presets['dark'] = {\r\n\tbackgroundColor: 'rgba(51,51,51,1)',\r\n\tcontrolBorderColor: 'rgba(153,153,153,1)',\r\n\tbuttonColor: 'rgba(240,240,240,1)',\r\n};\r\n\r\njsc.pub.presets['small'] = { width:101, height:101, padding:10, sliderSize:14, paletteCols:8 };\r\njsc.pub.presets['medium'] = { width:181, height:101, padding:12, sliderSize:16, paletteCols:10 }; // default size\r\njsc.pub.presets['large'] = { width:271, height:151, padding:12, sliderSize:24, paletteCols:15 };\r\n\r\njsc.pub.presets['thin'] = { borderWidth:1, controlBorderWidth:1, pointerBorderWidth:1 }; // default thickness\r\njsc.pub.presets['thick'] = { borderWidth:2, controlBorderWidth:2, pointerBorderWidth:2 };\r\n\r\n\r\n// size of space in the sliders\r\njsc.pub.sliderInnerSpace = 3; // px\r\n\r\n// transparency chessboard\r\njsc.pub.chessboardSize = 8; // px\r\njsc.pub.chessboardColor1 = '#666666';\r\njsc.pub.chessboardColor2 = '#999999';\r\n\r\n// preview separator\r\njsc.pub.previewSeparator = ['rgba(255,255,255,.65)', 'rgba(128,128,128,.65)'];\r\n\r\n\r\n// Initializes jscolor\r\njsc.pub.init = function () {\r\n\tif (jsc.initialized) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t// attach some necessary handlers\r\n\twindow.document.addEventListener('mousedown', jsc.onDocumentMouseDown, false);\r\n\twindow.document.addEventListener('keyup', jsc.onDocumentKeyUp, false);\r\n\twindow.addEventListener('resize', jsc.onWindowResize, false);\r\n\twindow.addEventListener('scroll', jsc.onWindowScroll, false);\r\n\r\n\t// install jscolor on current DOM\r\n\tjsc.pub.install();\r\n\r\n\tjsc.initialized = true;\r\n\r\n\t// call functions waiting in the queue\r\n\twhile (jsc.readyQueue.length) {\r\n\t\tvar func = jsc.readyQueue.shift();\r\n\t\tfunc();\r\n\t}\r\n};\r\n\r\n\r\n// Installs jscolor on current DOM tree\r\njsc.pub.install = function (rootNode) {\r\n\tvar success = true;\r\n\r\n\ttry {\r\n\t\tjsc.installBySelector('[data-jscolor]', rootNode);\r\n\t} catch (e) {\r\n\t\tsuccess = false;\r\n\t\tconsole.warn(e);\r\n\t}\r\n\r\n\t// for backward compatibility with DEPRECATED installation using class name\r\n\tif (jsc.pub.lookupClass) {\r\n\t\ttry {\r\n\t\t\tjsc.installBySelector(\r\n\t\t\t\t(\r\n\t\t\t\t\t'input.' + jsc.pub.lookupClass + ', ' +\r\n\t\t\t\t\t'button.' + jsc.pub.lookupClass\r\n\t\t\t\t),\r\n\t\t\t\trootNode\r\n\t\t\t);\r\n\t\t} catch (e) {}\r\n\t}\r\n\r\n\treturn success;\r\n};\r\n\r\n\r\n// Registers function to be called as soon as jscolor is initialized (or immediately, if it already is).\r\n//\r\njsc.pub.ready = function (func) {\r\n\tif (typeof func !== 'function') {\r\n\t\tconsole.warn('Passed value is not a function');\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif (jsc.initialized) {\r\n\t\tfunc();\r\n\t} else {\r\n\t\tjsc.readyQueue.push(func);\r\n\t}\r\n\treturn true;\r\n};\r\n\r\n\r\n// Triggers given input event(s) (e.g. 'input' or 'change') on all color pickers.\r\n//\r\n// It is possible to specify multiple events separated with a space.\r\n// If called before jscolor is initialized, then the events will be triggered after initialization.\r\n//\r\njsc.pub.trigger = function (eventNames) {\r\n\tvar triggerNow = function () {\r\n\t\tjsc.triggerGlobal(eventNames);\r\n\t};\r\n\r\n\tif (jsc.initialized) {\r\n\t\ttriggerNow();\r\n\t} else {\r\n\t\tjsc.pub.ready(triggerNow);\r\n\t}\r\n};\r\n\r\n\r\n// Hides current color picker box\r\njsc.pub.hide = function () {\r\n\tif (jsc.picker && jsc.picker.owner) {\r\n\t\tjsc.picker.owner.hide();\r\n\t}\r\n};\r\n\r\n\r\n// Returns a data URL of a gray chessboard image that indicates transparency\r\njsc.pub.chessboard = function (color) {\r\n\tif (!color) {\r\n\t\tcolor = 'rgba(0,0,0,0)';\r\n\t}\r\n\tvar preview = jsc.genColorPreviewCanvas(color);\r\n\treturn preview.canvas.toDataURL();\r\n};\r\n\r\n\r\n// Returns a data URL of a gray chessboard image that indicates transparency\r\njsc.pub.background = function (color) {\r\n\tvar backgrounds = [];\r\n\r\n\t// CSS gradient for background color preview\r\n\tbackgrounds.push(jsc.genColorPreviewGradient(color));\r\n\r\n\t// data URL of generated PNG image with a gray transparency chessboard\r\n\tvar preview = jsc.genColorPreviewCanvas();\r\n\tbackgrounds.push([\r\n\t\t'url(\\'' + preview.canvas.toDataURL() + '\\')',\r\n\t\t'left top',\r\n\t\t'repeat',\r\n\t].join(' '));\r\n\r\n\treturn backgrounds.join(', ');\r\n};\r\n\r\n\r\n//\r\n// DEPRECATED properties and methods\r\n//\r\n\r\n\r\n// DEPRECATED. Use jscolor.presets.default instead.\r\n//\r\n// Custom default options for all color pickers, e.g. { hash: true, width: 300 }\r\njsc.pub.options = {};\r\n\r\n\r\n// DEPRECATED. Use data-jscolor attribute instead, which installs jscolor on given element.\r\n//\r\n// By default, we'll search for all elements with class=\"jscolor\" and install a color picker on them.\r\n//\r\n// You can change what class name will be looked for by setting the property jscolor.lookupClass\r\n// anywhere in your HTML document. To completely disable the automatic lookup, set it to null.\r\n//\r\njsc.pub.lookupClass = 'jscolor';\r\n\r\n\r\n// DEPRECATED. Use data-jscolor attribute instead, which installs jscolor on given element.\r\n//\r\n// Install jscolor on all elements that have the specified class name\r\njsc.pub.installByClassName = function () {\r\n\tconsole.error('jscolor.installByClassName() is DEPRECATED. Use data-jscolor=\"\" attribute instead of a class name.' + jsc.docsRef);\r\n\treturn false;\r\n};\r\n\r\n\r\njsc.register();\r\n\r\n\r\nreturn jsc.pub;\r\n\r\n\r\n})(); // END jscolor\r\n\r\n\r\nif (typeof window.jscolor === 'undefined') {\r\n\twindow.jscolor = window.JSColor = jscolor;\r\n}\r\n\r\n\r\n// END jscolor code\r\n\r\nreturn jscolor;\r\n\r\n}); // END factory\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/** The basic setting class */\nexport default class Setting {\n constructor(defaultValue, type, group) {\n this.defaultValue = defaultValue;\n this.type = type;\n this.group = group;\n }\n}\n","/** Creates a Prompt similar to the base game fixing some of the stuff breaking them\n * @param \t{string}\tcontent\t The outerHTML of the inputPrompt\n * @param \t{Array}\t\toptions\t An array containing labels and functions for the buttons of the prompt\n */\nexport default function cookieMonsterPrompt(content, options) {\n Game.promptWrapL.className = 'framed';\n Game.promptL.innerHTML = `${content}<div class=\"optionBox\"></div>`;\n Object.keys(options).forEach((i) => {\n const option = document.createElement('a');\n option.id = `promptOption${i}`;\n option.className = 'option';\n option.onclick = function () {\n PlaySound('snd/tick.mp3');\n options[i][1]();\n };\n option.textContent = options[i][0]; // eslint-disable-line prefer-destructuring\n Game.promptL.children[1].appendChild(option);\n });\n Game.promptAnchorL.style.display = 'block';\n Game.darkenL.style.display = 'block';\n Game.promptL.focus();\n Game.promptOn = 1;\n Game.UpdatePrompt();\n}\n","/**\n * This function creates a flash depending on config\n * @param\t{string}\tmodName\t The name of the mod\n * @param\t{number}\tmode\t Sets the intensity of the flash, used to recursively dim flash\n * \t\t\t\t\t\t\t\t All initial calls of function have use mode === 3\n * @param\t{string}\tconfigName\tThe setting that is checked before creating the flash\n * @param\t{bool} forced\t Whether the sound should play regardless of settings, used to test the sound\n */\n\nexport default function createFlash(modName, mode, configName, forced) {\n // The arguments check makes the sound not play upon initialization of the mod\n if (\n ((Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] === 1 || forced) &&\n mode === 3 &&\n window.cookieMonsterFrameworkData.isInitializing === false) ||\n mode === 1\n ) {\n l('CMFlashScreen').style.backgroundColor =\n Game.mods.cookieMonsterFramework.saveData[modName].settings[`Colour${configName}`];\n l('CMFlashScreen').style.opacity = '0.5';\n if (mode === 3) {\n l('CMFlashScreen').style.display = 'inline';\n setTimeout(() => {\n createFlash(modName, 2, configName, true);\n }, 1000 / Game.fps);\n } else {\n setTimeout(() => {\n createFlash(modName, 0, configName, true);\n }, 1000 / Game.fps);\n }\n } else if (mode === 2) {\n l('CMFlashScreen').style.opacity = '1';\n setTimeout(() => {\n createFlash(modName, 1, configName, true);\n }, 1000 / Game.fps);\n } else if (mode === 0) l('CMFlashScreen').style.display = 'none';\n}\n","/**\n * This function saves the settings and headers within the Framework without saving any of the other save-data\n * This allows saving in between the autosave intervals\n */\nexport default function saveFramework() {\n Object.keys(Game.mods.cookieMonsterFramework.saveData).forEach((modName) => {\n const modSaveString = JSON.stringify(Game.mods.cookieMonsterFramework.saveData[modName]);\n\n const cookieClickerSaveString = b64_to_utf8(\n unescape(localStorage.getItem('CookieClickerGame')).split('!END!')[0],\n );\n const pattern = new RegExp(`${modName}.*(;|$)`);\n const modSave = cookieClickerSaveString.match(pattern);\n if (modSave !== null) {\n const newSaveString = cookieClickerSaveString.replace(\n modSave[0],\n `${modName}:${modSaveString}`,\n );\n localStorage.setItem('CookieClickerGame', escape(`${utf8_to_b64(newSaveString)}!END!`));\n }\n });\n}\n","import saveFramework from '../../savingAndLoading/saveFramework';\n\n/**\n * This function toggles header options by incrementing them with 1 and handling changes\n * It is called by the onclick event of the +/- next to headers\n * @param \t{string}\tconfig\tThe name of the header\n */\nexport default function toggleHeader(modName, headerName) {\n if (\n typeof Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName] === 'undefined'\n ) {\n Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName] = 1;\n }\n switch (Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName]) {\n case 0:\n Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName] = 1;\n break;\n default:\n Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName] = 0;\n break;\n }\n saveFramework();\n}\n","/**\n * This function plays a sound depending on config\n * @param\t{string}\tmodName\t The name of the mod\n * @param\t{variable}\turl\t\t\tA variable that gives the url for the sound (e.g., CM.Options.GCSoundURL)\n * @param\t{string}\tsndConfig\tThe setting in CM.Options that is checked before creating the sound\n * @param\t{string}\tvolConfig\tThe setting in CM.Options that is checked to determine volume\n * @param\t{bool} forced\t\tWhether the sound should play regardless of settings, used to test the sound\n */\nexport default function playCMSound(modName, url, sndConfig, volConfig, forced) {\n if (\n (Game.mods.cookieMonsterFramework.saveData[modName].settings[sndConfig] === 1 || forced) &&\n window.cookieMonsterFrameworkData.isInitializing === false\n ) {\n // eslint-disable-next-line new-cap\n const sound = new Audio(url);\n if (Game.mods.cookieMonsterFramework.saveData[modName].settings.GeneralSound)\n sound.volume =\n (Game.mods.cookieMonsterFramework.saveData[modName].settings[volConfig] / 100) *\n (Game.volume / 100);\n else\n sound.volume = Game.mods.cookieMonsterFramework.saveData[modName].settings[volConfig] / 100;\n sound.play();\n }\n}\n","import saveFramework from '../savingAndLoading/saveFramework';\n\n/**\n * This function sets the value of the specified volume-option and updates the display in the options menu\n * It is called by the oninput and onchange event of \"vol\" type options\n * @param \t{string}\tmodName\t The name of the option\n * @param \t{string} configName The name of the option\n */\nexport default function toggleConfigVolume(modName, configName) {\n if (l(`slider${modName}${configName}`) !== null) {\n l(`slider${modName}${configName}right`).innerHTML = `${\n l(`slider${modName}${configName}`).value\n }%`;\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = Math.round(\n l(`slider${modName}${configName}`).value,\n );\n }\n saveFramework();\n}\n","import addInfoMenuSection from './info/addInfoMenuSection';\n// import addOptionsMenuSection from './options/addOptionsMenuSection';\n\n/**\n * Call the function to add a Menu based on the current menu\n * @param {MutationObserver} The observer object that is listening to DOM-changes of id='menu'\n */\nexport default function addMenu(_, observer) {\n // Disconnect observer to avoid infinite loop\n observer.disconnect();\n\n if (Game.onMenu === 'log') {\n addInfoMenuSection();\n } else if (Game.onMenu === 'prefs') {\n // Commented out because this is broken\n // addOptionsMenuSection();\n }\n\n // Reconnect observer to monitor changes\n observer.observe(document.getElementById('menu'), {\n attributes: true,\n childList: true,\n subtree: true,\n });\n}\n","import createFrameworkInfoMenuSection from './createFrameworkInfoMenuSection';\n/**\n * Add things to the Info menu\n * The listeners.infoMenu objects contains functions which create <div>'s to add to the menu section\n */\nexport default function addInfoMenuSection() {\n const menu = l('menu').children[1];\n menu.insertBefore(createFrameworkInfoMenuSection(), menu.children[1]);\n\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu) {\n const listeners = Game.mods.cookieMonsterFramework.listeners.infoMenu;\n for (let i = 0; i < listeners.length; i++) {\n l('cookieMonsterFrameworkMenuSection').appendChild(listeners[i]());\n }\n }\n}\n","import modDescription from '../../data/modInfo';\nimport toggleHeader from '../../../menu/toggles/toggleHeader';\n/**\n * Add things to the Info menu\n * @returns {object} frameworkInfoDiv Subsection to which other mods can add their info sections\n */\nexport default function createFrameworkInfoMenuSection() {\n const frameworkInfoDiv = document.createElement('div');\n frameworkInfoDiv.className = 'subsection';\n frameworkInfoDiv.id = 'cookieMonsterFrameworkMenuSection';\n\n const titleDiv = document.createElement('div');\n titleDiv.className = 'title';\n titleDiv.innerHTML = 'Cookie Monster Mod Family';\n\n const buttonSpan = document.createElement('span');\n buttonSpan.style.cursor = 'pointer';\n buttonSpan.style.display = 'inline-block';\n buttonSpan.style.height = '14px';\n buttonSpan.style.width = '14px';\n buttonSpan.style.borderRadius = '7px';\n buttonSpan.style.textAlign = 'center';\n buttonSpan.style.backgroundColor = '#C0C0C0';\n buttonSpan.style.color = 'black';\n buttonSpan.style.fontSize = '13px';\n buttonSpan.style.verticalAlign = 'middle';\n buttonSpan.textContent = Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers\n .infoMenu\n ? '-'\n : '+';\n buttonSpan.onclick = function () {\n toggleHeader('cookieMonsterFramework', 'infoMenu');\n Game.UpdateMenu();\n };\n titleDiv.appendChild(buttonSpan);\n\n frameworkInfoDiv.appendChild(titleDiv);\n\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu) {\n const descriptionDiv = document.createElement('div');\n descriptionDiv.className = 'listing';\n descriptionDiv.innerHTML = modDescription;\n frameworkInfoDiv.appendChild(descriptionDiv);\n }\n\n return frameworkInfoDiv;\n}\n","/**\n * Short description of the mod\n */\nconst modDescription = `<a href=\"https://github.com/CookieMonsterTeam\" target=\"blank\">Cookie Monster Team</a>\noffers a suite of tools to enhance your game experience.</br>\nOriginally known from our work on the Cookie Monster add-on we are now expanding and working on new tools within the Cookie Monster Mod Family.</br>\nKeep an eye on our GitHub to see future work or use it to report bugs or feature requests!</br>\n`;\n\nexport default modDescription;\n","/**\n * Main draw loop\n */\nexport default function drawLoop() {}\n","/** This includes all headers of the Cookie Monster Framework and their relevant data */\nconst headers = { infoMenu: 1, optionsMenu: 1 };\nexport default headers;\n","import createSaveDataObject from './createSaveDataObject';\nimport saveFramework from './saveFramework';\n\n/**\n * Load the data from a save-file into a mod\n * @param {string} modName The name of the mode to be saved\n * @param {string} saveData JSON-string of the save data\n * @param {object} settingsData The data containing default values of settings\n * @param {object} headersData The data containing default values of headers\n * @param {Function} logicLoop The logic-loop of the mod\n */\nexport default function loadMod(modName, saveData, settingsData, headersData, logicLoop) {\n const saveDataObject = JSON.parse(saveData);\n Game.mods.cookieMonsterFramework.saveData[modName] = createSaveDataObject(\n saveDataObject,\n settingsData,\n headersData,\n );\n saveFramework();\n logicLoop();\n Object.keys(Game.mods.cookieMonsterFramework.saveData[modName].settings).forEach((i) => {\n if (typeof settingsData[i].func !== 'undefined') {\n settingsData[i].func();\n }\n });\n Game.UpdateMenu();\n}\n","/**\n * Creates the save data object to be stored\n * @param {object} saveData The loaded save data\n * @param {object} settingsData The data containing default values of settings\n * @param {object} headersData The data containing default values of headers\n */\nexport default function createSaveDataObject(saveData, settingsData, headersData) {\n const modSaveData = {};\n\n // When a setting is missing (because it is new or modified) these lines add the default value\n const settingsObject = {};\n Object.keys(settingsData).forEach((i) => {\n if (typeof saveData.settings === 'undefined' || typeof saveData.settings[i] === 'undefined') {\n settingsObject[i] = settingsData[i].defaultValue; // eslint-disable-line prefer-destructuring\n } else {\n settingsObject[i] = saveData.settings[i];\n }\n });\n modSaveData.settings = settingsObject;\n\n // When a header is missing (because it is new or modified) these lines add the default value\n const headersObject = {};\n Object.keys(headersData).forEach((i) => {\n if (typeof saveData.headers === 'undefined' || typeof saveData.headers[i] === 'undefined') {\n headersObject[i] = headersData[i];\n } else {\n headersObject[i] = saveData.headers[i];\n }\n });\n modSaveData.headers = headersObject;\n\n Object.keys(saveData).forEach((key) => {\n if (key !== 'settings' && key !== 'headers') {\n modSaveData[key] = saveData[key];\n }\n });\n\n if (typeof modSaveData.favouriteSettings === 'undefined') {\n modSaveData.favouriteSettings = [];\n }\n return modSaveData;\n}\n","/**\n * Main logic loop\n */\nexport default function logicLoop() {}\n","/** This includes all options of the Cookie Monster Framework and their relevant data */\nconst settings = {};\nexport default settings;\n","import headers from './data/headers';\nimport loadMod from '../savingAndLoading/loadMod';\nimport logicLoop from './logic/logicLoop';\nimport settings from './data/settings';\n\n/**\n * This creates a load function to the CM object. Per Game code/comments:\n * \"do stuff with the string data you saved previously\"\n * @param {string} JSON string of save-data\n */\nexport default function load(str) {\n loadMod('cookieMonsterFramework', str, settings, headers, logicLoop);\n}\n","import init from './init';\nimport load from './load';\nimport save from './save';\n\n/** The mod object to be registered with the Modding API */\nconst cookieMonsterFramework = {\n init,\n load,\n save,\n listeners: {\n infoMenu: [],\n optionsMenu: [],\n },\n saveData: { cookieMonsterFramework: { headers: {}, settings: {} } },\n};\n\nexport default cookieMonsterFramework;\n","import addMenu from './menuSections/addMenu';\nimport createFlashScreen from './init/createFlashScreen';\nimport drawLoop from './draw/drawLoop';\nimport load from './load';\n\n/**\n * This creates a init function for the CM object. Per Game code/comments:\n * \"this function is called as soon as the mod is registered\n * declare hooks here\"\n * It starts the further initialization of CookieMonster and registers hooks\n */\nexport default function init() {\n // Create Data object in global scope\n window.cookieMonsterFrameworkData = { isInitializing: true };\n\n // Create MutationObserver for menu sections\n const observer = new MutationObserver(addMenu);\n observer.observe(document.getElementById('menu'), {\n attributes: true,\n childList: true,\n subtree: true,\n });\n\n // Draw initiaization\n createFlashScreen();\n\n // Register hooks\n Game.registerHook('draw', drawLoop);\n\n // Load defaults if there is no previous save\n if (typeof Game.modSaveData.cookieMonsterFramework === 'undefined') {\n load('{}');\n }\n window.cookieMonsterFrameworkData.isInitializing = false;\n}\n","/**\n * This function creates a white square over the full screen and appends it to l('wrapper')\n */\nexport default function createFlashScreen() {\n const WhiteScreen = document.createElement('div');\n WhiteScreen.id = 'CMFlashScreen';\n WhiteScreen.style.width = '100%';\n WhiteScreen.style.height = '100%';\n WhiteScreen.style.backgroundColor = 'white';\n WhiteScreen.style.display = 'none';\n WhiteScreen.style.zIndex = '9999999999';\n WhiteScreen.style.position = 'absolute';\n WhiteScreen.style.pointerEvents = \"none\";\n l('wrapper').appendChild(WhiteScreen);\n}\n","/**\n * This creates a save function to the CM object. Per Game code/comments:\n * \"use this to store persistent data associated with your mod\n * return 'a string to be saved';\"\n * @returns {string} The data to be saved\n */\nexport default function save() {\n return JSON.stringify(Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework);\n}\n","import SettingColours from './options/settingClasses/settingColours';\nimport SettingInputNumber from './options/settingClasses/settingInputNumber';\nimport SettingKeycode from './options/settingClasses/settingKeycode';\nimport SettingStandard from './options/settingClasses/settingStandard';\nimport SettingStandardWithFunc from './options/settingClasses/settingStandardWithFunc';\nimport SettingVolume from './options/settingClasses/settingVolume';\nimport cookieMonsterPrompt from './notifications/prompt';\nimport createFlash from './notifications/flash';\nimport createInfoListing from './menu/listings/createInfoListing';\nimport createModMenuSection from './menu/createModMenuSection';\nimport createNotification from './notifications/notification';\nimport createOptionsListing from './menu/listings/createOptionListing';\nimport createOptionsSubHeader from './menu/listings/createOptionsSubHeader';\nimport initModFramework from './init/initModFramework';\nimport loadMod from './savingAndLoading/loadMod';\nimport playCMSound from './notifications/sound';\nimport registerMod from './init/registerMod';\nimport saveFramework from './savingAndLoading/saveFramework';\n\nexport const initFunctions = {\n initModFramework,\n registerMod,\n};\nexport const menuFunctions = {\n listings: {\n createInfoListing,\n createOptionsListing,\n createOptionsSubHeader,\n },\n createModMenuSection,\n};\n\nexport const notificationsFunctions = {\n createFlash,\n createNotification,\n cookieMonsterPrompt,\n playCMSound,\n};\n\nexport const optionFunctions = {};\n\nexport const saveAndLoadingFunctions = {\n loadMod,\n saveFramework,\n};\n\nexport const settingClasses = {\n SettingColours,\n SettingInputNumber,\n SettingStandard,\n SettingStandardWithFunc,\n SettingKeycode,\n SettingVolume,\n};\n","import cookieMonsterFramework from '../frameworkDataObject/cookieMonsterFramework';\n\n/** Check if Cookie Monster Mod Framework has been loaded yet and if not, does so */\nexport default function initModFramework() {\n if (typeof cookieMonsterFrameworkData === 'undefined') {\n Game.registerMod('cookieMonsterFramework', cookieMonsterFramework);\n }\n}\n","/**\n * Adds the mod to the saveData object to store (favourite) settings and headers\n */\nexport default function registerMod(modName) {\n Game.mods.cookieMonsterFramework.saveData[modName] = {\n favouriteSettings: [],\n headers: {},\n settings: {},\n };\n}\n","/**\n * Returns a subsection for the mod to add listings/info to\n * @param {string} listingHTML The innerHTML of the listing\n * @returns {object} listingDiv Div of the subseciont\n */\nexport default function createInfoListing(listingHTML) {\n const listingDiv = document.createElement('div');\n listingDiv.className = 'listing';\n listingDiv.innerHTML = listingHTML;\n return listingDiv;\n}\n","import jscolor, * as JsColor from '@eastdesire/jscolor';\n\nimport cookieMonsterPrompt from '../../notifications/prompt';\nimport createFavouriteStar from './createOptionsFavouriteStar';\nimport createFlash from '../../notifications/flash';\nimport playCMSound from '../../notifications/sound';\nimport saveFramework from '../../savingAndLoading/saveFramework';\nimport toggleConfig from '../../options/toggleConfig';\nimport toggleConfigKeycode from '../../options/toggleConfigKeycode';\nimport toggleConfigVolume from '../../options/toggleConfigVolume';\n\n/**\n * This function creates an option listing div-object\n * @param \t{string}\t\tmodName\t The name of the option\n * @param \t{string}\t\tconfigName\t The name of the option\n * @param \t{object}\t\tsettingsData\t Object with data about the settings\n * @param \t{function}\tupdateColoursFunc\tFunction to be called to update colours\n * @param \t{function}\trefreshScaleFunc\tFunction to be called to refresh scale\n * @returns\t{object}\t\tdiv\t\t The option object\n */\nexport default function createOptionsListing(\n modName,\n configName,\n settingsData,\n updateColoursFunc,\n refreshScaleFunc,\n) {\n const div = document.createElement('div');\n div.className = 'listing';\n\n if (Game.mods.cookieMonsterFramework.saveData[modName].settings.FavouriteSettings === 1) {\n div.appendChild(\n createFavouriteStar(\n modName,\n configName,\n Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings,\n ),\n );\n }\n\n if (settingsData[configName].type === 'bool') {\n // Create toggle button\n const a = document.createElement('a');\n if (\n settingsData[configName].toggle &&\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] === 0\n ) {\n a.className = 'option off';\n } else {\n a.className = 'option';\n }\n a.id = `${modName}Options${configName}`;\n a.onclick = function () {\n toggleConfig(modName, configName, settingsData);\n Game.UpdateMenu();\n };\n a.textContent =\n settingsData[configName].label[\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName]\n ];\n div.appendChild(a);\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n div.appendChild(label);\n return div;\n }\n\n if (settingsData[configName].type === 'vol') {\n const volume = document.createElement('div');\n\n // Create slider\n volume.className = 'sliderBox';\n const title = document.createElement('div');\n title.style.float = 'left';\n title.innerHTML = settingsData[configName].desc;\n volume.appendChild(title);\n const percent = document.createElement('div');\n percent.id = `slider${modName}${configName}right`;\n percent.style.float = 'right';\n percent.innerHTML = `${Game.mods.cookieMonsterFramework.saveData[modName].settings[configName]}%`;\n volume.appendChild(percent);\n const slider = document.createElement('input');\n slider.className = 'slider';\n slider.id = `slider${modName}${configName}`;\n slider.style.clear = 'both';\n slider.type = 'range';\n slider.min = '0';\n slider.max = '100';\n slider.step = '1';\n slider.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n slider.oninput = function () {\n toggleConfigVolume(modName, configName);\n Game.UpdateMenu();\n };\n slider.onchange = function () {\n toggleConfigVolume(modName, configName);\n Game.UpdateMenu();\n };\n volume.appendChild(slider);\n div.appendChild(volume);\n\n // Create test sound button\n const a = document.createElement('a');\n a.className = 'option';\n a.onclick = function () {\n playCMSound(\n modName,\n Game.mods.cookieMonsterFramework.saveData[modName].settings[\n configName.replace('Volume', 'SoundURL')\n ],\n configName.replace('Volume', 'Sound'),\n configName,\n true,\n );\n };\n a.textContent = 'Test sound';\n div.appendChild(a);\n return div;\n }\n\n if (settingsData[configName].type === 'url') {\n // Create label\n const span = document.createElement('span');\n span.className = 'option';\n span.textContent = `${settingsData[configName].label} `;\n span.style.lineHeight = '1.6';\n div.appendChild(span);\n\n // Create input\n const input = document.createElement('input');\n input.id = `${modName}Options${configName}`;\n input.className = 'option';\n input.type = 'text';\n input.readOnly = true;\n input.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n input.style.width = '300px';\n div.appendChild(input);\n div.appendChild(document.createTextNode(' '));\n\n // Create prompt\n const inputPrompt = document.createElement('input');\n inputPrompt.id = `${modName}Options${configName}Prompt`;\n inputPrompt.className = 'option';\n inputPrompt.type = 'text';\n inputPrompt.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n\n const a = document.createElement('a');\n a.className = 'option';\n a.onclick = function () {\n cookieMonsterPrompt(inputPrompt.outerHTML, [\n [\n 'Save',\n function () {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = l(\n `${modName}Options${configName}Prompt`,\n ).value;\n saveFramework();\n Game.ClosePrompt();\n Game.UpdateMenu();\n },\n ],\n [\n 'Cancel',\n function () {\n Game.ClosePrompt();\n },\n ],\n ]);\n };\n a.textContent = 'Edit';\n div.appendChild(a);\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n div.appendChild(label);\n return div;\n }\n\n if (settingsData[configName].type === 'colour') {\n const innerSpan = document.createElement('span');\n innerSpan.className = 'option';\n\n // Create input\n const input = document.createElement('input');\n input.id = configName;\n input.style.width = '65px';\n input.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n innerSpan.appendChild(input);\n const change = function () {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[this.targetElement.id] =\n this.toHEXString();\n updateColoursFunc();\n saveFramework();\n Game.UpdateMenu();\n };\n // eslint-disable-next-line no-new\n new JsColor(input, { hash: true, position: 'right', onInput: change });\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n innerSpan.appendChild(label);\n\n // Create test button for flash colour\n if (configName.includes('Flash')) {\n const a = document.createElement('a');\n a.className = 'option';\n a.onclick = function () {\n createFlash(modName, 3, configName.replace('Colour', ''), true);\n };\n a.textContent = 'Test flash';\n innerSpan.appendChild(a);\n }\n div.appendChild(innerSpan);\n jscolor.init();\n return div;\n }\n\n if (settingsData[configName].type === 'numscale') {\n const span = document.createElement('span');\n span.className = 'option';\n span.textContent = `${settingsData[configName].label} `;\n span.style.lineHeight = '1.6';\n div.appendChild(span);\n\n // Create input\n const input = document.createElement('input');\n input.id = `${modName}Options${configName}`;\n input.className = 'option';\n input.type = 'number';\n input.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n input.min = settingsData[configName].min;\n input.max = settingsData[configName].max;\n input.oninput = function () {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = this.value;\n saveFramework();\n refreshScaleFunc();\n Game.UpdateMenu();\n };\n div.appendChild(input);\n div.appendChild(document.createTextNode(' '));\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n div.appendChild(label);\n return div;\n }\n\n if (settingsData[configName].type === 'keycode') {\n // Create prompt\n const inputPrompt = document.createElement('input');\n inputPrompt.id = `${modName}Options${configName}Prompt`;\n inputPrompt.className = 'option';\n inputPrompt.type = 'text';\n inputPrompt.value =\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName].displayName;\n\n // Create toggle button\n const a = document.createElement('a');\n a.className = 'option';\n a.id = `${modName}Options${configName}`;\n a.onclick = function () {\n cookieMonsterPrompt(inputPrompt.outerHTML, []);\n l(`${modName}Options${configName}Prompt`).addEventListener('keyup', (e) => {\n toggleConfigKeycode(modName, configName, e);\n Game.ClosePrompt();\n Game.UpdateMenu();\n });\n };\n a.textContent =\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName].displayName;\n div.appendChild(a);\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n div.appendChild(label);\n return div;\n }\n return div;\n}\n","import saveFramework from '../../savingAndLoading/saveFramework';\nimport toggleFavouriteSetting from '../toggles/toggleFavourite';\n/**\n * This function creates the favourite setting star div-object\n * @param \t{string} modName\t The name of the Mod\n * @param \t{string} configName\tThe name of the option\n * @parm {array} favourites An array with the names of all settings that are currently favourited\n * @returns\t{object} div\t\t The option object\n */\nexport default function createFavouriteStar(modName, configName, favourites) {\n const FavStar = document.createElement('a');\n if (favourites.includes(configName)) {\n FavStar.innerText = '★';\n FavStar.style.color = 'yellow';\n } else FavStar.innerText = '☆';\n FavStar.className = 'option';\n FavStar.onclick = function () {\n toggleFavouriteSetting(modName, configName);\n saveFramework();\n Game.UpdateMenu();\n };\n FavStar.onmouseover = function () {\n Game.tooltip.draw(\n this,\n escape(\n '<div style=\"min-width: 250px; margin-bottom: 4px;\"><div style=\"text-align: left;\">Click to set this setting as favourite and show it in \\'favourite\\' settings at the top of the Cookie Monster Settings</div></div>',\n ),\n );\n };\n FavStar.onmouseout = function () {\n Game.tooltip.hide();\n };\n FavStar.appendChild(document.createTextNode(' '));\n return FavStar;\n}\n","import saveFramework from '../../savingAndLoading/saveFramework';\n\n/**\n * This function toggles favourite settings by adding them to an array in the savedata\n * It is called by the onclick event of the favourite stars\n * @param \t{string} modName\t The name of the mod\n * @param \t{string}\tconfigName\tThe name of the setting\n */\nexport default function toggleFavouriteSetting(modName, configName) {\n if (Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings.includes(configName))\n Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings =\n Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings.filter(\n (ele) => ele !== configName,\n );\n else Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings.push(configName);\n saveFramework();\n}\n","import saveFramework from '../savingAndLoading/saveFramework';\n\n/**\n * This function toggles options by incrementing them with 1 and handling changes\n * It is called by the onclick event of options of the \"bool\" type\n * @param \t{string}\tmodName\t The name of the option\n * @param \t{string}\tconfigName\t The name of the option\n * @param \t{object}\tsettingsData\tObject with data about the settings\n */\nexport default function toggleConfig(modName, configName, settingsData) {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] += 1;\n if (\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] ===\n settingsData[configName].label.length\n ) {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = 0;\n if (settingsData[configName].toggle)\n l(`${modName}Options${configName}`).className = 'option off';\n } else l(`${modName}Options${configName}`).className = 'option';\n\n if (typeof settingsData[configName].func !== 'undefined') {\n settingsData[configName].func();\n }\n\n saveFramework();\n}\n","import saveFramework from '../savingAndLoading/saveFramework';\n\n/**\n * This function toggles options by deconstructing the KeyboardEvent\n * It is called by the onclick event of prompts of the \"keycode\" type\n * @param \t{string}\tmodName\t The name of the option\n * @param \t{string}\tconfigName\t The name of the option\n * @param {object} event The KeyboardEvent\n */\nexport default function toggleConfigKeycode(modName, configName, event) {\n const saveObject = {\n key: event.key,\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n shiftKey: event.shiftKey,\n displayName: `${event.shiftKey ? `Shift + ` : ''}${event.altKey ? `Alt + ` : ''}${\n event.ctrlKey ? `Ctrl + ` : ''\n }${event.key}`,\n };\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = saveObject;\n saveFramework();\n}\n","import toggleHeader from '../toggles/toggleHeader';\n\n/**\n * This function creates a header-object for the options page\n * @param \t{string}\t\tmodName\t The name of the mod\n * @param \t{string}\t\tconfigName\tThe name of the Config-group\n * @param \t{string}\t\ttext\t The to-be displayed name of the header\n * @returns\t{object}\t\tdiv\t\t The header object\n */\nexport default function createOptionsSubHeader(modName, configName, text) {\n const div = document.createElement('div');\n div.className = 'title';\n\n div.style.opacity = '0.7';\n div.style.fontSize = '17px';\n div.appendChild(document.createTextNode(`${text} `));\n\n // Creates the +/- button\n const span = document.createElement('span');\n span.style.cursor = 'pointer';\n span.style.display = 'inline-block';\n span.style.height = '14px';\n span.style.width = '14px';\n span.style.borderRadius = '7px';\n span.style.textAlign = 'center';\n span.style.backgroundColor = '#C0C0C0';\n span.style.color = 'black';\n span.style.fontSize = '13px';\n span.style.verticalAlign = 'middle';\n span.textContent = Game.mods.cookieMonsterFramework.saveData[modName].headers[configName]\n ? '-'\n : '+';\n span.onclick = function () {\n toggleHeader(modName, configName);\n Game.UpdateMenu();\n };\n div.appendChild(span);\n return div;\n}\n","import toggleHeader from './toggles/toggleHeader';\n\n/**\n * Returns a subsection for the mod to add listings/info to\n * @param {string} modName The name of the mod (i.e., CookieMonster)\n * @param {string} modDisplayName Display name of the mod (i.e., Cookie Monster)\n * @param {string} menuName Name of the menu (i.e., Info, Options)\n * @returns {object} modSectionDiv Div of the subseciont\n */\nexport default function createModMenuSection(modName, modDisplayName, menuName) {\n const modSectionDiv = document.createElement('div');\n modSectionDiv.className = 'subsection';\n modSectionDiv.id = `${modName}MenuSection`;\n\n const titleDiv = document.createElement('div');\n titleDiv.className = 'title';\n titleDiv.style.fontSize = '18px';\n titleDiv.innerHTML = modDisplayName;\n\n const buttonSpan = document.createElement('span'); // Creates the +/- button\n buttonSpan.style.cursor = 'pointer';\n buttonSpan.style.display = 'inline-block';\n buttonSpan.style.height = '14px';\n buttonSpan.style.width = '14px';\n buttonSpan.style.borderRadius = '7px';\n buttonSpan.style.textAlign = 'center';\n buttonSpan.style.backgroundColor = '#C0C0C0';\n buttonSpan.style.color = 'black';\n buttonSpan.style.fontSize = '13px';\n buttonSpan.style.verticalAlign = 'middle';\n buttonSpan.textContent = Game.mods.cookieMonsterFramework.saveData[modName].headers[menuName]\n ? '-'\n : '+';\n buttonSpan.onclick = function () {\n toggleHeader(modName, menuName);\n Game.UpdateMenu();\n };\n\n titleDiv.appendChild(buttonSpan);\n\n modSectionDiv.appendChild(titleDiv);\n\n return modSectionDiv;\n}\n","/**\n * This function creates a notifcation depending on config\n * @param\t{string}\tmodName\t The name of the mod\n * @param\t{string}\tconfigName\tThe setting in CM.Options that is checked before creating the notification\n * @param\t{string}\ttitle\t\t\t The title of the to-be created notifications\n * @param\t{string}\tmessage\t\t\tThe text of the to-be created notifications\n */\nexport default function createNotification(modName, configName, title, message) {\n if (\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] === 1 &&\n document.visibilityState === 'hidden' &&\n window.cookieMonsterFrameworkData.isInitializing === false\n ) {\n // eslint-disable-next-line no-new\n new Notification(title, {\n body: message,\n badge: 'https://orteil.dashnet.org/cookieclicker/favicon.ico',\n });\n }\n}\n","import Setting from './baseSetting';\n\n/** The colour picker setting class */\nexport default class SettingColours extends Setting {\n constructor(defaultValue, type, group, desc) {\n super(defaultValue, type, group);\n this.desc = desc;\n }\n}\n","import Setting from './baseSetting';\n\n/** The number input setting class */\nexport default class SettingInputNumber extends Setting {\n constructor(defaultValue, type, group, label, desc, min, max) {\n super(defaultValue, type, group);\n this.label = label;\n this.desc = desc;\n this.min = min;\n this.max = max;\n }\n}\n","import Setting from './baseSetting';\n\n/** The standard toggle setting class */\nexport default class SettingStandard extends Setting {\n constructor(defaultValue, type, group, label, desc, toggle) {\n super(defaultValue, type, group);\n this.label = label;\n this.desc = desc;\n this.toggle = toggle;\n }\n}\n","import Setting from './baseSetting';\n\n/** The standard toggle setting class with functions */\nexport default class SettingStandardWithFunc extends Setting {\n constructor(defaultValue, type, group, label, desc, toggle, func) {\n super(defaultValue, type, group);\n this.label = label;\n this.desc = desc;\n this.toggle = toggle;\n if (func !== undefined) {\n this.func = func;\n }\n }\n}\n","import Setting from './baseSetting';\n\n/** The volume level setting class */\nexport default class SettingVolume extends Setting {\n constructor(defaultValue, type, group, label, desc) {\n super(defaultValue, type, group);\n this.label = label;\n this.desc = desc;\n for (let i = 0; i < 101; i++) {\n this.label[i] = `${i}%`;\n }\n }\n}\n","/**\r\n * This function updates the display setting of the two objects created by CM.Disp.CreateWrinklerButtons()\r\n * It is called by changes in CM.Options.WrinklerButtons\r\n */\r\nexport default function ToggleWrinklerButtons() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerButtons &&\r\n Game.elderWrath\r\n ) {\r\n l('PopAllNormalWrinklerButton').style.display = '';\r\n l('PopFattestWrinklerButton').style.display = '';\r\n } else {\r\n l('PopAllNormalWrinklerButton').style.display = 'none';\r\n l('PopFattestWrinklerButton').style.display = 'none';\r\n }\r\n}\r\n","/* eslint-disable prefer-const */\r\n\r\nexport let CacheDragonAura = 0;\r\nexport let CacheDragonAura2 = 0;\r\nexport let CacheLastDragonLevel = 0;\r\nexport let CacheCostDragonUpgrade = 0;\r\nexport let CacheLucky = 0;\r\nexport let CacheLuckyReward = 0;\r\nexport let CacheLuckyWrathReward = 0;\r\nexport let CacheLuckyFrenzy = 0;\r\nexport let CacheLuckyRewardFrenzy = 0;\r\nexport let CacheLuckyWrathRewardFrenzy = 0;\r\nexport let CacheConjure = 0;\r\nexport let CacheConjureReward = 0;\r\nexport let CacheEdifice = 0;\r\nexport let CacheEdificeBuilding = 0;\r\nexport let CacheNoGoldSwitchCookiesPS = 0;\r\nexport let CacheDragonsFortuneMultAdjustment = 1;\r\nexport let CacheGoldenCookiesMult = 1;\r\nexport let CacheWrathCookiesMult = 1;\r\n\r\nexport let CacheHCPerSecond = 0;\r\n\r\nexport let CacheCentEgg = 0;\r\nexport let CacheSeaSpec = 0;\r\nexport let CacheLastChoEgg = 0;\r\n\r\nexport let CacheObjects1 = {};\r\nexport let CacheObjects10 = {};\r\nexport let CacheObjects100 = {};\r\nexport let CacheObjectsNextAchievement = {};\r\n\r\nexport let CacheWrinklersTotal = 0;\r\nexport let CacheWrinklersNormal = 0;\r\nexport let CacheWrinklersFattest = [0, null];\r\n\r\nexport let CacheCurrWrinklerCPSMult = 0;\r\nexport let CacheCurrWrinklerCount = 0;\r\n\r\nexport let CacheUpgrades = {};\r\n\r\nexport let CacheAverageClicks = {};\r\nexport let CacheAverageCookiesFromClicks;\r\n\r\nexport let CacheMissingUpgrades = {};\r\nexport let CacheMissingUpgradesPrestige = {};\r\nexport let CacheMissingUpgradesCookies = {};\r\n\r\nexport let CacheChainRequired = 0;\r\nexport let CacheChainRequiredNext = 0;\r\nexport let CacheChainMaxReward = [];\r\nexport let CacheChainWrathRequired = 0;\r\nexport let CacheChainWrathRequiredNext = 0;\r\nexport let CacheChainWrathMaxReward = [];\r\nexport let CacheChainFrenzyRequired = 0;\r\nexport let CacheChainFrenzyRequiredNext = 0;\r\nexport let CacheChainFrenzyMaxReward = [];\r\nexport let CacheChainFrenzyWrathRequired = 0;\r\nexport let CacheChainFrenzyWrathRequiredNext = 0;\r\nexport let CacheChainFrenzyWrathMaxReward = [];\r\n\r\nexport let CacheRealCookiesEarned = 0;\r\nexport let CacheAvgCPSWithChoEgg = 0;\r\n\r\nexport let CacheSpawnedGoldenShimmer = {};\r\nexport let CacheSeasonPopShimmer = {};\r\n\r\nexport let CacheTimeTillNextPrestige = 0;\r\n\r\n/** Stores lowest PP value */\r\nexport let CacheMinPP = 0;\r\n/** Stores lowest PP value category */\r\nexport let CacheMinPPBulk = 0;\r\n/** Stores all PP values of all buildings for all buy settings (1, 10, 100) */\r\nexport let CachePPArray = [];\r\n\r\nexport let CacheGoldenShimmersByID = {};\r\n\r\nexport let CacheSellForChoEgg = 0;\r\n\r\nexport let CookiesDiff;\r\nexport let WrinkDiff;\r\nexport let WrinkFattestDiff;\r\nexport let ChoEggDiff;\r\nexport let ClicksDiff;\r\nexport let HeavenlyChipsDiff;\r\n\r\nexport let CacheLastCPSCheck;\r\nexport let CacheLastCookies;\r\nexport let CacheLastWrinkCookies;\r\nexport let CacheLastWrinkFattestCookies;\r\nexport let CacheLastClicks;\r\n\r\nexport let CacheAverageGainBank;\r\nexport let CacheAverageGainWrink;\r\nexport let CacheAverageGainWrinkFattest;\r\nexport let CacheAverageGainChoEgg;\r\nexport let CacheAverageCPS;\r\n\r\nexport let CacheLastHeavenlyCheck;\r\nexport let CacheLastHeavenlyChips;\r\n\r\nexport let CacheDoRemakeBuildPrices;\r\n\r\nexport let CacheHadBuildAura;\r\n\r\n/** Store the CPS effect of each god if it was put into each slot */\r\nexport let CacheGods = {\r\n 0: [0, 0, 0],\r\n 1: [0, 0, 0],\r\n 2: [0, 0, 0],\r\n 3: [0, 0, 0],\r\n 4: [0, 0, 0],\r\n 5: [0, 0, 0],\r\n 6: [0, 0, 0],\r\n 7: [0, 0, 0],\r\n 8: [0, 0, 0],\r\n 9: [0, 0, 0],\r\n 10: [0, 0, 0],\r\n};\r\n","/** All variables used by simulation functions */\r\n\r\nexport let SimObjects = []; // eslint-disable-line prefer-const\r\nexport let SimUpgrades = []; // eslint-disable-line prefer-const\r\nexport let SimAchievements = []; // eslint-disable-line prefer-const\r\nexport let SimBuildingsOwned;\r\nexport let SimUpgradesOwned;\r\nexport let SimPledges;\r\nexport let SimAchievementsOwned;\r\nexport let SimHeavenlyPower;\r\nexport let SimPrestige;\r\nexport let SimDragonAura;\r\nexport let SimDragonAura2;\r\nexport let SimGod1;\r\nexport let SimGod2;\r\nexport let SimGod3;\r\nexport let SimDoSims;\r\nexport let SimEffs;\r\nexport let SimCookiesPs;\r\nexport let SimCookiesPsRaw;\r\n","import { SimDragonAura, SimDragonAura2 } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.auraMult but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimAuraMult(what) {\r\n let n = 0;\r\n if (\r\n Game.dragonAuras[SimDragonAura].name === what ||\r\n Game.dragonAuras[SimDragonAura2].name === what\r\n )\r\n n = 1;\r\n if (\r\n Game.dragonAuras[SimDragonAura].name === 'Reality Bending' ||\r\n (Game.dragonAuras[SimDragonAura2].name === 'Reality Bending' &&\r\n Game.dragonLevel >= Game.dragonAurasBN[what].id + 4)\r\n )\r\n n += 0.1;\r\n return n;\r\n}\r\n","import SimAuraMult from './SimAuraMult';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.getSellMultiplier but checks Sim Data instead of Game Data\r\n * @returns {number}\tgiveBack\tThe multiplier\r\n */\r\nexport default function SimGetSellMultiplier() {\r\n let giveBack = 0.25;\r\n giveBack *= 1 + SimAuraMult('Earth Shatterer');\r\n return giveBack;\r\n}\r\n","import { SimEffs } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.Eff but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimEff(name, def) {\r\n if (typeof SimEffs[name] === 'undefined') {\r\n return typeof def === 'undefined' ? 1 : def;\r\n }\r\n return SimEffs[name];\r\n}\r\n","import { SimUpgrades } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.Has but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimHas(what) {\r\n const it = SimUpgrades[what];\r\n if (it && Game.ascensionMode === 1 && (it.pool === 'prestige' || it.tier === 'fortune')) return 0;\r\n return it ? it.bought : 0;\r\n}\r\n","import { SimDragonAura, SimDragonAura2 } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.hasAura but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimHasAura(what) {\r\n if (\r\n Game.dragonAuras[SimDragonAura].name === what ||\r\n Game.dragonAuras[SimDragonAura2].name === what\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n","import { SimGod1, SimGod2, SimGod3, SimObjects } from '../VariablesAndData';\r\nimport SimHasAura from './SimHasAura';\r\n\r\n/**\r\n * This function checks for the current God level in the sim data\r\n * It functions similarly to Game.hasGod()\r\n * @param\t{string}\twhat\tName of the achievement\r\n */\r\nexport default function SimHasGod(what) {\r\n if (Game.hasGod) {\r\n if (SimObjects.Temple.minigame === undefined) {\r\n SimObjects.Temple.minigame = Game.Objects.Temple.minigame;\r\n }\r\n const god = SimObjects.Temple.minigame.gods[what];\r\n if (SimGod1 === god.id) {\r\n return 1;\r\n }\r\n if (SimGod2 === god.id) {\r\n if (SimHasAura('Supreme Intellect')) {\r\n return 1;\r\n }\r\n return 2;\r\n }\r\n if (SimGod3 === god.id) {\r\n if (SimHasAura('Supreme Intellect')) {\r\n return 2;\r\n }\r\n return 3;\r\n }\r\n }\r\n return false;\r\n}\r\n","import { SimObjects } from '../VariablesAndData';\r\nimport SimAuraMult from './SimAuraMult';\r\nimport SimEff from './SimEff';\r\nimport SimHas from './SimHas';\r\nimport SimHasGod from './SimHasGod';\r\n\r\n/**\r\n * This function calculates the sell price of a building based on current \"sim data\"\r\n * @param\t{string}\tbuilding\tName of the building\r\n * @param\t{number}\tprice\t\tCurrent price of building\r\n * @returns {number}\tModifiedPrice\t\tThe modified building price\r\n */\r\nexport default function SimModifyBuildingPrice(building, price) {\r\n let ModifiedPrice = price;\r\n if (SimHas('Season savings')) ModifiedPrice *= 0.99;\r\n if (SimHas(\"Santa's dominion\")) ModifiedPrice *= 0.99;\r\n if (SimHas('Faberge egg')) ModifiedPrice *= 0.99;\r\n if (SimHas('Divine discount')) ModifiedPrice *= 0.99;\r\n if (SimHas('Fortune #100')) ModifiedPrice *= 0.99;\r\n // if (SimHasAura('Fierce Hoarder')) ModifiedPrice *= 0.98;\r\n ModifiedPrice *= 1 - SimAuraMult('Fierce Hoarder') * 0.02;\r\n if (Game.hasBuff('Everything must go')) ModifiedPrice *= 0.95;\r\n if (Game.hasBuff('Crafty pixies')) ModifiedPrice *= 0.98;\r\n if (Game.hasBuff('Nasty goblins')) ModifiedPrice *= 1.02;\r\n if (building.fortune && SimHas(building.fortune.name)) ModifiedPrice *= 0.93;\r\n ModifiedPrice *= SimEff('buildingCost');\r\n if (SimObjects.Temple.minigameLoaded) {\r\n const godLvl = SimHasGod('creation');\r\n if (godLvl === 1) ModifiedPrice *= 0.93;\r\n else if (godLvl === 2) ModifiedPrice *= 0.95;\r\n else if (godLvl === 3) ModifiedPrice *= 0.98;\r\n }\r\n return ModifiedPrice;\r\n}\r\n","import SimGetSellMultiplier from '../ReplacedGameFunctions/SimGetSellMultiplier';\r\nimport SimModifyBuildingPrice from '../ReplacedGameFunctions/SimModifyBuidlingPrice';\r\n\r\n/**\r\n * This function calculates the cookies returned for selling a building\r\n * Base Game does not do this correctly\r\n * @param\t{string}\tbuild\t\tName of the building\r\n * @param\t{number}\tbasePrice\tBase Price of building\r\n * @param\t{number}\tstart\t\tStarting amount of building\r\n * @param\t{number}\tfree\t\tFree amount of building\r\n * @param\t{number}\tincrease\tIncrease of building\r\n * @param\t{number}\tnoSim\t\t1 of 0 depending on if function is called from CM.Sim\r\n * @returns {number}\tmoni\t\tTotal price gained\r\n */\r\nexport default function BuildingSell(build, basePrice, start, free, amount, noSim) {\r\n // Calculate money gains from selling buildings\r\n // If noSim is set, use Game methods to compute price instead of Sim ones.\r\n const noSimRes = typeof noSim === 'undefined' ? 0 : noSim;\r\n let toChange = amount;\r\n let startingAmount = start;\r\n let moni = 0;\r\n if (amount === -1) toChange = startingAmount;\r\n if (!amount) toChange = Game.buyBulk;\r\n for (let i = 0; i < toChange; i++) {\r\n let price = basePrice * Game.priceIncrease ** Math.max(0, startingAmount - free);\r\n price = noSimRes\r\n ? Game.modifyBuildingPrice(build, price)\r\n : SimModifyBuildingPrice(build, price);\r\n price = Math.ceil(price);\r\n const giveBack = noSimRes ? build.getSellMultiplier() : SimGetSellMultiplier();\r\n price = Math.floor(price * giveBack);\r\n if (startingAmount > 0) {\r\n moni += price;\r\n startingAmount -= 1;\r\n }\r\n }\r\n return moni;\r\n}\r\n","/** Data related directly to the scales used by Cookie Monster */\r\n\r\n/** Array of abbreviations used in the \"Metric\" scale */\r\nexport const metric = ['', '', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'];\r\n\r\n/** Array of abbreviations used in the \"Short\" scale */\r\nexport const shortScale = [\r\n '',\r\n '',\r\n 'M',\r\n 'B',\r\n 'Tr',\r\n 'Quadr',\r\n 'Quint',\r\n 'Sext',\r\n 'Sept',\r\n 'Oct',\r\n 'Non',\r\n 'Dec',\r\n 'Undec',\r\n 'Duodec',\r\n 'Tredec',\r\n 'Quattuordec',\r\n 'Quindec',\r\n 'Sexdec',\r\n 'Septendec',\r\n 'Octodec',\r\n 'Novemdec',\r\n 'Vigint',\r\n 'Unvigint',\r\n 'Duovigint',\r\n 'Trevigint',\r\n 'Quattuorvigint',\r\n];\r\n\r\n/** Array of abbreviations used in the \"Abbreviated Short\" scale */\r\nexport const shortScaleAbbreviated = [\r\n '',\r\n 'K',\r\n 'M',\r\n 'B',\r\n 'T',\r\n 'Qa',\r\n 'Qi',\r\n 'Sx',\r\n 'Sp',\r\n 'Oc',\r\n 'No',\r\n 'De',\r\n 'UDe',\r\n 'DDe',\r\n 'TDe',\r\n 'QaDe',\r\n 'QiDe',\r\n 'SxDe',\r\n 'SpDe',\r\n 'ODe',\r\n 'NDe',\r\n 'Vi',\r\n 'UVi',\r\n 'DVi',\r\n 'TVi',\r\n 'QaVi',\r\n 'QiVi',\r\n 'SxVi',\r\n 'SpVi',\r\n 'OVi',\r\n 'NVi',\r\n 'Tr',\r\n 'UTr',\r\n 'DTr',\r\n 'TTr',\r\n 'QaTr',\r\n 'QiTr',\r\n 'SxTr',\r\n 'SpTr',\r\n 'OTr',\r\n 'NTr',\r\n 'Qaa',\r\n 'UQa',\r\n 'DQa',\r\n 'TQa',\r\n 'QaQa',\r\n 'QiQa',\r\n 'SxQa',\r\n 'SpQa',\r\n 'OQa',\r\n 'NQa',\r\n 'Qia',\r\n 'UQi',\r\n 'DQi',\r\n 'TQi',\r\n 'QaQi',\r\n 'QiQi',\r\n 'SxQi',\r\n 'SpQi',\r\n 'OQi',\r\n 'NQi',\r\n 'Sxa',\r\n 'USx',\r\n 'DSx',\r\n 'TSx',\r\n 'QaSx',\r\n 'QiSx',\r\n 'SxSx',\r\n 'SpSx',\r\n 'OSx',\r\n 'NSx',\r\n 'Spa',\r\n 'USp',\r\n 'DSp',\r\n 'TSp',\r\n 'QaSp',\r\n 'QiSp',\r\n 'SxSp',\r\n 'SpSp',\r\n 'OSp',\r\n 'NSp',\r\n 'Oco',\r\n 'UOc',\r\n 'DOc',\r\n 'TOc',\r\n 'QaOc',\r\n 'QiOc',\r\n 'SxOc',\r\n 'SpOc',\r\n 'OOc',\r\n 'NOc',\r\n 'Noa',\r\n 'UNo',\r\n 'DNo',\r\n 'TNo',\r\n 'QaNo',\r\n 'QiNo',\r\n 'SxNo',\r\n 'SpNo',\r\n 'ONo',\r\n 'NNo',\r\n 'Ct',\r\n 'UCt',\r\n];\r\n","export let LastModCount;\r\nexport let TooltipBuildBackup = []; // eslint-disable-line prefer-const\r\nexport let TooltipLumpBackup;\r\nexport let TooltipGrimoireBackup = []; // eslint-disable-line prefer-const\r\nexport let TooltipUpgradeBackup = []; // eslint-disable-line prefer-const\r\nexport let BackupGrimoireLaunch;\r\nexport let BackupGrimoireLaunchMod;\r\nexport let BackupGrimoireDraw;\r\nexport let HasReplaceNativeGrimoireLaunch;\r\nexport let HasReplaceNativeGrimoireDraw;\r\nexport let LoadMinigames;\r\nexport let BackupFunctions = {}; // eslint-disable-line prefer-const\r\n\r\nexport let LastSeasonPopupState;\r\nexport let LastTickerFortuneState;\r\nexport let LastGardenNextStep;\r\nexport let LastGoldenCookieState;\r\nexport let LastSpawnedGoldenCookieState;\r\nexport let LastMagicBarFull;\r\nexport let CurrSpawnedGoldenCookieState;\r\nexport let LastWrinklerCount;\r\n\r\n/** Stores the date at Game.CalculateGains for God Cyclius\r\n */\r\nexport let CycliusDateAtBeginLoop = Date.now(); // eslint-disable-line prefer-const\r\n\r\n/** Stores the date at Game.CalculateGains for the Century egg\r\n */\r\nexport let CenturyDateAtBeginLoop = Date.now(); // eslint-disable-line prefer-const\r\n","/**\r\n * Section: Variables used in Disp functions */\r\n\r\nexport let DispCSS;\r\n\r\n/**\r\n * These are variables used to create DOM object names and id (e.g., 'CMTextTooltip)\r\n */\r\nexport const ColourTextPre = 'CMText';\r\nexport const ColourBackPre = 'CMBack';\r\nexport const ColourBorderPre = 'CMBorder';\r\n\r\n/**\r\n * These are variables which can be set in the options by the user to standardize colours throughout CookieMonster\r\n */\r\nexport const ColourBlue = 'Blue';\r\nexport const ColourGreen = 'Green';\r\nexport const ColourYellow = 'Yellow';\r\nexport const ColourOrange = 'Orange';\r\nexport const ColourRed = 'Red';\r\nexport const ColourPurple = 'Purple';\r\nexport const ColourGray = 'Gray';\r\nexport const ColourPink = 'Pink';\r\nexport const ColourBrown = 'Brown';\r\nexport const ColoursOrdering = [\r\n ColourBlue,\r\n ColourGreen,\r\n ColourYellow,\r\n ColourOrange,\r\n ColourRed,\r\n ColourPurple,\r\n ColourPink,\r\n ColourBrown,\r\n ColourGray,\r\n];\r\n\r\n/**\r\n * This list is used to make some very basic tooltips.\r\n * It is used by CM.Main.DelayInit() in the call of CM.Disp.CreateSimpleTooltip()\r\n * @item\t{string}\tplaceholder\r\n * @item\t{string}\ttext\r\n * @item\t{string}\tminWidth\r\n */\r\nexport const TooltipText = [\r\n ['GoldCookTooltipPlaceholder', 'Calculated with Golden Switch off', '200px'],\r\n [\r\n 'GoldCookDragonsFortuneTooltipPlaceholder',\r\n 'Calculated with Golden Switch off and at least one golden cookie on-screen',\r\n '240px',\r\n ],\r\n [\r\n 'PrestMaxTooltipPlaceholder',\r\n 'The MAX prestige is calculated with the cookies gained from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and buying Chocolate egg',\r\n '320px',\r\n ],\r\n [\r\n 'NextPrestTooltipPlaceholder',\r\n 'Calculated with cookies gained from wrinklers and Chocolate egg',\r\n '200px',\r\n ],\r\n [\r\n 'HeavenChipMaxTooltipPlaceholder',\r\n 'The MAX heavenly chips is calculated with the cookies gained from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and buying Chocolate egg',\r\n '330px',\r\n ],\r\n [\r\n 'ResetTooltipPlaceholder',\r\n 'The bonus income you would get from new prestige levels unlocked at 100% of its potential and from ascension achievements if you have the same buildings/upgrades after reset',\r\n '370px',\r\n ],\r\n [\r\n 'ChoEggTooltipPlaceholder',\r\n 'The amount of cookies you would get from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and then buying Chocolate egg',\r\n '300px',\r\n ],\r\n ['ChainNextLevelPlaceholder', 'Cheated cookies might break this formula', '250px'],\r\n [\r\n 'FavouriteSettingPlaceholder',\r\n \"Click to set this setting as favourite and show it in 'favourite' settings at the top of the Cookie Monster Settings\",\r\n '250px',\r\n ],\r\n];\r\nexport const SimpleTooltipElements = {};\r\n\r\n/**\r\n * These are variables used by the functions that create tooltips for wrinklers\r\n * See CM.Disp.CheckWrinklerTooltip(), CM.Disp.UpdateWrinklerTooltip() and CM.Main.AddWrinklerAreaDetect()\r\n */\r\nexport let TooltipWrinklerArea = 0; // eslint-disable-line prefer-const\r\nexport let TooltipWrinkler = -1; // eslint-disable-line prefer-const\r\n\r\n/**\r\n * This array is used to store whether a Wrinkler tooltip is being shown or not\r\n * [i] = 1 means tooltip is being shown, [i] = 0 means hidden\r\n * It is used by CM.Disp.CheckWrinklerTooltip() and CM.Main.AddWrinklerAreaDetect()\r\n */\r\nexport let TooltipWrinklerBeingShown = []; // eslint-disable-line prefer-const\r\n\r\nexport let CMLastAscendState;\r\nexport let CMSayTime = function () {}; // eslint-disable-line prefer-const\r\n\r\n/**\r\n * These are variables used to create various displays when the game is loaded on the \"sell all\" screen\r\n */\r\nexport let LastTargetBotBar = 1; // eslint-disable-line prefer-const\r\nexport let LastTargetBuildings = 1; // eslint-disable-line prefer-const\r\nexport let LastTargetTooltipBuilding = 1; // eslint-disable-line prefer-const\r\n\r\n/**\r\n * These arrays are used in the stats page to show\r\n * average cookies per {CM.Disp.cookieTimes/CM.Disp.clickTimes} seconds\r\n */\r\nexport const CookieTimes = [10, 15, 30, 60, 300, 600, 900, 1800];\r\nexport const ClickTimes = [1, 5, 10, 15, 30];\r\n\r\n/**\r\n * This array is used to give certain timers specific colours\r\n */\r\nexport const BuffColours = {\r\n Frenzy: ColourYellow,\r\n 'Dragon Harvest': ColourBrown,\r\n 'Elder frenzy': ColourGreen,\r\n Clot: ColourRed,\r\n 'Click frenzy': ColourBlue,\r\n Dragonflight: ColourPink,\r\n};\r\n\r\n/**\r\n * This array is used to track GC timers\r\n */\r\nexport let GCTimers = {}; // eslint-disable-line prefer-const\r\n\r\n/**\r\n * Used to store the number of cookies to be displayed in the tab-title\r\n */\r\nexport let Title = ''; // eslint-disable-line prefer-const\r\n\r\nexport let TooltipPrice;\r\nexport let TooltipBonusIncome;\r\nexport let TooltipType;\r\nexport let TooltipName;\r\nexport let TooltipBonusMouse;\r\n\r\nexport let LastAscendState;\r\nexport let LastNumberOfTimers;\r\n\r\n/**\r\n * This stores the names of settings shown in the favourites section\r\n */\r\nexport let FavouriteSettings = []; // eslint-disable-line prefer-const\r\n","/** General functions to format or beautify strings */\r\n\r\nimport { metric, shortScale, shortScaleAbbreviated } from '../../Data/Scales';\r\nimport { BackupFunctions } from '../../Main/VariablesAndData';\r\n\r\n/**\r\n * This function returns formats number based on the Scale setting\r\n * @param\t{number}\tnum\t\tNumber to be beautified\r\n * @param \t{any}\t\tfloats \tUsed in some scenario's by CM.Backup.Beautify (Game's original function)\r\n * @param\t{number}\tforced\tUsed to force (type 3) in certains cases\r\n * @returns\t{string}\t\t\tFormatted number\r\n */\r\nexport default function Beautify(num, floats, forced) {\r\n const decimals =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleDecimals + 1;\r\n if (num === Infinity) {\r\n return 'Infinity';\r\n }\r\n if (typeof num === 'undefined') {\r\n return '0';\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 0) {\r\n return BackupFunctions.Beautify(num, floats);\r\n }\r\n if (Number.isFinite(num)) {\r\n if (num < 0) {\r\n return `-${Beautify(Math.abs(num))}`;\r\n }\r\n let answer = '';\r\n if (num === 0) {\r\n return num.toString();\r\n }\r\n if (\r\n num > 0.001 &&\r\n num < Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleCutoff\r\n ) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator)\r\n answer = num.toLocaleString('nl');\r\n else answer = num.toLocaleString('en');\r\n return answer;\r\n }\r\n if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 4 &&\r\n !forced) ||\r\n forced === 4\r\n ) {\r\n // Scientific notation, 123456789 => 1.235E+8\r\n answer = num.toExponential(decimals).toString().replace('e', 'E');\r\n } else {\r\n const exponential = num.toExponential().toString();\r\n const AmountOfTenPowerThree = Math.floor(exponential.slice(exponential.indexOf('e') + 1) / 3);\r\n answer = (num / Number(`1e${AmountOfTenPowerThree * 3}`)).toFixed(decimals);\r\n // answer is now \"xxx.xx\" (e.g., 123456789 would be 123.46)\r\n if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 1 &&\r\n !forced) ||\r\n forced === 1\r\n ) {\r\n // Metric scale, 123456789 => 123.457 M\r\n if (num >= 0.01 && num < Number(`1e${metric.length * 3}`)) {\r\n answer += ` ${metric[AmountOfTenPowerThree]}`;\r\n } else answer = Beautify(num, 0, 4); // If number is too large or little, revert to scientific notation\r\n } else if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 2 &&\r\n !forced) ||\r\n forced === 2\r\n ) {\r\n // Short scale, 123456789 => 123.457 M\r\n if (num >= 0.01 && num < Number(`1e${shortScale.length * 3}`)) {\r\n answer += ` ${shortScale[AmountOfTenPowerThree]}`;\r\n } else answer = Beautify(num, 0, 4); // If number is too large or little, revert to scientific notation\r\n } else if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 3 &&\r\n !forced) ||\r\n forced === 3\r\n ) {\r\n // Short scale, 123456789 => 123.457 M\r\n if (num >= 0.01 && num < Number(`1e${shortScaleAbbreviated.length * 3}`)) {\r\n answer += ` ${shortScaleAbbreviated[AmountOfTenPowerThree]}`;\r\n } else answer = Beautify(num, 0, 4); // If number is too large or little, revert to scientific notation\r\n } else if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 5 &&\r\n !forced) ||\r\n forced === 5\r\n ) {\r\n // Engineering notation, 123456789 => 123.457E+6\r\n answer += `E${AmountOfTenPowerThree * 3}`;\r\n }\r\n }\r\n if (answer === '') {\r\n // eslint-disable-next-line no-console\r\n console.log(`Could not beautify number with Cookie Monster Beautify: ${num}`);\r\n answer = BackupFunctions.Beautify(num, floats);\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator)\r\n answer = answer.replace('.', ',');\r\n return answer;\r\n }\r\n console.log(`Could not beautify number with Cookie Monster Beautify: ${num}`); // eslint-disable-line no-console\r\n return BackupFunctions.Beautify(num, floats);\r\n}\r\n","import {\r\n CacheMinPPBulk,\r\n CacheObjects1,\r\n CacheObjects10,\r\n CacheObjects100,\r\n CacheObjectsNextAchievement,\r\n} from '../../Cache/VariablesAndData';\r\nimport BuildingSell from '../../Sim/SimulationEvents/SellBuilding';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\nimport { ColoursOrdering, LastTargetBuildings } from '../VariablesAndData';\r\n\r\n/**\r\n * Section: Functions related to right column of the screen (buildings/upgrades)\r\n\r\n/**\r\n * This function adjusts some things in the column of buildings.\r\n * It colours them, helps display the correct sell-price and shuffles the order when CM.Options.SortBuildings is set\r\n * The function is called by CM.Disp.Draw(), CM.Disp.UpdateColours() & CM.Disp.RefreshScale()\r\n * And by changes in CM.Options.BuildColour, CM.Options.SortBuild & CM.Data.Config.BulkBuildColour\r\n */\r\nexport default function UpdateBuildings() {\r\n let target = Game.buyBulk;\r\n if (Game.buyMode === 1) {\r\n LastTargetBuildings = target;\r\n } else {\r\n target = LastTargetBuildings;\r\n }\r\n if (target === 1) target = CacheObjects1;\r\n else if (target === 10) target = CacheObjects10;\r\n else if (target === 100) target = CacheObjects100;\r\n\r\n // Remove colour if applied\r\n l(`storeBulk1`).style.removeProperty('color');\r\n l(`storeBulk10`).style.removeProperty('color');\r\n l(`storeBulk100`).style.removeProperty('color');\r\n\r\n if (Game.buyMode === 1) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BuildColour === 1) {\r\n Object.keys(target).forEach((i) => {\r\n l(`productPrice${Game.Objects[i].id}`).style.color =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[\r\n `Colour${target[i].colour}`\r\n ];\r\n });\r\n l(`storeBulk${CacheMinPPBulk}`).style.color =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ColourGreen;\r\n } else {\r\n Object.keys(Game.Objects).forEach((i) => {\r\n l(`productPrice${Game.Objects[i].id}`).style.removeProperty('color');\r\n });\r\n }\r\n } else if (Game.buyMode === -1) {\r\n Object.keys(CacheObjects1).forEach((i) => {\r\n const o = Game.Objects[i];\r\n l(`productPrice${o.id}`).style.color = '';\r\n /*\r\n * Fix sell price displayed in the object in the store.\r\n *\r\n * The buildings sell price displayed by the game itself (without any mod) is incorrect.\r\n * The following line of code fixes this issue, and can be safely removed when the game gets fixed.\r\n *\r\n * This issue is extensively detailed here: https://github.com/Aktanusa/CookieMonster/issues/359#issuecomment-735658262\r\n */\r\n l(`productPrice${o.id}`).innerHTML = Beautify(\r\n BuildingSell(o, o.basePrice, o.amount, o.free, Game.buyBulk, 1),\r\n );\r\n });\r\n }\r\n\r\n // Build array of pointers and sort according to the user's configured sort option.\r\n // This regulates sorting of buildings.\r\n let arr;\r\n if (\r\n Game.buyMode !== 1 ||\r\n !Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings\r\n ) {\r\n arr = Object.keys(CacheObjects1).map((k) => {\r\n const o = {};\r\n o.name = k;\r\n o.id = Game.Objects[k].id;\r\n return o;\r\n });\r\n // Sort using default order.\r\n arr.sort((a, b) => a.id - b.id);\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings === 1\r\n ) {\r\n arr = Object.keys(CacheObjects1).map((k) => {\r\n const o = {};\r\n o.name = k;\r\n o.pp = CacheObjects1[k].pp;\r\n o.colour = CacheObjects1[k].colour;\r\n return o;\r\n });\r\n // Sort by pp colour group, then by pp.\r\n arr.sort((a, b) =>\r\n ColoursOrdering.indexOf(a.colour) === ColoursOrdering.indexOf(b.colour)\r\n ? a.pp - b.pp\r\n : ColoursOrdering.indexOf(a.colour) - ColoursOrdering.indexOf(b.colour),\r\n );\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings === 2\r\n ) {\r\n arr = Object.keys(target).map((k) => {\r\n const o = {};\r\n o.name = k;\r\n o.pp = target[k].pp;\r\n o.colour = target[k].colour;\r\n return o;\r\n });\r\n // Sort by pp colour group, then by pp.\r\n arr.sort((a, b) =>\r\n ColoursOrdering.indexOf(a.colour) === ColoursOrdering.indexOf(b.colour)\r\n ? a.pp - b.pp\r\n : ColoursOrdering.indexOf(a.colour) - ColoursOrdering.indexOf(b.colour),\r\n );\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings === 3\r\n ) {\r\n arr = Object.keys(CacheObjectsNextAchievement).map((k) => {\r\n const o = {};\r\n o.name = k;\r\n o.id = Game.Objects[k].id;\r\n o.amountUntilNext = CacheObjectsNextAchievement[k].AmountNeeded;\r\n o.priceUntilNext = CacheObjectsNextAchievement[k].price;\r\n return o;\r\n });\r\n // First, sort using default order.\r\n arr.sort((a, b) => a.id - b.id);\r\n // Sort by price until next achievement.\r\n // Buildings that aren't within 100 of an achievement are placed at the end, still in\r\n // default order relative to each other because sort() is guaranteed stable.\r\n arr.sort(\r\n (a, b) =>\r\n (a.amountUntilNext !== 101 ? a.priceUntilNext : Infinity) -\r\n (b.amountUntilNext !== 101 ? b.priceUntilNext : Infinity),\r\n );\r\n }\r\n\r\n // Use array index (+2) as the grid row number.\r\n // (grid rows are 1-based indexing, and row 1 is the bulk buy/sell options)\r\n for (let x = 0; x < arr.length; x++) {\r\n Game.Objects[arr[x].name].l.style.gridRow = `${x + 2}/${x + 2}`;\r\n }\r\n}\r\n","/**\r\n * This function toggles the upgrade to be always expanded\r\n * It is called by a change in CM.Options.ToolWarnPos\r\n * and upon creation of the warning tooltip by CM.Disp.UpdateTooltipWarnings()\r\n */\r\nexport default function UpdateUpgradeSectionsHeight() {\r\n Object.values(document.getElementsByClassName('storeSection')).forEach((section) => {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpgradesNeverCollapse ||\r\n section.id === 'products'\r\n ) {\r\n section.style.height = 'auto'; // eslint-disable-line no-param-reassign\r\n } else if (section.id === 'vaultUpgrades') {\r\n section.style.height = ''; // eslint-disable-line no-param-reassign\r\n section.style.minHeight = '0px'; // eslint-disable-line no-param-reassign\r\n } else if (section.id === 'upgrades') {\r\n section.style.height = ''; // eslint-disable-line no-param-reassign\r\n if (section.className.includes('hasMenu')) {\r\n section.style.minHeight = '82px'; // eslint-disable-line no-param-reassign\r\n } else {\r\n section.style.minHeight = '60px'; // eslint-disable-line no-param-reassign\r\n }\r\n } else {\r\n section.style.height = ''; // eslint-disable-line no-param-reassign\r\n section.style.minHeight = '60px'; // eslint-disable-line no-param-reassign\r\n }\r\n });\r\n}\r\n","import { CacheUpgrades } from '../../Cache/VariablesAndData';\r\nimport {\r\n ColourBackPre,\r\n ColourBlue,\r\n ColourGray,\r\n ColourGreen,\r\n ColourOrange,\r\n ColourPurple,\r\n ColourRed,\r\n ColoursOrdering,\r\n ColourYellow,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function adjusts some things in the upgrades section\r\n * It colours them and shuffles the order when CM.Options.SortBuildings is set\r\n * The function is called by CM.Disp.Draw(), CM.Disp.ToggleUpgradeBarAndColour & CM.Disp.RefreshScale()\r\n * And by changes in CM.Options.SortUpgrades\r\n */\r\nexport default function UpdateUpgrades() {\r\n // This counts the amount of upgrades for each pp group and updates the Upgrade Bar\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour > 0) {\r\n let blue = 0;\r\n let green = 0;\r\n let yellow = 0;\r\n let orange = 0;\r\n let red = 0;\r\n let purple = 0;\r\n let gray = 0;\r\n\r\n Object.keys(Game.UpgradesInStore).forEach((i) => {\r\n const me = Game.UpgradesInStore[i];\r\n let addedColour = false;\r\n for (let j = 0; j < l(`upgrade${i}`).childNodes.length; j += 1) {\r\n if (l(`upgrade${i}`).childNodes[j].className.indexOf(ColourBackPre) !== -1) {\r\n l(`upgrade${i}`).childNodes[j].className = ColourBackPre + CacheUpgrades[me.name].colour;\r\n addedColour = true;\r\n break;\r\n }\r\n }\r\n if (!addedColour) {\r\n const div = document.createElement('div');\r\n div.style.width = '10px';\r\n div.style.height = '10px';\r\n div.className = ColourBackPre + CacheUpgrades[me.name].colour;\r\n l(`upgrade${i}`).appendChild(div);\r\n }\r\n if (CacheUpgrades[me.name].colour === ColourBlue) blue += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourGreen) green += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourYellow) yellow += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourOrange) orange += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourRed) red += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourPurple) purple += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourGray) gray += 1;\r\n });\r\n\r\n l('CMUpgradeBarBlue').textContent = blue;\r\n l('CMUpgradeBarGreen').textContent = green;\r\n l('CMUpgradeBarYellow').textContent = yellow;\r\n l('CMUpgradeBarOrange').textContent = orange;\r\n l('CMUpgradeBarRed').textContent = red;\r\n l('CMUpgradeBarPurple').textContent = purple;\r\n l('CMUpgradeBarGray').textContent = gray;\r\n }\r\n\r\n const arr = [];\r\n // Build array of pointers, sort by pp, set flex positions\r\n // This regulates sorting of upgrades\r\n for (let x = 0; x < Game.UpgradesInStore.length; x += 1) {\r\n const o = {};\r\n o.name = Game.UpgradesInStore[x].name;\r\n o.price = Game.UpgradesInStore[x].basePrice;\r\n o.pp = CacheUpgrades[o.name].pp;\r\n o.colour = CacheUpgrades[o.name].colour;\r\n arr.push(o);\r\n }\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortUpgrades) {\r\n // Sort by pp colour group, then by pp.\r\n arr.sort((a, b) =>\r\n ColoursOrdering.indexOf(a.colour) === ColoursOrdering.indexOf(b.colour)\r\n ? a.pp - b.pp\r\n : ColoursOrdering.indexOf(a.colour) - ColoursOrdering.indexOf(b.colour),\r\n );\r\n } else {\r\n arr.sort((a, b) => a.price - b.price);\r\n }\r\n\r\n const nameChecker = function (arr2, upgrade) {\r\n return arr2.findIndex((e) => e.name === upgrade.name);\r\n };\r\n for (let x = 0; x < Game.UpgradesInStore.length; x += 1) {\r\n l(`upgrade${x}`).style.order = nameChecker(arr, Game.UpgradesInStore[x]) + 1;\r\n }\r\n}\r\n","/**\r\n * This function returns time as a string depending on TimeFormat setting\r\n * @param \t{number} \ttime\t\tTime to be formatted\r\n * @param \t{number}\tlongFormat \t1 or 0\r\n * @returns\t{string}\t\t\t\tFormatted time\r\n */\r\nexport default function FormatTime(time, longFormat) {\r\n /* eslint-disable no-nested-ternary */\r\n let formattedTime = time;\r\n if (time === Infinity) return time;\r\n if (time < 0) return 'Negative time period';\r\n formattedTime = Math.ceil(time);\r\n const y = Math.floor(formattedTime / 31536000);\r\n const d = Math.floor((formattedTime % 31536000) / 86400);\r\n const h = Math.floor(((formattedTime % 31536000) % 86400) / 3600);\r\n const m = Math.floor((((formattedTime % 31536000) % 86400) % 3600) / 60);\r\n const s = Math.floor((((formattedTime % 31536000) % 86400) % 3600) % 60);\r\n let str = '';\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat === 0) {\r\n if (formattedTime > 777600000) return longFormat ? 'Over 9000 days!' : '>9000d';\r\n str += y > 0 ? `${y + (longFormat ? (y === 1 ? ' year' : ' years') : 'y')}, ` : '';\r\n if (str.length > 0 || d > 0)\r\n str += `${d + (longFormat ? (d === 1 ? ' day' : ' days') : 'd')}, `;\r\n if (str.length > 0 || h > 0)\r\n str += `${h + (longFormat ? (h === 1 ? ' hour' : ' hours') : 'h')}, `;\r\n if (str.length > 0 || m > 0)\r\n str += `${m + (longFormat ? (m === 1 ? ' minute' : ' minutes') : 'm')}, `;\r\n str += s + (longFormat ? (s === 1 ? ' second' : ' seconds') : 's');\r\n } else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat === 1) {\r\n if (formattedTime > 3155760000) return 'XX:XX:XX:XX:XX';\r\n str += `${(y < 10 ? '0' : '') + y}:`;\r\n str += `${(d < 10 ? '0' : '') + d}:`;\r\n str += `${(h < 10 ? '0' : '') + h}:`;\r\n str += `${(m < 10 ? '0' : '') + m}:`;\r\n str += (s < 10 ? '0' : '') + s;\r\n } else {\r\n // Similar to TimeFormat === 0, but only two most significant components are included.\r\n if (formattedTime > 777600000) return longFormat ? 'Over 9000 days!' : '>9000d';\r\n if (y > 0) {\r\n str += `${y + (longFormat ? (y === 1 ? ' year' : ' years') : 'y')}, `;\r\n str += `${d + (longFormat ? (d === 1 ? ' day' : ' days') : 'd')}`;\r\n } else if (d > 0) {\r\n str += `${d + (longFormat ? (d === 1 ? ' day' : ' days') : 'd')}, `;\r\n str += `${h + (longFormat ? (h === 1 ? ' hour' : ' hours') : 'h')}`;\r\n } else if (h > 0) {\r\n str += `${h + (longFormat ? (h === 1 ? ' hour' : ' hours') : 'h')}, `;\r\n str += `${m + (longFormat ? (m === 1 ? ' minute' : ' minutes') : 'm')}`;\r\n } else if (m > 0) {\r\n str += `${m + (longFormat ? (m === 1 ? ' minute' : ' minutes') : 'm')}, `;\r\n str += s + (longFormat ? (s === 1 ? ' second' : ' seconds') : 's');\r\n } else {\r\n str += s + (longFormat ? (s === 1 ? ' second' : ' seconds') : 's');\r\n }\r\n }\r\n return str;\r\n}\r\n","import { ColourGreen, ColourOrange, ColourRed, ColourYellow } from '../VariablesAndData';\r\nimport FormatTime from './FormatTime';\r\n\r\n/**\r\n * This function returns the colour to be used for time-strings\r\n * @param\t{number}\t\t\ttime\t\t\tTime to be coloured\r\n * @returns {{string, string}}\t{text, colour}\tBoth the formatted time and colour as strings in an array\r\n */\r\nexport default function GetTimeColour(time) {\r\n let colour;\r\n let text;\r\n if (time <= 0) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat === 1)\r\n text = '00:00:00:00:00';\r\n else text = 'Done!';\r\n colour = ColourGreen;\r\n } else {\r\n text = FormatTime(time);\r\n if (time > 300) colour = ColourRed;\r\n else if (time > 60) colour = ColourOrange;\r\n else colour = ColourYellow;\r\n }\r\n return { text, colour };\r\n}\r\n","import {\r\n CacheAverageCPS,\r\n CacheCurrWrinklerCount,\r\n CacheCurrWrinklerCPSMult,\r\n CacheWrinklersFattest,\r\n} from '../../Cache/VariablesAndData';\r\n\r\n/**\r\n * This function returns the cps as either current or average CPS depending on CM.Options.CPSMode\r\n * @returns\t{number}\tThe average or current cps\r\n */\r\nexport default function GetCPS() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CPSMode) {\r\n return CacheAverageCPS;\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 0) {\r\n return Game.cookiesPs * (1 - Game.cpsSucked);\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 1) {\r\n return Game.cookiesPs * (CacheCurrWrinklerCPSMult + (1 - CacheCurrWrinklerCount * 0.05));\r\n }\r\n if (CacheWrinklersFattest[1] !== null)\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 2 &&\r\n Game.wrinklers[CacheWrinklersFattest[1]].type === 1\r\n ) {\r\n return (\r\n Game.cookiesPs *\r\n ((CacheCurrWrinklerCPSMult * 3) / CacheCurrWrinklerCount +\r\n (1 - CacheCurrWrinklerCount * 0.05))\r\n );\r\n }\r\n return (\r\n Game.cookiesPs *\r\n (CacheCurrWrinklerCPSMult / CacheCurrWrinklerCount + (1 - CacheCurrWrinklerCount * 0.05))\r\n );\r\n}\r\n","import { CacheWrinklersFattest, CacheWrinklersTotal } from '../../Cache/VariablesAndData';\r\n\r\n/**\r\n * This function returns the total amount stored in the Wrinkler Bank\r\n * as calculated by CM.Cache.CacheWrinklers() if CM.Options.CalcWrink is set\r\n * @returns\t{number}\t0 or the amount of cookies stored (CM.Cache.WrinklersTotal)\r\n */\r\nexport default function GetWrinkConfigBank() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 1) {\r\n return CacheWrinklersTotal;\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 2) {\r\n return CacheWrinklersFattest[0];\r\n }\r\n return 0;\r\n}\r\n","/** Functions to create various DOM elements used by the Bars */\r\n\r\nimport { ColourBackPre, ColourBlue, ColourTextPre } from '../VariablesAndData';\r\n\r\n/**\r\n * This function creates an indivudual timer for the timer bar\r\n * @param\t{string}\t\t\t\t\tid\t\t\t\t\tAn id to identify the timer\r\n * @param\t{string}\t\t\t\t\tname\t\t\t\tThe title of the timer\r\n * @param\t[{{string}, {string}}, ...]\tbars ([id, colour])\tThe id and colours of individual parts of the timer\r\n */\r\nexport function CreateTimer(id, name, bars) {\r\n const timerBar = document.createElement('div');\r\n timerBar.id = id;\r\n timerBar.style.height = '12px';\r\n timerBar.style.margin = '0px 10px';\r\n timerBar.style.position = 'relative';\r\n\r\n const div = document.createElement('div');\r\n div.style.width = '100%';\r\n div.style.height = '10px';\r\n div.style.margin = 'auto';\r\n div.style.position = 'absolute';\r\n div.style.left = '0px';\r\n div.style.top = '0px';\r\n div.style.right = '0px';\r\n div.style.bottom = '0px';\r\n\r\n const type = document.createElement('span');\r\n type.style.display = 'inline-block';\r\n type.style.textAlign = 'right';\r\n type.style.fontSize = '10px';\r\n type.style.width = '108px';\r\n type.style.marginRight = '5px';\r\n type.style.verticalAlign = 'text-top';\r\n type.textContent = name;\r\n div.appendChild(type);\r\n\r\n for (let i = 0; i < bars.length; i++) {\r\n const colourBar = document.createElement('span');\r\n colourBar.id = bars[i].id;\r\n colourBar.style.display = 'inline-block';\r\n colourBar.style.height = '10px';\r\n colourBar.style.verticalAlign = 'text-top';\r\n colourBar.style.textAlign = 'center';\r\n if (bars.length - 1 === i) {\r\n colourBar.style.borderTopRightRadius = '10px';\r\n colourBar.style.borderBottomRightRadius = '10px';\r\n }\r\n if (typeof bars[i].colour !== 'undefined') {\r\n colourBar.className = ColourBackPre + bars[i].colour;\r\n }\r\n div.appendChild(colourBar);\r\n }\r\n\r\n const timer = document.createElement('span');\r\n timer.id = `${id}Time`;\r\n timer.style.marginLeft = '5px';\r\n timer.style.verticalAlign = 'text-top';\r\n div.appendChild(timer);\r\n\r\n timerBar.appendChild(div);\r\n\r\n return timerBar;\r\n}\r\n\r\n/**\r\n * This function extends the bottom bar (created by CM.Disp.CreateBotBar) with a column for the given building.\r\n * @param\t{string}\tbuildingName\tObjectname to be added (e.g., \"Cursor\")\r\n */\r\nexport function CreateBotBarBuildingColumn(buildingName) {\r\n if (l('CMBotBar') !== null) {\r\n const type = l('CMBotBar').firstChild.firstChild.childNodes[0];\r\n const bonus = l('CMBotBar').firstChild.firstChild.childNodes[1];\r\n const pp = l('CMBotBar').firstChild.firstChild.childNodes[2];\r\n const time = l('CMBotBar').firstChild.firstChild.childNodes[3];\r\n\r\n const i = buildingName;\r\n const header = type.appendChild(document.createElement('td'));\r\n header.appendChild(\r\n document.createTextNode(`${i.indexOf(' ') !== -1 ? i.substring(0, i.indexOf(' ')) : i} (`),\r\n );\r\n\r\n const span = header.appendChild(document.createElement('span'));\r\n span.className = ColourTextPre + ColourBlue;\r\n\r\n header.appendChild(document.createTextNode(')'));\r\n type.lastChild.style.paddingLeft = '8px';\r\n bonus.appendChild(document.createElement('td'));\r\n bonus.lastChild.style.paddingLeft = '8px';\r\n pp.appendChild(document.createElement('td'));\r\n pp.lastChild.style.paddingLeft = '8px';\r\n time.appendChild(document.createElement('td'));\r\n time.lastChild.style.paddingLeft = '2px';\r\n }\r\n}\r\n","/** Functions related to the Bottom Bar */\r\n\r\nimport { CacheObjects1, CacheObjects10, CacheObjects100 } from '../../Cache/VariablesAndData';\r\nimport { VersionMajor, VersionMinor } from '../../Data/Moddata';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../BeautifyAndFormatting/FormatTime';\r\nimport GetTimeColour from '../BeautifyAndFormatting/GetTimeColour';\r\n\r\nimport GetCPS from '../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../HelperFunctions/GetWrinkConfigBank';\r\nimport { ColourBlue, ColourTextPre, ColourYellow, LastTargetBotBar } from '../VariablesAndData';\r\nimport { CreateBotBarBuildingColumn } from './CreateDOMElements';\r\n\r\n/**\r\n * This function creates the bottom bar and appends it to l('wrapper')\r\n */\r\nexport function CreateBotBar() {\r\n const BotBar = document.createElement('div');\r\n BotBar.id = 'CMBotBar';\r\n BotBar.style.height = '69px';\r\n BotBar.style.width = '100%';\r\n BotBar.style.position = 'absolute';\r\n BotBar.style.display = 'none';\r\n BotBar.style.backgroundColor = '#262224';\r\n BotBar.style.backgroundImage = 'linear-gradient(to bottom, #4d4548, #000000)';\r\n BotBar.style.borderTop = '1px solid black';\r\n BotBar.style.overflow = 'auto';\r\n BotBar.style.textShadow = '-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black';\r\n\r\n const table = BotBar.appendChild(document.createElement('table'));\r\n table.style.width = '100%';\r\n table.style.textAlign = 'center';\r\n table.style.whiteSpace = 'nowrap';\r\n const tbody = table.appendChild(document.createElement('tbody'));\r\n\r\n const firstCol = function (text, colour) {\r\n const td = document.createElement('td');\r\n td.style.textAlign = 'right';\r\n td.className = ColourTextPre + colour;\r\n td.textContent = text;\r\n return td;\r\n };\r\n const type = tbody.appendChild(document.createElement('tr'));\r\n type.style.fontWeight = 'bold';\r\n type.appendChild(firstCol(`CM ${VersionMajor}.${VersionMinor}`, ColourYellow));\r\n const bonus = tbody.appendChild(document.createElement('tr'));\r\n bonus.appendChild(firstCol('Bonus Income', ColourBlue));\r\n const pp = tbody.appendChild(document.createElement('tr'));\r\n pp.appendChild(firstCol('Payback Period', ColourBlue));\r\n const time = tbody.appendChild(document.createElement('tr'));\r\n time.appendChild(firstCol('Time Left', ColourBlue));\r\n\r\n l('wrapper').appendChild(BotBar);\r\n\r\n Object.keys(Game.Objects).forEach((i) => {\r\n CreateBotBarBuildingColumn(i);\r\n });\r\n}\r\n\r\n/**\r\n * This function updates the bonus-, pp-, and time-rows in the the bottom bar\r\n */\r\nexport function UpdateBotBar() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1 &&\r\n CacheObjects1 &&\r\n Game.buyMode === 1\r\n ) {\r\n let count = 0;\r\n Object.keys(CacheObjects1).forEach((i) => {\r\n let target = Game.buyBulk;\r\n if (Game.buyMode === 1) {\r\n LastTargetBotBar = target;\r\n } else {\r\n target = LastTargetBotBar;\r\n }\r\n if (target === 1) target = CacheObjects1;\r\n if (target === 10) target = CacheObjects10;\r\n if (target === 100) target = CacheObjects100;\r\n count += 1;\r\n l('CMBotBar').firstChild.firstChild.childNodes[0].childNodes[\r\n count\r\n ].childNodes[1].textContent = Game.Objects[i].amount;\r\n l('CMBotBar').firstChild.firstChild.childNodes[1].childNodes[count].textContent = Beautify(\r\n target[i].bonus,\r\n 2,\r\n );\r\n l('CMBotBar').firstChild.firstChild.childNodes[2].childNodes[count].className =\r\n ColourTextPre + target[i].colour;\r\n let PPString;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime)\r\n PPString = FormatTime(Math.round(target[i].pp));\r\n else PPString = Beautify(Math.round(target[i].pp), 2);\r\n l('CMBotBar').firstChild.firstChild.childNodes[2].childNodes[count].textContent = PPString;\r\n const timeColour = GetTimeColour(\r\n (Game.Objects[i].bulkPrice - (Game.cookies + GetWrinkConfigBank())) / GetCPS(),\r\n );\r\n l('CMBotBar').firstChild.firstChild.childNodes[3].childNodes[count].className =\r\n ColourTextPre + timeColour.colour;\r\n if (timeColour.text === 'Done!' && Game.cookies < Game.Objects[i].bulkPrice) {\r\n l('CMBotBar').firstChild.firstChild.childNodes[3].childNodes[\r\n count\r\n ].textContent = `${timeColour.text} (with Wrink)`;\r\n } else\r\n l('CMBotBar').firstChild.firstChild.childNodes[3].childNodes[count].textContent =\r\n timeColour.text;\r\n });\r\n }\r\n}\r\n","/**\r\n * This function sets the size of the background of the full game and the left column\r\n * depending on whether certain abrs are activated\r\n * It is called by CM.Disp.UpdateAscendState() and CM.Disp.UpdateBotTimerBarPosition()\r\n */\r\nexport default function UpdateBackground() {\r\n Game.Background.canvas.width = Game.Background.canvas.parentNode.offsetWidth;\r\n Game.Background.canvas.height = Game.Background.canvas.parentNode.offsetHeight;\r\n Game.LeftBackground.canvas.width = Game.LeftBackground.canvas.parentNode.offsetWidth;\r\n Game.LeftBackground.canvas.height = Game.LeftBackground.canvas.parentNode.offsetHeight;\r\n Game.DrawBackground();\r\n}\r\n","/** Called by the \"func\" of individual settings */\r\n\r\nimport UpdateBackground from '../Disp/HelperFunctions/UpdateBackground';\r\n\r\n/**\r\n * This function changes the position of both the bottom and timer bar\r\n */\r\nexport function UpdateBotTimerBarPosition() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 1\r\n ) {\r\n l('CMBotBar').style.bottom = l('CMTimerBar').style.height;\r\n l('game').style.bottom = `${Number(l('CMTimerBar').style.height.replace('px', '')) + 70}px`;\r\n } else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1) {\r\n l('CMBotBar').style.bottom = '0px';\r\n l('game').style.bottom = '70px';\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 1\r\n ) {\r\n l('game').style.bottom = l('CMTimerBar').style.height;\r\n } else {\r\n // No bars\r\n l('game').style.bottom = '0px';\r\n }\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 0\r\n ) {\r\n l('sectionLeft').style.top = l('CMTimerBar').style.height;\r\n } else {\r\n l('sectionLeft').style.top = '';\r\n }\r\n\r\n UpdateBackground();\r\n}\r\n\r\n/**\r\n * This function changes the visibility of the timer bar\r\n */\r\nexport function ToggleTimerBar() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1)\r\n l('CMTimerBar').style.display = '';\r\n else l('CMTimerBar').style.display = 'none';\r\n UpdateBotTimerBarPosition();\r\n}\r\n\r\n/**\r\n * This function changes the position of the timer bar\r\n */\r\nexport function ToggleTimerBarPos() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 0) {\r\n l('CMTimerBar').style.width = '30%';\r\n l('CMTimerBar').style.bottom = '';\r\n l('game').insertBefore(l('CMTimerBar'), l('sectionLeft'));\r\n } else {\r\n l('CMTimerBar').style.width = '100%';\r\n l('CMTimerBar').style.bottom = '0px';\r\n l('wrapper').appendChild(l('CMTimerBar'));\r\n }\r\n UpdateBotTimerBarPosition();\r\n}\r\n","import { CacheDragonAura, CacheDragonAura2 } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This functions caches the currently selected Dragon Auras\r\n */\r\nexport default function CacheDragonAuras() {\r\n CacheDragonAura = Game.dragonAura;\r\n CacheDragonAura2 = Game.dragonAura2;\r\n}\r\n","/**\r\n * This function constructs an object with the static properties of an achievement\r\n * @param\t{string}\tachievementName\tName of the Achievement\r\n * @returns {Object}\tyou\t\t\t\tThe static object\r\n */\r\nexport default function InitAchievement(achievementName) {\r\n const me = Game.Achievements[achievementName];\r\n const you = {};\r\n you.name = me.name;\r\n return you;\r\n}\r\n","import { SimObjects } from '../VariablesAndData';\r\nimport SimHas from './SimHas';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.GetTieredCpsMult but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimGetTieredCpsMult(me) {\r\n let mult = 1;\r\n Object.keys(me.tieredUpgrades).forEach((i) => {\r\n if (!Game.Tiers[me.tieredUpgrades[i].tier].special && SimHas(me.tieredUpgrades[i].name)) {\r\n let tierMult = 2;\r\n // unshackled multipliers\r\n if (\r\n Game.ascensionMode !== 1 &&\r\n SimHas(me.unshackleUpgrade) &&\r\n SimHas(Game.Tiers[me.tieredUpgrades[i].tier].unshackleUpgrade)\r\n )\r\n tierMult += me.id === 1 ? 0.5 : (20 - me.id) * 0.1;\r\n mult *= tierMult;\r\n }\r\n });\r\n Object.keys(me.synergies).forEach((i) => {\r\n if (SimHas(me.synergies[i].name)) {\r\n const syn = me.synergies[i];\r\n if (syn.buildingTie1.name === me.name) mult *= 1 + 0.05 * syn.buildingTie2.amount;\r\n else if (syn.buildingTie2.name === me.name) mult *= 1 + 0.001 * syn.buildingTie1.amount;\r\n }\r\n });\r\n if (me.fortune && SimHas(me.fortune.name)) mult *= 1.07;\r\n if (me.grandma && SimHas(me.grandma.name))\r\n mult *= 1 + SimObjects.Grandma.amount * 0.01 * (1 / (me.id - 1));\r\n if (typeof me.tieredUpgrades.misfortune === 'object') {\r\n if (me.vanilla === 1 && SimHas(me.tieredUpgrades.misfortune.name)) {\r\n switch (Game.elderWrath) {\r\n default:\r\n mult *= 1;\r\n break;\r\n case 1:\r\n mult *= 1.02;\r\n break;\r\n case 2:\r\n mult *= 1.04;\r\n break;\r\n case 3:\r\n mult *= 1.06;\r\n break;\r\n }\r\n }\r\n }\r\n return mult;\r\n}\r\n","import SimAuraMult from '../ReplacedGameFunctions/SimAuraMult';\r\nimport SimEff from '../ReplacedGameFunctions/SimEff';\r\nimport SimGetTieredCpsMult from '../ReplacedGameFunctions/SimGetTieredCpsMult';\r\nimport SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport { SimObjects } from '../VariablesAndData';\r\n\r\n/**\r\n * This function constructs an object with the static properties of a building,\r\n * but with a 'cps' method changed to check sim data\r\n *\r\n * @param\t{string}\tbuildingName\tName of the building\r\n * @returns {Object}\tyou\t\t\t\tThe static object\r\n */\r\nexport default function InitialBuildingData(buildingName) {\r\n const me = Game.Objects[buildingName];\r\n const you = {};\r\n if (me.name === 'Cursor') {\r\n you.cps = function (it) {\r\n let add = 0;\r\n if (SimHas('Thousand fingers')) add += 0.1;\r\n if (SimHas('Million fingers')) add *= 5;\r\n if (SimHas('Billion fingers')) add *= 10;\r\n if (SimHas('Trillion fingers')) add *= 20;\r\n if (SimHas('Quadrillion fingers')) add *= 20;\r\n if (SimHas('Quintillion fingers')) add *= 20;\r\n if (SimHas('Sextillion fingers')) add *= 20;\r\n if (SimHas('Septillion fingers')) add *= 20;\r\n if (SimHas('Octillion fingers')) add *= 20;\r\n if (SimHas('Nonillion fingers')) add *= 20;\r\n if (SimHas('Decillion fingers')) add *= 20;\r\n if (SimHas('Undecillion fingers')) add *= 20;\r\n if (SimHas('Unshackled cursors')) add *= 25;\r\n let mult = 1;\r\n let num = 0;\r\n Object.keys(SimObjects).forEach((i) => {\r\n if (SimObjects[i].name !== 'Cursor') num += SimObjects[i].amount;\r\n });\r\n add *= num;\r\n mult *= SimGetTieredCpsMult(it);\r\n mult *= Game.magicCpS('Cursor');\r\n mult *= SimEff('cursorCps');\r\n return (\r\n Game.ComputeCps(\r\n 0.1,\r\n SimHas('Reinforced index finger') +\r\n SimHas('Carpal tunnel prevention cream') +\r\n SimHas('Ambidextrous'),\r\n add,\r\n ) * mult\r\n );\r\n };\r\n } else if (me.name === 'Grandma') {\r\n you.cps = function (it) {\r\n let mult = 1;\r\n Object.keys(Game.GrandmaSynergies).forEach((i) => {\r\n if (SimHas(Game.GrandmaSynergies[i])) mult *= 2;\r\n });\r\n if (SimHas('Bingo center/Research facility')) mult *= 4;\r\n if (SimHas('Ritual rolling pins')) mult *= 2;\r\n if (SimHas('Naughty list')) mult *= 2;\r\n\r\n if (SimHas('Elderwort biscuits')) mult *= 1.02;\r\n\r\n mult *= SimEff('grandmaCps');\r\n\r\n if (SimHas('Cat ladies')) {\r\n for (let i = 0; i < Game.UpgradesByPool.kitten.length; i++) {\r\n if (SimHas(Game.UpgradesByPool.kitten[i].name)) mult *= 1.29;\r\n }\r\n }\r\n\r\n mult *= SimGetTieredCpsMult(it);\r\n\r\n let add = 0;\r\n if (SimHas('One mind')) add += SimObjects.Grandma.amount * 0.02;\r\n if (SimHas('Communal brainsweep')) add += SimObjects.Grandma.amount * 0.02;\r\n if (SimHas('Elder Pact')) add += SimObjects.Portal.amount * 0.05;\r\n\r\n let num = 0;\r\n Object.keys(SimObjects).forEach((i) => {\r\n if (SimObjects[i].name !== 'Grandma') num += SimObjects[i].amount;\r\n });\r\n // if (Game.hasAura('Elder Battalion')) mult*=1+0.01*num;\r\n mult *= 1 + SimAuraMult('Elder Battalion') * 0.01 * num;\r\n\r\n mult *= Game.magicCpS(me.name);\r\n\r\n return (me.baseCps + add) * mult;\r\n };\r\n } else {\r\n you.cps = function (it) {\r\n let mult = 1;\r\n mult *= SimGetTieredCpsMult(it);\r\n mult *= Game.magicCpS(it.name);\r\n return it.baseCPS * mult;\r\n };\r\n }\r\n\r\n // Below is needed for above eval, specifically for the SimGetTieredCpsMult function\r\n you.baseCps = me.baseCps;\r\n you.name = me.name;\r\n you.tieredUpgrades = me.tieredUpgrades;\r\n you.synergies = me.synergies;\r\n you.fortune = me.fortune;\r\n you.grandma = me.grandma;\r\n you.baseCPS = me.baseCps;\r\n you.id = me.id;\r\n you.vanilla = me.vanilla;\r\n you.unshackleUpgrade = me.unshackleUpgrade;\r\n return you;\r\n}\r\n","import SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport SimHasGod from '../ReplacedGameFunctions/SimHasGod';\r\nimport { SimObjects } from '../VariablesAndData';\r\n\r\n/**\r\n * This function constructs an object with the static properties of an upgrade\r\n * @param\t{string}\tupgradeName\t\tName of the Upgrade\r\n * @returns {Object}\tyou\t\t\t\tThe static object\r\n */\r\nexport default function InitUpgrade(upgradeName) {\r\n const me = Game.Upgrades[upgradeName];\r\n const you = {};\r\n // Some upgrades have a function for .power (notably the valentine cookies)\r\n you.power = me.power;\r\n if (typeof you.power === 'function') {\r\n if (me.name === 'Sugar crystal cookies') {\r\n you.power = function () {\r\n let n = 5;\r\n Object.keys(SimObjects).forEach((i) => {\r\n if (SimObjects[i].level >= 10) n += 1;\r\n });\r\n return n;\r\n };\r\n } else {\r\n you.power = function () {\r\n let pow = 2;\r\n if (SimHas('Starlove')) pow = 3;\r\n if (Game.hasGod) {\r\n const godLvl = SimHasGod('seasons');\r\n if (godLvl === 1) pow *= 1.3;\r\n else if (godLvl === 2) pow *= 1.2;\r\n else if (godLvl === 3) pow *= 1.1;\r\n }\r\n return pow;\r\n };\r\n }\r\n }\r\n you.pool = me.pool;\r\n you.name = me.name;\r\n return you;\r\n}\r\n","import CacheDragonAuras from '../../Cache/Dragon/CacheDragonAuras';\r\nimport { CacheDragonAura, CacheDragonAura2 } from '../../Cache/VariablesAndData';\r\nimport { CreateBotBarBuildingColumn } from '../../Disp/InfoBars/CreateDOMElements';\r\nimport InitAchievement from '../InitializeData/InitAchievement';\r\nimport InitialBuildingData from '../InitializeData/InitialBuildingData';\r\nimport InitUpgrade from '../InitializeData/InitUpgrade';\r\nimport {\r\n SimAchievements,\r\n SimAchievementsOwned, // eslint-disable-line no-unused-vars\r\n SimDragonAura, // eslint-disable-line no-unused-vars\r\n SimDragonAura2, // eslint-disable-line no-unused-vars\r\n SimGod1, // eslint-disable-line no-unused-vars\r\n SimGod2, // eslint-disable-line no-unused-vars\r\n SimGod3, // eslint-disable-line no-unused-vars\r\n SimHeavenlyPower, // eslint-disable-line no-unused-vars\r\n SimObjects,\r\n SimPledges, // eslint-disable-line no-unused-vars\r\n SimPrestige, // eslint-disable-line no-unused-vars\r\n SimUpgrades,\r\n SimUpgradesOwned, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function copies all relevant data and therefore sets a new iteration of the \"sim data\"\r\n * It is called at the start of any function that simulates certain behaviour or actions\r\n */\r\nexport default function CopyData() {\r\n // Other variables\r\n SimUpgradesOwned = Game.UpgradesOwned;\r\n SimPledges = Game.pledges;\r\n SimAchievementsOwned = Game.AchievementsOwned;\r\n SimHeavenlyPower = Game.heavenlyPower;\r\n SimPrestige = Game.prestige;\r\n\r\n // Buildings\r\n Object.keys(Game.Objects).forEach((i) => {\r\n const me = Game.Objects[i];\r\n let you = SimObjects[i];\r\n if (you === undefined) {\r\n // New building!\r\n SimObjects[i] = InitialBuildingData(i);\r\n you = SimObjects[i];\r\n CreateBotBarBuildingColumn(i); // Add new building to the bottom bar\r\n }\r\n you.amount = me.amount;\r\n you.level = me.level;\r\n you.totalCookies = me.totalCookies;\r\n you.basePrice = me.basePrice;\r\n you.free = me.free;\r\n if (me.minigameLoaded) {\r\n if (me.name === 'Temple') {\r\n SimGod1 = me.minigame.slot[0];\r\n SimGod2 = me.minigame.slot[1];\r\n SimGod3 = me.minigame.slot[2];\r\n }\r\n you.minigameLoaded = me.minigameLoaded;\r\n you.minigame = me.minigame;\r\n }\r\n SimObjects[i] = you;\r\n });\r\n\r\n // Upgrades\r\n Object.keys(Game.Upgrades).forEach((i) => {\r\n const me = Game.Upgrades[i];\r\n let you = SimUpgrades[i];\r\n if (you === undefined) {\r\n SimUpgrades[i] = InitUpgrade(i);\r\n you = SimUpgrades[i];\r\n }\r\n you.bought = me.bought;\r\n SimUpgrades[i] = you;\r\n });\r\n\r\n // Achievements\r\n Object.keys(Game.Achievements).forEach((i) => {\r\n const me = Game.Achievements[i];\r\n let you = SimAchievements[i];\r\n if (you === undefined) {\r\n SimAchievements[i] = InitAchievement(i);\r\n you = SimAchievements[i];\r\n }\r\n you.won = me.won;\r\n SimAchievements[i] = you;\r\n });\r\n\r\n // Auras\r\n CacheDragonAuras();\r\n SimDragonAura = CacheDragonAura;\r\n SimDragonAura2 = CacheDragonAura2;\r\n}\r\n","import {\r\n ColourTextPre,\r\n ColourBorderPre,\r\n ColourGray,\r\n ColourBlue,\r\n ColourRed,\r\n ColourYellow,\r\n ColourPurple,\r\n TooltipType,\r\n} from '../VariablesAndData';\r\n\r\n/** Creates various sections of tooltips */\r\n\r\n/**\r\n * This function creates a tooltipBox object which contains all CookieMonster added tooltip information.\r\n * @returns {object}\tdiv\t\tAn object containing the stylized box\r\n */\r\nexport function TooltipCreateTooltipBox() {\r\n l('tooltip').firstChild.style.paddingBottom = '4px'; // Sets padding on base-tooltip\r\n const tooltipBox = document.createElement('div');\r\n tooltipBox.style.border = '1px solid';\r\n tooltipBox.style.padding = '4px';\r\n tooltipBox.style.margin = '0px -4px';\r\n tooltipBox.id = 'CMTooltipBorder';\r\n tooltipBox.className = ColourTextPre + ColourGray;\r\n return tooltipBox;\r\n}\r\n\r\n/**\r\n * This function creates a header object for tooltips.\r\n * @param\t{string}\ttext\tTitle of header\r\n * @returns {object}\tdiv\t\tAn object containing the stylized header\r\n */\r\nexport function TooltipCreateHeader(text) {\r\n const div = document.createElement('div');\r\n div.style.fontWeight = 'bold';\r\n div.id = `${text}Title`;\r\n div.className = ColourTextPre + ColourBlue;\r\n div.textContent = text;\r\n return div;\r\n}\r\n\r\n/**\r\n * This function creates the tooltip objectm for warnings\r\n * The object is also removed by CM.Disp.UpdateTooltipWarnings() when type is 's' or 'g'\r\n * @returns {object}\tTooltipWarn\tThe Warnings-tooltip object\r\n */\r\nexport function TooltipCreateWarningSection() {\r\n const TooltipWarn = document.createElement('div');\r\n TooltipWarn.style.position = 'absolute';\r\n TooltipWarn.style.display = 'block';\r\n TooltipWarn.style.left = 'auto';\r\n TooltipWarn.style.bottom = 'auto';\r\n TooltipWarn.id = 'CMDispTooltipWarningParent';\r\n\r\n const create = function (boxId, colour, labelTextFront, labelTextBack, deficitId) {\r\n const box = document.createElement('div');\r\n box.id = boxId;\r\n box.style.display = 'none';\r\n box.style.transition = 'opacity 0.1s ease-out';\r\n box.className = ColourBorderPre + colour;\r\n box.style.padding = '2px';\r\n box.style.background = '#000 url(img/darkNoise.png)';\r\n const labelDiv = document.createElement('div');\r\n box.appendChild(labelDiv);\r\n const labelSpan = document.createElement('span');\r\n labelSpan.className = ColourTextPre + colour;\r\n labelSpan.style.fontWeight = 'bold';\r\n labelSpan.textContent = labelTextFront;\r\n labelDiv.appendChild(labelSpan);\r\n labelDiv.appendChild(document.createTextNode(labelTextBack));\r\n const deficitDiv = document.createElement('div');\r\n box.appendChild(deficitDiv);\r\n const deficitSpan = document.createElement('span');\r\n deficitSpan.id = deficitId;\r\n deficitDiv.appendChild(document.createTextNode('Deficit: '));\r\n deficitDiv.appendChild(deficitSpan);\r\n return box;\r\n };\r\n\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnLucky',\r\n ColourRed,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies required for \"Lucky!\"',\r\n 'CMDispTooltipWarnLuckyText',\r\n ),\r\n );\r\n TooltipWarn.firstChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnLuckyFrenzy',\r\n ColourYellow,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies required for \"Lucky!\" (Frenzy)',\r\n 'CMDispTooltipWarnLuckyFrenzyText',\r\n ),\r\n );\r\n TooltipWarn.lastChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnConjure',\r\n ColourPurple,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies required for \"Conjure Baked Goods\"',\r\n 'CMDispTooltipWarnConjureText',\r\n ),\r\n );\r\n TooltipWarn.lastChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnConjureFrenzy',\r\n ColourPurple,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies required for \"Conjure Baked Goods\" (Frenzy)',\r\n 'CMDispTooltipWarnConjureFrenzyText',\r\n ),\r\n );\r\n TooltipWarn.lastChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnEdifice',\r\n ColourPurple,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies needed for \"Spontaneous Edifice\" to possibly give you your most expensive building\"',\r\n 'CMDispTooltipWarnEdificeText',\r\n ),\r\n );\r\n TooltipWarn.lastChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnUser',\r\n ColourRed,\r\n 'Warning: ',\r\n `Purchase of this item will put you under the number of Cookies equal to ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser} seconds of CPS`,\r\n 'CMDispTooltipWarnUserText',\r\n ),\r\n );\r\n\r\n return TooltipWarn;\r\n}\r\n\r\n/**\r\n * This function appends the sections for Bonus Income, PP and Time left (to achiev) to the tooltip-object\r\n * The actual data is added by the Update-functions themselves\r\n * @param\t{object}\ttooltip\t\tObject of a TooltipBox, normally created by a call to CM.Disp.TooltipCreateTooltipBox()\r\n */\r\nexport function TooltipCreateCalculationSection(tooltip) {\r\n tooltip.appendChild(TooltipCreateHeader('Bonus Income'));\r\n const income = document.createElement('div');\r\n income.style.marginBottom = '4px';\r\n income.style.color = 'white';\r\n income.id = 'CMTooltipIncome';\r\n tooltip.appendChild(income);\r\n\r\n tooltip.appendChild(TooltipCreateHeader('Bonus Cookies per Click'));\r\n tooltip.lastChild.style.display = 'none'; // eslint-disable-line no-param-reassign\r\n const click = document.createElement('div');\r\n click.style.marginBottom = '4px';\r\n click.style.color = 'white';\r\n click.style.display = 'none';\r\n click.id = 'CMTooltipCookiePerClick';\r\n tooltip.appendChild(click);\r\n\r\n tooltip.appendChild(TooltipCreateHeader('Payback Period'));\r\n const pp = document.createElement('div');\r\n pp.style.marginBottom = '4px';\r\n pp.id = 'CMTooltipPP';\r\n tooltip.appendChild(pp);\r\n\r\n tooltip.appendChild(TooltipCreateHeader('Time Left'));\r\n const time = document.createElement('div');\r\n time.id = 'CMTooltipTime';\r\n tooltip.appendChild(time);\r\n\r\n if (TooltipType === 'b') {\r\n tooltip.appendChild(TooltipCreateHeader('Production left till next achievement'));\r\n tooltip.lastChild.id = 'CMTooltipProductionLeftHeader'; // eslint-disable-line no-param-reassign\r\n const production = document.createElement('div');\r\n production.id = 'CMTooltipProductionLeft';\r\n tooltip.appendChild(production);\r\n }\r\n if (TooltipType === 'b') {\r\n tooltip.appendChild(TooltipCreateHeader('Buildings (price / PP) left till next achievement'));\r\n tooltip.lastChild.id = 'CMTooltipNextAchievementHeader'; // eslint-disable-line no-param-reassign\r\n const production = document.createElement('div');\r\n production.id = 'CMTooltipNextAchievement';\r\n tooltip.appendChild(production);\r\n }\r\n}\r\n","import GetCPS from '../../Disp/HelperFunctions/GetCPS';\r\nimport {\r\n ColourBlue,\r\n ColourGray,\r\n ColourGreen,\r\n ColourOrange,\r\n ColourPurple,\r\n ColourRed,\r\n ColourYellow,\r\n} from '../../Disp/VariablesAndData';\r\nimport { CacheMinPP, CachePPArray } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions return the colour assosciated with the given pp value\r\n * It is called by CM.Cache.CacheBuildingsPP(), CM.Cache.CacheBuildingsBulkPP() and CM.Cache.CacheUpgradePP()\r\n * @params\t{object}\tobj\t\tThe obj of which the pp value should be checked\r\n * @params\t{number}\tprice\tThe price of the object\r\n * @returns {string}\tcolour\tThe colour assosciated with the pp value\r\n */\r\nexport default function ColourOfPP(me, price) {\r\n let colour = '';\r\n // Colour based on PP\r\n if (me.pp <= 0 || me.pp === Infinity) colour = ColourGray;\r\n else if (me.pp < CacheMinPP) colour = ColourBlue;\r\n else if (me.pp === CacheMinPP) colour = ColourGreen;\r\n else if (me.pp < CachePPArray[10][0]) colour = ColourYellow;\r\n else if (me.pp < CachePPArray[20][0]) colour = ColourOrange;\r\n else if (me.pp < CachePPArray[30][0]) colour = ColourRed;\r\n else colour = ColourPurple;\r\n\r\n // Colour based on price in terms of CPS\r\n if (\r\n Number(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPSecondsLowerLimit,\r\n ) !== 0\r\n ) {\r\n if (\r\n price / GetCPS() <\r\n Number(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPSecondsLowerLimit,\r\n )\r\n )\r\n colour = ColourBlue;\r\n }\r\n // Colour based on being able to purchase\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPOnlyConsiderBuyable) {\r\n if (price - Game.cookies > 0) colour = ColourRed;\r\n }\r\n return colour;\r\n}\r\n","/**\r\n * This function returns the current CPS buff\r\n * @returns {number}\tmult\tThe multiplier\r\n */\r\nexport default function GetCPSBuffMult() {\r\n let mult = 1;\r\n Object.keys(Game.buffs).forEach((i) => {\r\n if (typeof Game.buffs[i].multCpS !== 'undefined') mult *= Game.buffs[i].multCpS;\r\n });\r\n return mult;\r\n}\r\n","import { SimAchievements, SimAchievementsOwned } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This function \"wins\" an achievement in the current sim data\r\n * It functions similarly to Game.Win()\r\n * It is not created by CM.Sim.CreateSimFunctions() in order to avoid spamming pop-ups upon winning\r\n * @param\t{string}\twhat\tName of the achievement\r\n */\r\nexport default function SimWin(what) {\r\n if (SimAchievements[what]) {\r\n if (SimAchievements[what].won === 0) {\r\n SimAchievements[what].won = 1;\r\n if (Game.Achievements[what].pool !== 'shadow') SimAchievementsOwned += 1;\r\n }\r\n }\r\n}\r\n","import GetCPSBuffMult from '../../Cache/CPS/GetCPSBuffMult';\r\nimport { CacheCentEgg } from '../../Cache/VariablesAndData';\r\nimport { CenturyDateAtBeginLoop, CycliusDateAtBeginLoop } from '../../Main/VariablesAndData';\r\nimport SimAuraMult from '../ReplacedGameFunctions/SimAuraMult';\r\nimport SimEff from '../ReplacedGameFunctions/SimEff';\r\nimport SimGetHeavenlyMultiplier from '../ReplacedGameFunctions/SimGetHeavenlyMultiplier';\r\nimport SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport SimHasGod from '../ReplacedGameFunctions/SimHasGod';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport {\r\n SimAchievementsOwned,\r\n SimCookiesPs,\r\n SimCookiesPsRaw, // eslint-disable-line no-unused-vars\r\n SimEffs, // eslint-disable-line no-unused-vars\r\n SimHeavenlyPower,\r\n SimObjects,\r\n SimPrestige,\r\n SimUpgrades,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates the CPS of the current \"sim data\"\r\n * It is similar to Game.CalculateGains()\r\n * It is called at the start of any function that simulates certain behaviour or actions\r\n * @global\t{number}\tCM.Sim.cookiesPs\tThe CPS of the current sim data\r\n */\r\nexport default function CalculateGains() {\r\n SimCookiesPs = 0;\r\n let mult = 1;\r\n // Include minigame effects\r\n const effs = {};\r\n Object.keys(Game.Objects).forEach((i) => {\r\n if (Game.Objects[i].minigameLoaded && Game.Objects[i].minigame.effs) {\r\n const myEffs = Game.Objects[i].minigame.effs;\r\n Object.keys(myEffs).forEach((ii) => {\r\n if (effs[ii]) effs[ii] *= myEffs[ii];\r\n else effs[ii] = myEffs[ii];\r\n });\r\n }\r\n });\r\n SimEffs = effs;\r\n\r\n if (Game.ascensionMode !== 1)\r\n mult += parseFloat(SimPrestige) * 0.01 * SimHeavenlyPower * SimGetHeavenlyMultiplier();\r\n\r\n mult *= SimEff('cps');\r\n\r\n if (SimHas('Heralds') && Game.ascensionMode !== 1) mult *= 1 + 0.01 * Game.heralds;\r\n\r\n Object.keys(Game.cookieUpgrades).forEach((i) => {\r\n const me = Game.cookieUpgrades[i];\r\n if (SimHas(me.name)) {\r\n // Some upgrades have a function as .power (notably the valentine cookies)\r\n // CM.Sim.InitialBuildingData has changed to use CM.Sim.Has instead of Game.Has etc.\r\n // Therefore this call is to the .power of the Sim.Object\r\n if (typeof me.power === 'function') {\r\n mult *= 1 + SimUpgrades[me.name].power(SimUpgrades[me.name]) * 0.01;\r\n } else mult *= 1 + me.power * 0.01;\r\n }\r\n });\r\n\r\n if (SimHas('Specialized chocolate chips')) mult *= 1.01;\r\n if (SimHas('Designer cocoa beans')) mult *= 1.02;\r\n if (SimHas('Underworld ovens')) mult *= 1.03;\r\n if (SimHas('Exotic nuts')) mult *= 1.04;\r\n if (SimHas('Arcane sugar')) mult *= 1.05;\r\n\r\n if (SimHas('Increased merriness')) mult *= 1.15;\r\n if (SimHas('Improved jolliness')) mult *= 1.15;\r\n if (SimHas('A lump of coal')) mult *= 1.01;\r\n if (SimHas('An itchy sweater')) mult *= 1.01;\r\n if (SimHas(\"Santa's dominion\")) mult *= 1.2;\r\n\r\n if (SimHas('Fortune #100')) mult *= 1.01;\r\n if (SimHas('Fortune #101')) mult *= 1.07;\r\n\r\n if (SimHas('Dragon scale')) mult *= 1.03;\r\n\r\n // Check effect of chosen Gods\r\n let buildMult = 1;\r\n if (SimHasGod) {\r\n let godLvl = SimHasGod('asceticism');\r\n if (godLvl === 1) mult *= 1.15;\r\n else if (godLvl === 2) mult *= 1.1;\r\n else if (godLvl === 3) mult *= 1.05;\r\n\r\n godLvl = SimHasGod('ages');\r\n if (godLvl === 1)\r\n mult *= 1 + 0.15 * Math.sin((CycliusDateAtBeginLoop / 1000 / (60 * 60 * 3)) * Math.PI * 2);\r\n else if (godLvl === 2)\r\n mult *= 1 + 0.15 * Math.sin((CycliusDateAtBeginLoop / 1000 / (60 * 60 * 12)) * Math.PI * 2);\r\n else if (godLvl === 3)\r\n mult *= 1 + 0.15 * Math.sin((CycliusDateAtBeginLoop / 1000 / (60 * 60 * 24)) * Math.PI * 2);\r\n\r\n godLvl = SimHasGod('decadence');\r\n if (godLvl === 1) buildMult *= 0.93;\r\n else if (godLvl === 2) buildMult *= 0.95;\r\n else if (godLvl === 3) buildMult *= 0.98;\r\n\r\n godLvl = SimHasGod('industry');\r\n if (godLvl === 1) buildMult *= 1.1;\r\n else if (godLvl === 2) buildMult *= 1.06;\r\n else if (godLvl === 3) buildMult *= 1.03;\r\n\r\n godLvl = SimHasGod('labor');\r\n if (godLvl === 1) buildMult *= 0.97;\r\n else if (godLvl === 2) buildMult *= 0.98;\r\n else if (godLvl === 3) buildMult *= 0.99;\r\n }\r\n\r\n if (SimHas(\"Santa's legacy\")) mult *= 1 + (Game.santaLevel + 1) * 0.03;\r\n\r\n const milkProgress = SimAchievementsOwned / 25;\r\n let milkMult = 1;\r\n if (SimHas(\"Santa's milk and cookies\")) milkMult *= 1.05;\r\n // if (CM.Sim.hasAura('Breath of Milk')) milkMult *= 1.05;\r\n milkMult *= 1 + SimAuraMult('Breath of Milk') * 0.05;\r\n if (SimHasGod) {\r\n const godLvl = SimHasGod('mother');\r\n if (godLvl === 1) milkMult *= 1.1;\r\n else if (godLvl === 2) milkMult *= 1.05;\r\n else if (godLvl === 3) milkMult *= 1.03;\r\n }\r\n milkMult *= SimEff('milk');\r\n\r\n let catMult = 1;\r\n\r\n if (SimHas('Kitten helpers')) catMult *= 1 + milkProgress * 0.1 * milkMult;\r\n if (SimHas('Kitten workers')) catMult *= 1 + milkProgress * 0.125 * milkMult;\r\n if (SimHas('Kitten engineers')) catMult *= 1 + milkProgress * 0.15 * milkMult;\r\n if (SimHas('Kitten overseers')) catMult *= 1 + milkProgress * 0.175 * milkMult;\r\n if (SimHas('Kitten managers')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten accountants')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten specialists')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten experts')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten consultants')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten assistants to the regional manager'))\r\n catMult *= 1 + milkProgress * 0.175 * milkMult;\r\n if (SimHas('Kitten marketeers')) catMult *= 1 + milkProgress * 0.15 * milkMult;\r\n if (SimHas('Kitten analysts')) catMult *= 1 + milkProgress * 0.125 * milkMult;\r\n if (SimHas('Kitten executives')) catMult *= 1 + milkProgress * 0.115 * milkMult;\r\n if (SimHas('Kitten admins')) catMult *= 1 + milkProgress * 0.11 * milkMult;\r\n if (SimHas('Kitten strategists')) catMult *= 1 + milkProgress * 0.105 * milkMult;\r\n if (SimHas('Kitten angels')) catMult *= 1 + milkProgress * 0.1 * milkMult;\r\n if (SimHas('Fortune #103')) catMult *= 1 + milkProgress * 0.05 * milkMult;\r\n\r\n Object.keys(SimObjects).forEach((i) => {\r\n const me = SimObjects[i];\r\n let storedCps = me.cps(me);\r\n if (Game.ascensionMode !== 1) storedCps *= (1 + me.level * 0.01) * buildMult;\r\n if (me.name === 'Grandma' && SimHas('Milkhelp® lactose intolerance relief tablets'))\r\n storedCps *= 1 + 0.05 * milkProgress * milkMult;\r\n SimCookiesPs += me.amount * storedCps;\r\n });\r\n\r\n if (SimHas('\"egg\"')) SimCookiesPs += 9; // \"egg\"\r\n\r\n mult *= catMult;\r\n\r\n let eggMult = 1;\r\n if (SimHas('Chicken egg')) eggMult *= 1.01;\r\n if (SimHas('Duck egg')) eggMult *= 1.01;\r\n if (SimHas('Turkey egg')) eggMult *= 1.01;\r\n if (SimHas('Quail egg')) eggMult *= 1.01;\r\n if (SimHas('Robin egg')) eggMult *= 1.01;\r\n if (SimHas('Ostrich egg')) eggMult *= 1.01;\r\n if (SimHas('Cassowary egg')) eggMult *= 1.01;\r\n if (SimHas('Salmon roe')) eggMult *= 1.01;\r\n if (SimHas('Frogspawn')) eggMult *= 1.01;\r\n if (SimHas('Shark egg')) eggMult *= 1.01;\r\n if (SimHas('Turtle egg')) eggMult *= 1.01;\r\n if (SimHas('Ant larva')) eggMult *= 1.01;\r\n if (SimHas('Century egg')) {\r\n // The boost increases a little every day, with diminishing returns up to +10% on the 100th day\r\n let day =\r\n (Math.floor((CenturyDateAtBeginLoop - Game.startDate) / 1000 / 10) * 10) / 60 / 60 / 24;\r\n day = Math.min(day, 100);\r\n // Sets a Cache value to be displayed in the Stats page, could be moved...\r\n CacheCentEgg = 1 + (1 - (1 - day / 100) ** 3) * 0.1;\r\n eggMult *= CacheCentEgg;\r\n }\r\n mult *= eggMult;\r\n\r\n if (SimHas('Sugar baking')) mult *= 1 + Math.min(100, Game.lumps) * 0.01;\r\n\r\n // if (CM.Sim.hasAura('Radiant Appetite')) mult *= 2;\r\n mult *= 1 + SimAuraMult('Radiant Appetite');\r\n\r\n const rawCookiesPs = SimCookiesPs * mult;\r\n Object.keys(Game.CpsAchievements).forEach((i) => {\r\n if (rawCookiesPs >= Game.CpsAchievements[i].threshold) SimWin(Game.CpsAchievements[i].name);\r\n });\r\n\r\n SimCookiesPsRaw = rawCookiesPs;\r\n\r\n const { n } = Game.shimmerTypes.golden;\r\n const auraMult = SimAuraMult(\"Dragon's Fortune\");\r\n for (let i = 0; i < n; i++) {\r\n mult *= 1 + auraMult * 1.23;\r\n }\r\n\r\n const name = Game.bakeryName.toLowerCase();\r\n if (name === 'orteil') mult *= 0.99;\r\n else if (name === 'ortiel') mult *= 0.98;\r\n\r\n if (SimHas('Elder Covenant')) mult *= 0.95;\r\n\r\n if (SimHas('Golden switch [off]')) {\r\n let goldenSwitchMult = 1.5;\r\n if (SimHas('Residual luck')) {\r\n const upgrades = Game.goldenCookieUpgrades;\r\n Object.keys(upgrades).forEach((i) => {\r\n if (SimHas(upgrades[i])) goldenSwitchMult += 0.1;\r\n });\r\n }\r\n mult *= goldenSwitchMult;\r\n }\r\n if (SimHas('Shimmering veil [off]')) {\r\n let veilMult = 0.5;\r\n if (SimHas('Reinforced membrane')) veilMult += 0.1;\r\n if (SimHas('Delicate touch')) veilMult += 0.05;\r\n if (SimHas('Steadfast murmur')) veilMult += 0.05;\r\n if (SimHas('Glittering edge')) veilMult += 0.05;\r\n mult *= 1 + veilMult;\r\n }\r\n\r\n if (SimHas('Magic shenanigans')) mult *= 1000;\r\n if (SimHas('Occult obstruction')) mult *= 0;\r\n\r\n SimCookiesPs = Game.runModHookOnValue('cps', SimCookiesPs);\r\n\r\n mult *= GetCPSBuffMult();\r\n\r\n SimCookiesPs *= mult;\r\n\r\n // if (Game.hasBuff('Cursed finger')) Game.cookiesPs = 0;\r\n}\r\n","import SimAuraMult from './SimAuraMult';\r\nimport SimHas from './SimHas';\r\nimport SimHasGod from './SimHasGod';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.GetHeavenlyMultiplier but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimGetHeavenlyMultiplier() {\r\n let heavenlyMult = 0;\r\n if (SimHas('Heavenly chip secret')) heavenlyMult += 0.05;\r\n if (SimHas('Heavenly cookie stand')) heavenlyMult += 0.2;\r\n if (SimHas('Heavenly bakery')) heavenlyMult += 0.25;\r\n if (SimHas('Heavenly confectionery')) heavenlyMult += 0.25;\r\n if (SimHas('Heavenly key')) heavenlyMult += 0.25;\r\n // if (SimHasAura('Dragon God')) heavenlyMult*=1.05;\r\n heavenlyMult *= 1 + SimAuraMult('Dragon God') * 0.05;\r\n if (SimHas('Lucky digit')) heavenlyMult *= 1.01;\r\n if (SimHas('Lucky number')) heavenlyMult *= 1.01;\r\n if (SimHas('Lucky payout')) heavenlyMult *= 1.01;\r\n if (Game.hasGod) {\r\n const godLvl = SimHasGod('creation');\r\n if (godLvl === 1) heavenlyMult *= 0.7;\r\n else if (godLvl === 2) heavenlyMult *= 0.8;\r\n else if (godLvl === 3) heavenlyMult *= 0.9;\r\n }\r\n return heavenlyMult;\r\n}\r\n","/** Data copied directly from the game */\r\n\r\n/** Array of the names of all fortune cookies obtainable from the ticker */\r\nexport const Fortunes = [\r\n 'Fortune #001',\r\n 'Fortune #002',\r\n 'Fortune #003',\r\n 'Fortune #004',\r\n 'Fortune #005',\r\n 'Fortune #006',\r\n 'Fortune #007',\r\n 'Fortune #008',\r\n 'Fortune #009',\r\n 'Fortune #010',\r\n 'Fortune #011',\r\n 'Fortune #012',\r\n 'Fortune #013',\r\n 'Fortune #014',\r\n 'Fortune #015',\r\n 'Fortune #016',\r\n 'Fortune #017',\r\n 'Fortune #018',\r\n 'Fortune #019',\r\n 'Fortune #020',\r\n 'Fortune #100',\r\n 'Fortune #101',\r\n 'Fortune #102',\r\n 'Fortune #103',\r\n 'Fortune #104',\r\n];\r\n\r\n/** Array of the names of all Halloween cookies */\r\nexport const HalloCookies = [\r\n 'Skull cookies',\r\n 'Ghost cookies',\r\n 'Bat cookies',\r\n 'Slime cookies',\r\n 'Pumpkin cookies',\r\n 'Eyeball cookies',\r\n 'Spider cookies',\r\n];\r\n\r\n/** Array of the names of all Christmas cookies */\r\nexport const ChristCookies = [\r\n 'Christmas tree biscuits',\r\n 'Snowflake biscuits',\r\n 'Snowman biscuits',\r\n 'Holly biscuits',\r\n 'Candy cane biscuits',\r\n 'Bell biscuits',\r\n 'Present biscuits',\r\n];\r\n\r\n/** Array of the names of all Valentine cookies */\r\nexport const ValCookies = [\r\n 'Pure heart biscuits',\r\n 'Ardent heart biscuits',\r\n 'Sour heart biscuits',\r\n 'Weeping heart biscuits',\r\n 'Golden heart biscuits',\r\n 'Eternal heart biscuits',\r\n 'Prism heart biscuits',\r\n];\r\n\r\n/** Array of the names of all plant drops */\r\nexport const PlantDrops = [\r\n 'Elderwort biscuits',\r\n 'Bakeberry cookies',\r\n 'Duketater cookies',\r\n 'Green yeast digestives',\r\n 'Wheat slims',\r\n 'Fern tea',\r\n 'Ichor syrup',\r\n];\r\n\r\n/** All possible effects plants and other items can have with a display-title */\r\nexport const Effects = {\r\n buildingCost: 'Building prices',\r\n click: 'Cookies per click',\r\n cps: 'Total CPS',\r\n cursorCps: 'Cursor CPS',\r\n goldenCookieDur: 'Golden cookie duration',\r\n goldenCookieEffDur: 'Golden cookie effect duration',\r\n goldenCookieFreq: 'Golden cookie frequency',\r\n goldenCookieGain: 'Golden cookie gains',\r\n grandmaCps: 'Grandma CPS',\r\n itemDrops: 'Random item drop chance',\r\n milk: 'Effect from milk',\r\n reindeerDur: 'Reindeer duration',\r\n reindeerFreq: 'Reindeer frequency',\r\n reindeerGain: 'Reindeer gains',\r\n upgradeCost: 'Upgrade prices',\r\n wrathCookieDur: 'Wrath cookie duration',\r\n wrathCookieEffDur: 'Wrath cookie effect duration',\r\n wrathCookieFreq: 'Wrath cookie frequency',\r\n wrathCookieGain: 'Wrath cookie gains',\r\n wrinklerEat: 'Wrinkler ',\r\n wrinklerSpawn: 'Wrinkler spawn frequency',\r\n};\r\n","import { SimAchievements } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.HasAchiev but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimHasAchiev(what) {\r\n return SimAchievements[what] ? SimAchievements[what].won : 0;\r\n}\r\n","import { ChristCookies, HalloCookies } from '../../Data/Gamedata';\r\nimport SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport SimHasAchiev from '../ReplacedGameFunctions/SimHasAchiev';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport { SimObjects, SimUpgradesOwned } from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates if any special achievements have been obtained\r\n * If so it SimWin()'s them and the caller function will know to recall CM.Sim.CalculateGains()\r\n * It is called at the end of any functions that simulates certain behaviour\r\n */\r\nexport default function CheckOtherAchiev() {\r\n let grandmas = 0;\r\n Object.keys(Game.GrandmaSynergies).forEach((i) => {\r\n if (SimHas(Game.GrandmaSynergies[i])) grandmas += 1;\r\n });\r\n if (!SimHasAchiev('Elder') && grandmas >= 7) SimWin('Elder');\r\n if (!SimHasAchiev('Veteran') && grandmas >= 14) SimWin('Veteran');\r\n\r\n let buildingsOwned = 0;\r\n let mathematician = 1;\r\n let base10 = 1;\r\n let minAmount = 100000;\r\n Object.keys(SimObjects).forEach((i) => {\r\n buildingsOwned += SimObjects[i].amount;\r\n minAmount = Math.min(SimObjects[i].amount, minAmount);\r\n if (!SimHasAchiev('Mathematician')) {\r\n if (\r\n SimObjects[i].amount <\r\n Math.min(128, 2 ** (Game.ObjectsById.length - Game.Objects[i].id - 1))\r\n )\r\n mathematician = 0;\r\n }\r\n if (!SimHasAchiev('Base 10')) {\r\n if (SimObjects[i].amount < (Game.ObjectsById.length - Game.Objects[i].id) * 10) base10 = 0;\r\n }\r\n });\r\n if (minAmount >= 1) SimWin('One with everything');\r\n if (mathematician === 1) SimWin('Mathematician');\r\n if (base10 === 1) SimWin('Base 10');\r\n if (minAmount >= 100) SimWin('Centennial');\r\n if (minAmount >= 150) SimWin('Centennial and a half');\r\n if (minAmount >= 200) SimWin('Bicentennial');\r\n if (minAmount >= 250) SimWin('Bicentennial and a half');\r\n if (minAmount >= 300) SimWin('Tricentennial');\r\n if (minAmount >= 350) SimWin('Tricentennial and a half');\r\n if (minAmount >= 400) SimWin('Quadricentennial');\r\n if (minAmount >= 450) SimWin('Quadricentennial and a half');\r\n if (minAmount >= 500) SimWin('Quincentennial');\r\n if (minAmount >= 550) SimWin('Quincentennial and a half');\r\n if (minAmount >= 600) SimWin('Sexcentennial');\r\n if (minAmount >= 650) SimWin('Sexcentennial and a half');\r\n if (minAmount >= 700) SimWin('Septcentennial');\r\n\r\n if (buildingsOwned >= 100) SimWin('Builder');\r\n if (buildingsOwned >= 500) SimWin('Architect');\r\n if (buildingsOwned >= 1000) SimWin('Engineer');\r\n if (buildingsOwned >= 2500) SimWin('Lord of Constructs');\r\n if (buildingsOwned >= 5000) SimWin('Grand design');\r\n if (buildingsOwned >= 7500) SimWin('Ecumenopolis');\r\n if (buildingsOwned >= 10000) SimWin('Myriad');\r\n\r\n if (SimUpgradesOwned >= 20) SimWin('Enhancer');\r\n if (SimUpgradesOwned >= 50) SimWin('Augmenter');\r\n if (SimUpgradesOwned >= 100) SimWin('Upgrader');\r\n if (SimUpgradesOwned >= 200) SimWin('Lord of Progress');\r\n if (SimUpgradesOwned >= 300) SimWin('The full picture');\r\n if (SimUpgradesOwned >= 400) SimWin(\"When there's nothing left to add\");\r\n if (SimUpgradesOwned >= 500) SimWin('Kaizen');\r\n if (SimUpgradesOwned >= 600) SimWin('Beyond quality');\r\n if (SimUpgradesOwned >= 700) SimWin(\"Oft we mar what's well\");\r\n\r\n if (buildingsOwned >= 4000 && SimUpgradesOwned >= 300) SimWin('Polymath');\r\n if (buildingsOwned >= 8000 && SimUpgradesOwned >= 400) SimWin('Renaissance baker');\r\n\r\n if (SimObjects.Cursor.amount + SimObjects.Grandma.amount >= 777) SimWin('The elder scrolls');\r\n\r\n let hasAllHalloCook = true;\r\n Object.keys(HalloCookies).forEach((i) => {\r\n if (!SimHas(HalloCookies[i])) hasAllHalloCook = false;\r\n });\r\n if (hasAllHalloCook) SimWin('Spooky cookies');\r\n\r\n let hasAllChristCook = true;\r\n Object.keys(ChristCookies).forEach((i) => {\r\n if (!SimHas(ChristCookies[i])) hasAllChristCook = false;\r\n });\r\n if (hasAllChristCook) SimWin('Let it snow');\r\n\r\n if (SimHas('Fortune cookies')) {\r\n const list = Game.Tiers.fortune.upgrades;\r\n let fortunes = 0;\r\n Object.keys(list).forEach((i) => {\r\n if (SimHas(list[i].name)) fortunes += 1;\r\n });\r\n if (fortunes >= list.length) SimWin('O Fortuna');\r\n }\r\n}\r\n","import CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport { SimAchievementsOwned, SimCookiesPs, SimObjects } from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates the bonus income of buying a building\r\n * It is called by CM.Cache.CacheBuildingIncome()\r\n * @param\t{string}\tbuilding\tThe name of the building to be bought\r\n * @param\t{number}\tamount\t\tThe amount to be bought\r\n * @returns {number}\t\t\t\tThe bonus income of the building\r\n */\r\nexport default function BuyBuildingsBonusIncome(building, amount) {\r\n CopyData();\r\n SimObjects[building].amount += amount;\r\n const me = SimObjects[building];\r\n\r\n if (building === 'Cursor') {\r\n if (me.amount >= 1) SimWin('Click');\r\n if (me.amount >= 2) SimWin('Double-click');\r\n if (me.amount >= 50) SimWin('Mouse wheel');\r\n if (me.amount >= 100) SimWin('Of Mice and Men');\r\n if (me.amount >= 200) SimWin('The Digital');\r\n if (me.amount >= 300) SimWin('Extreme polydactyly');\r\n if (me.amount >= 400) SimWin('Dr. T');\r\n if (me.amount >= 500) SimWin('Thumbs, phalanges, metacarpals');\r\n if (me.amount >= 600) SimWin('With her finger and her thumb');\r\n if (me.amount >= 700) SimWin('Gotta hand it to you');\r\n if (me.amount >= 800) SimWin(\"The devil's workshop\");\r\n if (me.amount >= 900) SimWin('All on deck');\r\n if (me.amount >= 1000) SimWin('A round of applause');\r\n } else {\r\n Object.keys(Game.Objects[me.name].tieredAchievs).forEach((j) => {\r\n if (me.amount >= Game.Tiers[Game.Objects[me.name].tieredAchievs[j].tier].achievUnlock) {\r\n SimWin(Game.Objects[me.name].tieredAchievs[j].name);\r\n }\r\n });\r\n }\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n\r\n return SimCookiesPs - Game.cookiesPs;\r\n}\r\n","/**\r\n * This function calculates the time it takes to reach a certain magic level\r\n * @param\t{number}\tcurrentMagic\t\tThe current magic level\r\n * @param\t{number}\tmaxMagic\t\t\tThe user's max magic level\r\n * @param\t{number}\ttargetMagic\t\t\tThe target magic level\r\n * @returns\t{number}\tcount / Game.fps\tThe time it takes to reach targetMagic\r\n */\r\nexport default function CalculateGrimoireRefillTime(currentMagic, maxMagic, targetMagic) {\r\n let magic = currentMagic;\r\n let count = 0;\r\n while (magic < targetMagic) {\r\n magic += Math.max(0.002, (magic / Math.max(maxMagic, 100)) ** 0.5) * 0.002;\r\n count += 1;\r\n }\r\n return count / Game.fps;\r\n}\r\n","/**\r\n * This function toggles the position of the warnings created by CM.Disp.TooltipCreateWarningSection()\r\n * It is called by a change in CM.Options.ToolWarnPos\r\n * and upon creation of the warning tooltip by CM.Disp.UpdateTooltipWarnings()\r\n */\r\nexport default function ToggleToolWarnPos() {\r\n if (l('CMDispTooltipWarningParent') !== null) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos === 0) {\r\n l('CMDispTooltipWarningParent').style.top = 'auto';\r\n l('CMDispTooltipWarningParent').style.margin = '4px -4px';\r\n l('CMDispTooltipWarningParent').style.padding = '3px 4px';\r\n } else {\r\n l('CMDispTooltipWarningParent').style.right = 'auto';\r\n l('CMDispTooltipWarningParent').style.margin = '4px';\r\n l('CMDispTooltipWarningParent').style.padding = '4px 3px';\r\n }\r\n }\r\n}\r\n","import CopyData from '../../Sim/SimulationData/CopyData';\r\nimport { TooltipName, TooltipType } from '../VariablesAndData';\r\nimport * as Create from './CreateTooltip';\r\nimport Building from './TypesOfTooltips/Building';\r\nimport GardenPlots from './TypesOfTooltips/GardenPlots';\r\nimport Grimoire from './TypesOfTooltips/Grimoire';\r\nimport HarvestAll from './TypesOfTooltips/HarvestAll';\r\nimport PantheonGods from './TypesOfTooltips/PantheonGods';\r\nimport SugarLump from './TypesOfTooltips/SugarLump';\r\nimport Upgrade from './TypesOfTooltips/Upgrade';\r\nimport Warnings from './TypesOfTooltips/Warnings';\r\nimport WrinklerButton from './TypesOfTooltips/WrinklerButton';\r\n\r\n/**\r\n * This function updates the sections of the tooltips created by CookieMonster\r\n */\r\nexport default function UpdateTooltips() {\r\n CopyData();\r\n if (l('tooltipAnchor').style.display !== 'none' && l('CMTooltipArea')) {\r\n l('CMTooltipArea').innerHTML = '';\r\n const tooltipBox = Create.TooltipCreateTooltipBox();\r\n l('CMTooltipArea').appendChild(tooltipBox);\r\n\r\n if (TooltipType === 'b') {\r\n Building();\r\n } else if (TooltipType === 'u') {\r\n Upgrade();\r\n } else if (TooltipType === 's') {\r\n SugarLump();\r\n } else if (TooltipType === 'g') {\r\n Grimoire();\r\n } else if (TooltipType === 'p') {\r\n GardenPlots();\r\n } else if (TooltipType === 'ha') {\r\n HarvestAll();\r\n } else if (TooltipType === 'wb') {\r\n WrinklerButton();\r\n } else if (TooltipType === 'pag' || (TooltipType === 'pas' && TooltipName[1] !== -1)) {\r\n PantheonGods();\r\n }\r\n Warnings();\r\n } else if (l('CMTooltipArea') === null) {\r\n // Remove warnings if its a basic tooltip\r\n if (l('CMDispTooltipWarningParent') !== null) {\r\n l('CMDispTooltipWarningParent').remove();\r\n }\r\n }\r\n}\r\n","import ColourOfPP from '../../../Cache/PP/ColourOfPP';\r\nimport {\r\n CacheObjects1,\r\n CacheObjects10,\r\n CacheObjects100,\r\n CacheObjectsNextAchievement,\r\n} from '../../../Cache/VariablesAndData';\r\n\r\nimport BuyBuildingsBonusIncome from '../../../Sim/SimulationEvents/BuyBuildingBonusIncome';\r\nimport { SimObjects } from '../../../Sim/VariablesAndData';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../BeautifyAndFormatting/FormatTime';\r\nimport GetTimeColour from '../../BeautifyAndFormatting/GetTimeColour';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../../HelperFunctions/GetWrinkConfigBank';\r\nimport {\r\n ColourTextPre,\r\n LastTargetTooltipBuilding,\r\n TooltipBonusIncome,\r\n TooltipName,\r\n TooltipPrice,\r\n} from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Building tooltips\r\n */\r\nexport default function Building() {\r\n let target;\r\n if (Game.buyMode === 1) {\r\n LastTargetTooltipBuilding = target;\r\n } else {\r\n target = LastTargetTooltipBuilding;\r\n }\r\n if (Game.buyBulk === 1) target = CacheObjects1;\r\n else if (Game.buyBulk === 10) target = CacheObjects10;\r\n else if (Game.buyBulk === 100) target = CacheObjects100;\r\n\r\n TooltipPrice = Game.Objects[TooltipName].bulkPrice;\r\n TooltipBonusIncome = target[TooltipName].bonus;\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade === 1 &&\r\n Game.buyMode === 1\r\n ) {\r\n const tooltipBox = l('CMTooltipBorder');\r\n Create.TooltipCreateCalculationSection(tooltipBox);\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade ===\r\n 1 &&\r\n Game.buyMode === 1\r\n ) {\r\n l('CMTooltipIncome').textContent = Beautify(TooltipBonusIncome, 2);\r\n const increase = Math.round((TooltipBonusIncome / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n l('CMTooltipIncome').textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n l('CMTooltipIncome').textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n l('CMTooltipBorder').className = ColourTextPre + target[TooltipName].colour;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime)\r\n l('CMTooltipPP').textContent = FormatTime(target[TooltipName].pp);\r\n else l('CMTooltipPP').textContent = Beautify(target[TooltipName].pp, 2);\r\n l('CMTooltipPP').className = ColourTextPre + target[TooltipName].colour;\r\n const timeColour = GetTimeColour(\r\n (TooltipPrice - (Game.cookies + GetWrinkConfigBank())) / GetCPS(),\r\n );\r\n l('CMTooltipTime').textContent = timeColour.text;\r\n if (timeColour.text === 'Done!' && Game.cookies < target[TooltipName].price) {\r\n l('CMTooltipTime').textContent = `${timeColour.text} (with Wrink)`;\r\n } else l('CMTooltipTime').textContent = timeColour.text;\r\n l('CMTooltipTime').className = ColourTextPre + timeColour.colour;\r\n }\r\n\r\n // Add \"production left till next achievement\"-bar\r\n l('CMTooltipProductionLeftHeader').style.display = 'none';\r\n l('CMTooltipTime').style.marginBottom = '0px';\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n for (const i of Object.keys(Game.Objects[TooltipName].productionAchievs)) {\r\n if (!Game.HasAchiev(Game.Objects[TooltipName].productionAchievs[i].achiev.name)) {\r\n const nextProductionAchiev = Game.Objects[TooltipName].productionAchievs[i];\r\n l('CMTooltipTime').style.marginBottom = '4px';\r\n l('CMTooltipProductionLeftHeader').style.display = '';\r\n l('CMTooltipProductionLeft').className = `ProdAchievement${TooltipName}`;\r\n l('CMTooltipProductionLeft').textContent = Beautify(\r\n nextProductionAchiev.pow - SimObjects[TooltipName].totalCookies,\r\n 15,\r\n );\r\n l('CMTooltipProductionLeft').style.color = 'white';\r\n break;\r\n }\r\n }\r\n\r\n const ObjectsTillNext = CacheObjectsNextAchievement[TooltipName];\r\n if (ObjectsTillNext.AmountNeeded < 101) {\r\n l('CMTooltipProductionLeft').style.marginBottom = '4px';\r\n l('CMTooltipNextAchievementHeader').style.display = '';\r\n\r\n let PPOfAmount;\r\n if (Game.cookiesPs) {\r\n PPOfAmount =\r\n Math.max(ObjectsTillNext.price - (Game.cookies + GetWrinkConfigBank()), 0) /\r\n Game.cookiesPs +\r\n ObjectsTillNext.price /\r\n BuyBuildingsBonusIncome(TooltipName, ObjectsTillNext.AmountNeeded);\r\n } else\r\n PPOfAmount =\r\n ObjectsTillNext.price /\r\n BuyBuildingsBonusIncome(TooltipName, ObjectsTillNext.AmountNeeded);\r\n\r\n l('CMTooltipNextAchievement').textContent = `${Beautify(\r\n ObjectsTillNext.AmountNeeded,\r\n )} / ${Beautify(ObjectsTillNext.price)} / `;\r\n l('CMTooltipNextAchievement').style.color = 'white';\r\n const PPFrag = document.createElement('span');\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime)\r\n PPFrag.textContent = FormatTime(PPOfAmount);\r\n else PPFrag.textContent = Beautify(PPOfAmount);\r\n PPFrag.className = ColourTextPre + ColourOfPP({ pp: PPOfAmount }, ObjectsTillNext.price);\r\n l('CMTooltipNextAchievement').appendChild(PPFrag);\r\n } else {\r\n l('CMTooltipNextAchievementHeader').style.display = 'none';\r\n l('CMTooltipProductionLeft').style.marginBottom = '0px';\r\n }\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import { CacheLastChoEgg, CacheUpgrades } from '../../../Cache/VariablesAndData';\r\n\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../BeautifyAndFormatting/FormatTime';\r\nimport GetTimeColour from '../../BeautifyAndFormatting/GetTimeColour';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../../HelperFunctions/GetWrinkConfigBank';\r\nimport {\r\n ColourTextPre,\r\n TooltipBonusIncome,\r\n TooltipBonusMouse,\r\n TooltipName,\r\n TooltipPrice,\r\n} from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Upgrade tooltips\r\n */\r\nexport default function Upgrade() {\r\n const tooltipBox = l('CMTooltipBorder');\r\n Create.TooltipCreateCalculationSection(tooltipBox);\r\n\r\n TooltipBonusIncome = CacheUpgrades[Game.UpgradesInStore[TooltipName].name].bonus;\r\n TooltipPrice = Game.Upgrades[Game.UpgradesInStore[TooltipName].name].getPrice();\r\n TooltipBonusMouse = CacheUpgrades[Game.UpgradesInStore[TooltipName].name].bonusMouse;\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade === 1\r\n ) {\r\n l('CMTooltipIncome').textContent = Beautify(TooltipBonusIncome, 2);\r\n const increase = Math.round((TooltipBonusIncome / Game.cookiesPs) * 10000);\r\n // Don't display certain parts of tooltip if not applicable\r\n if (l('CMTooltipIncome').textContent === '0') {\r\n l('Bonus IncomeTitle').style.display = 'none';\r\n l('CMTooltipIncome').style.display = 'none';\r\n l('Payback PeriodTitle').style.display = 'none';\r\n l('CMTooltipPP').style.display = 'none';\r\n } else {\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n l('CMTooltipIncome').textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n l('CMTooltipIncome').textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n l('CMTooltipBorder').className =\r\n ColourTextPre + CacheUpgrades[Game.UpgradesInStore[TooltipName].name].colour;\r\n }\r\n\r\n // If clicking power upgrade\r\n if (TooltipBonusMouse) {\r\n l('CMTooltipCookiePerClick').textContent = Beautify(TooltipBonusMouse);\r\n l('CMTooltipCookiePerClick').style.display = 'block';\r\n l('CMTooltipCookiePerClick').previousSibling.style.display = 'block';\r\n }\r\n // If only a clicking power upgrade change PP to click-based period\r\n if (!TooltipBonusIncome && TooltipBonusMouse) {\r\n l('CMTooltipPP').textContent = `${Beautify(TooltipPrice / TooltipBonusMouse)} Clicks`;\r\n l('CMTooltipPP').style.color = 'white';\r\n l('Payback PeriodTitle').style.display = 'block';\r\n l('CMTooltipPP').style.display = 'block';\r\n } else {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime)\r\n l('CMTooltipPP').textContent = FormatTime(\r\n CacheUpgrades[Game.UpgradesInStore[TooltipName].name].pp,\r\n );\r\n else\r\n l('CMTooltipPP').textContent = Beautify(\r\n CacheUpgrades[Game.UpgradesInStore[TooltipName].name].pp,\r\n 2,\r\n );\r\n l('CMTooltipPP').className =\r\n ColourTextPre + CacheUpgrades[Game.UpgradesInStore[TooltipName].name].colour;\r\n }\r\n const timeColour = GetTimeColour(\r\n (TooltipPrice - (Game.cookies + GetWrinkConfigBank())) / GetCPS(),\r\n );\r\n l('CMTooltipTime').textContent = timeColour.text;\r\n if (\r\n timeColour.text === 'Done!' &&\r\n Game.cookies < Game.UpgradesInStore[TooltipName].getPrice()\r\n ) {\r\n l('CMTooltipTime').textContent = `${timeColour.text} (with Wrink)`;\r\n } else l('CMTooltipTime').textContent = timeColour.text;\r\n l('CMTooltipTime').className = ColourTextPre + timeColour.colour;\r\n\r\n // Add extra info to Chocolate egg tooltip\r\n if (Game.UpgradesInStore[TooltipName].name === 'Chocolate egg') {\r\n l('CMTooltipBorder').lastChild.style.marginBottom = '4px';\r\n l('CMTooltipBorder').appendChild(\r\n Create.TooltipCreateHeader('Cookies to be gained (Currently/Max)'),\r\n );\r\n const chocolate = document.createElement('div');\r\n chocolate.style.color = 'white';\r\n chocolate.textContent = `${Beautify(Game.cookies * 0.05)} / ${Beautify(CacheLastChoEgg)}`;\r\n l('CMTooltipBorder').appendChild(chocolate);\r\n }\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import GetLumpColour from '../../HelperFunctions/GetLumpColour';\r\nimport { ColourTextPre } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n/**\r\n * This function adds extra info to the Sugar Lump tooltip\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function SugarLump() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipLump === 1) {\r\n const tooltipBox = l('CMTooltipBorder');\r\n\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Current Sugar Lump'));\r\n\r\n const lumpType = document.createElement('div');\r\n lumpType.id = 'CMTooltipTime';\r\n tooltipBox.appendChild(lumpType);\r\n const lumpColour = GetLumpColour(Game.lumpCurrentType);\r\n lumpType.textContent = lumpColour.text;\r\n lumpType.className = ColourTextPre + lumpColour.colour;\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import {\r\n ColourGray,\r\n ColourGreen,\r\n ColourOrange,\r\n ColourPurple,\r\n ColourRed,\r\n ColourYellow,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function returns Name and Colour as object for sugar lump type that is given as input param.\r\n * It is called by CM.Disp.UpdateTooltipSugarLump()\r\n * @param \t{string} \t\t\t\ttype \t\t\tSugar Lump Type.\r\n * @returns {{string}, {string}}\ttext, colour\t\tAn array containing the text and display-colour of the sugar lump\r\n */\r\nexport default function GetLumpColour(type) {\r\n if (type === 0) {\r\n return { text: 'Normal', colour: ColourGray };\r\n }\r\n if (type === 1) {\r\n return { text: 'Bifurcated', colour: ColourGreen };\r\n }\r\n if (type === 2) {\r\n return { text: 'Golden', colour: ColourYellow };\r\n }\r\n if (type === 3) {\r\n return { text: 'Meaty', colour: ColourOrange };\r\n }\r\n if (type === 4) {\r\n return { text: 'Caramelized', colour: ColourPurple };\r\n }\r\n return { text: 'Unknown Sugar Lump', colour: ColourRed };\r\n}\r\n","import Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport GetTimeColour from '../../BeautifyAndFormatting/GetTimeColour';\r\nimport CalculateGrimoireRefillTime from '../../HelperFunctions/CalculateGrimoireRefillTime';\r\nimport { ColourTextPre, TooltipName } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Grimoire tooltips\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function Grimoire() {\r\n const { minigame } = Game.Objects['Wizard tower'];\r\n const spellCost = minigame.getSpellCost(minigame.spellsById[TooltipName]);\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipGrim === 1 &&\r\n spellCost <= minigame.magicM\r\n ) {\r\n const tooltipBox = l('CMTooltipBorder');\r\n\r\n // Time left till enough magic for spell\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Time Left'));\r\n const time = document.createElement('div');\r\n time.id = 'CMTooltipTime';\r\n tooltipBox.appendChild(time);\r\n const timeColour = GetTimeColour(\r\n CalculateGrimoireRefillTime(minigame.magic, minigame.magicM, spellCost),\r\n );\r\n time.textContent = timeColour.text;\r\n time.className = ColourTextPre + timeColour.colour;\r\n\r\n // Time left untill magic spent is recovered\r\n if (spellCost <= minigame.magic) {\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Recover Time'));\r\n const recover = document.createElement('div');\r\n recover.id = 'CMTooltipRecover';\r\n tooltipBox.appendChild(recover);\r\n const recoverColour = GetTimeColour(\r\n CalculateGrimoireRefillTime(\r\n Math.max(0, minigame.magic - spellCost),\r\n minigame.magicM,\r\n minigame.magic,\r\n ),\r\n );\r\n recover.textContent = recoverColour.text;\r\n recover.className = ColourTextPre + recoverColour.colour;\r\n }\r\n\r\n // Extra information on cookies gained when spell is Conjure Baked Goods (Name === 0)\r\n if (TooltipName === '0') {\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Cookies to be gained/lost'));\r\n const conjure = document.createElement('div');\r\n conjure.id = 'x';\r\n tooltipBox.appendChild(conjure);\r\n const reward = document.createElement('span');\r\n reward.style.color = '#33FF00';\r\n reward.textContent = Beautify(\r\n Math.max(Math.min(Game.cookies * 0.15, Game.cookiesPs * 60 * 30), 7),\r\n 2,\r\n );\r\n conjure.appendChild(reward);\r\n const seperator = document.createElement('span');\r\n seperator.textContent = ' / ';\r\n conjure.appendChild(seperator);\r\n const loss = document.createElement('span');\r\n loss.style.color = 'red';\r\n loss.textContent = Beautify(\r\n Math.min(Game.cookies, Math.min(Game.cookies * 0.15, Game.cookiesPs * 60 * 15) + 13),\r\n 2,\r\n );\r\n conjure.appendChild(loss);\r\n }\r\n\r\n l('CMTooltipArea').appendChild(tooltipBox);\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport { TooltipName } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Garden plots tooltips\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function GardenPlots() {\r\n const { minigame } = Game.Objects.Farm;\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipPlots &&\r\n minigame.plot[TooltipName[1]][TooltipName[0]][0] !== 0\r\n ) {\r\n const mature =\r\n minigame.plot[TooltipName[1]][TooltipName[0]][1] >\r\n minigame.plantsById[minigame.plot[TooltipName[1]][TooltipName[0]][0] - 1].mature;\r\n const plantName =\r\n minigame.plantsById[minigame.plot[TooltipName[1]][TooltipName[0]][0] - 1].name;\r\n l('CMTooltipBorder').appendChild(Create.TooltipCreateHeader('Reward (Current / Maximum)'));\r\n const reward = document.createElement('div');\r\n reward.id = 'CMTooltipPlantReward';\r\n l('CMTooltipBorder').appendChild(reward);\r\n if (plantName === 'Chocoroot' || plantName === 'White chocoroot') {\r\n l('CMTooltipPlantReward').textContent = `${\r\n mature ? Beautify(Math.min(Game.cookies * 0.03, Game.cookiesPs * 60 * 3)) : '0'\r\n } / ${Beautify(Game.cookiesPs * 60 * 3)}`;\r\n } else if (plantName === 'Bakeberry') {\r\n l('CMTooltipPlantReward').textContent = `${\r\n mature ? Beautify(Math.min(Game.cookies * 0.03, Game.cookiesPs * 60 * 30)) : '0'\r\n } / ${Beautify(Game.cookiesPs * 60 * 30)}`;\r\n } else if (plantName === 'Queenbeet') {\r\n l('CMTooltipPlantReward').textContent = `${\r\n mature ? Beautify(Math.min(Game.cookies * 0.04, Game.cookiesPs * 60 * 60)) : '0'\r\n } / ${Beautify(Game.cookiesPs * 60 * 60)}`;\r\n } else if (plantName === 'Duketater') {\r\n l('CMTooltipPlantReward').textContent = `${\r\n mature ? Beautify(Math.min(Game.cookies * 0.08, Game.cookiesPs * 60 * 120)) : '0'\r\n } / ${Beautify(Game.cookiesPs * 60 * 120)}`;\r\n } else l('CMTooltipArea').style.display = 'none';\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Garden Harvest All tooltip\r\n * It is called when the Harvest All tooltip is created or refreshed by CM.Disp.UpdateTooltip()\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function HarvestAll() {\r\n const { minigame } = Game.Objects.Farm;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipLump) {\r\n l('CMTooltipBorder').appendChild(Create.TooltipCreateHeader('Cookies gained from harvesting:'));\r\n let totalGain = 0;\r\n let mortal = 0;\r\n if (Game.keys[16] && Game.keys[17]) mortal = 1;\r\n for (let y = 0; y < 6; y++) {\r\n for (let x = 0; x < 6; x++) {\r\n if (minigame.plot[y][x][0] >= 1) {\r\n const tile = minigame.plot[y][x];\r\n const me = minigame.plantsById[tile[0] - 1];\r\n const plantName = me.name;\r\n\r\n let count = true;\r\n if (mortal && me.immortal) count = false;\r\n if (tile[1] < me.matureBase) count = false;\r\n if (count && plantName === 'Bakeberry') {\r\n totalGain += Math.min(Game.cookies * 0.03, Game.cookiesPs * 60 * 30);\r\n } else if ((count && plantName === 'Chocoroot') || plantName === 'White chocoroot') {\r\n totalGain += Math.min(Game.cookies * 0.03, Game.cookiesPs * 60 * 3);\r\n } else if (count && plantName === 'Queenbeet') {\r\n totalGain += Math.min(Game.cookies * 0.04, Game.cookiesPs * 60 * 60);\r\n } else if (count && plantName === 'Duketater') {\r\n totalGain += Math.min(Game.cookies * 0.08, Game.cookiesPs * 60 * 120);\r\n }\r\n }\r\n }\r\n }\r\n l('CMTooltipBorder').appendChild(document.createTextNode(Beautify(totalGain)));\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import { CacheWrinklersFattest, CacheWrinklersNormal } from '../../../Cache/VariablesAndData';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport { TooltipName } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the wrinkler button tooltip\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function WrinklerButton() {\r\n l('tooltip').innerHTML = '';\r\n l('tooltip').appendChild(Create.TooltipCreateHeader('Reward:'));\r\n\r\n const WrinklerReward = document.createElement('div');\r\n WrinklerReward.id = 'CMWrinklerReward';\r\n if (TooltipName === 'PopAllNormal') {\r\n WrinklerReward.textContent = Beautify(CacheWrinklersNormal);\r\n } else if (TooltipName === 'PopFattest') {\r\n WrinklerReward.textContent = Beautify(CacheWrinklersFattest[0]);\r\n }\r\n\r\n l('tooltip').appendChild(WrinklerReward);\r\n}\r\n","import { CacheGods } from '../../../Cache/VariablesAndData';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport { TooltipName, TooltipType } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Pantheon Gods tooltip\r\n * It is called when the Harvest All tooltip is created or refreshed by CM.Disp.UpdateTooltip()\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function PantheonGods() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipPantheon === 1) {\r\n const tooltipBox = l('CMTooltipBorder');\r\n let GodID;\r\n if (TooltipType === 'pas') GodID = TooltipName[1];\r\n else GodID = TooltipName;\r\n\r\n // Time left till enough magic for spell\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Effect in position 1:'));\r\n const cps1 = document.createElement('div');\r\n cps1.id = 'CMPantheonTooltipPosition1';\r\n if (CacheGods[GodID][0] !== 0) {\r\n cps1.textContent = Beautify(CacheGods[GodID][0]);\r\n const increase = Math.round((CacheGods[GodID][0] / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n cps1.textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n cps1.textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n } else cps1.textContent = 'No effect to CPS';\r\n tooltipBox.appendChild(cps1);\r\n\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Effect in position 2:'));\r\n const cps2 = document.createElement('div');\r\n cps2.id = 'CMPantheonTooltipPosition2';\r\n if (CacheGods[GodID][1] !== 0) {\r\n cps2.textContent = Beautify(CacheGods[GodID][1]);\r\n const increase = Math.round((CacheGods[GodID][1] / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n cps2.textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n cps2.textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n } else cps2.textContent = 'No effect to CPS';\r\n tooltipBox.appendChild(cps2);\r\n\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Effect in position 3:'));\r\n const cps3 = document.createElement('div');\r\n cps3.id = 'CMPantheonTooltipPosition2';\r\n if (CacheGods[GodID][2] !== 0) {\r\n cps3.textContent = Beautify(CacheGods[GodID][2]);\r\n const increase = Math.round((CacheGods[GodID][2] / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n cps3.textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n cps3.textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n } else cps3.textContent = 'No effect to CPS';\r\n tooltipBox.appendChild(cps3);\r\n\r\n l('CMTooltipArea').appendChild(tooltipBox);\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import GetCPSBuffMult from '../../../Cache/CPS/GetCPSBuffMult';\r\nimport { CacheEdifice, CacheLucky } from '../../../Cache/VariablesAndData';\r\nimport ToggleToolWarnPos from '../../../Config/Toggles/ToggleToolWarnPos';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../BeautifyAndFormatting/FormatTime';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../../HelperFunctions/GetWrinkConfigBank';\r\nimport { TooltipBonusIncome, TooltipPrice, TooltipType } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function updates the warnings section of the building and upgrade tooltips\r\n */\r\nexport default function Warnings() {\r\n if (TooltipType === 'b' || TooltipType === 'u') {\r\n if (document.getElementById('CMDispTooltipWarningParent') === null) {\r\n l('tooltipAnchor').appendChild(Create.TooltipCreateWarningSection());\r\n ToggleToolWarnPos();\r\n }\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos === 0)\r\n l('CMDispTooltipWarningParent').style.right = '0px';\r\n else l('CMDispTooltipWarningParent').style.top = `${l('tooltip').offsetHeight}px`;\r\n\r\n l('CMDispTooltipWarningParent').style.width = `${l('tooltip').offsetWidth - 6}px`;\r\n\r\n const amount = Game.cookies + GetWrinkConfigBank() - TooltipPrice;\r\n const bonusIncomeUsed = Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings\r\n .ToolWarnBon\r\n ? TooltipBonusIncome\r\n : 0;\r\n let limitLucky = CacheLucky;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnBon === 1) {\r\n let bonusNoFren = TooltipBonusIncome;\r\n bonusNoFren /= GetCPSBuffMult();\r\n limitLucky += (bonusNoFren * 60 * 15) / 0.15;\r\n }\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLucky === 1) {\r\n if (amount < limitLucky && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnLucky').style.display = '';\r\n l('CMDispTooltipWarnLuckyText').textContent = `${Beautify(\r\n limitLucky - amount,\r\n )} (${FormatTime((limitLucky - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnLucky').style.display = 'none';\r\n } else l('CMDispTooltipWarnLucky').style.display = 'none';\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLuckyFrenzy === 1\r\n ) {\r\n const limitLuckyFrenzy = limitLucky * 7;\r\n if (amount < limitLuckyFrenzy && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnLuckyFrenzy').style.display = '';\r\n l('CMDispTooltipWarnLuckyFrenzyText').textContent = `${Beautify(\r\n limitLuckyFrenzy - amount,\r\n )} (${FormatTime((limitLuckyFrenzy - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnLuckyFrenzy').style.display = 'none';\r\n } else l('CMDispTooltipWarnLuckyFrenzy').style.display = 'none';\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnConjure === 1) {\r\n const limitConjure = limitLucky * 2;\r\n if (amount < limitConjure && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnConjure').style.display = '';\r\n l('CMDispTooltipWarnConjureText').textContent = `${Beautify(\r\n limitConjure - amount,\r\n )} (${FormatTime((limitConjure - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnConjure').style.display = 'none';\r\n } else l('CMDispTooltipWarnConjure').style.display = 'none';\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnConjureFrenzy ===\r\n 1\r\n ) {\r\n const limitConjureFrenzy = limitLucky * 2 * 7;\r\n if (amount < limitConjureFrenzy && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnConjureFrenzy').style.display = '';\r\n l('CMDispTooltipWarnConjureFrenzyText').textContent = `${Beautify(\r\n limitConjureFrenzy - amount,\r\n )} (${FormatTime((limitConjureFrenzy - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnConjureFrenzy').style.display = 'none';\r\n } else l('CMDispTooltipWarnConjureFrenzy').style.display = 'none';\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnEdifice === 1 &&\r\n Game.Objects['Wizard tower'].minigameLoaded\r\n ) {\r\n if (CacheEdifice && amount < CacheEdifice && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnEdifice').style.display = '';\r\n l('CMDispTooltipWarnEdificeText').textContent = `${Beautify(\r\n CacheEdifice - amount,\r\n )} (${FormatTime((CacheEdifice - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnEdifice').style.display = 'none';\r\n } else l('CMDispTooltipWarnEdifice').style.display = 'none';\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser > 0) {\r\n if (\r\n amount <\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser *\r\n GetCPS() &&\r\n (TooltipType !== 'b' || Game.buyMode === 1)\r\n ) {\r\n l('CMDispTooltipWarnUser').style.display = '';\r\n // Need to update tooltip text dynamically\r\n l(\r\n 'CMDispTooltipWarnUser',\r\n ).children[0].textContent = `Purchase of this item will put you under the number of Cookies equal to ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser} seconds of CPS`;\r\n l('CMDispTooltipWarnUserText').textContent = `${Beautify(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser *\r\n GetCPS() -\r\n amount,\r\n )} (${FormatTime(\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser *\r\n GetCPS() -\r\n amount) /\r\n (GetCPS() + bonusIncomeUsed),\r\n )})`;\r\n } else l('CMDispTooltipWarnUser').style.display = 'none';\r\n } else l('CMDispTooltipWarnUser').style.display = 'none';\r\n } else if (l('CMDispTooltipWarningParent') !== null) {\r\n l('CMDispTooltipWarningParent').remove();\r\n }\r\n}\r\n","import ToggleWrinklerButtons from '../Config/Toggles/ToggleWrinklerButtons';\r\nimport UpdateBuildings from './BuildingsUpgrades/Buildings';\r\nimport UpdateUpgradeSectionsHeight from './BuildingsUpgrades/UpdateUpgradeSectionsHeight';\r\nimport UpdateUpgrades from './BuildingsUpgrades/Upgrades';\r\nimport { UpdateBotBar } from './InfoBars/BottomBar';\r\nimport { UpdateTimerBar } from './InfoBars/TimerBar';\r\nimport RefreshMenu from './MenuSections/Refreshmenu';\r\nimport UpdateTooltips from './Tooltips/UpdateTooltips';\r\nimport { CheckWrinklerTooltip, UpdateWrinklerTooltip } from './Tooltips/WrinklerTooltips';\r\n\r\n/**\r\n * This function handles all custom drawing for the Game.Draw() function.\r\n * It is hooked on 'draw' by CM.RegisterHooks()\r\n */\r\nexport default function CMDrawHook() {\r\n // Draw autosave timer in stats menu, this must be done here to make it count down correctly\r\n if (\r\n Game.prefs.autosave &&\r\n Game.drawT % 10 === 0 && // with autosave ON and every 10 ticks\r\n Game.onMenu === 'stats' &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Stats // while being on the stats menu only\r\n ) {\r\n const timer = document.getElementById('CMStatsAutosaveTimer');\r\n if (timer) {\r\n timer.innerText = Game.sayTime(Game.fps * 60 - (Game.T % (Game.fps * 60)), 4);\r\n }\r\n }\r\n\r\n // Update colours\r\n UpdateBuildings();\r\n UpdateUpgrades();\r\n UpdateUpgradeSectionsHeight();\r\n\r\n // Redraw timers\r\n UpdateTimerBar();\r\n\r\n // Update Bottom Bar\r\n UpdateBotBar();\r\n\r\n // Update Tooltip\r\n UpdateTooltips();\r\n\r\n // Update Wrinkler Tooltip\r\n CheckWrinklerTooltip();\r\n UpdateWrinklerTooltip();\r\n\r\n // Change menu refresh interval\r\n RefreshMenu();\r\n\r\n // Update display of wrinkler buttons, this checks if Elder Pledge has been bought and if they should be disabled\r\n ToggleWrinklerButtons();\r\n}\r\n","/** Functions related to the Timer Bar */\r\n\r\nimport { UpdateBotTimerBarPosition } from '../../Config/SpecificToggles';\r\nimport {\r\n BuffColours,\r\n ColourBackPre,\r\n ColourGray,\r\n ColourOrange,\r\n ColourPurple,\r\n LastNumberOfTimers,\r\n} from '../VariablesAndData';\r\nimport { CreateTimer } from './CreateDOMElements';\r\n\r\n/**\r\n * This function creates the TimerBar and appends it to l('wrapper')\r\n */\r\nexport function CreateTimerBar() {\r\n const TimerBar = document.createElement('div');\r\n TimerBar.id = 'CMTimerBar';\r\n TimerBar.style.position = 'absolute';\r\n TimerBar.style.display = 'none';\r\n TimerBar.style.height = '0px';\r\n TimerBar.style.fontSize = '10px';\r\n TimerBar.style.fontWeight = 'bold';\r\n TimerBar.style.backgroundColor = 'black';\r\n\r\n // Create standard Autosave bar\r\n const CMTimerBarAutosave = CreateTimer('CMTimerBarAutosave', 'Autosave', [\r\n { id: 'CMTimerBarAutosaveBar', colour: ColourPurple },\r\n ]);\r\n TimerBar.appendChild(CMTimerBarAutosave);\r\n\r\n // Create standard Golden Cookie bar\r\n const CMTimerBarGC = CreateTimer('CMTimerBarGC', 'Next Cookie', [\r\n { id: 'CMTimerBarGCMinBar', colour: ColourGray },\r\n { id: 'CMTimerBarGCBar', colour: ColourPurple },\r\n ]);\r\n TimerBar.appendChild(CMTimerBarGC);\r\n\r\n // Create standard Reindeer bar\r\n const CMTimerBarRen = CreateTimer('CMTimerBarRen', 'Next Reindeer', [\r\n { id: 'CMTimerBarRenMinBar', colour: ColourGray },\r\n { id: 'CMTimerBarRenBar', colour: ColourOrange },\r\n ]);\r\n TimerBar.appendChild(CMTimerBarRen);\r\n const TimerBarBuffTimers = document.createElement('div');\r\n TimerBarBuffTimers.id = 'CMTimerBarBuffTimers';\r\n TimerBar.appendChild(TimerBarBuffTimers);\r\n\r\n l('wrapper').appendChild(TimerBar);\r\n}\r\n\r\n/**\r\n * This function updates indivudual timers in the timer bar\r\n */\r\nexport function UpdateTimerBar() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1) {\r\n // label width: 113, timer width: 30, div margin: 20\r\n const maxWidthTwoBar = l('CMTimerBar').offsetWidth - 163;\r\n // label width: 113, div margin: 20, calculate timer width at runtime\r\n const maxWidthOneBar = l('CMTimerBar').offsetWidth - 133;\r\n let numberOfTimers = 0;\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AutosaveTimerBar &&\r\n Game.prefs.autosave\r\n ) {\r\n const timeTillNextAutosave =\r\n (Game.fps * 60 - (Game.OnAscend ? 0 : Game.T % (Game.fps * 60))) / Game.fps;\r\n l('CMTimerBarAutosave').style.display = '';\r\n l('CMTimerBarAutosaveBar').style.width = `${Math.round(\r\n (timeTillNextAutosave *\r\n (maxWidthOneBar - Math.ceil(timeTillNextAutosave).toString().length * 8)) /\r\n 60,\r\n )}px`;\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1\r\n ) {\r\n l('CMTimerBarAutosaveBar').textContent = Math.ceil(timeTillNextAutosave);\r\n } else l('CMTimerBarAutosaveBar').textContent = '';\r\n l('CMTimerBarAutosaveTime').textContent = Math.ceil(timeTillNextAutosave);\r\n numberOfTimers += 1;\r\n } else l('CMTimerBarAutosave').style.display = 'none';\r\n\r\n // Regulates visibility of Golden Cookie timer\r\n if (Game.shimmerTypes.golden.spawned === 0 && !Game.Has('Golden switch [off]')) {\r\n l('CMTimerBarGC').style.display = '';\r\n l('CMTimerBarGCMinBar').style.width = `${Math.round(\r\n (Math.max(0, Game.shimmerTypes.golden.minTime - Game.shimmerTypes.golden.time) *\r\n maxWidthTwoBar) /\r\n Game.shimmerTypes.golden.maxTime,\r\n )}px`;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1)\r\n l('CMTimerBarGCMinBar').textContent = Math.ceil(\r\n (Game.shimmerTypes.golden.minTime - Game.shimmerTypes.golden.time) / Game.fps,\r\n );\r\n else l('CMTimerBarGCMinBar').textContent = '';\r\n if (Game.shimmerTypes.golden.minTime === Game.shimmerTypes.golden.maxTime) {\r\n l('CMTimerBarGCMinBar').style.borderTopRightRadius = '10px';\r\n l('CMTimerBarGCMinBar').style.borderBottomRightRadius = '10px';\r\n } else {\r\n l('CMTimerBarGCMinBar').style.borderTopRightRadius = '';\r\n l('CMTimerBarGCMinBar').style.borderBottomRightRadius = '';\r\n }\r\n l('CMTimerBarGCBar').style.width = `${Math.round(\r\n (Math.min(\r\n Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.minTime,\r\n Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.time,\r\n ) *\r\n maxWidthTwoBar) /\r\n Game.shimmerTypes.golden.maxTime,\r\n )}px`;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1)\r\n l('CMTimerBarGCBar').textContent = Math.ceil(\r\n Math.min(\r\n Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.minTime,\r\n Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.time,\r\n ) / Game.fps,\r\n );\r\n else l('CMTimerBarGCBar').textContent = '';\r\n const chanceToSpawn =\r\n Math.max(\r\n 0,\r\n (Game.shimmerTypes.golden.time - Game.shimmerTypes.golden.minTime) /\r\n (Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.minTime),\r\n ) ** 5;\r\n l('CMTimerBarGCTime').textContent = `${Math.ceil(\r\n (Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.time) / Game.fps,\r\n )} ${chanceToSpawn < 0.01 ? '<' : ''}${chanceToSpawn.toLocaleString('en', {\r\n style: 'percent',\r\n })}`;\r\n numberOfTimers += 1;\r\n } else l('CMTimerBarGC').style.display = 'none';\r\n\r\n // Regulates visibility of Reindeer timer\r\n if (Game.season === 'christmas' && Game.shimmerTypes.reindeer.spawned === 0) {\r\n l('CMTimerBarRen').style.display = '';\r\n l('CMTimerBarRenMinBar').style.width = `${Math.round(\r\n (Math.max(0, Game.shimmerTypes.reindeer.minTime - Game.shimmerTypes.reindeer.time) *\r\n maxWidthTwoBar) /\r\n Game.shimmerTypes.reindeer.maxTime,\r\n )}px`;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1)\r\n l('CMTimerBarRenMinBar').textContent = Math.ceil(\r\n (Game.shimmerTypes.reindeer.minTime - Game.shimmerTypes.reindeer.time) / Game.fps,\r\n );\r\n else l('CMTimerBarRenMinBar').textContent = '';\r\n l('CMTimerBarRenBar').style.width = `${Math.round(\r\n (Math.min(\r\n Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.minTime,\r\n Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.time,\r\n ) *\r\n maxWidthTwoBar) /\r\n Game.shimmerTypes.reindeer.maxTime,\r\n )}px`;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1)\r\n l('CMTimerBarRenBar').textContent = Math.ceil(\r\n Math.min(\r\n Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.minTime,\r\n Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.time,\r\n ) / Game.fps,\r\n );\r\n else l('CMTimerBarRenBar').textContent = '';\r\n const chanceToSpawn =\r\n Math.max(\r\n 0,\r\n (Game.shimmerTypes.reindeer.time - Game.shimmerTypes.reindeer.minTime) /\r\n (Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.minTime),\r\n ) ** 5;\r\n l('CMTimerBarRenTime').textContent = `${Math.ceil(\r\n (Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.time) / Game.fps,\r\n )} ${chanceToSpawn < 0.01 ? '<' : ''}${chanceToSpawn.toLocaleString('en', {\r\n style: 'percent',\r\n })}`;\r\n numberOfTimers += 1;\r\n } else {\r\n l('CMTimerBarRen').style.display = 'none';\r\n }\r\n\r\n // On every frame all buff-timers are deleted and re-created\r\n const BuffTimerBars = {};\r\n l('CMTimerBarBuffTimers').innerHTML = '';\r\n Object.keys(Game.buffs).forEach((i) => {\r\n if (Game.buffs[i]) {\r\n const timer = CreateTimer(Game.buffs[i].name, Game.buffs[i].name, [\r\n { id: `${Game.buffs[i].name}Bar` },\r\n ]);\r\n timer.style.display = '';\r\n let classColour = '';\r\n // Gives specific timers specific colours\r\n if (typeof BuffColours[Game.buffs[i].name] !== 'undefined') {\r\n classColour = BuffColours[Game.buffs[i].name];\r\n } else classColour = ColourPurple;\r\n timer.lastChild.children[1].className = ColourBackPre + classColour;\r\n timer.lastChild.children[1].style.color = 'black';\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay === 2\r\n )\r\n timer.lastChild.children[1].textContent = `${Math.round(\r\n 100 * (Game.buffs[i].time / Game.buffs[i].maxTime),\r\n )}%`;\r\n else timer.lastChild.children[1].textContent = '';\r\n timer.lastChild.children[1].style.width = `${Math.round(\r\n (Game.buffs[i].time *\r\n (maxWidthOneBar - Math.ceil(Game.buffs[i].time / Game.fps).toString().length * 8)) /\r\n Game.buffs[i].maxTime,\r\n )}px`;\r\n timer.lastChild.children[2].textContent = Math.ceil(Game.buffs[i].time / Game.fps);\r\n numberOfTimers += 1;\r\n BuffTimerBars[Game.buffs[i].name] = timer;\r\n }\r\n });\r\n Object.keys(BuffTimerBars).forEach((i) => {\r\n l('CMTimerBarBuffTimers').appendChild(BuffTimerBars[i]);\r\n });\r\n\r\n if (numberOfTimers !== 0) {\r\n l('CMTimerBar').style.height = `${numberOfTimers * 12 + 2}px`;\r\n }\r\n if (LastNumberOfTimers !== numberOfTimers) {\r\n LastNumberOfTimers = numberOfTimers;\r\n UpdateBotTimerBarPosition();\r\n }\r\n }\r\n}\r\n","import { SimObjects } from '../../Sim/VariablesAndData';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\nimport {\r\n TooltipWrinkler,\r\n TooltipWrinklerArea,\r\n TooltipWrinklerBeingShown,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks and create a tooltip for the wrinklers\r\n * It is called by CM.Disp.Draw()\r\n * As wrinklers are not appended to the DOM we us a different system than for other tooltips\r\n */\r\nexport function CheckWrinklerTooltip() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipWrink === 1 &&\r\n TooltipWrinklerArea === 1\r\n ) {\r\n // Latter is set by CM.Main.AddWrinklerAreaDetect\r\n let showingTooltip = false;\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n const me = Game.wrinklers[i];\r\n if (me.phase > 0 && me.selected) {\r\n showingTooltip = true;\r\n if (TooltipWrinklerBeingShown[i] === 0 || TooltipWrinklerBeingShown[i] === undefined) {\r\n const placeholder = document.createElement('div');\r\n const wrinkler = document.createElement('div');\r\n wrinkler.style.minWidth = '120px';\r\n wrinkler.style.marginBottom = '4px';\r\n const div = document.createElement('div');\r\n div.style.textAlign = 'center';\r\n div.id = 'CMTooltipWrinkler';\r\n wrinkler.appendChild(div);\r\n placeholder.appendChild(wrinkler);\r\n Game.tooltip.draw(this, escape(placeholder.innerHTML));\r\n TooltipWrinkler = i;\r\n TooltipWrinklerBeingShown[i] = 1;\r\n }\r\n } else {\r\n TooltipWrinklerBeingShown[i] = 0;\r\n }\r\n });\r\n if (!showingTooltip) {\r\n Game.tooltip.hide();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * This function updates the amount to be displayed by the wrinkler tooltip created by CM.Disp.CheckWrinklerTooltip()\r\n * It is called by CM.Disp.Draw()\r\n * As wrinklers are not appended to the DOM we us a different system than for other tooltips\r\n */\r\nexport function UpdateWrinklerTooltip() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipWrink === 1 &&\r\n l('CMTooltipWrinkler') !== null\r\n ) {\r\n let { sucked } = Game.wrinklers[TooltipWrinkler];\r\n let toSuck = 1.1;\r\n if (Game.Has('Sacrilegious corruption')) toSuck *= 1.05;\r\n if (Game.wrinklers[TooltipWrinkler].type === 1) toSuck *= 3; // Shiny wrinklers\r\n sucked *= toSuck;\r\n if (Game.Has('Wrinklerspawn')) sucked *= 1.05;\r\n if (SimObjects.Temple.minigameLoaded) {\r\n const godLvl = Game.hasGod('scorn');\r\n if (godLvl === 1) sucked *= 1.15;\r\n else if (godLvl === 2) sucked *= 1.1;\r\n else if (godLvl === 3) sucked *= 1.05;\r\n }\r\n l('CMTooltipWrinkler').textContent = Beautify(sucked);\r\n }\r\n}\r\n","/**\r\n * This function refreshes the stats page, CM.Options.UpStats determines the rate at which that happens\r\n * It is called by CM.Disp.Draw()\r\n */\r\nexport default function RefreshMenu() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpStats &&\r\n Game.onMenu === 'stats' &&\r\n (Game.drawT - 1) % (Game.fps * 5) !== 0 &&\r\n (Game.drawT - 1) % Game.fps === 0\r\n )\r\n Game.UpdateMenu();\r\n}\r\n","import { CacheAverageCookiesFromClicks } from '../Cache/VariablesAndData';\r\n\r\nexport default function CMClickHook() {\r\n // Add cookies from click to array that stores average\r\n CacheAverageCookiesFromClicks.addLatest(Game.computedMouseCps);\r\n}\r\n","import { ClickTimes, CookieTimes } from '../../Disp/VariablesAndData';\r\nimport {\r\n ChoEggDiff, // eslint-disable-line no-unused-vars\r\n ClicksDiff, // eslint-disable-line no-unused-vars\r\n CookiesDiff, // eslint-disable-line no-unused-vars\r\n WrinkDiff, // eslint-disable-line no-unused-vars\r\n WrinkFattestDiff, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * @class\r\n * @classdesc \tThis is a class used to store values used to calculate average over time (mostly cps)\r\n * @var\t\t\t{number}\t\t\t\tmaxLength\tThe maximum length of the value-storage\r\n * @var\t\t\t{[]}\t\t\t\t\tqueue\t\tThe values stored\r\n * @method\t\taddLatest(newValue)\t\tAppends newValue to the value storage\r\n * @method\t\tcalcAverage(timePeriod)\tReturns the average over the specified timeperiod\r\n */\r\nexport class CMAvgQueue {\r\n constructor(maxLength) {\r\n this.maxLength = maxLength;\r\n this.queue = [];\r\n }\r\n\r\n addLatest(newValue) {\r\n if (this.queue.push(newValue) > this.maxLength) {\r\n this.queue.shift();\r\n }\r\n }\r\n\r\n /**\r\n * This functions returns the average of the values in the queue\r\n * @param \t{number}\ttimePeriod\tThe period in seconds to computer average over\r\n * @returns {number}\tret\t\t\tThe average\r\n */\r\n calcAverage(timePeriod) {\r\n let time = timePeriod;\r\n if (time > this.maxLength) time = this.maxLength;\r\n if (time > this.queue.length) time = this.queue.length;\r\n let ret = 0;\r\n for (let i = this.queue.length - 1; i >= 0 && i > this.queue.length - 1 - time; i--) {\r\n ret += this.queue[i];\r\n }\r\n if (ret === 0) {\r\n return 0;\r\n }\r\n return ret / time;\r\n }\r\n\r\n calcSum(timePeriod) {\r\n let time = timePeriod;\r\n if (time > this.maxLength) time = this.maxLength;\r\n if (time > this.queue.length) time = this.queue.length;\r\n if (time === 0) return 0;\r\n return this.queue.slice(-time).reduce((a, b) => a + b, 0);\r\n }\r\n}\r\n\r\n/**\r\n * This functions caches creates the CMAvgQueue used by CM.Cache.CacheAvgCPS() to calculate CPS\r\n * Called by CM.Cache.InitCache()\r\n */\r\nexport function InitCookiesDiff() {\r\n CookiesDiff = new CMAvgQueue(CookieTimes[CookieTimes.length - 1]);\r\n WrinkDiff = new CMAvgQueue(CookieTimes[CookieTimes.length - 1]);\r\n WrinkFattestDiff = new CMAvgQueue(CookieTimes[CookieTimes.length - 1]);\r\n ChoEggDiff = new CMAvgQueue(CookieTimes[CookieTimes.length - 1]);\r\n ClicksDiff = new CMAvgQueue(ClickTimes[ClickTimes.length - 1]);\r\n}\r\n","/**\r\n * Insert the provided values into `window.CookieMonsterData.Cache`.\r\n *\r\n * The initial 'Cache' is dropped from the name, so e.g. `CacheWrinklersTotal`\r\n * becomes `window.CookieMonsterData.Cache.WrinklersTotal`.\r\n */\r\nexport default function FillCMDCache(caches) {\r\n if (!('Cache' in window.CookieMonsterData)) {\r\n window.CookieMonsterData.Cache = {};\r\n }\r\n\r\n Object.keys(caches).forEach((name) => {\r\n const exportName = name.replace(/^Cache/, '');\r\n\r\n if (typeof caches[name] === 'undefined') {\r\n window.CookieMonsterData.Cache[exportName] = undefined;\r\n } else {\r\n // Passing through JSON ensures that no references are retained.\r\n window.CookieMonsterData.Cache[exportName] = JSON.parse(JSON.stringify(caches[name]));\r\n }\r\n });\r\n}\r\n","import { ClickTimes, CookieTimes } from '../../Disp/VariablesAndData';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheAverageClicks,\r\n CacheAverageCPS,\r\n CacheAverageGainBank,\r\n CacheAverageGainChoEgg,\r\n CacheAverageGainWrink,\r\n CacheAverageGainWrinkFattest,\r\n CacheAvgCPSWithChoEgg,\r\n CacheLastChoEgg,\r\n CacheLastClicks,\r\n CacheLastCookies,\r\n CacheLastCPSCheck,\r\n CacheLastWrinkCookies,\r\n CacheLastWrinkFattestCookies,\r\n CacheRealCookiesEarned,\r\n CacheSellForChoEgg,\r\n CacheWrinklersFattest,\r\n CacheWrinklersTotal,\r\n ChoEggDiff,\r\n ClicksDiff,\r\n CookiesDiff,\r\n WrinkDiff,\r\n WrinkFattestDiff,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches two variables related average CPS and Clicks\r\n * It is called by CM.Cache.LoopCache()\r\n * @global\t{number}\tCM.Cache.RealCookiesEarned\tCookies earned including the Chocolate Egg\r\n * @global\t{number}\tCM.Cache.AvgCPS\t\t\t\tAverage cookies over time-period as defined by AvgCPSHist\r\n * @global\t{number}\tCM.Cache.AverageClicks\t\tAverage cookies from clicking over time-period as defined by AvgClicksHist\r\n * @global\t{number}\tCM.Cache.AvgCPSChoEgg\t\tAverage cookies from combination of normal CPS and average Chocolate Cookie CPS\r\n */\r\nexport default function CacheAvgCPS() {\r\n const currDate = Math.floor(Date.now() / 1000);\r\n // Only calculate every new second\r\n if ((Game.T / Game.fps) % 1 === 0) {\r\n let choEggTotal = Game.cookies + CacheSellForChoEgg;\r\n if (Game.cpsSucked > 0) choEggTotal += CacheWrinklersTotal;\r\n CacheRealCookiesEarned = Math.max(Game.cookiesEarned, choEggTotal);\r\n choEggTotal *= 0.05;\r\n\r\n // Add recent gains to AvgQueue's\r\n const timeDiff = currDate - CacheLastCPSCheck;\r\n const bankDiffAvg = Math.max(0, Game.cookies - CacheLastCookies) / timeDiff;\r\n const wrinkDiffAvg = Math.max(0, CacheWrinklersTotal - CacheLastWrinkCookies) / timeDiff;\r\n const wrinkFattestDiffAvg =\r\n Math.max(0, CacheWrinklersFattest[0] - CacheLastWrinkFattestCookies) / timeDiff;\r\n const choEggDiffAvg = Math.max(0, choEggTotal - CacheLastChoEgg) / timeDiff;\r\n const clicksDiffAvg = (Game.cookieClicks - CacheLastClicks) / timeDiff;\r\n for (let i = 0; i < timeDiff; i++) {\r\n CookiesDiff.addLatest(bankDiffAvg);\r\n WrinkDiff.addLatest(wrinkDiffAvg);\r\n WrinkFattestDiff.addLatest(wrinkFattestDiffAvg);\r\n ChoEggDiff.addLatest(choEggDiffAvg);\r\n ClicksDiff.addLatest(clicksDiffAvg);\r\n }\r\n\r\n // Store current data for next loop\r\n CacheLastCPSCheck = currDate;\r\n CacheLastCookies = Game.cookies;\r\n CacheLastWrinkCookies = CacheWrinklersTotal;\r\n CacheLastWrinkFattestCookies = CacheWrinklersFattest[0];\r\n CacheLastChoEgg = choEggTotal;\r\n CacheLastClicks = Game.cookieClicks;\r\n\r\n // Get average gain over period of cpsLength seconds\r\n const cpsLength =\r\n CookieTimes[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist];\r\n CacheAverageGainBank = CookiesDiff.calcAverage(cpsLength);\r\n CacheAverageGainWrink = WrinkDiff.calcAverage(cpsLength);\r\n CacheAverageGainWrinkFattest = WrinkFattestDiff.calcAverage(cpsLength);\r\n CacheAverageGainChoEgg = ChoEggDiff.calcAverage(cpsLength);\r\n CacheAverageCPS = CacheAverageGainBank;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 1)\r\n CacheAverageCPS += CacheAverageGainWrink;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 2)\r\n CacheAverageCPS += CacheAverageGainWrinkFattest;\r\n\r\n const choEgg = Game.HasUnlocked('Chocolate egg') && !Game.Has('Chocolate egg');\r\n\r\n if (\r\n choEgg ||\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 0\r\n ) {\r\n CacheAvgCPSWithChoEgg =\r\n CacheAverageGainBank + CacheAverageGainWrink + (choEgg ? CacheAverageGainChoEgg : 0);\r\n } else CacheAvgCPSWithChoEgg = CacheAverageCPS;\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n CacheAverageClicks = ClicksDiff.calcAverage(\r\n ClickTimes[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist],\r\n );\r\n }\r\n\r\n FillCMDCache({\r\n CacheRealCookiesEarned,\r\n CacheLastCPSCheck,\r\n CacheLastCookies,\r\n CacheLastWrinkCookies,\r\n CacheLastWrinkFattestCookies,\r\n CacheLastChoEgg,\r\n CacheLastClicks,\r\n CacheAverageGainBank,\r\n CacheAverageGainWrink,\r\n CacheAverageGainWrinkFattest,\r\n CacheAverageGainChoEgg,\r\n CacheAverageCPS,\r\n CacheAvgCPSWithChoEgg,\r\n CacheAverageClicks,\r\n });\r\n}\r\n","/**\r\n * This function calculates the total price for buying \"increase\" of a building\r\n * @param\t{string}\tbuild\t\tName of the building\r\n * @param\t{number}\tbasePrice\tBase Price of building\r\n * @param\t{number}\tstart\t\tStarting amount of building\r\n * @param\t{number}\tfree\t\tFree amount of building\r\n * @param\t{number}\tincrease\tIncrease of building\r\n * @returns {number}\tmoni\t\tTotal price\r\n */\r\nexport default function BuildingGetPrice(build, basePrice, start, free, increase) {\r\n let partialPrice = 0;\r\n for (let i = Math.max(0, start); i < Math.max(0, start + increase); i++) {\r\n partialPrice += Game.priceIncrease ** Math.max(0, i - free);\r\n }\r\n let price = basePrice * partialPrice;\r\n price = Game.modifyBuildingPrice(Game.Objects[build], price);\r\n return Math.ceil(price);\r\n}\r\n","import GetWrinkConfigBank from '../../Disp/HelperFunctions/GetWrinkConfigBank';\r\nimport { ColourGray } from '../../Disp/VariablesAndData';\r\nimport BuildingGetPrice from '../../Sim/SimulationEvents/BuyBuilding';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheMinPP,\r\n CacheMinPPBulk,\r\n CacheObjects1,\r\n CacheObjects10,\r\n CacheObjects100,\r\n CachePPArray,\r\n} from '../VariablesAndData';\r\nimport ColourOfPP from './ColourOfPP';\r\n\r\n/**\r\n * This functions caches the buildings of bulk-buy mode when PP is compared against optimal single-purchase building\r\n * It saves all date in CM.Cache.Objects...\r\n * It is called by CM.Cache.CacheBuildingsPP()\r\n */\r\nfunction CacheColour(target, amount) {\r\n Object.keys(target).forEach((i) => {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPRigidelMode &&\r\n amount === 1\r\n ) {\r\n target[i].colour = ColourGray; // eslint-disable-line no-param-reassign\r\n return;\r\n }\r\n // eslint-disable-next-line no-param-reassign\r\n target[i].colour = ColourOfPP(\r\n target[i],\r\n BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n amount,\r\n ),\r\n );\r\n // Colour based on excluding certain top-buildings\r\n for (\r\n let j = 0;\r\n j < Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop;\r\n j++\r\n ) {\r\n if (target[i].pp === CachePPArray[j][0]) target[i].colour = ColourGray; // eslint-disable-line no-param-reassign\r\n }\r\n });\r\n}\r\n\r\nfunction CachePP(target, amount) {\r\n Object.keys(target).forEach((i) => {\r\n const price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n amount,\r\n );\r\n if (Game.cookiesPs) {\r\n target[i].pp = // eslint-disable-line no-param-reassign\r\n Math.max(price - (Game.cookies + GetWrinkConfigBank()), 0) / Game.cookiesPs +\r\n price / target[i].bonus;\r\n } else target[i].pp = price / target[i].bonus; // eslint-disable-line no-param-reassign\r\n if (\r\n !(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPRigidelMode &&\r\n amount === 1\r\n )\r\n )\r\n CachePPArray.push([target[i].pp, amount, price]);\r\n });\r\n}\r\n\r\n/**\r\n * This functions caches the PP of each building it saves all date in CM.Cache.Objects...\r\n * It is called by CM.Cache.CachePP()\r\n */\r\nexport default function CacheBuildingsPP() {\r\n CacheMinPP = Infinity;\r\n CachePPArray = [];\r\n if (\r\n typeof Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop ===\r\n 'undefined'\r\n )\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop = 0; // Otherwise breaks during initialization\r\n\r\n // Calculate PP and colours\r\n CachePP(CacheObjects1, 1);\r\n CachePP(CacheObjects10, 10);\r\n CachePP(CacheObjects100, 100);\r\n\r\n // Set CM.Cache.min to best non-excluded buidliung\r\n CachePPArray.sort((a, b) => a[0] - b[0]);\r\n let indexOfMin = Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPOnlyConsiderBuyable) {\r\n while (CachePPArray[indexOfMin][2] > Game.cookies) {\r\n indexOfMin += 1;\r\n if (CachePPArray.length === indexOfMin + 1) {\r\n break;\r\n }\r\n }\r\n }\r\n CacheMinPP = CachePPArray[indexOfMin][0];\r\n CacheMinPPBulk = CachePPArray[indexOfMin][1];\r\n\r\n CacheColour(CacheObjects1, 1);\r\n CacheColour(CacheObjects10, 10);\r\n CacheColour(CacheObjects100, 100);\r\n\r\n FillCMDCache({ CacheMinPP, CacheMinPPBulk, CachePPArray });\r\n}\r\n","/**\r\n * Section: Functions related to caching PP */\r\n\r\nimport { CacheObjects1, CacheObjects10, CacheObjects100, CacheUpgrades } from '../VariablesAndData';\r\nimport CacheBuildingsPP from './Building';\r\nimport CacheUpgradePP from './Upgrade';\r\n\r\n/**\r\n * This functions caches the PP of each building and upgrade and stores it in the cache\r\n * It is called by CM.Cache.LoopCache() and CM.Cache.InitCache()\r\n */\r\nexport default function CachePP() {\r\n CacheBuildingsPP();\r\n CacheUpgradePP();\r\n window.CookieMonsterData.Objects1 = JSON.parse(JSON.stringify(CacheObjects1));\r\n window.CookieMonsterData.Objects10 = JSON.parse(JSON.stringify(CacheObjects10));\r\n window.CookieMonsterData.Objects100 = JSON.parse(JSON.stringify(CacheObjects100));\r\n window.CookieMonsterData.Upgrades = [];\r\n Object.entries(CacheUpgrades).forEach((i) => {\r\n window.CookieMonsterData.Upgrades[i[0]] = JSON.parse(JSON.stringify(i[1]));\r\n });\r\n}\r\n","import GetWrinkConfigBank from '../../Disp/HelperFunctions/GetWrinkConfigBank';\r\nimport { CacheUpgrades } from '../VariablesAndData';\r\nimport ColourOfPP from './ColourOfPP';\r\n\r\n/**\r\n * This functions caches the PP of each building it saves all date in CM.Cache.Upgrades\r\n * It is called by CM.Cache.CachePP()\r\n */\r\nexport default function CacheUpgradePP() {\r\n Object.keys(CacheUpgrades).forEach((i) => {\r\n if (Game.cookiesPs) {\r\n CacheUpgrades[i].pp =\r\n Math.max(Game.Upgrades[i].getPrice() - (Game.cookies + GetWrinkConfigBank()), 0) /\r\n Game.cookiesPs +\r\n Game.Upgrades[i].getPrice() / CacheUpgrades[i].bonus;\r\n } else CacheUpgrades[i].pp = Game.Upgrades[i].getPrice() / CacheUpgrades[i].bonus;\r\n if (Number.isNaN(CacheUpgrades[i].pp)) CacheUpgrades[i].pp = Infinity;\r\n\r\n CacheUpgrades[i].colour = ColourOfPP(CacheUpgrades[i], Game.Upgrades[i].getPrice());\r\n });\r\n}\r\n","import CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport SimAuraMult from '../ReplacedGameFunctions/SimAuraMult';\r\nimport SimEff from '../ReplacedGameFunctions/SimEff';\r\nimport SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport SimHasGod from '../ReplacedGameFunctions/SimHasGod';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport {\r\n SimAchievementsOwned,\r\n SimCookiesPs,\r\n SimObjects,\r\n SimPledges,\r\n SimUpgrades,\r\n SimUpgradesOwned, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates the cookies per click\r\n * It is called by CM.Sim.BuyUpgradesBonusIncome() when an upgrades has no bonus-income (and is thus a clicking-upgrade)\r\n * @returns\t{number}\tout\tThe clicking power\r\n */\r\nfunction MouseCps() {\r\n let add = 0;\r\n if (SimHas('Thousand fingers')) add += 0.1;\r\n if (SimHas('Million fingers')) add *= 5;\r\n if (SimHas('Billion fingers')) add *= 10;\r\n if (SimHas('Trillion fingers')) add *= 20;\r\n if (SimHas('Quadrillion fingers')) add *= 20;\r\n if (SimHas('Quintillion fingers')) add *= 20;\r\n if (SimHas('Sextillion fingers')) add *= 20;\r\n if (SimHas('Septillion fingers')) add *= 20;\r\n if (SimHas('Octillion fingers')) add *= 20;\r\n if (SimHas('Nonillion fingers')) add *= 20;\r\n if (SimHas('Decillion fingers')) add *= 20;\r\n if (SimHas('Undecillion fingers')) add *= 20;\r\n if (SimHas('Unshackled cursors')) add *= 25;\r\n let num = 0;\r\n Object.keys(SimObjects).forEach((i) => {\r\n num += SimObjects[i].amount;\r\n });\r\n num -= SimObjects.Cursor.amount;\r\n add *= num;\r\n\r\n // Can use SimCookiesPs as function is always called after CM.Sim.CalculateGains()\r\n if (SimHas('Plastic mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Iron mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Titanium mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Adamantium mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Unobtainium mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Eludium mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Wishalloy mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Fantasteel mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Nevercrack mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Armythril mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Technobsidian mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Plasmarble mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Miraculite mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Aetherice mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Omniplast mouse')) add += SimCookiesPs * 0.01;\r\n\r\n if (SimHas('Fortune #104')) add += SimCookiesPs * 0.01;\r\n\r\n let mult = 1;\r\n if (SimHas(\"Santa's helpers\")) mult *= 1.1;\r\n if (SimHas('Cookie egg')) mult *= 1.1;\r\n if (SimHas('Halo gloves')) mult *= 1.1;\r\n if (SimHas('Dragon claw')) mult *= 1.03;\r\n\r\n if (SimHas('Aura gloves')) {\r\n mult *= 1 + 0.05 * Math.min(Game.Objects.Cursor.level, SimHas('Luminous gloves') ? 20 : 10);\r\n }\r\n\r\n mult *= SimEff('click');\r\n if (SimObjects.Temple.minigameLoaded) {\r\n if (SimHasGod) {\r\n const godLvl = SimHasGod('labor');\r\n if (godLvl === 1) mult *= 1.15;\r\n else if (godLvl === 2) mult *= 1.1;\r\n else if (godLvl === 3) mult *= 1.05;\r\n }\r\n }\r\n\r\n Object.keys(Game.buffs).forEach((i) => {\r\n if (typeof Game.buffs[i].multClick !== 'undefined') mult *= Game.buffs[i].multClick;\r\n });\r\n\r\n // if (CM.Sim.auraMult('Dragon Cursor')) mult*=1.05;\r\n mult *= 1 + SimAuraMult('Dragon Cursor') * 0.05;\r\n\r\n // No need to make this function a CM function\r\n let out =\r\n mult *\r\n Game.ComputeCps(\r\n 1,\r\n SimHas('Reinforced index finger') +\r\n SimHas('Carpal tunnel prevention cream') +\r\n SimHas('Ambidextrous'),\r\n add,\r\n );\r\n\r\n out = Game.runModHookOnValue('cookiesPerClick', out);\r\n\r\n if (Game.hasBuff('Cursed finger')) out = Game.buffs['Cursed finger'].power;\r\n\r\n return out;\r\n}\r\n\r\n/**\r\n * This function calculates the bonus income of buying a building\r\n * It is called by CM.Cache.CacheBuildingIncome()\r\n * @param\t{string}\t\t\t\tbuilding\tThe name of the upgrade to be bought\r\n * @returns {[{number, number}]}\t\t\t\tThe bonus income of the upgrade and the difference in MouseCPS\r\n */\r\nexport default function BuyUpgradesBonusIncome(upgrade) {\r\n if (\r\n Game.Upgrades[upgrade].pool === 'toggle' ||\r\n (Game.Upgrades[upgrade].bought === 0 &&\r\n Game.Upgrades[upgrade].unlocked &&\r\n Game.Upgrades[upgrade].pool !== 'prestige')\r\n ) {\r\n CopyData();\r\n if (SimUpgrades[upgrade].name === 'Shimmering veil [on]') {\r\n SimUpgrades['Shimmering veil [off]'].bought = 0;\r\n } else if (SimUpgrades[upgrade].name === 'Golden switch [on]') {\r\n SimUpgrades['Golden switch [off]'].bought = 0;\r\n } else {\r\n SimUpgrades[upgrade].bought = (SimUpgrades[upgrade].bought + 1) % 2;\r\n }\r\n if (Game.CountsAsUpgradeOwned(Game.Upgrades[upgrade].pool)) SimUpgradesOwned += 1;\r\n\r\n if (upgrade === 'Elder Pledge') {\r\n SimPledges += 1;\r\n if (SimPledges > 0) SimWin('Elder nap');\r\n if (SimPledges >= 5) SimWin('Elder slumber');\r\n } else if (upgrade === 'Elder Covenant') {\r\n SimWin('Elder calm');\r\n } else if (upgrade === 'Prism heart biscuits') {\r\n SimWin('Lovely cookies');\r\n } else if (upgrade === 'Heavenly key') {\r\n SimWin('Wholesome');\r\n }\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n\r\n const diffMouseCPS = MouseCps() - Game.computedMouseCps;\r\n if (diffMouseCPS) {\r\n return [SimCookiesPs - Game.cookiesPs, diffMouseCPS];\r\n }\r\n return [SimCookiesPs - Game.cookiesPs];\r\n }\r\n return [];\r\n}\r\n","/** Section: Functions related to caching income */\r\n\r\nimport BuildingGetPrice from '../../Sim/SimulationEvents/BuyBuilding';\r\nimport BuyBuildingsBonusIncome from '../../Sim/SimulationEvents/BuyBuildingBonusIncome';\r\nimport BuyUpgradesBonusIncome from '../../Sim/SimulationEvents/BuyUpgrades';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheAverageGainBank,\r\n CacheAverageGainWrink,\r\n CacheAverageGainWrinkFattest,\r\n CacheDoRemakeBuildPrices, // eslint-disable-line no-unused-vars\r\n CacheObjects1,\r\n CacheObjects10,\r\n CacheObjects100,\r\n CacheObjectsNextAchievement,\r\n CacheUpgrades,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions starts the calculation/simulation of the bonus income of buildings\r\n * It is called by CM.Cache.CacheIncome()\r\n * @param\t{amount}\tamount\tAmount to be bought\r\n * @parem\t{string}\ttarget\tThe target Cache object (\"Objects1\", \"Objects10\" or \"Objects100\")\r\n */\r\nfunction CacheBuildingIncome(amount) {\r\n const result = {};\r\n Object.keys(Game.Objects).forEach((i) => {\r\n result[i] = {};\r\n result[i].bonus = BuyBuildingsBonusIncome(i, amount);\r\n if (amount !== 1) {\r\n CacheDoRemakeBuildPrices = 1;\r\n }\r\n });\r\n return result;\r\n}\r\n\r\n/**\r\n * This functions starts the calculation/simulation of the bonus income of upgrades\r\n * It is called by CM.Cache.CacheIncome()\r\n */\r\nfunction CacheUpgradeIncome() {\r\n CacheUpgrades = {};\r\n for (let i = 0; i < Game.UpgradesInStore.length; i++) {\r\n const upgradeName = Game.UpgradesInStore[i].name;\r\n const bonusIncome = BuyUpgradesBonusIncome(upgradeName);\r\n if (upgradeName === 'Elder Pledge') {\r\n CacheUpgrades[upgradeName] = {\r\n bonus: Game.cookiesPs - CacheAverageGainBank,\r\n };\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 1)\r\n CacheUpgrades[upgradeName].bonus -= CacheAverageGainWrink;\r\n else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 2)\r\n CacheUpgrades[upgradeName].bonus -= CacheAverageGainWrinkFattest;\r\n if (!Number.isFinite(CacheUpgrades[upgradeName].bonus)) CacheUpgrades[upgradeName].bonus = 0;\r\n } else {\r\n CacheUpgrades[upgradeName] = {};\r\n if (bonusIncome[0]) CacheUpgrades[upgradeName].bonus = bonusIncome[0];\r\n if (bonusIncome[1]) CacheUpgrades[upgradeName].bonusMouse = bonusIncome[1];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * This functions caches the price of each building and stores it in the cache\r\n */\r\nexport function CacheBuildingsPrices() {\r\n Object.keys(Game.Objects).forEach((i) => {\r\n CacheObjects1[i].price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n 1,\r\n );\r\n CacheObjects10[i].price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n 10,\r\n );\r\n CacheObjects100[i].price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n 100,\r\n );\r\n CacheObjectsNextAchievement[i].price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n CacheObjectsNextAchievement[i].AmountNeeded,\r\n );\r\n });\r\n\r\n FillCMDCache({ CacheObjectsNextAchievement });\r\n}\r\n\r\n/**\r\n * This functions caches the income gain of each building and upgrade and stores it in the cache\r\n * It is called by CM.Main.Loop() and CM.Cache.InitCache()\r\n */\r\nexport function CacheIncome() {\r\n // Simulate Building Buys for 1, 10 and 100 amount\r\n CacheObjects1 = CacheBuildingIncome(1);\r\n CacheObjects10 = CacheBuildingIncome(10);\r\n CacheObjects100 = CacheBuildingIncome(100);\r\n\r\n // Simulate Upgrade Buys\r\n CacheUpgradeIncome();\r\n}\r\n","import GetCPSBuffMult from '../CPS/GetCPSBuffMult';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheChainFrenzyMaxReward,\r\n CacheChainFrenzyRequired,\r\n CacheChainFrenzyRequiredNext,\r\n CacheChainFrenzyWrathMaxReward,\r\n CacheChainFrenzyWrathRequired,\r\n CacheChainFrenzyWrathRequiredNext,\r\n CacheChainMaxReward,\r\n CacheChainRequired,\r\n CacheChainRequiredNext,\r\n CacheChainWrathMaxReward,\r\n CacheChainWrathRequired,\r\n CacheChainWrathRequiredNext,\r\n CacheDragonsFortuneMultAdjustment,\r\n CacheGoldenCookiesMult,\r\n CacheNoGoldSwitchCookiesPS,\r\n CacheWrathCookiesMult,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions calculates the max possible payout given a set of variables\r\n * It is called by CM.Disp.CreateStatsChainSection() and CM.Cache.CacheChain()\r\n * @param\t{number}\t\t\t\t\tdigit\t\tNumber of Golden Cookies in chain\r\n * @param\t{number}\t\t\t\t\tmaxPayout\tMaximum payout\r\n * @param\t{number}\t\t\t\t\tmult\t\tMultiplier\r\n * @returns\t[{number, number, number}]\t\t\t\tTotal cookies earned, cookie needed for this and next level\r\n */\r\nexport function MaxChainCookieReward(digit, maxPayout, mult) {\r\n let totalFromChain = 0;\r\n let moni = 0;\r\n let nextMoni = 0;\r\n let nextRequired = 0;\r\n let chain = 1 + Math.max(0, Math.ceil(Math.log(Game.cookies) / Math.LN10) - 10);\r\n while (nextMoni < maxPayout * mult) {\r\n moni = Math.max(\r\n digit,\r\n Math.min(Math.floor((1 / 9) * 10 ** chain * digit * mult), maxPayout * mult),\r\n );\r\n nextMoni = Math.max(\r\n digit,\r\n Math.min(Math.floor((1 / 9) * 10 ** (chain + 1) * digit * mult), maxPayout * mult),\r\n );\r\n nextRequired = Math.floor((1 / 9) * 10 ** (chain + 1) * digit * mult);\r\n totalFromChain += moni;\r\n chain += 1;\r\n }\r\n return [totalFromChain, moni, nextRequired];\r\n}\r\n\r\n/**\r\n * This functions caches data related to Chain Cookies reward from Golden Cookioes\r\n * It is called by CM.Main.Loop() upon changes to cps and CM.Cache.InitCache()\r\n * @global\t[{number, number}]\tCM.Cache.ChainMaxReward\t\t\tTotal cookies earned, and cookies needed for next level for normal chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainRequired\t\t\tCookies needed for maximum reward for normal chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainRequiredNext\t\tTotal cookies needed for next level for normal chain\r\n * @global\t[{number, number}]\tCM.Cache.ChainMaxWrathReward\t\t\tTotal cookies earned, and cookies needed for next level for wrath chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainWrathRequired\t\t\tCookies needed for maximum reward for wrath chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainWrathRequiredNext\t\tTotal cookies needed for next level for wrath chain\r\n * @global\t[{number, number}]\tCM.Cache.ChainFrenzyMaxReward\t\t\tTotal cookies earned, and cookies needed for next level for normal frenzy chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainFrenzyRequired\t\t\tCookies needed for maximum reward for normal frenzy chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainFrenzyRequiredNext\t\tTotal cookies needed for next level for normal frenzy chain\r\n * @global\t[{number, number}]\tCM.Cache.ChainFrenzyWrathMaxReward\t\t\tTotal cookies earned, and cookies needed for next level for wrath frenzy chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainFrenzyWrathRequired\t\t\tCookies needed for maximum reward for wrath frenzy chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainFrenzyWrathRequiredNext\t\tTotal cookies needed for next level for wrath frenzy chain\r\n */\r\nexport function CacheChain() {\r\n let maxPayout = CacheNoGoldSwitchCookiesPS * 60 * 60 * 6 * CacheDragonsFortuneMultAdjustment;\r\n // Removes effect of Frenzy etc.\r\n const cpsBuffMult = GetCPSBuffMult();\r\n if (cpsBuffMult > 0) maxPayout /= cpsBuffMult;\r\n else maxPayout = 0;\r\n\r\n CacheChainMaxReward = MaxChainCookieReward(7, maxPayout, CacheGoldenCookiesMult);\r\n CacheChainRequired = (CacheChainMaxReward[1] * 2) / CacheGoldenCookiesMult;\r\n CacheChainRequiredNext = CacheChainMaxReward[2] / 60 / 60 / 6 / CacheDragonsFortuneMultAdjustment;\r\n\r\n CacheChainWrathMaxReward = MaxChainCookieReward(6, maxPayout, CacheWrathCookiesMult);\r\n CacheChainWrathRequired = (CacheChainWrathMaxReward[1] * 2) / CacheWrathCookiesMult;\r\n CacheChainWrathRequiredNext =\r\n CacheChainWrathMaxReward[2] / 60 / 60 / 6 / CacheDragonsFortuneMultAdjustment;\r\n\r\n CacheChainFrenzyMaxReward = MaxChainCookieReward(7, maxPayout * 7, CacheGoldenCookiesMult);\r\n CacheChainFrenzyRequired = (CacheChainFrenzyMaxReward[1] * 2) / CacheGoldenCookiesMult;\r\n CacheChainFrenzyRequiredNext =\r\n CacheChainFrenzyMaxReward[2] / 60 / 60 / 6 / CacheDragonsFortuneMultAdjustment;\r\n\r\n CacheChainFrenzyWrathMaxReward = MaxChainCookieReward(6, maxPayout * 7, CacheWrathCookiesMult);\r\n CacheChainFrenzyWrathRequired = (CacheChainFrenzyWrathMaxReward[1] * 2) / CacheWrathCookiesMult;\r\n CacheChainFrenzyWrathRequiredNext =\r\n CacheChainFrenzyWrathMaxReward[2] / 60 / 60 / 6 / CacheDragonsFortuneMultAdjustment;\r\n\r\n FillCMDCache({\r\n CacheChainMaxReward,\r\n CacheChainRequired,\r\n CacheChainRequiredNext,\r\n CacheChainWrathMaxReward,\r\n CacheChainWrathRequired,\r\n CacheChainWrathRequiredNext,\r\n CacheChainFrenzyMaxReward,\r\n CacheChainFrenzyRequired,\r\n CacheChainFrenzyRequiredNext,\r\n CacheChainFrenzyWrathMaxReward,\r\n CacheChainFrenzyWrathRequired,\r\n CacheChainFrenzyWrathRequiredNext,\r\n });\r\n}\r\n","import FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheHCPerSecond,\r\n CacheLastHeavenlyCheck,\r\n CacheLastHeavenlyChips,\r\n HeavenlyChipsDiff,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the heavenly chips per second in the last five seconds\r\n * It is called by CM.Cache.LoopCache()\r\n * @global\t{number}\tCM.Cache.HCPerSecond\tThe Heavenly Chips per second in the last five seconds\r\n */\r\nexport default function CacheHeavenlyChipsPS() {\r\n const currDate = Math.floor(Date.now() / 1000);\r\n // Only calculate every new second\r\n if ((Game.T / Game.fps) % 1 === 0) {\r\n const chipsOwned = Game.HowMuchPrestige(Game.cookiesReset);\r\n const ascendNowToOwn = Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned));\r\n const ascendNowToGet = ascendNowToOwn - Math.floor(chipsOwned);\r\n\r\n // Add recent gains to AvgQueue's\r\n const timeDiff = currDate - CacheLastHeavenlyCheck;\r\n const heavenlyChipsDiffAvg = Math.max(0, ascendNowToGet - CacheLastHeavenlyChips) / timeDiff;\r\n for (let i = 0; i < timeDiff; i++) {\r\n HeavenlyChipsDiff.addLatest(heavenlyChipsDiffAvg);\r\n }\r\n\r\n // Store current data for next loop\r\n CacheLastHeavenlyCheck = currDate;\r\n CacheLastHeavenlyChips = ascendNowToGet;\r\n\r\n // Get average gain over period of 5 seconds\r\n CacheHCPerSecond = HeavenlyChipsDiff.calcAverage(5);\r\n }\r\n\r\n FillCMDCache({ CacheLastHeavenlyCheck, CacheLastHeavenlyChips, CacheHCPerSecond });\r\n}\r\n","import { crateMissing } from '../../Disp/MenuSections/Statistics/CreateMissingUpgrades';\r\nimport {\r\n CacheMissingUpgrades, // eslint-disable-line no-unused-vars\r\n CacheMissingUpgradesCookies, // eslint-disable-line no-unused-vars\r\n CacheMissingUpgradesPrestige, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches variables related to missing upgrades\r\n * It is called by CM.Main.Loop() and CM.Cache.InitCache()\r\n * @global\t{string}\tCM.Cache.MissingUpgrades\t\t\tString containig the HTML to create the \"crates\" for missing normal upgrades\r\n * @global\t{string}\tCM.Cache.MissingUpgradesCookies\t\tString containig the HTML to create the \"crates\" for missing cookie upgrades\r\n * @global\t{string}\tCM.Cache.MissingUpgradesPrestige\tString containig the HTML to create the \"crates\" for missing prestige upgrades\r\n */\r\nexport default function CacheAllMissingUpgrades() {\r\n CacheMissingUpgrades = '';\r\n CacheMissingUpgradesCookies = '';\r\n CacheMissingUpgradesPrestige = '';\r\n const list = [];\r\n // sort the upgrades\r\n Object.keys(Game.Upgrades).forEach((i) => {\r\n list.push(Game.Upgrades[i]);\r\n });\r\n const sortMap = function (a, b) {\r\n if (a.order > b.order) return 1;\r\n if (a.order < b.order) return -1;\r\n return 0;\r\n };\r\n list.sort(sortMap);\r\n\r\n Object.keys(list).forEach((i) => {\r\n const me = list[i];\r\n\r\n if (me.bought === 0) {\r\n let str = '';\r\n\r\n str += crateMissing(me);\r\n /* eslint-disable no-unused-vars */\r\n if (me.pool === 'prestige') CacheMissingUpgradesPrestige += str;\r\n else if (me.pool === 'cookie') CacheMissingUpgradesCookies += str;\r\n else if (me.pool !== 'toggle' && me.pool !== 'unused' && me.pool !== 'debug')\r\n CacheMissingUpgrades += str;\r\n /* eslint-enable no-unused-vars */\r\n }\r\n });\r\n}\r\n","/** Functions related to displaying the missing upgrades in the Statistics page */\r\n\r\nimport {\r\n CacheMissingUpgrades,\r\n CacheMissingUpgradesCookies,\r\n CacheMissingUpgradesPrestige,\r\n} from '../../../Cache/VariablesAndData';\r\n\r\n/**\r\n * This function creates the missing upgrades sections for prestige, normal and cookie upgrades\r\n */\r\nexport function AddMissingUpgrades() {\r\n l('menu').childNodes.forEach((menuSection) => {\r\n if (menuSection.children[0]) {\r\n if (menuSection.children[0].innerHTML === 'Prestige' && CacheMissingUpgradesPrestige) {\r\n const prestigeUpgradesMissing =\r\n CacheMissingUpgradesPrestige.match(new RegExp('div', 'g') || []).length / 2;\r\n const title = document.createElement('div');\r\n title.id = 'CMMissingUpgradesPrestigeTitle';\r\n title.className = 'listing';\r\n const titlefrag = document.createElement('div');\r\n titlefrag.innerHTML = `<b>Missing Prestige upgrades:</b> ${prestigeUpgradesMissing}/${\r\n Game.PrestigeUpgrades.length\r\n } (${Math.floor((prestigeUpgradesMissing / Game.PrestigeUpgrades.length) * 100)}%)`;\r\n title.appendChild(titlefrag);\r\n menuSection.appendChild(title);\r\n const upgrades = document.createElement('div');\r\n upgrades.className = 'listing crateBox';\r\n upgrades.innerHTML = CacheMissingUpgradesPrestige;\r\n menuSection.appendChild(upgrades);\r\n } else if (menuSection.children[0].innerHTML === 'Upgrades') {\r\n if (CacheMissingUpgrades) {\r\n const normalUpgradesMissing =\r\n CacheMissingUpgrades.match(new RegExp('div', 'g') || []).length / 2;\r\n const title = document.createElement('div');\r\n title.id = 'CMMissingUpgradesTitle';\r\n title.className = 'listing';\r\n const titlefrag = document.createElement('div');\r\n titlefrag.innerHTML = `<b>Missing normal upgrades:</b> ${normalUpgradesMissing}/${\r\n Game.UpgradesByPool[''].length + Game.UpgradesByPool.tech.length\r\n } (${Math.floor(\r\n (normalUpgradesMissing /\r\n (Game.UpgradesByPool[''].length + Game.UpgradesByPool.tech.length)) *\r\n 100,\r\n )}%)`;\r\n title.appendChild(titlefrag);\r\n menuSection.insertBefore(title, menuSection.childNodes[3]);\r\n const upgrades = document.createElement('div');\r\n upgrades.className = 'listing crateBox';\r\n upgrades.innerHTML = CacheMissingUpgrades;\r\n menuSection.insertBefore(\r\n upgrades,\r\n document.getElementById('CMMissingUpgradesTitle').nextSibling,\r\n );\r\n }\r\n if (CacheMissingUpgradesCookies) {\r\n const cookieUpgradesMissing =\r\n CacheMissingUpgradesCookies.match(new RegExp('div', 'g') || []).length / 2;\r\n const title = document.createElement('div');\r\n title.id = 'CMMissingUpgradesCookiesTitle';\r\n title.className = 'listing';\r\n const titlefrag = document.createElement('div');\r\n titlefrag.innerHTML = `<b>Missing Cookie upgrades:</b> ${cookieUpgradesMissing}/${\r\n Game.UpgradesByPool.cookie.length\r\n } (${Math.floor((cookieUpgradesMissing / Game.UpgradesByPool.cookie.length) * 100)}%)`;\r\n title.appendChild(titlefrag);\r\n menuSection.appendChild(title);\r\n const upgrades = document.createElement('div');\r\n upgrades.className = 'listing crateBox';\r\n upgrades.innerHTML = CacheMissingUpgradesCookies;\r\n menuSection.appendChild(upgrades);\r\n }\r\n }\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * This function returns the \"crates\" (icons) for missing upgrades in the stats sections\r\n * It returns a html string that gets appended to the respective CM.Cache.MissingUpgrades-variable by CM.Cache.CacheMissingUpgrades()\r\n * @param\t{object}\tme\tThe upgrade object\r\n * @returns\t{string}\t?\tThe HTML string that creates the icon.\r\n */\r\nexport function crateMissing(me) {\r\n let classes = 'crate upgrade missing';\r\n if (me.pool === 'prestige') classes += ' heavenly';\r\n\r\n let noFrame = 0;\r\n if (!Game.prefs.crates) noFrame = 1;\r\n if (noFrame) classes += ' noFrame';\r\n\r\n let { icon } = me;\r\n if (me.iconFunction) icon = me.iconFunction();\r\n const tooltip = `function() {return Game.crateTooltip(Game.UpgradesById[${me.id}], 'stats');}`;\r\n return `<div class=\"${classes}\"\r\n\t${Game.getDynamicTooltip(tooltip, 'top', true)}\r\n\tstyle = \"${`${icon[2] ? `background-image: url(${icon[2]});` : ''}background-position:${\r\n -icon[0] * 48\r\n }px ${-icon[1] * 48}px`};\">\r\n\t</div>`;\r\n}\r\n","import FillCMDCache from '../FillCMDCache';\r\nimport { CacheSeaSpec } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the reward of popping a reindeer\r\n * It is called by CM.Main.Loop() and CM.Cache.InitCache()\r\n * @global\t{number}\tCM.Cache.SeaSpec\tThe reward for popping a reindeer\r\n */\r\nexport default function CacheSeasonSpec() {\r\n if (Game.season === 'christmas') {\r\n let val = Game.cookiesPs * 60;\r\n if (Game.hasBuff('Elder frenzy')) val *= 0.5;\r\n if (Game.hasBuff('Frenzy')) val *= 0.75;\r\n CacheSeaSpec = Math.max(25, val);\r\n if (Game.Has('Ho ho ho-flavored frosting')) CacheSeaSpec *= 2;\r\n }\r\n\r\n FillCMDCache({ CacheSeaSpec });\r\n}\r\n","/** Functions related to Caching stats */\r\n\r\nimport SimHas from '../../Sim/ReplacedGameFunctions/SimHas';\r\nimport GetCPSBuffMult from '../CPS/GetCPSBuffMult';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheConjure,\r\n CacheConjureReward,\r\n CacheDragonsFortuneMultAdjustment,\r\n CacheEdifice,\r\n CacheEdificeBuilding,\r\n CacheGoldenCookiesMult,\r\n CacheLucky,\r\n CacheLuckyFrenzy,\r\n CacheLuckyReward,\r\n CacheLuckyRewardFrenzy,\r\n CacheLuckyWrathReward,\r\n CacheLuckyWrathRewardFrenzy,\r\n CacheNoGoldSwitchCookiesPS,\r\n CacheWrathCookiesMult,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches variables related to the stats page\r\n */\r\nexport function CacheStatsCookies() {\r\n CacheLucky = (CacheNoGoldSwitchCookiesPS * 900) / 0.15;\r\n CacheLucky *= CacheDragonsFortuneMultAdjustment;\r\n const cpsBuffMult = GetCPSBuffMult();\r\n if (cpsBuffMult > 0) CacheLucky /= cpsBuffMult;\r\n else CacheLucky = 0;\r\n CacheLuckyReward = CacheGoldenCookiesMult * (CacheLucky * 0.15) + 13;\r\n CacheLuckyWrathReward = CacheWrathCookiesMult * (CacheLucky * 0.15) + 13;\r\n CacheLuckyFrenzy = CacheLucky * 7;\r\n CacheLuckyRewardFrenzy = CacheGoldenCookiesMult * (CacheLuckyFrenzy * 0.15) + 13;\r\n CacheLuckyWrathRewardFrenzy = CacheWrathCookiesMult * (CacheLuckyFrenzy * 0.15) + 13;\r\n CacheConjure = CacheLucky * 2;\r\n CacheConjureReward = CacheConjure * 0.15;\r\n\r\n CacheEdifice = 0;\r\n let max = 0;\r\n let n = 0;\r\n Object.keys(Game.Objects).forEach((i) => {\r\n if (Game.Objects[i].amount > max) max = Game.Objects[i].amount;\r\n if (Game.Objects[i].amount > 0) n += 1;\r\n });\r\n Object.keys(Game.Objects).forEach((i) => {\r\n if (\r\n (Game.Objects[i].amount < max || n === 1) &&\r\n Game.Objects[i].amount < 400 &&\r\n Game.Objects[i].price * 2 > CacheEdifice\r\n ) {\r\n CacheEdifice = Game.Objects[i].price * 2;\r\n CacheEdificeBuilding = i;\r\n }\r\n });\r\n\r\n FillCMDCache({\r\n CacheLucky,\r\n CacheLuckyReward,\r\n CacheLuckyWrathReward,\r\n CacheLuckyFrenzy,\r\n CacheLuckyRewardFrenzy,\r\n CacheLuckyWrathRewardFrenzy,\r\n CacheConjure,\r\n CacheConjureReward,\r\n CacheEdifice,\r\n CacheEdificeBuilding,\r\n });\r\n}\r\n\r\n/**\r\n * This functions calculates the multipliers of Golden and Wrath cookie rewards\r\n */\r\nexport function CacheGoldenAndWrathCookiesMults() {\r\n let goldenMult = 1;\r\n let wrathMult = 1;\r\n let mult = 1;\r\n\r\n // Factor auras and upgrade in mults\r\n if (SimHas('Green yeast digestives')) mult *= 1.01;\r\n if (SimHas('Dragon fang')) mult *= 1.03;\r\n\r\n goldenMult *= 1 + Game.auraMult('Ancestral Metamorphosis') * 0.1;\r\n goldenMult *= Game.eff('goldenCookieGain');\r\n wrathMult *= 1 + Game.auraMult('Unholy Dominion') * 0.1;\r\n wrathMult *= Game.eff('wrathCookieGain');\r\n\r\n // Calculate final golden and wrath multipliers\r\n CacheGoldenCookiesMult = mult * goldenMult;\r\n CacheWrathCookiesMult = mult * wrathMult;\r\n\r\n // Calculate Dragon's Fortune multiplier adjustment:\r\n // If Dragon's Fortune (or Reality Bending) aura is active and there are currently no golden cookies,\r\n // compute a multiplier adjustment to apply on the current CPS to simulate 1 golden cookie on screen.\r\n // Otherwise, the aura effect will be factored in the base CPS making the multiplier not requiring adjustment.\r\n CacheDragonsFortuneMultAdjustment = 1;\r\n if (Game.shimmerTypes.golden.n === 0) {\r\n CacheDragonsFortuneMultAdjustment *= 1 + Game.auraMult(\"Dragon's Fortune\") * 1.23;\r\n }\r\n\r\n FillCMDCache({\r\n CacheGoldenCookiesMult,\r\n CacheWrathCookiesMult,\r\n CacheDragonsFortuneMultAdjustment,\r\n });\r\n}\r\n","import BuildingGetPrice from '../../Sim/SimulationEvents/BuyBuilding';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheObjectsNextAchievement } from '../VariablesAndData';\r\nimport IndividualAmountTillNextAchievement from './IndividualAmountTillNextAchievement';\r\n\r\n/**\r\n * This functions caches the amount of buildings needed till next achievement\r\n * @param\t{boolean}\tforceRecalc\tWhether a recalcution should be forced (after CPS change)\r\n */\r\nexport default function AllAmountTillNextAchievement(forceRecalc) {\r\n const result = {};\r\n\r\n Object.keys(Game.Objects).forEach((i) => {\r\n if (\r\n Object.keys(CacheObjectsNextAchievement).length !== 0 &&\r\n CacheObjectsNextAchievement[i].TotalNeeded > Game.Objects[i].amount &&\r\n !forceRecalc\r\n ) {\r\n result[i] = {\r\n AmountNeeded: CacheObjectsNextAchievement[i].TotalNeeded - Game.Objects[i].amount,\r\n TotalNeeded: CacheObjectsNextAchievement[i].TotalNeeded,\r\n price: BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n CacheObjectsNextAchievement[i].TotalNeeded - Game.Objects[i].amount,\r\n ),\r\n };\r\n } else {\r\n const tillNext = IndividualAmountTillNextAchievement(i);\r\n result[i] = {\r\n AmountNeeded: tillNext,\r\n TotalNeeded: Game.Objects[i].amount + tillNext,\r\n price: BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n tillNext,\r\n ),\r\n };\r\n }\r\n });\r\n CacheObjectsNextAchievement = result;\r\n\r\n FillCMDCache({ CacheObjectsNextAchievement });\r\n}\r\n","import BuyBuildingsBonusIncome from '../../Sim/SimulationEvents/BuyBuildingBonusIncome';\r\nimport { SimAchievementsOwned } from '../../Sim/VariablesAndData';\r\n\r\nexport default function IndividualAmountTillNextAchievement(building) {\r\n const AchievementsAtStart = Game.AchievementsOwned;\r\n let index = 100;\r\n let lastIndexWithChange = 100;\r\n while (index > -1) {\r\n BuyBuildingsBonusIncome(building, index);\r\n if (SimAchievementsOwned > AchievementsAtStart) {\r\n lastIndexWithChange = index;\r\n index -= 10;\r\n } else if (index === 100) {\r\n return 101;\r\n } else {\r\n index += 1;\r\n while (index <= lastIndexWithChange) {\r\n BuyBuildingsBonusIncome(building, index);\r\n if (SimAchievementsOwned > AchievementsAtStart) {\r\n return index;\r\n }\r\n index += 1;\r\n }\r\n }\r\n }\r\n return 101;\r\n}\r\n","/** Caches data related to Wrinklers */\r\n\r\nimport { SimObjects } from '../../Sim/VariablesAndData';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheWrinklersFattest,\r\n CacheWrinklersNormal,\r\n CacheWrinklersTotal,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches data related to Wrinklers\r\n * It is called by CM.Cache.LoopCache() and CM.Cache.InitCache()\r\n * @global\t{number}\t\t\t\tCM.Cache.WrinklersTotal\t\tThe cookies of all wrinklers\r\n * @global\t{number}\t\t\t\tCM.Cache.WrinklersNormal\tThe cookies of all normal wrinklers\r\n * @global\t{[{number}, {number}]}\tCM.Cache.WrinklersFattest\tA list containing the cookies and the id of the fattest non-shiny wrinkler\r\n */\r\nexport default function CacheWrinklers() {\r\n CacheWrinklersTotal = 0;\r\n CacheWrinklersNormal = 0;\r\n CacheWrinklersFattest = [0, null];\r\n for (let i = 0; i < Game.wrinklers.length; i++) {\r\n let { sucked } = Game.wrinklers[i];\r\n let toSuck = 1.1;\r\n if (Game.Has('Sacrilegious corruption')) toSuck *= 1.05;\r\n if (Game.wrinklers[i].type === 1) toSuck *= 3; // Shiny wrinklers\r\n sucked *= toSuck;\r\n if (Game.Has('Wrinklerspawn')) sucked *= 1.05;\r\n if (SimObjects.Temple.minigameLoaded) {\r\n const godLvl = Game.hasGod('scorn');\r\n if (godLvl === 1) sucked *= 1.15;\r\n else if (godLvl === 2) sucked *= 1.1;\r\n else if (godLvl === 3) sucked *= 1.05;\r\n }\r\n CacheWrinklersTotal += sucked;\r\n if (Game.wrinklers[i].type === 0) {\r\n CacheWrinklersNormal += sucked;\r\n if (sucked > CacheWrinklersFattest[0]) CacheWrinklersFattest = [sucked, i];\r\n }\r\n }\r\n\r\n FillCMDCache({ CacheWrinklersTotal, CacheWrinklersNormal, CacheWrinklersFattest });\r\n}\r\n","import { ClickTimes } from '../Disp/VariablesAndData';\r\nimport { CMAvgQueue, InitCookiesDiff } from './CPS/AverageQueue';\r\nimport CacheAvgCPS from './CPS/CPS';\r\nimport CacheDragonAuras from './Dragon/CacheDragonAuras';\r\nimport CachePP from './PP/PP';\r\nimport { CacheBuildingsPrices, CacheIncome } from './PriceAndIncome/PriceAndIncome';\r\nimport { CacheChain } from './Stats/ChainCookies';\r\nimport CacheHeavenlyChipsPS from './Stats/HeavenlyChips';\r\nimport CacheAllMissingUpgrades from './Stats/MissingUpgrades';\r\nimport CacheSeasonSpec from './Stats/Reindeer';\r\nimport { CacheGoldenAndWrathCookiesMults, CacheStatsCookies } from './Stats/Stats';\r\nimport AllAmountTillNextAchievement from './TillNextAchievement/AllAmountTillNextAchievement';\r\nimport { CacheAverageCookiesFromClicks, HeavenlyChipsDiff } from './VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport CacheWrinklers from './Wrinklers/Wrinklers';\r\n\r\n/**\r\n * This functions runs all cache-functions to generate all \"full\" cache\r\n */\r\nexport default function InitCache() {\r\n CacheDragonAuras();\r\n CacheWrinklers();\r\n CacheStatsCookies();\r\n CacheGoldenAndWrathCookiesMults();\r\n CacheChain();\r\n CacheAllMissingUpgrades();\r\n CacheSeasonSpec();\r\n InitCookiesDiff();\r\n /** Used by CM.Cache.CacheHeavenlyChipsPS() */\r\n HeavenlyChipsDiff = new CMAvgQueue(5);\r\n CacheAverageCookiesFromClicks = new CMAvgQueue(ClickTimes[ClickTimes.length - 1] * 20);\r\n CacheHeavenlyChipsPS();\r\n AllAmountTillNextAchievement();\r\n CacheAvgCPS();\r\n CacheIncome();\r\n CacheBuildingsPrices();\r\n CachePP();\r\n}\r\n","/**\r\n * This function pops all normal wrinklers\r\n * It is called by a click of the 'pop all' button created by CM.Disp.AddMenuStats()\r\n */\r\nexport default function PopAllNormalWrinklers() {\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n if (Game.wrinklers[i].sucked > 0 && Game.wrinklers[i].type === 0) {\r\n Game.wrinklers[i].hp = 0;\r\n }\r\n });\r\n}\r\n","import UpdateTooltips from './UpdateTooltips';\r\nimport { SimpleTooltipElements, TooltipName, TooltipType } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport BuildingGetPrice from '../../Sim/SimulationEvents/BuyBuilding';\r\nimport GetTimeColour from '../BeautifyAndFormatting/GetTimeColour';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\n\r\n/** All general functions related to creating and updating tooltips */\r\n\r\n/**\r\n * This function creates some very basic tooltips, (e.g., the tooltips in the stats page)\r\n * The tooltips are created with CM.Disp[placeholder].appendChild(desc)\r\n * @param\t{string}\tplaceholder\tThe name used to later refer and spawn the tooltip\r\n * @param\t{string}\ttext\t\tThe text of the tooltip\r\n * @param\t{string}\tminWidth\tThe minimum width of the tooltip\r\n */\r\nexport function CreateSimpleTooltip(placeholder, text, minWidth) {\r\n const Tooltip = document.createElement('div');\r\n Tooltip.id = placeholder;\r\n const desc = document.createElement('div');\r\n desc.style.minWidth = minWidth;\r\n desc.style.marginBottom = '4px';\r\n const div = document.createElement('div');\r\n div.style.textAlign = 'left';\r\n div.textContent = text;\r\n desc.appendChild(div);\r\n Tooltip.appendChild(desc);\r\n SimpleTooltipElements[placeholder] = Tooltip;\r\n}\r\n\r\n/**\r\n * This function enhance the standard tooltips by creating and changing l('tooltip')\r\n * The function is called by .onmouseover events that have replaced original code to use CM.Disp.Tooltip()\r\n * @param\t{string}\ttype\t\t\t\t\tType of tooltip (b, u, s or g)\r\n * @param\t{string}\tname\t\t\t\t\tName of the object/item the tooltip relates to\r\n * @returns {string}\tl('tooltip').innerHTML\tThe HTML of the l('tooltip')-object\r\n */\r\nexport function CreateTooltip(type, name) {\r\n if (type === 'b') {\r\n // Buildings\r\n l('tooltip').innerHTML = Game.Objects[name].tooltip();\r\n // Adds amortization info to the list of info per building\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipAmor === 1) {\r\n const buildPrice = BuildingGetPrice(\r\n name,\r\n Game.Objects[name].basePrice,\r\n 0,\r\n Game.Objects[name].free,\r\n Game.Objects[name].amount,\r\n );\r\n const amortizeAmount = buildPrice - Game.Objects[name].totalCookies;\r\n if (amortizeAmount > 0) {\r\n l('tooltip').innerHTML = l('tooltip')\r\n .innerHTML.split('so far</div>')\r\n .join(\r\n `so far<br/>• <b>${Beautify(amortizeAmount)}</b> ${\r\n Math.floor(amortizeAmount) === 1 ? 'cookie' : 'cookies'\r\n } left to amortize (${\r\n GetTimeColour(\r\n (buildPrice - Game.Objects[name].totalCookies) /\r\n (Game.Objects[name].storedTotalCps * Game.globalCpsMult),\r\n ).text\r\n })</div>`,\r\n );\r\n }\r\n }\r\n if (Game.buyMode === -1) {\r\n /*\r\n * Fix sell price displayed in the object tooltip.\r\n *\r\n * The buildings sell price displayed by the game itself (without any mod) is incorrect.\r\n * The following line of code fixes this issue, and can be safely removed when the game gets fixed.\r\n *\r\n * This issue is extensively detailed here: https://github.com/Aktanusa/CookieMonster/issues/359#issuecomment-735658262\r\n */\r\n l('tooltip').innerHTML = l('tooltip')\r\n .innerHTML.split(Beautify(Game.Objects[name].bulkPrice))\r\n .join(\r\n Beautify(\r\n (Game.Objects[name],\r\n Game.Objects[name].basePrice,\r\n Game.Objects[name].amount,\r\n Game.Objects[name].free,\r\n Game.buyBulk,\r\n 1),\r\n ),\r\n );\r\n }\r\n } else if (type === 'u') {\r\n // Upgrades\r\n if (!Game.UpgradesInStore[name]) return '';\r\n l('tooltip').innerHTML = Game.crateTooltip(Game.UpgradesInStore[name], 'store');\r\n } else if (type === 's') l('tooltip').innerHTML = Game.lumpTooltip();\r\n // Sugar Lumps\r\n else if (type === 'g')\r\n l('tooltip').innerHTML = Game.Objects['Wizard tower'].minigame.spellTooltip(name)();\r\n // Grimoire\r\n else if (type === 'p')\r\n l('tooltip').innerHTML = Game.ObjectsById[2].minigame.tileTooltip(name[0], name[1])();\r\n // Harvest all button in garden\r\n else if (type === 'ha') l('tooltip').innerHTML = Game.ObjectsById[2].minigame.toolTooltip(1)();\r\n else if (type === 'wb') l('tooltip').innerHTML = '';\r\n else if (type === 'pag') l('tooltip').innerHTML = Game.Objects.Temple.minigame.godTooltip(name)();\r\n else if (type === 'pas')\r\n l('tooltip').innerHTML = Game.Objects.Temple.minigame.slotTooltip(name[0])();\r\n\r\n // Adds area for extra tooltip-sections\r\n if (\r\n (type === 'b' && Game.buyMode === 1) ||\r\n type === 'u' ||\r\n type === 's' ||\r\n type === 'g' ||\r\n (type === 'p' && !Game.keys[16]) ||\r\n type === 'ha' ||\r\n type === 'wb' ||\r\n type === 'pag' ||\r\n (type === 'pas' && name[1] !== -1)\r\n ) {\r\n const area = document.createElement('div');\r\n area.id = 'CMTooltipArea';\r\n l('tooltip').appendChild(area);\r\n }\r\n\r\n // Sets global variables used by CM.Disp.UpdateTooltip()\r\n TooltipType = type;\r\n TooltipName = name;\r\n\r\n UpdateTooltips();\r\n\r\n return l('tooltip').innerHTML;\r\n}\r\n","import { CacheSpawnedGoldenShimmer } from '../../Cache/VariablesAndData';\r\nimport { LastGoldenCookieState } from '../../Main/VariablesAndData';\r\n\r\n/**\r\n * This function creates the Favicon, it is called by CM.Main.DelayInit()\r\n */\r\nexport function CreateFavicon() {\r\n const Favicon = document.createElement('link');\r\n Favicon.id = 'CMFavicon';\r\n Favicon.rel = 'shortcut icon';\r\n Favicon.href = 'https://orteil.dashnet.org/cookieclicker/favicon.ico';\r\n document.getElementsByTagName('head')[0].appendChild(Favicon);\r\n}\r\n\r\n/**\r\n * This function updates the Favicon depending on whether a Golden Cookie has spawned\r\n * By relying on CM.Cache.spawnedGoldenShimmer it only changes for non-user spawned cookie\r\n */\r\nexport function UpdateFavicon() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Favicon === 1 &&\r\n LastGoldenCookieState > 0\r\n ) {\r\n if (CacheSpawnedGoldenShimmer.wrath)\r\n l('CMFavicon').href =\r\n 'https://CookieMonsterTeam.github.io/CookieMonster/favicon/wrathCookie.ico';\r\n else\r\n l('CMFavicon').href =\r\n 'https://CookieMonsterTeam.github.io/CookieMonster/favicon/goldenCookie.ico';\r\n } else l('CMFavicon').href = 'https://orteil.dashnet.org/cookieclicker/favicon.ico';\r\n}\r\n","/** Functions used to create static objects of Buildings, Upgrades and Achievements */\r\n\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport { SimAchievements, SimObjects, SimUpgrades } from '../VariablesAndData';\r\nimport InitAchievement from './InitAchievement';\r\nimport InitialBuildingData from './InitialBuildingData';\r\nimport InitUpgrade from './InitUpgrade';\r\n\r\n/**\r\n * This function creates static objects for Buildings, Upgrades and Achievements\r\n */\r\nexport default function InitData() {\r\n // Buildings\r\n SimObjects = [];\r\n Object.keys(Game.Objects).forEach((i) => {\r\n SimObjects[i] = InitialBuildingData(i);\r\n });\r\n\r\n // Upgrades\r\n SimUpgrades = [];\r\n Object.keys(Game.Upgrades).forEach((i) => {\r\n SimUpgrades[i] = InitUpgrade(i);\r\n });\r\n\r\n // Achievements\r\n SimAchievements = [];\r\n Object.keys(Game.Achievements).forEach((i) => {\r\n SimAchievements[i] = InitAchievement(i);\r\n });\r\n CopyData();\r\n}\r\n","import { CreateTooltip } from '../../Disp/Tooltips/Tooltip';\r\nimport { TooltipGrimoireBackup } from '../VariablesAndData';\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of the Grimoire minigame\r\n */\r\nexport default function ReplaceTooltipGrimoire() {\r\n if (Game.Objects['Wizard tower'].minigameLoaded) {\r\n Object.keys(Game.Objects['Wizard tower'].minigame.spellsById).forEach((i) => {\r\n if (l(`grimoireSpell${i}`).onmouseover !== null) {\r\n TooltipGrimoireBackup[i] = l(`grimoireSpell${i}`).onmouseover;\r\n l(`grimoireSpell${i}`).onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('g', `${i}`), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n });\r\n }\r\n}\r\n","import FormatTime from '../../Disp/BeautifyAndFormatting/FormatTime';\r\nimport CalculateGrimoireRefillTime from '../../Disp/HelperFunctions/CalculateGrimoireRefillTime';\r\nimport {\r\n BackupGrimoireDraw,\r\n BackupGrimoireLaunch, // eslint-disable-line no-unused-vars\r\n BackupGrimoireLaunchMod,\r\n HasReplaceNativeGrimoireDraw,\r\n HasReplaceNativeGrimoireLaunch,\r\n} from '../VariablesAndData';\r\nimport ReplaceTooltipGrimoire from './TooltipGrimoire';\r\n\r\n/**\r\n * This function fixes replaces the .draw function of the Grimoire\r\n */\r\nfunction ReplaceNativeGrimoireDraw() {\r\n if (!HasReplaceNativeGrimoireDraw && Game.Objects['Wizard tower'].minigameLoaded) {\r\n const { minigame } = Game.Objects['Wizard tower'];\r\n BackupGrimoireDraw = minigame.draw;\r\n Game.Objects['Wizard tower'].minigame.draw = function () {\r\n BackupGrimoireDraw();\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GrimoireBar === 1 &&\r\n minigame.magic < minigame.magicM &&\r\n Game.drawT % 5 === 0\r\n ) {\r\n minigame.magicBarTextL.innerHTML += ` (${FormatTime(\r\n CalculateGrimoireRefillTime(minigame.magic, minigame.magicM, minigame.magicM),\r\n )})`;\r\n minigame.magicBarL.style.width = '75%'; // TODO: Fix this after Orteil pushes fix to main game;\r\n }\r\n };\r\n HasReplaceNativeGrimoireDraw = true;\r\n }\r\n}\r\n\r\n/**\r\n * This function fixes replaces the .launch function of the Grimoire\r\n */\r\nfunction ReplaceNativeGrimoireLaunch() {\r\n if (!HasReplaceNativeGrimoireLaunch && Game.Objects['Wizard tower'].minigameLoaded) {\r\n const { minigame } = Game.Objects['Wizard tower'];\r\n BackupGrimoireLaunch = minigame.launch;\r\n BackupGrimoireLaunchMod = new Function( // eslint-disable-line no-new-func\r\n `return ${minigame.launch\r\n .toString()\r\n .split('=this')\r\n .join(\"= Game.Objects['Wizard tower'].minigame\")}`,\r\n );\r\n Game.Objects['Wizard tower'].minigame.launch = function () {\r\n BackupGrimoireLaunchMod();\r\n ReplaceTooltipGrimoire();\r\n HasReplaceNativeGrimoireDraw = false;\r\n ReplaceNativeGrimoireDraw();\r\n\r\n HasReplaceNativeGrimoireLaunch = true;\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * This function fixes replaces the Launch and Draw functions of the Grimoire\r\n */\r\nexport default function ReplaceNativeGrimoire() {\r\n ReplaceNativeGrimoireLaunch();\r\n ReplaceNativeGrimoireDraw();\r\n}\r\n","/** Functions related to the Dragon */\r\n\r\nimport Beautify from '../../Disp/BeautifyAndFormatting/Beautify';\r\nimport CopyData from '../../Sim/SimulationData/CopyData';\r\nimport { SimDoSims, SimObjects } from '../../Sim/VariablesAndData';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheCostDragonUpgrade, CacheLastDragonLevel } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This functions caches the current cost of upgrading the dragon level so it can be displayed in the tooltip\r\n */\r\nexport default function CacheDragonCost() {\r\n if (CacheLastDragonLevel !== Game.dragonLevel || SimDoSims) {\r\n if (\r\n Game.dragonLevel < 25 &&\r\n Game.dragonLevels[Game.dragonLevel].buy.toString().includes('sacrifice')\r\n ) {\r\n const objectMatch = Game.dragonLevels[Game.dragonLevel].buy\r\n .toString()\r\n .match(/Objects\\[(.*)\\]/);\r\n let target =\r\n objectMatch !== null ? objectMatch[1] : Game.ObjectsById[Game.dragonLevel - 5].name;\r\n const amount = Game.dragonLevels[Game.dragonLevel].buy\r\n .toString()\r\n .match(/sacrifice\\((.*?)\\)/)[1];\r\n if (target !== 'i') {\r\n target = target.replaceAll(\"'\", '');\r\n if (Game.Objects[target].amount < amount) {\r\n CacheCostDragonUpgrade = 'Not enough buildings to sell';\r\n } else {\r\n let cost = 0;\r\n CopyData();\r\n for (let i = 0; i < amount; i++) {\r\n let price =\r\n SimObjects[target].basePrice *\r\n Game.priceIncrease **\r\n Math.max(0, SimObjects[target].amount - 1 - SimObjects[target].free);\r\n price = Game.modifyBuildingPrice(SimObjects[target], price);\r\n price = Math.ceil(price);\r\n cost += price;\r\n SimObjects[target].amount -= 1;\r\n }\r\n CacheCostDragonUpgrade = `Cost to rebuy: ${Beautify(cost)}`;\r\n }\r\n } else {\r\n let cost = 0;\r\n CopyData();\r\n Object.keys(Game.Objects).forEach((j) => {\r\n target = j;\r\n if (Game.Objects[target].amount < amount) {\r\n CacheCostDragonUpgrade = 'Not enough buildings to sell';\r\n return;\r\n }\r\n for (let i = 0; i < amount; i++) {\r\n let price =\r\n SimObjects[target].basePrice *\r\n Game.priceIncrease **\r\n Math.max(0, SimObjects[target].amount - 1 - SimObjects[target].free);\r\n price = Game.modifyBuildingPrice(SimObjects[target], price);\r\n price = Math.ceil(price);\r\n cost += price;\r\n SimObjects[target].amount -= 1;\r\n }\r\n CacheCostDragonUpgrade = `Cost to rebuy: ${Beautify(cost)}`;\r\n });\r\n }\r\n }\r\n CacheLastDragonLevel = Game.dragonLevel;\r\n }\r\n\r\n FillCMDCache({ CacheLastDragonLevel });\r\n}\r\n","/** Data related to the display titles of certain sections in menu screens */\r\n\r\n/** Display titles of the headers of the Cookie Monster settings section */\r\nexport const ConfigGroups = {\r\n Favourite: 'Favourite Settings',\r\n Calculation: 'Calculation',\r\n Notation: 'Notation',\r\n Colours: 'Colours and colour coding',\r\n BarsDisplay: 'Infobars and visual settings',\r\n Tooltip: 'Tooltips',\r\n Statistics: 'Statistics',\r\n Notification: 'Notifications',\r\n Miscellaneous: 'Miscellaneous',\r\n};\r\n\r\n/** Display titles of the headers of the notification section of the Cookie Monster settings */\r\nexport const ConfigGroupsNotification = {\r\n NotificationGeneral: 'General Notifications',\r\n NotificationGC: 'Golden Cookie',\r\n NotificationFC: 'Fortune Cookie',\r\n NotificationSea: 'Season Special',\r\n NotificationGard: 'Garden Tick',\r\n NotificationMagi: 'Full Magic Bar',\r\n NotificationWrink: 'Wrinkler',\r\n NotificationWrinkMax: 'Maximum Wrinklers',\r\n};\r\n","/**\r\n * This function checks if the user has given permissions for notifications\r\n * It is called by a change in any of the notification options\r\n * Note that most browsers will stop asking if the user has ignored the prompt around 6 times\r\n * @param \t{number}\tToggleOnOff\t\tA number indicating whether the option has been turned off (0) or on (1)\r\n */\r\nfunction CheckNotificationPermissions(ToggleOnOff) {\r\n if (ToggleOnOff === 1) {\r\n // Check if browser support Promise version of Notification Permissions\r\n const checkNotificationPromise = function () {\r\n try {\r\n Notification.requestPermission().then();\r\n } catch (e) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n // Check if the browser supports notifications and which type\r\n if (!('Notification' in window)) {\r\n console.log('This browser does not support notifications.'); // eslint-disable-line no-console\r\n } else if (checkNotificationPromise()) {\r\n Notification.requestPermission().then();\r\n } else {\r\n Notification.requestPermission();\r\n }\r\n }\r\n}\r\n\r\nexport default CheckNotificationPermissions;\r\n","import UpdateBuildings from '../BuildingsUpgrades/Buildings';\r\nimport UpdateUpgrades from '../BuildingsUpgrades/Upgrades';\r\nimport { UpdateBotBar } from '../InfoBars/BottomBar';\r\n\r\n/**\r\n * This function refreshes all numbers after a change in scale-setting\r\n * It is therefore called by a changes in CM.Options.Scale, CM.Options.ScaleDecimals, CM.Options.ScaleSeparator and CM.Options.ScaleCutoff\r\n */\r\nexport default function RefreshScale() {\r\n BeautifyAll();\r\n Game.RefreshStore();\r\n Game.RebuildUpgrades();\r\n\r\n UpdateBotBar();\r\n UpdateBuildings();\r\n UpdateUpgrades();\r\n}\r\n","import { UpdateBotBar } from '../../Disp/InfoBars/BottomBar';\r\nimport { UpdateBotTimerBarPosition } from '../SpecificToggles';\r\n\r\n/**\r\n * This function toggle the bottom bar\r\n * It is called by CM.Disp.UpdateAscendState() and a change in Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar\r\n */\r\nexport default function ToggleBotBar() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1) {\r\n l('CMBotBar').style.display = '';\r\n UpdateBotBar();\r\n } else {\r\n l('CMBotBar').style.display = 'none';\r\n }\r\n UpdateBotTimerBarPosition();\r\n}\r\n","import { settingClasses } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\n\r\nimport CheckNotificationPermissions from '../Config/CheckNotificationPermissions';\r\nimport RefreshScale from '../Disp/HelperFunctions/RefreshScale';\r\nimport { SimDoSims } from '../Sim/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport ToggleBotBar from '../Config/Toggles/ToggleBotBar';\r\nimport ToggleDetailedTime from '../Config/Toggles/ToggleDetailedTime';\r\nimport ToggleGCTimer from '../Config/Toggles/ToggleGCTimer';\r\nimport ToggleSectionHideButtons from '../Config/Toggles/ToggleSectionHideButtons';\r\nimport ToggleToolWarnPos from '../Config/Toggles/ToggleToolWarnPos';\r\nimport ToggleUpgradeBarAndColour from '../Config/Toggles/ToggleUpgradeBarAndColour';\r\nimport ToggleUpgradeBarFixedPos from '../Config/Toggles/ToggleUpgradeBarFixedPos';\r\nimport ToggleWrinklerButtons from '../Config/Toggles/ToggleWrinklerButtons';\r\nimport UpdateBuildings from '../Disp/BuildingsUpgrades/Buildings';\r\nimport { UpdateFavicon } from '../Disp/TabTitle/FavIcon';\r\nimport UpdateUpgradeSectionsHeight from '../Disp/BuildingsUpgrades/UpdateUpgradeSectionsHeight';\r\nimport UpdateUpgrades from '../Disp/BuildingsUpgrades/Upgrades';\r\nimport { ToggleTimerBar, ToggleTimerBarPos } from '../Config/SpecificToggles';\r\n\r\n/** This includes all options of CookieMonster and their relevant data */\r\nconst settings = {\r\n // Calculation\r\n CPSMode: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Calculation',\r\n ['Current cookies per second', 'Average cookies per second'],\r\n 'Calculate times using current cookies per second or average cookies per second',\r\n false,\r\n ),\r\n AvgCPSHist: new settingClasses.SettingStandard(\r\n 3,\r\n 'bool',\r\n 'Calculation',\r\n [\r\n 'Average CPS in past 10s',\r\n 'Average CPS in past 15s',\r\n 'Average CPS in past 30s',\r\n 'Average CPS in past 1m',\r\n 'Average CPS in past 5m',\r\n 'Average CPS in past 10m',\r\n 'Average CPS in past 15m',\r\n 'Average CPS in past 30m',\r\n ],\r\n 'How much time average Cookies Per Second should consider',\r\n false,\r\n ),\r\n AvgClicksHist: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Calculation',\r\n [\r\n 'Average clicks in past 1s',\r\n 'Average clicks in past 5s',\r\n 'Average clicks in past 10s',\r\n 'Average clicks in past 15s',\r\n 'Average clicks in past 30s',\r\n ],\r\n 'How much time average Cookie Clicks should consider',\r\n false,\r\n ),\r\n CalcWrink: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'Calculation',\r\n [\r\n 'Calculate with wrinklers OFF',\r\n 'Calculate with wrinklers ON',\r\n 'Calculate with single fattest wrinkler ON',\r\n ],\r\n 'Calculate times and average Cookies Per Second with (only the single non-shiny fattest) wrinklers',\r\n true,\r\n () => {\r\n SimDoSims = true;\r\n },\r\n ),\r\n\r\n // Notation\r\n Scale: new settingClasses.SettingStandardWithFunc(\r\n 2,\r\n 'bool',\r\n 'Notation',\r\n [\r\n \"Game's setting scale\",\r\n 'Metric',\r\n 'Short scale',\r\n 'Short scale (Abbreviated)',\r\n 'Scientific notation',\r\n 'Engineering notation',\r\n ],\r\n 'Change how long numbers are formatted',\r\n false,\r\n () => {\r\n RefreshScale();\r\n },\r\n ),\r\n ScaleDecimals: new settingClasses.SettingStandardWithFunc(\r\n 2,\r\n 'bool',\r\n 'Notation',\r\n ['1 decimals', '2 decimals', '3 decimals'],\r\n `Set the number of decimals used when applicable. This only works with Cookie Monster scales and not with \"Game's Setting Scale\"`,\r\n false,\r\n () => {\r\n RefreshScale();\r\n },\r\n ),\r\n ScaleSeparator: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'Notation',\r\n ['. for decimals (standard)', '. for thousands'],\r\n 'Set the separator used for decimals and thousands',\r\n false,\r\n () => {\r\n RefreshScale();\r\n },\r\n ),\r\n ScaleCutoff: new settingClasses.SettingInputNumber(\r\n 999999,\r\n 'numscale',\r\n 'Notation',\r\n 'Notation cut-off point: ',\r\n 'The number from which Cookie Monster will start formatting numbers based on chosen scale. Standard is 999,999. Setting this above 999,999,999 might break certain notations',\r\n 1,\r\n 999999999,\r\n ),\r\n TimeFormat: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Notation',\r\n ['Time XXd, XXh, XXm, XXs', 'Time XX:XX:XX:XX:XX', 'Time XXx, XXx'],\r\n 'Change the time format',\r\n false,\r\n ),\r\n DetailedTime: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'Notation',\r\n ['Detailed time OFF', 'Detailed time ON'],\r\n 'Change how time is displayed in certain statistics and tooltips',\r\n true,\r\n () => {\r\n ToggleDetailedTime();\r\n },\r\n ),\r\n PPDisplayTime: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Notation',\r\n ['PP as value (standard)', 'PP as time unit'],\r\n 'Display PP as calculated value or as approximate time unit. Note that PP does not translate directly into a time unit and this is therefore only an approximation.',\r\n false,\r\n ),\r\n\r\n // Colours\r\n BuildColour: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'Colours',\r\n ['Building colours OFF', 'Building colours ON'],\r\n 'Colour code buildings',\r\n true,\r\n () => {\r\n UpdateBuildings();\r\n },\r\n ),\r\n PPOnlyConsiderBuyable: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Colours',\r\n [\"Don't ignore non-buyable\", 'Ignore non-buyable'],\r\n \"Makes Cookie Monster label buildings and upgrades you can't buy right now red, useful in those situations where you just want to spend your full bank 'most optimally'\",\r\n true,\r\n ),\r\n PPExcludeTop: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Colours',\r\n [\r\n \"Don't ignore any\",\r\n 'Ignore 1st best',\r\n 'Ignore 1st and 2nd best',\r\n 'Ignore 1st, 2nd and 3rd best',\r\n ],\r\n 'Makes Cookie Monster ignore the 1st, 2nd or 3rd best buildings in labeling and colouring PP values',\r\n true,\r\n ),\r\n PPRigidelMode: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Colours',\r\n ['Rigidel mode OFF', 'Rigidel mode ON'],\r\n 'Makes Cookie Monster ignore all \"buy 1\" options when colouring PP in order to stay at a total building count ending in 10 for pantheon god Rigidel',\r\n true,\r\n ),\r\n PPSecondsLowerLimit: new settingClasses.SettingInputNumber(\r\n 0,\r\n 'numscale',\r\n 'Colours',\r\n 'Lower limit for PP (in seconds): ',\r\n 'If a building or upgrade costs less than the specified seconds of CPS it will also be considered optimal and label it as such (\"PP is less than xx seconds of CPS\"); setting to 0 ignores this option',\r\n 0,\r\n Infinity,\r\n ),\r\n ColourBlue: new settingClasses.SettingColours(\r\n '#4bb8f0',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is blue. Used to show upgrades better than best PP building, for Click Frenzy bar, and for various labels',\r\n ),\r\n ColourGreen: new settingClasses.SettingColours(\r\n '#00ff00',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is green. Used to show best PP building, for Blood Frenzy bar, and for various labels',\r\n ),\r\n ColourYellow: new settingClasses.SettingColours(\r\n '#ffff00',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is yellow. Used to show buildings within the top 10 of PP, for Frenzy bar, and for various labels',\r\n ),\r\n ColourOrange: new settingClasses.SettingColours(\r\n '#ff7f00',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is orange. Used to show buildings within the top 20 of PP, for Next Reindeer bar, and for various labels',\r\n ),\r\n ColourRed: new settingClasses.SettingColours(\r\n '#ff0000',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is Red. Used to show buildings within the top 30 of PP, for Clot bar, and for various labels',\r\n ),\r\n ColourPurple: new settingClasses.SettingColours(\r\n '#ff00ff',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is purple. Used to show buildings outside of the top 30 of PP, for Next Cookie bar, and for various labels',\r\n ),\r\n ColourGray: new settingClasses.SettingColours(\r\n '#b3b3b3',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is gray. Used to show negative or infinity PP, and for Next Cookie/Next Reindeer bar',\r\n ),\r\n ColourPink: new settingClasses.SettingColours(\r\n '#ff1493',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is pink. Used for Dragonflight bar',\r\n ),\r\n ColourBrown: new settingClasses.SettingColours(\r\n '#8b4513',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is brown. Used for Dragon Harvest bar',\r\n ),\r\n\r\n // BarsDisplay\r\n BotBar: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Bottom bar OFF', 'Bottom bar ON'],\r\n 'Building information',\r\n true,\r\n () => {\r\n ToggleBotBar();\r\n },\r\n ),\r\n TimerBar: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Timer bar OFF', 'Timer bar ON'],\r\n 'Bar with timers for golden cookie, season popup, Frenzy (Normal, Clot, Elder), Click Frenzy',\r\n true,\r\n () => {\r\n ToggleTimerBar();\r\n },\r\n ),\r\n TimerBarPos: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Timer bar position (top left)', 'Timer bar position (bottom)'],\r\n 'Placement of the timer bar',\r\n false,\r\n () => {\r\n ToggleTimerBarPos();\r\n },\r\n ),\r\n TimerBarOverlay: new settingClasses.SettingStandard(\r\n 2,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Timer bar overlay OFF', 'Timer bar overlay only seconds', 'Timer bar overlay full'],\r\n 'Overlay on timers displaying seconds and/or percentage left',\r\n true,\r\n ),\r\n AutosaveTimerBar: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Autosave timer bar OFF', 'Autosave timer bar ON'],\r\n 'Show a timer counting down till next autosave in the timer bar',\r\n true,\r\n ),\r\n UpBarColour: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Upgrade colours/bar OFF', 'Upgrade colours with bar ON', 'Upgrade colours without bar ON'],\r\n 'Colour code upgrades and optionally add a counter bar',\r\n false,\r\n () => {\r\n ToggleUpgradeBarAndColour();\r\n },\r\n ),\r\n UpgradeBarFixedPos: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Upgrade bar fixed position OFF', 'Upgrade bar fixed position ON'],\r\n 'Lock the upgrade bar at top of the screen to prevent it from moving ofscreen when scrolling',\r\n true,\r\n () => {\r\n ToggleUpgradeBarFixedPos();\r\n },\r\n ),\r\n SortBuildings: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n [\r\n 'Sort buildings: default',\r\n 'Sort buildings: PP of x1 purchase',\r\n 'Sort buildings: PP of selected bulk mode',\r\n 'Sort buildings: price until next achievement',\r\n ],\r\n 'Sort the display of buildings in default order, by PP, or until next achievement',\r\n false,\r\n () => {\r\n UpdateBuildings();\r\n },\r\n ),\r\n SortUpgrades: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Sort upgrades: default', 'Sort upgrades: PP'],\r\n 'Sort the display of upgrades in either default order or by PP',\r\n false,\r\n () => {\r\n UpdateUpgrades();\r\n },\r\n ),\r\n UpgradesNeverCollapse: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Upgrades always expanded OFF', 'Upgrades always expanded ON'],\r\n 'Toggle to make the upgrades sections always expanded to the size needed to display all upgrades',\r\n true,\r\n () => {\r\n UpdateUpgradeSectionsHeight();\r\n },\r\n ),\r\n DragonAuraInfo: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Extra dragon aura info OFF', 'Extra dragon aura info ON'],\r\n 'Shows information about changes in CPS and costs in the dragon aura interface.',\r\n true,\r\n ),\r\n GrimoireBar: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Grimoire magic meter timer OFF', 'Grimoire magic meter timer ON'],\r\n 'A timer overlay showing how long till the Grimoire magic meter is full',\r\n true,\r\n ),\r\n GCTimer: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Golden cookie timer OFF', 'Golden cookie timer ON'],\r\n 'A timer on the golden cookie when it has been spawned',\r\n true,\r\n () => {\r\n ToggleGCTimer();\r\n },\r\n ),\r\n Favicon: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Favicon OFF', 'Favicon ON'],\r\n 'Update favicon with golden/wrath cookie',\r\n true,\r\n () => {\r\n UpdateFavicon();\r\n },\r\n ),\r\n WrinklerButtons: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Extra wrinkler buttons OFF', 'Extra wrinkler buttons ON'],\r\n 'Show buttons for popping wrinklers at bottom of cookie section',\r\n true,\r\n () => {\r\n ToggleWrinklerButtons();\r\n },\r\n ),\r\n HideSectionsButtons: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Hide buildings/upgrades button OFF', 'Hide buildings/upgrades button ON'],\r\n 'Show buttons for hiding and showing the buildings and upgrades sections in the right column',\r\n true,\r\n () => {\r\n ToggleSectionHideButtons();\r\n },\r\n ),\r\n\r\n // Tooltip\r\n TooltipBuildUpgrade: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Building/upgrade tooltip information OFF', 'Building/upgrade tooltip information ON'],\r\n 'Extra information in building/upgrade tooltips',\r\n true,\r\n ),\r\n TooltipAmor: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Tooltip',\r\n [\r\n 'Buildings tooltip amortization information OFF',\r\n 'Buildings tooltip amortization information ON',\r\n ],\r\n 'Add amortization information to buildings tooltip',\r\n true,\r\n ),\r\n ToolWarnLucky: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip lucky warning OFF', 'Tooltip lucky warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for max \"Lucky!\" rewards',\r\n true,\r\n ),\r\n ToolWarnLuckyFrenzy: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip lucky frenzy warning OFF', 'Tooltip lucky frenzy warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for max \"Lucky!\" (Frenzy) rewards',\r\n true,\r\n ),\r\n ToolWarnConjure: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip conjure warning OFF', 'Tooltip conjure warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for max \"Conjure Baked Goods\" rewards',\r\n true,\r\n ),\r\n ToolWarnConjureFrenzy: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip conjure frenzy warning OFF', 'Tooltip conjure frenzy warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for max \"Conjure Baked Goods\" rewards with Frenzy active',\r\n true,\r\n ),\r\n ToolWarnEdifice: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip edifice warning OFF', 'Tooltip edifice warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for \"Spontaneous Edifice\" to possibly give you your most expensive building',\r\n true,\r\n ),\r\n ToolWarnUser: new settingClasses.SettingInputNumber(\r\n 0,\r\n 'numscale',\r\n 'Tooltip',\r\n 'Tooltip warning at x times CPS: ',\r\n 'Use this to show a customized warning if buying it will put the bank under the amount equal to value times cps; setting to 0 disables the function altogether',\r\n 0,\r\n Infinity,\r\n ),\r\n ToolWarnBon: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Calculate tooltip warning with bonus CPS OFF', 'Calculate tooltip warning with bonus CPS ON'],\r\n 'Calculate the warning with or without the bonus CPS you get from buying',\r\n true,\r\n ),\r\n ToolWarnPos: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip warning position (left)', 'Tooltip warning position (bottom)'],\r\n 'Placement of the warning boxes',\r\n false,\r\n () => {\r\n ToggleToolWarnPos();\r\n },\r\n ),\r\n TooltipGrim: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Grimoire tooltip information OFF', 'Grimoire tooltip information ON'],\r\n 'Extra information in tooltip for grimoire',\r\n true,\r\n ),\r\n TooltipWrink: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Wrinkler tooltip OFF', 'Wrinkler tooltip ON'],\r\n 'Shows the amount of cookies a wrinkler will give when popping it',\r\n true,\r\n ),\r\n TooltipLump: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Sugar lump tooltip OFF', 'Sugar lump tooltip ON'],\r\n 'Shows the current Sugar Lump type in Sugar lump tooltip.',\r\n true,\r\n ),\r\n TooltipPlots: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Garden plots tooltip OFF', 'Garden plots tooltip ON'],\r\n 'Shows a tooltip for plants that have a cookie reward.',\r\n true,\r\n ),\r\n TooltipPantheon: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Pantheon tooltip OFF', 'Pantheon tooltip ON'],\r\n 'Shows additional info in the pantheon tooltip',\r\n true,\r\n ),\r\n TooltipAscendButton: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Show Extra Info Ascend Tooltip OFF', 'Show Extra Info Ascend Tooltip ON'],\r\n 'Shows additional info in the ascend tooltip',\r\n true,\r\n ),\r\n\r\n // Statistics\r\n Stats: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Statistics',\r\n ['Statistics OFF', 'Statistics ON'],\r\n 'Extra Cookie Monster statistics!',\r\n true,\r\n ),\r\n MissingUpgrades: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Statistics',\r\n ['Missing upgrades OFF', 'Missing upgrades ON'],\r\n 'Shows missing upgrades in statistics menu',\r\n true,\r\n ),\r\n MissingAchievements: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Statistics',\r\n ['Missing Achievements OFF', 'Missing Normal Achievements ON'],\r\n 'Shows missing normal achievements in statistics menu.',\r\n true,\r\n ),\r\n UpStats: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Statistics',\r\n ['Statistics update rate (default)', 'Statistics update rate (1s)'],\r\n 'Default rate is once every 5 seconds',\r\n false,\r\n ),\r\n HeavenlyChipsTarget: new settingClasses.SettingInputNumber(\r\n 1,\r\n 'numscale',\r\n 'Statistics',\r\n 'Heavenly chips target: ',\r\n 'Use this to set a heavenly chips target that will be counted towards in the \"prestige\" statsistics sections',\r\n 1,\r\n Infinity,\r\n ),\r\n ShowMissedGC: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Statistics',\r\n ['Missed GC OFF', 'Missed GC ON'],\r\n 'Show a stat in the statistics screen that counts how many golden cookies you have missed',\r\n true,\r\n ),\r\n\r\n // Notification\r\n Title: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGeneral',\r\n ['Title OFF', 'Title ON', 'Title pinned tab highlight'],\r\n 'Update title with colden cookie/season popup timers; pinned tab highlight only changes the title when a golden cookie/season popup spawns; \"!\" means that golden cookie/reindeer can spawn',\r\n true,\r\n ),\r\n GeneralSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGeneral',\r\n ['Consider game volume setting OFF', 'Consider game volume setting ON'],\r\n 'Turning this toggle to \"off\" makes Cookie Monster no longer consider the volume setting of the base game, allowing mod notifications to play with base game volume turned down',\r\n true,\r\n ),\r\n GCNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationGC',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when golden cookie spawns',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCNotification,\r\n );\r\n },\r\n ),\r\n GCFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGC',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen on golden cookie',\r\n true,\r\n ),\r\n ColourGCFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationGC',\r\n 'The colour of the GC flash, standard colour is white',\r\n ),\r\n GCSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGC',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound on golden cookie',\r\n true,\r\n ),\r\n GCVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationGC', [], 'Volume'),\r\n GCSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/66/66717_931655-lq.mp3',\r\n 'url',\r\n 'NotificationGC',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when a golden cookie spawns',\r\n ),\r\n FortuneNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationFC',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when fortune cookie is on the ticker',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FortuneNotification,\r\n );\r\n },\r\n ),\r\n FortuneFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationFC',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen on fortune cookie spawn',\r\n true,\r\n ),\r\n ColourFortuneFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationFC',\r\n 'The colour of the fortune flash, standard colour is white',\r\n ),\r\n FortuneSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationFC',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound on fortune cookie spawn',\r\n true,\r\n ),\r\n FortuneVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationFC', [], 'Volume'),\r\n FortuneSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/174/174027_3242494-lq.mp3',\r\n 'url',\r\n 'NotificationFC',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when the ticker has a fortune cookie',\r\n ),\r\n SeaNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationSea',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification on season popup',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SeaNotification,\r\n );\r\n },\r\n ),\r\n SeaFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationSea',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen on season popup',\r\n true,\r\n ),\r\n ColourSeaFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationSea',\r\n 'The colour of the season popup flash, standard colour is white',\r\n ),\r\n SeaSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationSea',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound on season popup',\r\n true,\r\n ),\r\n SeaVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationSea', [], 'Volume'),\r\n SeaSoundURL: new settingClasses.SettingStandard(\r\n 'https://www.freesound.org/data/previews/121/121099_2193266-lq.mp3',\r\n 'url',\r\n 'NotificationSea',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when on season popup spawns',\r\n ),\r\n GardFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGard',\r\n ['Garden Tick Flash OFF', 'Flash ON'],\r\n 'Flash screen on garden tick',\r\n true,\r\n ),\r\n ColourGardFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationGard',\r\n 'The colour of the garden flash, standard colour is white',\r\n ),\r\n GardSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGard',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound on garden tick',\r\n true,\r\n ),\r\n GardVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationGard', [], 'Volume'),\r\n GardSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/103/103046_861714-lq.mp3',\r\n 'url',\r\n 'NotificationGard',\r\n 'Garden Tick Sound URL:',\r\n 'URL of the sound to be played when the garden ticks',\r\n ),\r\n MagicNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationMagi',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when magic reaches maximum',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MagicNotification,\r\n );\r\n },\r\n ),\r\n MagicFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationMagi',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen when magic reaches maximum',\r\n true,\r\n ),\r\n ColourMagicFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationMagi',\r\n 'The colour of the magic flash, standard colour is white',\r\n ),\r\n MagicSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationMagi',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound when magic reaches maximum',\r\n true,\r\n ),\r\n MagicVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationMagi', [], 'Volume'),\r\n MagicSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/221/221683_1015240-lq.mp3',\r\n 'url',\r\n 'NotificationMagi',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when magic reaches maxium',\r\n ),\r\n WrinklerNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationWrink',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when a wrinkler appears',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerNotification,\r\n );\r\n },\r\n ),\r\n WrinklerFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationWrink',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen when a wrinkler appears',\r\n true,\r\n ),\r\n ColourWrinklerFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationWrink',\r\n 'The colour of the wrinkler flash, standard colour is white',\r\n ),\r\n WrinklerSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationWrink',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound when a wrinkler appears',\r\n true,\r\n ),\r\n WrinklerVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationWrink', [], 'Volume'),\r\n WrinklerSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/124/124186_8043-lq.mp3',\r\n 'url',\r\n 'NotificationWrink',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when a wrinkler appears',\r\n ),\r\n WrinklerMaxNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationWrinkMax',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when the maximum amount of wrinklers has appeared',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxNotification,\r\n );\r\n },\r\n ),\r\n WrinklerMaxFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationWrinkMax',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen when the maximum amount of Wrinklers has appeared',\r\n true,\r\n ),\r\n ColourWrinklerMaxFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationWrinkMax',\r\n 'The colour of the maximum wrinkler flash, standard colour is white',\r\n ),\r\n WrinklerMaxSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationWrinkMax',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound when the maximum amount of wrinklers has appeared',\r\n true,\r\n ),\r\n WrinklerMaxVolume: new settingClasses.SettingVolume(\r\n 100,\r\n 'vol',\r\n 'NotificationWrinkMax',\r\n [],\r\n 'Volume',\r\n ),\r\n WrinklerMaxSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/152/152743_15663-lq.mp3',\r\n 'url',\r\n 'NotificationWrinkMax',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when the maximum amount of wrinklers has appeared',\r\n ),\r\n\r\n // Miscellaneous\r\n BulkBuyBlock: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Miscellaneous',\r\n ['Block bulk buying OFF', 'Block bulk buying ON'],\r\n \"Block clicking bulk buying when you can't buy all. This prevents buying 7 of a building when you are in buy-10 or buy-100 mode.\",\r\n true,\r\n ),\r\n FavouriteSettings: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'Miscellaneous',\r\n [\r\n 'Favourite settings section OFF',\r\n 'Favourite settings section ON',\r\n 'Favourite settings section ON (Locked)',\r\n ],\r\n \"Show stars before each setting which allows selecting it for a 'favourites' section at the top of the Cookie Monster settings. Setting this to Locked removes the stars but shows the 'favourites' section\",\r\n true,\r\n () => {\r\n Game.UpdateMenu();\r\n },\r\n ),\r\n};\r\n\r\nexport default settings;\r\n","import { CMSayTime } from '../../Disp/VariablesAndData';\r\nimport { BackupFunctions } from '../../Main/VariablesAndData';\r\n\r\n/**\r\n * This function changes some of the time-displays in the game to be more detailed\r\n * It is called by a change in CM.Options.DetailedTime\r\n */\r\nexport default function ToggleDetailedTime() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.DetailedTime === 1)\r\n Game.sayTime = CMSayTime;\r\n else Game.sayTime = BackupFunctions.sayTime;\r\n}\r\n","import UpdateUpgrades from '../../Disp/BuildingsUpgrades/Upgrades';\r\n\r\n/**\r\n * This function toggles the upgrade bar and the colours of upgrades\r\n * It is called by a change in CM.Options.UpBarColour\r\n */\r\nexport default function ToggleUpgradeBarAndColour() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour === 1) {\r\n // Colours and bar on\r\n l('CMUpgradeBar').style.display = '';\r\n UpdateUpgrades();\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour === 2\r\n ) {\r\n // Colours on and bar off\r\n l('CMUpgradeBar').style.display = 'none';\r\n UpdateUpgrades();\r\n } else {\r\n // Colours and bar off\r\n l('CMUpgradeBar').style.display = 'none';\r\n Game.RebuildUpgrades();\r\n }\r\n}\r\n","/**\r\n * This function toggles the position of the upgrade bar from fixed or non-fixed mode\r\n * It is called by a change in CM.Options.UpgradeBarFixedPos\r\n */\r\nexport default function ToggleUpgradeBarFixedPos() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpgradeBarFixedPos === 1\r\n ) {\r\n // Fix to top of screen when scrolling\r\n l('CMUpgradeBar').style.position = 'sticky';\r\n l('CMUpgradeBar').style.top = '0px';\r\n } else {\r\n l('CMUpgradeBar').style.position = ''; // Possible to scroll offscreen\r\n }\r\n}\r\n","import { CacheGoldenShimmersByID } from '../../Cache/VariablesAndData';\r\nimport { GCTimers } from '../../Disp/VariablesAndData';\r\n\r\n/**\r\n * This function toggles GC Timers are visible\r\n * It is called by a change in CM.Options.GCTimer\r\n */\r\nexport default function ToggleGCTimer() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer === 1) {\r\n Object.keys(GCTimers).forEach((i) => {\r\n GCTimers[i].style.display = 'block';\r\n GCTimers[i].style.left = CacheGoldenShimmersByID[i].l.style.left;\r\n GCTimers[i].style.top = CacheGoldenShimmersByID[i].l.style.top;\r\n });\r\n } else {\r\n // eslint-disable-next-line no-return-assign\r\n Object.keys(GCTimers).forEach((i) => (GCTimers[i].style.display = 'none'));\r\n }\r\n}\r\n","/**\r\n * This function updates the display setting of the two objects created by CM.Disp.CreateWrinklerButtons()\r\n * It is called by changes in CM.Options.WrinklerButtons\r\n */\r\nexport default function ToggleSectionHideButtons() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.HideSectionsButtons) {\r\n l('CMSectionHidButtons').style.display = '';\r\n } else {\r\n l('CMSectionHidButtons').style.display = 'none';\r\n }\r\n}\r\n","import UpdateBuildings from '../BuildingsUpgrades/Buildings';\r\nimport {\r\n ColourBackPre,\r\n ColourBorderPre,\r\n ColoursOrdering,\r\n ColourTextPre,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function changes/refreshes colours if the user has set new standard colours\r\n * The function is therefore called by a change in CM.Options.Colours\r\n */\r\nexport default function UpdateColours() {\r\n let str = '';\r\n for (let i = 0; i < ColoursOrdering.length; i++) {\r\n str += `.${ColourTextPre}${ColoursOrdering[i]} { color: ${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[\r\n `Colour${ColoursOrdering[i]}`\r\n ]\r\n }; }\\n`;\r\n }\r\n for (let i = 0; i < ColoursOrdering.length; i++) {\r\n str += `.${ColourBackPre}${ColoursOrdering[i]} { background-color: ${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[\r\n `Colour${ColoursOrdering[i]}`\r\n ]\r\n }; }\\n`;\r\n }\r\n for (let i = 0; i < ColoursOrdering.length; i++) {\r\n str += `.${ColourBorderPre}${ColoursOrdering[i]} { border: 1px solid ${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[\r\n `Colour${ColoursOrdering[i]}`\r\n ]\r\n }; }\\n`;\r\n }\r\n l('CMCSS').textContent = str;\r\n UpdateBuildings(); // Class has been already set\r\n}\r\n","import { menuFunctions as mF } from '@cookiemonsterteam/cookiemonsterframework';\r\nimport { ConfigGroups, ConfigGroupsNotification } from '../../Data/Sectionheaders';\r\nimport settings from '../../Data/settings';\r\nimport UpdateColours from '../HelperFunctions/UpdateColours';\r\nimport RefreshScale from '../HelperFunctions/RefreshScale';\r\n\r\n/**\r\n * Creates the <div> to be added to the Options section\r\n * @returns {object} menuDiv\tObject of the <div> of Cookie Monster in options tab\r\n */\r\nexport default function createMenuOptions() {\r\n const menuDiv = mF.createModMenuSection('cookieMonsterMod', 'Cookie Monster', 'optionsMenu');\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.optionsMenu) {\r\n Object.keys(ConfigGroups).forEach((group) => {\r\n if (group === 'Favourite') {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings.length !==\r\n 0 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FavouriteSettings > 0\r\n ) {\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsSubHeader('cookieMonsterMod', group, ConfigGroups[group]),\r\n );\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[group])\r\n for (\r\n let index = 0;\r\n index <\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings.length;\r\n index++\r\n ) {\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsListing(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings[\r\n index\r\n ],\r\n settings,\r\n UpdateColours,\r\n RefreshScale,\r\n ),\r\n );\r\n }\r\n }\r\n } else {\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsSubHeader('cookieMonsterMod', group, ConfigGroups[group]),\r\n );\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[group]) {\r\n // 0 is show, 1 is collapsed\r\n // Make sub-sections of Notification section\r\n if (group === 'Notification') {\r\n Object.keys(ConfigGroupsNotification).forEach((subGroup) => {\r\n const subGroupObject = mF.listings.createOptionsSubHeader(\r\n 'cookieMonsterMod',\r\n subGroup,\r\n ConfigGroupsNotification[subGroup],\r\n );\r\n subGroupObject.style.fontSize = '15px';\r\n subGroupObject.style.opacity = '0.5';\r\n menuDiv.appendChild(subGroupObject);\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[subGroup]) {\r\n Object.keys(settings).forEach((option) => {\r\n if (settings[option].group === subGroup)\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsListing(\r\n 'cookieMonsterMod',\r\n option,\r\n settings,\r\n UpdateColours,\r\n RefreshScale,\r\n ),\r\n );\r\n });\r\n }\r\n });\r\n } else {\r\n Object.keys(settings).forEach((option) => {\r\n if (settings[option].group === group)\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsListing(\r\n 'cookieMonsterMod',\r\n option,\r\n settings,\r\n UpdateColours,\r\n RefreshScale,\r\n ),\r\n );\r\n });\r\n }\r\n }\r\n }\r\n });\r\n }\r\n return menuDiv;\r\n}\r\n","const SPECIAL_DIGIT = 7;\r\n\r\n/**\r\n * Count the number of 7s in any number\r\n * @param\t{number}\tnumber\tThe number to count sevens for\r\n * @returns\t{number}\tThe number of 7s in the provided number\r\n */\r\nexport function CountSevens(number) {\r\n return String(number).split(String(SPECIAL_DIGIT)).length - 1;\r\n}\r\n\r\n/**\r\n * Calculate the delta for the next number where the given digit is a 7\r\n * @param\t{number}\tnumber\t\t\tThe starting number to calculate the delta for\r\n * @param\t{number}\tdigitPlace\t1 for ones place, 10 for tens place, 100 for hundreds place, etc\r\n * @returns\t{number}\tThe calculated delta\r\n */\r\nexport function CalculateSevenDelta(number, digitPlace) {\r\n const target = SPECIAL_DIGIT * digitPlace;\r\n const modulus = digitPlace * 10;\r\n\r\n let delta = target - (number % modulus) + (number % digitPlace);\r\n if (delta < 0) delta += modulus;\r\n\r\n return delta;\r\n}\r\n\r\n/**\r\n * This function calculates each of the next \"lucky\" prestige levels\r\n * @param\t{number}\tcurrentLevel\tThe user's prestige level, including levels earned since the last ascension\r\n * @returns\t{{number}, {number}, {number}}\tluckyDigit, luckyNumber, luckyPayout\tThe next eligible level for each upgrade\r\n */\r\nexport default function CalculateLuckyLevels(currentLevel) {\r\n const result = {};\r\n let sevenCount = CountSevens(currentLevel);\r\n const numberOfDigits = String(currentLevel).length;\r\n\r\n if (sevenCount >= 1) {\r\n result.luckyDigit = currentLevel;\r\n if (sevenCount >= 2) {\r\n result.luckyNumber = currentLevel;\r\n if (sevenCount >= 4) {\r\n result.luckyPayout = currentLevel;\r\n return result;\r\n }\r\n }\r\n }\r\n\r\n // Consider only top 15 digits if it is big number\r\n let localLevel;\r\n if (numberOfDigits >= 16) {\r\n localLevel = Math.ceil(currentLevel / (10 ** (numberOfDigits - 15)));\r\n } else {\r\n localLevel = currentLevel;\r\n }\r\n sevenCount = CountSevens(localLevel);\r\n\r\n if (result.luckyDigit === undefined) {\r\n if (sevenCount < 1) {\r\n const delta = CalculateSevenDelta(localLevel, 1);\r\n\r\n localLevel += delta;\r\n sevenCount = CountSevens(localLevel);\r\n }\r\n\r\n result.luckyDigit = localLevel;\r\n if (numberOfDigits >= 16) {\r\n result.luckyDigit *= 10 ** Number((numberOfDigits - 15));\r\n }\r\n }\r\n\r\n if (result.luckyNumber === undefined) {\r\n while (sevenCount < 2) {\r\n let delta = CalculateSevenDelta(localLevel, 1);\r\n if (delta === 0) delta = CalculateSevenDelta(localLevel, 10);\r\n\r\n localLevel += delta;\r\n sevenCount = CountSevens(localLevel);\r\n }\r\n\r\n result.luckyNumber = localLevel;\r\n if (numberOfDigits >= 16) {\r\n result.luckyNumber *= 10 ** Number((numberOfDigits - 15));\r\n }\r\n }\r\n\r\n let digitPlace = 1;\r\n while (sevenCount < 4) {\r\n const delta = CalculateSevenDelta(localLevel, digitPlace);\r\n if (delta === 0) {\r\n digitPlace *= 10;\r\n } else {\r\n localLevel += delta;\r\n sevenCount = CountSevens(localLevel);\r\n }\r\n }\r\n\r\n result.luckyPayout = localLevel;\r\n if (numberOfDigits >= 16) {\r\n result.luckyPayout *= 10 ** Number((numberOfDigits - 15));\r\n }\r\n\r\n return result;\r\n}\r\n","/** Section: Functions related to the creation of basic DOM elements page */\r\n\r\nimport { ToggleHeader } from '../../../Config/ToggleSetting';\r\n\r\nimport { SimpleTooltipElements } from '../../VariablesAndData';\r\n\r\n/**\r\n * This function creates a header-object for the stats page\r\n * It is called by CM.Disp.AddMenuStats()\r\n * @param \t{string}\t\tconfig\tThe name of the Config-group\r\n * @param \t{string}\t\ttext\tThe to-be displayed name of the header\r\n * @returns\t{object}\t\tdiv\t\tThe header object\r\n */\r\nexport function StatsHeader(text, config) {\r\n const div = document.createElement('div');\r\n div.className = 'title';\r\n div.style.padding = '0px 16px';\r\n div.style.opacity = '0.7';\r\n div.style.fontSize = '17px';\r\n div.style.fontFamily = '\"Kavoon\", Georgia, serif';\r\n div.appendChild(document.createTextNode(`${text} `));\r\n const span = document.createElement('span');\r\n span.style.cursor = 'pointer';\r\n span.style.display = 'inline-block';\r\n span.style.height = '14px';\r\n span.style.width = '14px';\r\n span.style.borderRadius = '7px';\r\n span.style.textAlign = 'center';\r\n span.style.backgroundColor = '#C0C0C0';\r\n span.style.color = 'black';\r\n span.style.fontSize = '13px';\r\n span.style.verticalAlign = 'middle';\r\n span.textContent = Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[config]\r\n ? '-'\r\n : '+';\r\n span.onclick = function () {\r\n ToggleHeader(config);\r\n Game.UpdateMenu();\r\n };\r\n div.appendChild(span);\r\n return div;\r\n}\r\n\r\n/**\r\n * This function creates an stats-listing-object for the stats page\r\n * It is called by CM.Disp.AddMenuStats()\r\n * @param \t{string}\t\ttype\t\tThe type fo the listing\r\n * @param \t{string}\t\tname\t\tThe name of the option\r\n * @param \t{object}\t\ttext\t\tThe text-object of the option\r\n * @param \t{string}\t\tplaceholder\tThe id of the to-be displayed tooltip if applicable\r\n * @returns\t{object}\t\tdiv\t\t\tThe option object\r\n */\r\nexport function StatsListing(type, name, text, placeholder) {\r\n const div = document.createElement('div');\r\n div.className = 'listing';\r\n\r\n const listingName = document.createElement('b');\r\n listingName.textContent = name;\r\n div.appendChild(listingName);\r\n if (type === 'withTooltip') {\r\n div.className = 'listing';\r\n div.appendChild(document.createTextNode(' '));\r\n\r\n const tooltip = document.createElement('span');\r\n tooltip.onmouseout = function () {\r\n Game.tooltip.hide();\r\n };\r\n tooltip.onmouseover = function () {\r\n Game.tooltip.draw(this, escape(SimpleTooltipElements[placeholder].innerHTML));\r\n };\r\n tooltip.style.cursor = 'default';\r\n tooltip.style.display = 'inline-block';\r\n tooltip.style.height = '10px';\r\n tooltip.style.width = '10px';\r\n tooltip.style.borderRadius = '5px';\r\n tooltip.style.textAlign = 'center';\r\n tooltip.style.backgroundColor = '#C0C0C0';\r\n tooltip.style.color = 'black';\r\n tooltip.style.fontSize = '9px';\r\n tooltip.style.verticalAlign = 'bottom';\r\n tooltip.textContent = '?';\r\n div.appendChild(tooltip);\r\n }\r\n div.appendChild(document.createTextNode(': '));\r\n div.appendChild(text);\r\n return div;\r\n}\r\n\r\n/**\r\n * This function creates an stats-listing-object for the stats page for missing items displays\r\n * It is called by CM.Disp.AddMenuStats()\r\n * @param \t{string}\t\ttype\t\tThe type fo the listing\r\n * @param \t{string}\t\tname\t\tThe name of the option\r\n * @param \t{object}\t\ttext\t\tThe text-object of the option\r\n * @param \t{bool}\t\t current Whether the season of the item is the current season\r\n * @returns\t{object}\t\tdiv\t\t\tThe option object\r\n */\r\nexport function StatsMissDispListing(type, name, text, current) {\r\n const div = document.createElement('div');\r\n div.className = 'listing';\r\n\r\n const listingName = document.createElement('b');\r\n listingName.textContent = name;\r\n if (current === true)\r\n listingName.style.color =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ColourGreen;\r\n div.appendChild(listingName);\r\n div.appendChild(document.createTextNode(': '));\r\n div.appendChild(text);\r\n return div;\r\n}\r\n\r\n/**\r\n * This function creates a tooltip containing all missing holiday items contained in the list theMissDisp\r\n * @param \t{list}\t\t\ttheMissDisp\t\tA list of the missing holiday items\r\n * @returns\t{object}\t\tfrag\t\t\tThe tooltip object\r\n */\r\nexport function StatsMissDisp(theMissDisp) {\r\n const frag = document.createDocumentFragment();\r\n frag.appendChild(document.createTextNode(`${theMissDisp.length} `));\r\n const span = document.createElement('span');\r\n span.onmouseout = function () {\r\n Game.tooltip.hide();\r\n };\r\n const placeholder = document.createElement('div');\r\n const missing = document.createElement('div');\r\n missing.style.minWidth = '140px';\r\n missing.style.marginBottom = '4px';\r\n const title = document.createElement('div');\r\n title.className = 'name';\r\n title.style.marginBottom = '4px';\r\n title.style.textAlign = 'center';\r\n title.textContent = 'Missing';\r\n missing.appendChild(title);\r\n Object.keys(theMissDisp).forEach((i) => {\r\n const div = document.createElement('div');\r\n div.style.textAlign = 'center';\r\n div.appendChild(document.createTextNode(theMissDisp[i]));\r\n missing.appendChild(div);\r\n });\r\n placeholder.appendChild(missing);\r\n span.onmouseover = function () {\r\n Game.tooltip.draw(this, escape(placeholder.innerHTML));\r\n };\r\n span.style.cursor = 'default';\r\n span.style.display = 'inline-block';\r\n span.style.height = '10px';\r\n span.style.width = '10px';\r\n span.style.borderRadius = '5px';\r\n span.style.textAlign = 'center';\r\n span.style.backgroundColor = '#C0C0C0';\r\n span.style.color = 'black';\r\n span.style.fontSize = '9px';\r\n span.style.verticalAlign = 'bottom';\r\n span.textContent = '?';\r\n frag.appendChild(span);\r\n return frag;\r\n}\r\n","import { saveAndLoadingFunctions } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\n\r\n/** Functions related to toggling or changing an individual setting */\r\n\r\n/** Used to name certain DOM or outside facing elements and refer to them */\r\nexport const ConfigPrefix = 'CMConfig';\r\n\r\n/**\r\n * This function toggles header options by incrementing them with 1 and handling changes\r\n * It is called by the onclick event of the +/- next to headers\r\n * @param \t{string}\tconfig\tThe name of the header\r\n */\r\nexport function ToggleHeader(config) {\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[config] += 1;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[config] > 1)\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[config] = 0;\r\n saveAndLoadingFunctions.saveFramework();\r\n}\r\n","/** Main function to create the sections of Cookie Monster on the Statistics page */\r\n\r\nimport { AddMissingUpgrades } from './CreateMissingUpgrades';\r\nimport * as CreateSections from './CreateStatsSections';\r\nimport * as CreateElements from './CreateDOMElements';\r\nimport * as GameData from '../../../Data/Gamedata';\r\n\r\nimport {\r\n CacheAverageClicks,\r\n CacheAverageCookiesFromClicks,\r\n CacheObjectsNextAchievement,\r\n CacheWrinklersFattest,\r\n CacheWrinklersNormal,\r\n CacheWrinklersTotal,\r\n} from '../../../Cache/VariablesAndData';\r\nimport PopAllNormalWrinklers from '../../HelperFunctions/PopWrinklers';\r\nimport { ClickTimes, CookieTimes } from '../../VariablesAndData';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport AddMissingAchievements from './CreateMissingAchievements';\r\n\r\n/**\r\n * This function adds stats created by CookieMonster to the stats page\r\n * It is called by CM.Disp.AddMenu\r\n * @param {object} title\tOn object that includes the title of the menu\r\n */\r\nexport default function AddMenuStats(title) {\r\n const stats = document.createElement('div');\r\n stats.className = 'subsection';\r\n stats.appendChild(title);\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Lucky Cookies', 'Lucky'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Lucky) {\r\n stats.appendChild(CreateSections.LuckySection());\r\n }\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Chain Cookies', 'Chain'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Chain) {\r\n stats.appendChild(CreateSections.ChainSection());\r\n }\r\n\r\n if (Game.Objects['Wizard tower'].minigameLoaded) {\r\n stats.appendChild(CreateElements.StatsHeader('Spells', 'Spells'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Spells) {\r\n stats.appendChild(CreateSections.SpellsSection());\r\n }\r\n }\r\n\r\n if (Game.Objects.Farm.minigameLoaded) {\r\n stats.appendChild(CreateElements.StatsHeader('Garden', 'Garden'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Garden) {\r\n stats.appendChild(CreateSections.GardenSection());\r\n }\r\n }\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Prestige', 'Prestige'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Prestige) {\r\n stats.appendChild(CreateSections.PrestigeSection());\r\n }\r\n\r\n if (Game.cpsSucked > 0) {\r\n stats.appendChild(CreateElements.StatsHeader('Wrinklers', 'Wrink'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Wrink) {\r\n const popAllFrag = document.createDocumentFragment();\r\n popAllFrag.appendChild(\r\n document.createTextNode(\r\n `${Beautify(CacheWrinklersTotal)} / ${Beautify(CacheWrinklersNormal)} `,\r\n ),\r\n );\r\n const popAllA = document.createElement('a');\r\n popAllA.textContent = 'Pop All Normal';\r\n popAllA.className = 'option';\r\n popAllA.onclick = function () {\r\n PopAllNormalWrinklers();\r\n };\r\n popAllFrag.appendChild(popAllA);\r\n stats.appendChild(\r\n CreateElements.StatsListing('basic', 'Rewards of Popping (All/Normal)', popAllFrag),\r\n );\r\n const popFattestFrag = document.createDocumentFragment();\r\n popFattestFrag.appendChild(document.createTextNode(`${Beautify(CacheWrinklersFattest[0])} `));\r\n const popFattestA = document.createElement('a');\r\n popFattestA.textContent = 'Pop Single Fattest';\r\n popFattestA.className = 'option';\r\n popFattestA.onclick = function () {\r\n if (CacheWrinklersFattest[1] !== null) Game.wrinklers[CacheWrinklersFattest[1]].hp = 0;\r\n };\r\n popFattestFrag.appendChild(popFattestA);\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n `Rewards of Popping Single Fattest Non-Shiny Wrinkler (id: ${\r\n CacheWrinklersFattest[1] !== null ? CacheWrinklersFattest[1] : 'None'\r\n })`,\r\n popFattestFrag,\r\n ),\r\n );\r\n }\r\n }\r\n\r\n stats.appendChild(CreateSections.SeasonSection());\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Achievements', 'Achievs'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Achievs) {\r\n Object.keys(Game.Objects).forEach((i) => {\r\n const ObjectsTillNext = CacheObjectsNextAchievement[i];\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n i,\r\n ObjectsTillNext.AmountNeeded < 101\r\n ? document.createTextNode(\r\n `Next achievement in ${ObjectsTillNext.AmountNeeded}, price: ${Beautify(\r\n ObjectsTillNext.price,\r\n )}`,\r\n )\r\n : document.createTextNode('No new achievement for next 100 buildings'),\r\n ),\r\n );\r\n });\r\n }\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Miscellaneous', 'Misc'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Misc) {\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n `Average cookies per second (past ${\r\n CookieTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist\r\n ] < 60\r\n ? `${\r\n CookieTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist\r\n ]\r\n } seconds`\r\n : CookieTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist\r\n ] /\r\n 60 +\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist === 3\r\n ? ' minute'\r\n : ' minutes')\r\n })`,\r\n document.createTextNode(Beautify(GetCPS(), 3)),\r\n ),\r\n );\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n `Average cookie clicks per second (past ${\r\n ClickTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist\r\n ]\r\n }${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist === 0\r\n ? ' second'\r\n : ' seconds'\r\n })`,\r\n document.createTextNode(Beautify(CacheAverageClicks, 1)),\r\n ),\r\n );\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n `Cookies from clicking (past ${\r\n ClickTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist\r\n ]\r\n }${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist === 0\r\n ? ' second'\r\n : ' seconds'\r\n })`,\r\n document.createTextNode(\r\n Beautify(\r\n CacheAverageCookiesFromClicks.calcSum(\r\n CacheAverageClicks *\r\n ClickTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist\r\n ],\r\n ),\r\n ),\r\n ),\r\n ),\r\n );\r\n if (Game.Has('Fortune cookies')) {\r\n const fortunes = [];\r\n Object.keys(GameData.Fortunes).forEach((i) => {\r\n if (!Game.Has(GameData.Fortunes[i])) {\r\n fortunes.push(GameData.Fortunes[i]);\r\n }\r\n });\r\n if (fortunes.length !== 0)\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n 'Fortune Upgrades Left to Buy',\r\n CreateElements.StatsMissDisp(fortunes),\r\n ),\r\n );\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ShowMissedGC) {\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n 'Missed golden cookies',\r\n document.createTextNode(Beautify(Game.missedGoldenClicks)),\r\n ),\r\n );\r\n }\r\n if (Game.prefs.autosave) {\r\n const timer = document.createElement('span');\r\n timer.id = 'CMStatsAutosaveTimer';\r\n timer.innerText = Game.sayTime(\r\n Game.fps * 60 - (Game.OnAscend ? 0 : Game.T % (Game.fps * 60)),\r\n 4,\r\n );\r\n stats.appendChild(CreateElements.StatsListing('basic', 'Time till autosave', timer));\r\n }\r\n }\r\n\r\n l('menu').insertBefore(stats, l('menu').childNodes[2]);\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingUpgrades) {\r\n AddMissingUpgrades();\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingAchievements) {\r\n AddMissingAchievements();\r\n }\r\n}\r\n","/** Functions to create the individual sections of the Statistics page */\r\n\r\nimport * as GameData from '../../../Data/Gamedata';\r\nimport { MaxChainCookieReward } from '../../../Cache/Stats/ChainCookies';\r\nimport {\r\n CacheAvgCPSWithChoEgg,\r\n CacheCentEgg,\r\n CacheChainFrenzyMaxReward,\r\n CacheChainFrenzyRequired,\r\n CacheChainFrenzyRequiredNext,\r\n CacheChainFrenzyWrathRequired,\r\n CacheChainFrenzyWrathRequiredNext,\r\n CacheChainMaxReward,\r\n CacheChainRequired,\r\n CacheChainRequiredNext,\r\n CacheChainWrathMaxReward,\r\n CacheChainWrathRequired,\r\n CacheChainWrathRequiredNext,\r\n CacheConjure,\r\n CacheConjureReward,\r\n CacheDragonsFortuneMultAdjustment,\r\n CacheEdifice,\r\n CacheEdificeBuilding,\r\n CacheGoldenCookiesMult,\r\n CacheHCPerSecond,\r\n CacheLastChoEgg,\r\n CacheLucky,\r\n CacheLuckyFrenzy,\r\n CacheLuckyReward,\r\n CacheLuckyRewardFrenzy,\r\n CacheLuckyWrathReward,\r\n CacheLuckyWrathRewardFrenzy,\r\n CacheNoGoldSwitchCookiesPS,\r\n CacheRealCookiesEarned,\r\n CacheSeaSpec,\r\n CacheWrathCookiesMult,\r\n CacheWrinklersTotal,\r\n} from '../../../Cache/VariablesAndData';\r\nimport ResetBonus from '../../../Sim/SimulationEvents/ResetAscension';\r\nimport CalculateLuckyLevels from '../../HelperFunctions/CalculateLuckyLevels';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../../HelperFunctions/GetWrinkConfigBank';\r\nimport { ColourGreen, ColourRed, ColourTextPre } from '../../VariablesAndData';\r\nimport {\r\n StatsListing,\r\n StatsHeader,\r\n StatsMissDisp,\r\n StatsMissDispListing,\r\n} from './CreateDOMElements';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../BeautifyAndFormatting/FormatTime';\r\n\r\n/**\r\n * This function creates the \"Lucky\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Lucky section\r\n */\r\nexport function LuckySection() {\r\n // This sets which tooltip to display for certain stats\r\n const goldCookTooltip = Game.auraMult(\"Dragon's Fortune\")\r\n ? 'GoldCookDragonsFortuneTooltipPlaceholder'\r\n : 'GoldCookTooltipPlaceholder';\r\n\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsLuckySection';\r\n\r\n const luckyColour = Game.cookies + GetWrinkConfigBank() < CacheLucky ? ColourRed : ColourGreen;\r\n const luckyTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheLucky\r\n ? FormatTime((CacheLucky - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const luckyReqFrag = document.createDocumentFragment();\r\n const luckyReqSpan = document.createElement('span');\r\n luckyReqSpan.style.fontWeight = 'bold';\r\n luckyReqSpan.className = ColourTextPre + luckyColour;\r\n luckyReqSpan.textContent = Beautify(CacheLucky);\r\n luckyReqFrag.appendChild(luckyReqSpan);\r\n if (luckyTime !== '') {\r\n const luckyReqSmall = document.createElement('small');\r\n luckyReqSmall.textContent = ` (${luckyTime})`;\r\n luckyReqFrag.appendChild(luckyReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing('withTooltip', '\"Lucky!\" cookies required', luckyReqFrag, goldCookTooltip),\r\n );\r\n\r\n const luckyColourFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheLuckyFrenzy ? ColourRed : ColourGreen;\r\n const luckyTimeFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheLuckyFrenzy\r\n ? FormatTime((CacheLuckyFrenzy - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const luckyReqFrenFrag = document.createDocumentFragment();\r\n const luckyReqFrenSpan = document.createElement('span');\r\n luckyReqFrenSpan.style.fontWeight = 'bold';\r\n luckyReqFrenSpan.className = ColourTextPre + luckyColourFrenzy;\r\n luckyReqFrenSpan.textContent = Beautify(CacheLuckyFrenzy);\r\n luckyReqFrenFrag.appendChild(luckyReqFrenSpan);\r\n if (luckyTimeFrenzy !== '') {\r\n const luckyReqFrenSmall = document.createElement('small');\r\n luckyReqFrenSmall.textContent = ` (${luckyTimeFrenzy})`;\r\n luckyReqFrenFrag.appendChild(luckyReqFrenSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Lucky!\" cookies required (frenzy)',\r\n luckyReqFrenFrag,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const luckySplit = CacheLuckyReward !== CacheLuckyWrathReward;\r\n\r\n const luckyRewardMaxSpan = document.createElement('span');\r\n luckyRewardMaxSpan.style.fontWeight = 'bold';\r\n luckyRewardMaxSpan.className = ColourTextPre + CacheLuckyReward;\r\n luckyRewardMaxSpan.textContent =\r\n Beautify(CacheLuckyReward) + (luckySplit ? ` / ${Beautify(CacheLuckyWrathReward)}` : '');\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n `\"Lucky!\" reward (max)${luckySplit ? ' (golden / wrath)' : ''}`,\r\n luckyRewardMaxSpan,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const luckyRewardFrenzyMaxSpan = document.createElement('span');\r\n luckyRewardFrenzyMaxSpan.style.fontWeight = 'bold';\r\n luckyRewardFrenzyMaxSpan.className = ColourTextPre + luckyRewardFrenzyMaxSpan;\r\n luckyRewardFrenzyMaxSpan.textContent =\r\n Beautify(CacheLuckyRewardFrenzy) +\r\n (luckySplit ? ` / ${Beautify(CacheLuckyWrathRewardFrenzy)}` : '');\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n `\"Lucky!\" reward (max) (frenzy)${luckySplit ? ' (golden / wrath)' : ''}`,\r\n luckyRewardFrenzyMaxSpan,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const luckyCurBase =\r\n Math.min(\r\n (Game.cookies + GetWrinkConfigBank()) * 0.15,\r\n CacheNoGoldSwitchCookiesPS * CacheDragonsFortuneMultAdjustment * 60 * 15,\r\n ) + 13;\r\n const luckyCurSpan = document.createElement('span');\r\n luckyCurSpan.style.fontWeight = 'bold';\r\n luckyCurSpan.className = ColourTextPre + luckyCurSpan;\r\n luckyCurSpan.textContent =\r\n Beautify(CacheGoldenCookiesMult * luckyCurBase) +\r\n (luckySplit ? ` / ${Beautify(CacheWrathCookiesMult * luckyCurBase)}` : '');\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n `\"Lucky!\" reward (cur)${luckySplit ? ' (golden / wrath)' : ''}`,\r\n luckyCurSpan,\r\n goldCookTooltip,\r\n ),\r\n );\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Chain\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Chain section\r\n */\r\nexport function ChainSection() {\r\n // This sets which tooltip to display for certain stats\r\n const goldCookTooltip = Game.auraMult(\"Dragon's Fortune\")\r\n ? 'GoldCookDragonsFortuneTooltipPlaceholder'\r\n : 'GoldCookTooltipPlaceholder';\r\n\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsChainSection';\r\n\r\n const chainColour =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainRequired ? ColourRed : ColourGreen;\r\n const chainTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainRequired\r\n ? FormatTime((CacheChainRequired - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const chainReqFrag = document.createDocumentFragment();\r\n const chainReqSpan = document.createElement('span');\r\n chainReqSpan.style.fontWeight = 'bold';\r\n chainReqSpan.className = ColourTextPre + chainColour;\r\n chainReqSpan.textContent = Beautify(CacheChainRequired);\r\n chainReqFrag.appendChild(chainReqSpan);\r\n if (chainTime !== '') {\r\n const chainReqSmall = document.createElement('small');\r\n chainReqSmall.textContent = ` (${chainTime})`;\r\n chainReqFrag.appendChild(chainReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing('withTooltip', '\"Chain\" cookies required', chainReqFrag, goldCookTooltip),\r\n );\r\n\r\n const chainWrathColour =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainWrathRequired ? ColourRed : ColourGreen;\r\n const chainWrathTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainWrathRequired\r\n ? FormatTime((CacheChainWrathRequired - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const chainWrathReqFrag = document.createDocumentFragment();\r\n const chainWrathReqSpan = document.createElement('span');\r\n chainWrathReqSpan.style.fontWeight = 'bold';\r\n chainWrathReqSpan.className = ColourTextPre + chainWrathColour;\r\n chainWrathReqSpan.textContent = Beautify(CacheChainWrathRequired);\r\n chainWrathReqFrag.appendChild(chainWrathReqSpan);\r\n if (chainWrathTime !== '') {\r\n const chainWrathReqSmall = document.createElement('small');\r\n chainWrathReqSmall.textContent = ` (${chainWrathTime})`;\r\n chainWrathReqFrag.appendChild(chainWrathReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" cookies required (Wrath)',\r\n chainWrathReqFrag,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const chainColourFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainFrenzyRequired ? ColourRed : ColourGreen;\r\n const chainTimeFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainFrenzyRequired\r\n ? FormatTime((CacheChainFrenzyRequired - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const chainReqFrenFrag = document.createDocumentFragment();\r\n const chainReqFrenSpan = document.createElement('span');\r\n chainReqFrenSpan.style.fontWeight = 'bold';\r\n chainReqFrenSpan.className = ColourTextPre + chainColourFrenzy;\r\n chainReqFrenSpan.textContent = Beautify(CacheChainFrenzyRequired);\r\n chainReqFrenFrag.appendChild(chainReqFrenSpan);\r\n if (chainTimeFrenzy !== '') {\r\n const chainReqFrenSmall = document.createElement('small');\r\n chainReqFrenSmall.textContent = ` (${chainTimeFrenzy})`;\r\n chainReqFrenFrag.appendChild(chainReqFrenSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" cookies required (Frenzy)',\r\n chainReqFrenFrag,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const chainWrathColourFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainFrenzyWrathRequired ? ColourRed : ColourGreen;\r\n const chainWrathTimeFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainFrenzyWrathRequired\r\n ? FormatTime(\r\n (CacheChainFrenzyWrathRequired - (Game.cookies + GetWrinkConfigBank())) / GetCPS(),\r\n )\r\n : '';\r\n const chainWrathReqFrenFrag = document.createDocumentFragment();\r\n const chainWrathReqFrenSpan = document.createElement('span');\r\n chainWrathReqFrenSpan.style.fontWeight = 'bold';\r\n chainWrathReqFrenSpan.className = ColourTextPre + chainWrathColourFrenzy;\r\n chainWrathReqFrenSpan.textContent = Beautify(CacheChainFrenzyWrathRequired);\r\n chainWrathReqFrenFrag.appendChild(chainWrathReqFrenSpan);\r\n if (chainWrathTimeFrenzy !== '') {\r\n const chainWrathReqFrenSmall = document.createElement('small');\r\n chainWrathReqFrenSmall.textContent = ` (${chainWrathTimeFrenzy})`;\r\n chainWrathReqFrenFrag.appendChild(chainWrathReqFrenSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" cookies required (frenzy) (Wrath)',\r\n chainWrathReqFrenFrag,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" reward (max) (golden / wrath)',\r\n document.createTextNode(\r\n `${Beautify(CacheChainMaxReward[0])} / ${Beautify(CacheChainWrathMaxReward[0])}`,\r\n ),\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" reward (max) (frenzy) (golden / wrath)',\r\n document.createTextNode(\r\n `${Beautify(CacheChainFrenzyMaxReward[0])} / ${Beautify(CacheChainFrenzyMaxReward[0])}`,\r\n ),\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const chainCurMax = Math.min(\r\n Game.cookiesPs * 60 * 60 * 6 * CacheDragonsFortuneMultAdjustment,\r\n Game.cookies * 0.5,\r\n );\r\n const chainCur = MaxChainCookieReward(7, chainCurMax, CacheGoldenCookiesMult)[0];\r\n const chainCurWrath = MaxChainCookieReward(6, chainCurMax, CacheWrathCookiesMult)[0];\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" reward (cur) (golden / wrath)',\r\n document.createTextNode(`${Beautify(chainCur)} / ${Beautify(chainCurWrath)}`),\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'CPS needed for next level (g / w)',\r\n document.createTextNode(\r\n `${Beautify(CacheChainRequiredNext)} / ${Beautify(CacheChainWrathRequiredNext)}`,\r\n ),\r\n 'ChainNextLevelPlaceholder',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'CPS needed for next level (frenzy) (g / w)',\r\n document.createTextNode(\r\n `${Beautify(CacheChainFrenzyRequiredNext)} / ${Beautify(\r\n CacheChainFrenzyWrathRequiredNext,\r\n )}`,\r\n ),\r\n 'ChainNextLevelPlaceholder',\r\n ),\r\n );\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Spells\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Spells section\r\n */\r\nexport function SpellsSection() {\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsSpellsSection';\r\n\r\n const conjureColour =\r\n Game.cookies + GetWrinkConfigBank() < CacheConjure ? ColourRed : ColourGreen;\r\n const conjureTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheConjure\r\n ? FormatTime((CacheConjure - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n\r\n const conjureReqFrag = document.createDocumentFragment();\r\n const conjureReqSpan = document.createElement('span');\r\n conjureReqSpan.style.fontWeight = 'bold';\r\n conjureReqSpan.className = ColourTextPre + conjureColour;\r\n conjureReqSpan.textContent = Beautify(CacheConjure);\r\n conjureReqFrag.appendChild(conjureReqSpan);\r\n if (conjureTime !== '') {\r\n const conjureReqSmall = document.createElement('small');\r\n conjureReqSmall.textContent = ` (${conjureTime})`;\r\n conjureReqFrag.appendChild(conjureReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" cookies required',\r\n conjureReqFrag,\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" reward (max)',\r\n document.createTextNode(Beautify(CacheConjureReward)),\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n\r\n const conjureFrenzyColour =\r\n Game.cookies + GetWrinkConfigBank() < CacheConjure * 7 ? ColourRed : ColourGreen;\r\n const conjureFrenzyCur = Math.min(\r\n (Game.cookies + GetWrinkConfigBank()) * 0.15,\r\n CacheNoGoldSwitchCookiesPS * 60 * 30,\r\n );\r\n const conjureFrenzyTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheConjure * 7\r\n ? FormatTime((CacheConjure * 7 - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n\r\n const conjureFrenzyReqFrag = document.createDocumentFragment();\r\n const conjureFrenzyReqSpan = document.createElement('span');\r\n conjureFrenzyReqSpan.style.fontWeight = 'bold';\r\n conjureFrenzyReqSpan.className = ColourTextPre + conjureFrenzyColour;\r\n conjureFrenzyReqSpan.textContent = Beautify(CacheConjure * 7);\r\n conjureFrenzyReqFrag.appendChild(conjureFrenzyReqSpan);\r\n if (conjureFrenzyTime !== '') {\r\n const conjureFrenzyReqSmall = document.createElement('small');\r\n conjureFrenzyReqSmall.textContent = ` (${conjureFrenzyTime})`;\r\n conjureFrenzyReqFrag.appendChild(conjureFrenzyReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" cookies required (frenzy)',\r\n conjureFrenzyReqFrag,\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" reward (max) (frenzy)',\r\n document.createTextNode(Beautify(CacheConjureReward * 7)),\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" reward (cur)',\r\n document.createTextNode(Beautify(conjureFrenzyCur)),\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n if (CacheEdifice) {\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Spontaneous Edifice\" cookies required (most expensive building)',\r\n document.createTextNode(`${Beautify(CacheEdifice)} (${CacheEdificeBuilding})`),\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n }\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Garden\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Spells section\r\n */\r\nexport function GardenSection() {\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsGardenSection';\r\n\r\n const bakeberryColour = Game.cookies < Game.cookiesPs * 60 * 10 * 100 ? ColourRed : ColourGreen;\r\n const bakeberryFrag = document.createElement('span');\r\n bakeberryFrag.style.fontWeight = 'bold';\r\n bakeberryFrag.className = ColourTextPre + bakeberryColour;\r\n bakeberryFrag.textContent = Beautify(Game.cookiesPs * 60 * 10 * 100);\r\n section.appendChild(\r\n StatsListing('basic', 'Cookies required for max reward of Bakeberry: ', bakeberryFrag),\r\n );\r\n\r\n const chocorootColour = Game.cookies < Game.cookiesPs * 60 * 100 ? ColourRed : ColourGreen;\r\n const chocorootFrag = document.createElement('span');\r\n chocorootFrag.style.fontWeight = 'bold';\r\n chocorootFrag.className = ColourTextPre + chocorootColour;\r\n chocorootFrag.textContent = Beautify(Game.cookiesPs * 60 * 100);\r\n section.appendChild(\r\n StatsListing('basic', 'Cookies required for max reward of Chocoroot: ', chocorootFrag),\r\n );\r\n\r\n const queenbeetColour = Game.cookies < Game.cookiesPs * 60 * 60 * 25 ? ColourRed : ColourGreen;\r\n const queenbeetFrag = document.createElement('span');\r\n queenbeetFrag.style.fontWeight = 'bold';\r\n queenbeetFrag.className = ColourTextPre + queenbeetColour;\r\n queenbeetFrag.textContent = Beautify(Game.cookiesPs * 60 * 60 * 25);\r\n section.appendChild(\r\n StatsListing('basic', 'Cookies required for max reward of Queenbeet: ', queenbeetFrag),\r\n );\r\n\r\n const duketaterColour = Game.cookies < Game.cookiesPs * 60 * 15 * 100 ? ColourRed : ColourGreen;\r\n const duketaterFrag = document.createElement('span');\r\n duketaterFrag.style.fontWeight = 'bold';\r\n duketaterFrag.className = ColourTextPre + duketaterColour;\r\n duketaterFrag.textContent = Beautify(Game.cookiesPs * 60 * 15 * 100);\r\n section.appendChild(\r\n StatsListing('basic', 'Cookies required for max reward of Duketater: ', duketaterFrag),\r\n );\r\n const missingPlantDrops = [];\r\n Object.keys(GameData.PlantDrops).forEach((i) => {\r\n if (!Game.HasUnlocked(GameData.PlantDrops[i])) {\r\n missingPlantDrops.push(GameData.PlantDrops[i]);\r\n }\r\n });\r\n if (missingPlantDrops.length !== 0) {\r\n section.appendChild(\r\n StatsListing('basic', 'Rare plant drops left to unlock', StatsMissDisp(missingPlantDrops)),\r\n );\r\n }\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Prestige\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Prestige section\r\n */\r\nexport function PrestigeSection() {\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsPrestigeSection';\r\n\r\n const possiblePresMax = Math.floor(\r\n Game.HowMuchPrestige(\r\n CacheRealCookiesEarned +\r\n Game.cookiesReset +\r\n CacheWrinklersTotal +\r\n (Game.HasUnlocked('Chocolate egg') && !Game.Has('Chocolate egg') ? CacheLastChoEgg : 0),\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'Prestige level (cur / max)',\r\n document.createTextNode(`${Beautify(Game.prestige)} / ${Beautify(possiblePresMax)}`),\r\n 'PrestMaxTooltipPlaceholder',\r\n ),\r\n );\r\n\r\n const neededCook = Math.max(\r\n 0,\r\n Game.HowManyCookiesReset(possiblePresMax + 1) -\r\n (CacheRealCookiesEarned +\r\n Game.cookiesReset +\r\n CacheWrinklersTotal +\r\n ((Game.HasUnlocked('Chocolate egg') && !Game.Has('Chocolate egg') ? CacheLastChoEgg : 0)\r\n ? CacheLastChoEgg\r\n : 0)),\r\n );\r\n const cookiesNextFrag = document.createDocumentFragment();\r\n cookiesNextFrag.appendChild(document.createTextNode(Beautify(neededCook)));\r\n const cookiesNextSmall = document.createElement('small');\r\n cookiesNextSmall.textContent = ` (${FormatTime(neededCook / CacheAvgCPSWithChoEgg, 1)})`;\r\n cookiesNextFrag.appendChild(cookiesNextSmall);\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'Cookies to next level',\r\n cookiesNextFrag,\r\n 'NextPrestTooltipPlaceholder',\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'Heavenly chips (cur / max)',\r\n document.createTextNode(\r\n `${Beautify(Game.heavenlyChips)} / ${Beautify(\r\n possiblePresMax - Game.prestige + Game.heavenlyChips,\r\n )}`,\r\n ),\r\n 'HeavenChipMaxTooltipPlaceholder',\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'basic',\r\n 'Heavenly chips per second (last 5 seconds)',\r\n document.createTextNode(Beautify(CacheHCPerSecond, 2)),\r\n ),\r\n );\r\n\r\n const HCTarget = Number(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.HeavenlyChipsTarget,\r\n );\r\n if (!Number.isNaN(HCTarget)) {\r\n const CookiesTillTarget =\r\n HCTarget - Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned));\r\n if (CookiesTillTarget > 0) {\r\n section.appendChild(\r\n StatsListing(\r\n 'basic',\r\n 'Heavenly chips to target set in settings (cur)',\r\n document.createTextNode(Beautify(CookiesTillTarget)),\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'basic',\r\n 'Time till target (cur, current 5 second average)',\r\n document.createTextNode(FormatTime(CookiesTillTarget / CacheHCPerSecond)),\r\n ),\r\n );\r\n }\r\n }\r\n\r\n const resetBonus = ResetBonus(possiblePresMax);\r\n const resetFrag = document.createDocumentFragment();\r\n resetFrag.appendChild(document.createTextNode(Beautify(resetBonus)));\r\n const increase = Math.round((resetBonus / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n const resetSmall = document.createElement('small');\r\n resetSmall.textContent = ` (${increase / 100}% of income)`;\r\n resetFrag.appendChild(resetSmall);\r\n }\r\n section.appendChild(\r\n StatsListing('withTooltip', 'Reset bonus income', resetFrag, 'ResetTooltipPlaceholder'),\r\n );\r\n\r\n const currentPrestige = Math.floor(Game.HowMuchPrestige(Game.cookiesReset));\r\n const willHave = Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned));\r\n const willGet = willHave - currentPrestige;\r\n const {\r\n luckyDigit,\r\n luckyNumber,\r\n luckyPayout\r\n } = CalculateLuckyLevels(willHave);\r\n if (!Game.Has('Lucky digit')) {\r\n const luckyDigitDelta = luckyDigit - willHave;\r\n const luckyDigitReset = willGet + luckyDigitDelta;\r\n const fragLuckyDigit = document.createDocumentFragment();\r\n fragLuckyDigit.appendChild(\r\n document.createTextNode(\r\n `${luckyDigit.toLocaleString()} / ${luckyDigitReset.toLocaleString()} (+${luckyDigitDelta})`,\r\n ),\r\n );\r\n section.appendChild(StatsListing('basic', 'Next \"Lucky Digit\" (total / reset)', fragLuckyDigit));\r\n }\r\n\r\n if (!Game.Has('Lucky number')) {\r\n const luckyNumberDelta = luckyNumber - willHave;\r\n const luckyNumberReset = willGet + luckyNumberDelta;\r\n const fragLuckyNumber = document.createDocumentFragment();\r\n fragLuckyNumber.appendChild(\r\n document.createTextNode(\r\n `${luckyNumber.toLocaleString()} / ${luckyNumberReset.toLocaleString()} (+${luckyNumberDelta})`,\r\n ),\r\n );\r\n section.appendChild(StatsListing('basic', 'Next \"Lucky Number\" (total / reset)', fragLuckyNumber));\r\n }\r\n\r\n if (!Game.Has('Lucky payout')) {\r\n const luckyPayoutDelta = luckyPayout - willHave;\r\n const luckyPayoutReset = willGet + luckyPayoutDelta;\r\n const fragLuckyPayout = document.createDocumentFragment();\r\n fragLuckyPayout.appendChild(\r\n document.createTextNode(\r\n `${luckyPayout.toLocaleString()} / ${luckyPayoutReset.toLocaleString()} (+${luckyPayoutDelta})`,\r\n ),\r\n );\r\n section.appendChild(StatsListing('basic', 'Next \"Lucky Payout\" (total / reset)', fragLuckyPayout));\r\n }\r\n\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Season Specials\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Season Specials section\r\n */\r\nexport function SeasonSection() {\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsSeasonSection';\r\n\r\n let specDisp = false;\r\n const missingHalloweenCookies = [];\r\n Object.keys(GameData.HalloCookies).forEach((i) => {\r\n if (!Game.Has(GameData.HalloCookies[i])) {\r\n missingHalloweenCookies.push(GameData.HalloCookies[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const missingChristmasCookies = [];\r\n Object.keys(GameData.ChristCookies).forEach((i) => {\r\n if (!Game.Has(GameData.ChristCookies[i])) {\r\n missingChristmasCookies.push(GameData.ChristCookies[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const missingValentineCookies = [];\r\n Object.keys(GameData.ValCookies).forEach((i) => {\r\n if (!Game.Has(GameData.ValCookies[i])) {\r\n missingValentineCookies.push(GameData.ValCookies[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const missingNormalEggs = [];\r\n Object.keys(Game.eggDrops).forEach((i) => {\r\n if (!Game.HasUnlocked(Game.eggDrops[i])) {\r\n missingNormalEggs.push(Game.eggDrops[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const missingRareEggs = [];\r\n Object.keys(Game.rareEggDrops).forEach((i) => {\r\n if (!Game.HasUnlocked(Game.rareEggDrops[i])) {\r\n missingRareEggs.push(Game.rareEggDrops[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const choEgg = Game.HasUnlocked('Chocolate egg') && !Game.Has('Chocolate egg');\r\n const centEgg = Game.Has('Century egg');\r\n\r\n if (Game.season === 'christmas' || specDisp || choEgg || centEgg) {\r\n section.appendChild(StatsHeader('Season Specials', 'Sea'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Sea) {\r\n if (missingHalloweenCookies.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Halloween cookies left to buy',\r\n StatsMissDisp(missingHalloweenCookies),\r\n Game.season === 'halloween',\r\n ),\r\n );\r\n let failRateHalloween = 0.95;\r\n if (Game.HasAchiev('Spooky cookies')) failRateHalloween = 0.8;\r\n if (Game.Has('Starterror')) failRateHalloween *= 0.9;\r\n failRateHalloween *= 1 / Game.dropRateMult();\r\n if (Game.hasGod) {\r\n const godLvl = Game.hasGod('seasons');\r\n if (godLvl === 1) failRateHalloween *= 0.9;\r\n else if (godLvl === 2) failRateHalloween *= 0.95;\r\n else if (godLvl === 3) failRateHalloween *= 0.97;\r\n }\r\n const obtainedCookiesChance = missingHalloweenCookies.length / 7;\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Chance of receiving a cookie from wrinkler/shiny wrinkler',\r\n document.createTextNode(\r\n `${Beautify((1 - failRateHalloween) * obtainedCookiesChance * 100)}% / ${Beautify(\r\n (1 - failRateHalloween * 0.9) * obtainedCookiesChance * 100,\r\n )}%`,\r\n ),\r\n Game.season === 'halloween',\r\n ),\r\n );\r\n }\r\n if (missingChristmasCookies.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Christmas cookies left to buy',\r\n StatsMissDisp(missingChristmasCookies),\r\n Game.season === 'christmas',\r\n ),\r\n );\r\n let failRateChristmas = 0.8;\r\n if (Game.HasAchiev('Let it snow')) failRateChristmas = 0.6;\r\n failRateChristmas *= 1 / Game.dropRateMult();\r\n if (Game.Has('Starsnow')) failRateChristmas *= 0.95;\r\n if (Game.hasGod) {\r\n const godLvl = Game.hasGod('seasons');\r\n if (godLvl === 1) failRateChristmas *= 0.9;\r\n else if (godLvl === 2) failRateChristmas *= 0.95;\r\n else if (godLvl === 3) failRateChristmas *= 0.97;\r\n }\r\n const obtainedCookiesChance = missingChristmasCookies.length / 7;\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Chance of receiving a cookie from reindeer',\r\n document.createTextNode(\r\n `${Beautify((1 - failRateChristmas) * obtainedCookiesChance * 100)}%`,\r\n ),\r\n Game.season === 'christmas',\r\n ),\r\n );\r\n }\r\n if (missingValentineCookies.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Valentine cookies left to buy',\r\n StatsMissDisp(missingValentineCookies),\r\n Game.season === 'valentines',\r\n ),\r\n );\r\n }\r\n const dropRateEgg = function (StartingFailRate) {\r\n let failRateEgg = StartingFailRate * (1 / Game.dropRateMult());\r\n if (Game.HasAchiev('Hide & seek champion')) failRateEgg *= 0.7;\r\n if (Game.Has('Omelette')) failRateEgg *= 0.9;\r\n if (Game.Has('Starspawn')) failRateEgg *= 0.9;\r\n if (Game.hasGod) {\r\n const godLvl = Game.hasGod('seasons');\r\n if (godLvl === 1) failRateEgg *= 0.9;\r\n else if (godLvl === 2) failRateEgg *= 0.95;\r\n else if (godLvl === 3) failRateEgg *= 0.97;\r\n }\r\n // Calculations courtesy of @svschouw, at https://github.com/Aktanusa/CookieMonster/issues/25\r\n const succesRateEgg = 1 - failRateEgg;\r\n const obtainedEggs = Game.eggDrops.length - missingNormalEggs.length;\r\n const obtainedRareEggs = Game.rareEggDrops.length - missingRareEggs.length;\r\n const pNormal1 = succesRateEgg * 0.9 * (1 - obtainedEggs / Game.eggDrops.length);\r\n const pRare1 = succesRateEgg * 0.1 * (1 - obtainedRareEggs / Game.rareEggDrops.length);\r\n const pRedropNormal = succesRateEgg * 0.9 * (obtainedEggs / Game.eggDrops.length);\r\n const pRedropRare = succesRateEgg * 0.1 * (obtainedRareEggs / Game.rareEggDrops.length);\r\n const pRedrop = pRedropNormal + pRedropRare;\r\n const pNormal2 = pRedrop * 0.9 * (1 - obtainedEggs / Game.eggDrops.length);\r\n const pRare2 = pRedrop * 0.1 * (1 - obtainedRareEggs / Game.rareEggDrops.length);\r\n return [pNormal1 + pNormal2, pRare1 + pRare2];\r\n };\r\n if (missingNormalEggs.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Normal easter eggs left to unlock',\r\n StatsMissDisp(missingNormalEggs),\r\n Game.season === 'easter',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Chance of receiving an egg from wrinkler/golden cookie',\r\n document.createTextNode(\r\n `${Beautify(dropRateEgg(0.98)[0] * 100)}% / ${Beautify(dropRateEgg(0.9)[0] * 100)}%`,\r\n ),\r\n Game.season === 'easter',\r\n ),\r\n );\r\n }\r\n if (missingRareEggs.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Rare easter eggs left to unlock',\r\n StatsMissDisp(missingRareEggs),\r\n Game.season === 'easter',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Chance of receiving a rare egg from wrinkler/golden cookie',\r\n document.createTextNode(\r\n `${Beautify(dropRateEgg(0.98)[1] * 100)}% / ${Beautify(dropRateEgg(0.9)[1] * 100)}%`,\r\n ),\r\n Game.season === 'easter',\r\n ),\r\n );\r\n }\r\n\r\n if (Game.season === 'christmas')\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Reindeer reward',\r\n document.createTextNode(Beautify(CacheSeaSpec)),\r\n true,\r\n ),\r\n );\r\n if (choEgg) {\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'Chocolate egg cookies',\r\n document.createTextNode(Beautify(CacheLastChoEgg)),\r\n 'ChoEggTooltipPlaceholder',\r\n ),\r\n );\r\n }\r\n if (centEgg) {\r\n section.appendChild(\r\n StatsListing(\r\n 'basic',\r\n 'Century egg multiplier',\r\n document.createTextNode(`${Math.round((CacheCentEgg - 1) * 10000) / 100}%`),\r\n ),\r\n );\r\n }\r\n }\r\n }\r\n return section;\r\n}\r\n","import { CacheRealCookiesEarned } from '../../Cache/VariablesAndData';\r\nimport CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport { SimAchievementsOwned, SimCookiesPs, SimPrestige, SimUpgrades } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This function calculates the cookies per click difference betwene current and after a ascension\r\n * It is called by CM.Disp.CreateStatsPrestigeSection()\r\n * @param\t{number}\tnewHeavenlyChips\tThe total heavenly chips after ascension\r\n * @returns\t{number}\tResetCPS\t\t\tThe CPS difference after reset\r\n */\r\nexport default function ResetBonus(newHeavenlyChips) {\r\n // Calculate CPS with all Heavenly upgrades\r\n let curCPS = Game.cookiesPs;\r\n\r\n CopyData();\r\n\r\n if (SimUpgrades['Heavenly key'].bought === 0) {\r\n SimUpgrades['Heavenly chip secret'].bought = 1;\r\n SimUpgrades['Heavenly cookie stand'].bought = 1;\r\n SimUpgrades['Heavenly bakery'].bought = 1;\r\n SimUpgrades['Heavenly confectionery'].bought = 1;\r\n SimUpgrades['Heavenly key'].bought = 1;\r\n\r\n CalculateGains();\r\n\r\n curCPS = SimCookiesPs;\r\n\r\n CopyData();\r\n }\r\n\r\n if (CacheRealCookiesEarned >= 1000000) SimWin('Sacrifice');\r\n if (CacheRealCookiesEarned >= 1000000000) SimWin('Oblivion');\r\n if (CacheRealCookiesEarned >= 1000000000000) SimWin('From scratch');\r\n if (CacheRealCookiesEarned >= 1000000000000000) SimWin('Nihilism');\r\n if (CacheRealCookiesEarned >= 1000000000000000000) SimWin('Dematerialize');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000) SimWin('Nil zero zilch');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000) SimWin('Transcendence');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000) SimWin('Obliterate');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000) SimWin('Negative void');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000) SimWin('To crumbs, you say?');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000) SimWin('You get nothing');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000)\r\n SimWin('Humble rebeginnings');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000)\r\n SimWin('The end of the world');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000000)\r\n SimWin(\"Oh, you're back\");\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000000000)\r\n SimWin('Lazarus');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000000000000)\r\n SimWin('Smurf account');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000000000000000)\r\n SimWin(\"If at first you don't succeed\");\r\n\r\n SimUpgrades['Heavenly chip secret'].bought = 1;\r\n SimUpgrades['Heavenly cookie stand'].bought = 1;\r\n SimUpgrades['Heavenly bakery'].bought = 1;\r\n SimUpgrades['Heavenly confectionery'].bought = 1;\r\n SimUpgrades['Heavenly key'].bought = 1;\r\n\r\n SimPrestige = newHeavenlyChips;\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n\r\n const ResetCPS = SimCookiesPs - curCPS;\r\n\r\n // Reset Pretige level after calculation as it is used in CM.Sim.CalculateGains() so can't be local\r\n SimPrestige = Game.prestige;\r\n\r\n return ResetCPS;\r\n}\r\n","function CrateTooltipLockedAchievements(me) {\r\n const tags = [];\r\n if (me.pool === 'shadow') tags.push('Shadow Achievement', '#9700cf');\r\n else tags.push('Achievement', 0);\r\n tags.push('Locked', 0);\r\n\r\n let neuromancy = 0;\r\n if (Game.Has('Neuromancy') || (Game.sesame && me.pool === 'debug')) neuromancy = 1;\r\n if (neuromancy && me.won === 0) tags.push('Click to win!', '#00c462');\r\n else if (neuromancy && me.won > 0) tags.push('Click to lose!', '#00c462');\r\n\r\n let { icon } = me;\r\n if (me.iconFunction) icon = me.iconFunction();\r\n\r\n let { desc } = me;\r\n if (me.descFunc) desc = me.descFunc('stats');\r\n\r\n let tagsStr = '';\r\n for (let i = 0; i < tags.length; i += 2) {\r\n if (i % 2 === 0)\r\n tagsStr += ` <div class=\"tag\" style=\"color:${tags[i + 1] === 0 ? '#fff' : tags[i + 1]};\">[${\r\n tags[i]\r\n }]</div>`;\r\n }\r\n tagsStr = tagsStr.substring(1);\r\n\r\n return `<div style=\"padding:8px 4px;min-width:350px;opacity:0.5\">\r\n <div class=\"icon\" style=\"float:left;margin-left:-8px;margin-top:-8px;background-position:${\r\n -icon[0] * 48\r\n }px ${-icon[1] * 48}px;\"></div>\r\n <div class=\"name\">${me.name}</div>\r\n ${tagsStr}<div class=\"line\"></div><div class=\"description\">${desc}</div></div>\r\n ${\r\n Game.sesame\r\n ? `<div style=\"font-size:9px;\">Id : ${me.id} | Order : ${Math.floor(me.order)}${\r\n me.tier ? ` | Tier : ${me.tier}` : ''\r\n }</div>`\r\n : ''\r\n }`;\r\n}\r\n\r\n/**\r\n * This function overwrites the crates of missing achievements\r\n */\r\nexport default function AddMissingAchievements() {\r\n let achievs;\r\n Object.values(document.querySelectorAll('div.title')).forEach((i) => {\r\n if (i.textContent.includes('Achievements')) {\r\n achievs = i.parentElement.querySelectorAll('div.listing.crateBox')[0];\r\n }\r\n });\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingAchievements) {\r\n Object.values(achievs.children).forEach((achievsCrate) => {\r\n if (!achievsCrate.className.includes('enabled')) {\r\n const id = achievsCrate.onclick.toString().split(/\\[(.*)\\]/gi)[1];\r\n const { icon } = Game.AchievementsById[id];\r\n // eslint-disable-next-line no-param-reassign\r\n achievsCrate.style.backgroundPosition = `${-icon[0] * 48}px ${-icon[1] * 48}px`;\r\n // eslint-disable-next-line no-param-reassign\r\n achievsCrate.onmouseover = function () {\r\n if (!Game.mouseDown) {\r\n Game.setOnCrate(this);\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(\r\n this,\r\n () =>\r\n (function () {\r\n return CrateTooltipLockedAchievements(Game.AchievementsById[id]);\r\n })(),\r\n 'top',\r\n );\r\n Game.tooltip.wobble();\r\n }\r\n };\r\n }\r\n });\r\n }\r\n}\r\n","/**\r\n * This function fixes Game.mouseY as a result of bars that are added by CookieMonster\r\n * It is called by Game.UpdateWrinklers(), Game.UpdateSpecial() and the .onmousover of the BigCookie\r\n * before execution of their actual function\r\n */\r\nexport default function FixMouseY(target) {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 0\r\n ) {\r\n const timerBarHeight = parseInt(l('CMTimerBar').style.height, 10);\r\n Game.mouseY -= timerBarHeight;\r\n target();\r\n Game.mouseY += timerBarHeight;\r\n } else {\r\n target();\r\n }\r\n}\r\n","import jscolor from '@eastdesire/jscolor';\r\n\r\nimport CMBeautify from '../../Disp/BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../Disp/BeautifyAndFormatting/FormatTime';\r\nimport { AddAuraInfo, AddDragonLevelUpTooltip } from '../../Disp/Dragon/Dragon';\r\nimport AddMenu from '../../Disp/MenuSections/AddMenus';\r\nimport UpdateTitle from '../../Disp/TabTitle/TabTitle';\r\nimport ReplaceAscendTooltip from '../../Disp/Tooltips/AscendButton';\r\nimport UpdateTooltipLocation from '../../Disp/Tooltips/PositionLocation';\r\nimport { CMSayTime, Title } from '../../Disp/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport { SimDoSims } from '../../Sim/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport ReplaceTooltipUpgrade from '../ReplaceGameElements/TooltipUpgrades';\r\nimport {\r\n BackupFunctions,\r\n CenturyDateAtBeginLoop, // eslint-disable-line no-unused-vars\r\n CycliusDateAtBeginLoop, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\nimport FixMouseY from './FixMouse';\r\n\r\n/**\r\n * This function replaces certain native (from the base-game) functions\r\n */\r\nexport default function ReplaceNative() {\r\n // eslint-disable-next-line no-undef\r\n BackupFunctions.Beautify = Beautify;\r\n // eslint-disable-next-line no-undef\r\n Beautify = CMBeautify;\r\n\r\n BackupFunctions.CalculateGains = Game.CalculateGains;\r\n Game.CalculateGains = function () {\r\n BackupFunctions.CalculateGains();\r\n SimDoSims = 1;\r\n CycliusDateAtBeginLoop = Date.now();\r\n CenturyDateAtBeginLoop = Date.now();\r\n };\r\n\r\n BackupFunctions.tooltip = {};\r\n BackupFunctions.tooltip.draw = Game.tooltip.draw;\r\n BackupFunctions.tooltip.drawMod = new Function( // eslint-disable-line no-new-func\r\n `return ${Game.tooltip.draw.toString().split('this').join('Game.tooltip')}`,\r\n )();\r\n Game.tooltip.draw = function (from, text, origin) {\r\n BackupFunctions.tooltip.drawMod(from, text, origin);\r\n };\r\n\r\n BackupFunctions.tooltip.update = Game.tooltip.update;\r\n BackupFunctions.tooltip.updateMod = new Function( // eslint-disable-line no-new-func\r\n `return ${Game.tooltip.update.toString().split('this.').join('Game.tooltip.')}`,\r\n )();\r\n Game.tooltip.update = function () {\r\n BackupFunctions.tooltip.updateMod();\r\n UpdateTooltipLocation();\r\n };\r\n\r\n BackupFunctions.UpdateWrinklers = Game.UpdateWrinklers;\r\n Game.UpdateWrinklers = function () {\r\n FixMouseY(BackupFunctions.UpdateWrinklers);\r\n };\r\n\r\n BackupFunctions.UpdateSpecial = Game.UpdateSpecial;\r\n Game.UpdateSpecial = function () {\r\n FixMouseY(BackupFunctions.UpdateSpecial);\r\n };\r\n\r\n // Assumes newer browsers\r\n l('bigCookie').removeEventListener('click', Game.ClickCookie, false);\r\n l('bigCookie').addEventListener(\r\n 'click',\r\n (event) => {\r\n FixMouseY(() => Game.ClickCookie(event, 0));\r\n },\r\n false,\r\n );\r\n\r\n BackupFunctions.RebuildUpgrades = Game.RebuildUpgrades;\r\n Game.RebuildUpgrades = function () {\r\n BackupFunctions.RebuildUpgrades();\r\n ReplaceTooltipUpgrade();\r\n Game.CalculateGains();\r\n };\r\n\r\n BackupFunctions.ClickProduct = Game.ClickProduct;\r\n /**\r\n * This function adds a check to the purchase of a building to allow BulkBuyBlock to work.\r\n * If the options is 1 (on) bulkPrice is under cookies you can't buy the building.\r\n */\r\n Game.ClickProduct = function (what) {\r\n if (\r\n !Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BulkBuyBlock ||\r\n Game.ObjectsById[what].bulkPrice <= Game.cookies ||\r\n Game.buyMode === -1\r\n ) {\r\n BackupFunctions.ClickProduct(what);\r\n }\r\n };\r\n\r\n BackupFunctions.DescribeDragonAura = Game.DescribeDragonAura;\r\n /**\r\n * This function adds the function CM.Disp.AddAuraInfo() to Game.DescribeDragonAura()\r\n * This adds information about CPS differences and costs to the aura choosing interface\r\n * @param\t{number}\taura\tThe number of the aura currently selected by the mouse/user\r\n */\r\n Game.DescribeDragonAura = function (aura) {\r\n BackupFunctions.DescribeDragonAura(aura);\r\n AddAuraInfo(aura);\r\n };\r\n\r\n BackupFunctions.ToggleSpecialMenu = Game.ToggleSpecialMenu;\r\n /**\r\n * This function adds the code to display the tooltips for the levelUp button of the dragon\r\n */\r\n Game.ToggleSpecialMenu = function (on) {\r\n BackupFunctions.ToggleSpecialMenu(on);\r\n AddDragonLevelUpTooltip();\r\n };\r\n\r\n BackupFunctions.UpdateMenu = Game.UpdateMenu;\r\n Game.UpdateMenu = function () {\r\n if (typeof jscolor.picker === 'undefined' || typeof jscolor.picker.owner === 'undefined') {\r\n BackupFunctions.UpdateMenu();\r\n AddMenu();\r\n }\r\n };\r\n\r\n BackupFunctions.sayTime = Game.sayTime;\r\n // eslint-disable-next-line no-unused-vars\r\n CMSayTime = function (time, detail) {\r\n if (Number.isNaN(time) || time <= 0) return BackupFunctions.sayTime(time, detail);\r\n return FormatTime(time / Game.fps, 1);\r\n };\r\n\r\n BackupFunctions.Logic = Game.Logic;\r\n Game.Logic = function () {\r\n BackupFunctions.Logic();\r\n\r\n // Update tab title\r\n let title = 'Cookie Clicker';\r\n if (Game.season === 'fools') title = 'Cookie Baker';\r\n // eslint-disable-next-line no-unused-vars\r\n Title = `${Game.OnAscend ? 'Ascending! ' : ''}${CMBeautify(Game.cookies)} ${\r\n Game.cookies === 1 ? 'cookie' : 'cookies'\r\n } - ${title}`;\r\n UpdateTitle();\r\n\r\n // Since the Ascend Tooltip is not actually a tooltip we need to add our additional info here...\r\n ReplaceAscendTooltip();\r\n };\r\n}\r\n","/**\r\n * This function updates the location of the tooltip\r\n * It is called by Game.tooltip.update() because of CM.Main.ReplaceNative()\r\n */\r\nexport default function UpdateTooltipLocation() {\r\n if (Game.tooltip.origin === 'store') {\r\n let warnOffset = 0;\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLucky === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos === 1 &&\r\n l('CMDispTooltipWarningParent') !== null\r\n ) {\r\n warnOffset = l('CMDispTooltipWarningParent').clientHeight - 4;\r\n }\r\n Game.tooltip.tta.style.top = `${Math.min(\r\n parseInt(Game.tooltip.tta.style.top, 10),\r\n l('game').clientHeight +\r\n l('topBar').clientHeight -\r\n Game.tooltip.tt.clientHeight -\r\n warnOffset -\r\n 46,\r\n )}px`;\r\n }\r\n // Kept for future possible use if the code changes again\r\n /* else if (!Game.onCrate && !Game.OnAscend && CM.Options.TimerBar === 1 && CM.Options.TimerBarPos === 0) {\r\n\t\tGame.tooltip.tta.style.top = (parseInt(Game.tooltip.tta.style.top) + parseInt(CM.Disp.TimerBar.style.height)) + 'px';\r\n\t} */\r\n}\r\n","import { CreateTooltip } from '../../Disp/Tooltips/Tooltip';\r\nimport { TooltipUpgradeBackup } from '../VariablesAndData';\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of upgrades so that it calls CM.Disp.Tooltip()\r\n * CM.Disp.Tooltip() sets the tooltip type to 'u'\r\n * It is called by Game.RebuildUpgrades() through CM.Main.ReplaceNative() and is therefore not permanent like the other ReplaceTooltip functions\r\n */\r\nexport default function ReplaceTooltipUpgrade() {\r\n TooltipUpgradeBackup = [];\r\n Object.keys(Game.UpgradesInStore).forEach((i) => {\r\n if (l(`upgrade${i}`).onmouseover !== null) {\r\n TooltipUpgradeBackup[i] = l(`upgrade${i}`).onmouseover;\r\n l(`upgrade${i}`).onmouseover = function () {\r\n if (!Game.mouseDown) {\r\n Game.setOnCrate(this);\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('u', `${i}`), 'store');\r\n Game.tooltip.wobble();\r\n }\r\n };\r\n }\r\n });\r\n}\r\n","/** Functions related to the Dragon */\r\n\r\nimport CacheDragonCost from '../../Cache/Dragon/Dragon';\r\nimport { CacheCostDragonUpgrade } from '../../Cache/VariablesAndData';\r\nimport CalculateChangeAura from '../../Sim/SimulationEvents/AuraChange';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../BeautifyAndFormatting/FormatTime';\r\n\r\n/**\r\n * This functions adds the two extra lines about CPS and time to recover to the aura picker infoscreen\r\n * @param\t{number}\taura\tThe number of the aura currently selected by the mouse/user\r\n */\r\nexport function AddAuraInfo(aura) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.DragonAuraInfo === 1) {\r\n const [bonusCPS, priceOfChange] = CalculateChangeAura(aura);\r\n const timeToRecover = FormatTime(priceOfChange / (bonusCPS + Game.cookiesPs));\r\n let bonusCPSPercentage;\r\n if (Game.cookiesPs === 0) bonusCPSPercentage = Beautify(Infinity);\r\n else bonusCPSPercentage = Beautify((bonusCPS / Game.cookiesPs) * 100);\r\n\r\n l('dragonAuraInfo').style.minHeight = '60px';\r\n l('dragonAuraInfo').style.margin = '8px';\r\n l('dragonAuraInfo').appendChild(document.createElement('div')).className = 'line';\r\n const div = document.createElement('div');\r\n div.style.minWidth = '200px';\r\n div.style.textAlign = 'center';\r\n div.textContent = `Picking this aura will change CPS by ${Beautify(\r\n bonusCPS,\r\n )} (${bonusCPSPercentage}% of current CPS).`;\r\n l('dragonAuraInfo').appendChild(div);\r\n const div2 = document.createElement('div');\r\n div2.style.minWidth = '200px';\r\n div2.style.textAlign = 'center';\r\n div2.textContent = `It will take ${timeToRecover} to recover the cost.`;\r\n l('dragonAuraInfo').appendChild(div2);\r\n }\r\n}\r\n\r\n/**\r\n * This functions adds a tooltip to the level up button displaying the cost of rebuying all\r\n * It is called by Game.ToggleSpecialMenu() after CM.Main.ReplaceNative()\r\n */\r\nexport function AddDragonLevelUpTooltip() {\r\n // Check if it is the dragon popup that is on screen\r\n if (\r\n (l('specialPopup').className.match(/onScreen/) &&\r\n l('specialPopup').children[0].style.background.match(/dragon/)) !== null\r\n ) {\r\n for (let i = 0; i < l('specialPopup').childNodes.length; i++) {\r\n if (l('specialPopup').childNodes[i].className === 'optionBox') {\r\n l('specialPopup').children[i].onmouseover = function () {\r\n CacheDragonCost();\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(\r\n l('specialPopup'),\r\n `<div style=\"min-width:200px;text-align:center;\">${CacheCostDragonUpgrade}</div>`,\r\n 'this',\r\n );\r\n Game.tooltip.wobble();\r\n };\r\n l('specialPopup').children[i].onmouseout = function () {\r\n Game.tooltip.shouldHide = 1;\r\n };\r\n }\r\n }\r\n }\r\n}\r\n","import { CacheDragonAura, CacheDragonAura2 } from '../../Cache/VariablesAndData';\r\nimport CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport {\r\n SimAchievementsOwned,\r\n SimBuildingsOwned, // eslint-disable-line no-unused-vars\r\n SimCookiesPs,\r\n SimDragonAura,\r\n SimDragonAura2,\r\n SimObjects,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions calculates the cps and cost of changing a Dragon Aura\r\n * It is called by CM.Disp.AddAuraInfo()\r\n * @param\t{number}\t\t\taura\t\t\t\t\t\t\t\t\t\tThe number of the aura currently selected by the mouse/user\r\n * @returns {[number, number]} \t[CM.Sim.cookiesPs - Game.cookiesPs, price]\tThe bonus cps and the price of the change\r\n */\r\nexport default function CalculateChangeAura(aura) {\r\n CopyData();\r\n\r\n // Check if aura being changed is first or second aura\r\n const auraToBeChanged = l('promptContent').children[0].innerHTML.includes('secondary');\r\n if (auraToBeChanged) SimDragonAura2 = aura;\r\n else SimDragonAura = aura;\r\n\r\n // Sell highest building but only if aura is different\r\n let price = 0;\r\n if (SimDragonAura !== CacheDragonAura || SimDragonAura2 !== CacheDragonAura2) {\r\n for (let i = Game.ObjectsById.length - 1; i > -1; --i) {\r\n if (Game.ObjectsById[i].amount > 0) {\r\n const highestBuilding = SimObjects[Game.ObjectsById[i].name].name;\r\n SimObjects[highestBuilding].amount -= 1;\r\n SimBuildingsOwned -= 1;\r\n price =\r\n SimObjects[highestBuilding].basePrice *\r\n Game.priceIncrease **\r\n Math.max(0, SimObjects[highestBuilding].amount - 1 - SimObjects[highestBuilding].free);\r\n price = Game.modifyBuildingPrice(SimObjects[highestBuilding], price);\r\n price = Math.ceil(price);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n return [SimCookiesPs - Game.cookiesPs, price];\r\n}\r\n","import createMenuOptions from './createMenuOptions';\r\nimport AddMenuStats from './Statistics/AddStatsPage';\r\n\r\n/**\r\n * This function adds the calll the functions to add extra info to the stats and options pages\r\n */\r\nexport default function AddMenu() {\r\n const title = document.createElement('div');\r\n title.className = 'title';\r\n\r\n if (Game.onMenu === 'stats') {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Stats) {\r\n title.textContent = 'Cookie Monster Statistics';\r\n AddMenuStats(title);\r\n }\r\n } else if (Game.onMenu === 'prefs') {\r\n // Added because Framework is broken\r\n l('menu').childNodes[2].insertBefore(\r\n createMenuOptions(),\r\n l('menu').childNodes[2].childNodes[l('menu').childNodes[2].childNodes.length - 1],\r\n );\r\n }\r\n}\r\n","/** Functions related to updating the tab in the browser's tab-bar */\r\n\r\nimport { CacheSeasonPopShimmer, CacheSpawnedGoldenShimmer } from '../../Cache/VariablesAndData';\r\n\r\nimport { LastSeasonPopupState, LastTickerFortuneState } from '../../Main/VariablesAndData';\r\nimport { Title } from '../VariablesAndData';\r\n\r\n/**\r\n * This function updates the tab title\r\n * It is called on every loop by Game.Logic() which also sets CM.Disp.Title to Game.cookies\r\n */\r\nexport default function UpdateTitle() {\r\n if (\r\n Game.OnAscend ||\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title === 0\r\n ) {\r\n document.title = Title;\r\n } else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title === 1) {\r\n let addFC = false;\r\n let addSP = false;\r\n let titleGC;\r\n let titleFC;\r\n let titleSP;\r\n\r\n if (CacheSpawnedGoldenShimmer) {\r\n if (CacheSpawnedGoldenShimmer.wrath)\r\n titleGC = `[W${Math.ceil(CacheSpawnedGoldenShimmer.life / Game.fps)}]`;\r\n else titleGC = `[G${Math.ceil(CacheSpawnedGoldenShimmer.life / Game.fps)}]`;\r\n } else if (!Game.Has('Golden switch [off]')) {\r\n titleGC = `[${Number(l('CMTimerBarGCMinBar').textContent) < 0 ? '!' : ''}${Math.ceil(\r\n (Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.time) / Game.fps,\r\n )}]`;\r\n } else titleGC = '[GS]';\r\n\r\n if (LastTickerFortuneState) {\r\n addFC = true;\r\n titleFC = '[F]';\r\n }\r\n\r\n if (Game.season === 'christmas') {\r\n addSP = true;\r\n if (LastSeasonPopupState) titleSP = `[R${Math.ceil(CacheSeasonPopShimmer.life / Game.fps)}]`;\r\n else {\r\n titleSP = `[${Number(l('CMTimerBarRenMinBar').textContent) < 0 ? '!' : ''}${Math.ceil(\r\n (Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.time) / Game.fps,\r\n )}]`;\r\n }\r\n }\r\n\r\n // Remove previous timers and add current cookies\r\n let str = Title;\r\n if (str.charAt(0) === '[') {\r\n str = str.substring(str.lastIndexOf(']') + 1);\r\n }\r\n document.title = `${titleGC + (addFC ? titleFC : '') + (addSP ? titleSP : '')} ${str}`;\r\n } else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title === 2) {\r\n let str = '';\r\n let spawn = false;\r\n if (CacheSpawnedGoldenShimmer) {\r\n spawn = true;\r\n if (CacheSpawnedGoldenShimmer.wrath)\r\n str += `[W${Math.ceil(CacheSpawnedGoldenShimmer.life / Game.fps)}]`;\r\n else str += `[G${Math.ceil(CacheSpawnedGoldenShimmer.life / Game.fps)}]`;\r\n }\r\n if (LastTickerFortuneState) {\r\n spawn = true;\r\n str += '[F]';\r\n }\r\n if (Game.season === 'christmas' && LastSeasonPopupState) {\r\n str += `[R${Math.ceil(CacheSeasonPopShimmer.life / Game.fps)}]`;\r\n spawn = true;\r\n }\r\n if (spawn) str += ' - ';\r\n let title = 'Cookie Clicker';\r\n if (Game.season === 'fools') title = 'Cookie Baker';\r\n str += title;\r\n document.title = str;\r\n }\r\n}\r\n","import {\r\n CacheHCPerSecond,\r\n CacheLastHeavenlyChips,\r\n CacheTimeTillNextPrestige,\r\n} from '../../Cache/VariablesAndData';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\n\r\n/**\r\n * This function creates a header object for tooltips.\r\n * @param\t{string}\ttext\tTitle of header\r\n * @returns {object}\tdiv\t\tAn object containing the stylized header\r\n */\r\nexport default function ReplaceAscendTooltip() {\r\n const cookiesToNext = Math.max(\r\n 0,\r\n Game.HowManyCookiesReset(\r\n Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned)) + 1,\r\n ) -\r\n (Game.cookiesEarned + Game.cookiesReset),\r\n );\r\n\r\n const startDate = Game.sayTime(((Date.now() - Game.startDate) / 1000) * Game.fps, -1);\r\n let str = `You've been on this run for <b>${\r\n startDate === '' ? 'not very long' : startDate\r\n }</b>.<br>\r\n <div class=\"line\"></div>`;\r\n if (Game.prestige > 0) {\r\n str += `Your prestige level is currently <b>${Beautify(Game.prestige)}</b>.<br>(CpS +${Beautify(\r\n Game.prestige,\r\n )}%)\r\n <div class=\"line\"></div>`;\r\n }\r\n if (CacheLastHeavenlyChips < 1) str += 'Ascending now would grant you no prestige.';\r\n else if (CacheLastHeavenlyChips < 2)\r\n str +=\r\n 'Ascending now would grant you<br><b>1 prestige level</b> (+1% CpS)<br>and <b>1 heavenly chip</b> to spend.';\r\n else\r\n str += `Ascending now would grant you<br><b>${Beautify(\r\n CacheLastHeavenlyChips,\r\n )} prestige levels</b> (+${Beautify(CacheLastHeavenlyChips)}% CpS)<br>and <b>${Beautify(\r\n CacheLastHeavenlyChips,\r\n )} heavenly chips</b> to spend.`;\r\n str += `<div class=\"line\"></div>\r\n You need <b>${Beautify(cookiesToNext)} more cookies</b> for the next level.<br>\r\n ${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipAscendButton\r\n ? `<div class='line'></div>It takes ${CacheTimeTillNextPrestige} to reach the next level and you were making ${Beautify(\r\n CacheHCPerSecond,\r\n 2,\r\n )} chips on average in the last 5 seconds.<br>`\r\n : ''\r\n }`;\r\n l('ascendTooltip').innerHTML = str;\r\n}\r\n","import InitCache from '../Cache/CacheInit';\r\nimport { CacheStatsCookies } from '../Cache/Stats/Stats';\r\nimport { VersionMajor, VersionMinor } from '../Data/Moddata';\r\nimport CreateUpgradeBar from '../Disp/BuildingsUpgrades/UpgradeBar';\r\nimport { CreateBotBar } from '../Disp/InfoBars/BottomBar';\r\nimport { CreateTimerBar } from '../Disp/InfoBars/TimerBar';\r\nimport CreateSectionHideButtons from '../Disp/Initialization/CreateSectionHideButtons';\r\nimport CreateWrinklerButtons from '../Disp/Initialization/CreateWrinklerButton';\r\nimport CreateCssArea from '../Disp/Initialization/CssArea';\r\nimport UpdateBuildingUpgradeStyle from '../Disp/Initialization/UpdateBuildingUpgradeStyle';\r\nimport { CreateFavicon } from '../Disp/TabTitle/FavIcon';\r\nimport { CreateSimpleTooltip } from '../Disp/Tooltips/Tooltip';\r\nimport { CMLastAscendState, TooltipText } from '../Disp/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport InitData from '../Sim/InitializeData/InitData';\r\nimport ReplaceNativeGrimoire from './ReplaceGameElements/NativeGrimoire';\r\nimport ReplaceTooltips from './ReplaceGameElements/Tooltips';\r\nimport ReplaceNative from './ReplaceGameFunctions/ReplaceNative';\r\nimport { LastModCount } from './VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport AddWrinklerAreaDetect from './WrinklerArea/AddDetectArea';\r\nimport createBuildingLockButtons from '../Disp/buildingTiles/createBuildingLockButtons';\r\n// import createMenuInfo from '../Disp/MenuSections/createMenuInfo';\r\nimport createMenuOptions from '../Disp/MenuSections/createMenuOptions';\r\n\r\n/**\r\n * Initialization loop of Cookie Monster\r\n */\r\nexport default function InitializeCookieMonster() {\r\n // Create global data object\r\n window.CookieMonsterData = {};\r\n\r\n // Register listeners in Cookie Monster Mod Framework\r\n // Commented because Framework is currently broken\r\n // Game.mods.cookieMonsterFramework.listeners.infoMenu.push(createMenuInfo);\r\n Game.mods.cookieMonsterFramework.listeners.optionsMenu.push(createMenuOptions);\r\n\r\n InitData();\r\n CacheStatsCookies();\r\n InitCache();\r\n\r\n // Stored to check if we need to re-initiliaze data\r\n LastModCount = Object.keys(Game.mods).length;\r\n\r\n // Creating visual elements\r\n CreateCssArea();\r\n CreateBotBar();\r\n CreateTimerBar();\r\n CreateUpgradeBar();\r\n CreateSectionHideButtons();\r\n CreateFavicon();\r\n Object.keys(TooltipText).forEach((i) => {\r\n CreateSimpleTooltip(TooltipText[i][0], TooltipText[i][1], TooltipText[i][2]);\r\n });\r\n CreateWrinklerButtons();\r\n UpdateBuildingUpgradeStyle();\r\n createBuildingLockButtons();\r\n\r\n ReplaceTooltips();\r\n AddWrinklerAreaDetect();\r\n\r\n // Replace native functions\r\n ReplaceNative();\r\n ReplaceNativeGrimoire();\r\n Game.CalculateGains();\r\n\r\n CMLastAscendState = Game.OnAscend;\r\n\r\n if (Game.prefs.popups)\r\n Game.Popup(`Cookie Monster version ${VersionMajor}.${VersionMinor} loaded!`);\r\n else Game.Notify(`Cookie Monster version ${VersionMajor}.${VersionMinor} loaded!`, '', '', 1, 1);\r\n\r\n Game.Win('Third-party');\r\n}\r\n","import { DispCSS } from '../VariablesAndData';\r\n\r\n/**\r\n * This function creates a CSS style that stores certain standard CSS classes used by CookieMonster\r\n\r\n */\r\nexport default function CreateCssArea() {\r\n DispCSS = document.createElement('style');\r\n DispCSS.type = 'text/css';\r\n DispCSS.id = 'CMCSS';\r\n\r\n document.head.appendChild(DispCSS);\r\n}\r\n","import {\r\n ColourBackPre,\r\n ColourBlue,\r\n ColourGray,\r\n ColourGreen,\r\n ColourOrange,\r\n ColourPurple,\r\n ColourRed,\r\n ColourTextPre,\r\n ColourYellow,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function creates the legend for the upgrade bar\r\n * @returns\t{object}\tlegend\tThe legend-object to be added\r\n */\r\nfunction CreateUpgradeBarLegend() {\r\n const legend = document.createElement('div');\r\n legend.style.minWidth = '330px';\r\n legend.style.marginBottom = '4px';\r\n const title = document.createElement('div');\r\n title.className = 'name';\r\n title.style.marginBottom = '4px';\r\n title.textContent = 'Legend';\r\n legend.appendChild(title);\r\n\r\n const legendLine = function (colour, text) {\r\n const div = document.createElement('div');\r\n div.style.verticalAlign = 'middle';\r\n const span = document.createElement('span');\r\n span.className = ColourBackPre + colour;\r\n span.style.display = 'inline-block';\r\n span.style.height = '10px';\r\n span.style.width = '10px';\r\n span.style.marginRight = '4px';\r\n div.appendChild(span);\r\n div.appendChild(document.createTextNode(text));\r\n return div;\r\n };\r\n\r\n legend.appendChild(legendLine(ColourBlue, 'Better than the best PP of a building option'));\r\n legend.appendChild(legendLine(ColourGreen, 'Same as the best PP building option'));\r\n legend.appendChild(legendLine(ColourYellow, 'Within the top 10 of PP for buildings'));\r\n legend.appendChild(legendLine(ColourOrange, 'Within the top 20 of PP for buildings'));\r\n legend.appendChild(legendLine(ColourRed, 'Within the top 30 of PP for buildings'));\r\n legend.appendChild(legendLine(ColourPurple, 'Outside of the top 30 of PP for buildings'));\r\n legend.appendChild(legendLine(ColourGray, 'Negative or infinity PP'));\r\n return legend;\r\n}\r\n\r\n/**\r\n * This function creates the upgrade bar above the upgrade-section in the right section of the screen\r\n */\r\nexport default function CreateUpgradeBar() {\r\n const UpgradeBar = document.createElement('div');\r\n UpgradeBar.id = 'CMUpgradeBar';\r\n UpgradeBar.style.width = '100%';\r\n UpgradeBar.style.backgroundColor = 'black';\r\n UpgradeBar.style.textAlign = 'center';\r\n UpgradeBar.style.fontWeight = 'bold';\r\n UpgradeBar.style.display = 'none';\r\n UpgradeBar.style.zIndex = '21';\r\n UpgradeBar.onmouseout = function () {\r\n Game.tooltip.hide();\r\n };\r\n\r\n const placeholder = document.createElement('div');\r\n placeholder.appendChild(CreateUpgradeBarLegend());\r\n UpgradeBar.onmouseover = function () {\r\n Game.tooltip.draw(this, escape(placeholder.innerHTML), 'store');\r\n };\r\n\r\n const upgradeNumber = function (id, colour) {\r\n const span = document.createElement('span');\r\n span.id = id;\r\n span.className = ColourTextPre + colour;\r\n span.style.width = '14.28571428571429%';\r\n span.style.display = 'inline-block';\r\n span.textContent = '0';\r\n return span;\r\n };\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarBlue', ColourBlue));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarGreen', ColourGreen));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarYellow', ColourYellow));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarOrange', ColourOrange));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarRed', ColourRed));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarPurple', ColourPurple));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarGray', ColourGray));\r\n\r\n l('upgrades').parentNode.insertBefore(UpgradeBar, l('upgrades').parentNode.childNodes[3]);\r\n}\r\n","/**\r\n * This function creates two objects at the top of the right column that allowing hiding the upgrade and building section\r\n */\r\nexport default function CreateSectionHideButtons() {\r\n const div = document.createElement('div');\r\n div.id = 'CMSectionHidButtons';\r\n div.style.textAlign = 'center';\r\n const a = document.createElement('a');\r\n a.className = 'option';\r\n a.onclick = function () {\r\n if (l('upgrades').style.display === 'flex') {\r\n l('upgrades').style.display = 'none';\r\n l('toggleUpgrades').style.display = 'none';\r\n l('techUpgrades').style.display = 'none';\r\n l('vaultUpgrades').style.display = 'none';\r\n } else {\r\n l('upgrades').style.display = 'flex';\r\n if (l('toggleUpgrades').children.length !== 0) l('toggleUpgrades').style.display = 'block';\r\n if (l('techUpgrades').children.length !== 0) l('techUpgrades').style.display = 'block';\r\n if (l('vaultUpgrades').children.length !== 0) l('vaultUpgrades').style.display = 'block';\r\n }\r\n };\r\n a.textContent = 'Hide/Show Upgrades';\r\n div.appendChild(a);\r\n const b = document.createElement('a');\r\n b.className = 'option';\r\n b.onclick = function () {\r\n if (l('products').style.display === 'grid') l('products').style.display = 'none';\r\n else l('products').style.display = 'grid';\r\n };\r\n b.textContent = 'Hide/Show Buildings';\r\n div.appendChild(b);\r\n l('store').insertBefore(div, l('store').childNodes[2]);\r\n}\r\n","import { CacheWrinklersFattest } from '../../Cache/VariablesAndData';\r\nimport PopAllNormalWrinklers from '../HelperFunctions/PopWrinklers';\r\nimport { CreateTooltip } from '../Tooltips/Tooltip';\r\n\r\n/**\r\n * This function creates two objects at the bottom of the left column that allowing popping of wrinklers\r\n */\r\nexport default function CreateWrinklerButtons() {\r\n const popAllA = document.createElement('a');\r\n popAllA.id = 'PopAllNormalWrinklerButton';\r\n popAllA.textContent = 'Pop All Normal';\r\n popAllA.className = 'option';\r\n popAllA.onclick = function () {\r\n PopAllNormalWrinklers();\r\n };\r\n popAllA.onmouseout = function () {\r\n Game.tooltip.shouldHide = 1;\r\n };\r\n popAllA.onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('wb', 'PopAllNormal'), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n l('sectionLeftExtra').children[0].append(popAllA);\r\n const popFattestA = document.createElement('a');\r\n popFattestA.id = 'PopFattestWrinklerButton';\r\n popFattestA.textContent = 'Pop Single Fattest';\r\n popFattestA.className = 'option';\r\n popFattestA.onclick = function () {\r\n if (CacheWrinklersFattest[1] !== null) Game.wrinklers[CacheWrinklersFattest[1]].hp = 0;\r\n };\r\n popFattestA.onmouseout = function () {\r\n Game.tooltip.shouldHide = 1;\r\n };\r\n popFattestA.onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('wb', 'PopFattest'), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n l('sectionLeftExtra').children[0].append(popFattestA);\r\n}\r\n","/**\r\n * This function updates the style of the building and upgrade sections to make these sortable\r\n */\r\nexport default function UpdateBuildingUpgradeStyle() {\r\n l('products').style.display = 'grid';\r\n l('storeBulk').style.gridRow = '1/1';\r\n\r\n l('upgrades').style.display = 'flex';\r\n l('upgrades').style['flex-wrap'] = 'wrap';\r\n}\r\n","import toggleBuildingLock from './toggleBuildingLock';\r\n\r\n/**\r\n * This function adds a lock button to the \"building view\" in the middle section\r\n */\r\nexport default function createBuildingLockButtons() {\r\n Object.keys(l('rows').children).forEach((index) => {\r\n const productButtons = l('rows').children[index].children[1];\r\n const button = document.createElement('div');\r\n button.id = `productLock${Number(index) + 1}`;\r\n button.className = 'productButton';\r\n button.innerHTML = 'Lock';\r\n button.onclick = function () {\r\n toggleBuildingLock(Number(index) + 1);\r\n };\r\n productButtons.appendChild(button);\r\n });\r\n}\r\n","/**\r\n * This function toggle the locked state of a building\r\n * @param\t{number}\tindex\tIndex of the row to change\r\n */\r\nexport default function toggleBuildingLock(index) {\r\n if (l(`productLock${index}`).innerHTML === 'Lock') {\r\n // Add to storing array\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.push(\r\n index.toString(),\r\n );\r\n\r\n // Update styles\r\n l(`row${index}`).style.pointerEvents = 'none';\r\n l(`row${index}`).style.opacity = '0.4';\r\n l(`productLock${index}`).innerHTML = 'Unlock';\r\n l(`productLock${index}`).style.pointerEvents = 'auto';\r\n } else {\r\n // Remove from storing array\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.includes(\r\n index.toString(),\r\n )\r\n ) {\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.filter(\r\n (value) => value !== index.toString(),\r\n );\r\n }\r\n\r\n // Update styles\r\n l(`productLock${index}`).innerHTML = 'Lock';\r\n l(`row${index}`).style.pointerEvents = 'auto';\r\n l(`row${index}`).style.opacity = '1';\r\n }\r\n}\r\n","/** Functions related to replacing tooltips */\r\n\r\nimport { CreateTooltip } from '../../Disp/Tooltips/Tooltip';\r\nimport { LoadMinigames, TooltipBuildBackup, TooltipLumpBackup } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport ReplaceNativeGrimoire from './NativeGrimoire';\r\nimport ReplaceTooltipGrimoire from './TooltipGrimoire';\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of buildings\r\n */\r\nfunction ReplaceTooltipBuild() {\r\n Object.keys(Game.Objects).forEach((i) => {\r\n const me = Game.Objects[i];\r\n if (l(`product${me.id}`).onmouseover !== null) {\r\n TooltipBuildBackup[i] = l(`product${me.id}`).onmouseover;\r\n l(`product${me.id}`).onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('b', `${i}`), 'store');\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of sugar lumps\r\n */\r\nfunction ReplaceTooltipLump() {\r\n if (Game.canLumps()) {\r\n TooltipLumpBackup = l('lumps').onmouseover;\r\n l('lumps').onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('s', 'Lump'), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of all garden plants\r\n */\r\nfunction ReplaceTooltipGarden() {\r\n if (Game.Objects.Farm.minigameLoaded) {\r\n l('gardenTool-1').onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('ha', 'HarvestAllButton'), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n Array.from(l('gardenPlot').children).forEach((child) => {\r\n const coords = child.id.slice(-3);\r\n // eslint-disable-next-line no-param-reassign\r\n child.onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('p', [`${coords[0]}`, `${coords[2]}`]), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n });\r\n }\r\n}\r\n\r\nfunction ReplaceTooltipPantheon() {\r\n if (Game.Objects.Temple.minigameLoaded) {\r\n for (let i = 0; i < 11; i += 1) {\r\n l(`templeGod${i}`).onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('pag', i), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n for (let i = 0; i < 3; i += 1) {\r\n l(`templeSlot${i}`).onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(\r\n this,\r\n () => CreateTooltip('pas', [i, Game.Objects.Temple.minigame.slot[i]]),\r\n 'this',\r\n );\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * This function call all functions that replace Game-tooltips with Cookie Monster enhanced tooltips\r\n */\r\nexport default function ReplaceTooltips() {\r\n ReplaceTooltipBuild();\r\n ReplaceTooltipLump();\r\n\r\n // Replace Tooltips of Minigames. Nesting it in LoadMinigames makes sure to replace them even if\r\n // they were not loaded initially\r\n // eslint-disable-next-line prefer-destructuring\r\n LoadMinigames = Game.LoadMinigames;\r\n Game.LoadMinigames = function () {\r\n LoadMinigames();\r\n ReplaceTooltipGarden();\r\n ReplaceTooltipGrimoire();\r\n ReplaceTooltipPantheon();\r\n ReplaceNativeGrimoire();\r\n };\r\n Game.LoadMinigames();\r\n}\r\n","import { TooltipWrinklerArea, TooltipWrinklerBeingShown } from '../../Disp/VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This function creates .onmouseover/out events that determine if the mouse is hovering-over a Wrinkler\r\n * As wrinklers are not appended to the DOM we us a different system than for other tooltips\r\n */\r\nexport default function AddWrinklerAreaDetect() {\r\n l('backgroundLeftCanvas').onmouseover = function () {\r\n TooltipWrinklerArea = 1;\r\n };\r\n l('backgroundLeftCanvas').onmouseout = function () {\r\n TooltipWrinklerArea = 0;\r\n Game.tooltip.hide();\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n TooltipWrinklerBeingShown[i] = 0;\r\n });\r\n };\r\n}\r\n","import CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport { SimAchievementsOwned, SimCookiesPs, SimGod1, SimGod2, SimGod3 } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This functions calculates the cps and cost of changing a Dragon Aura\r\n * It is called by CM.Disp.AddAuraInfo()\r\n * @param\t{number}\tgod\t\tThe number of the slot to be swapped in\r\n * @param\t{number slot\tThe slot the god will go to\r\n * @returns {number} \tCM.Sim.cookiesPs - Game.cookiesPs The bonus cps and the price of the change\r\n */\r\nexport default function CalculateChangeGod(god, slot) {\r\n if (!Game.Objects.Temple.minigameLoaded) return 0;\r\n CopyData();\r\n const { minigame } = Game.Objects.Temple;\r\n const CurrentSlot = minigame.godsById[god].slot;\r\n if (CurrentSlot === '0') SimGod1 = minigame.slot[slot];\r\n else if (CurrentSlot === '1') SimGod2 = minigame.slot[slot];\r\n else if (CurrentSlot === '2') SimGod3 = minigame.slot[slot];\r\n /* eslint-disable no-unused-vars */\r\n if (slot === 0) SimGod1 = god;\r\n else if (slot === 1) SimGod2 = god;\r\n else if (slot === 2) SimGod3 = god;\r\n /* eslint-enable no-unused-vars */\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n return SimCookiesPs - Game.cookiesPs;\r\n}\r\n","import InitCache from '../Cache/CacheInit';\r\nimport LoopCache from '../Cache/CacheLoop';\r\nimport CacheNoGoldSwitchCPS from '../Cache/CPS/NoGoldSwitchCPS';\r\nimport CacheSellAllForChoEgg from '../Cache/CPS/SellChoEgg';\r\nimport CacheDragonCost from '../Cache/Dragon/Dragon';\r\nimport CachePantheonGods from '../Cache/PantheonGods/CacheGods';\r\nimport { CacheBuildingsPrices, CacheIncome } from '../Cache/PriceAndIncome/PriceAndIncome';\r\nimport { CacheChain } from '../Cache/Stats/ChainCookies';\r\nimport CacheAllMissingUpgrades from '../Cache/Stats/MissingUpgrades';\r\nimport CacheSeasonSpec from '../Cache/Stats/Reindeer';\r\nimport { CacheGoldenAndWrathCookiesMults, CacheStatsCookies } from '../Cache/Stats/Stats';\r\nimport AllAmountTillNextAchievement from '../Cache/TillNextAchievement/AllAmountTillNextAchievement';\r\nimport { CacheDoRemakeBuildPrices, CacheHadBuildAura } from '../Cache/VariablesAndData';\r\nimport UpdateAscendState from '../Disp/HelperFunctions/UpdateAscendState';\r\nimport { LastAscendState } from '../Disp/VariablesAndData';\r\nimport InitData from '../Sim/InitializeData/InitData';\r\nimport { SimDoSims } from '../Sim/VariablesAndData';\r\nimport CheckGardenTick from './CheckStates/Garden';\r\nimport CheckGoldenCookie from './CheckStates/GoldenCookie';\r\nimport CheckMagicMeter from './CheckStates/Grimoire';\r\nimport CheckSeasonPopup from './CheckStates/Season';\r\nimport CheckTickerFortune from './CheckStates/Ticker';\r\nimport CheckWrinklerCount from './CheckStates/Wrinkler';\r\nimport { LastModCount } from './VariablesAndData';\r\n\r\n/**\r\n * Main loop of Cookie Monster\r\n * CM.init registers it to the \"logic\" hook provided by the modding api\r\n */\r\nexport default function CMLoopHook() {\r\n if (LastAscendState !== Game.OnAscend) {\r\n LastAscendState = Game.OnAscend;\r\n UpdateAscendState();\r\n }\r\n if (!Game.OnAscend && Game.AscendTimer === 0) {\r\n // Check if any other mods have been loaded\r\n if (LastModCount !== Object.keys(Game.mods).length) {\r\n InitData();\r\n InitCache();\r\n LastModCount = Object.keys(Game.mods).length;\r\n }\r\n\r\n // CM.Sim.DoSims is set whenever CPS has changed\r\n if (SimDoSims) {\r\n AllAmountTillNextAchievement(true);\r\n CacheIncome();\r\n\r\n CacheNoGoldSwitchCPS(); // Needed first\r\n CacheGoldenAndWrathCookiesMults();\r\n CacheStatsCookies();\r\n CacheAllMissingUpgrades();\r\n CacheChain();\r\n CacheDragonCost();\r\n CachePantheonGods();\r\n\r\n CacheSeasonSpec();\r\n CacheSellAllForChoEgg();\r\n\r\n SimDoSims = 0;\r\n }\r\n\r\n // Check for aura change to recalculate buildings prices\r\n const hasBuildAura = Game.auraMult('Fierce Hoarder') > 0;\r\n if (!CacheHadBuildAura && hasBuildAura) {\r\n CacheHadBuildAura = true;\r\n CacheDoRemakeBuildPrices = 1;\r\n } else if (CacheHadBuildAura && !hasBuildAura) {\r\n CacheHadBuildAura = false;\r\n CacheDoRemakeBuildPrices = 1;\r\n }\r\n\r\n if (CacheDoRemakeBuildPrices) {\r\n CacheBuildingsPrices();\r\n CacheDoRemakeBuildPrices = 0;\r\n }\r\n\r\n LoopCache();\r\n\r\n // Check all changing minigames and game-states\r\n CheckTickerFortune();\r\n CheckSeasonPopup();\r\n CheckGardenTick();\r\n CheckMagicMeter();\r\n CheckWrinklerCount();\r\n }\r\n // To remove Timers when ascending\r\n CheckGoldenCookie();\r\n}\r\n","import { ToggleTimerBar } from '../../Config/SpecificToggles';\r\nimport ToggleBotBar from '../../Config/Toggles/ToggleBotBar';\r\n\r\nimport UpdateBackground from './UpdateBackground';\r\n\r\n/**\r\n * This function disables and shows the bars created by CookieMonster when the game is \"ascending\"\r\n * It is called by CM.Disp.Draw()\r\n */\r\nexport default function UpdateAscendState() {\r\n if (Game.OnAscend) {\r\n l('game').style.bottom = '0px';\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1)\r\n l('CMBotBar').style.display = 'none';\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1)\r\n l('CMTimerBar').style.display = 'none';\r\n } else {\r\n ToggleBotBar();\r\n ToggleTimerBar();\r\n }\r\n UpdateBackground();\r\n}\r\n","import CalcNoGoldSwitchCPS from '../../Sim/Calculations/NoGoldenSwitchCalc';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheNoGoldSwitchCookiesPS } from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates CPS without the Golden Switch as it might be needed in other functions\r\n * If so it CM.Sim.Win()'s them and the caller function will know to recall CM.Sim.CalculateGains()\r\n * It is called at the end of any functions that simulates certain behaviour\r\n */\r\nexport default function CacheNoGoldSwitchCPS() {\r\n if (Game.Has('Golden switch [off]')) {\r\n CacheNoGoldSwitchCookiesPS = CalcNoGoldSwitchCPS();\r\n } else CacheNoGoldSwitchCookiesPS = Game.cookiesPs;\r\n\r\n FillCMDCache({ CacheNoGoldSwitchCookiesPS });\r\n}\r\n","import CopyData from '../SimulationData/CopyData';\r\nimport { SimCookiesPs, SimUpgrades } from '../VariablesAndData';\r\nimport CalculateGains from './CalculateGains';\r\n\r\n/**\r\n * This function calculates CPS without the Golden Switch\r\n * It is called by CM.Cache.NoGoldSwitchCPS()\r\n */\r\nexport default function CalcNoGoldSwitchCPS() {\r\n CopyData();\r\n SimUpgrades['Golden switch [off]'].bought = 0;\r\n CalculateGains();\r\n return SimCookiesPs;\r\n}\r\n","import CalculateChangeGod from '../../Sim/SimulationEvents/GodChange';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheGods } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the cps effect of each God in slot 1, 2 or 3\r\n */\r\nexport default function CachePantheonGods() {\r\n for (let god = 0; god < 11; god += 1) {\r\n for (let slot = 0; slot < 3; slot += 1) {\r\n CacheGods[god][slot] = CalculateChangeGod(god, slot);\r\n }\r\n }\r\n\r\n FillCMDCache({ CacheGods });\r\n}\r\n","import SellBuildingsForChoEgg from '../../Sim/SimulationEvents/SellBuildingForChoEgg';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheSellForChoEgg } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the reward for selling the Chocolate egg\r\n * It is called by CM.Main.Loop()\r\n * @global\t{number}\tCM.Cache.SellForChoEgg\tTotal cookies to be gained from selling Chocolate egg\r\n */\r\nexport default function CacheSellAllForChoEgg() {\r\n let sellTotal = 0;\r\n // Compute cookies earned by selling stock market goods\r\n if (Game.Objects.Bank.minigameLoaded) {\r\n const marketGoods = Game.Objects.Bank.minigame.goods;\r\n let goodsVal = 0;\r\n Object.keys(marketGoods).forEach((i) => {\r\n const marketGood = marketGoods[i];\r\n goodsVal += marketGood.stock * marketGood.val;\r\n });\r\n sellTotal += goodsVal * Game.cookiesPsRawHighest;\r\n }\r\n // Compute cookies earned by selling all buildings with optimal auras (ES + RB)\r\n sellTotal += SellBuildingsForChoEgg();\r\n CacheSellForChoEgg = sellTotal;\r\n\r\n FillCMDCache({ CacheSellForChoEgg });\r\n}\r\n","import CopyData from '../SimulationData/CopyData';\r\nimport { SimBuildingsOwned, SimDragonAura, SimDragonAura2, SimObjects } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport BuildingSell from './SellBuilding';\r\n\r\n/**\r\n * This function calculates the maximum cookies obtained from selling buildings just before purchasing the chocolate egg\r\n * It is called by CM.Cache.CacheSellForChoEgg()\r\n * @returns\t{number}\tsellTotal\tThe maximum cookies to be earned\r\n */\r\nexport default function SellBuildingsForChoEgg() {\r\n let sellTotal = 0;\r\n\r\n CopyData();\r\n\r\n // Change auras to Earth Shatterer + Reality bending to optimize money made by selling\r\n let buildingsToSacrifice = 2;\r\n if (SimDragonAura === 5 || SimDragonAura === 18) {\r\n buildingsToSacrifice -= 1;\r\n }\r\n if (SimDragonAura2 === 5 || SimDragonAura2 === 18) {\r\n buildingsToSacrifice -= 1;\r\n }\r\n SimDragonAura = 5;\r\n SimDragonAura2 = 18;\r\n\r\n // Sacrifice highest buildings for the aura switch\r\n for (let i = 0; i < buildingsToSacrifice; ++i) {\r\n let highestBuilding = 'Cursor';\r\n Object.keys(SimObjects).forEach((j) => {\r\n if (SimObjects[j].amount > 0) {\r\n highestBuilding = j;\r\n }\r\n });\r\n SimObjects[highestBuilding].amount -= 1;\r\n SimBuildingsOwned -= 1;\r\n }\r\n\r\n // Get money made by selling all remaining buildings\r\n Object.keys(SimObjects).forEach((i) => {\r\n const me = SimObjects[i];\r\n sellTotal += BuildingSell(\r\n Game.Objects[me.name],\r\n Game.Objects[i].basePrice,\r\n me.amount,\r\n Game.Objects[i].free,\r\n me.amount,\r\n );\r\n });\r\n\r\n return sellTotal;\r\n}\r\n","import FormatTime from '../Disp/BeautifyAndFormatting/FormatTime';\r\nimport GetCPS from '../Disp/HelperFunctions/GetCPS';\r\nimport CacheAvgCPS from './CPS/CPS';\r\nimport CacheCurrWrinklerCPS from './CPS/CurrWrinklerCPS';\r\nimport CachePP from './PP/PP';\r\nimport CacheHeavenlyChipsPS from './Stats/HeavenlyChips';\r\nimport AllAmountTillNextAchievement from './TillNextAchievement/AllAmountTillNextAchievement';\r\nimport { CacheTimeTillNextPrestige } from './VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport CacheWrinklers from './Wrinklers/Wrinklers';\r\n\r\n/**\r\n * This functions caches variables that are needed every loop\r\n * @global\t{string}\tCM.Cache.TimeTillNextPrestige\tTime requried till next prestige level\r\n */\r\nexport default function LoopCache() {\r\n // Update Wrinkler Bank\r\n CacheWrinklers();\r\n\r\n CachePP();\r\n AllAmountTillNextAchievement(false);\r\n CacheCurrWrinklerCPS();\r\n CacheAvgCPS();\r\n CacheHeavenlyChipsPS();\r\n\r\n const cookiesToNext =\r\n Game.HowManyCookiesReset(\r\n Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned)) + 1,\r\n ) -\r\n (Game.cookiesEarned + Game.cookiesReset);\r\n CacheTimeTillNextPrestige = FormatTime(cookiesToNext / GetCPS());\r\n}\r\n","import { SimObjects } from '../../Sim/VariablesAndData';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheCurrWrinklerCount, CacheCurrWrinklerCPSMult } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the current Wrinkler CPS multiplier\r\n * @global\t{number}\tCM.Cache.CurrWrinklerCount\t\tCurrent number of wrinklers\r\n * @global\t{number}\tCM.Cache.CurrWrinklerCPSMult\tCurrent multiplier of CPS because of wrinklers (excluding their negative sucking effect)\r\n */\r\nexport default function CacheCurrWrinklerCPS() {\r\n CacheCurrWrinklerCPSMult = 0;\r\n let count = 0;\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n if (Game.wrinklers[i].phase === 2) count += 1;\r\n });\r\n let godMult = 1;\r\n if (SimObjects.Temple.minigameLoaded) {\r\n const godLvl = Game.hasGod('scorn');\r\n if (godLvl === 1) godMult *= 1.15;\r\n else if (godLvl === 2) godMult *= 1.1;\r\n else if (godLvl === 3) godMult *= 1.05;\r\n }\r\n CacheCurrWrinklerCount = count;\r\n CacheCurrWrinklerCPSMult =\r\n count *\r\n (count * 0.05 * 1.1) *\r\n (Game.Has('Sacrilegious corruption') * 0.05 + 1) *\r\n (Game.Has('Wrinklerspawn') * 0.05 + 1) *\r\n godMult;\r\n\r\n FillCMDCache({ CacheCurrWrinklerCount, CacheCurrWrinklerCPSMult });\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { LastTickerFortuneState } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if there is a fortune cookie on the ticker\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckTickerFortune() {\r\n if (LastTickerFortuneState !== (Game.TickerEffect && Game.TickerEffect.type === 'fortune')) {\r\n LastTickerFortuneState = Game.TickerEffect && Game.TickerEffect.type === 'fortune';\r\n if (LastTickerFortuneState) {\r\n nF.createFlash('cookieMonsterMod', 3, 'FortuneFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FortuneSoundURL,\r\n 'FortuneSound',\r\n 'FortuneVolume',\r\n false,\r\n );\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'FortuneNotification',\r\n 'Fortune Cookie found',\r\n 'A Fortune Cookie has appeared on the Ticker.',\r\n );\r\n }\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { CacheSeasonPopShimmer } from '../../Cache/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport { LastSeasonPopupState } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if there is reindeer that has spawned\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckSeasonPopup() {\r\n if (LastSeasonPopupState !== Game.shimmerTypes.reindeer.spawned) {\r\n LastSeasonPopupState = Game.shimmerTypes.reindeer.spawned;\r\n Object.keys(Game.shimmers).forEach((i) => {\r\n if (Game.shimmers[i].spawnLead && Game.shimmers[i].type === 'reindeer') {\r\n CacheSeasonPopShimmer = Game.shimmers[i];\r\n }\r\n });\r\n nF.createFlash('cookieMonsterMod', 3, 'SeaFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SeaSoundURL,\r\n 'SeaSound',\r\n 'SeaVolume',\r\n false,\r\n );\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'SeaNotification',\r\n 'Reindeer sighted!',\r\n 'A Reindeer has spawned. Click it now!',\r\n );\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { LastGardenNextStep } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if a garden tick has happened\r\n */\r\nexport default function CheckGardenTick() {\r\n if (\r\n Game.Objects.Farm.minigameLoaded &&\r\n LastGardenNextStep !== Game.Objects.Farm.minigame.nextStep\r\n ) {\r\n if (LastGardenNextStep !== 0 && LastGardenNextStep < Date.now()) {\r\n nF.createFlash('cookieMonsterMod', 3, 'GardFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GardSoundURL,\r\n 'GardSound',\r\n 'GardVolume',\r\n false,\r\n );\r\n }\r\n LastGardenNextStep = Game.Objects.Farm.minigame.nextStep;\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { LastMagicBarFull } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if the magic meter is full\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckMagicMeter() {\r\n if (\r\n Game.Objects['Wizard tower'].minigameLoaded &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GrimoireBar === 1\r\n ) {\r\n const { minigame } = Game.Objects['Wizard tower'];\r\n if (minigame.magic < minigame.magicM) LastMagicBarFull = false;\r\n else if (!LastMagicBarFull) {\r\n LastMagicBarFull = true;\r\n nF.createFlash('cookieMonsterMod', 3, 'MagicFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MagicSoundURL,\r\n 'MagicSound',\r\n 'MagicVolume',\r\n false,\r\n );\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'MagicNotification',\r\n 'Magic Meter full',\r\n 'Your Magic Meter is full. Cast a spell!',\r\n );\r\n }\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { LastWrinklerCount } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if any new Wrinklers have popped up\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckWrinklerCount() {\r\n if (Game.elderWrath > 0) {\r\n let CurrentWrinklers = 0;\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n if (Game.wrinklers[i].phase === 2) CurrentWrinklers += 1;\r\n });\r\n if (CurrentWrinklers > LastWrinklerCount) {\r\n LastWrinklerCount = CurrentWrinklers;\r\n if (\r\n CurrentWrinklers === Game.getWrinklersMax() &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxFlash\r\n ) {\r\n nF.createFlash('cookieMonsterMod', 3, 'WrinklerMaxFlash', false);\r\n } else {\r\n nF.createFlash('cookieMonsterMod', 3, 'WrinklerFlash', false);\r\n }\r\n if (\r\n CurrentWrinklers === Game.getWrinklersMax() &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxSound\r\n ) {\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxSoundURL,\r\n 'WrinklerMaxSound',\r\n 'WrinklerMaxVolume',\r\n false,\r\n );\r\n } else {\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerSoundURL,\r\n 'WrinklerSound',\r\n 'WrinklerVolume',\r\n false,\r\n );\r\n }\r\n if (\r\n CurrentWrinklers === Game.getWrinklersMax() &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxNotification\r\n ) {\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'WrinklerMaxNotification',\r\n 'Maximum Wrinklers Reached',\r\n 'You have reached your maximum ammount of wrinklers',\r\n );\r\n } else {\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'WrinklerNotification',\r\n 'A Wrinkler appeared',\r\n 'A new wrinkler has appeared',\r\n );\r\n }\r\n } else {\r\n LastWrinklerCount = CurrentWrinklers;\r\n }\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { CacheSpawnedGoldenShimmer, CacheGoldenShimmersByID } from '../../Cache/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport CreateGCTimer from '../../Disp/GoldenCookieTimers/GoldenCookieTimers';\r\nimport { UpdateFavicon } from '../../Disp/TabTitle/FavIcon';\r\nimport { GCTimers } from '../../Disp/VariablesAndData';\r\nimport {\r\n CurrSpawnedGoldenCookieState,\r\n LastGoldenCookieState,\r\n LastSpawnedGoldenCookieState,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * Auxilirary function that finds all currently spawned shimmers.\r\n * CM.Cache.spawnedGoldenShimmer stores the non-user spawned cookie to later determine data for the favicon and tab-title\r\n * It is called by CM.CM.Main.CheckGoldenCookie\r\n */\r\nfunction FindShimmer() {\r\n CurrSpawnedGoldenCookieState = 0;\r\n CacheGoldenShimmersByID = {};\r\n Object.keys(Game.shimmers).forEach((i) => {\r\n CacheGoldenShimmersByID[Game.shimmers[i].id] = Game.shimmers[i];\r\n if (Game.shimmers[i].spawnLead && Game.shimmers[i].type === 'golden') {\r\n CacheSpawnedGoldenShimmer = Game.shimmers[i];\r\n CurrSpawnedGoldenCookieState += 1;\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * This function checks for changes in the amount of Golden Cookies\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckGoldenCookie() {\r\n FindShimmer();\r\n Object.keys(GCTimers).forEach((i) => {\r\n if (typeof CacheGoldenShimmersByID[i] === 'undefined') {\r\n GCTimers[i].parentNode.removeChild(GCTimers[i]);\r\n delete GCTimers[i];\r\n }\r\n });\r\n if (LastGoldenCookieState !== Game.shimmerTypes.golden.n) {\r\n LastGoldenCookieState = Game.shimmerTypes.golden.n;\r\n if (LastGoldenCookieState) {\r\n if (LastSpawnedGoldenCookieState < CurrSpawnedGoldenCookieState) {\r\n nF.createFlash('cookieMonsterMod', 3, 'GCFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCSoundURL,\r\n 'GCSound',\r\n 'GCVolume',\r\n false,\r\n );\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'GCNotification',\r\n 'Golden Cookie Spawned',\r\n 'A Golden Cookie has spawned. Click it now!',\r\n );\r\n }\r\n\r\n Object.keys(Game.shimmers).forEach((i) => {\r\n if (typeof GCTimers[Game.shimmers[i].id] === 'undefined') {\r\n CreateGCTimer(Game.shimmers[i]);\r\n }\r\n });\r\n }\r\n UpdateFavicon();\r\n LastSpawnedGoldenCookieState = CurrSpawnedGoldenCookieState;\r\n if (CurrSpawnedGoldenCookieState === 0) CacheSpawnedGoldenShimmer = 0;\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer === 1 &&\r\n LastGoldenCookieState\r\n ) {\r\n Object.keys(GCTimers).forEach((i) => {\r\n GCTimers[i].style.opacity = CacheGoldenShimmersByID[i].l.style.opacity;\r\n GCTimers[i].style.transform = CacheGoldenShimmersByID[i].l.style.transform;\r\n GCTimers[i].textContent = Math.ceil(CacheGoldenShimmersByID[i].life / Game.fps);\r\n });\r\n }\r\n}\r\n","/** Section: Functions related to the Golden Cookie Timers */\r\n\r\nimport { GCTimers } from '../VariablesAndData';\r\n\r\n/**\r\n * This function creates a new Golden Cookie Timer and appends it CM.Disp.GCTimers based on the id of the cookie\r\n * @param\t{object}\tcookie\tA Golden Cookie object\r\n */\r\nexport default function CreateGCTimer(cookie) {\r\n const GCTimer = document.createElement('div');\r\n GCTimer.id = `GCTimer${cookie.id}`;\r\n GCTimer.style.width = '96px';\r\n GCTimer.style.height = '96px';\r\n GCTimer.style.position = 'absolute';\r\n GCTimer.style.zIndex = '10000000001';\r\n GCTimer.style.textAlign = 'center';\r\n GCTimer.style.lineHeight = '96px';\r\n GCTimer.style.fontFamily = '\"Kavoon\", Georgia, serif';\r\n GCTimer.style.fontSize = '35px';\r\n GCTimer.style.cursor = 'pointer';\r\n GCTimer.style.display = 'block';\r\n GCTimer.style.pointerEvents = 'none';\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer === 0)\r\n GCTimer.style.display = 'none';\r\n GCTimer.style.left = cookie.l.style.left;\r\n GCTimer.style.top = cookie.l.style.top;\r\n GCTimer.onclick = function () {\r\n cookie.pop();\r\n };\r\n GCTimer.onmouseover = function () {\r\n cookie.l.style.filter = 'brightness(125%) drop-shadow(0px 0px 3px rgba(255,255,255,1))'; // eslint-disable-line no-param-reassign\r\n cookie.l.style.webkitFilter = 'brightness(125%) drop-shadow(0px 0px 3px rgba(255,255,255,1))'; // eslint-disable-line no-param-reassign\r\n };\r\n GCTimer.onmouseout = function () {\r\n cookie.l.style.filter = ''; // eslint-disable-line no-param-reassign\r\n cookie.l.style.webkitFilter = ''; // eslint-disable-line no-param-reassign\r\n };\r\n\r\n GCTimers[cookie.id] = GCTimer;\r\n l('shimmers').appendChild(GCTimer);\r\n}\r\n","/** This includes all headers of Cookie Monster and their relevant data */\r\nconst headers = {\r\n Favourite: 1,\r\n Calculation: 1,\r\n Notation: 1,\r\n Colours: 1,\r\n BarsDisplay: 1,\r\n Tooltip: 1,\r\n Statistics: 1,\r\n Notification: 1,\r\n NotificationGeneral: 1,\r\n NotificationGC: 1,\r\n NotificationFC: 1,\r\n NotificationSea: 1,\r\n NotificationGard: 1,\r\n NotificationMagi: 1,\r\n NotificationWrink: 1,\r\n NotificationWrinkMax: 1,\r\n Miscellaneous: 1,\r\n Lucky: 1,\r\n Chain: 1,\r\n Spells: 1,\r\n Garden: 1,\r\n Prestige: 1,\r\n Wrink: 1,\r\n Sea: 1,\r\n Achievs: 1,\r\n Misc: 1,\r\n infoMenu: 1,\r\n optionsMenu: 1,\r\n};\r\n\r\nexport default headers;\r\n","import { saveAndLoadingFunctions } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\n\r\nimport headers from '../Data/headers';\r\nimport { VersionMajor, VersionMinor } from '../Data/Moddata';\r\nimport settings from '../Data/settings';\r\nimport UpdateColours from '../Disp/HelperFunctions/UpdateColours';\r\nimport CMLoopHook from '../Main/LoopHook';\r\nimport InitData from '../Sim/InitializeData/InitData';\r\n\r\n/**\r\n * This creates a load function to the CM object. Per Game code/comments:\r\n * \"do stuff with the string data you saved previously\"\r\n */\r\nexport default function load(str) {\r\n InitData();\r\n\r\n // Load saveData\r\n saveAndLoadingFunctions.loadMod('cookieMonsterMod', str, settings, headers, CMLoopHook);\r\n if (\r\n typeof Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames ===\r\n 'undefined'\r\n ) {\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames = [];\r\n }\r\n\r\n // Update display with colours and locking of minigames\r\n UpdateColours();\r\n for (\r\n let index = 0;\r\n index < Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.length;\r\n index++\r\n ) {\r\n const buildingIndex =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames[index];\r\n l(`row${buildingIndex}`).style.pointerEvents = 'none';\r\n l(`row${buildingIndex}`).style.opacity = '0.4';\r\n l(`productLock${buildingIndex}`).innerHTML = 'Unlock';\r\n l(`productLock${buildingIndex}`).style.pointerEvents = 'auto';\r\n }\r\n\r\n // Notify of update\r\n if (\r\n typeof Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.version !== 'undefined' &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.version !==\r\n `${VersionMajor}.${VersionMinor}`\r\n ) {\r\n if (Game.prefs.popups)\r\n Game.Popup(\r\n 'A new version of Cookie Monster has been loaded, check out the release notes in the info tab!',\r\n );\r\n else\r\n Game.Notify(\r\n 'A new version of Cookie Monster has been loaded, check out the release notes in the info tab!',\r\n '',\r\n '',\r\n 0,\r\n 1,\r\n );\r\n }\r\n}\r\n","import init from './InitSaveLoad/init';\r\nimport load from './InitSaveLoad/load';\r\nimport save from './InitSaveLoad/save';\r\n\r\nconst CM = {\r\n init,\r\n load,\r\n save,\r\n};\r\n\r\nif (typeof Steam !== 'undefined') {\r\n // Need to add a delay for steam\r\n setTimeout(function () {\r\n Game.registerMod('CookieMonster', CM);\r\n\r\n // Game.registerMod also calls CM.load() which calls the loop hook\r\n // Thus sounds normally play at start up as Season and Garden states are checked\r\n window.cookieMonsterFrameworkData.isInitializing = false;\r\n }, 2000);\r\n} else {\r\n Game.registerMod('CookieMonster', CM);\r\n window.cookieMonsterFrameworkData.isInitializing = false;\r\n}\r\n","import { initFunctions } from '@cookiemonsterteam/cookiemonsterframework';\r\nimport { VersionMajor, VersionMinor } from '../Data/Moddata';\r\nimport CMDrawHook from '../Disp/DrawHook';\r\nimport CMClickHook from '../Main/ClickHook';\r\nimport InitializeCookieMonster from '../Main/Initialization';\r\nimport CMLoopHook from '../Main/LoopHook';\r\nimport load from './load';\r\n\r\n/**\r\n * This creates a init function for the CM object. Per Game code/comments:\r\n * \"this function is called as soon as the mod is registered\r\n * declare hooks here\"\r\n * It starts the further initialization of CookieMonster and registers hooks\r\n */\r\nexport default function init() {\r\n let proceed = true;\r\n\r\n // Load Cookie Monster Mod Framework and register mod\r\n initFunctions.initModFramework();\r\n window.cookieMonsterFrameworkData.isInitializing = true;\r\n initFunctions.registerMod('cookieMonsterMod');\r\n\r\n if (Game.version !== Number(VersionMajor)) {\r\n // eslint-disable-next-line no-restricted-globals, no-alert\r\n proceed = confirm(\r\n `Cookie Monster version ${VersionMajor}.${VersionMinor} is meant for Game version ${VersionMajor}. Loading a different version may cause errors. Do you still want to load Cookie Monster?`,\r\n );\r\n }\r\n if (proceed) {\r\n InitializeCookieMonster();\r\n Game.registerHook('click', CMClickHook);\r\n Game.registerHook('draw', CMDrawHook);\r\n Game.registerHook('logic', CMLoopHook);\r\n\r\n // Load default settings if no previous saveData is found\r\n if (typeof Game.modSaveData.cookieMonsterMod === 'undefined') {\r\n load('{}');\r\n }\r\n }\r\n}\r\n","/** Data related directly to Cookie Monster */\r\n\r\nexport const VersionMajor = '2.052';\r\nexport const VersionMinor = '10';\r\n\r\n/** Information about Cookie Monster to be displayed in the info section */\r\nexport const ModDescription = `<a href=\"https://github.com/CookieMonsterTeam/CookieMonster\" target=\"blank\">Cookie Monster</a>\r\n offers a wide range of tools and statistics to enhance your game experience.\r\n It is not a cheat interface – although it does offer helpers for golden cookies and such, everything can be toggled off at will to only leave how much information you want.</br>\r\n Progess on new updates and all previous release notes can be found on the GitHub page linked above!</br>\r\n Please also report any bugs you may find over there!</br>\r\n `;\r\n\r\n/** Latest releasenotes of Cookie Monster to be displayed in the info section */\r\nexport const LatestReleaseNotes = `This update adds support for some parts of cookie clicker 2.048</br>\r\n- added support for Dragon Aura 'Supreme Intellect' in the pantheon calculations</br>\r\n- added support for new tiers of Shimmering veil</br>\r\n- added support for unshackled upgrades</br>\r\n- updated some simulator logic to more cloesly match updated cookie clicker logic</br>\r\n- Bugfix: conjure backed goods tooltip used cached no gold switch raw cps instead of live cps</br>\r\n- Bugfix: negative calculations due to glucosimium upgrades, kittens, unshackled, and achievements</br>`;\r\n","import { VersionMajor, VersionMinor } from '../Data/Moddata';\r\n\r\n/**\r\n * This creates a save function to the CM object. Per Game code/comments:\r\n * \"use this to store persistent data associated with your mod\r\n * return 'a string to be saved';\"\r\n */\r\nexport default function save() {\r\n const saveObject = Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod;\r\n saveObject.version = `${VersionMajor}.${VersionMinor}`;\r\n return JSON.stringify(saveObject);\r\n}\r\n"],"names":["global","factory","module","exports","document","win","Error","window","this","BoxShadow","funcName","elm","jsc","jscolor","initialized","instances","readyQueue","register","addEventListener","pub","init","installBySelector","selector","rootNode","node","elms","querySelectorAll","matchClass","RegExp","lookupClass","i","length","dataOpts","m","undefined","type","toLowerCase","isColorAttrSupported","getDataAttr","className","match","targetElm","optsStr","console","warn","docsRef","opts","trim","parseOptionsStr","e","str","JSON","parse","eParse","looseJSON","Function","eEval","getInstances","inst","targetElement","push","createEl","tagName","el","createElement","setData","nodeOrSelector","sel","querySelector","isNode","val","Node","nodeType","nodeName","removeChildren","firstChild","removeChild","isTextInput","isButton","n","indexOf","isButtonEmpty","value","textContent","isPassiveEventSupported","supported","Object","defineProperty","get","removeEventListener","setAttribute","dataProp","obj","arguments","data","hasOwnProperty","prop","map","removeData","getData","setDefault","name","attrName","getAttribute","setDataAttr","_attachedGroupEvents","attachGroupEvent","groupName","evnt","func","detachGroupEvents","evt","preventDefault","returnValue","captureTarget","target","setCapture","_capturedTarget","releaseTarget","releaseCapture","triggerEvent","eventName","bubbles","cancelable","ev","Event","createEvent","initEvent","dispatchEvent","triggerInputEvent","eventKey","keys","code","keyCode","strList","replace","split","hasClass","classList","contains","addClass","classNames","add","removeClass","repl","remove","getCompStyle","getComputedStyle","currentStyle","setStyle","styles","important","reversible","priority","origStyle","setVal","style","setProperty","hexColor","r","g","b","Math","round","toString","substr","toUpperCase","hexaColor","a","rgbColor","rgbaColor","linearGradient","stdName","prefixes","helper","tryFunc","tryVal","background","getFuncName","Array","prototype","join","call","setBorderRadius","setBoxShadow","getElementPos","relativeToViewport","x","y","rect","getBoundingClientRect","left","top","viewPos","getViewPos","getElementSize","offsetWidth","offsetHeight","getAbsPointerPos","changedTouches","clientX","clientY","getRelPointerPos","targetRect","srcElement","doc","documentElement","pageXOffset","scrollLeft","clientLeft","pageYOffset","scrollTop","clientTop","getViewSize","innerWidth","clientWidth","innerHeight","clientHeight","RGB_HSV","min","v","max","h","HSV_RGB","s","u","floor","parseColorString","ret","rgba","format","parseInt","charAt","mR","mG","mB","mA","par","re","parseFloat","parsePaletteValue","mixed","vals","isArray","colors","color","containsTranparentColor","isAlphaFormat","scaleCanvasForHighDPR","canvas","dpr","devicePixelRatio","width","height","getContext","scale","genColorPreviewCanvas","separatorPos","specWidth","scaleForHighDPR","sepW","previewSeparator","sqSize","chessboardSize","sqColor1","chessboardColor1","sqColor2","chessboardColor2","cWidth","cHeight","ctx","fillStyle","fillRect","start","clearRect","lineWidth","beginPath","strokeStyle","moveTo","lineTo","stroke","genColorPreviewGradient","position","params","apply","redrawPosition","picker","owner","tp","vp","thisObj","fixed","c","ts","vs","pd","getPickerDims","ps","borderW","borderH","l","smartPosition","pp","positionValue","contractShadow","_drawPosition","vShadow","shadowBlur","wrap","boxS","shadow","shadowColor","w","controlBorderWidth","sliderSpace","getControlPadding","sliderSize","getSliderChannel","hasAlphaChannel","pal","getPaletteDims","padding","closeButton","buttonHeight","pW","pH","contentW","contentH","paddedW","paddedH","borderWidth","palette","cols","rows","cellW","cellH","sampleCount","_palette","paletteCols","ceil","paletteSpacing","paletteHeight","pointerBorderWidth","pointerThickness","getPadYChannel","mode","triggerCallback","callback","error","triggerGlobal","eventNames","trigger","_pointerMoveEvent","mouse","touch","_pointerEndEvent","_pointerOrigin","onDocumentKeyUp","tryHide","onWindowResize","onWindowScroll","onParentScroll","onDocumentMouseDown","showOnClick","disabled","show","onControlPointerStart","onPickerTouchStart","controlName","pointerType","registerDragEvents","offset","onDocumentPointerMove","onDocumentPointerEnd","parent","frameElement","ofs","abs","rel","channels","fromHSVA","setPad","setSld","setASld","onPaletteSampleClick","currentTarget","_setFormat","getFormat","paletteSetsAlpha","_paletteHasTransparency","fromRGBA","hideOnPaletteClick","hide","ofsX","ofsY","pointerAbs","xVal","yVal","fmt","createPadCanvas","draw","hGrad","createLinearGradient","addColorStop","vGrad","createSliderGradient","color1","color2","grad","createASliderGradient","hShadow","blur","spread","inset","flags","leaveValue","leaveAlpha","leavePreview","enumOpts","previewPosition","alphaChannel","deprecatedOpts","THIS","setOption","option","oldOpt","newOpt","setter","getOption","getter","drawPicker","_processParentElementsInDOM","box","boxB","pad","padB","padM","padCanvas","cross","crossBY","crossBX","crossLY","crossLX","sld","sldB","sldM","sldGrad","sldPtrS","sldPtrIB","sldPtrMB","sldPtrOB","asld","asldB","asldM","asldGrad","asldPtrS","asldPtrIB","asldPtrMB","asldPtrOB","btn","btnT","appendChild","passive","insetColors","outsetColor","p","displaySlider","displayAlphaSlider","pickerDims","crossOuterSize","crossSize","controlPadding","borderRadius","PI","clear","zIndex","border","borderColor","backgroundColor","opacity","controlBorderColor","cursor","instance","control","pointerBorderColor","pointerColor","overflow","display","sliderInnerSpace","innerHTML","chessboard","si","sampleColor","sampleCssColor","sc","sw","backgroundImage","toDataURL","backgroundRepeat","backgroundPosition","bottom","maxWidth","whiteSpace","buttonColor","font","textAlign","onmousedown","lineHeight","createTextNode","closeText","redrawPad","redrawSld","redrawASld","activeClassName","container","body","parentNode","yChannel","rgb1","rgb2","rgb","toHEXString","sldChannel","isPickerOwner","alpha","random","onChange","onInput","valueElement","alphaElement","previewElement","previewSize","previewPadding","required","hash","uppercase","forceStyle","hideOnLeave","minS","maxS","minV","maxV","minA","maxA","redraw","exposeColor","success","opt","channel","res","evs","callbackProp","isNaN","hsv","fromHSV","fromRGB","fromString","setPreviewElementBg","setValueElementValue","randomize","minH","maxH","toHEXAString","toRGBString","toRGBAString","toGrayscale","toCanvas","toBackground","isLight","_currentFormat","processValueInput","processAlphaInput","colorStr","alphaVal","setAlphaElementValue","backgrounds","image","size","repeat","origin","preview","bg","sty","right","_parentElementsProcessed","compStyle","set__palette","options","presetsArr","preset","slice","pres","presets","nonProperties","test","valueElementOrigEvents","oninput","oldVal","initValue","initAlpha","install","shift","ready","triggerNow","installByClassName","JSColor","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","__esModule","d","definition","key","o","enumerable","Setting","constructor","defaultValue","group","cookieMonsterPrompt","content","Game","promptWrapL","promptL","forEach","id","onclick","PlaySound","children","promptAnchorL","darkenL","focus","promptOn","UpdatePrompt","createFlash","modName","configName","forced","mods","cookieMonsterFramework","saveData","settings","cookieMonsterFrameworkData","isInitializing","setTimeout","fps","saveFramework","modSaveString","stringify","cookieClickerSaveString","b64_to_utf8","unescape","localStorage","getItem","pattern","modSave","newSaveString","setItem","escape","utf8_to_b64","toggleHeader","headerName","headers","playCMSound","url","sndConfig","volConfig","sound","Audio","GeneralSound","volume","play","toggleConfigVolume","addMenu","_","observer","disconnect","onMenu","menu","insertBefore","frameworkInfoDiv","titleDiv","buttonSpan","fontSize","verticalAlign","infoMenu","UpdateMenu","descriptionDiv","createFrameworkInfoMenuSection","listeners","addInfoMenuSection","observe","getElementById","attributes","childList","subtree","drawLoop","optionsMenu","loadMod","settingsData","headersData","logicLoop","saveDataObject","modSaveData","settingsObject","headersObject","favouriteSettings","createSaveDataObject","load","MutationObserver","WhiteScreen","pointerEvents","createFlashScreen","registerHook","save","initFunctions","registerMod","menuFunctions","createInfoListing","listingHTML","listingDiv","createOptionsListing","updateColoursFunc","refreshScaleFunc","div","FavouriteSettings","favourites","FavStar","includes","innerText","filter","ele","toggleFavouriteSetting","onmouseover","tooltip","onmouseout","createFavouriteStar","toggle","label","toggleConfig","desc","title","float","percent","slider","step","onchange","span","input","readOnly","inputPrompt","outerHTML","ClosePrompt","innerSpan","displayName","event","saveObject","altKey","ctrlKey","shiftKey","toggleConfigKeycode","createOptionsSubHeader","text","modDisplayName","menuName","modSectionDiv","notificationsFunctions","createNotification","message","visibilityState","Notification","badge","saveAndLoadingFunctions","settingClasses","super","ToggleWrinklerButtons","cookieMonsterMod","WrinklerButtons","elderWrath","CacheAverageCookiesFromClicks","CookiesDiff","WrinkDiff","WrinkFattestDiff","ChoEggDiff","ClicksDiff","HeavenlyChipsDiff","CacheLastCPSCheck","CacheLastCookies","CacheLastWrinkCookies","CacheLastWrinkFattestCookies","CacheLastClicks","CacheAverageGainBank","CacheAverageGainWrink","CacheAverageGainWrinkFattest","CacheAverageGainChoEgg","CacheAverageCPS","CacheLastHeavenlyCheck","CacheLastHeavenlyChips","CacheDoRemakeBuildPrices","CacheHadBuildAura","SimBuildingsOwned","SimUpgradesOwned","SimPledges","SimAchievementsOwned","SimHeavenlyPower","SimPrestige","SimDragonAura","SimDragonAura2","SimGod1","SimGod2","SimGod3","SimDoSims","SimEffs","SimCookiesPs","SimCookiesPsRaw","CacheDragonAura","CacheDragonAura2","CacheLastDragonLevel","CacheCostDragonUpgrade","CacheLucky","CacheLuckyReward","CacheLuckyWrathReward","CacheLuckyFrenzy","CacheLuckyRewardFrenzy","CacheLuckyWrathRewardFrenzy","CacheConjure","CacheConjureReward","CacheEdifice","CacheEdificeBuilding","CacheNoGoldSwitchCookiesPS","CacheDragonsFortuneMultAdjustment","CacheGoldenCookiesMult","CacheWrathCookiesMult","CacheHCPerSecond","CacheCentEgg","CacheSeaSpec","CacheLastChoEgg","CacheObjects1","CacheObjects10","CacheObjects100","CacheObjectsNextAchievement","CacheWrinklersTotal","CacheWrinklersNormal","CacheWrinklersFattest","CacheCurrWrinklerCPSMult","CacheCurrWrinklerCount","CacheUpgrades","CacheAverageClicks","CacheMissingUpgrades","CacheMissingUpgradesPrestige","CacheMissingUpgradesCookies","CacheChainRequired","CacheChainRequiredNext","CacheChainMaxReward","CacheChainWrathRequired","CacheChainWrathRequiredNext","CacheChainWrathMaxReward","CacheChainFrenzyRequired","CacheChainFrenzyRequiredNext","CacheChainFrenzyMaxReward","CacheChainFrenzyWrathRequired","CacheChainFrenzyWrathRequiredNext","CacheChainFrenzyWrathMaxReward","CacheRealCookiesEarned","CacheAvgCPSWithChoEgg","CacheSpawnedGoldenShimmer","CacheSeasonPopShimmer","CacheTimeTillNextPrestige","CacheMinPP","CacheMinPPBulk","CachePPArray","CacheGoldenShimmersByID","CacheSellForChoEgg","CacheGods","SimObjects","SimUpgrades","SimAchievements","SimAuraMult","what","dragonAuras","dragonLevel","dragonAurasBN","SimGetSellMultiplier","giveBack","SimEff","def","SimHas","it","ascensionMode","pool","tier","bought","SimHasAura","SimHasGod","hasGod","Temple","minigame","Objects","god","gods","SimModifyBuildingPrice","building","price","ModifiedPrice","hasBuff","fortune","minigameLoaded","godLvl","BuildingSell","build","basePrice","free","amount","noSim","noSimRes","toChange","startingAmount","moni","buyBulk","priceIncrease","modifyBuildingPrice","getSellMultiplier","metric","shortScale","shortScaleAbbreviated","LastModCount","TooltipLumpBackup","BackupGrimoireLaunch","BackupGrimoireLaunchMod","BackupGrimoireDraw","HasReplaceNativeGrimoireLaunch","HasReplaceNativeGrimoireDraw","LoadMinigames","LastSeasonPopupState","LastTickerFortuneState","LastGardenNextStep","LastGoldenCookieState","LastSpawnedGoldenCookieState","LastMagicBarFull","CurrSpawnedGoldenCookieState","LastWrinklerCount","DispCSS","TooltipBuildBackup","TooltipGrimoireBackup","TooltipUpgradeBackup","BackupFunctions","CycliusDateAtBeginLoop","Date","now","CenturyDateAtBeginLoop","num","floats","decimals","ScaleDecimals","Infinity","Scale","Beautify","Number","isFinite","answer","ScaleCutoff","ScaleSeparator","toLocaleString","toExponential","exponential","AmountOfTenPowerThree","toFixed","log","ColourTextPre","ColourBackPre","ColourBlue","ColourGreen","ColourYellow","ColourOrange","ColourRed","ColourPurple","ColourGray","ColourPink","ColourBrown","ColoursOrdering","TooltipText","SimpleTooltipElements","CMLastAscendState","TooltipWrinklerArea","TooltipWrinkler","TooltipWrinklerBeingShown","CMSayTime","LastTargetBotBar","LastTargetBuildings","LastTargetTooltipBuilding","CookieTimes","ClickTimes","BuffColours","Frenzy","Clot","Dragonflight","TooltipPrice","TooltipBonusIncome","TooltipType","TooltipName","TooltipBonusMouse","LastAscendState","LastNumberOfTimers","GCTimers","Title","UpdateBuildings","arr","buyMode","removeProperty","BuildColour","colour","SortBuildings","k","sort","amountUntilNext","AmountNeeded","priceUntilNext","gridRow","UpdateUpgradeSectionsHeight","values","getElementsByClassName","section","UpgradesNeverCollapse","minHeight","UpdateUpgrades","UpBarColour","blue","green","yellow","orange","red","purple","gray","UpgradesInStore","me","addedColour","j","childNodes","SortUpgrades","nameChecker","arr2","upgrade","findIndex","order","FormatTime","time","longFormat","formattedTime","TimeFormat","GetTimeColour","GetCPS","CPSMode","CalcWrink","cookiesPs","cpsSucked","wrinklers","GetWrinkConfigBank","CreateTimer","bars","timerBar","margin","marginRight","colourBar","borderTopRightRadius","borderBottomRightRadius","timer","marginLeft","CreateBotBarBuildingColumn","buildingName","bonus","header","substring","lastChild","paddingLeft","UpdateBotBar","BotBar","count","PPString","PPDisplayTime","timeColour","bulkPrice","cookies","UpdateBackground","Background","LeftBackground","DrawBackground","UpdateBotTimerBarPosition","TimerBar","TimerBarPos","ToggleTimerBar","CacheDragonAuras","dragonAura","dragonAura2","InitAchievement","achievementName","Achievements","you","SimGetTieredCpsMult","mult","tieredUpgrades","Tiers","special","tierMult","unshackleUpgrade","synergies","syn","buildingTie1","buildingTie2","grandma","Grandma","misfortune","vanilla","InitialBuildingData","cps","magicCpS","ComputeCps","GrandmaSynergies","UpgradesByPool","kitten","Portal","baseCps","baseCPS","InitUpgrade","upgradeName","Upgrades","power","level","pow","CopyData","UpgradesOwned","pledges","AchievementsOwned","heavenlyPower","prestige","totalCookies","slot","won","TooltipCreateHeader","fontWeight","TooltipCreateCalculationSection","income","marginBottom","click","production","ColourOfPP","PPSecondsLowerLimit","PPOnlyConsiderBuyable","GetCPSBuffMult","buffs","multCpS","SimWin","CalculateGains","effs","myEffs","ii","heavenlyMult","SimGetHeavenlyMultiplier","heralds","cookieUpgrades","buildMult","sin","santaLevel","milkProgress","milkMult","catMult","storedCps","eggMult","day","startDate","lumps","rawCookiesPs","CpsAchievements","threshold","shimmerTypes","golden","auraMult","bakeryName","goldenSwitchMult","upgrades","goldenCookieUpgrades","veilMult","runModHookOnValue","Fortunes","HalloCookies","ChristCookies","ValCookies","PlantDrops","SimHasAchiev","CheckOtherAchiev","grandmas","buildingsOwned","mathematician","base10","minAmount","ObjectsById","Cursor","hasAllHalloCook","hasAllChristCook","list","fortunes","BuyBuildingsBonusIncome","tieredAchievs","achievUnlock","lastAchievementsOwned","CalculateGrimoireRefillTime","currentMagic","maxMagic","targetMagic","magic","ToggleToolWarnPos","ToolWarnPos","UpdateTooltips","tooltipBox","paddingBottom","TooltipBuildUpgrade","increase","productionAchievs","HasAchiev","achiev","nextProductionAchiev","ObjectsTillNext","PPOfAmount","PPFrag","Building","getPrice","bonusMouse","previousSibling","chocolate","Upgrade","TooltipLump","lumpType","lumpColour","lumpCurrentType","SugarLump","spellCost","getSpellCost","spellsById","TooltipGrim","magicM","recover","recoverColour","conjure","reward","seperator","loss","Grimoire","Farm","TooltipPlots","plot","mature","plantsById","plantName","GardenPlots","totalGain","mortal","tile","immortal","matureBase","HarvestAll","WrinklerReward","WrinklerButton","TooltipPantheon","GodID","cps1","cps2","cps3","PantheonGods","TooltipWarn","create","boxId","labelTextFront","labelTextBack","deficitId","transition","labelDiv","labelSpan","deficitDiv","deficitSpan","ToolWarnUser","bonusIncomeUsed","ToolWarnBon","limitLucky","bonusNoFren","ToolWarnLucky","ToolWarnLuckyFrenzy","limitLuckyFrenzy","ToolWarnConjure","limitConjure","ToolWarnConjureFrenzy","limitConjureFrenzy","ToolWarnEdifice","Warnings","CMDrawHook","prefs","autosave","drawT","Stats","sayTime","T","maxWidthTwoBar","maxWidthOneBar","numberOfTimers","AutosaveTimerBar","timeTillNextAutosave","OnAscend","TimerBarOverlay","spawned","Has","minTime","maxTime","chanceToSpawn","season","reindeer","BuffTimerBars","classColour","UpdateTimerBar","TooltipWrink","showingTooltip","phase","selected","placeholder","wrinkler","minWidth","CheckWrinklerTooltip","sucked","toSuck","UpdateWrinklerTooltip","UpStats","CMClickHook","addLatest","computedMouseCps","CMAvgQueue","maxLength","queue","newValue","calcAverage","timePeriod","calcSum","reduce","FillCMDCache","caches","CookieMonsterData","Cache","exportName","CacheAvgCPS","currDate","choEggTotal","cookiesEarned","timeDiff","bankDiffAvg","wrinkDiffAvg","wrinkFattestDiffAvg","choEggDiffAvg","clicksDiffAvg","cookieClicks","cpsLength","AvgCPSHist","choEgg","HasUnlocked","AvgClicksHist","BuildingGetPrice","partialPrice","CacheColour","PPRigidelMode","PPExcludeTop","CachePP","indexOfMin","CacheBuildingsPP","Objects1","Objects10","Objects100","entries","BuyUpgradesBonusIncome","unlocked","CountsAsUpgradeOwned","diffMouseCPS","multClick","out","MouseCps","CacheBuildingIncome","result","CacheBuildingsPrices","CacheIncome","bonusIncome","CacheUpgradeIncome","MaxChainCookieReward","digit","maxPayout","totalFromChain","nextMoni","nextRequired","chain","LN10","CacheChain","cpsBuffMult","CacheHeavenlyChipsPS","chipsOwned","HowMuchPrestige","cookiesReset","ascendNowToGet","heavenlyChipsDiffAvg","CacheAllMissingUpgrades","classes","noFrame","crates","icon","iconFunction","getDynamicTooltip","crateMissing","CacheSeasonSpec","CacheStatsCookies","CacheGoldenAndWrathCookiesMults","goldenMult","wrathMult","eff","AllAmountTillNextAchievement","forceRecalc","TotalNeeded","tillNext","AchievementsAtStart","index","lastIndexWithChange","IndividualAmountTillNextAchievement","CacheWrinklers","InitCache","PopAllNormalWrinklers","hp","CreateTooltip","TooltipAmor","buildPrice","amortizeAmount","storedTotalCps","globalCpsMult","crateTooltip","lumpTooltip","spellTooltip","tileTooltip","toolTooltip","godTooltip","slotTooltip","area","UpdateFavicon","Favicon","wrath","href","InitData","ReplaceTooltipGrimoire","dynamic","wobble","ReplaceNativeGrimoireDraw","GrimoireBar","magicBarTextL","magicBarL","ReplaceNativeGrimoire","launch","ReplaceNativeGrimoireLaunch","CacheDragonCost","dragonLevels","buy","objectMatch","replaceAll","cost","ConfigGroups","Favourite","Calculation","Notation","Colours","BarsDisplay","Tooltip","Statistics","Miscellaneous","ConfigGroupsNotification","NotificationGeneral","NotificationGC","NotificationFC","NotificationSea","NotificationGard","NotificationMagi","NotificationWrink","NotificationWrinkMax","ToggleOnOff","checkNotificationPromise","requestPermission","then","RefreshScale","BeautifyAll","RefreshStore","RebuildUpgrades","ToggleBotBar","DetailedTime","UpgradeBarFixedPos","DragonAuraInfo","GCTimer","HideSectionsButtons","TooltipAscendButton","MissingUpgrades","MissingAchievements","HeavenlyChipsTarget","ShowMissedGC","GCNotification","GCFlash","ColourGCFlash","GCSound","GCVolume","GCSoundURL","FortuneNotification","FortuneFlash","ColourFortuneFlash","FortuneSound","FortuneVolume","FortuneSoundURL","SeaNotification","SeaFlash","ColourSeaFlash","SeaSound","SeaVolume","SeaSoundURL","GardFlash","ColourGardFlash","GardSound","GardVolume","GardSoundURL","MagicNotification","MagicFlash","ColourMagicFlash","MagicSound","MagicVolume","MagicSoundURL","WrinklerNotification","WrinklerFlash","ColourWrinklerFlash","WrinklerSound","WrinklerVolume","WrinklerSoundURL","WrinklerMaxNotification","WrinklerMaxFlash","ColourWrinklerMaxFlash","WrinklerMaxSound","WrinklerMaxVolume","WrinklerMaxSoundURL","BulkBuyBlock","UpdateColours","createMenuOptions","menuDiv","subGroup","subGroupObject","CountSevens","number","String","CalculateSevenDelta","digitPlace","modulus","delta","StatsHeader","config","fontFamily","ToggleHeader","StatsListing","listingName","StatsMissDispListing","current","StatsMissDisp","theMissDisp","frag","createDocumentFragment","missing","AddMenuStats","stats","Lucky","goldCookTooltip","luckyColour","luckyTime","luckyReqFrag","luckyReqSpan","luckyReqSmall","luckyColourFrenzy","luckyTimeFrenzy","luckyReqFrenFrag","luckyReqFrenSpan","luckyReqFrenSmall","luckySplit","luckyRewardMaxSpan","luckyRewardFrenzyMaxSpan","luckyCurBase","luckyCurSpan","Chain","chainColour","chainTime","chainReqFrag","chainReqSpan","chainReqSmall","chainWrathColour","chainWrathTime","chainWrathReqFrag","chainWrathReqSpan","chainWrathReqSmall","chainColourFrenzy","chainTimeFrenzy","chainReqFrenFrag","chainReqFrenSpan","chainReqFrenSmall","chainWrathColourFrenzy","chainWrathTimeFrenzy","chainWrathReqFrenFrag","chainWrathReqFrenSpan","chainWrathReqFrenSmall","chainCurMax","chainCur","chainCurWrath","Spells","conjureColour","conjureTime","conjureReqFrag","conjureReqSpan","conjureReqSmall","conjureFrenzyColour","conjureFrenzyCur","conjureFrenzyTime","conjureFrenzyReqFrag","conjureFrenzyReqSpan","conjureFrenzyReqSmall","Garden","bakeberryColour","bakeberryFrag","chocorootColour","chocorootFrag","queenbeetColour","queenbeetFrag","duketaterColour","duketaterFrag","missingPlantDrops","Prestige","possiblePresMax","neededCook","HowManyCookiesReset","cookiesNextFrag","cookiesNextSmall","heavenlyChips","HCTarget","CookiesTillTarget","resetBonus","newHeavenlyChips","curCPS","ResetCPS","ResetBonus","resetFrag","resetSmall","currentPrestige","willHave","willGet","luckyDigit","luckyNumber","luckyPayout","currentLevel","sevenCount","numberOfDigits","localLevel","CalculateLuckyLevels","luckyDigitDelta","luckyDigitReset","fragLuckyDigit","luckyNumberDelta","luckyNumberReset","fragLuckyNumber","luckyPayoutDelta","luckyPayoutReset","fragLuckyPayout","Wrink","popAllFrag","popAllA","popFattestFrag","popFattestA","specDisp","missingHalloweenCookies","missingChristmasCookies","missingValentineCookies","missingNormalEggs","eggDrops","missingRareEggs","rareEggDrops","centEgg","Sea","failRateHalloween","dropRateMult","obtainedCookiesChance","failRateChristmas","dropRateEgg","StartingFailRate","failRateEgg","succesRateEgg","obtainedEggs","obtainedRareEggs","pNormal1","pRare1","pRedrop","Achievs","Misc","missedGoldenClicks","menuSection","prestigeUpgradesMissing","titlefrag","PrestigeUpgrades","normalUpgradesMissing","tech","nextSibling","cookieUpgradesMissing","cookie","achievs","parentElement","achievsCrate","AchievementsById","mouseDown","setOnCrate","tags","neuromancy","sesame","descFunc","tagsStr","CrateTooltipLockedAchievements","AddMissingAchievements","FixMouseY","timerBarHeight","mouseY","ReplaceNative","drawMod","from","update","updateMod","warnOffset","tta","tt","UpdateTooltipLocation","UpdateWrinklers","UpdateSpecial","ClickCookie","ClickProduct","DescribeDragonAura","aura","bonusCPS","priceOfChange","highestBuilding","CalculateChangeAura","timeToRecover","bonusCPSPercentage","div2","AddAuraInfo","ToggleSpecialMenu","on","shouldHide","AddDragonLevelUpTooltip","AddMenu","detail","Logic","titleGC","titleFC","titleSP","addFC","addSP","life","lastIndexOf","spawn","UpdateTitle","cookiesToNext","ReplaceAscendTooltip","InitializeCookieMonster","head","borderTop","textShadow","table","tbody","firstCol","td","CreateBotBar","CMTimerBarAutosave","CMTimerBarGC","CMTimerBarRen","TimerBarBuffTimers","CreateTimerBar","UpgradeBar","legend","legendLine","CreateUpgradeBarLegend","upgradeNumber","CreateUpgradeBar","CreateSectionHideButtons","getElementsByTagName","CreateFavicon","CreateSimpleTooltip","append","CreateWrinklerButtons","productButtons","button","lockedMinigames","toggleBuildingLock","canLumps","child","coords","ReplaceTooltipPantheon","popups","Popup","Notify","Win","CalculateChangeGod","CurrentSlot","godsById","CMLoopHook","AscendTimer","CachePantheonGods","sellTotal","Bank","marketGoods","goods","goodsVal","marketGood","stock","cookiesPsRawHighest","buildingsToSacrifice","SellBuildingsForChoEgg","CacheSellAllForChoEgg","hasBuildAura","godMult","CacheCurrWrinklerCPS","LoopCache","TickerEffect","shimmers","spawnLead","nextStep","CheckMagicMeter","CurrentWrinklers","getWrinklersMax","CheckWrinklerCount","pop","webkitFilter","CreateGCTimer","transform","buildingIndex","version","CM","proceed","confirm","Steam"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"CookieMonster.js","mappings":";8BAYA,SAAWA,EAAQC,GAElB,aAE4D,iBAAnBC,EAAOC,QAchDF,EAAQD,GAZPE,EAAOC,QAAUH,EAAOI,SACvBH,EAASD,GACT,SAAUK,GACT,IAAKA,EAAID,SACR,MAAM,IAAIE,MAAM,wCAEjB,OAAOL,EAAQI,EAChB,CAOF,CApBD,CAoBqB,oBAAXE,OAAyBA,OAASC,MAAM,SAAUD,GAK5D,aAGA,IAwgDME,EAt7BAC,EAzXAC,EAvNFC,EAFAC,GAEAD,EAAM,CAGTE,aAAc,EAEdC,UAAY,GAEZC,WAAa,GAGbC,SAAW,gBACY,IAAXV,GAA0BA,EAAOH,UAC3CG,EAAOH,SAASc,iBAAiB,mBAAoBN,EAAIO,IAAIC,MAAM,EAErE,EAGAC,kBAAoB,SAAUC,EAAUC,GAEvC,KADAA,EAAWA,EAAWX,EAAIY,KAAKD,GAAYhB,EAAOH,UAEjD,MAAM,IAAIE,MAAM,qBAQjB,IALA,IAAImB,EAAOF,EAASG,iBAAiBJ,GAGjCK,EAAa,IAAIC,OAAO,WAAahB,EAAIO,IAAIU,YAAc,6BAA8B,KAEpFC,EAAI,EAAGA,EAAIL,EAAKM,OAAQD,GAAK,EAAG,CAUxC,IAAIE,EAAUC,EARd,KAAIR,EAAKK,GAAGjB,SAAWY,EAAKK,GAAGjB,mBAAmBD,EAAIO,YAIjCe,IAAjBT,EAAKK,GAAGK,MAAoD,SAA9BV,EAAKK,GAAGK,KAAKC,gBAA4BxB,EAAIyB,wBAOzB,QAApDL,EAAWpB,EAAI0B,YAAYb,EAAKK,GAAI,aACpCL,EAAKK,GAAGS,YAAcN,EAAIR,EAAKK,GAAGS,UAAUC,MAAMb,KAClD,CACD,IAAIc,EAAYhB,EAAKK,GAEjBY,EAAU,GACG,OAAbV,EACHU,EAAUV,EAEAC,IACVU,QAAQC,KAAK,sFAAwFhC,EAAIiC,SACrGZ,EAAE,KACLS,EAAUT,EAAE,KAId,IAAIa,EAAO,KACX,GAAIJ,EAAQK,OACX,IACCD,EAAOlC,EAAIoC,gBAAgBN,EAG5B,CAFE,MAAOO,GACRN,QAAQC,KAAKK,EAAI,KAAOP,EACzB,CAGD,IACC,IAAI9B,EAAIO,IAAIsB,EAAWK,EAGxB,CAFE,MAAOG,GACRN,QAAQC,KAAKK,EACd,CACD,CACD,CACD,EAGAD,gBAAkB,SAAUE,GAC3B,IAAIJ,EAAO,KAEX,IACCA,EAAOK,KAAKC,MAAMF,EAanB,CAXE,MAAOG,GACR,IAAKzC,EAAIO,IAAImC,UACZ,MAAM,IAAIhD,MAAM,4CAA8C+C,GAG9D,IACCP,EAAO,IAAKS,SAAU,eAAiBL,EAAM,kDAAtC,EAGR,CAFE,MAAOM,GACR,MAAM,IAAIlD,MAAM,uCAAyCkD,EAC1D,CAEF,CACA,OAAOV,CACR,EAGAW,aAAe,WAEd,IADA,IAAIC,EAAO,GACF5B,EAAI,EAAGA,EAAIlB,EAAIG,UAAUgB,OAAQD,GAAK,EAE1ClB,EAAIG,UAAUe,IAAMlB,EAAIG,UAAUe,GAAG6B,eACxCD,EAAKE,KAAKhD,EAAIG,UAAUe,IAG1B,OAAO4B,CACR,EAGAG,SAAW,SAAUC,GACpB,IAAIC,EAAKxD,EAAOH,SAAS4D,cAAcF,GAEvC,OADAlD,EAAIqD,QAAQF,EAAI,OAAO,GAChBA,CACR,EAGAvC,KAAO,SAAU0C,GAChB,IAAKA,EACJ,OAAO,KAGR,GAA8B,iBAAnBA,EAA6B,CAEvC,IAAIC,EAAMD,EACNH,EAAK,KACT,IACCA,EAAKxD,EAAOH,SAASgE,cAAcD,EAIpC,CAHE,MAAOlB,GAER,OADAN,QAAQC,KAAKK,GACN,IACR,CAIA,OAHKc,GACJpB,QAAQC,KAAK,sCAAuCuB,GAE9CJ,CACR,CAEA,OAAInD,EAAIyD,OAAOH,GAEPA,GAGRvB,QAAQC,KAAK,qCAAsCsB,EAAgBA,GAC5D,KACR,EAIAG,OAAS,SAAUC,GAClB,MAAoB,iBAATC,KACHD,aAAeC,KAEhBD,GAAsB,iBAARA,GAA4C,iBAAjBA,EAAIE,UAAiD,iBAAjBF,EAAIG,QACzF,EAGAA,SAAW,SAAUjD,GACpB,SAAIA,IAAQA,EAAKiD,WACTjD,EAAKiD,SAASrC,aAGvB,EAGAsC,eAAiB,SAAUlD,GAC1B,KAAOA,EAAKmD,YACXnD,EAAKoD,YAAYpD,EAAKmD,WAExB,EAGAE,YAAc,SAAUd,GACvB,OAAOA,GAA2B,UAArBnD,EAAI6D,SAASV,IAA6C,SAA1BA,EAAG5B,KAAKC,aACtD,EAGA0C,SAAW,SAAUf,GACpB,IAAKA,EACJ,OAAO,EAER,IAAIgB,EAAInE,EAAI6D,SAASV,GACrB,MACQ,WAANgB,GACM,UAANA,GAAiB,CAAC,SAAU,SAAU,SAASC,QAAQjB,EAAG5B,KAAKC,gBAAkB,CAEpF,EAGA6C,cAAgB,SAAUlB,GACzB,OAAQnD,EAAI6D,SAASV,IACpB,IAAK,QAAS,OAASA,EAAGmB,OAA6B,KAApBnB,EAAGmB,MAAMnC,OAC5C,IAAK,SAAU,MAAkC,KAA1BgB,EAAGoB,YAAYpC,OAEvC,OAAO,IACR,EAIAqC,wBAA0B,WACzB,IAAIC,GAAY,EAEhB,IACC,IAAIvC,EAAOwC,OAAOC,eAAe,CAAC,EAAG,UAAW,CAC/CC,IAAK,WAAcH,GAAY,CAAM,IAEtC9E,EAAOW,iBAAiB,cAAe,KAAM4B,GAC7CvC,EAAOkF,oBAAoB,cAAe,KAAM3C,EACpC,CAAX,MAAOG,GAAI,CAEb,OAAOoC,CACP,CAZyB,GAe1BhD,sBACK1B,EAAMJ,EAAOH,SAAS4D,cAAc,YACpCrD,EAAI+E,eACP/E,EAAI+E,aAAa,OAAQ,SACK,SAA1B/E,EAAIwB,KAAKC,iBAQfuD,SAAW,gBAOX1B,QAAU,WACT,IAAI2B,EAAMC,UAAU,GAEpB,GAAyB,IAArBA,UAAU9D,OAAc,CAE3B,IAAI+D,EAAOF,EAAIG,eAAenF,EAAI+E,UAAYC,EAAIhF,EAAI+E,UAAaC,EAAIhF,EAAI+E,UAAY,CAAC,EAEpFT,EAAQW,UAAU,GAGtB,OADAC,EAHIE,EAAOH,UAAU,IAGRX,GACN,CAER,CAAO,GAAyB,IAArBW,UAAU9D,QAAwC,iBAAjB8D,UAAU,GAAiB,CAElEC,EAAOF,EAAIG,eAAenF,EAAI+E,UAAYC,EAAIhF,EAAI+E,UAAaC,EAAIhF,EAAI+E,UAAY,CAAC,EAAxF,IACIM,EAAMJ,UAAU,GAEpB,IAAK,IAAIG,KAAQC,EACZA,EAAIF,eAAeC,KACtBF,EAAKE,GAAQC,EAAID,IAGnB,OAAO,CACR,CAEA,MAAM,IAAI1F,MAAM,oBACjB,EAMA4F,WAAa,WACZ,IAAIN,EAAMC,UAAU,GACpB,IAAKD,EAAIG,eAAenF,EAAI+E,UAC3B,OAAO,EAER,IAAK,IAAI7D,EAAI,EAAGA,EAAI+D,UAAU9D,OAAQD,GAAK,EAAG,CAC7C,IAAIkE,EAAOH,UAAU/D,UACd8D,EAAIhF,EAAI+E,UAAUK,EAC1B,CACA,OAAO,CACR,EAGAG,QAAU,SAAUP,EAAKI,EAAMI,GAC9B,IAAKR,EAAIG,eAAenF,EAAI+E,UAAW,CAEtC,QAAmBzD,IAAfkE,EAGH,OAFAR,EAAIhF,EAAI+E,UAAY,CAAC,CAIvB,CACA,IAAIG,EAAOF,EAAIhF,EAAI+E,UAKnB,OAHKG,EAAKC,eAAeC,SAAwB9D,IAAfkE,IACjCN,EAAKE,GAAQI,GAEPN,EAAKE,EACb,EAGA1D,YAAc,SAAUyB,EAAIsC,GAC3B,IAAIC,EAAW,QAAUD,EAEzB,OADgBtC,EAAGwC,aAAaD,EAEjC,EAGAE,YAAc,SAAUzC,EAAIsC,EAAMnB,GACjC,IAAIoB,EAAW,QAAUD,EACzBtC,EAAG2B,aAAaY,EAAUpB,EAC3B,EAGAuB,qBAAuB,CAAC,EAGxBC,iBAAmB,SAAUC,EAAW5C,EAAI6C,EAAMC,GAC5CjG,EAAI6F,qBAAqBV,eAAeY,KAC5C/F,EAAI6F,qBAAqBE,GAAa,IAEvC/F,EAAI6F,qBAAqBE,GAAW/C,KAAK,CAACG,EAAI6C,EAAMC,IACpD9C,EAAG7C,iBAAiB0F,EAAMC,GAAM,EACjC,EAGAC,kBAAoB,SAAUH,GAC7B,GAAI/F,EAAI6F,qBAAqBV,eAAeY,GAAY,CACvD,IAAK,IAAI7E,EAAI,EAAGA,EAAIlB,EAAI6F,qBAAqBE,GAAW5E,OAAQD,GAAK,EAAG,CACvE,IAAIiF,EAAMnG,EAAI6F,qBAAqBE,GAAW7E,GAC9CiF,EAAI,GAAGtB,oBAAoBsB,EAAI,GAAIA,EAAI,IAAI,EAC5C,QACOnG,EAAI6F,qBAAqBE,EACjC,CACD,EAGAK,eAAiB,SAAU/D,GACtBA,EAAE+D,gBAAkB/D,EAAE+D,iBAC1B/D,EAAEgE,aAAc,CACjB,EAGAC,cAAgB,SAAUC,GAErBA,EAAOC,aACVxG,EAAIyG,gBAAkBF,EACtBvG,EAAIyG,gBAAgBD,aAEtB,EAGAE,cAAgB,WAEX1G,EAAIyG,kBACPzG,EAAIyG,gBAAgBE,iBACpB3G,EAAIyG,gBAAkB,KAExB,EAGAG,aAAe,SAAUzD,EAAI0D,EAAWC,EAASC,GAChD,GAAK5D,EAAL,CAIA,IAAI6D,EAAK,KAaT,MAXqB,mBAAVC,MACVD,EAAK,IAAIC,MAAMJ,EAAW,CACzBC,QAASA,EACTC,WAAYA,KAIbC,EAAKrH,EAAOH,SAAS0H,YAAY,UAC9BC,UAAUN,EAAWC,EAASC,KAG7BC,IAKLhH,EAAIqD,QAAQ2D,EAAI,YAAY,GAE5B7D,EAAGiE,cAAcJ,IACV,EAvBP,CAwBD,EAGAK,kBAAoB,SAAUlE,EAAI0D,EAAWC,EAASC,GAChD5D,GAGDnD,EAAIiE,YAAYd,IACnBnD,EAAI4G,aAAazD,EAAI0D,EAAWC,EAASC,EAE3C,EAGAO,SAAW,SAAUN,GACpB,IAAIO,EAAO,CACV,EAAG,MACH,GAAI,QACJ,GAAI,UAEL,MAAuB,iBAAZP,EAAGQ,KACNR,EAAGQ,UACelG,IAAf0F,EAAGS,SAAyBF,EAAKpC,eAAe6B,EAAGS,SACtDF,EAAKP,EAAGS,SAET,IACR,EAGAC,QAAU,SAAUpF,GACnB,OAAKA,EAGEA,EAAIqF,QAAQ,aAAc,IAAIC,MAAM,OAFnC,EAGT,EAIAC,SAAW,SAAU9H,EAAK4B,GACzB,QAAKA,SAGiBL,IAAlBvB,EAAI+H,UACA/H,EAAI+H,UAAUC,SAASpG,IAGvB,IAAM,IAAM5B,EAAI4B,UAAUgG,QAAQ,OAAQ,KAAO,KAAKvD,QAAQ,IAAMzC,EAAY,KACzF,EAIAqG,SAAW,SAAUjI,EAAK4B,GACzB,IAAIsG,EAAajI,EAAI0H,QAAQ/F,GAE7B,QAAsBL,IAAlBvB,EAAI+H,UAOR,IAAS5G,EAAI,EAAGA,EAAI+G,EAAW9G,OAAQD,GAAK,EACtClB,EAAI6H,SAAS9H,EAAKkI,EAAW/G,MACjCnB,EAAI4B,YAAc5B,EAAI4B,UAAY,IAAM,IAAMsG,EAAW/G,SAR1D,IAAK,IAAIA,EAAI,EAAGA,EAAI+G,EAAW9G,OAAQD,GAAK,EAC3CnB,EAAI+H,UAAUI,IAAID,EAAW/G,GAUhC,EAIAiH,YAAc,SAAUpI,EAAK4B,GAC5B,IAAIsG,EAAajI,EAAI0H,QAAQ/F,GAE7B,QAAsBL,IAAlBvB,EAAI+H,UAOR,IAAS5G,EAAI,EAAGA,EAAI+G,EAAW9G,OAAQD,GAAK,EAAG,CAC9C,IAAIkH,EAAO,IAAIpH,OACd,QAAUiH,EAAW/G,GAArB,YACS+G,EAAW/G,GADpB,aAES+G,EAAW/G,GAAK,SACzB,KAEDnB,EAAI4B,UAAY5B,EAAI4B,UAAUgG,QAAQS,EAAM,KAC7C,MAdC,IAAK,IAAIlH,EAAI,EAAGA,EAAI+G,EAAW9G,OAAQD,GAAK,EAC3CnB,EAAI+H,UAAUO,OAAOJ,EAAW/G,GAcnC,EAGAoH,aAAe,SAAUvI,GAKxB,OAJgBJ,EAAO4I,iBAAmB5I,EAAO4I,iBAAiBxI,GAAOA,EAAIyI,eAKrE,CAAC,CAGV,EAOAC,SAAW,SAAU1I,EAAK2I,EAAQC,EAAWC,GAE5C,IAAIC,EAAWF,EAAY,YAAc,GACrCG,EAAY,KAEhB,IAAK,IAAI1D,KAAQsD,EAChB,GAAIA,EAAOvD,eAAeC,GAAO,CAChC,IAAI2D,EAAS,KAEQ,OAAjBL,EAAOtD,IAGL0D,IAEJA,EAAY9I,EAAIuF,QAAQxF,EAAK,cAE1B+I,GAAaA,EAAU3D,eAAeC,KAEzC2D,EAASD,EAAU1D,MAMhBwD,IACEE,IAEJA,EAAY9I,EAAIuF,QAAQxF,EAAK,YAAa,CAAC,IAEvC+I,EAAU3D,eAAeC,KAE7B0D,EAAU1D,GAAQrF,EAAIiJ,MAAM5D,KAG9B2D,EAASL,EAAOtD,IAGF,OAAX2D,GACHhJ,EAAIiJ,MAAMC,YAAY7D,EAAM2D,EAAQF,EAEtC,CAEF,EAGAK,SAAW,SAAUC,EAAGC,EAAGC,GAC1B,MAAO,MACL,IAAMC,KAAKC,MAAMJ,GAAGK,SAAS,KAAKC,QAAQ,IAC1C,IAAMH,KAAKC,MAAMH,GAAGI,SAAS,KAAKC,QAAQ,IAC1C,IAAMH,KAAKC,MAAMF,GAAGG,SAAS,KAAKC,QAAQ,IAC1CC,aACH,EAGAC,UAAY,SAAUR,EAAGC,EAAGC,EAAGO,GAC9B,MAAO,MACL,IAAMN,KAAKC,MAAMJ,GAAGK,SAAS,KAAKC,QAAQ,IAC1C,IAAMH,KAAKC,MAAMH,GAAGI,SAAS,KAAKC,QAAQ,IAC1C,IAAMH,KAAKC,MAAMF,GAAGG,SAAS,KAAKC,QAAQ,IAC1C,IAAMH,KAAKC,MAAU,IAAJK,GAASJ,SAAS,KAAKC,QAAQ,IAChDC,aACH,EAGAG,SAAW,SAAUV,EAAGC,EAAGC,GAC1B,MAAO,OACNC,KAAKC,MAAMJ,GAAK,IAChBG,KAAKC,MAAMH,GAAK,IAChBE,KAAKC,MAAMF,GACZ,GACD,EAGAS,UAAY,SAAUX,EAAGC,EAAGC,EAAGO,GAC9B,MAAO,QACNN,KAAKC,MAAMJ,GAAK,IAChBG,KAAKC,MAAMH,GAAK,IAChBE,KAAKC,MAAMF,GAAK,IACfC,KAAKC,MAA4C,KAArCK,QAA4B,EAAIA,IAAY,IAC1D,GACD,EAGAG,gBAmBKjK,EAjBJ,WAKC,IAJA,IAAIkK,EAAU,kBACVC,EAAW,CAAC,GAAI,WAAY,QAAS,MAAO,QAC5CC,EAASvK,EAAOH,SAAS4D,cAAc,OAElClC,EAAI,EAAGA,EAAI+I,EAAS9I,OAAQD,GAAK,EAAG,CAC5C,IAAIiJ,EAAUF,EAAS/I,GAAK8I,EACxBI,EAASD,EAAU,2CAGvB,GADAD,EAAOlB,MAAMqB,WAAaD,EACtBF,EAAOlB,MAAMqB,WAChB,OAAOF,CAET,CACA,OAAOH,CACR,CAEeM,GAER,WACN,OAAOxK,EAAW,IAAMyK,MAAMC,UAAUC,KAAKC,KAAKzF,UAAW,MAAQ,GACtE,GAKD0F,gBAAkB,SAAU5K,EAAKuE,GAChCtE,EAAIyI,SAAS1I,EAAK,CAAC,gBAAkBuE,GAAS,KAC/C,EAGAsG,aAAe,SAAU7K,EAAKuE,GAC7BtE,EAAIyI,SAAS1I,EAAK,CAAC,aAAcuE,GAAS,QAC3C,EAGAuG,cAAgB,SAAUxI,EAAGyI,GAC5B,IAAIC,EAAE,EAAGC,EAAE,EACPC,EAAO5I,EAAE6I,wBAGb,GAFAH,EAAIE,EAAKE,KACTH,EAAIC,EAAKG,KACJN,EAAoB,CACxB,IAAIO,EAAUrL,EAAIsL,aAClBP,GAAKM,EAAQ,GACbL,GAAKK,EAAQ,EACd,CACA,MAAO,CAACN,EAAGC,EACZ,EAGAO,eAAiB,SAAUlJ,GAC1B,MAAO,CAACA,EAAEmJ,YAAanJ,EAAEoJ,aAC1B,EAIAC,iBAAmB,SAAUrJ,GAC5B,IAAI0I,EAAI,EAAGC,EAAI,EASf,YARgC,IAArB3I,EAAEsJ,gBAAkCtJ,EAAEsJ,eAAexK,QAE/D4J,EAAI1I,EAAEsJ,eAAe,GAAGC,QACxBZ,EAAI3I,EAAEsJ,eAAe,GAAGE,SACO,iBAAdxJ,EAAEuJ,UACnBb,EAAI1I,EAAEuJ,QACNZ,EAAI3I,EAAEwJ,SAEA,CAAEd,EAAGA,EAAGC,EAAGA,EACnB,EAIAc,iBAAmB,SAAUzJ,GAC5B,IACI0J,GADS1J,EAAEkE,QAAUlE,EAAE2J,YACHd,wBAIpBU,EAAU,EAAGC,EAAU,EAY3B,YAXgC,IAArBxJ,EAAEsJ,gBAAkCtJ,EAAEsJ,eAAexK,QAE/DyK,EAAUvJ,EAAEsJ,eAAe,GAAGC,QAC9BC,EAAUxJ,EAAEsJ,eAAe,GAAGE,SACC,iBAAdxJ,EAAEuJ,UACnBA,EAAUvJ,EAAEuJ,QACZC,EAAUxJ,EAAEwJ,SAKN,CAAEd,EAFLa,EAAUG,EAAWZ,KAEVH,EADXa,EAAUE,EAAWX,IAE1B,EAGAE,WAAa,WACZ,IAAIW,EAAMtM,EAAOH,SAAS0M,gBAC1B,MAAO,EACLvM,EAAOwM,aAAeF,EAAIG,aAAeH,EAAII,YAAc,IAC3D1M,EAAO2M,aAAeL,EAAIM,YAAcN,EAAIO,WAAa,GAE5D,EAGAC,YAAc,WACb,IAAIR,EAAMtM,EAAOH,SAAS0M,gBAC1B,MAAO,CACLvM,EAAO+M,YAAcT,EAAIU,YACzBhN,EAAOiN,aAAeX,EAAIY,aAE7B,EASAC,QAAU,SAAU3D,EAAGC,EAAGC,GACzBF,GAAK,IACLC,GAAK,IACLC,GAAK,IACL,IAAIlF,EAAImF,KAAKyD,IAAIzD,KAAKyD,IAAI5D,EAAEC,GAAGC,GAC3B2D,EAAI1D,KAAK2D,IAAI3D,KAAK2D,IAAI9D,EAAEC,GAAGC,GAC3BhI,EAAI2L,EAAI7I,EACZ,GAAU,IAAN9C,EAAW,MAAO,CAAE,KAAM,EAAG,IAAM2L,GACvC,IAAIE,EAAI/D,IAAIhF,EAAI,GAAGkF,EAAED,GAAG/H,EAAK+H,IAAIjF,EAAI,GAAGgF,EAAEE,GAAGhI,EAAI,GAAG+H,EAAED,GAAG9H,EACzD,MAAO,CACN,IAAU,IAAJ6L,EAAM,EAAEA,GACP7L,EAAE2L,EAAT,IACA,IAAMA,EAER,EASAG,QAAU,SAAUD,EAAGE,EAAGJ,GACzB,IAAIK,EAAWL,EAAI,IAAX,IAER,GAAU,OAANE,EACH,MAAO,CAAEG,EAAGA,EAAGA,GAGhBH,GAAK,GACLE,GAAK,IAEL,IAAIlM,EAAIoI,KAAKgE,MAAMJ,GAEf7L,EAAIgM,GAAK,EAAID,GACbjJ,EAAIkJ,GAAK,EAAID,GAFTlM,EAAE,EAAIgM,EAAEhM,EAAI,GAAGgM,EAAEhM,KAGzB,OAAQA,GACP,KAAK,EACL,KAAK,EAAG,MAAO,CAACmM,EAAElJ,EAAE9C,GACpB,KAAK,EAAG,MAAO,CAAC8C,EAAEkJ,EAAEhM,GACpB,KAAK,EAAG,MAAO,CAACA,EAAEgM,EAAElJ,GACpB,KAAK,EAAG,MAAO,CAAC9C,EAAE8C,EAAEkJ,GACpB,KAAK,EAAG,MAAO,CAAClJ,EAAE9C,EAAEgM,GACpB,KAAK,EAAG,MAAO,CAACA,EAAEhM,EAAE8C,GAEtB,EAGAoJ,iBAAmB,SAAUjL,GAC5B,IAKIjB,EALAmM,EAAM,CACTC,KAAM,KACNC,OAAQ,MAKT,GAAIrM,EAAIiB,EAAIV,MAAM,4BAA6B,CAG9C,GAAoB,IAAhBP,EAAE,GAAGF,OAERqM,EAAIE,OAAS,OACbF,EAAIC,KAAO,CACVE,SAAStM,EAAE,GAAGoI,OAAO,EAAE,GAAG,IAC1BkE,SAAStM,EAAE,GAAGoI,OAAO,EAAE,GAAG,IAC1BkE,SAAStM,EAAE,GAAGoI,OAAO,EAAE,GAAG,IAC1BkE,SAAStM,EAAE,GAAGoI,OAAO,EAAE,GAAG,IAAM,UAG3B,GAAoB,IAAhBpI,EAAE,GAAGF,OAEfqM,EAAIE,OAAS,MACbF,EAAIC,KAAO,CACVE,SAAStM,EAAE,GAAGoI,OAAO,EAAE,GAAG,IAC1BkE,SAAStM,EAAE,GAAGoI,OAAO,EAAE,GAAG,IAC1BkE,SAAStM,EAAE,GAAGoI,OAAO,EAAE,GAAG,IAC1B,UAGK,IAAoB,IAAhBpI,EAAE,GAAGF,OAWf,OAAO,EATPqM,EAAIE,OAAS,MACbF,EAAIC,KAAO,CACVE,SAAStM,EAAE,GAAGuM,OAAO,GAAKvM,EAAE,GAAGuM,OAAO,GAAG,IACzCD,SAAStM,EAAE,GAAGuM,OAAO,GAAKvM,EAAE,GAAGuM,OAAO,GAAG,IACzCD,SAAStM,EAAE,GAAGuM,OAAO,GAAKvM,EAAE,GAAGuM,OAAO,GAAG,IACzC,KAKF,CAEA,OAAOJ,CACR,CAEA,GAAInM,EAAIiB,EAAIV,MAAM,6BAA8B,CAG/C,IAEIiM,EAAIC,EAAIC,EAAIC,EAFZC,EAAM5M,EAAE,GAAGuG,MAAM,KACjBsG,EAAK,kCAET,GACCD,EAAI9M,QAAU,IACb0M,EAAKI,EAAI,GAAGrM,MAAMsM,MAClBJ,EAAKG,EAAI,GAAGrM,MAAMsM,MAClBH,EAAKE,EAAI,GAAGrM,MAAMsM,IAiBnB,OAfAV,EAAIE,OAAS,MACbF,EAAIC,KAAO,CACVU,WAAWN,EAAG,KAAO,EACrBM,WAAWL,EAAG,KAAO,EACrBK,WAAWJ,EAAG,KAAO,EACrB,MAIAE,EAAI9M,QAAU,IACb6M,EAAKC,EAAI,GAAGrM,MAAMsM,MAEnBV,EAAIE,OAAS,OACbF,EAAIC,KAAK,GAAKU,WAAWH,EAAG,KAAO,GAE7BR,CAET,CAEA,OAAO,CACR,EAGAY,kBAAoB,SAAUC,GAC7B,IAAIC,EAAO,GAEU,iBAAVD,EAEVA,EAAM1G,QAAQ,iDAAiD,SAAUjE,GACxE4K,EAAKtL,KAAKU,EACX,IACU6G,MAAMgE,QAAQF,KACxBC,EAAOD,GAOR,IAFA,IAAIG,EAAS,GAEJtN,EAAI,EAAGA,EAAIoN,EAAKnN,OAAQD,IAAK,CACrC,IAAIuN,EAAQzO,EAAIuN,iBAAiBe,EAAKpN,IAClCuN,GACHD,EAAOxL,KAAKyL,EAEd,CAEA,OAAOD,CACR,EAGAE,wBAA0B,SAAUF,GACnC,IAAK,IAAItN,EAAI,EAAGA,EAAIsN,EAAOrN,OAAQD,IAAK,CACvC,IAAI0I,EAAI4E,EAAOtN,GAAGuM,KAAK,GACvB,GAAU,OAAN7D,GAAcA,EAAI,EACrB,OAAO,CAET,CACA,OAAO,CACR,EAGA+E,cAAgB,SAAUjB,GACzB,OAAQA,EAAOlM,eACf,IAAK,OACL,IAAK,OACJ,OAAO,EAER,OAAO,CACR,EAOAoN,sBAAwB,SAAUC,GACjC,IAAIC,EAAMnP,EAAOoP,kBAAoB,EACrCF,EAAOG,OAASF,EAChBD,EAAOI,QAAUH,EACPD,EAAOK,WAAW,MACxBC,MAAML,EAAKA,EAChB,EAGAM,sBAAwB,SAAUX,EAAOY,EAAcC,EAAWC,GAEjE,IAAIC,EAAOlG,KAAKC,MAAMvJ,EAAIO,IAAIkP,iBAAiBtO,QAC3CuO,EAAS1P,EAAIO,IAAIoP,eACjBC,EAAW5P,EAAIO,IAAIsP,iBACnBC,EAAW9P,EAAIO,IAAIwP,iBAEnBC,EAASV,GAAiC,EAATI,EACjCO,EAAmB,EAATP,EAEVb,EAAS7O,EAAIiD,SAAS,UACtBiN,EAAMrB,EAAOK,WAAW,MAE5BL,EAAOG,MAAQgB,EACfnB,EAAOI,OAASgB,EACZV,GACHvP,EAAI4O,sBAAsBC,GAI3BqB,EAAIC,UAAYP,EAChBM,EAAIE,SAAS,EAAG,EAAGJ,EAAQC,GAG3BC,EAAIC,UAAYL,EAChB,IAAK,IAAI/E,EAAI,EAAGA,EAAIiF,EAAQjF,GAAc,EAAT2E,EAChCQ,EAAIE,SAASrF,EAAG,EAAG2E,EAAQA,GAC3BQ,EAAIE,SAASrF,EAAI2E,EAAQA,EAAQA,EAAQA,GAGtCjB,IAEHyB,EAAIC,UAAY1B,EAChByB,EAAIE,SAAS,EAAG,EAAGJ,EAAQC,IAG5B,IAAII,EAAQ,KACZ,OAAQhB,GACP,IAAK,OACJgB,EAAQ,EACRH,EAAII,UAAU,EAAG,EAAGd,EAAK,EAAGS,GAC5B,MACD,IAAK,QACJI,EAAQL,EAASR,EACjBU,EAAII,UAAUN,EAAUR,EAAK,EAAI,EAAGA,EAAK,EAAGS,GAG9C,GAAc,OAAVI,EAAgB,CACnBH,EAAIK,UAAY,EAChB,IAAK,IAAIrP,EAAI,EAAGA,EAAIlB,EAAIO,IAAIkP,iBAAiBtO,OAAQD,GAAK,EACzDgP,EAAIM,YACJN,EAAIO,YAAczQ,EAAIO,IAAIkP,iBAAiBvO,GAC3CgP,EAAIQ,OAAO,GAAML,EAAQnP,EAAG,GAC5BgP,EAAIS,OAAO,GAAMN,EAAQnP,EAAG+O,GAC5BC,EAAIU,QAEN,CAEA,MAAO,CACN/B,OAAQA,EACRG,MAAOgB,EACPf,OAAQgB,EAEV,EAIAY,wBAA0B,SAAUpC,EAAOqC,EAAU9B,GACpD,IAAI+B,EAkBJ,OAfCA,EADGD,GAAY9B,EACN,CACR,MAAQ,CAAC,KAAO,QAAS,MAAQ,QAAQ8B,GACzCrC,EAAQ,MACRA,EAAQ,IAAMO,EAAQ,KACtB,kBAAoBA,EAAQ,GAAK,KACjC,sBAGQ,CACR,WACAP,EAAQ,MACRA,EAAQ,SAIHzO,EAAI+J,eAAeiH,MAAMpR,KAAMmR,EACvC,EAGAE,eAAiB,WAEhB,GAAKjR,EAAIkR,QAAWlR,EAAIkR,OAAOC,MAA/B,CAIA,IAEIC,EAAIC,EAFJC,EAAUtR,EAAIkR,OAAOC,MAIrBG,EAAQC,OAGXH,EAAKpR,EAAI6K,cAAcyG,EAAQvO,eAAe,GAC9CsO,EAAK,CAAC,EAAG,KAETD,EAAKpR,EAAI6K,cAAcyG,EAAQvO,eAC/BsO,EAAKrR,EAAIsL,cAGV,IAII1B,EAAGP,EAAGmI,EAJNC,EAAKzR,EAAIuL,eAAe+F,EAAQvO,eAChC2O,EAAK1R,EAAIyM,cACTkF,EAAK3R,EAAI4R,cAAcN,GACvBO,EAAK,CAACF,EAAGG,QAASH,EAAGI,SAEzB,OAAQT,EAAQR,SAAStP,eACxB,IAAK,OAAQoI,EAAE,EAAGP,EAAE,EAAGmI,GAAG,EAAG,MAC7B,IAAK,QAAQ5H,EAAE,EAAGP,EAAE,EAAGmI,EAAE,EAAG,MAC5B,IAAK,MAAQ5H,EAAE,EAAGP,EAAE,EAAGmI,GAAG,EAAG,MAC7B,QAAa5H,EAAE,EAAGP,EAAE,EAAGmI,EAAE,EAE1B,IAAIQ,GAAKP,EAAGpI,GAAGwI,EAAGxI,IAAI,EAGtB,GAAKiI,EAAQW,cAMRC,EAAK,EACPb,EAAGzH,GAAGwH,EAAGxH,GAAGiI,EAAGjI,GAAK8H,EAAG9H,KACrByH,EAAGzH,GAAGwH,EAAGxH,GAAG6H,EAAG7H,GAAG,EAAI8H,EAAG9H,GAAG,GAAKwH,EAAGxH,GAAG6H,EAAG7H,GAAGiI,EAAGjI,IAAM,EAAIwH,EAAGxH,GAAG6H,EAAG7H,GAAGiI,EAAGjI,GAC3EwH,EAAGxH,IACHyH,EAAGhI,GAAG+H,EAAG/H,GAAGoI,EAAGpI,GAAGwI,EAAGxI,GAAG2I,EAAEA,EAAER,EAAIE,EAAGrI,IACjCgI,EAAGhI,GAAG+H,EAAG/H,GAAGoI,EAAGpI,GAAG,EAAIqI,EAAGrI,GAAG,GAAK+H,EAAG/H,GAAGoI,EAAGpI,GAAG2I,EAAEA,EAAER,GAAK,EAAIJ,EAAG/H,GAAGoI,EAAGpI,GAAG2I,EAAEA,EAAER,EAAIJ,EAAG/H,GAAGoI,EAAGpI,GAAG2I,EAAEA,EAAER,EAC/FJ,EAAG/H,GAAGoI,EAAGpI,GAAG2I,EAAEA,EAAER,GAAK,EAAIJ,EAAG/H,GAAGoI,EAAGpI,GAAG2I,EAAEA,EAAER,EAAIJ,EAAG/H,GAAGoI,EAAGpI,GAAG2I,EAAEA,EAAER,QAXhE,IAAIU,EAAK,CACRd,EAAGxH,GACHwH,EAAG/H,GAAGoI,EAAGpI,GAAG2I,EAAEA,EAAER,GAalB,IAAIzG,EAAImH,EAAGtI,GACPoB,EAAIkH,EAAG7I,GACP8I,EAAgBb,EAAQC,MAAQ,QAAU,WAC1Ca,GACFF,EAAG,GAAKL,EAAG,GAAKT,EAAG,IAAMc,EAAG,GAAKd,EAAG,GAAKK,EAAG,KAC5CS,EAAG,GAAKL,EAAG,GAAKT,EAAG,GAAKK,EAAG,GAE7BzR,EAAIqS,cAAcf,EAASvG,EAAGC,EAAGmH,EAAeC,EArDhD,CAsDD,EAGAC,cAAgB,SAAUf,EAASvG,EAAGC,EAAGmH,EAAeC,GACvD,IAAIE,EAAUF,EAAiB,EAAId,EAAQiB,WAE3CvS,EAAIkR,OAAOsB,KAAKxJ,MAAM8H,SAAWqB,EACjCnS,EAAIkR,OAAOsB,KAAKxJ,MAAMmC,KAAOJ,EAAI,KACjC/K,EAAIkR,OAAOsB,KAAKxJ,MAAMoC,IAAMJ,EAAI,KAEhChL,EAAI4K,aACH5K,EAAIkR,OAAOuB,KACXnB,EAAQoB,OACP,IAAI1S,EAAIH,UAAU,EAAGyS,EAAShB,EAAQiB,WAAY,EAAGjB,EAAQqB,aAC7D,KACH,EAGAf,cAAgB,SAAUN,GACzB,IAAIsB,EAAI,EAAItB,EAAQuB,mBAAqBvB,EAAQtC,MAC7C9B,EAAI,EAAIoE,EAAQuB,mBAAqBvB,EAAQrC,OAE7C6D,EAAc,EAAIxB,EAAQuB,mBAAqB,EAAI7S,EAAI+S,kBAAkBzB,GAAWA,EAAQ0B,WAE5FhT,EAAIiT,iBAAiB3B,KACxBsB,GAAKE,GAEFxB,EAAQ4B,oBACXN,GAAKE,GAGN,IAAIK,EAAMnT,EAAIoT,eAAe9B,EAASsB,GAElCO,EAAIlE,SACP/B,GAAKiG,EAAIlE,OAASqC,EAAQ+B,SAEvB/B,EAAQgC,cACXpG,GAAK,EAAIoE,EAAQuB,mBAAqBvB,EAAQ+B,QAAU/B,EAAQiC,cAGjE,IAAIC,EAAKZ,EAAK,EAAItB,EAAQ+B,QACtBI,EAAKvG,EAAK,EAAIoE,EAAQ+B,QAE1B,MAAO,CACNK,SAAUd,EACVe,SAAUzG,EACV0G,QAASJ,EACTK,QAASJ,EACT3B,QAAS0B,EAAM,EAAIlC,EAAQwC,YAC3B/B,QAAS0B,EAAM,EAAInC,EAAQwC,YAC3BC,QAASZ,EAEX,EAGAC,eAAiB,SAAU9B,EAAStC,GACnC,IAAIgF,EAAO,EAAGC,EAAO,EAAGC,EAAQ,EAAGC,EAAQ,EAAGlF,EAAS,EACnDmF,EAAc9C,EAAQ+C,SAAW/C,EAAQ+C,SAASlT,OAAS,EAiB/D,OAfIiT,IAEHH,GADAD,EAAO1C,EAAQgD,aACD,EAAIhL,KAAKiL,KAAKH,EAAcJ,GAAQ,EAGlDE,EAAQ5K,KAAK2D,IAAI,EAAG3D,KAAKgE,OAAO0B,GAAUgF,EAAO,GAAK1C,EAAQkD,gBAAmBR,IACjFG,EAAQ7C,EAAQmD,cAAgBnL,KAAKyD,IAAIuE,EAAQmD,cAAeP,GAASA,GAGtED,IACHhF,EACCgF,EAAOE,GACNF,EAAO,GAAK3C,EAAQkD,gBAGhB,CACNR,KAAMA,EACNC,KAAMA,EACNC,MAAOA,EACPC,MAAOA,EACPnF,MAAOA,EACPC,OAAQA,EAEV,EAGA8D,kBAAoB,SAAUzB,GAC7B,OAAOhI,KAAK2D,IACXqE,EAAQ+B,QAAU,EACjB,EAAI/B,EAAQoD,mBAAqBpD,EAAQqD,iBAAoBrD,EAAQuB,mBAExE,EAGA+B,eAAiB,SAAUtD,GAC1B,MACM,MADEA,EAAQuD,KAAKjH,OAAO,GAAGpM,cACb,IAEX,GACR,EAGAyR,iBAAmB,SAAU3B,GAC5B,GAAIA,EAAQuD,KAAK1T,OAAS,EACzB,OAAQmQ,EAAQuD,KAAKjH,OAAO,GAAGpM,eAC9B,IAAK,IAAK,MAAO,IACjB,IAAK,IAAK,MAAO,IAGnB,OAAO,IACR,EAIAsT,gBAAkB,SAAUxD,EAASlM,GACpC,GAAKkM,EAAQlM,GAAb,CAGA,IAAI2P,EAAW,KAEf,GAA6B,iBAAlBzD,EAAQlM,GAElB,IACC2P,EAAW,IAAIpS,SAAU2O,EAAQlM,GAGlC,CAFE,MAAO/C,GACRN,QAAQiT,MAAM3S,EACf,MAGA0S,EAAWzD,EAAQlM,GAGhB2P,GACHA,EAASrK,KAAK4G,EAhBf,CAkBD,EAKA2D,cAAgB,SAAUC,GAEzB,IADA,IAAIpS,EAAO9C,EAAI6C,eACN3B,EAAI,EAAGA,EAAI4B,EAAK3B,OAAQD,GAAK,EACrC4B,EAAK5B,GAAGiU,QAAQD,EAElB,EAGAE,kBAAoB,CACnBC,MAAO,YACPC,MAAO,aAERC,iBAAmB,CAClBF,MAAO,UACPC,MAAO,YAIRE,eAAiB,KACjB/O,gBAAkB,KAGlBgP,gBAAkB,SAAUpT,IACyB,IAAhD,CAAC,MAAO,UAAU+B,QAAQpE,EAAIsH,SAASjF,KACtCrC,EAAIkR,QAAUlR,EAAIkR,OAAOC,OAC5BnR,EAAIkR,OAAOC,MAAMuE,SAGpB,EAGAC,eAAiB,SAAUtT,GAC1BrC,EAAIiR,gBACL,EAGA2E,eAAiB,SAAUvT,GAC1BrC,EAAIiR,gBACL,EAGA4E,eAAiB,SAAUxT,GAEtBrC,EAAIkR,QAAUlR,EAAIkR,OAAOC,OAC5BnR,EAAIkR,OAAOC,MAAMuE,SAEnB,EAGAI,oBAAsB,SAAUzT,GAC/B,IAAIkE,EAASlE,EAAEkE,QAAUlE,EAAE2J,WAEvBzF,EAAOtG,SAAWsG,EAAOtG,mBAAmBD,EAAIO,IAC/CgG,EAAOtG,QAAQ8V,cAAgBxP,EAAOyP,UACzCzP,EAAOtG,QAAQgW,OAENjW,EAAIuF,QAAQgB,EAAQ,OAChBvG,EAAIuF,QAAQgB,EAAQ,YAGjCvG,EAAIkW,sBAAsB7T,EAAGkE,EAAQvG,EAAIuF,QAAQgB,EAAQ,WAAY,SAIlEvG,EAAIkR,QAAUlR,EAAIkR,OAAOC,OAC5BnR,EAAIkR,OAAOC,MAAMuE,SAGpB,EAGAS,mBAAqB,SAAU9T,GAC9B,IAAIkE,EAASlE,EAAEkE,QAAUlE,EAAE2J,WAEvBhM,EAAIuF,QAAQgB,EAAQ,YACvBvG,EAAIkW,sBAAsB7T,EAAGkE,EAAQvG,EAAIuF,QAAQgB,EAAQ,WAAY,QAEvE,EAGA2P,sBAAwB,SAAU7T,EAAGkE,EAAQ6P,EAAaC,GACzD,IAAI/E,EAAUtR,EAAIuF,QAAQgB,EAAQ,YAElCvG,EAAIoG,eAAe/D,GACnBrC,EAAIsG,cAAcC,GAElB,IAAI+P,EAAqB,SAAUrK,EAAKsK,GACvCvW,EAAI8F,iBAAiB,OAAQmG,EAAKjM,EAAIoV,kBAAkBiB,GACvDrW,EAAIwW,sBAAsBnU,EAAGkE,EAAQ6P,EAAaC,EAAaE,IAChEvW,EAAI8F,iBAAiB,OAAQmG,EAAKjM,EAAIuV,iBAAiBc,GACtDrW,EAAIyW,qBAAqBpU,EAAGkE,EAAQ6P,EAAaC,GACnD,EAIA,GAFAC,EAAmB3W,EAAOH,SAAU,CAAC,EAAG,IAEpCG,EAAO+W,QAAU/W,EAAOgX,aAAc,CACzC,IAAI1L,EAAOtL,EAAOgX,aAAazL,wBAC3B0L,EAAM,EAAE3L,EAAKE,MAAOF,EAAKG,KAC7BkL,EAAmB3W,EAAO+W,OAAO/W,OAAOH,SAAUoX,EACnD,CAEA,IAAIC,EAAM7W,EAAI0L,iBAAiBrJ,GAC3ByU,EAAM9W,EAAI8L,iBAAiBzJ,GAM/B,OALArC,EAAIwV,eAAiB,CACpBzK,EAAG8L,EAAI9L,EAAI+L,EAAI/L,EACfC,EAAG6L,EAAI7L,EAAI8L,EAAI9L,GAGRoL,GACR,IAAK,MAEkC,MAAlCpW,EAAIiT,iBAAiB3B,IAA2C,IAAvBA,EAAQyF,SAAS/J,GAC7DsE,EAAQ0F,SAAS,KAAM,KAAM,IAAK,MAEnChX,EAAIiX,OAAO3F,EAASjP,EAAG,EAAG,GAC1B,MAED,IAAK,MACJrC,EAAIkX,OAAO5F,EAASjP,EAAG,GACvB,MAED,IAAK,OACJrC,EAAImX,QAAQ7F,EAASjP,EAAG,GAGzBiP,EAAQ6D,QAAQ,QACjB,EAGAqB,sBAAwB,SAAUnU,EAAGkE,EAAQ6P,EAAaC,EAAaE,GACtE,OAAO,SAAUlU,GAChB,IAAIiP,EAAUtR,EAAIuF,QAAQgB,EAAQ,YAClC,OAAQ6P,GACR,IAAK,MACJpW,EAAIiX,OAAO3F,EAASjP,EAAGkU,EAAO,GAAIA,EAAO,IACzC,MAED,IAAK,MACJvW,EAAIkX,OAAO5F,EAASjP,EAAGkU,EAAO,IAC9B,MAED,IAAK,OACJvW,EAAImX,QAAQ7F,EAASjP,EAAGkU,EAAO,IAGhCjF,EAAQ6D,QAAQ,QACjB,CACD,EAGAsB,qBAAuB,SAAUpU,EAAGkE,EAAQ6P,EAAaC,GACxD,OAAO,SAAUhU,GAChB,IAAIiP,EAAUtR,EAAIuF,QAAQgB,EAAQ,YAClCvG,EAAIkG,kBAAkB,QACtBlG,EAAI0G,gBAKJ4K,EAAQ6D,QAAQ,SAChB7D,EAAQ6D,QAAQ,SACjB,CACD,EAGAiC,qBAAuB,SAAU/U,GAChC,IAAIkE,EAASlE,EAAEgV,cACX/F,EAAUtR,EAAIuF,QAAQgB,EAAQ,YAC9BkI,EAAQzO,EAAIuF,QAAQgB,EAAQ,SAGK,QAAjC+K,EAAQ5D,OAAOlM,gBAClB8P,EAAQgG,WAAW7I,EAAMf,QACpB1N,EAAI2O,cAAc2C,EAAQiG,eAC9B9I,EAAMhB,KAAK,GAAK,IAKI,OAAlBgB,EAAMhB,KAAK,MACmB,IAA7B6D,EAAQkG,kBAA2D,SAA7BlG,EAAQkG,kBAA+BlG,EAAQmG,2BACxFhJ,EAAMhB,KAAK,GAAK,GAIlB6D,EAAQoG,SAAS1G,MAAMM,EAAS7C,EAAMhB,MAEtC6D,EAAQ6D,QAAQ,SAChB7D,EAAQ6D,QAAQ,UAEZ7D,EAAQqG,oBACXrG,EAAQsG,MAEV,EAGAX,OAAS,SAAU3F,EAASjP,EAAGwV,EAAMC,GACpC,IAAIC,EAAa/X,EAAI0L,iBAAiBrJ,GAClC0I,EAAI8M,EAAOE,EAAWhN,EAAI/K,EAAIwV,eAAezK,EAAIuG,EAAQ+B,QAAU/B,EAAQuB,mBAC3E7H,EAAI8M,EAAOC,EAAW/M,EAAIhL,EAAIwV,eAAexK,EAAIsG,EAAQ+B,QAAU/B,EAAQuB,mBAE3EmF,EAAOjN,GAAK,KAAOuG,EAAQtC,MAAQ,IACnCiJ,EAAO,IAAOjN,GAAK,KAAOsG,EAAQrC,OAAS,IAE/C,OAAQjP,EAAI4U,eAAetD,IAC3B,IAAK,IAAKA,EAAQ0F,SAASgB,EAAMC,EAAM,KAAM,MAAO,MACpD,IAAK,IAAK3G,EAAQ0F,SAASgB,EAAM,KAAMC,EAAM,MAE9C,EAGAf,OAAS,SAAU5F,EAASjP,EAAGyV,GAC9B,IAEIG,EAAO,KADHH,EADS9X,EAAI0L,iBAAiBrJ,GACZ2I,EAAIhL,EAAIwV,eAAexK,EAAIsG,EAAQ+B,QAAU/B,EAAQuB,qBACxD,KAAOvB,EAAQrC,OAAS,IAE/C,OAAQjP,EAAIiT,iBAAiB3B,IAC7B,IAAK,IAAKA,EAAQ0F,SAAS,KAAMiB,EAAM,KAAM,MAAO,MACpD,IAAK,IAAK3G,EAAQ0F,SAAS,KAAM,KAAMiB,EAAM,MAE9C,EAGAd,QAAU,SAAU7F,EAASjP,EAAGyV,GAC/B,IAEIG,EAAO,GADHH,EADS9X,EAAI0L,iBAAiBrJ,GACZ2I,EAAIhL,EAAIwV,eAAexK,EAAIsG,EAAQ+B,QAAU/B,EAAQuB,qBACxD,GAAOvB,EAAQrC,OAAS,IAE/C,GAAIgJ,EAAO,EAAK,CAEf,IAAIC,EAAM5G,EAAQiG,YACmB,QAAjCjG,EAAQ5D,OAAOlM,eAA4BxB,EAAI2O,cAAcuJ,IAChE5G,EAAQgG,WAAmB,QAARY,EAAgB,OAAS,OAE9C,CAEA5G,EAAQ0F,SAAS,KAAM,KAAM,KAAMiB,EACpC,EAGAE,gBAAkB,WAEjB,IAAI3K,EAAM,CACTzN,IAAK,KACLqY,KAAM,MAGHvJ,EAAS7O,EAAIiD,SAAS,UACtBiN,EAAMrB,EAAOK,WAAW,MAsC5B,OAHA1B,EAAIzN,IAAM8O,EACVrB,EAAI4K,KAlCW,SAAUpJ,EAAOC,EAAQ1N,GACvCsN,EAAOG,MAAQA,EACfH,EAAOI,OAASA,EAEhBiB,EAAII,UAAU,EAAG,EAAGzB,EAAOG,MAAOH,EAAOI,QAEzC,IAAIoJ,EAAQnI,EAAIoI,qBAAqB,EAAG,EAAGzJ,EAAOG,MAAO,GACzDqJ,EAAME,aAAa,EAAO,QAC1BF,EAAME,aAAa,EAAI,EAAG,QAC1BF,EAAME,aAAa,EAAI,EAAG,QAC1BF,EAAME,aAAa,GAAO,QAC1BF,EAAME,aAAa,EAAI,EAAG,QAC1BF,EAAME,aAAa,EAAI,EAAG,QAC1BF,EAAME,aAAa,EAAO,QAE1BrI,EAAIC,UAAYkI,EAChBnI,EAAIE,SAAS,EAAG,EAAGvB,EAAOG,MAAOH,EAAOI,QAExC,IAAIuJ,EAAQtI,EAAIoI,qBAAqB,EAAG,EAAG,EAAGzJ,EAAOI,QACrD,OAAQ1N,EAAKC,eACb,IAAK,IACJgX,EAAMD,aAAa,EAAG,uBACtBC,EAAMD,aAAa,EAAG,uBACtB,MACD,IAAK,IACJC,EAAMD,aAAa,EAAG,iBACtBC,EAAMD,aAAa,EAAG,iBAGvBrI,EAAIC,UAAYqI,EAChBtI,EAAIE,SAAS,EAAG,EAAGvB,EAAOG,MAAOH,EAAOI,OACzC,EAKOzB,CACR,EAGAiL,qBAAuB,WAEtB,IAAIjL,EAAM,CACTzN,IAAK,KACLqY,KAAM,MAGHvJ,EAAS7O,EAAIiD,SAAS,UACtBiN,EAAMrB,EAAOK,WAAW,MAmB5B,OAHA1B,EAAIzN,IAAM8O,EACVrB,EAAI4K,KAfW,SAAUpJ,EAAOC,EAAQyJ,EAAQC,GAC/C9J,EAAOG,MAAQA,EACfH,EAAOI,OAASA,EAEhBiB,EAAII,UAAU,EAAG,EAAGzB,EAAOG,MAAOH,EAAOI,QAEzC,IAAI2J,EAAO1I,EAAIoI,qBAAqB,EAAG,EAAG,EAAGzJ,EAAOI,QACpD2J,EAAKL,aAAa,EAAGG,GACrBE,EAAKL,aAAa,EAAGI,GAErBzI,EAAIC,UAAYyI,EAChB1I,EAAIE,SAAS,EAAG,EAAGvB,EAAOG,MAAOH,EAAOI,OACzC,EAKOzB,CACR,EAGAqL,sBAAwB,WAEvB,IAAIrL,EAAM,CACTzN,IAAK,KACLqY,KAAM,MAGHvJ,EAAS7O,EAAIiD,SAAS,UACtBiN,EAAMrB,EAAOK,WAAW,MAoC5B,OAHA1B,EAAIzN,IAAM8O,EACVrB,EAAI4K,KAhCW,SAAUpJ,EAAOC,EAAQR,GACvCI,EAAOG,MAAQA,EACfH,EAAOI,OAASA,EAEhBiB,EAAII,UAAU,EAAG,EAAGzB,EAAOG,MAAOH,EAAOI,QAEzC,IAAIS,EAASb,EAAOG,MAAQ,EACxBY,EAAW5P,EAAIO,IAAIsP,iBACnBC,EAAW9P,EAAIO,IAAIwP,iBAMvB,GAHAG,EAAIC,UAAYP,EAChBM,EAAIE,SAAS,EAAG,EAAGvB,EAAOG,MAAOH,EAAOI,QAEpCS,EAAS,EACZ,IAAK,IAAI1E,EAAI,EAAGA,EAAI6D,EAAOI,OAAQjE,GAAc,EAAT0E,EAEvCQ,EAAIC,UAAYL,EAChBI,EAAIE,SAAS,EAAGpF,EAAG0E,EAAQA,GAC3BQ,EAAIE,SAASV,EAAQ1E,EAAI0E,EAAQA,EAAQA,GAI3C,IAAIkJ,EAAO1I,EAAIoI,qBAAqB,EAAG,EAAG,EAAGzJ,EAAOI,QACpD2J,EAAKL,aAAa,EAAG9J,GACrBmK,EAAKL,aAAa,EAAG,iBAErBrI,EAAIC,UAAYyI,EAChB1I,EAAIE,SAAS,EAAG,EAAGvB,EAAOG,MAAOH,EAAOI,OACzC,EAKOzB,CACR,EAGA3N,WACKA,EAAY,SAAUiZ,EAASxG,EAASyG,EAAMC,EAAQvK,EAAOwK,GAChErZ,KAAKkZ,QAAUA,EACflZ,KAAK0S,QAAUA,EACf1S,KAAKmZ,KAAOA,EACZnZ,KAAKoZ,OAASA,EACdpZ,KAAK6O,MAAQA,EACb7O,KAAKqZ,QAAUA,CAChB,EAEApZ,EAAU2K,UAAUhB,SAAW,WAC9B,IAAI8E,EAAO,CACVhF,KAAKC,MAAM3J,KAAKkZ,SAAW,KAC3BxP,KAAKC,MAAM3J,KAAK0S,SAAW,KAC3BhJ,KAAKC,MAAM3J,KAAKmZ,MAAQ,KACxBzP,KAAKC,MAAM3J,KAAKoZ,QAAU,KAC1BpZ,KAAK6O,OAKN,OAHI7O,KAAKqZ,OACR3K,EAAKtL,KAAK,SAEJsL,EAAK7D,KAAK,IAClB,EAEO5K,GAIRqZ,MAAQ,CACPC,WAAa,EACbC,WAAa,EACbC,aAAe,GAIhBC,SAAW,CACV5L,OAAQ,CAAC,OAAQ,MAAO,MAAO,OAAQ,MAAO,QAC9C6L,gBAAiB,CAAC,OAAQ,SAC1B1E,KAAM,CAAC,MAAO,MAAO,KAAM,MAC3B/D,SAAU,CAAC,OAAQ,QAAS,MAAO,UACnC0I,aAAc,CAAC,QAAQ,GAAM,GAC7BhC,iBAAkB,CAAC,QAAQ,GAAM,IAIlCiC,eAAiB,CAEhB,aAAgB,iBAChB,aAAgB,UAChB,mBAAsB,aACtB,SAAY,cACZ,WAAc,qBACd,WAAc,qBACd,OAAU,MAIXxX,QAAU,iCAUV1B,IAAM,SAAUwC,EAAeb,GAE9B,IAAIwX,EAAO9Z,KA2sBX,SAAS+Z,EAAWC,EAAQtV,GAC3B,GAAsB,iBAAXsV,EACV,MAAM,IAAIla,MAAM,kCAAoCka,GAIrD,GAAI5Z,EAAIsZ,SAASnU,eAAeyU,KACV,iBAAVtV,IACVA,EAAQA,EAAM9C,gBAE8B,IAAzCxB,EAAIsZ,SAASM,GAAQxV,QAAQE,IAChC,MAAM,IAAI5E,MAAM,WAAcka,EAAS,wBAA2BtV,GAKpE,GAAItE,EAAIyZ,eAAetU,eAAeyU,GAAS,CAC9C,IAAIC,EAASD,EACTE,EAAS9Z,EAAIyZ,eAAeG,GAChC,IAAIE,EAMH,MAAM,IAAIpa,MAAM,WAAcka,EAAS,mBAJvC7X,QAAQC,KAAK,iDAAuDhC,EAAIiC,QAAS4X,EAAQC,GACzFF,EAASE,CAKX,CAEA,IAAIC,EAAS,QAAUH,EAEvB,GAA4B,mBAAjBF,EAAKK,GAEf,OADAL,EAAKK,GAAQzV,IACN,EAED,GAAIsV,KAAUF,EAEpB,OADAA,EAAKE,GAAUtV,GACR,EAGR,MAAM,IAAI5E,MAAM,sCAAwCka,EACzD,CAGA,SAASI,EAAWJ,GACnB,GAAsB,iBAAXA,EACV,MAAM,IAAIla,MAAM,kCAAoCka,GAIrD,GAAI5Z,EAAIyZ,eAAetU,eAAeyU,GAAS,CAC9C,IAAIC,EAASD,EACTE,EAAS9Z,EAAIyZ,eAAeG,GAChC,IAAIE,EAMH,MAAM,IAAIpa,MAAM,WAAcka,EAAS,mBAJvC7X,QAAQC,KAAK,iDAAuDhC,EAAIiC,QAAS4X,EAAQC,GACzFF,EAASE,CAKX,CAEA,IAAIG,EAAS,QAAUL,EAEvB,GAA4B,mBAAjBF,EAAKO,GACf,OAAOP,EAAKO,GAAQ3V,OAEd,GAAIsV,KAAUF,EACpB,OAAOA,EAAKE,GAGb,MAAM,IAAIla,MAAM,sCAAwCka,EACzD,CAUA,SAASM,IAKRR,EAAKS,8BAEAna,EAAIkR,SACRlR,EAAIkR,OAAS,CACZC,MAAO,KACPqB,KAAOxS,EAAIiD,SAAS,OACpBmX,IAAMpa,EAAIiD,SAAS,OACnBwP,KAAOzS,EAAIiD,SAAS,OACpBoX,KAAOra,EAAIiD,SAAS,OACpBqX,IAAMta,EAAIiD,SAAS,OACnBsX,KAAOva,EAAIiD,SAAS,OACpBuX,KAAOxa,EAAIiD,SAAS,OACpBwX,UAAYza,EAAImY,kBAChBuC,MAAQ1a,EAAIiD,SAAS,OACrB0X,QAAU3a,EAAIiD,SAAS,OACvB2X,QAAU5a,EAAIiD,SAAS,OACvB4X,QAAU7a,EAAIiD,SAAS,OACvB6X,QAAU9a,EAAIiD,SAAS,OACvB8X,IAAM/a,EAAIiD,SAAS,OACnB+X,KAAOhb,EAAIiD,SAAS,OACpBgY,KAAOjb,EAAIiD,SAAS,OACpBiY,QAAUlb,EAAIyY,uBACd0C,QAAUnb,EAAIiD,SAAS,OACvBmY,SAAWpb,EAAIiD,SAAS,OACxBoY,SAAWrb,EAAIiD,SAAS,OACxBqY,SAAWtb,EAAIiD,SAAS,OACxBsY,KAAOvb,EAAIiD,SAAS,OACpBuY,MAAQxb,EAAIiD,SAAS,OACrBwY,MAAQzb,EAAIiD,SAAS,OACrByY,SAAW1b,EAAI6Y,wBACf8C,SAAW3b,EAAIiD,SAAS,OACxB2Y,UAAY5b,EAAIiD,SAAS,OACzB4Y,UAAY7b,EAAIiD,SAAS,OACzB6Y,UAAY9b,EAAIiD,SAAS,OACzBkQ,IAAMnT,EAAIiD,SAAS,OACnB8Y,IAAM/b,EAAIiD,SAAS,OACnB+Y,KAAOhc,EAAIiD,SAAS,SAGrBjD,EAAIkR,OAAOoJ,IAAI2B,YAAYjc,EAAIkR,OAAOuJ,UAAU1a,KAChDC,EAAIkR,OAAOqJ,KAAK0B,YAAYjc,EAAIkR,OAAOoJ,KACvCta,EAAIkR,OAAOwJ,MAAMuB,YAAYjc,EAAIkR,OAAOyJ,SACxC3a,EAAIkR,OAAOwJ,MAAMuB,YAAYjc,EAAIkR,OAAO0J,SACxC5a,EAAIkR,OAAOwJ,MAAMuB,YAAYjc,EAAIkR,OAAO2J,SACxC7a,EAAIkR,OAAOwJ,MAAMuB,YAAYjc,EAAIkR,OAAO4J,SACxC9a,EAAIkR,OAAOqJ,KAAK0B,YAAYjc,EAAIkR,OAAOwJ,OACvC1a,EAAIkR,OAAOkJ,IAAI6B,YAAYjc,EAAIkR,OAAOqJ,MACtCva,EAAIkR,OAAOkJ,IAAI6B,YAAYjc,EAAIkR,OAAOsJ,MAEtCxa,EAAIkR,OAAO6J,IAAIkB,YAAYjc,EAAIkR,OAAOgK,QAAQnb,KAC9CC,EAAIkR,OAAO8J,KAAKiB,YAAYjc,EAAIkR,OAAO6J,KACvC/a,EAAIkR,OAAO8J,KAAKiB,YAAYjc,EAAIkR,OAAOoK,UACvCtb,EAAIkR,OAAOoK,SAASW,YAAYjc,EAAIkR,OAAOmK,UAC3Crb,EAAIkR,OAAOmK,SAASY,YAAYjc,EAAIkR,OAAOkK,UAC3Cpb,EAAIkR,OAAOkK,SAASa,YAAYjc,EAAIkR,OAAOiK,SAC3Cnb,EAAIkR,OAAOkJ,IAAI6B,YAAYjc,EAAIkR,OAAO8J,MACtChb,EAAIkR,OAAOkJ,IAAI6B,YAAYjc,EAAIkR,OAAO+J,MAEtCjb,EAAIkR,OAAOqK,KAAKU,YAAYjc,EAAIkR,OAAOwK,SAAS3b,KAChDC,EAAIkR,OAAOsK,MAAMS,YAAYjc,EAAIkR,OAAOqK,MACxCvb,EAAIkR,OAAOsK,MAAMS,YAAYjc,EAAIkR,OAAO4K,WACxC9b,EAAIkR,OAAO4K,UAAUG,YAAYjc,EAAIkR,OAAO2K,WAC5C7b,EAAIkR,OAAO2K,UAAUI,YAAYjc,EAAIkR,OAAO0K,WAC5C5b,EAAIkR,OAAO0K,UAAUK,YAAYjc,EAAIkR,OAAOyK,UAC5C3b,EAAIkR,OAAOkJ,IAAI6B,YAAYjc,EAAIkR,OAAOsK,OACtCxb,EAAIkR,OAAOkJ,IAAI6B,YAAYjc,EAAIkR,OAAOuK,OAEtCzb,EAAIkR,OAAOkJ,IAAI6B,YAAYjc,EAAIkR,OAAOiC,KAEtCnT,EAAIkR,OAAO6K,IAAIE,YAAYjc,EAAIkR,OAAO8K,MACtChc,EAAIkR,OAAOkJ,IAAI6B,YAAYjc,EAAIkR,OAAO6K,KAEtC/b,EAAIkR,OAAOmJ,KAAK4B,YAAYjc,EAAIkR,OAAOkJ,KACvCpa,EAAIkR,OAAOsB,KAAKyJ,YAAYjc,EAAIkR,OAAOuB,MACvCzS,EAAIkR,OAAOsB,KAAKyJ,YAAYjc,EAAIkR,OAAOmJ,MAEvCra,EAAIkR,OAAOsB,KAAKlS,iBAAiB,aAAcN,EAAImW,qBAClDnW,EAAIwE,yBAA0B,CAAC0X,SAAS,KAG1C,IAoSKC,EACAC,EArSDC,EAAIrc,EAAIkR,OAERoL,IAAkBtc,EAAIiT,iBAAiByG,GACvC6C,EAAqB7C,EAAKxG,kBAC1BsJ,EAAaxc,EAAI4R,cAAc8H,GAC/B+C,EAAkB,EAAI/C,EAAKhF,mBAAqBgF,EAAK/E,iBAAmB,EAAI+E,EAAKgD,UACjFC,EAAiB3c,EAAI+S,kBAAkB2G,GACvCkD,EAAetT,KAAKyD,IACvB2M,EAAKkD,aACLtT,KAAKC,MAAMmQ,EAAKrG,QAAU/J,KAAKuT,KAIhCR,EAAE7J,KAAK7Q,UAAY,sBACnB0a,EAAE7J,KAAKxJ,MAAM8T,MAAQ,OACrBT,EAAE7J,KAAKxJ,MAAMgG,MAAQwN,EAAW1K,QAAU,KAC1CuK,EAAE7J,KAAKxJ,MAAMiG,OAASuN,EAAWzK,QAAU,KAC3CsK,EAAE7J,KAAKxJ,MAAM+T,OAASrD,EAAKqD,OAG3BV,EAAEjC,IAAIzY,UAAY,iBAClB0a,EAAEjC,IAAIpR,MAAMgG,MAAQwN,EAAW5I,QAAU,KACzCyI,EAAEjC,IAAIpR,MAAMiG,OAASuN,EAAW3I,QAAU,KAC1CwI,EAAEjC,IAAIpR,MAAM8H,SAAW,WAGvBuL,EAAE5J,KAAK9Q,UAAY,wBACnB0a,EAAE5J,KAAKzJ,MAAM8H,SAAW,WACxBuL,EAAE5J,KAAKzJ,MAAMmC,KAAO,IACpBkR,EAAE5J,KAAKzJ,MAAMoC,IAAM,IACnBiR,EAAE5J,KAAKzJ,MAAMgG,MAAQ,OACrBqN,EAAE5J,KAAKzJ,MAAMiG,OAAS,OACtBjP,EAAI2K,gBAAgB0R,EAAE5J,KAAMmK,EAAe,MAG3CP,EAAEhC,KAAK1Y,UAAY,wBACnB0a,EAAEhC,KAAKrR,MAAM8H,SAAW,WACxBuL,EAAEhC,KAAKrR,MAAMgU,OAAStD,EAAK5F,YAAc,WACzCuI,EAAEhC,KAAKrR,MAAMiU,YAAcvD,EAAKuD,YAChCZ,EAAEhC,KAAKrR,MAAMqB,WAAaqP,EAAKwD,gBAC/Bld,EAAI2K,gBAAgB0R,EAAEhC,KAAMuC,EAAe,MAK3CP,EAAE7B,KAAKxR,MAAMqB,WAAa,mBAC1BgS,EAAEpB,KAAKjS,MAAMqB,WAAa,mBAC1BgS,EAAEZ,MAAMzS,MAAMqB,WAAa,mBAE3BgS,EAAE7B,KAAKxR,MAAMmU,QACbd,EAAEpB,KAAKjS,MAAMmU,QACbd,EAAEZ,MAAMzS,MAAMmU,QACb,IAGDd,EAAE/B,IAAItR,MAAM8H,SAAW,WACvBuL,EAAE/B,IAAItR,MAAMgG,MAAQ0K,EAAK1K,MAAQ,KACjCqN,EAAE/B,IAAItR,MAAMiG,OAASyK,EAAKzK,OAAS,KAGnCoN,EAAE5B,UAAUrC,KAAKsB,EAAK1K,MAAO0K,EAAKzK,OAAQjP,EAAI4U,eAAe8E,IAG7D2C,EAAE9B,KAAKvR,MAAM8H,SAAW,WACxBuL,EAAE9B,KAAKvR,MAAMmC,KAAOuO,EAAKrG,QAAU,KACnCgJ,EAAE9B,KAAKvR,MAAMoC,IAAMsO,EAAKrG,QAAU,KAClCgJ,EAAE9B,KAAKvR,MAAMgU,OAAStD,EAAK7G,mBAAqB,WAChDwJ,EAAE9B,KAAKvR,MAAMiU,YAAcvD,EAAK0D,mBAGhCf,EAAE7B,KAAKxR,MAAM8H,SAAW,WACxBuL,EAAE7B,KAAKxR,MAAMmC,KAAO,MACpBkR,EAAE7B,KAAKxR,MAAMoC,IAAM,MACnBiR,EAAE7B,KAAKxR,MAAMgG,MAAS0K,EAAKrG,QAAU,EAAIqG,EAAK7G,mBAAqB6G,EAAK1K,MAAQ2N,EAAkB,KAClGN,EAAE7B,KAAKxR,MAAMiG,OAAU,EAAIyK,EAAK7G,mBAAqB,EAAI6G,EAAKrG,QAAUqG,EAAKzK,OAAU,KACvFoN,EAAE7B,KAAKxR,MAAMqU,OAjEG,YAkEhBrd,EAAIqD,QAAQgZ,EAAE7B,KAAM,CACnB8C,SAAU5D,EACV6D,QAAS,QAIVlB,EAAE3B,MAAM1R,MAAM8H,SAAW,WACzBuL,EAAE3B,MAAM1R,MAAMmC,KACdkR,EAAE3B,MAAM1R,MAAMoC,IACb,IACDiR,EAAE3B,MAAM1R,MAAMgG,MACdqN,EAAE3B,MAAM1R,MAAMiG,OACbwN,EAAiB,KAGlBJ,EAAE1B,QAAQ3R,MAAM8H,SAChBuL,EAAEzB,QAAQ5R,MAAM8H,SACf,WACDuL,EAAE1B,QAAQ3R,MAAMqB,WAChBgS,EAAEzB,QAAQ5R,MAAMqB,WACfqP,EAAK8D,mBACNnB,EAAE1B,QAAQ3R,MAAMgG,MAChBqN,EAAEzB,QAAQ5R,MAAMiG,OACd,EAAIyK,EAAKhF,mBAAqBgF,EAAK/E,iBAAoB,KACzD0H,EAAE1B,QAAQ3R,MAAMiG,OAChBoN,EAAEzB,QAAQ5R,MAAMgG,MACfyN,EAAiB,KAClBJ,EAAE1B,QAAQ3R,MAAMmC,KAChBkR,EAAEzB,QAAQ5R,MAAMoC,IACd9B,KAAKgE,MAAMmP,EAAiB,GAAKnT,KAAKgE,MAAMoM,EAAK/E,iBAAmB,GAAK+E,EAAKhF,mBAAsB,KACtG2H,EAAE1B,QAAQ3R,MAAMoC,IAChBiR,EAAEzB,QAAQ5R,MAAMmC,KACf,IAGDkR,EAAExB,QAAQ7R,MAAM8H,SAChBuL,EAAEvB,QAAQ9R,MAAM8H,SACf,WACDuL,EAAExB,QAAQ7R,MAAMqB,WAChBgS,EAAEvB,QAAQ9R,MAAMqB,WACfqP,EAAK+D,aACNpB,EAAExB,QAAQ7R,MAAMiG,OAChBoN,EAAEvB,QAAQ9R,MAAMgG,MACdyN,EAAiB,EAAI/C,EAAKhF,mBAAsB,KAClD2H,EAAExB,QAAQ7R,MAAMgG,MAChBqN,EAAEvB,QAAQ9R,MAAMiG,OACfyK,EAAK/E,iBAAmB,KACzB0H,EAAExB,QAAQ7R,MAAMmC,KAChBkR,EAAEvB,QAAQ9R,MAAMoC,IACd9B,KAAKgE,MAAMmP,EAAiB,GAAKnT,KAAKgE,MAAMoM,EAAK/E,iBAAmB,GAAM,KAC5E0H,EAAExB,QAAQ7R,MAAMoC,IAChBiR,EAAEvB,QAAQ9R,MAAMmC,KACfuO,EAAKhF,mBAAqB,KAI3B2H,EAAEtB,IAAI/R,MAAM0U,SAAW,SACvBrB,EAAEtB,IAAI/R,MAAMgG,MAAQ0K,EAAK1G,WAAa,KACtCqJ,EAAEtB,IAAI/R,MAAMiG,OAASyK,EAAKzK,OAAS,KAGnCoN,EAAEnB,QAAQ9C,KAAKsB,EAAK1G,WAAY0G,EAAKzK,OAAQ,OAAQ,QAGrDoN,EAAErB,KAAKhS,MAAM2U,QAAUrB,EAAgB,QAAU,OACjDD,EAAErB,KAAKhS,MAAM8H,SAAW,WACxBuL,EAAErB,KAAKhS,MAAMmC,KAAQuO,EAAKrG,QAAUqG,EAAK1K,MAAQ,EAAI0K,EAAK7G,mBAAqB,EAAI8J,EAAkB,KACrGN,EAAErB,KAAKhS,MAAMoC,IAAMsO,EAAKrG,QAAU,KAClCgJ,EAAErB,KAAKhS,MAAMgU,OAAStD,EAAK7G,mBAAqB,WAChDwJ,EAAErB,KAAKhS,MAAMiU,YAAcvD,EAAK0D,mBAGhCf,EAAEpB,KAAKjS,MAAM2U,QAAUrB,EAAgB,QAAU,OACjDD,EAAEpB,KAAKjS,MAAM8H,SAAW,WACxBuL,EAAEpB,KAAKjS,MAAMmC,KAAQuO,EAAKrG,QAAUqG,EAAK1K,MAAQ,EAAI0K,EAAK7G,mBAAqB8J,EAAkB,KACjGN,EAAEpB,KAAKjS,MAAMoC,IAAM,MACnBiR,EAAEpB,KAAKjS,MAAMgG,MACV0K,EAAK1G,WAAa,EAAI2J,EAAiB,EAAIjD,EAAK7G,oBAChD0J,EAAqB,EAAIjT,KAAK2D,IAAI,EAAGyM,EAAKrG,QAAUsJ,IAClD,KACLN,EAAEpB,KAAKjS,MAAMiG,OAAU,EAAIyK,EAAK7G,mBAAqB,EAAI6G,EAAKrG,QAAUqG,EAAKzK,OAAU,KACvFoN,EAAEpB,KAAKjS,MAAMqU,OAAS,UACtBrd,EAAIqD,QAAQgZ,EAAEpB,KAAM,CACnBqC,SAAU5D,EACV6D,QAAS,QAIVlB,EAAEjB,SAASpS,MAAMgU,OACjBX,EAAEf,SAAStS,MAAMgU,OAChBtD,EAAKhF,mBAAqB,YAAcgF,EAAK8D,mBAG9CnB,EAAEf,SAAStS,MAAM8H,SAAW,WAC5BuL,EAAEf,SAAStS,MAAMmC,OAAS,EAAIuO,EAAKhF,mBAAqBgF,EAAK/E,kBAAoB,KACjF0H,EAAEf,SAAStS,MAAMoC,IAAM,IAGvBiR,EAAEhB,SAASrS,MAAMgU,OAAStD,EAAK/E,iBAAmB,YAAc+E,EAAK+D,aAGrEpB,EAAElB,QAAQnS,MAAMgG,MAAQ0K,EAAK1G,WAAa,KAC1CqJ,EAAElB,QAAQnS,MAAMiG,OAASjP,EAAIO,IAAIqd,iBAAmB,KAIpDvB,EAAEd,KAAKvS,MAAM0U,SAAW,SACxBrB,EAAEd,KAAKvS,MAAMgG,MAAQ0K,EAAK1G,WAAa,KACvCqJ,EAAEd,KAAKvS,MAAMiG,OAASyK,EAAKzK,OAAS,KAGpCoN,EAAEX,SAAStD,KAAKsB,EAAK1G,WAAY0G,EAAKzK,OAAQ,QAG9CoN,EAAEb,MAAMxS,MAAM2U,QAAUpB,EAAqB,QAAU,OACvDF,EAAEb,MAAMxS,MAAM8H,SAAW,WACzBuL,EAAEb,MAAMxS,MAAMmC,KACXuO,EAAKrG,QAAUqG,EAAK1K,MAAQ,EAAI0K,EAAK7G,mBAAqB8J,GAC1DL,EAAiB5C,EAAK1G,WAAa,EAAI2J,EAAiB,EAAIjD,EAAK7G,mBAAsB,GACrF,KACLwJ,EAAEb,MAAMxS,MAAMoC,IAAMsO,EAAKrG,QAAU,KACnCgJ,EAAEb,MAAMxS,MAAMgU,OAAStD,EAAK7G,mBAAqB,WACjDwJ,EAAEb,MAAMxS,MAAMiU,YAAcvD,EAAK0D,mBAGjCf,EAAEZ,MAAMzS,MAAM2U,QAAUpB,EAAqB,QAAU,OACvDF,EAAEZ,MAAMzS,MAAM8H,SAAW,WACzBuL,EAAEZ,MAAMzS,MAAMmC,KACXuO,EAAKrG,QAAUqG,EAAK1K,MAAQ,EAAI0K,EAAK7G,mBAAqB8J,GAC1DL,EAAiB5C,EAAK1G,WAAa,EAAI2J,EAAiB,EAAIjD,EAAK7G,mBAAsB,GACrF,KACLwJ,EAAEZ,MAAMzS,MAAMoC,IAAM,MACpBiR,EAAEZ,MAAMzS,MAAMgG,MACX0K,EAAK1G,WAAa,EAAI2J,EAAiB,EAAIjD,EAAK7G,mBACjDvJ,KAAK2D,IAAI,EAAGyM,EAAKrG,QAAUsJ,GACxB,KACLN,EAAEZ,MAAMzS,MAAMiG,OAAU,EAAIyK,EAAK7G,mBAAqB,EAAI6G,EAAKrG,QAAUqG,EAAKzK,OAAU,KACxFoN,EAAEZ,MAAMzS,MAAMqU,OAAS,UACvBrd,EAAIqD,QAAQgZ,EAAEZ,MAAO,CACpB6B,SAAU5D,EACV6D,QAAS,SAIVlB,EAAET,UAAU5S,MAAMgU,OAClBX,EAAEP,UAAU9S,MAAMgU,OACjBtD,EAAKhF,mBAAqB,YAAcgF,EAAK8D,mBAG9CnB,EAAEP,UAAU9S,MAAM8H,SAAW,WAC7BuL,EAAEP,UAAU9S,MAAMmC,OAAS,EAAIuO,EAAKhF,mBAAqBgF,EAAK/E,kBAAoB,KAClF0H,EAAEP,UAAU9S,MAAMoC,IAAM,IAGxBiR,EAAER,UAAU7S,MAAMgU,OAAStD,EAAK/E,iBAAmB,YAAc+E,EAAK+D,aAGtEpB,EAAEV,SAAS3S,MAAMgG,MAAQ0K,EAAK1G,WAAa,KAC3CqJ,EAAEV,SAAS3S,MAAMiG,OAASjP,EAAIO,IAAIqd,iBAAmB,KAIrDvB,EAAElJ,IAAIxR,UAAY,kBAClB0a,EAAElJ,IAAInK,MAAM2U,QAAUnB,EAAWzI,QAAQE,KAAO,QAAU,OAC1DoI,EAAElJ,IAAInK,MAAM8H,SAAW,WACvBuL,EAAElJ,IAAInK,MAAMmC,KAAOuO,EAAKrG,QAAU,KAClCgJ,EAAElJ,IAAInK,MAAMoC,IAAO,EAAIsO,EAAK7G,mBAAqB,EAAI6G,EAAKrG,QAAUqG,EAAKzK,OAAU,KAInFoN,EAAElJ,IAAI0K,UAAY,GAKlB,IAHA,IAAIC,EAAa9d,EAAIoP,sBAAsB,iBAEvC2O,EAAK,EACA5U,EAAI,EAAGA,EAAIqT,EAAWzI,QAAQE,KAAM9K,IAC5C,IAAK,IAAIqI,EAAI,EAAGA,EAAIgL,EAAWzI,QAAQC,MAAQ+J,EAAKrE,EAAKrF,SAASlT,OAAQqQ,IAAKuM,IAAM,CACpF,IAAIC,EAActE,EAAKrF,SAAS0J,GAC5BE,EAAiBje,EAAI8J,UAAUkH,MAAM,KAAMgN,EAAYvQ,MAEvDyQ,EAAKle,EAAIiD,SAAS,OACtBib,EAAGlV,MAAMgG,MAASwN,EAAWzI,QAAQG,MAAQ,EAAIwF,EAAK7G,mBAAsB,KAC5EqL,EAAGlV,MAAMiG,OAAUuN,EAAWzI,QAAQI,MAAQ,EAAIuF,EAAK7G,mBAAsB,KAC7EqL,EAAGlV,MAAMkU,gBAAkBe,EAE3B,IAAIE,EAAKne,EAAIiD,SAAS,OACtBkb,EAAGxc,UAAY,yBACfwc,EAAGnV,MAAM2U,QAAU,QACnBQ,EAAGnV,MAAM8H,SAAW,WACpBqN,EAAGnV,MAAMmC,MACPqR,EAAWzI,QAAQC,MAAQ,EAAI,EAC/B1K,KAAKC,MAAYiI,IAAMgL,EAAW9I,SAAW8I,EAAWzI,QAAQG,QAAUsI,EAAWzI,QAAQC,KAAO,IAAzF,IAAiG,IACzG,KACLmK,EAAGnV,MAAMoC,IAAOjC,GAAKqT,EAAWzI,QAAQI,MAAQuF,EAAKlF,gBAAmB,KACxE2J,EAAGnV,MAAMgU,OAAStD,EAAK7G,mBAAqB,WAC5CsL,EAAGnV,MAAMiU,YAAcvD,EAAK0D,mBAC5Be,EAAGnV,MAAMqU,OAAS,UACU,OAAxBW,EAAYvQ,KAAK,IAAeuQ,EAAYvQ,KAAK,GAAK,IACzD0Q,EAAGnV,MAAMoV,gBAAkB,QAAWN,EAAWjP,OAAOwP,YAAc,KACtEF,EAAGnV,MAAMsV,iBAAmB,SAC5BH,EAAGnV,MAAMuV,mBAAqB,iBAE/Bve,EAAIqD,QAAQ8a,EAAI,CACfb,SAAU5D,EACV6D,QAAS,iBACT9O,MAAOuP,IAERG,EAAG7d,iBAAiB,QAASN,EAAIoX,sBAAsB,GACvD+G,EAAGlC,YAAYiC,GACf7B,EAAElJ,IAAI8I,YAAYkC,EACnB,CAWD9B,EAAEN,IAAIpa,UAAY,oBAClB0a,EAAEN,IAAI/S,MAAM2U,QAAUjE,EAAKpG,YAAc,QAAU,OACnD+I,EAAEN,IAAI/S,MAAM8H,SAAW,WACvBuL,EAAEN,IAAI/S,MAAMmC,KAAOuO,EAAKrG,QAAU,KAClCgJ,EAAEN,IAAI/S,MAAMwV,OAAS9E,EAAKrG,QAAU,KACpCgJ,EAAEN,IAAI/S,MAAMqK,QAAU,SACtBgJ,EAAEN,IAAI/S,MAAMyV,SAAYjC,EAAW9I,SAAW,EAAIgG,EAAK7G,mBAAqB,GAAkB,KAC9FwJ,EAAEN,IAAI/S,MAAM0U,SAAW,SACvBrB,EAAEN,IAAI/S,MAAMiG,OAASyK,EAAKnG,aAAe,KACzC8I,EAAEN,IAAI/S,MAAM0V,WAAa,SACzBrC,EAAEN,IAAI/S,MAAMgU,OAAStD,EAAK7G,mBAAqB,WAd1CuJ,GADAD,EAAczC,EAAK0D,mBAAmBxV,MAAM,QAClBzG,OAAS,EAAIgb,EAAY,GAAKA,EAAY,GAAK,IAAMA,EAAY,GAAK,IAAMA,EAAY,GAAK,IAAMA,EAAY,GAC7IE,EAAEN,IAAI/S,MAAMiU,YAAcb,EAe3BC,EAAEN,IAAI/S,MAAMyF,MAAQiL,EAAKiF,YACzBtC,EAAEN,IAAI/S,MAAM4V,KAAO,kBACnBvC,EAAEN,IAAI/S,MAAM6V,UAAY,SACxBxC,EAAEN,IAAI/S,MAAMqU,OAAS,UACrBhB,EAAEN,IAAI+C,YAAc,WACnBpF,EAAK9B,MACN,EACAyE,EAAEL,KAAKhT,MAAM+V,WAAarF,EAAKnG,aAAe,KAC9C8I,EAAEL,KAAK6B,UAAY,GACnBxB,EAAEL,KAAKC,YAAYtc,EAAOH,SAASwf,eAAetF,EAAKuF,YAGvDC,IACAC,IACAC,IAIIpf,EAAIkR,OAAOC,OAASnR,EAAIkR,OAAOC,QAAUuI,GAC5C1Z,EAAImI,YAAYnI,EAAIkR,OAAOC,MAAMpO,cAAe/C,EAAIO,IAAI8e,iBAIzDrf,EAAIkR,OAAOC,MAAQuI,EAIfA,EAAK4F,YAAc3f,EAAOH,SAAS+f,KACtCvf,EAAIiR,iBAEJjR,EAAIqS,cAAcqH,EAAM,EAAG,EAAG,YAAY,GAGvC2C,EAAE7J,KAAKgN,aAAe9F,EAAK4F,WAC9B5F,EAAK4F,UAAUrD,YAAYI,EAAE7J,MAG9BxS,EAAIgI,SAAS0R,EAAK3W,cAAe/C,EAAIO,IAAI8e,gBAC1C,CAGA,SAASH,IAER,IAAIO,EAAWzf,EAAI4U,eAAe8E,GAC9B3O,EAAIzB,KAAKC,MAAOmQ,EAAK3C,SAAS7J,EAAI,KAAQwM,EAAK1K,MAAQ,IACvDhE,EAAI1B,KAAKC,OAAO,EAAImQ,EAAK3C,SAAS0I,GAAY,MAAQ/F,EAAKzK,OAAS,IACpEwN,EAAkB,EAAI/C,EAAKhF,mBAAqBgF,EAAK/E,iBAAmB,EAAI+E,EAAKgD,UACjF9F,GAAOtN,KAAKgE,MAAMmP,EAAiB,GAKvC,OAJAzc,EAAIkR,OAAOwJ,MAAM1R,MAAMmC,KAAQJ,EAAI6L,EAAO,KAC1C5W,EAAIkR,OAAOwJ,MAAM1R,MAAMoC,IAAOJ,EAAI4L,EAAO,KAGjC5W,EAAIiT,iBAAiByG,IAC7B,IAAK,IACJ,IAAIgG,EAAO1f,EAAImN,QAAQuM,EAAK3C,SAAS7J,EAAG,IAAKwM,EAAK3C,SAAS/J,GACvD2S,EAAO3f,EAAImN,QAAQuM,EAAK3C,SAAS7J,EAAG,EAAGwM,EAAK3C,SAAS/J,GACrD0L,EAAS,OACZpP,KAAKC,MAAMmW,EAAK,IAAM,IACtBpW,KAAKC,MAAMmW,EAAK,IAAM,IACtBpW,KAAKC,MAAMmW,EAAK,IAAM,IACnB/G,EAAS,OACZrP,KAAKC,MAAMoW,EAAK,IAAM,IACtBrW,KAAKC,MAAMoW,EAAK,IAAM,IACtBrW,KAAKC,MAAMoW,EAAK,IAAM,IACvB3f,EAAIkR,OAAOgK,QAAQ9C,KAAKsB,EAAK1G,WAAY0G,EAAKzK,OAAQyJ,EAAQC,GAC9D,MACD,IAAK,IACJ,IAAIiH,EAAM5f,EAAImN,QAAQuM,EAAK3C,SAAS7J,EAAGwM,EAAK3C,SAAS3J,EAAG,KACpDsL,EAAS,OACZpP,KAAKC,MAAMqW,EAAI,IAAM,IACrBtW,KAAKC,MAAMqW,EAAI,IAAM,IACrBtW,KAAKC,MAAMqW,EAAI,IAAM,IAClBjH,EAAS,OACb3Y,EAAIkR,OAAOgK,QAAQ9C,KAAKsB,EAAK1G,WAAY0G,EAAKzK,OAAQyJ,EAAQC,GAK/D3Y,EAAIkR,OAAOwK,SAAStD,KAAKsB,EAAK1G,WAAY0G,EAAKzK,OAAQyK,EAAKmG,cAC7D,CAGA,SAASV,IACR,IAAIW,EAAa9f,EAAIiT,iBAAiByG,GACtC,GAAIoG,EAAY,CAEf,IAAI9U,EAAI1B,KAAKC,OAAO,EAAImQ,EAAK3C,SAAS+I,GAAc,MAAQpG,EAAKzK,OAAS,IAC1EjP,EAAIkR,OAAOoK,SAAStS,MAAMoC,IAAOJ,GAAK,EAAI0O,EAAKhF,mBAAqBgF,EAAK/E,kBAAoBrL,KAAKgE,MAAMtN,EAAIO,IAAIqd,iBAAmB,GAAM,IAC1I,CAGA5d,EAAIkR,OAAOwK,SAAStD,KAAKsB,EAAK1G,WAAY0G,EAAKzK,OAAQyK,EAAKmG,cAC7D,CAGA,SAAST,IACR,IAAIpU,EAAI1B,KAAKC,OAAO,EAAImQ,EAAK3C,SAASnN,IAAM8P,EAAKzK,OAAS,IAC1DjP,EAAIkR,OAAO4K,UAAU9S,MAAMoC,IAAOJ,GAAK,EAAI0O,EAAKhF,mBAAqBgF,EAAK/E,kBAAoBrL,KAAKgE,MAAMtN,EAAIO,IAAIqd,iBAAmB,GAAM,IAC3I,CAGA,SAASmC,IACR,OAAO/f,EAAIkR,QAAUlR,EAAIkR,OAAOC,QAAUuI,CAC3C,CA+FA,GA52CKxX,IACJA,EAAO,CAAC,GAGTtC,KAAKmX,SAAW,CACf5N,EAAG,IACHC,EAAG,IACHC,EAAG,IACH6D,EAAG,EACHE,EAAG,EACHJ,EAAG,IACHpD,EAAG,GAKJhK,KAAK8N,OAAS,OACd9N,KAAK0E,WAAQhD,EACb1B,KAAKogB,WAAQ1e,EACb1B,KAAKqgB,QAAS,EACdrgB,KAAKsgB,cAAW5e,EAChB1B,KAAKugB,aAAU7e,EACf1B,KAAKwgB,kBAAe9e,EACpB1B,KAAKygB,kBAAe/e,EACpB1B,KAAK0gB,oBAAiBhf,EACtB1B,KAAK2Z,gBAAkB,OACvB3Z,KAAK2gB,YAAc,GACnB3gB,KAAK4gB,eAAiB,EACtB5gB,KAAK6gB,UAAW,EAChB7gB,KAAK8gB,MAAO,EACZ9gB,KAAK+gB,WAAY,EACjB/gB,KAAKghB,YAAa,EAIlBhhB,KAAKoP,MAAQ,IACbpP,KAAKqP,OAAS,IACdrP,KAAKiV,KAAO,MACZjV,KAAK4Z,aAAe,OACpB5Z,KAAKkR,SAAW,SAChBlR,KAAKqS,eAAgB,EACrBrS,KAAKmW,aAAc,EACnBnW,KAAKihB,aAAc,EACnBjhB,KAAKmU,QAAU,GACfnU,KAAK0U,YAAc,GACnB1U,KAAK4X,iBAAmB,OACxB5X,KAAK6U,cAAgB,GACrB7U,KAAK4U,eAAiB,EACtB5U,KAAK+X,oBAAqB,EAC1B/X,KAAKoT,WAAa,GAClBpT,KAAK8c,UAAY,EACjB9c,KAAK0T,aAAc,EACnB1T,KAAKqf,UAAY,QACjBrf,KAAK+e,YAAc,gBACnB/e,KAAK2T,aAAe,GACpB3T,KAAKyT,QAAU,GACfzT,KAAKsd,gBAAkB,sBACvBtd,KAAKkU,YAAc,EACnBlU,KAAKqd,YAAc,sBACnBrd,KAAKgd,aAAe,EACpBhd,KAAKiT,mBAAqB,EAC1BjT,KAAKwd,mBAAqB,sBAC1Bxd,KAAK8S,QAAS,EACd9S,KAAK2S,WAAa,GAClB3S,KAAK+S,YAAc,kBACnB/S,KAAK6d,aAAe,mBACpB7d,KAAK8U,mBAAqB,EAC1B9U,KAAK4d,mBAAqB,sBAC1B5d,KAAK+U,iBAAmB,EACxB/U,KAAKmd,OAAS,IACdnd,KAAK0f,eAAYhe,EAIjB1B,KAAKkhB,KAAO,EACZlhB,KAAKmhB,KAAO,IACZnhB,KAAKohB,KAAO,EACZphB,KAAKqhB,KAAO,IACZrhB,KAAKshB,KAAO,EACZthB,KAAKuhB,KAAO,EAOZvhB,KAAKga,OAAS,WACb,IAAK3U,UAAU9D,OACd,MAAM,IAAIzB,MAAM,uBAGjB,GAAyB,IAArBuF,UAAU9D,QAAwC,iBAAjB8D,UAAU,GAAiB,CAE/D,IACC,OAAO+U,EAAU/U,UAAU,GAG5B,CAFE,MAAO5C,GACRN,QAAQC,KAAKK,EACd,CACA,OAAO,CAER,CAAO,GAAI4C,UAAU9D,QAAU,GAA6B,iBAAjB8D,UAAU,GAAiB,CAErE,IACC,IAAK0U,EAAU1U,UAAU,GAAIA,UAAU,IACtC,OAAO,CAKT,CAHE,MAAO5C,GAER,OADAN,QAAQC,KAAKK,IACN,CACR,CAGA,OAFAzC,KAAKwhB,SACLxhB,KAAKyhB,eACE,CAER,CAAO,GAAyB,IAArBpc,UAAU9D,QAAwC,iBAAjB8D,UAAU,GAAiB,CAEtE,IAAI/C,EAAO+C,UAAU,GACjBqc,GAAU,EACd,IAAK,IAAIC,KAAOrf,EACf,GAAIA,EAAKiD,eAAeoc,GACvB,IACM5H,EAAU4H,EAAKrf,EAAKqf,MACxBD,GAAU,EAKZ,CAHE,MAAOjf,GACRN,QAAQC,KAAKK,GACbif,GAAU,CACX,CAKF,OAFA1hB,KAAKwhB,SACLxhB,KAAKyhB,cACEC,CACR,CAEA,MAAM,IAAI5hB,MAAM,oBACjB,EAMAE,KAAK4hB,QAAU,SAAU/b,EAAMnB,GAC9B,GAAoB,iBAATmB,EACV,MAAM,IAAI/F,MAAM,mCAAqC+F,GAGtD,QAAcnE,IAAVgD,EAEH,OAAK1E,KAAKmX,SAAS5R,eAAeM,EAAKjE,eAIhC5B,KAAKmX,SAAStR,EAAKjE,gBAHzBO,QAAQC,KAAK,4BAA8ByD,IACpC,GAMR,IAAIgc,GAAM,EACV,OAAQhc,EAAKjE,eACZ,IAAK,IAAKigB,EAAM7hB,KAAK8X,SAASpT,EAAO,KAAM,KAAM,MAAO,MACxD,IAAK,IAAKmd,EAAM7hB,KAAK8X,SAAS,KAAMpT,EAAO,KAAM,MAAO,MACxD,IAAK,IAAKmd,EAAM7hB,KAAK8X,SAAS,KAAM,KAAMpT,EAAO,MAAO,MACxD,IAAK,IAAKmd,EAAM7hB,KAAKoX,SAAS1S,EAAO,KAAM,KAAM,MAAO,MACxD,IAAK,IAAKmd,EAAM7hB,KAAKoX,SAAS,KAAM1S,EAAO,KAAM,MAAO,MACxD,IAAK,IAAKmd,EAAM7hB,KAAKoX,SAAS,KAAM,KAAM1S,EAAO,MAAO,MACxD,IAAK,IAAKmd,EAAM7hB,KAAKoX,SAAS,KAAM,KAAM,KAAM1S,GAAQ,MACxD,QAEC,OADAvC,QAAQC,KAAK,4BAA8ByD,IACpC,EAET,QAAIgc,IACH7hB,KAAKwhB,UACE,EAKV,EASAxhB,KAAKuV,QAAU,SAAUD,GAExB,IADA,IAAIwM,EAAM1hB,EAAI0H,QAAQwN,GACbhU,EAAI,EAAGA,EAAIwgB,EAAIvgB,OAAQD,GAAK,EAAG,CACvC,IAAI8F,EAAK0a,EAAIxgB,GAAGM,cAGZmgB,EAAe,KACnB,OAAQ3a,GACP,IAAK,QAAS2a,EAAe,UAAW,MACxC,IAAK,SAAUA,EAAe,WAE3BA,GACH3hB,EAAI8U,gBAAgBlV,KAAM+hB,GAI3B3hB,EAAIqH,kBAAkBzH,KAAKwgB,aAAcpZ,GAAI,GAAM,EACpD,CACD,EAQApH,KAAKoX,SAAW,SAAU9J,EAAGE,EAAGJ,EAAGpD,EAAGsP,GAMrC,QALU5X,IAAN4L,IAAmBA,EAAI,WACjB5L,IAAN8L,IAAmBA,EAAI,WACjB9L,IAAN0L,IAAmBA,EAAI,WACjB1L,IAANsI,IAAmBA,EAAI,MAEjB,OAANsD,EAAY,CACf,GAAI0U,MAAM1U,GAAM,OAAO,EACvBtN,KAAKmX,SAAS7J,EAAI5D,KAAK2D,IAAI,EAAG3D,KAAKyD,IAAI,IAAKG,GAC7C,CACA,GAAU,OAANE,EAAY,CACf,GAAIwU,MAAMxU,GAAM,OAAO,EACvBxN,KAAKmX,SAAS3J,EAAI9D,KAAK2D,IAAI,EAAG3D,KAAKyD,IAAI,IAAKnN,KAAKmhB,KAAM3T,GAAIxN,KAAKkhB,KACjE,CACA,GAAU,OAAN9T,EAAY,CACf,GAAI4U,MAAM5U,GAAM,OAAO,EACvBpN,KAAKmX,SAAS/J,EAAI1D,KAAK2D,IAAI,EAAG3D,KAAKyD,IAAI,IAAKnN,KAAKqhB,KAAMjU,GAAIpN,KAAKohB,KACjE,CACA,GAAU,OAANpX,EAAY,CACf,GAAIgY,MAAMhY,GAAM,OAAO,EACvBhK,KAAKmX,SAASnN,EAAIhK,KAAKsT,kBACtB5J,KAAK2D,IAAI,EAAG3D,KAAKyD,IAAI,EAAGnN,KAAKuhB,KAAMvX,GAAIhK,KAAKshB,MAC5C,CACF,CAEA,IAAItB,EAAM5f,EAAImN,QACbvN,KAAKmX,SAAS7J,EACdtN,KAAKmX,SAAS3J,EACdxN,KAAKmX,SAAS/J,GAOf,OALApN,KAAKmX,SAAS5N,EAAIyW,EAAI,GACtBhgB,KAAKmX,SAAS3N,EAAIwW,EAAI,GACtBhgB,KAAKmX,SAAS1N,EAAIuW,EAAI,GAEtBhgB,KAAKyhB,YAAYnI,IACV,CACR,EAQAtZ,KAAK8X,SAAW,SAAUvO,EAAGC,EAAGC,EAAGO,EAAGsP,GAMrC,QALU5X,IAAN6H,IAAmBA,EAAI,WACjB7H,IAAN8H,IAAmBA,EAAI,WACjB9H,IAAN+H,IAAmBA,EAAI,WACjB/H,IAANsI,IAAmBA,EAAI,MAEjB,OAANT,EAAY,CACf,GAAIyY,MAAMzY,GAAM,OAAO,EACvBA,EAAIG,KAAK2D,IAAI,EAAG3D,KAAKyD,IAAI,IAAK5D,GAC/B,CACA,GAAU,OAANC,EAAY,CACf,GAAIwY,MAAMxY,GAAM,OAAO,EACvBA,EAAIE,KAAK2D,IAAI,EAAG3D,KAAKyD,IAAI,IAAK3D,GAC/B,CACA,GAAU,OAANC,EAAY,CACf,GAAIuY,MAAMvY,GAAM,OAAO,EACvBA,EAAIC,KAAK2D,IAAI,EAAG3D,KAAKyD,IAAI,IAAK1D,GAC/B,CACA,GAAU,OAANO,EAAY,CACf,GAAIgY,MAAMhY,GAAM,OAAO,EACvBhK,KAAKmX,SAASnN,EAAIhK,KAAKsT,kBACtB5J,KAAK2D,IAAI,EAAG3D,KAAKyD,IAAI,EAAGnN,KAAKuhB,KAAMvX,GAAIhK,KAAKshB,MAC5C,CACF,CAEA,IAAIW,EAAM7hB,EAAI8M,QACT,OAAJ3D,EAAWvJ,KAAKmX,SAAS5N,EAAIA,EACzB,OAAJC,EAAWxJ,KAAKmX,SAAS3N,EAAIA,EACzB,OAAJC,EAAWzJ,KAAKmX,SAAS1N,EAAIA,GAEf,OAAXwY,EAAI,KACPjiB,KAAKmX,SAAS7J,EAAI5D,KAAK2D,IAAI,EAAG3D,KAAKyD,IAAI,IAAK8U,EAAI,MAElC,IAAXA,EAAI,KACPjiB,KAAKmX,SAAS3J,EAAI9D,KAAK2D,IAAI,EAAGrN,KAAKkhB,KAAMxX,KAAKyD,IAAI,IAAKnN,KAAKmhB,KAAMc,EAAI,MAEvEjiB,KAAKmX,SAAS/J,EAAI1D,KAAK2D,IAAI,EAAGrN,KAAKohB,KAAM1X,KAAKyD,IAAI,IAAKnN,KAAKqhB,KAAMY,EAAI,KAGtE,IAAIjC,EAAM5f,EAAImN,QAAQvN,KAAKmX,SAAS7J,EAAGtN,KAAKmX,SAAS3J,EAAGxN,KAAKmX,SAAS/J,GAMtE,OALApN,KAAKmX,SAAS5N,EAAIyW,EAAI,GACtBhgB,KAAKmX,SAAS3N,EAAIwW,EAAI,GACtBhgB,KAAKmX,SAAS1N,EAAIuW,EAAI,GAEtBhgB,KAAKyhB,YAAYnI,IACV,CACR,EAKAtZ,KAAKkiB,QAAU,SAAU5U,EAAGE,EAAGJ,EAAGkM,GAEjC,OADAnX,QAAQC,KAAK,4DAA8DhC,EAAIiC,SACxErC,KAAKoX,SAAS9J,EAAGE,EAAGJ,EAAG,KAAMkM,EACrC,EAKAtZ,KAAKmiB,QAAU,SAAU5Y,EAAGC,EAAGC,EAAG6P,GAEjC,OADAnX,QAAQC,KAAK,4DAA8DhC,EAAIiC,SACxErC,KAAK8X,SAASvO,EAAGC,EAAGC,EAAG,KAAM6P,EACrC,EAGAtZ,KAAKoiB,WAAa,SAAU1f,EAAK4W,GAChC,IAAKtZ,KAAK6gB,UAA2B,KAAfne,EAAIH,OAIzB,OAFAvC,KAAKqiB,oBAAoB,MACzBriB,KAAKsiB,qBAAqB,KACnB,EAGR,IAAIzT,EAAQzO,EAAIuN,iBAAiBjL,GACjC,QAAKmM,IAG6B,QAA9B7O,KAAK8N,OAAOlM,gBACf5B,KAAK0X,WAAW7I,EAAMf,QACjB1N,EAAI2O,cAAc/O,KAAK2X,eAC3B9I,EAAMhB,KAAK,GAAK,IAGlB7N,KAAK8X,SACJjJ,EAAMhB,KAAK,GACXgB,EAAMhB,KAAK,GACXgB,EAAMhB,KAAK,GACXgB,EAAMhB,KAAK,GACXyL,IAEM,EACR,EAGAtZ,KAAKuiB,UAAY,SAAUnB,EAAMC,EAAMH,EAAMC,EAAMqB,EAAMC,EAAMnB,EAAMC,QACvD7f,IAAT0f,IAAsBA,EAAO,QACpB1f,IAAT2f,IAAsBA,EAAO,UACpB3f,IAATwf,IAAsBA,EAAO,QACpBxf,IAATyf,IAAsBA,EAAO,UACpBzf,IAAT8gB,IAAsBA,EAAO,QACpB9gB,IAAT+gB,IAAsBA,EAAO,UACpB/gB,IAAT4f,IAAsBA,EAAO,QACpB5f,IAAT6f,IAAsBA,EAAO,GAEjCvhB,KAAKoX,SACJoL,EAAO9Y,KAAKgE,MAAMhE,KAAK2W,UAAYoC,EAAOD,EAAO,IACjDtB,EAAOxX,KAAKgE,MAAMhE,KAAK2W,UAAYc,EAAOD,EAAO,IACjDE,EAAO1X,KAAKgE,MAAMhE,KAAK2W,UAAYgB,EAAOD,EAAO,KAC/C,IAAME,EAAQ5X,KAAKgE,MAAMhE,KAAK2W,UAAY,KAAOkB,EAAOD,GAAQ,KAAO,IAE3E,EAGAthB,KAAK4J,SAAW,SAAUkE,GAIzB,YAHepM,IAAXoM,IACHA,EAAS9N,KAAK2X,aAEP7J,EAAOlM,eACd,IAAK,MAAO,OAAO5B,KAAKigB,cACxB,IAAK,OAAQ,OAAOjgB,KAAK0iB,eACzB,IAAK,MAAO,OAAO1iB,KAAK2iB,cACxB,IAAK,OAAQ,OAAO3iB,KAAK4iB,eAE1B,OAAO,CACR,EAGA5iB,KAAKigB,YAAc,WAClB,OAAO7f,EAAIkJ,SACVtJ,KAAKmX,SAAS5N,EACdvJ,KAAKmX,SAAS3N,EACdxJ,KAAKmX,SAAS1N,EAEhB,EAGAzJ,KAAK0iB,aAAe,WACnB,OAAOtiB,EAAI2J,UACV/J,KAAKmX,SAAS5N,EACdvJ,KAAKmX,SAAS3N,EACdxJ,KAAKmX,SAAS1N,EACdzJ,KAAKmX,SAASnN,EAEhB,EAGAhK,KAAK2iB,YAAc,WAClB,OAAOviB,EAAI6J,SACVjK,KAAKmX,SAAS5N,EACdvJ,KAAKmX,SAAS3N,EACdxJ,KAAKmX,SAAS1N,EAEhB,EAGAzJ,KAAK4iB,aAAe,WACnB,OAAOxiB,EAAI8J,UACVlK,KAAKmX,SAAS5N,EACdvJ,KAAKmX,SAAS3N,EACdxJ,KAAKmX,SAAS1N,EACdzJ,KAAKmX,SAASnN,EAEhB,EAGAhK,KAAK6iB,YAAc,WAClB,MACC,KAAQ7iB,KAAKmX,SAAS5N,EACtB,KAAQvJ,KAAKmX,SAAS3N,EACtB,KAAQxJ,KAAKmX,SAAS1N,CAExB,EAGAzJ,KAAK8iB,SAAW,WACf,OAAO1iB,EAAIoP,sBAAsBxP,KAAK4iB,gBAAgB3T,MACvD,EAGAjP,KAAKye,UAAY,WAChB,OAAOze,KAAK8iB,WAAWrE,WACxB,EAGAze,KAAK+iB,aAAe,WACnB,OAAO3iB,EAAIO,IAAI8J,WAAWzK,KAAK4iB,eAChC,EAGA5iB,KAAKgjB,QAAU,WACd,OAAOhjB,KAAK6iB,cAAgB,KAC7B,EAGA7iB,KAAKgY,KAAO,WACPmI,MAmVJ/f,EAAImI,YAAYuR,EAAK3W,cAAe/C,EAAIO,IAAI8e,iBAC5Crf,EAAIkR,OAAOsB,KAAKgN,WAAWxb,YAAYhE,EAAIkR,OAAOsB,aAC3CxS,EAAIkR,OAAOC,MAlVnB,EAGAvR,KAAKqW,KAAO,WACXiE,GACD,EAGAta,KAAKwhB,OAAS,WACTrB,KACH7F,GAEF,EAGAta,KAAK2X,UAAY,WAChB,OAAO3X,KAAKijB,cACb,EAGAjjB,KAAK0X,WAAa,SAAU5J,GAC3B9N,KAAKijB,eAAiBnV,EAAOlM,aAC9B,EAGA5B,KAAKsT,gBAAkB,WACtB,MAA0B,SAAtBtT,KAAK4Z,aAEuB,QAA9B5Z,KAAK8N,OAAOlM,eACZxB,EAAI2O,cAAc/O,KAAK2X,mBACRjW,IAAf1B,KAAKogB,YACiB1e,IAAtB1B,KAAKygB,aAIAzgB,KAAK4Z,YACb,EAGA5Z,KAAKkjB,kBAAoB,SAAUxgB,GAC7B1C,KAAKoiB,WAAW1f,IAEpB1C,KAAKyhB,aAEP,EAGAzhB,KAAKmjB,kBAAoB,SAAUzgB,GAC7B1C,KAAKoX,SAAS,KAAM,KAAM,KAAM7I,WAAW7L,KAE/C1C,KAAKyhB,aAEP,EAGAzhB,KAAKyhB,YAAc,SAAUnI,GAC5B,IAAI8J,EAAWpjB,KAAK4J,WAChB0O,EAAMtY,KAAK2X,YAaf,GAVAvX,EAAI4F,YAAYhG,KAAKmD,cAAe,gBAAiBigB,GAE/C9J,EAAQlZ,EAAIkZ,MAAMC,aAAevZ,KAAKwgB,eAC/B,QAARlI,GAAyB,SAARA,IACftY,KAAK+gB,YAAaqC,EAAWA,EAASxhB,eACtC5B,KAAK8gB,OAAQsC,EAAWA,EAASrb,QAAQ,KAAM,MAErD/H,KAAKsiB,qBAAqBc,MAGrB9J,EAAQlZ,EAAIkZ,MAAME,aAAexZ,KAAKygB,aAAc,CACzD,IAAI4C,EAAW3Z,KAAKC,MAAwB,IAAlB3J,KAAKmX,SAASnN,GAAW,IACnDhK,KAAKsjB,qBAAqBD,EAC3B,CAEM/J,EAAQlZ,EAAIkZ,MAAMG,eAAiBzZ,KAAK0gB,kBAI5CtgB,EAAIiE,YAAYrE,KAAK0gB,iBACpBtgB,EAAIkE,SAAStE,KAAK0gB,kBAAoBtgB,EAAIqE,cAAczE,KAAK0gB,kBAEjD1gB,KAAK2Z,gBAGnB3Z,KAAKqiB,oBAAoBriB,KAAK4iB,iBAG3BzC,MACHb,IACAC,IACAC,IAEF,EAGAxf,KAAKqiB,oBAAsB,SAAUxT,GACpC,GAAK7O,KAAK0gB,eAAV,CAIA,IAAIxP,EAAW,KACX9B,EAAQ,MAEXhP,EAAIiE,YAAYrE,KAAK0gB,iBACpBtgB,EAAIkE,SAAStE,KAAK0gB,kBAAoBtgB,EAAIqE,cAAczE,KAAK0gB,mBAE9DxP,EAAWlR,KAAK2Z,gBAChBvK,EAAQpP,KAAK2gB,aAGd,IAAI4C,EAAc,GAElB,GAAK1U,EASE,CAEN0U,EAAYngB,KAAK,CAChBogB,MAAOpjB,EAAI6Q,wBACVpC,EACAqC,EACA9B,EAAQA,EAAQhP,EAAIO,IAAIkP,iBAAiBtO,OAAS,MAEnD2P,SAAU,WACVuS,KAAM,OACNC,OAAQxS,EAAW,WAAa,SAChCyS,OAAQ,gBAIT,IAAIC,EAAUxjB,EAAIoP,sBACjB,gBACA0B,EAAW,CAAC,KAAO,QAAS,MAAQ,QAAQA,GAAY,KACxD9B,GACA,GAEDmU,EAAYngB,KAAK,CAChBogB,MAAO,QAAWI,EAAQ3U,OAAOwP,YAAc,KAC/CvN,UAAWA,GAAY,QAAU,OACjCuS,KAAMG,EAAQxU,MAAQ,MAAQwU,EAAQvU,OAAS,KAC/CqU,OAAQxS,EAAW,WAAa,SAChCyS,OAAQ,eAEV,MAnCCJ,EAAYngB,KAAK,CAChBogB,MAAO,OACPtS,SAAU,WACVuS,KAAM,OACNC,OAAQ,YACRC,OAAQ,gBAuCV,IAPA,IAAIE,EAAK,CACRL,MAAO,GACPtS,SAAU,GACVuS,KAAM,GACNC,OAAQ,GACRC,OAAQ,IAEAriB,EAAI,EAAGA,EAAIiiB,EAAYhiB,OAAQD,GAAK,EAC5CuiB,EAAGL,MAAMpgB,KAAKmgB,EAAYjiB,GAAGkiB,OAC7BK,EAAG3S,SAAS9N,KAAKmgB,EAAYjiB,GAAG4P,UAChC2S,EAAGJ,KAAKrgB,KAAKmgB,EAAYjiB,GAAGmiB,MAC5BI,EAAGH,OAAOtgB,KAAKmgB,EAAYjiB,GAAGoiB,QAC9BG,EAAGF,OAAOvgB,KAAKmgB,EAAYjiB,GAAGqiB,QAI/B,IAAIG,EAAM,CACT,mBAAoBD,EAAGL,MAAM3Y,KAAK,MAClC,sBAAuBgZ,EAAG3S,SAASrG,KAAK,MACxC,kBAAmBgZ,EAAGJ,KAAK5Y,KAAK,MAChC,oBAAqBgZ,EAAGH,OAAO7Y,KAAK,MACpC,oBAAqBgZ,EAAGF,OAAO9Y,KAAK,OAErCzK,EAAIyI,SAAS7I,KAAK0gB,eAAgBoD,EAAK9jB,KAAKghB,YAI5C,IAAIvN,EAAU,CACblI,KAAM,KACNwY,MAAO,MAEJ7S,IACHuC,EAAQvC,GAAalR,KAAK2gB,YAAc3gB,KAAK4gB,eAAkB,MAG5DkD,EAAM,CACT,eAAgBrQ,EAAQlI,KACxB,gBAAiBkI,EAAQsQ,OAE1B3jB,EAAIyI,SAAS7I,KAAK0gB,eAAgBoD,EAAK9jB,KAAKghB,YAAY,EA5FxD,CA6FD,EAGAhhB,KAAKsiB,qBAAuB,SAAU5f,GACjC1C,KAAKwgB,eACgC,UAApCpgB,EAAI6D,SAASjE,KAAKwgB,cACrBxgB,KAAKwgB,aAAa9b,MAAQhC,EAE1B1C,KAAKwgB,aAAavC,UAAYvb,EAGjC,EAGA1C,KAAKsjB,qBAAuB,SAAU5gB,GACjC1C,KAAKygB,eACgC,UAApCrgB,EAAI6D,SAASjE,KAAKygB,cACrBzgB,KAAKygB,aAAa/b,MAAQhC,EAE1B1C,KAAKygB,aAAaxC,UAAYvb,EAGjC,EAGA1C,KAAKua,4BAA8B,WAClC,IAAIva,KAAKgkB,yBAAT,CACAhkB,KAAKgkB,0BAA2B,EAEhC,IAAI7jB,EAAMH,KAAKmD,cACf,EAAG,CAGF,IAAI8gB,EAAY7jB,EAAIsI,aAAavI,GAC7B8jB,EAAU/S,UAAiD,UAArC+S,EAAU/S,SAAStP,gBAC5C5B,KAAK2R,OAAQ,GAGVxR,IAAQH,KAAKmD,gBAMX/C,EAAIuF,QAAQxF,EAAK,uBACrBA,EAAIO,iBAAiB,SAAUN,EAAI6V,gBAAgB,GACnD7V,EAAIqD,QAAQtD,EAAK,qBAAqB,IAGzC,QAAUA,EAAMA,EAAIyf,aAAqC,SAAtBxf,EAAI6D,SAAS9D,GAvBH,CAwB9C,EAGAH,KAAK8V,QAAU,WACV9V,KAAKihB,aACRjhB,KAAKgY,MAEP,EAGAhY,KAAKkkB,aAAe,SAAUpgB,GAC7B9D,KAAKmU,QAAUrQ,EACf9D,KAAKyU,SAAWrU,EAAIoO,kBAAkB1K,GACtC9D,KAAK6X,wBAA0BzX,EAAI0O,wBAAwB9O,KAAKyU,SACjE,EAsqBIrU,EAAIO,IAAIwjB,QAEX,IAAK,IAAIxC,KAAOvhB,EAAIO,IAAIwjB,QACvB,GAAI/jB,EAAIO,IAAIwjB,QAAQ5e,eAAeoc,GAClC,IACC5H,EAAU4H,EAAKvhB,EAAIO,IAAIwjB,QAAQxC,GAGhC,CAFE,MAAOlf,GACRN,QAAQC,KAAKK,EACd,CAQH,IAAI2hB,EAAa,GAEb9hB,EAAK+hB,SACmB,iBAAhB/hB,EAAK+hB,OACfD,EAAa9hB,EAAK+hB,OAAOrc,MAAM,OACrB2C,MAAMgE,QAAQrM,EAAK+hB,QAC7BD,EAAa9hB,EAAK+hB,OAAOC,QAEzBniB,QAAQC,KAAK,+BAKwB,IAAnCgiB,EAAW5f,QAAQ,YACtB4f,EAAWhhB,KAAK,WAKjB,IAAK,IAAI9B,EAAI8iB,EAAW7iB,OAAS,EAAGD,GAAK,EAAGA,GAAK,EAAG,CACnD,IAAIijB,EAAOH,EAAW9iB,GACtB,GAAKijB,EAGL,GAAKnkB,EAAIO,IAAI6jB,QAAQjf,eAAegf,IAIpC,IAAK,IAAI5C,KAAOvhB,EAAIO,IAAI6jB,QAAQD,GAC/B,GAAInkB,EAAIO,IAAI6jB,QAAQD,GAAMhf,eAAeoc,GACxC,IACC5H,EAAU4H,EAAKvhB,EAAIO,IAAI6jB,QAAQD,GAAM5C,GAGtC,CAFE,MAAOlf,GACRN,QAAQC,KAAKK,EACd,OATDN,QAAQC,KAAK,qBAAsBmiB,EAYrC,CAIA,IAAIE,EAAgB,CAEnB,UAED,IAAK,IAAI9C,KAAOrf,EACf,GAAIA,EAAKiD,eAAeoc,KACa,IAAhC8C,EAAcjgB,QAAQmd,GACzB,IACC5H,EAAU4H,EAAKrf,EAAKqf,GAGrB,CAFE,MAAOlf,GACRN,QAAQC,KAAKK,EACd,CAmBH,QAPuBf,IAAnB1B,KAAK0f,UACR1f,KAAK0f,UAAY3f,EAAOH,SAAS+f,KAGjC3f,KAAK0f,UAAYtf,EAAIY,KAAKhB,KAAK0f,YAG3B1f,KAAK0f,UACT,MAAM,IAAI5f,MAAM,+DAOjB,GAFAE,KAAKmD,cAAgB/C,EAAIY,KAAKmC,IAEzBnD,KAAKmD,cAAe,CAExB,GAA6B,iBAAlBA,GAA8B,qBAAqBuhB,KAAKvhB,GAGlE,MAAM,IAAIrD,MAAM,OADCqD,EACsB,2CADtBA,EACkF,gCAGpG,MAAM,IAAIrD,MAAM,2DACjB,CAEA,GAAIE,KAAKmD,cAAc9C,SAAWL,KAAKmD,cAAc9C,mBAAmBD,EAAIO,IAC3E,MAAM,IAAIb,MAAM,kDAajB,GARAE,KAAKmD,cAAc9C,QAAUL,KAC7BI,EAAIgI,SAASpI,KAAKmD,cAAe/C,EAAIO,IAAIoB,WAGzC3B,EAAIG,UAAU6C,KAAKpD,MAIfI,EAAIkE,SAAStE,KAAKmD,iBAEyB,WAA1CnD,KAAKmD,cAAcxB,KAAKC,gBAG3B5B,KAAKmD,cAAcxB,KAAO,UAGvBvB,EAAIqE,cAAczE,KAAKmD,gBAAgB,CAK1C/C,EAAI8D,eAAelE,KAAKmD,eAGxBnD,KAAKmD,cAAckZ,YAAYtc,EAAOH,SAASwf,eAAe,MAG9D,IAAI6E,EAAY7jB,EAAIsI,aAAa1I,KAAKmD,gBACnBoL,WAAW0V,EAAU,eAAiB,GACtCjkB,KAAK2gB,aACvBvgB,EAAIyI,SAAS7I,KAAKmD,cAAe,CAChC,YAAanD,KAAK2gB,YAAc,MAC9B3gB,KAAKghB,WAEV,CAoCD,QAhC0Btf,IAAtB1B,KAAKwgB,aACJpgB,EAAIiE,YAAYrE,KAAKmD,iBAExBnD,KAAKwgB,aAAexgB,KAAKmD,eAKM,OAAtBnD,KAAKwgB,eAIfxgB,KAAKwgB,aAAepgB,EAAIY,KAAKhB,KAAKwgB,eAI/BxgB,KAAKygB,eACRzgB,KAAKygB,aAAergB,EAAIY,KAAKhB,KAAKygB,oBAIP/e,IAAxB1B,KAAK0gB,eACR1gB,KAAK0gB,eAAiB1gB,KAAKmD,cAEO,OAAxBnD,KAAK0gB,iBAIf1gB,KAAK0gB,eAAiBtgB,EAAIY,KAAKhB,KAAK0gB,iBAIjC1gB,KAAKwgB,cAAgBpgB,EAAIiE,YAAYrE,KAAKwgB,cAAe,CAI5D,IAAImE,EAAyB,CAC5BpE,QAASvgB,KAAKwgB,aAAaoE,SAE5B5kB,KAAKwgB,aAAaoE,QAAU,KAE5B5kB,KAAKwgB,aAAa9f,iBAAiB,WA3RpC,SAAyB0G,GACC,UAArBhH,EAAIsH,SAASN,KACZ0S,EAAK0G,cACR1G,EAAKoJ,kBAAkBpJ,EAAK0G,aAAa9b,OAE1CoV,EAAKhE,UAEP,IAoR+D,GAC9D9V,KAAKwgB,aAAa9f,iBAAiB,UAxQpC,SAAwB0G,GACvB,IAAIhH,EAAIuF,QAAQyB,EAAI,YAApB,CAIA,IAAIyd,EAAS/K,EAAK0G,aAAa9b,MAE/BoV,EAAKoJ,kBAAkBpJ,EAAK0G,aAAa9b,OAEzCtE,EAAI8U,gBAAgB4E,EAAM,YAEtBA,EAAK0G,aAAa9b,QAAUmgB,GAE/BzkB,EAAIqH,kBAAkBqS,EAAK0G,aAAc,UAAU,GAAM,EAV1D,CAYD,IAyP6D,GAC5DxgB,KAAKwgB,aAAa9f,iBAAiB,SAlOpC,SAAuB0G,GAClBhH,EAAIuF,QAAQyB,EAAI,cAIhB0S,EAAK0G,cACR1G,EAAKsI,WAAWtI,EAAK0G,aAAa9b,MAAOtE,EAAIkZ,MAAMC,YAGpDnZ,EAAI8U,gBAAgB4E,EAAM,WAI3B,IAqN2D,GAEtD6K,EAAuBpE,SAC1BvgB,KAAKwgB,aAAa9f,iBAAiB,QAASikB,EAAuBpE,SAAS,GAG7EvgB,KAAKwgB,aAAatb,aAAa,eAAgB,OAC/ClF,KAAKwgB,aAAatb,aAAa,cAAe,OAC9ClF,KAAKwgB,aAAatb,aAAa,iBAAkB,OACjDlF,KAAKwgB,aAAatb,aAAa,cAAc,EAC9C,CAGIlF,KAAKygB,cAAgBrgB,EAAIiE,YAAYrE,KAAKygB,gBAC7CzgB,KAAKygB,aAAa/f,iBAAiB,WAjSpC,SAAyB0G,GACC,UAArBhH,EAAIsH,SAASN,KACZ0S,EAAK2G,cACR3G,EAAKqJ,kBAAkBrJ,EAAK2G,aAAa/b,OAE1CoV,EAAKhE,UAEP,IA0R+D,GAC9D9V,KAAKygB,aAAa/f,iBAAiB,UAtQpC,SAAwB0G,GACvB,IAAIhH,EAAIuF,QAAQyB,EAAI,YAApB,CAIA,IAAIyd,EAAS/K,EAAK2G,aAAa/b,MAE/BoV,EAAKqJ,kBAAkBrJ,EAAK2G,aAAa/b,OAEzCtE,EAAI8U,gBAAgB4E,EAAM,YAG1B1Z,EAAIqH,kBAAkBqS,EAAK0G,aAAc,UAAU,GAAM,GAErD1G,EAAK2G,aAAa/b,QAAUmgB,GAE/BzkB,EAAIqH,kBAAkBqS,EAAK2G,aAAc,UAAU,GAAM,EAb1D,CAeD,IAoP6D,GAC5DzgB,KAAKygB,aAAa/f,iBAAiB,SAlOpC,SAAuB0G,GAClBhH,EAAIuF,QAAQyB,EAAI,cAIhB0S,EAAK2G,cACR3G,EAAK1C,SAAS,KAAM,KAAM,KAAM7I,WAAWuL,EAAK2G,aAAa/b,OAAQtE,EAAIkZ,MAAME,YAGhFpZ,EAAI8U,gBAAgB4E,EAAM,WAG1B1Z,EAAIqH,kBAAkBqS,EAAK0G,aAAc,SAAS,GAAM,GACzD,IAqN2D,GAE1DxgB,KAAKygB,aAAavb,aAAa,eAAgB,OAC/ClF,KAAKygB,aAAavb,aAAa,cAAe,OAC9ClF,KAAKygB,aAAavb,aAAa,iBAAkB,OACjDlF,KAAKygB,aAAavb,aAAa,cAAc,IAK9C,IAAI4f,EAAY,cAEGpjB,IAAf1B,KAAK0E,MACRogB,EAAY9kB,KAAK0E,MACP1E,KAAKwgB,mBAA4C9e,IAA5B1B,KAAKwgB,aAAa9b,QACjDogB,EAAY9kB,KAAKwgB,aAAa9b,OAK/B,IAAIqgB,OAAYrjB,EAYhB,QAVmBA,IAAf1B,KAAKogB,MACR2E,EAAa,GAAG/kB,KAAKogB,MACXpgB,KAAKygB,mBAA4C/e,IAA5B1B,KAAKygB,aAAa/b,QACjDqgB,EAAY/kB,KAAKygB,aAAa/b,OAK/B1E,KAAKijB,eAAiB,KAElB,CAAC,OAAQ,OAAOze,QAAQxE,KAAK8N,OAAOlM,gBAAkB,EAAG,CAE5D,IAAIiN,EAAQzO,EAAIuN,iBAAiBmX,GACjC9kB,KAAKijB,eAAiBpU,EAAQA,EAAMf,OAAS,KAC9C,MAEC9N,KAAKijB,eAAiBjjB,KAAK8N,OAAOlM,cAKnC5B,KAAKkjB,kBAAkB4B,QAOLpjB,IAAdqjB,GACH/kB,KAAKmjB,kBAAkB4B,GAGpB/kB,KAAKqgB,QAERrgB,KAAKuiB,UAAUnR,MAAMpR,KAAM2K,MAAMgE,QAAQ3O,KAAKqgB,QAAUrgB,KAAKqgB,OAAS,GAGxE,GAeDjgB,EAAIO,IAAIoB,UAAY,UAIpB3B,EAAIO,IAAI8e,gBAAkB,iBAK1Brf,EAAIO,IAAImC,WAAY,EAIpB1C,EAAIO,IAAI6jB,QAAU,CAAC,EAGnBpkB,EAAIO,IAAI6jB,QAAiB,QAAI,CAAC,EAE9BpkB,EAAIO,IAAI6jB,QAAe,MAAI,CAC1BlH,gBAAiB,sBACjBE,mBAAoB,sBACpBuB,YAAa,iBAEd3e,EAAIO,IAAI6jB,QAAc,KAAI,CACzBlH,gBAAiB,mBACjBE,mBAAoB,sBACpBuB,YAAa,uBAGd3e,EAAIO,IAAI6jB,QAAe,MAAI,CAAEpV,MAAM,IAAKC,OAAO,IAAKoE,QAAQ,GAAIL,WAAW,GAAIsB,YAAY,GAC3FtU,EAAIO,IAAI6jB,QAAgB,OAAI,CAAEpV,MAAM,IAAKC,OAAO,IAAKoE,QAAQ,GAAIL,WAAW,GAAIsB,YAAY,IAC5FtU,EAAIO,IAAI6jB,QAAe,MAAI,CAAEpV,MAAM,IAAKC,OAAO,IAAKoE,QAAQ,GAAIL,WAAW,GAAIsB,YAAY,IAE3FtU,EAAIO,IAAI6jB,QAAc,KAAI,CAAEtQ,YAAY,EAAGjB,mBAAmB,EAAG6B,mBAAmB,GACpF1U,EAAIO,IAAI6jB,QAAe,MAAI,CAAEtQ,YAAY,EAAGjB,mBAAmB,EAAG6B,mBAAmB,GAIrF1U,EAAIO,IAAIqd,iBAAmB,EAG3B5d,EAAIO,IAAIoP,eAAiB,EACzB3P,EAAIO,IAAIsP,iBAAmB,UAC3B7P,EAAIO,IAAIwP,iBAAmB,UAG3B/P,EAAIO,IAAIkP,iBAAmB,CAAC,wBAAyB,yBAIrDzP,EAAIO,IAAIC,KAAO,WACd,IAAIR,EAAIE,YAgBR,IAXAP,EAAOH,SAASc,iBAAiB,YAAaN,EAAI8V,qBAAqB,GACvEnW,EAAOH,SAASc,iBAAiB,QAASN,EAAIyV,iBAAiB,GAC/D9V,EAAOW,iBAAiB,SAAUN,EAAI2V,gBAAgB,GACtDhW,EAAOW,iBAAiB,SAAUN,EAAI4V,gBAAgB,GAGtD5V,EAAIO,IAAIqkB,UAER5kB,EAAIE,aAAc,EAGXF,EAAII,WAAWe,QACVnB,EAAII,WAAWykB,OAC1B5e,EAEF,EAIAjG,EAAIO,IAAIqkB,QAAU,SAAUjkB,GAC3B,IAAI2gB,GAAU,EAEd,IACCthB,EAAIS,kBAAkB,iBAAkBE,EAIzC,CAHE,MAAO0B,GACRif,GAAU,EACVvf,QAAQC,KAAKK,EACd,CAGA,GAAIrC,EAAIO,IAAIU,YACX,IACCjB,EAAIS,kBAEF,SAAWT,EAAIO,IAAIU,YAAnB,YACYjB,EAAIO,IAAIU,YAErBN,EAEW,CAAX,MAAO0B,GAAI,CAGd,OAAOif,CACR,EAKAthB,EAAIO,IAAIukB,MAAQ,SAAU7e,GACzB,MAAoB,mBAATA,GACVlE,QAAQC,KAAK,mCACN,IAGJhC,EAAIE,YACP+F,IAEAjG,EAAII,WAAW4C,KAAKiD,IAEd,EACR,EAQAjG,EAAIO,IAAI4U,QAAU,SAAUD,GAC3B,IAAI6P,EAAa,WAChB/kB,EAAIiV,cAAcC,EACnB,EAEIlV,EAAIE,YACP6kB,IAEA/kB,EAAIO,IAAIukB,MAAMC,EAEhB,EAIA/kB,EAAIO,IAAIqX,KAAO,WACV5X,EAAIkR,QAAUlR,EAAIkR,OAAOC,OAC5BnR,EAAIkR,OAAOC,MAAMyG,MAEnB,EAIA5X,EAAIO,IAAIud,WAAa,SAAUrP,GAK9B,OAJKA,IACJA,EAAQ,iBAEKzO,EAAIoP,sBAAsBX,GACzBI,OAAOwP,WACvB,EAIAre,EAAIO,IAAI8J,WAAa,SAAUoE,GAC9B,IAAI0U,EAAc,GAGlBA,EAAYngB,KAAKhD,EAAI6Q,wBAAwBpC,IAG7C,IAAI+U,EAAUxjB,EAAIoP,wBAOlB,OANA+T,EAAYngB,KAAK,CAChB,QAAWwgB,EAAQ3U,OAAOwP,YAAc,KACxC,WACA,UACC5T,KAAK,MAEA0Y,EAAY1Y,KAAK,KACzB,EAWAzK,EAAIO,IAAIwjB,QAAU,CAAC,EAUnB/jB,EAAIO,IAAIU,YAAc,UAMtBjB,EAAIO,IAAIykB,mBAAqB,WAE5B,OADAjjB,QAAQiT,MAAM,qGAAuGhV,EAAIiC,UAClH,CACR,EAGAjC,EAAIK,WAGGL,EAAIO,KAaX,YAP8B,IAAnBZ,EAAOM,UACjBN,EAAOM,QAAUN,EAAOslB,QAAUhlB,GAM5BA,CAEP,MC19GIilB,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqB9jB,IAAjB+jB,EACH,OAAOA,EAAa9lB,QAGrB,IAAID,EAAS4lB,EAAyBE,GAAY,CAGjD7lB,QAAS,CAAC,GAOX,OAHA+lB,EAAoBF,GAAU1a,KAAKpL,EAAOC,QAASD,EAAQA,EAAOC,QAAS4lB,GAGpE7lB,EAAOC,OACf,CCrBA4lB,EAAoBhhB,EAAK7E,IACxB,IAAI2a,EAAS3a,GAAUA,EAAOimB,WAC7B,IAAOjmB,EAAiB,QACxB,IAAM,EAEP,OADA6lB,EAAoBK,EAAEvL,EAAQ,CAAErQ,EAAGqQ,IAC5BA,CAAM,ECLdkL,EAAoBK,EAAI,CAACjmB,EAASkmB,KACjC,IAAI,IAAIC,KAAOD,EACXN,EAAoBQ,EAAEF,EAAYC,KAASP,EAAoBQ,EAAEpmB,EAASmmB,IAC5EhhB,OAAOC,eAAepF,EAASmmB,EAAK,CAAEE,YAAY,EAAMhhB,IAAK6gB,EAAWC,IAE1E,ECNDP,EAAoBQ,EAAI,CAAC3gB,EAAKI,IAAUV,OAAO8F,UAAUrF,eAAeuF,KAAK1F,EAAKI,sBCCnE,MAAMygB,EACnBC,YAAYC,EAAcxkB,EAAMykB,GAC9BpmB,KAAKmmB,aAAeA,EACpBnmB,KAAK2B,KAAOA,EACZ3B,KAAKomB,MAAQA,CACf,ECFa,SAASC,EAAoBC,EAASnC,GACnDoC,KAAKC,YAAYzkB,UAAY,SAC7BwkB,KAAKE,QAAQxI,UAAY,GAAGqI,iCAC5BxhB,OAAO6C,KAAKwc,GAASuC,SAASplB,IAC5B,MAAM0Y,EAASpa,SAAS4D,cAAc,KACtCwW,EAAO2M,GAAK,eAAerlB,IAC3B0Y,EAAOjY,UAAY,SACnBiY,EAAO4M,QAAU,WACfC,UAAU,gBACV1C,EAAQ7iB,GAAG,IACb,EACA0Y,EAAOrV,YAAcwf,EAAQ7iB,GAAG,GAChCilB,KAAKE,QAAQK,SAAS,GAAGzK,YAAYrC,EAAO,IAE9CuM,KAAKQ,cAAc3d,MAAM2U,QAAU,QACnCwI,KAAKS,QAAQ5d,MAAM2U,QAAU,QAC7BwI,KAAKE,QAAQQ,QACbV,KAAKW,SAAW,EAChBX,KAAKY,cACP,CCde,SAASC,EAAYC,EAASpS,EAAMqS,EAAYC,IAGmB,IAA5EhB,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,IAAqBC,IACxE,IAATtS,IACqD,IAArDlV,OAAO6nB,2BAA2BC,gBAC3B,IAAT5S,GAEA7C,EAAE,iBAAiBhJ,MAAMkU,gBACvBiJ,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAAS,SAASL,KACvElV,EAAE,iBAAiBhJ,MAAMmU,QAAU,MACtB,IAATtI,GACF7C,EAAE,iBAAiBhJ,MAAM2U,QAAU,SACnC+J,YAAW,KACTV,EAAYC,EAAS,EAAGC,GAAY,EAAK,GACxC,IAAOf,KAAKwB,MAEfD,YAAW,KACTV,EAAYC,EAAS,EAAGC,GAAY,EAAK,GACxC,IAAOf,KAAKwB,MAEC,IAAT9S,GACT7C,EAAE,iBAAiBhJ,MAAMmU,QAAU,IACnCuK,YAAW,KACTV,EAAYC,EAAS,EAAGC,GAAY,EAAK,GACxC,IAAOf,KAAKwB,MACG,IAAT9S,IAAY7C,EAAE,iBAAiBhJ,MAAM2U,QAAU,OAC5D,CChCe,SAASiK,IACtBljB,OAAO6C,KAAK4e,KAAKiB,KAAKC,uBAAuBC,UAAUhB,SAASW,IAC9D,MAAMY,EAAgBtlB,KAAKulB,UAAU3B,KAAKiB,KAAKC,uBAAuBC,SAASL,IAEzEc,EAA0BC,YAC9BC,SAASC,aAAaC,QAAQ,sBAAsBvgB,MAAM,SAAS,IAE/DwgB,EAAU,IAAIpnB,OAAO,GAAGimB,YACxBoB,EAAUN,EAAwBnmB,MAAMwmB,GAC9C,GAAgB,OAAZC,EAAkB,CACpB,MAAMC,EAAgBP,EAAwBpgB,QAC5C0gB,EAAQ,GACR,GAAGpB,KAAWY,KAEhBK,aAAaK,QAAQ,oBAAqBC,OAAO,GAAGC,YAAYH,WAClE,IAEJ,CCde,SAASI,EAAazB,EAAS0B,QAEwC,IAA3ExC,KAAKiB,KAAKC,uBAAuBC,SAASL,GAAS2B,QAAQD,KAElExC,KAAKiB,KAAKC,uBAAuBC,SAASL,GAAS2B,QAAQD,GAAc,GAGpE,IADCxC,KAAKiB,KAAKC,uBAAuBC,SAASL,GAAS2B,QAAQD,GAE/DxC,KAAKiB,KAAKC,uBAAuBC,SAASL,GAAS2B,QAAQD,GAAc,EAGzExC,KAAKiB,KAAKC,uBAAuBC,SAASL,GAAS2B,QAAQD,GAAc,EAG7Ef,GACF,uBCde,SAASiB,EAAY5B,EAAS6B,EAAKC,EAAWC,EAAW7B,GACtE,IAC8E,IAA3EhB,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASwB,IAAoB5B,KAC5B,IAArDxnB,OAAO6nB,2BAA2BC,eAClC,CAEA,MAAMwB,EAAQ,IAAIC,MAAMJ,GACpB3C,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAAS4B,aAC9DF,EAAMG,OACHjD,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASyB,GAAa,KACzE7C,KAAKiD,OAAS,KAEjBH,EAAMG,OAASjD,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASyB,GAAa,IAC1FC,EAAMI,MACR,CACF,CCfe,SAASC,EAAmBrC,EAASC,GACP,OAAvClV,EAAE,SAASiV,IAAUC,OACvBlV,EAAE,SAASiV,IAAUC,UAAmBrJ,UAAY,GAClD7L,EAAE,SAASiV,IAAUC,KAAc5iB,SAErC6hB,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,GAAc5d,KAAKC,MAC7EyI,EAAE,SAASiV,IAAUC,KAAc5iB,QAGvCsjB,GACF,CCXe,SAAS2B,EAAQC,EAAGC,GAEjCA,EAASC,aAEW,QAAhBvD,KAAKwD,OCNI,WACb,MAAMC,EAAO5X,EAAE,QAAQ0U,SAAS,GAGhC,GAFAkD,EAAKC,aCDQ,WACb,MAAMC,EAAmBtqB,SAAS4D,cAAc,OAChD0mB,EAAiBnoB,UAAY,aAC7BmoB,EAAiBvD,GAAK,oCAEtB,MAAMwD,EAAWvqB,SAAS4D,cAAc,OACxC2mB,EAASpoB,UAAY,QACrBooB,EAASlM,UAAY,4BAErB,MAAMmM,EAAaxqB,SAAS4D,cAAc,QAuB1C,GAtBA4mB,EAAWhhB,MAAMqU,OAAS,UAC1B2M,EAAWhhB,MAAM2U,QAAU,eAC3BqM,EAAWhhB,MAAMiG,OAAS,OAC1B+a,EAAWhhB,MAAMgG,MAAQ,OACzBgb,EAAWhhB,MAAM4T,aAAe,MAChCoN,EAAWhhB,MAAM6V,UAAY,SAC7BmL,EAAWhhB,MAAMkU,gBAAkB,UACnC8M,EAAWhhB,MAAMyF,MAAQ,QACzBub,EAAWhhB,MAAMihB,SAAW,OAC5BD,EAAWhhB,MAAMkhB,cAAgB,SACjCF,EAAWzlB,YAAc4hB,KAAKiB,KAAKC,uBAAuBC,SAASD,uBAAuBuB,QACvFuB,SACC,IACA,IACJH,EAAWxD,QAAU,WACnBkC,EAAa,yBAA0B,YACvCvC,KAAKiE,YACP,EACAL,EAAS9N,YAAY+N,GAErBF,EAAiB7N,YAAY8N,GAEzB5D,KAAKiB,KAAKC,uBAAuBC,SAASD,uBAAuBuB,QAAQuB,SAAU,CACrF,MAAME,EAAiB7qB,SAAS4D,cAAc,OAC9CinB,EAAe1oB,UAAY,UAC3B0oB,EAAexM,UCtCI,gZDuCnBiM,EAAiB7N,YAAYoO,EAC/B,CAEA,OAAOP,CACT,CDvCoBQ,GAAkCV,EAAKlD,SAAS,IAE9DP,KAAKiB,KAAKC,uBAAuBC,SAASD,uBAAuBuB,QAAQuB,SAAU,CACrF,MAAMI,EAAYpE,KAAKiB,KAAKC,uBAAuBkD,UAAUJ,SAC7D,IAAK,IAAIjpB,EAAI,EAAGA,EAAIqpB,EAAUppB,OAAQD,IACpC8Q,EAAE,qCAAqCiK,YAAYsO,EAAUrpB,KAEjE,CACF,CDHIspB,GACSrE,KAAKwD,OAMhBF,EAASgB,QAAQjrB,SAASkrB,eAAe,QAAS,CAChDC,YAAY,EACZC,WAAW,EACXC,SAAS,GAEb,CIrBe,SAASC,IAAY,CCFpC,MACA,EADgB,CAAEX,SAAU,EAAGY,YAAa,GCU7B,SAASC,EAAQ/D,EAASK,EAAU2D,EAAcC,EAAaC,GAC5E,MAAMC,EAAiB7oB,KAAKC,MAAM8kB,GAClCnB,KAAKiB,KAAKC,uBAAuBC,SAASL,GCP7B,SAA8BK,EAAU2D,EAAcC,GACnE,MAAMG,EAAc,CAAC,EAGfC,EAAiB,CAAC,EACxB5mB,OAAO6C,KAAK0jB,GAAc3E,SAASplB,SACA,IAAtBomB,EAASC,eAA4D,IAAzBD,EAASC,SAASrmB,GACvEoqB,EAAepqB,GAAK+pB,EAAa/pB,GAAG6kB,aAEpCuF,EAAepqB,GAAKomB,EAASC,SAASrmB,EACxC,IAEFmqB,EAAY9D,SAAW+D,EAGvB,MAAMC,EAAgB,CAAC,EAmBvB,OAlBA7mB,OAAO6C,KAAK2jB,GAAa5E,SAASplB,SACA,IAArBomB,EAASsB,cAA0D,IAAxBtB,EAASsB,QAAQ1nB,GACrEqqB,EAAcrqB,GAAKgqB,EAAYhqB,GAE/BqqB,EAAcrqB,GAAKomB,EAASsB,QAAQ1nB,EACtC,IAEFmqB,EAAYzC,QAAU2C,EAEtB7mB,OAAO6C,KAAK+f,GAAUhB,SAASZ,IACjB,aAARA,GAA8B,YAARA,IACxB2F,EAAY3F,GAAO4B,EAAS5B,GAC9B,SAG2C,IAAlC2F,EAAYG,oBACrBH,EAAYG,kBAAoB,IAE3BH,CACT,CD5BuDI,CACnDL,EACAH,EACAC,GAEFtD,IACAuD,IACAzmB,OAAO6C,KAAK4e,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,UAAUjB,SAASplB,SAC5C,IAAzB+pB,EAAa/pB,GAAG+E,MACzBglB,EAAa/pB,GAAG+E,MAClB,IAEFkgB,KAAKiE,YACP,CEvBe,SAASe,IAAa,CCFrC,MACA,EADiB,CAAC,ECSH,SAASO,EAAKppB,GAC3B0oB,EAAQ,yBAA0B1oB,EAAK,EAAU,EAAS6oB,EAC5D,CCPA,MAWA,EAX+B,CAC7B3qB,KCKa,WAEbb,OAAO6nB,2BAA6B,CAAEC,gBAAgB,GAGrC,IAAIkE,iBAAiBpC,GAC7BkB,QAAQjrB,SAASkrB,eAAe,QAAS,CAChDC,YAAY,EACZC,WAAW,EACXC,SAAS,ICjBE,WACb,MAAMe,EAAcpsB,SAAS4D,cAAc,OAC3CwoB,EAAYrF,GAAK,gBACjBqF,EAAY5iB,MAAMgG,MAAQ,OAC1B4c,EAAY5iB,MAAMiG,OAAS,OAC3B2c,EAAY5iB,MAAMkU,gBAAkB,QACpC0O,EAAY5iB,MAAM2U,QAAU,OAC5BiO,EAAY5iB,MAAM+T,OAAS,aAC3B6O,EAAY5iB,MAAM8H,SAAW,WAC7B8a,EAAY5iB,MAAM6iB,cAAgB,OAClC7Z,EAAE,WAAWiK,YAAY2P,EAC3B,CDUEE,GAGA3F,KAAK4F,aAAa,OAAQjB,QAG6B,IAA5C3E,KAAKkF,YAAYhE,wBAC1BqE,EAAK,MAEP/rB,OAAO6nB,2BAA2BC,gBAAiB,CACrD,ED3BEiE,KAAI,EACJM,KGFa,WACb,OAAOzpB,KAAKulB,UAAU3B,KAAKiB,KAAKC,uBAAuBC,SAASD,uBAClE,EHCEkD,UAAW,CACTJ,SAAU,GACVY,YAAa,IAEfzD,SAAU,CAAED,uBAAwB,CAAEuB,QAAS,CAAC,EAAGrB,SAAU,CAAC,KIMnD0E,EChBE,WAC6B,oBAA/BzE,4BACTrB,KAAK+F,YAAY,yBAA0B,EAE/C,EDYaD,EEhBE,SAAqBhF,GAClCd,KAAKiB,KAAKC,uBAAuBC,SAASL,GAAW,CACnDuE,kBAAmB,GACnB5C,QAAS,CAAC,EACVrB,SAAU,CAAC,EAEf,EFca4E,EACD,CACRC,kBGpBW,SAA2BC,GACxC,MAAMC,EAAa9sB,SAAS4D,cAAc,OAG1C,OAFAkpB,EAAW3qB,UAAY,UACvB2qB,EAAWzO,UAAYwO,EAChBC,CACT,EHgBIC,qBINW,SACbtF,EACAC,EACA+D,EACAuB,EACAC,GAEA,MAAMC,EAAMltB,SAAS4D,cAAc,OAanC,GAZAspB,EAAI/qB,UAAY,UAEsE,IAAlFwkB,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASoF,mBAC9DD,EAAIzQ,YCtBO,SAA6BgL,EAASC,EAAY0F,GAC/D,MAAMC,EAAUrtB,SAAS4D,cAAc,KAuBvC,OAtBIwpB,EAAWE,SAAS5F,IACtB2F,EAAQE,UAAY,IACpBF,EAAQ7jB,MAAMyF,MAAQ,UACjBoe,EAAQE,UAAY,IAC3BF,EAAQlrB,UAAY,SACpBkrB,EAAQrG,QAAU,YCRL,SAAgCS,EAASC,GAClDf,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASuE,kBAAkBsB,SAAS5F,GAChFf,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASuE,kBACjDrF,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASuE,kBAAkBwB,QAClEC,GAAQA,IAAQ/F,IAElBf,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASuE,kBAAkBxoB,KAAKkkB,GAC/EU,GACF,CDCIsF,CAAuBjG,EAASC,GAChCU,IACAzB,KAAKiE,YACP,EACAyC,EAAQM,YAAc,WACpBhH,KAAKiH,QAAQhV,KACXxY,KACA4oB,OACE,wNAGN,EACAqE,EAAQQ,WAAa,WACnBlH,KAAKiH,QAAQxV,MACf,EACAiV,EAAQ5Q,YAAYzc,SAASwf,eAAe,MACrC6N,CACT,CDFMS,CACErG,EACAC,EACAf,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASuE,oBAKnB,SAAlCP,EAAa/D,GAAY3lB,KAAiB,CAE5C,MAAMqI,EAAIpK,SAAS4D,cAAc,KAE/B6nB,EAAa/D,GAAYqG,QACmD,IAA5EpH,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,GAE5Dtd,EAAEjI,UAAY,aAEdiI,EAAEjI,UAAY,SAEhBiI,EAAE2c,GAAK,GAAGU,WAAiBC,IAC3Btd,EAAE4c,QAAU,YG3CD,SAAsBS,EAASC,EAAY+D,GACxD9E,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,IAAe,EAEzEf,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,KAC5D+D,EAAa/D,GAAYsG,MAAMrsB,QAE/BglB,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,GAAc,EACtE+D,EAAa/D,GAAYqG,SAC3Bvb,EAAE,GAAGiV,WAAiBC,KAAcvlB,UAAY,eAC7CqQ,EAAE,GAAGiV,WAAiBC,KAAcvlB,UAAY,cAEV,IAAlCspB,EAAa/D,GAAYjhB,MAClCglB,EAAa/D,GAAYjhB,OAG3B2hB,GACF,CH4BM6F,CAAaxG,EAASC,EAAY+D,GAClC9E,KAAKiE,YACP,EACAxgB,EAAErF,YACA0mB,EAAa/D,GAAYsG,MACvBrH,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,IAEhEwF,EAAIzQ,YAAYrS,GAGhB,MAAM4jB,EAAQhuB,SAAS4D,cAAc,SAIrC,OAHAoqB,EAAMjpB,YAAc0mB,EAAa/D,GAAYwG,KAC7CF,EAAMxkB,MAAM+V,WAAa,MACzB2N,EAAIzQ,YAAYuR,GACTd,CACT,CAEA,GAAsC,QAAlCzB,EAAa/D,GAAY3lB,KAAgB,CAC3C,MAAM6nB,EAAS5pB,SAAS4D,cAAc,OAGtCgmB,EAAOznB,UAAY,YACnB,MAAMgsB,EAAQnuB,SAAS4D,cAAc,OACrCuqB,EAAM3kB,MAAM4kB,MAAQ,OACpBD,EAAM9P,UAAYoN,EAAa/D,GAAYwG,KAC3CtE,EAAOnN,YAAY0R,GACnB,MAAME,EAAUruB,SAAS4D,cAAc,OACvCyqB,EAAQtH,GAAK,SAASU,IAAUC,SAChC2G,EAAQ7kB,MAAM4kB,MAAQ,QACtBC,EAAQhQ,UAAY,GAAGsI,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,MACnFkC,EAAOnN,YAAY4R,GACnB,MAAMC,EAAStuB,SAAS4D,cAAc,SACtC0qB,EAAOnsB,UAAY,SACnBmsB,EAAOvH,GAAK,SAASU,IAAUC,IAC/B4G,EAAO9kB,MAAM8T,MAAQ,OACrBgR,EAAOvsB,KAAO,QACdusB,EAAO/gB,IAAM,IACb+gB,EAAO7gB,IAAM,MACb6gB,EAAOC,KAAO,IACdD,EAAOxpB,MAAQ6hB,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,GAC3E4G,EAAOtJ,QAAU,WACf8E,EAAmBrC,EAASC,GAC5Bf,KAAKiE,YACP,EACA0D,EAAOE,SAAW,WAChB1E,EAAmBrC,EAASC,GAC5Bf,KAAKiE,YACP,EACAhB,EAAOnN,YAAY6R,GACnBpB,EAAIzQ,YAAYmN,GAGhB,MAAMxf,EAAIpK,SAAS4D,cAAc,KAejC,OAdAwG,EAAEjI,UAAY,SACdiI,EAAE4c,QAAU,WACVqC,EACE5B,EACAd,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SACjDL,EAAWvf,QAAQ,SAAU,aAE/Buf,EAAWvf,QAAQ,SAAU,SAC7Buf,GACA,EAEJ,EACAtd,EAAErF,YAAc,aAChBmoB,EAAIzQ,YAAYrS,GACT8iB,CACT,CAEA,GAAsC,QAAlCzB,EAAa/D,GAAY3lB,KAAgB,CAE3C,MAAM0sB,EAAOzuB,SAAS4D,cAAc,QACpC6qB,EAAKtsB,UAAY,SACjBssB,EAAK1pB,YAAc,GAAG0mB,EAAa/D,GAAYsG,SAC/CS,EAAKjlB,MAAM+V,WAAa,MACxB2N,EAAIzQ,YAAYgS,GAGhB,MAAMC,EAAQ1uB,SAAS4D,cAAc,SACrC8qB,EAAM3H,GAAK,GAAGU,WAAiBC,IAC/BgH,EAAMvsB,UAAY,SAClBusB,EAAM3sB,KAAO,OACb2sB,EAAMC,UAAW,EACjBD,EAAM5pB,MAAQ6hB,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,GAC1EgH,EAAMllB,MAAMgG,MAAQ,QACpB0d,EAAIzQ,YAAYiS,GAChBxB,EAAIzQ,YAAYzc,SAASwf,eAAe,MAGxC,MAAMoP,EAAc5uB,SAAS4D,cAAc,SAC3CgrB,EAAY7H,GAAK,GAAGU,WAAiBC,UACrCkH,EAAYzsB,UAAY,SACxBysB,EAAY7sB,KAAO,OACnB6sB,EAAY9pB,MAAQ6hB,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,GAEhF,MAAMtd,EAAIpK,SAAS4D,cAAc,KACjCwG,EAAEjI,UAAY,SACdiI,EAAE4c,QAAU,WACVP,EAAoBmI,EAAYC,UAAW,CACzC,CACE,OACA,WACElI,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,GAAclV,EACxE,GAAGiV,WAAiBC,WACpB5iB,MACFsjB,IACAzB,KAAKmI,cACLnI,KAAKiE,YACP,GAEF,CACE,SACA,WACEjE,KAAKmI,aACP,IAGN,EACA1kB,EAAErF,YAAc,OAChBmoB,EAAIzQ,YAAYrS,GAGhB,MAAM4jB,EAAQhuB,SAAS4D,cAAc,SAIrC,OAHAoqB,EAAMjpB,YAAc0mB,EAAa/D,GAAYwG,KAC7CF,EAAMxkB,MAAM+V,WAAa,MACzB2N,EAAIzQ,YAAYuR,GACTd,CACT,CAEA,GAAsC,WAAlCzB,EAAa/D,GAAY3lB,KAAmB,CAC9C,MAAMgtB,EAAY/uB,SAAS4D,cAAc,QACzCmrB,EAAU5sB,UAAY,SAGtB,MAAMusB,EAAQ1uB,SAAS4D,cAAc,SACrC8qB,EAAM3H,GAAKW,EACXgH,EAAMllB,MAAMgG,MAAQ,OACpBkf,EAAM5pB,MAAQ6hB,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,GAC1EqH,EAAUtS,YAAYiS,GAStB,IAAI,EAAQA,EAAO,CAAExN,MAAM,EAAM5P,SAAU,QAASqP,QARrC,WACbgG,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAAS3nB,KAAKmD,cAAcwjB,IAC7E3mB,KAAKigB,cACP2M,IACA5E,IACAzB,KAAKiE,YACP,IAKA,MAAMoD,EAAQhuB,SAAS4D,cAAc,SAMrC,GALAoqB,EAAMjpB,YAAc0mB,EAAa/D,GAAYwG,KAC7CF,EAAMxkB,MAAM+V,WAAa,MACzBwP,EAAUtS,YAAYuR,GAGlBtG,EAAW4F,SAAS,SAAU,CAChC,MAAMljB,EAAIpK,SAAS4D,cAAc,KACjCwG,EAAEjI,UAAY,SACdiI,EAAE4c,QAAU,WACVQ,EAAYC,EAAS,EAAGC,EAAWvf,QAAQ,SAAU,KAAK,EAC5D,EACAiC,EAAErF,YAAc,aAChBgqB,EAAUtS,YAAYrS,EACxB,CAGA,OAFA8iB,EAAIzQ,YAAYsS,GAChB,WACO7B,CACT,CAEA,GAAsC,aAAlCzB,EAAa/D,GAAY3lB,KAAqB,CAChD,MAAM0sB,EAAOzuB,SAAS4D,cAAc,QACpC6qB,EAAKtsB,UAAY,SACjBssB,EAAK1pB,YAAc,GAAG0mB,EAAa/D,GAAYsG,SAC/CS,EAAKjlB,MAAM+V,WAAa,MACxB2N,EAAIzQ,YAAYgS,GAGhB,MAAMC,EAAQ1uB,SAAS4D,cAAc,SACrC8qB,EAAM3H,GAAK,GAAGU,WAAiBC,IAC/BgH,EAAMvsB,UAAY,SAClBusB,EAAM3sB,KAAO,SACb2sB,EAAM5pB,MAAQ6hB,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,GAC1EgH,EAAMnhB,IAAMke,EAAa/D,GAAYna,IACrCmhB,EAAMjhB,IAAMge,EAAa/D,GAAYja,IACrCihB,EAAM1J,QAAU,WACd2B,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,GAActnB,KAAK0E,MAC/EsjB,IACA6E,IACAtG,KAAKiE,YACP,EACAsC,EAAIzQ,YAAYiS,GAChBxB,EAAIzQ,YAAYzc,SAASwf,eAAe,MAGxC,MAAMwO,EAAQhuB,SAAS4D,cAAc,SAIrC,OAHAoqB,EAAMjpB,YAAc0mB,EAAa/D,GAAYwG,KAC7CF,EAAMxkB,MAAM+V,WAAa,MACzB2N,EAAIzQ,YAAYuR,GACTd,CACT,CAEA,GAAsC,YAAlCzB,EAAa/D,GAAY3lB,KAAoB,CAE/C,MAAM6sB,EAAc5uB,SAAS4D,cAAc,SAC3CgrB,EAAY7H,GAAK,GAAGU,WAAiBC,UACrCkH,EAAYzsB,UAAY,SACxBysB,EAAY7sB,KAAO,OACnB6sB,EAAY9pB,MACV6hB,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,GAAYsH,YAG1E,MAAM5kB,EAAIpK,SAAS4D,cAAc,KACjCwG,EAAEjI,UAAY,SACdiI,EAAE2c,GAAK,GAAGU,WAAiBC,IAC3Btd,EAAE4c,QAAU,WACVP,EAAoBmI,EAAYC,UAAW,IAC3Crc,EAAE,GAAGiV,WAAiBC,WAAoB5mB,iBAAiB,SAAU+B,KItQ5D,SAA6B4kB,EAASC,EAAYuH,GAC/D,MAAMC,EAAa,CACjBhJ,IAAK+I,EAAM/I,IACXiJ,OAAQF,EAAME,OACdC,QAASH,EAAMG,QACfC,SAAUJ,EAAMI,SAChBL,YAAa,GAAGC,EAAMI,SAAW,WAAa,KAAKJ,EAAME,OAAS,SAAW,KAC3EF,EAAMG,QAAU,UAAY,KAC3BH,EAAM/I,OAEXS,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,GAAcwH,EAC1E9G,GACF,CJ2PQkH,CAAoB7H,EAASC,EAAY7kB,GACzC8jB,KAAKmI,cACLnI,KAAKiE,YAAY,GAErB,EACAxgB,EAAErF,YACA4hB,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,GAAYsH,YAC1E9B,EAAIzQ,YAAYrS,GAGhB,MAAM4jB,EAAQhuB,SAAS4D,cAAc,SAIrC,OAHAoqB,EAAMjpB,YAAc0mB,EAAa/D,GAAYwG,KAC7CF,EAAMxkB,MAAM+V,WAAa,MACzB2N,EAAIzQ,YAAYuR,GACTd,CACT,CACA,OAAOA,CACT,EJtQIqC,uBSlBW,SAAgC9H,EAASC,EAAY8H,GAClE,MAAMtC,EAAMltB,SAAS4D,cAAc,OACnCspB,EAAI/qB,UAAY,QAEhB+qB,EAAI1jB,MAAMmU,QAAU,MACpBuP,EAAI1jB,MAAMihB,SAAW,OACrByC,EAAIzQ,YAAYzc,SAASwf,eAAe,GAAGgQ,OAG3C,MAAMf,EAAOzuB,SAAS4D,cAAc,QAmBpC,OAlBA6qB,EAAKjlB,MAAMqU,OAAS,UACpB4Q,EAAKjlB,MAAM2U,QAAU,eACrBsQ,EAAKjlB,MAAMiG,OAAS,OACpBgf,EAAKjlB,MAAMgG,MAAQ,OACnBif,EAAKjlB,MAAM4T,aAAe,MAC1BqR,EAAKjlB,MAAM6V,UAAY,SACvBoP,EAAKjlB,MAAMkU,gBAAkB,UAC7B+Q,EAAKjlB,MAAMyF,MAAQ,QACnBwf,EAAKjlB,MAAMihB,SAAW,OACtBgE,EAAKjlB,MAAMkhB,cAAgB,SAC3B+D,EAAK1pB,YAAc4hB,KAAKiB,KAAKC,uBAAuBC,SAASL,GAAS2B,QAAQ1B,GAC1E,IACA,IACJ+G,EAAKzH,QAAU,WACbkC,EAAazB,EAASC,GACtBf,KAAKiE,YACP,EACAsC,EAAIzQ,YAAYgS,GACTvB,CACT,GTfaP,EUdE,SAA8BlF,EAASgI,EAAgBC,GACpE,MAAMC,EAAgB3vB,SAAS4D,cAAc,OAC7C+rB,EAAcxtB,UAAY,aAC1BwtB,EAAc5I,GAAK,GAAGU,eAEtB,MAAM8C,EAAWvqB,SAAS4D,cAAc,OACxC2mB,EAASpoB,UAAY,QACrBooB,EAAS/gB,MAAMihB,SAAW,OAC1BF,EAASlM,UAAYoR,EAErB,MAAMjF,EAAaxqB,SAAS4D,cAAc,QAuB1C,OAtBA4mB,EAAWhhB,MAAMqU,OAAS,UAC1B2M,EAAWhhB,MAAM2U,QAAU,eAC3BqM,EAAWhhB,MAAMiG,OAAS,OAC1B+a,EAAWhhB,MAAMgG,MAAQ,OACzBgb,EAAWhhB,MAAM4T,aAAe,MAChCoN,EAAWhhB,MAAM6V,UAAY,SAC7BmL,EAAWhhB,MAAMkU,gBAAkB,UACnC8M,EAAWhhB,MAAMyF,MAAQ,QACzBub,EAAWhhB,MAAMihB,SAAW,OAC5BD,EAAWhhB,MAAMkhB,cAAgB,SACjCF,EAAWzlB,YAAc4hB,KAAKiB,KAAKC,uBAAuBC,SAASL,GAAS2B,QAAQsG,GAChF,IACA,IACJlF,EAAWxD,QAAU,WACnBkC,EAAazB,EAASiI,GACtB/I,KAAKiE,YACP,EAEAL,EAAS9N,YAAY+N,GAErBmF,EAAclT,YAAY8N,GAEnBoF,CACT,EVXaC,EAAyB,CACpCpI,YAAW,EACXqI,mBW3Ba,SAA4BpI,EAASC,EAAYyG,EAAO2B,GAES,IAA5EnJ,KAAKiB,KAAKC,uBAAuBC,SAASL,GAASM,SAASL,IAC/B,WAA7B1nB,SAAS+vB,kBAC4C,IAArD5vB,OAAO6nB,2BAA2BC,gBAGlC,IAAI+H,aAAa7B,EAAO,CACtBpO,KAAM+P,EACNG,MAAO,wDAGb,EXgBExJ,oBAAmB,EACnB4C,YAAW,GAKA6G,EAA0B,CACrC1E,QAAO,EACPpD,cAAa,GAGF+H,EY3CE,cAA6B9J,EAC1CC,YAAYC,EAAcxkB,EAAMykB,EAAO0H,GACrCkC,MAAM7J,EAAcxkB,EAAMykB,GAC1BpmB,KAAK8tB,KAAOA,CACd,GZuCWiC,Ea3CE,cAAiC9J,EAC9CC,YAAYC,EAAcxkB,EAAMykB,EAAOwH,EAAOE,EAAM3gB,EAAKE,GACvD2iB,MAAM7J,EAAcxkB,EAAMykB,GAC1BpmB,KAAK4tB,MAAQA,EACb5tB,KAAK8tB,KAAOA,EACZ9tB,KAAKmN,IAAMA,EACXnN,KAAKqN,IAAMA,CACb,GboCW0iB,Ec3CE,cAA8B9J,EAC3CC,YAAYC,EAAcxkB,EAAMykB,EAAOwH,EAAOE,EAAMH,GAClDqC,MAAM7J,EAAcxkB,EAAMykB,GAC1BpmB,KAAK4tB,MAAQA,EACb5tB,KAAK8tB,KAAOA,EACZ9tB,KAAK2tB,OAASA,CAChB,GdqCWoC,Ee3CE,cAAsC9J,EACnDC,YAAYC,EAAcxkB,EAAMykB,EAAOwH,EAAOE,EAAMH,EAAQtnB,GAC1D2pB,MAAM7J,EAAcxkB,EAAMykB,GAC1BpmB,KAAK4tB,MAAQA,EACb5tB,KAAK8tB,KAAOA,EACZ9tB,KAAK2tB,OAASA,OACDjsB,IAAT2E,IACFrG,KAAKqG,KAAOA,EAEhB,GfkCW0pB,EgB3CE,cAA4B9J,EACzCC,YAAYC,EAAcxkB,EAAMykB,EAAOwH,EAAOE,GAC5CkC,MAAM7J,EAAcxkB,EAAMykB,GAC1BpmB,KAAK4tB,MAAQA,EACb5tB,KAAK8tB,KAAOA,EACZ,IAAK,IAAIxsB,EAAI,EAAGA,EAAI,IAAKA,IACvBtB,KAAK4tB,MAAMtsB,GAAK,GAAGA,IAEvB,GCPa,SAAS2uB,IAEpB1J,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwI,iBACpE5J,KAAK6J,YAELhe,EAAE,8BAA8BhJ,MAAM2U,QAAU,GAChD3L,EAAE,4BAA4BhJ,MAAM2U,QAAU,KAE9C3L,EAAE,8BAA8BhJ,MAAM2U,QAAU,OAChD3L,EAAE,4BAA4BhJ,MAAM2U,QAAU,OAElD,CCbO,IAwCIsS,EAsCAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAEAC,EACAC,EACAC,EACAC,EACAC,EAEAC,EACAC,EACAC,EACAC,EACAC,EAEAC,EACAC,EAEAC,EAEAC,ECnGAC,EACAC,EACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GDjBAC,GAAkB,EAClBC,GAAmB,EACnBC,GAAuB,EACvBC,GAAyB,EACzBC,GAAa,EACbC,GAAmB,EACnBC,GAAwB,EACxBC,GAAmB,EACnBC,GAAyB,EACzBC,GAA8B,EAC9BC,GAAe,EACfC,GAAqB,EACrBC,GAAe,EACfC,GAAuB,EACvBC,GAA6B,EAC7BC,GAAoC,EACpCC,GAAyB,EACzBC,GAAwB,EAExBC,GAAmB,EAEnBC,GAAe,EACfC,GAAe,EACfC,GAAkB,EAElBC,GAAgB,CAAC,EACjBC,GAAiB,CAAC,EAClBC,GAAkB,CAAC,EACnBC,GAA8B,CAAC,EAE/BC,GAAsB,EACtBC,GAAuB,EACvBC,GAAwB,CAAC,EAAG,MAE5BC,GAA2B,EAC3BC,GAAyB,EAEzBC,GAAgB,CAAC,EAEjBC,GAAqB,CAAC,EAGtBC,GAAuB,CAAC,EACxBC,GAA+B,CAAC,EAChCC,GAA8B,CAAC,EAE/BC,GAAqB,EACrBC,GAAyB,EACzBC,GAAsB,GACtBC,GAA0B,EAC1BC,GAA8B,EAC9BC,GAA2B,GAC3BC,GAA2B,EAC3BC,GAA+B,EAC/BC,GAA4B,GAC5BC,GAAgC,EAChCC,GAAoC,EACpCC,GAAiC,GAEjCC,GAAyB,EACzBC,GAAwB,EAExBC,GAA4B,CAAC,EAC7BC,GAAwB,CAAC,EAEzBC,GAA4B,EAG5BC,GAAa,EAEbC,GAAiB,EAEjBC,GAAe,GAEfC,GAA0B,CAAC,EAE3BC,GAAqB,EA6BrBC,GAAY,CACrB,EAAG,CAAC,EAAG,EAAG,GACV,EAAG,CAAC,EAAG,EAAG,GACV,EAAG,CAAC,EAAG,EAAG,GACV,EAAG,CAAC,EAAG,EAAG,GACV,EAAG,CAAC,EAAG,EAAG,GACV,EAAG,CAAC,EAAG,EAAG,GACV,EAAG,CAAC,EAAG,EAAG,GACV,EAAG,CAAC,EAAG,EAAG,GACV,EAAG,CAAC,EAAG,EAAG,GACV,EAAG,CAAC,EAAG,EAAG,GACV,GAAI,CAAC,EAAG,EAAG,ICpHFC,GAAa,GACbC,GAAc,GACdC,GAAkB,GCCd,SAASC,GAAYC,GAClC,IAAIjyB,EAAI,EAYR,OAVEgiB,KAAKkQ,YAAYzE,IAAensB,OAAS2wB,GACzCjQ,KAAKkQ,YAAYxE,IAAgBpsB,OAAS2wB,IAE1CjyB,EAAI,IAEqC,oBAAzCgiB,KAAKkQ,YAAYzE,IAAensB,MACW,oBAA1C0gB,KAAKkQ,YAAYxE,IAAgBpsB,MAChC0gB,KAAKmQ,aAAenQ,KAAKoQ,cAAcH,GAAM7P,GAAK,KAEpDpiB,GAAK,IACAA,CACT,CCbe,SAASqyB,KACtB,IAAIC,EAAW,IAEf,OADAA,GAAY,EAAIN,GAAY,mBACrBM,CACT,CCLe,SAASC,GAAOjxB,EAAMkxB,GACnC,YAA6B,IAAlBzE,GAAQzsB,QACK,IAARkxB,EAAsB,EAAIA,EAEnCzE,GAAQzsB,EACjB,CCLe,SAASmxB,GAAOR,GAC7B,MAAMS,EAAKZ,GAAYG,GACvB,QAAIS,GAA6B,IAAvB1Q,KAAK2Q,eAAoC,aAAZD,EAAGE,MAAmC,YAAZF,EAAGG,OAC7DH,EAAKA,EAAGI,OADiF,CAElG,CCJe,SAASC,GAAWd,GACjC,OACEjQ,KAAKkQ,YAAYzE,IAAensB,OAAS2wB,GACzCjQ,KAAKkQ,YAAYxE,IAAgBpsB,OAAS2wB,CAK9C,CCLe,SAASe,GAAUf,GAChC,GAAIjQ,KAAKiR,OAAQ,MACoB91B,IAA/B00B,GAAWqB,OAAOC,WACpBtB,GAAWqB,OAAOC,SAAWnR,KAAKoR,QAAQF,OAAOC,UAEnD,MAAME,EAAMxB,GAAWqB,OAAOC,SAASG,KAAKrB,GAC5C,GAAItE,KAAY0F,EAAIjR,GAClB,OAAO,EAET,GAAIwL,KAAYyF,EAAIjR,GAClB,OAAI2Q,GAAW,qBACN,EAEF,EAET,GAAIlF,KAAYwF,EAAIjR,GAClB,OAAI2Q,GAAW,qBACN,EAEF,CAEX,CACA,OAAO,CACT,CCnBe,SAASQ,GAAuBC,EAAUC,GACvD,IAAIC,EAAgBD,EAapB,GAZIhB,GAAO,oBAAmBiB,GAAiB,KAC3CjB,GAAO,sBAAqBiB,GAAiB,KAC7CjB,GAAO,iBAAgBiB,GAAiB,KACxCjB,GAAO,qBAAoBiB,GAAiB,KAC5CjB,GAAO,kBAAiBiB,GAAiB,KAE7CA,GAAiB,EAAoC,IAAhC1B,GAAY,kBAC7BhQ,KAAK2R,QAAQ,wBAAuBD,GAAiB,KACrD1R,KAAK2R,QAAQ,mBAAkBD,GAAiB,KAChD1R,KAAK2R,QAAQ,mBAAkBD,GAAiB,MAChDF,EAASI,SAAWnB,GAAOe,EAASI,QAAQtyB,QAAOoyB,GAAiB,KACxEA,GAAiBnB,GAAO,gBACpBV,GAAWqB,OAAOW,eAAgB,CACpC,MAAMC,EAASd,GAAU,YACV,IAAXc,EAAcJ,GAAiB,IACf,IAAXI,EAAcJ,GAAiB,IACpB,IAAXI,IAAcJ,GAAiB,IAC1C,CACA,OAAOA,CACT,CCnBe,SAASK,GAAaC,EAAOC,EAAW/nB,EAAOgoB,EAAMC,EAAQC,GAG1E,MAAMC,OAA4B,IAAVD,EAAwB,EAAIA,EACpD,IAAIE,EAAWH,EACXI,EAAiBroB,EACjBsoB,EAAO,GACK,IAAZL,IAAeG,EAAWC,GACzBJ,IAAQG,EAAWtS,KAAKyS,SAC7B,IAAK,IAAI13B,EAAI,EAAGA,EAAIu3B,EAAUv3B,IAAK,CACjC,IAAI02B,EAAQQ,EAAYjS,KAAK0S,eAAiBvvB,KAAK2D,IAAI,EAAGyrB,EAAiBL,GAC3ET,EAAQY,EACJrS,KAAK2S,oBAAoBX,EAAOP,GAChCF,GAAuBS,EAAOP,GAClCA,EAAQtuB,KAAKiL,KAAKqjB,GAClB,MAAMnB,EAAW+B,EAAWL,EAAMY,oBAAsBvC,KACxDoB,EAAQtuB,KAAKgE,MAAMsqB,EAAQnB,GACvBiC,EAAiB,IACnBC,GAAQf,EACRc,GAAkB,EAEtB,CACA,OAAOC,CACT,CClCO,MAAMK,GAAS,CAAC,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAGhDC,GAAa,CACxB,GACA,GACA,IACA,IACA,KACA,QACA,QACA,OACA,OACA,MACA,MACA,MACA,QACA,SACA,SACA,cACA,UACA,SACA,YACA,UACA,WACA,SACA,WACA,YACA,YACA,kBAIWC,GAAwB,CACnC,GACA,IACA,IACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,KACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,KACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,KACA,OC3IK,IAAIC,GAEAC,GAGAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAGAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GCjBAC,GDFAC,GAAqB,GAErBC,GAAwB,GACxBC,GAAuB,GAOvBC,GAAkB,CAAC,EAanBC,GAAyBC,KAAKC,MAI9BC,GAAyBF,KAAKC,MEhB1B,SAAS,GAASE,EAAKC,EAAQ1T,GAC5C,MAAM2T,EACJ3U,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwT,cAAgB,EACtF,GAAIH,IAAQI,IACV,MAAO,WAET,QAAmB,IAARJ,EACT,MAAO,IAET,GAAkF,IAA9E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tB,IAAc,IAGlBziB,cAAe,IAAIpL,EACjB,EACA,OACA,WACA,CAAC,aAAc,aAAc,cAC7B,oIACA,GACA,KACE6tB,IAAc,IAGlBjiB,eAAgB,IAAI5L,EAClB,EACA,OACA,WACA,CAAC,4BAA6B,mBAC9B,qDACA,GACA,KACE6tB,IAAc,IAGlBliB,YAAa,IAAI3L,EACf,OACA,WACA,WACA,2BACA,8KACA,EACA,WAEFmR,WAAY,IAAInR,EACd,EACA,OACA,WACA,CAAC,0BAA2B,sBAAuB,iBACnD,0BACA,GAEFkuB,aAAc,IAAIluB,EAChB,EACA,OACA,WACA,CAAC,oBAAqB,oBACtB,mEACA,GACA,KCtIuF,IAArFxJ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASs2B,aACtE13B,KAAKyrB,QAAU5U,GACZ7W,KAAKyrB,QAAUrX,GAAgBqX,ODqIZ,IAGxBhP,cAAe,IAAIjT,EACjB,EACA,OACA,WACA,CAAC,yBAA0B,mBAC3B,sKACA,GAIF4O,YAAa,IAAI5O,EACf,EACA,OACA,UACA,CAAC,uBAAwB,uBACzB,yBACA,GACA,KACEwO,IAAiB,IAGrB6I,sBAAuB,IAAIrX,EACzB,EACA,OACA,UACA,CAAC,2BAA4B,sBAC7B,0KACA,GAEFomB,aAAc,IAAIpmB,EAChB,EACA,OACA,UACA,CACE,mBACA,kBACA,0BACA,gCAEF,sGACA,GAEFmmB,cAAe,IAAInmB,EACjB,EACA,OACA,UACA,CAAC,mBAAoB,mBACrB,sJACA,GAEFoX,oBAAqB,IAAIpX,EACvB,EACA,WACA,UACA,oCACA,wMACA,EACAqL,KAEFgB,WAAY,IAAIrM,EACd,UACA,SACA,UACA,6HAEFsM,YAAa,IAAItM,EACf,UACA,SACA,UACA,yGAEFuM,aAAc,IAAIvM,EAChB,UACA,SACA,UACA,qHAEFwM,aAAc,IAAIxM,EAChB,UACA,SACA,UACA,4HAEFyM,UAAW,IAAIzM,EACb,UACA,SACA,UACA,gHAEF0M,aAAc,IAAI1M,EAChB,UACA,SACA,UACA,8HAEF2M,WAAY,IAAI3M,EACd,UACA,SACA,UACA,wGAEF4M,WAAY,IAAI5M,EACd,UACA,SACA,UACA,sDAEF6M,YAAa,IAAI7M,EACf,UACA,SACA,UACA,yDAIF8S,OAAQ,IAAI9S,EACV,EACA,OACA,cACA,CAAC,iBAAkB,iBACnB,wBACA,GACA,KACEiuB,IAAc,IAGlBva,SAAU,IAAI1T,EACZ,EACA,OACA,cACA,CAAC,gBAAiB,gBAClB,+FACA,GACA,KACE4T,IAAgB,IAGpBD,YAAa,IAAI3T,EACf,EACA,OACA,cACA,CAAC,gCAAiC,+BAClC,8BACA,GACA,KnE5OsF,IAApFxJ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS+b,aACtEtxB,EAAE,cAAchJ,MAAMgG,MAAQ,MAC9BgD,EAAE,cAAchJ,MAAMwV,OAAS,GAC/BxM,EAAE,QAAQ6X,aAAa7X,EAAE,cAAeA,EAAE,kBAE1CA,EAAE,cAAchJ,MAAMgG,MAAQ,OAC9BgD,EAAE,cAAchJ,MAAMwV,OAAS,MAC/BxM,EAAE,WAAWiK,YAAYjK,EAAE,gBAE7BoxB,ImEoOuB,IAGvBgP,gBAAiB,IAAIziB,EACnB,EACA,OACA,cACA,CAAC,wBAAyB,iCAAkC,0BAC5D,+DACA,GAEFsiB,iBAAkB,IAAItiB,EACpB,EACA,OACA,cACA,CAAC,yBAA0B,yBAC3B,kEACA,GAEF4P,YAAa,IAAI5P,EACf,EACA,OACA,cACA,CAAC,0BAA2B,8BAA+B,kCAC3D,yDACA,GACA,KEtTsF,IAApFxJ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgY,aAEtEvtB,EAAE,gBAAgBhJ,MAAM2U,QAAU,GAClC2hB,MAEoF,IAApFnZ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgY,aAGpEvtB,EAAE,gBAAgBhJ,MAAM2U,QAAU,OAClC2hB,OAGAttB,EAAE,gBAAgBhJ,MAAM2U,QAAU,OAClCwI,KAAKw3B,kBF0SwB,IAG/BG,mBAAoB,IAAInuB,EACtB,EACA,OACA,cACA,CAAC,iCAAkC,iCACnC,+FACA,GACA,KGlU2F,IAA3FxJ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASu2B,oBAGpE9rC,EAAE,gBAAgBhJ,MAAM8H,SAAW,SACnCkB,EAAE,gBAAgBhJ,MAAMoC,IAAM,OAE9B4G,EAAE,gBAAgBhJ,MAAM8H,SAAW,EH6TP,IAG9B2tB,cAAe,IAAI9O,EACjB,EACA,OACA,cACA,CACE,0BACA,oCACA,2CACA,gDAEF,oFACA,GACA,KACEwO,IAAiB,IAGrBiC,aAAc,IAAIzQ,EAChB,EACA,OACA,cACA,CAAC,yBAA0B,qBAC3B,iEACA,GACA,KACE2P,IAAgB,IAGpBF,sBAAuB,IAAIzP,EACzB,EACA,OACA,cACA,CAAC,+BAAgC,+BACjC,mGACA,GACA,KACEqP,IAA6B,IAGjC+e,eAAgB,IAAIpuB,EAClB,EACA,OACA,cACA,CAAC,6BAA8B,6BAC/B,kFACA,GAEF2rB,YAAa,IAAI3rB,EACf,EACA,OACA,cACA,CAAC,iCAAkC,iCACnC,0EACA,GAEFquB,QAAS,IAAIruB,EACX,EACA,OACA,cACA,CAAC,0BAA2B,0BAC5B,yDACA,GACA,KIjYkF,IAAhFxJ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASy2B,QACtEt5C,OAAO6C,KAAK02B,IAAU3X,SAASplB,IAC7B+8B,GAAS/8B,GAAG8H,MAAM2U,QAAU,QAC5BsgB,GAAS/8B,GAAG8H,MAAMmC,KAAO0qB,GAAwB30B,GAAG8Q,EAAEhJ,MAAMmC,KAC5D8yB,GAAS/8B,GAAG8H,MAAMoC,IAAMyqB,GAAwB30B,GAAG8Q,EAAEhJ,MAAMoC,GAAG,IAIhE1G,OAAO6C,KAAK02B,IAAU3X,SAASplB,GAAO+8B,GAAS/8B,GAAG8H,MAAM2U,QAAU,QJ0XjD,IAGnBm9B,QAAS,IAAInrB,EACX,EACA,OACA,cACA,CAAC,cAAe,cAChB,2CACA,GACA,KACEkrB,IAAe,IAGnB9qB,gBAAiB,IAAIJ,EACnB,EACA,OACA,cACA,CAAC,6BAA8B,6BAC/B,kEACA,GACA,KACEE,GAAuB,IAG3BouB,oBAAqB,IAAItuB,EACvB,EACA,OACA,cACA,CAAC,qCAAsC,qCACvC,+FACA,GACA,KKraExJ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS02B,oBACtEjsC,EAAE,uBAAuBhJ,MAAM2U,QAAU,GAEzC3L,EAAE,uBAAuBhJ,MAAM2U,QAAU,MLmab,IAK9BytB,oBAAqB,IAAIzb,EACvB,EACA,OACA,UACA,CAAC,2CAA4C,2CAC7C,kDACA,GAEFoqB,YAAa,IAAIpqB,EACf,EACA,OACA,UACA,CACE,iDACA,iDAEF,qDACA,GAEFmhB,cAAe,IAAInhB,EACjB,EACA,OACA,UACA,CAAC,4BAA6B,4BAC9B,kGACA,GAEFohB,oBAAqB,IAAIphB,EACvB,EACA,OACA,UACA,CAAC,mCAAoC,mCACrC,2GACA,GAEFshB,gBAAiB,IAAIthB,EACnB,EACA,OACA,UACA,CAAC,8BAA+B,8BAChC,+GACA,GAEFwhB,sBAAuB,IAAIxhB,EACzB,EACA,OACA,UACA,CAAC,qCAAsC,qCACvC,kIACA,GAEF0hB,gBAAiB,IAAI1hB,EACnB,EACA,OACA,UACA,CAAC,8BAA+B,8BAChC,qJACA,GAEF8gB,aAAc,IAAI9gB,EAChB,EACA,WACA,UACA,mCACA,gKACA,EACAqL,KAEF2V,YAAa,IAAIhhB,EACf,EACA,OACA,UACA,CAAC,+CAAgD,+CACjD,2EACA,GAEFqb,YAAa,IAAIrb,EACf,EACA,OACA,UACA,CAAC,kCAAmC,qCACpC,kCACA,GACA,KACEob,IAAmB,IAGvB4B,YAAa,IAAIhd,EACf,EACA,OACA,UACA,CAAC,mCAAoC,mCACrC,6CACA,GAEFojB,aAAc,IAAIpjB,EAChB,EACA,OACA,UACA,CAAC,uBAAwB,uBACzB,oEACA,GAEFwc,YAAa,IAAIxc,EACf,EACA,OACA,UACA,CAAC,yBAA0B,yBAC3B,4DACA,GAEF0d,aAAc,IAAI1d,EAChB,EACA,OACA,UACA,CAAC,2BAA4B,2BAC7B,yDACA,GAEFue,cAAe,IAAIve,EACjB,EACA,OACA,UACA,CAAC,4BAA6B,4BAC9B,uDACA,GAEF6f,gBAAiB,IAAI7f,EACnB,EACA,OACA,UACA,CAAC,uBAAwB,uBACzB,iDACA,GAEFuuB,oBAAqB,IAAIvuB,EACvB,EACA,OACA,UACA,CAAC,qCAAsC,qCACvC,+CACA,GAIFgiB,MAAO,IAAIhiB,EACT,EACA,OACA,aACA,CAAC,iBAAkB,iBACnB,oCACA,GAEFwuB,gBAAiB,IAAIxuB,EACnB,EACA,OACA,aACA,CAAC,uBAAwB,uBACzB,6CACA,GAEFyuB,oBAAqB,IAAIzuB,EACvB,EACA,OACA,aACA,CAAC,2BAA4B,kCAC7B,yDACA,GAEF+jB,QAAS,IAAI/jB,EACX,EACA,OACA,aACA,CAAC,mCAAoC,+BACrC,wCACA,GAEF0uB,oBAAqB,IAAI1uB,EACvB,EACA,WACA,aACA,0BACA,8GACA,EACAqL,KAEFsjB,aAAc,IAAI3uB,EAChB,EACA,OACA,aACA,CAAC,gBAAiB,gBAClB,4FACA,GAIFuO,MAAO,IAAIvO,EACT,EACA,OACA,sBACA,CAAC,YAAa,WAAY,8BAC1B,8LACA,GAEFxG,aAAc,IAAIwG,EAChB,EACA,OACA,sBACA,CAAC,mCAAoC,mCACrC,kLACA,GAEF4uB,eAAgB,IAAI5uB,EAClB,EACA,OACA,iBACA,CAAC,mBAAoB,mBACrB,mDACA,GACA,KACE,GACExJ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASg3B,eACrE,IAGLC,QAAS,IAAI7uB,EACX,EACA,OACA,iBACA,CAAC,YAAa,YACd,iCACA,GAEF8uB,cAAe,IAAI9uB,EACjB,UACA,SACA,iBACA,wDAEF+uB,QAAS,IAAI/uB,EACX,EACA,OACA,iBACA,CAAC,YAAa,YACd,iCACA,GAEFgvB,SAAU,IAAIhvB,EAA6B,IAAK,MAAO,iBAAkB,GAAI,UAC7EivB,WAAY,IAAIjvB,EACd,6DACA,MACA,iBACA,aACA,6DAEFkvB,oBAAqB,IAAIlvB,EACvB,EACA,OACA,iBACA,CAAC,mBAAoB,mBACrB,8DACA,GACA,KACE,GACExJ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASs3B,oBACrE,IAGLC,aAAc,IAAInvB,EAChB,EACA,OACA,iBACA,CAAC,YAAa,YACd,wCACA,GAEFovB,mBAAoB,IAAIpvB,EACtB,UACA,SACA,iBACA,6DAEFqvB,aAAc,IAAIrvB,EAChB,EACA,OACA,iBACA,CAAC,YAAa,YACd,wCACA,GAEFsvB,cAAe,IAAItvB,EAA6B,IAAK,MAAO,iBAAkB,GAAI,UAClFuvB,gBAAiB,IAAIvvB,EACnB,gEACA,MACA,iBACA,aACA,sEAEFwvB,gBAAiB,IAAIxvB,EACnB,EACA,OACA,kBACA,CAAC,mBAAoB,mBACrB,yCACA,GACA,KACE,GACExJ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS43B,gBACrE,IAGLC,SAAU,IAAIzvB,EACZ,EACA,OACA,kBACA,CAAC,YAAa,YACd,gCACA,GAEF0vB,eAAgB,IAAI1vB,EAClB,UACA,SACA,kBACA,kEAEF2vB,SAAU,IAAI3vB,EACZ,EACA,OACA,kBACA,CAAC,YAAa,YACd,gCACA,GAEF4vB,UAAW,IAAI5vB,EAA6B,IAAK,MAAO,kBAAmB,GAAI,UAC/E6vB,YAAa,IAAI7vB,EACf,oEACA,MACA,kBACA,aACA,6DAEF8vB,UAAW,IAAI9vB,EACb,EACA,OACA,mBACA,CAAC,wBAAyB,YAC1B,+BACA,GAEF+vB,gBAAiB,IAAI/vB,EACnB,UACA,SACA,mBACA,4DAEFgwB,UAAW,IAAIhwB,EACb,EACA,OACA,mBACA,CAAC,YAAa,YACd,+BACA,GAEFiwB,WAAY,IAAIjwB,EAA6B,IAAK,MAAO,mBAAoB,GAAI,UACjFkwB,aAAc,IAAIlwB,EAChB,+DACA,MACA,mBACA,yBACA,uDAEFmwB,kBAAmB,IAAInwB,EACrB,EACA,OACA,mBACA,CAAC,mBAAoB,mBACrB,oDACA,GACA,KACE,GACExJ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASu4B,kBACrE,IAGLC,WAAY,IAAIpwB,EACd,EACA,OACA,mBACA,CAAC,YAAa,YACd,2CACA,GAEFqwB,iBAAkB,IAAIrwB,EACpB,UACA,SACA,mBACA,2DAEFswB,WAAY,IAAItwB,EACd,EACA,OACA,mBACA,CAAC,YAAa,YACd,2CACA,GAEFuwB,YAAa,IAAIvwB,EAA6B,IAAK,MAAO,mBAAoB,GAAI,UAClFwwB,cAAe,IAAIxwB,EACjB,gEACA,MACA,mBACA,aACA,2DAEFywB,qBAAsB,IAAIzwB,EACxB,EACA,OACA,oBACA,CAAC,mBAAoB,mBACrB,iDACA,GACA,KACE,GACExJ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS64B,qBACrE,IAGLC,cAAe,IAAI1wB,EACjB,EACA,OACA,oBACA,CAAC,YAAa,YACd,wCACA,GAEF2wB,oBAAqB,IAAI3wB,EACvB,UACA,SACA,oBACA,8DAEF4wB,cAAe,IAAI5wB,EACjB,EACA,OACA,oBACA,CAAC,YAAa,YACd,wCACA,GAEF6wB,eAAgB,IAAI7wB,EAA6B,IAAK,MAAO,oBAAqB,GAAI,UACtF8wB,iBAAkB,IAAI9wB,EACpB,6DACA,MACA,oBACA,aACA,yDAEF+wB,wBAAyB,IAAI/wB,EAC3B,EACA,OACA,uBACA,CAAC,mBAAoB,mBACrB,2EACA,GACA,KACE,GACExJ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASm5B,wBACrE,IAGLC,iBAAkB,IAAIhxB,EACpB,EACA,OACA,uBACA,CAAC,YAAa,YACd,kEACA,GAEFixB,uBAAwB,IAAIjxB,EAC1B,UACA,SACA,uBACA,sEAEFkxB,iBAAkB,IAAIlxB,EACpB,EACA,OACA,uBACA,CAAC,YAAa,YACd,kEACA,GAEFmxB,kBAAmB,IAAInxB,EACrB,IACA,MACA,uBACA,GACA,UAEFoxB,oBAAqB,IAAIpxB,EACvB,8DACA,MACA,uBACA,aACA,mFAIFqxB,aAAc,IAAIrxB,EAChB,EACA,OACA,gBACA,CAAC,wBAAyB,wBAC1B,mIACA,GAEFhD,kBAAmB,IAAIgD,EACrB,EACA,OACA,gBACA,CACE,iCACA,gCACA,0CAEF,8MACA,GACA,KACExJ,KAAKiE,YAAY,KMp7BR,SAAS62B,KACtB,IAAI3+C,EAAM,GACV,IAAK,IAAIpB,EAAI,EAAGA,EAAIu7B,GAAgBt7B,OAAQD,IAC1CoB,GAAO,UAAoBm6B,GAAgBv7B,eACzCilB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SACzD,SAASkV,GAAgBv7B,aAI/B,IAAK,IAAIA,EAAI,EAAGA,EAAIu7B,GAAgBt7B,OAAQD,IAC1CoB,GAAO,UAAoBm6B,GAAgBv7B,0BACzCilB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SACzD,SAASkV,GAAgBv7B,aAI/B,IAAK,IAAIA,EAAI,EAAGA,EAAIu7B,GAAgBt7B,OAAQD,IAC1CoB,GAAO,YAAsBm6B,GAAgBv7B,0BAC3CilB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SACzD,SAASkV,GAAgBv7B,aAI/B8Q,EAAE,SAASzN,YAAcjC,EACzB67B,IACF,CC3Be,SAAS+iB,KACtB,MAAMC,EAAU,EAAwB,mBAAoB,iBAAkB,eAmF9E,OAjFIh7B,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBlH,QAAQmC,aACrErmB,OAAO6C,KAAK20C,IAAc51B,SAASN,IACjC,GAAc,cAAVA,GACF,GAEI,IADFG,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBtE,kBAAkBrqB,QAE7EglB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASoF,kBAAoB,IAExFw0B,EAAQllC,YACN,yBAAmC,mBAAoB+J,EAAOk2B,GAAal2B,KAEzEG,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBlH,QAAQ5C,IACrE,IACE,IAAIuzB,EAAQ,EACZA,EACApzB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBtE,kBAAkBrqB,OAC7Eo4C,IAEA4H,EAAQllC,YACN,uBACE,mBACAkK,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBtE,kBACzD+tB,GAEF,GACA0H,GACAzD,UAMV2D,EAAQllC,YACN,yBAAmC,mBAAoB+J,EAAOk2B,GAAal2B,KAEzEG,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBlH,QAAQ5C,KAGvD,iBAAVA,EACFthB,OAAO6C,KAAKo1C,IAA0Br2B,SAAS86B,IAC7C,MAAMC,EAAiB,yBACrB,mBACAD,EACAzE,GAAyByE,IAE3BC,EAAer4C,MAAMihB,SAAW,OAChCo3B,EAAer4C,MAAMmU,QAAU,MAC/BgkC,EAAQllC,YAAYolC,GAChBl7B,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBlH,QAAQw4B,IACrE18C,OAAO6C,KAAK,IAAU+e,SAAS1M,IACzB,GAASA,GAAQoM,QAAUo7B,GAC7BD,EAAQllC,YACN,uBACE,mBACArC,EACA,GACAqnC,GACAzD,IAEH,GAEP,IAGF94C,OAAO6C,KAAK,IAAU+e,SAAS1M,IACzB,GAASA,GAAQoM,QAAUA,GAC7Bm7B,EAAQllC,YACN,uBACE,mBACArC,EACA,GACAqnC,GACAzD,IAEH,IAIX,IAGG2D,CACT,CCxFO,SAASG,GAAYC,GAC1B,OAAOC,OAAOD,GAAQ35C,MAAM45C,OARR,IAQ+BrgD,OAAS,CAC9D,CAQO,SAASsgD,GAAoBF,EAAQG,GAC1C,MACMC,EAAuB,GAAbD,EAEhB,IAAIjT,EArBgB,EAkBWiT,EAGTH,EAASI,EAAYJ,EAASG,EAGpD,OAFIjT,EAAQ,IAAGA,GAASkT,GAEjBlT,CACT,CCZO,SAASmT,GAAY5yB,EAAM6yB,GAChC,MAAMn1B,EAAMltB,SAAS4D,cAAc,OACnCspB,EAAI/qB,UAAY,QAChB+qB,EAAI1jB,MAAMqK,QAAU,WACpBqZ,EAAI1jB,MAAMmU,QAAU,MACpBuP,EAAI1jB,MAAMihB,SAAW,OACrByC,EAAI1jB,MAAM84C,WAAa,2BACvBp1B,EAAIzQ,YAAYzc,SAASwf,eAAe,GAAGgQ,OAC3C,MAAMf,EAAOzuB,SAAS4D,cAAc,QAmBpC,OAlBA6qB,EAAKjlB,MAAMqU,OAAS,UACpB4Q,EAAKjlB,MAAM2U,QAAU,eACrBsQ,EAAKjlB,MAAMiG,OAAS,OACpBgf,EAAKjlB,MAAMgG,MAAQ,OACnBif,EAAKjlB,MAAM4T,aAAe,MAC1BqR,EAAKjlB,MAAM6V,UAAY,SACvBoP,EAAKjlB,MAAMkU,gBAAkB,UAC7B+Q,EAAKjlB,MAAMyF,MAAQ,QACnBwf,EAAKjlB,MAAMihB,SAAW,OACtBgE,EAAKjlB,MAAMkhB,cAAgB,SAC3B+D,EAAK1pB,YAAc4hB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBlH,QAAQi5B,GAClF,IACA,IACJ5zB,EAAKzH,QAAU,YCvBV,SAAsBq7B,GAC3B17B,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBlH,QAAQi5B,IAAW,EAC1E17B,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBlH,QAAQi5B,GAAU,IAC/E17B,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBlH,QAAQi5B,GAAU,GAC/EnyB,EAAwB9H,eAC1B,CDmBIm6B,CAAaF,GACb17B,KAAKiE,YACP,EACAsC,EAAIzQ,YAAYgS,GACTvB,CACT,CAWO,SAASs1B,GAAazgD,EAAMkE,EAAMupB,EAAMmkB,GAC7C,MAAMzmB,EAAMltB,SAAS4D,cAAc,OACnCspB,EAAI/qB,UAAY,UAEhB,MAAMsgD,EAAcziD,SAAS4D,cAAc,KAG3C,GAFA6+C,EAAY19C,YAAckB,EAC1BinB,EAAIzQ,YAAYgmC,GACH,gBAAT1gD,EAAwB,CAC1BmrB,EAAI/qB,UAAY,UAChB+qB,EAAIzQ,YAAYzc,SAASwf,eAAe,MAExC,MAAMoO,EAAU5tB,SAAS4D,cAAc,QACvCgqB,EAAQC,WAAa,WACnBlH,KAAKiH,QAAQxV,MACf,EACAwV,EAAQD,YAAc,WACpBhH,KAAKiH,QAAQhV,KAAKxY,KAAM4oB,OAAOmU,GAAsBwW,GAAat1B,WACpE,EACAuP,EAAQpkB,MAAMqU,OAAS,UACvB+P,EAAQpkB,MAAM2U,QAAU,eACxByP,EAAQpkB,MAAMiG,OAAS,OACvBme,EAAQpkB,MAAMgG,MAAQ,OACtBoe,EAAQpkB,MAAM4T,aAAe,MAC7BwQ,EAAQpkB,MAAM6V,UAAY,SAC1BuO,EAAQpkB,MAAMkU,gBAAkB,UAChCkQ,EAAQpkB,MAAMyF,MAAQ,QACtB2e,EAAQpkB,MAAMihB,SAAW,MACzBmD,EAAQpkB,MAAMkhB,cAAgB,SAC9BkD,EAAQ7oB,YAAc,IACtBmoB,EAAIzQ,YAAYmR,EAClB,CAGA,OAFAV,EAAIzQ,YAAYzc,SAASwf,eAAe,OACxC0N,EAAIzQ,YAAY+S,GACTtC,CACT,CAWO,SAASw1B,GAAqB3gD,EAAMkE,EAAMupB,EAAMmzB,GACrD,MAAMz1B,EAAMltB,SAAS4D,cAAc,OACnCspB,EAAI/qB,UAAY,UAEhB,MAAMsgD,EAAcziD,SAAS4D,cAAc,KAQ3C,OAPA6+C,EAAY19C,YAAckB,GACV,IAAZ08C,IACFF,EAAYj5C,MAAMyF,MAChB0X,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS0U,aACxEvP,EAAIzQ,YAAYgmC,GAChBv1B,EAAIzQ,YAAYzc,SAASwf,eAAe,OACxC0N,EAAIzQ,YAAY+S,GACTtC,CACT,CAOO,SAAS01B,GAAcC,GAC5B,MAAMC,EAAO9iD,SAAS+iD,yBACtBD,EAAKrmC,YAAYzc,SAASwf,eAAe,GAAGqjC,EAAYlhD,YACxD,MAAM8sB,EAAOzuB,SAAS4D,cAAc,QACpC6qB,EAAKZ,WAAa,WAChBlH,KAAKiH,QAAQxV,MACf,EACA,MAAMu7B,EAAc3zC,SAAS4D,cAAc,OACrCo/C,EAAUhjD,SAAS4D,cAAc,OACvCo/C,EAAQx5C,MAAMqqC,SAAW,QACzBmP,EAAQx5C,MAAM29B,aAAe,MAC7B,MAAMhZ,EAAQnuB,SAAS4D,cAAc,OA4BrC,OA3BAuqB,EAAMhsB,UAAY,OAClBgsB,EAAM3kB,MAAM29B,aAAe,MAC3BhZ,EAAM3kB,MAAM6V,UAAY,SACxB8O,EAAMppB,YAAc,UACpBi+C,EAAQvmC,YAAY0R,GACpBjpB,OAAO6C,KAAK86C,GAAa/7B,SAASplB,IAChC,MAAMwrB,EAAMltB,SAAS4D,cAAc,OACnCspB,EAAI1jB,MAAM6V,UAAY,SACtB6N,EAAIzQ,YAAYzc,SAASwf,eAAeqjC,EAAYnhD,KACpDshD,EAAQvmC,YAAYyQ,EAAI,IAE1BymB,EAAYl3B,YAAYumC,GACxBv0B,EAAKd,YAAc,WACjBhH,KAAKiH,QAAQhV,KAAKxY,KAAM4oB,OAAO2qB,EAAYt1B,WAC7C,EACAoQ,EAAKjlB,MAAMqU,OAAS,UACpB4Q,EAAKjlB,MAAM2U,QAAU,eACrBsQ,EAAKjlB,MAAMiG,OAAS,OACpBgf,EAAKjlB,MAAMgG,MAAQ,OACnBif,EAAKjlB,MAAM4T,aAAe,MAC1BqR,EAAKjlB,MAAM6V,UAAY,SACvBoP,EAAKjlB,MAAMkU,gBAAkB,UAC7B+Q,EAAKjlB,MAAMyF,MAAQ,QACnBwf,EAAKjlB,MAAMihB,SAAW,MACtBgE,EAAKjlB,MAAMkhB,cAAgB,SAC3B+D,EAAK1pB,YAAc,IACnB+9C,EAAKrmC,YAAYgS,GACVq0B,CACT,CEnIe,SAASG,GAAa90B,GACnC,MAAM+0B,EAAQljD,SAAS4D,cAAc,OAiCrC,GAhCAs/C,EAAM/gD,UAAY,aAClB+gD,EAAMzmC,YAAY0R,GAElB+0B,EAAMzmC,YAAY,GAA2B,gBAAiB,UAC1DkK,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBlH,QAAQ+5B,OACrED,EAAMzmC,YCuBH,WAEL,MAAM2mC,EAAkBz8B,KAAK0iB,SAAS,oBAClC,2CACA,6BAEE1J,EAAU3/B,SAAS4D,cAAc,OACvC+7B,EAAQx9B,UAAY,sBAEpB,MAAMkhD,EAAc18B,KAAK4c,QAAUzB,KAAuB7O,GAAa2J,GAAYH,GAC7E6mB,EACJ38B,KAAK4c,QAAUzB,KAAuB7O,GAClCiO,IAAYjO,IAActM,KAAK4c,QAAUzB,OAAyBN,MAClE,GACA+hB,EAAevjD,SAAS+iD,yBACxBS,EAAexjD,SAAS4D,cAAc,QAK5C,GAJA4/C,EAAah6C,MAAMw9B,WAAa,OAChCwc,EAAarhD,UAAYm6B,GAAgB+mB,EACzCG,EAAaz+C,YAAc,GAASkuB,IACpCswB,EAAa9mC,YAAY+mC,GACP,KAAdF,EAAkB,CACpB,MAAMG,EAAgBzjD,SAAS4D,cAAc,SAC7C6/C,EAAc1+C,YAAc,KAAKu+C,KACjCC,EAAa9mC,YAAYgnC,EAC3B,CACA9jB,EAAQljB,YACN+lC,GAAa,cAAe,4BAA6Be,EAAcH,IAGzE,MAAMM,EACJ/8B,KAAK4c,QAAUzB,KAAuB1O,GAAmBwJ,GAAYH,GACjEknB,EACJh9B,KAAK4c,QAAUzB,KAAuB1O,GAClC8N,IAAY9N,IAAoBzM,KAAK4c,QAAUzB,OAAyBN,MACxE,GACAoiB,EAAmB5jD,SAAS+iD,yBAC5Bc,EAAmB7jD,SAAS4D,cAAc,QAKhD,GAJAigD,EAAiBr6C,MAAMw9B,WAAa,OACpC6c,EAAiB1hD,UAAYm6B,GAAgBonB,EAC7CG,EAAiB9+C,YAAc,GAASquB,IACxCwwB,EAAiBnnC,YAAYonC,GACL,KAApBF,EAAwB,CAC1B,MAAMG,EAAoB9jD,SAAS4D,cAAc,SACjDkgD,EAAkB/+C,YAAc,KAAK4+C,KACrCC,EAAiBnnC,YAAYqnC,EAC/B,CACAnkB,EAAQljB,YACN+lC,GACE,cACA,qCACAoB,EACAR,IAIJ,MAAMW,EAAa7wB,KAAqBC,GAElC6wB,EAAqBhkD,SAAS4D,cAAc,QAClDogD,EAAmBx6C,MAAMw9B,WAAa,OACtCgd,EAAmB7hD,UAAYm6B,GAAgBpJ,GAC/C8wB,EAAmBj/C,YACjB,GAASmuB,KAAqB6wB,EAAa,MAAM,GAAS5wB,MAA2B,IACvFwM,EAAQljB,YACN+lC,GACE,cACA,yBAAwBuB,EAAa,oBAAsB,IAC3DC,EACAZ,IAIJ,MAAMa,EAA2BjkD,SAAS4D,cAAc,QACxDqgD,EAAyBz6C,MAAMw9B,WAAa,OAC5Cid,EAAyB9hD,UAAYm6B,GAAgB2nB,EACrDA,EAAyBl/C,YACvB,GAASsuB,KACR0wB,EAAa,MAAM,GAASzwB,MAAiC,IAChEqM,EAAQljB,YACN+lC,GACE,cACA,kCAAiCuB,EAAa,oBAAsB,IACpEE,EACAb,IAIJ,MAAMc,EACJp6C,KAAKyD,IACqC,KAAvCoZ,KAAK4c,QAAUzB,MAChBnO,GAA6BC,GAAoC,GAAK,IACpE,GACAuwB,EAAenkD,SAAS4D,cAAc,QAc5C,OAbAugD,EAAa36C,MAAMw9B,WAAa,OAChCmd,EAAahiD,UAAYm6B,GAAgB6nB,EACzCA,EAAap/C,YACX,GAAS8uB,GAAyBqwB,IACjCH,EAAa,MAAM,GAASjwB,GAAwBowB,KAAkB,IACzEvkB,EAAQljB,YACN+lC,GACE,cACA,yBAAwBuB,EAAa,oBAAsB,IAC3DI,EACAf,IAGGzjB,CACT,CDjIsB,IAGpBujB,EAAMzmC,YAAY,GAA2B,gBAAiB,UAC1DkK,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBlH,QAAQg7B,OACrElB,EAAMzmC,YCkIH,WAEL,MAAM2mC,EAAkBz8B,KAAK0iB,SAAS,oBAClC,2CACA,6BAEE1J,EAAU3/B,SAAS4D,cAAc,OACvC+7B,EAAQx9B,UAAY,sBAEpB,MAAMkiD,EACJ19B,KAAK4c,QAAUzB,KAAuB7M,GAAqB2H,GAAYH,GACnE6nB,EACJ39B,KAAK4c,QAAUzB,KAAuB7M,GAClCiM,IAAYjM,IAAsBtO,KAAK4c,QAAUzB,OAAyBN,MAC1E,GACA+iB,EAAevkD,SAAS+iD,yBACxByB,EAAexkD,SAAS4D,cAAc,QAK5C,GAJA4gD,EAAah7C,MAAMw9B,WAAa,OAChCwd,EAAariD,UAAYm6B,GAAgB+nB,EACzCG,EAAaz/C,YAAc,GAASkwB,IACpCsvB,EAAa9nC,YAAY+nC,GACP,KAAdF,EAAkB,CACpB,MAAMG,EAAgBzkD,SAAS4D,cAAc,SAC7C6gD,EAAc1/C,YAAc,KAAKu/C,KACjCC,EAAa9nC,YAAYgoC,EAC3B,CACA9kB,EAAQljB,YACN+lC,GAAa,cAAe,2BAA4B+B,EAAcnB,IAGxE,MAAMsB,EACJ/9B,KAAK4c,QAAUzB,KAAuB1M,GAA0BwH,GAAYH,GACxEkoB,EACJh+B,KAAK4c,QAAUzB,KAAuB1M,GAClC8L,IAAY9L,IAA2BzO,KAAK4c,QAAUzB,OAAyBN,MAC/E,GACAojB,EAAoB5kD,SAAS+iD,yBAC7B8B,EAAoB7kD,SAAS4D,cAAc,QAKjD,GAJAihD,EAAkBr7C,MAAMw9B,WAAa,OACrC6d,EAAkB1iD,UAAYm6B,GAAgBooB,EAC9CG,EAAkB9/C,YAAc,GAASqwB,IACzCwvB,EAAkBnoC,YAAYooC,GACP,KAAnBF,EAAuB,CACzB,MAAMG,EAAqB9kD,SAAS4D,cAAc,SAClDkhD,EAAmB//C,YAAc,KAAK4/C,KACtCC,EAAkBnoC,YAAYqoC,EAChC,CACAnlB,EAAQljB,YACN+lC,GACE,cACA,mCACAoC,EACAxB,IAIJ,MAAM2B,EACJp+B,KAAK4c,QAAUzB,KAAuBvM,GAA2BqH,GAAYH,GACzEuoB,EACJr+B,KAAK4c,QAAUzB,KAAuBvM,GAClC2L,IAAY3L,IAA4B5O,KAAK4c,QAAUzB,OAAyBN,MAChF,GACAyjB,EAAmBjlD,SAAS+iD,yBAC5BmC,EAAmBllD,SAAS4D,cAAc,QAKhD,GAJAshD,EAAiB17C,MAAMw9B,WAAa,OACpCke,EAAiB/iD,UAAYm6B,GAAgByoB,EAC7CG,EAAiBngD,YAAc,GAASwwB,IACxC0vB,EAAiBxoC,YAAYyoC,GACL,KAApBF,EAAwB,CAC1B,MAAMG,EAAoBnlD,SAAS4D,cAAc,SACjDuhD,EAAkBpgD,YAAc,KAAKigD,KACrCC,EAAiBxoC,YAAY0oC,EAC/B,CACAxlB,EAAQljB,YACN+lC,GACE,cACA,oCACAyC,EACA7B,IAIJ,MAAMgC,EACJz+B,KAAK4c,QAAUzB,KAAuBpM,GAAgCkH,GAAYH,GAC9E4oB,EACJ1+B,KAAK4c,QAAUzB,KAAuBpM,GAClCwL,IACGxL,IAAiC/O,KAAK4c,QAAUzB,OAAyBN,MAE5E,GACA8jB,EAAwBtlD,SAAS+iD,yBACjCwC,EAAwBvlD,SAAS4D,cAAc,QAKrD,GAJA2hD,EAAsB/7C,MAAMw9B,WAAa,OACzCue,EAAsBpjD,UAAYm6B,GAAgB8oB,EAClDG,EAAsBxgD,YAAc,GAAS2wB,IAC7C4vB,EAAsB7oC,YAAY8oC,GACL,KAAzBF,EAA6B,CAC/B,MAAMG,EAAyBxlD,SAAS4D,cAAc,SACtD4hD,EAAuBzgD,YAAc,KAAKsgD,KAC1CC,EAAsB7oC,YAAY+oC,EACpC,CACA7lB,EAAQljB,YACN+lC,GACE,cACA,4CACA8C,EACAlC,IAIJzjB,EAAQljB,YACN+lC,GACE,cACA,wCACAxiD,SAASwf,eACP,GAAG,GAAS2V,GAAoB,SAAS,GAASG,GAAyB,OAE7E8tB,IAIJzjB,EAAQljB,YACN+lC,GACE,cACA,iDACAxiD,SAASwf,eACP,GAAG,GAASiW,GAA0B,SAAS,GAASA,GAA0B,OAEpF2tB,IAIJ,MAAMqC,EAAc37C,KAAKyD,IACN,GAAjBoZ,KAAKgb,UAAiB,GAAK,EAAI/N,GAChB,GAAfjN,KAAK4c,SAEDmiB,EAAW9N,GAAqB,EAAG6N,EAAa5xB,IAAwB,GACxE8xB,EAAgB/N,GAAqB,EAAG6N,EAAa3xB,IAAuB,GAgClF,OA/BA6L,EAAQljB,YACN+lC,GACE,cACA,wCACAxiD,SAASwf,eAAe,GAAG,GAASkmC,QAAe,GAASC,MAC5DvC,IAIJzjB,EAAQljB,YACN+lC,GACE,cACA,oCACAxiD,SAASwf,eACP,GAAG,GAAS0V,SAA6B,GAASG,OAEpD,8BAGJsK,EAAQljB,YACN+lC,GACE,cACA,6CACAxiD,SAASwf,eACP,GAAG,GAASgW,SAAmC,GAC7CG,OAGJ,8BAGGgK,CACT,CD5SsB,IAGhBhZ,KAAKoR,QAAQ,gBAAgBS,iBAC/B0qB,EAAMzmC,YAAY,GAA2B,SAAU,WACnDkK,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBlH,QAAQw8B,QACrE1C,EAAMzmC,YC4SL,WACL,MAAMkjB,EAAU3/B,SAAS4D,cAAc,OACvC+7B,EAAQx9B,UAAY,uBAEpB,MAAM0jD,EACJl/B,KAAK4c,QAAUzB,KAAuBvO,GAAeqJ,GAAYH,GAC7DqpB,EACJn/B,KAAK4c,QAAUzB,KAAuBvO,GAClC2N,IAAY3N,IAAgB5M,KAAK4c,QAAUzB,OAAyBN,MACpE,GAEAukB,EAAiB/lD,SAAS+iD,yBAC1BiD,EAAiBhmD,SAAS4D,cAAc,QAK9C,GAJAoiD,EAAex8C,MAAMw9B,WAAa,OAClCgf,EAAe7jD,UAAYm6B,GAAgBupB,EAC3CG,EAAejhD,YAAc,GAASwuB,IACtCwyB,EAAetpC,YAAYupC,GACP,KAAhBF,EAAoB,CACtB,MAAMG,EAAkBjmD,SAAS4D,cAAc,SAC/CqiD,EAAgBlhD,YAAc,KAAK+gD,KACnCC,EAAetpC,YAAYwpC,EAC7B,CACAtmB,EAAQljB,YACN+lC,GACE,cACA,yCACAuD,EACA,+BAGJpmB,EAAQljB,YACN+lC,GACE,cACA,qCACAxiD,SAASwf,eAAe,GAASgU,KACjC,+BAIJ,MAAM0yB,EACJv/B,KAAK4c,QAAUzB,KAAsC,EAAfvO,GAAmBqJ,GAAYH,GACjE0pB,EAAmBr8C,KAAKyD,IACY,KAAvCoZ,KAAK4c,QAAUzB,MACa,GAA7BnO,GAAkC,IAE9ByyB,EACJz/B,KAAK4c,QAAUzB,KAAsC,EAAfvO,GAClC2N,IAA2B,EAAf3N,IAAoB5M,KAAK4c,QAAUzB,OAAyBN,MACxE,GAEA6kB,EAAuBrmD,SAAS+iD,yBAChCuD,EAAuBtmD,SAAS4D,cAAc,QAKpD,GAJA0iD,EAAqB98C,MAAMw9B,WAAa,OACxCsf,EAAqBnkD,UAAYm6B,GAAgB4pB,EACjDI,EAAqBvhD,YAAc,GAAwB,EAAfwuB,IAC5C8yB,EAAqB5pC,YAAY6pC,GACP,KAAtBF,EAA0B,CAC5B,MAAMG,EAAwBvmD,SAAS4D,cAAc,SACrD2iD,EAAsBxhD,YAAc,KAAKqhD,KACzCC,EAAqB5pC,YAAY8pC,EACnC,CAmCA,OAlCA5mB,EAAQljB,YACN+lC,GACE,cACA,kDACA6D,EACA,+BAGJ1mB,EAAQljB,YACN+lC,GACE,cACA,8CACAxiD,SAASwf,eAAe,GAA8B,EAArBgU,KACjC,+BAGJmM,EAAQljB,YACN+lC,GACE,cACA,qCACAxiD,SAASwf,eAAe,GAAS2mC,IACjC,+BAGA1yB,IACFkM,EAAQljB,YACN+lC,GACE,cACA,mEACAxiD,SAASwf,eAAe,GAAG,GAASiU,QAAkBC,OACtD,+BAICiM,CACT,CD5YwB,KAIlBhZ,KAAKoR,QAAQ6V,KAAKpV,iBACpB0qB,EAAMzmC,YAAY,GAA2B,SAAU,WACnDkK,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBlH,QAAQo9B,QACrEtD,EAAMzmC,YC2YL,WACL,MAAMkjB,EAAU3/B,SAAS4D,cAAc,OACvC+7B,EAAQx9B,UAAY,uBAEpB,MAAMskD,EAAkB9/B,KAAK4c,QAA2B,GAAjB5c,KAAKgb,UAAiB,GAAK,IAAM/E,GAAYH,GAC9EiqB,EAAgB1mD,SAAS4D,cAAc,QAC7C8iD,EAAcl9C,MAAMw9B,WAAa,OACjC0f,EAAcvkD,UAAYm6B,GAAgBmqB,EAC1CC,EAAc3hD,YAAc,GAA0B,GAAjB4hB,KAAKgb,UAAiB,GAAK,KAChEhC,EAAQljB,YACN+lC,GAAa,QAAS,iDAAkDkE,IAG1E,MAAMC,EAAkBhgC,KAAK4c,QAA2B,GAAjB5c,KAAKgb,UAAiB,IAAM/E,GAAYH,GACzEmqB,EAAgB5mD,SAAS4D,cAAc,QAC7CgjD,EAAcp9C,MAAMw9B,WAAa,OACjC4f,EAAczkD,UAAYm6B,GAAgBqqB,EAC1CC,EAAc7hD,YAAc,GAA0B,GAAjB4hB,KAAKgb,UAAiB,KAC3DhC,EAAQljB,YACN+lC,GAAa,QAAS,iDAAkDoE,IAG1E,MAAMC,EAAkBlgC,KAAK4c,QAA2B,GAAjB5c,KAAKgb,UAAiB,GAAK,GAAK/E,GAAYH,GAC7EqqB,EAAgB9mD,SAAS4D,cAAc,QAC7CkjD,EAAct9C,MAAMw9B,WAAa,OACjC8f,EAAc3kD,UAAYm6B,GAAgBuqB,EAC1CC,EAAc/hD,YAAc,GAA0B,GAAjB4hB,KAAKgb,UAAiB,GAAK,IAChEhC,EAAQljB,YACN+lC,GAAa,QAAS,iDAAkDsE,IAG1E,MAAMC,EAAkBpgC,KAAK4c,QAA2B,GAAjB5c,KAAKgb,UAAiB,GAAK,IAAM/E,GAAYH,GAC9EuqB,EAAgBhnD,SAAS4D,cAAc,QAC7CojD,EAAcx9C,MAAMw9B,WAAa,OACjCggB,EAAc7kD,UAAYm6B,GAAgByqB,EAC1CC,EAAcjiD,YAAc,GAA0B,GAAjB4hB,KAAKgb,UAAiB,GAAK,KAChEhC,EAAQljB,YACN+lC,GAAa,QAAS,iDAAkDwE,IAE1E,MAAMC,EAAoB,GAW1B,OAVA/hD,OAAO6C,KAAK,IAAqB+e,SAASplB,IACnCilB,KAAKsvB,YAAY,GAAoBv0C,KACxCulD,EAAkBzjD,KAAK,GAAoB9B,GAC7C,IAE+B,IAA7BulD,EAAkBtlD,QACpBg+B,EAAQljB,YACN+lC,GAAa,QAAS,kCAAmCI,GAAcqE,KAGpEtnB,CACT,CD9bwB,KAItBujB,EAAMzmC,YAAY,GAA2B,WAAY,aACrDkK,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBlH,QAAQ89B,UACrEhE,EAAMzmC,YC8bH,WACL,MAAMkjB,EAAU3/B,SAAS4D,cAAc,OACvC+7B,EAAQx9B,UAAY,yBAEpB,MAAMglD,EAAkBr9C,KAAKgE,MAC3B6Y,KAAK6xB,gBACH3iB,GACElP,KAAK8xB,aACLlkB,IACC5N,KAAKsvB,YAAY,mBAAqBtvB,KAAKmsB,IAAI,iBAAmB5e,GAAkB,KAG3FyL,EAAQljB,YACN+lC,GACE,cACA,6BACAxiD,SAASwf,eAAe,GAAG,GAASmH,KAAKggB,eAAe,GAASwgB,MACjE,+BAIJ,MAAMC,EAAat9C,KAAK2D,IACtB,EACAkZ,KAAK0gC,oBAAoBF,EAAkB,IACxCtxB,GACClP,KAAK8xB,aACLlkB,IACE5N,KAAKsvB,YAAY,mBAAqBtvB,KAAKmsB,IAAI,kBAAmB5e,GAChEA,GACA,KAEJozB,EAAkBtnD,SAAS+iD,yBACjCuE,EAAgB7qC,YAAYzc,SAASwf,eAAe,GAAS4nC,KAC7D,MAAMG,EAAmBvnD,SAAS4D,cAAc,SAChD2jD,EAAiBxiD,YAAc,KAAKm8B,GAAWkmB,EAAatxB,GAAuB,MACnFwxB,EAAgB7qC,YAAY8qC,GAC5B5nB,EAAQljB,YACN+lC,GACE,cACA,wBACA8E,EACA,gCAIJ3nB,EAAQljB,YACN+lC,GACE,cACA,6BACAxiD,SAASwf,eACP,GAAG,GAASmH,KAAK6gC,oBAAoB,GACnCL,EAAkBxgC,KAAKggB,SAAWhgB,KAAK6gC,kBAG3C,oCAIJ7nB,EAAQljB,YACN+lC,GACE,QACA,6CACAxiD,SAASwf,eAAe,GAASuU,GAAkB,MAIvD,MAAM0zB,EAAW9rB,OACfhV,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS82B,qBAEtE,IAAKljB,OAAOvZ,MAAMqlC,GAAW,CAC3B,MAAMC,EACJD,EAAW39C,KAAKgE,MAAM6Y,KAAK6xB,gBAAgB7xB,KAAK8xB,aAAe9xB,KAAK2uB,gBAClEoS,EAAoB,IACtB/nB,EAAQljB,YACN+lC,GACE,QACA,iDACAxiD,SAASwf,eAAe,GAASkoC,MAGrC/nB,EAAQljB,YACN+lC,GACE,QACA,mDACAxiD,SAASwf,eAAe0hB,GAAWwmB,EAAoB3zB,OAI/D,CAEA,MAAM4zB,ECpkBO,SAAoBC,GAEjC,IAAIC,EAASlhC,KAAKgb,UAElB2E,KAE2C,IAAvC7P,GAAY,gBAAZ,SACFA,GAAY,wBAAZ,OAA6C,EAC7CA,GAAY,yBAAZ,OAA8C,EAC9CA,GAAY,mBAAZ,OAAwC,EACxCA,GAAY,0BAAZ,OAA+C,EAC/CA,GAAY,gBAAZ,OAAqC,EAErCoR,KAEAggB,EAASl1B,GAET2T,MAGEzQ,IAA0B,KAAS+R,GAAO,aAC1C/R,IAA0B,KAAY+R,GAAO,YAC7C/R,IAA0B,MAAe+R,GAAO,gBAChD/R,IAA0B,MAAkB+R,GAAO,YACnD/R,IAA0B,MAAqB+R,GAAO,iBACtD/R,IAA0B,MAAwB+R,GAAO,kBACzD/R,IAA0B,MAA2B+R,GAAO,iBAC5D/R,IAA0B,MAA8B+R,GAAO,cAC/D/R,IAA0B,MAAiC+R,GAAO,iBAClE/R,IAA0B,MAAoC+R,GAAO,uBACrE/R,IAA0B,MAAuC+R,GAAO,mBACxE/R,IAA0B,MAC5B+R,GAAO,uBACL/R,IAA0B,MAC5B+R,GAAO,wBACL/R,IAA0B,MAC5B+R,GAAO,mBACL/R,IAA0B,MAC5B+R,GAAO,WACL/R,IAA0B,MAC5B+R,GAAO,iBACL/R,IAA0B,MAC5B+R,GAAO,iCAETnR,GAAY,wBAAZ,OAA6C,EAC7CA,GAAY,yBAAZ,OAA8C,EAC9CA,GAAY,mBAAZ,OAAwC,EACxCA,GAAY,0BAAZ,OAA+C,EAC/CA,GAAY,gBAAZ,OAAqC,EAErCtE,GAAcy1B,EAEd,MAAM3c,EAAwBhZ,GAE9B4V,KAEAqC,KAEIe,IAA0BhZ,IAC5B4V,KAGF,MAAMigB,EAAWn1B,GAAek1B,EAKhC,OAFA11B,GAAcxL,KAAKggB,SAEZmhB,CACT,CDggBqBC,CAAWZ,GACxBa,EAAYhoD,SAAS+iD,yBAC3BiF,EAAUvrC,YAAYzc,SAASwf,eAAe,GAASmoC,KACvD,MAAM9b,EAAW/hC,KAAKC,MAAO49C,EAAahhC,KAAKgb,UAAa,KAC5D,GAAIhG,OAAOC,SAASiQ,IAA0B,IAAbA,EAAgB,CAC/C,MAAMoc,EAAajoD,SAAS4D,cAAc,SAC1CqkD,EAAWljD,YAAc,KAAK8mC,EAAW,kBACzCmc,EAAUvrC,YAAYwrC,EACxB,CACAtoB,EAAQljB,YACN+lC,GAAa,cAAe,qBAAsBwF,EAAW,4BAG/D,MAAME,EAAkBp+C,KAAKgE,MAAM6Y,KAAK6xB,gBAAgB7xB,KAAK8xB,eACvD0P,EAAWr+C,KAAKgE,MAAM6Y,KAAK6xB,gBAAgB7xB,KAAK8xB,aAAe9xB,KAAK2uB,gBACpE8S,EAAUD,EAAWD,GACrB,WAAEG,EAAU,YAAEC,EAAW,YAAEC,GJjkBpB,SAA8BC,GAC3C,MAAMjR,EAAS,CAAC,EAChB,IAAIkR,EAAa3G,GAAY0G,GAC7B,MAAME,EAAiB1G,OAAOwG,GAAc7mD,OAE5C,GAAI8mD,GAAc,IAChBlR,EAAO8Q,WAAaG,EAChBC,GAAc,IAChBlR,EAAO+Q,YAAcE,EACjBC,GAAc,IAEhB,OADAlR,EAAOgR,YAAcC,EACdjR,EAMb,IAAIoR,EAsBJ,GApBEA,EADED,GAAkB,GACP5+C,KAAKiL,KAAKyzC,EAAe,KAAOE,EAAiB,KAEjDF,EAEfC,EAAa3G,GAAY6G,QAEC7mD,IAAtBy1C,EAAO8Q,aACLI,EAAa,IAGfE,GAFc1G,GAAoB0G,EAAY,GAG9CF,EAAa3G,GAAY6G,IAG3BpR,EAAO8Q,WAAaM,EAChBD,GAAkB,KACpBnR,EAAO8Q,YAAc,IAAM1sB,OAAO+sB,EAAiB,WAI5B5mD,IAAvBy1C,EAAO+Q,YAA2B,CACpC,KAAOG,EAAa,GAAG,CACrB,IAAIxZ,EAAQgT,GAAoB0G,EAAY,GAC9B,IAAV1Z,IAAaA,EAAQgT,GAAoB0G,EAAY,KAEzDA,GAAc1Z,EACdwZ,EAAa3G,GAAY6G,EAC3B,CAEApR,EAAO+Q,YAAcK,EACjBD,GAAkB,KACpBnR,EAAO+Q,aAAe,IAAM3sB,OAAO+sB,EAAiB,IAExD,CAEA,IAAIxG,EAAa,EACjB,KAAOuG,EAAa,GAAG,CACrB,MAAMxZ,EAAQgT,GAAoB0G,EAAYzG,GAChC,IAAVjT,EACFiT,GAAc,IAEdyG,GAAc1Z,EACdwZ,EAAa3G,GAAY6G,GAE7B,CAOA,OALApR,EAAOgR,YAAcI,EACjBD,GAAkB,KACpBnR,EAAOgR,aAAe,IAAM5sB,OAAO+sB,EAAiB,KAG/CnR,CACT,CI0fmDqR,CAAqBT,GACtE,IAAKxhC,KAAKmsB,IAAI,eAAgB,CAC5B,MAAM+V,EAAkBR,EAAaF,EAC/BW,EAAkBV,EAAUS,EAC5BE,EAAiB/oD,SAAS+iD,yBAChCgG,EAAetsC,YACbzc,SAASwf,eACP,GAAG6oC,EAAWrsB,sBAAsB8sB,EAAgB9sB,sBAAsB6sB,OAG9ElpB,EAAQljB,YACN+lC,GAAa,QAAS,qCAAsCuG,GAEhE,CAEA,IAAKpiC,KAAKmsB,IAAI,gBAAiB,CAC7B,MAAMkW,EAAmBV,EAAcH,EACjCc,EAAmBb,EAAUY,EAC7BE,EAAkBlpD,SAAS+iD,yBACjCmG,EAAgBzsC,YACdzc,SAASwf,eACP,GAAG8oC,EAAYtsB,sBAAsBitB,EAAiBjtB,sBAAsBgtB,OAGhFrpB,EAAQljB,YACN+lC,GAAa,QAAS,sCAAuC0G,GAEjE,CAEA,IAAKviC,KAAKmsB,IAAI,gBAAiB,CAC7B,MAAMqW,EAAmBZ,EAAcJ,EACjCiB,EAAmBhB,EAAUe,EAC7BE,EAAkBrpD,SAAS+iD,yBACjCsG,EAAgB5sC,YACdzc,SAASwf,eACP,GAAG+oC,EAAYvsB,sBAAsBotB,EAAiBptB,sBAAsBmtB,OAGhFxpB,EAAQljB,YACN+lC,GAAa,QAAS,sCAAuC6G,GAEjE,CAEA,OAAO1pB,CACT,CDplBsB,IAGhBhZ,KAAKib,UAAY,IACnBshB,EAAMzmC,YAAY,GAA2B,YAAa,UACtDkK,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBlH,QAAQkgC,OAAO,CAC5E,MAAMC,EAAavpD,SAAS+iD,yBAC5BwG,EAAW9sC,YACTzc,SAASwf,eACP,GAAG,GAAS+U,SAA0B,GAASC,SAGnD,MAAMg1B,EAAUxpD,SAAS4D,cAAc,KACvC4lD,EAAQzkD,YAAc,iBACtBykD,EAAQrnD,UAAY,SACpBqnD,EAAQxiC,QAAU,WAChBozB,IACF,EACAmP,EAAW9sC,YAAY+sC,GACvBtG,EAAMzmC,YACJ,GAA4B,QAAS,kCAAmC8sC,IAE1E,MAAME,EAAiBzpD,SAAS+iD,yBAChC0G,EAAehtC,YAAYzc,SAASwf,eAAe,GAAG,GAASiV,GAAsB,SACrF,MAAMi1B,EAAc1pD,SAAS4D,cAAc,KAC3C8lD,EAAY3kD,YAAc,qBAC1B2kD,EAAYvnD,UAAY,SACxBunD,EAAY1iC,QAAU,WACa,OAA7ByN,GAAsB,KAAa9N,KAAKkb,UAAUpN,GAAsB,IAAI4lB,GAAK,EACvF,EACAoP,EAAehtC,YAAYitC,GAC3BxG,EAAMzmC,YACJ,GACE,QACA,6DAC+B,OAA7BgY,GAAsB,GAAcA,GAAsB,GAAK,UAEjEg1B,GAGN,CA0BF,GAvBAvG,EAAMzmC,YC+iBD,WACL,MAAMkjB,EAAU3/B,SAAS4D,cAAc,OACvC+7B,EAAQx9B,UAAY,uBAEpB,IAAIwnD,GAAW,EACf,MAAMC,EAA0B,GAChC1kD,OAAO6C,KAAK,IAAuB+e,SAASplB,IACrCilB,KAAKmsB,IAAI,GAAsBpxC,MAClCkoD,EAAwBpmD,KAAK,GAAsB9B,IACnDioD,GAAW,EACb,IAEF,MAAME,EAA0B,GAChC3kD,OAAO6C,KAAK,IAAwB+e,SAASplB,IACtCilB,KAAKmsB,IAAI,GAAuBpxC,MACnCmoD,EAAwBrmD,KAAK,GAAuB9B,IACpDioD,GAAW,EACb,IAEF,MAAMG,EAA0B,GAChC5kD,OAAO6C,KAAK,IAAqB+e,SAASplB,IACnCilB,KAAKmsB,IAAI,GAAoBpxC,MAChCooD,EAAwBtmD,KAAK,GAAoB9B,IACjDioD,GAAW,EACb,IAEF,MAAMI,EAAoB,GAC1B7kD,OAAO6C,KAAK4e,KAAKqjC,UAAUljC,SAASplB,IAC7BilB,KAAKsvB,YAAYtvB,KAAKqjC,SAAStoD,MAClCqoD,EAAkBvmD,KAAKmjB,KAAKqjC,SAAStoD,IACrCioD,GAAW,EACb,IAEF,MAAMM,EAAkB,GACxB/kD,OAAO6C,KAAK4e,KAAKujC,cAAcpjC,SAASplB,IACjCilB,KAAKsvB,YAAYtvB,KAAKujC,aAAaxoD,MACtCuoD,EAAgBzmD,KAAKmjB,KAAKujC,aAAaxoD,IACvCioD,GAAW,EACb,IAEF,MAAM3T,EAASrvB,KAAKsvB,YAAY,mBAAqBtvB,KAAKmsB,IAAI,iBACxDqX,EAAUxjC,KAAKmsB,IAAI,eAEzB,IAAoB,cAAhBnsB,KAAKusB,QAA0ByW,GAAY3T,GAAUmU,KACvDxqB,EAAQljB,YAAY2lC,GAAY,kBAAmB,QAC/Cz7B,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBlH,QAAQghC,KAAK,CAC1E,GAAuC,IAAnCR,EAAwBjoD,OAAc,CACxCg+B,EAAQljB,YACNimC,GACE,EACA,gCACAE,GAAcgH,GACE,cAAhBjjC,KAAKusB,SAGT,IAAImX,EAAoB,IAIxB,GAHI1jC,KAAKolB,UAAU,oBAAmBse,EAAoB,IACtD1jC,KAAKmsB,IAAI,gBAAeuX,GAAqB,IACjDA,GAAqB,EAAI1jC,KAAK2jC,eAC1B3jC,KAAKiR,OAAQ,CACf,MAAMa,EAAS9R,KAAKiR,OAAO,WACZ,IAAXa,EAAc4xB,GAAqB,GACnB,IAAX5xB,EAAc4xB,GAAqB,IACxB,IAAX5xB,IAAc4xB,GAAqB,IAC9C,CACA,MAAME,EAAwBX,EAAwBjoD,OAAS,EAC/Dg+B,EAAQljB,YACNimC,GACE,EACA,4DACA1iD,SAASwf,eACP,GAAG,IAAU,EAAI6qC,GAAqBE,EAAwB,WAAW,IACtE,EAAwB,GAApBF,GAA2BE,EAAwB,SAG5C,cAAhB5jC,KAAKusB,QAGX,CACA,GAAuC,IAAnC2W,EAAwBloD,OAAc,CACxCg+B,EAAQljB,YACNimC,GACE,EACA,gCACAE,GAAciH,GACE,cAAhBljC,KAAKusB,SAGT,IAAIsX,EAAoB,GAIxB,GAHI7jC,KAAKolB,UAAU,iBAAgBye,EAAoB,IACvDA,GAAqB,EAAI7jC,KAAK2jC,eAC1B3jC,KAAKmsB,IAAI,cAAa0X,GAAqB,KAC3C7jC,KAAKiR,OAAQ,CACf,MAAMa,EAAS9R,KAAKiR,OAAO,WACZ,IAAXa,EAAc+xB,GAAqB,GACnB,IAAX/xB,EAAc+xB,GAAqB,IACxB,IAAX/xB,IAAc+xB,GAAqB,IAC9C,CACA,MAAMD,EAAwBV,EAAwBloD,OAAS,EAC/Dg+B,EAAQljB,YACNimC,GACE,EACA,6CACA1iD,SAASwf,eACP,GAAG,IAAU,EAAIgrC,GAAqBD,EAAwB,SAEhD,cAAhB5jC,KAAKusB,QAGX,CACuC,IAAnC4W,EAAwBnoD,QAC1Bg+B,EAAQljB,YACNimC,GACE,EACA,gCACAE,GAAckH,GACE,eAAhBnjC,KAAKusB,SAIX,MAAMuX,EAAc,SAAUC,GAC5B,IAAIC,EAAcD,GAAoB,EAAI/jC,KAAK2jC,gBAI/C,GAHI3jC,KAAKolB,UAAU,0BAAyB4e,GAAe,IACvDhkC,KAAKmsB,IAAI,cAAa6X,GAAe,IACrChkC,KAAKmsB,IAAI,eAAc6X,GAAe,IACtChkC,KAAKiR,OAAQ,CACf,MAAMa,EAAS9R,KAAKiR,OAAO,WACZ,IAAXa,EAAckyB,GAAe,GACb,IAAXlyB,EAAckyB,GAAe,IAClB,IAAXlyB,IAAckyB,GAAe,IACxC,CAEA,MAAMC,EAAgB,EAAID,EACpBE,EAAelkC,KAAKqjC,SAASroD,OAASooD,EAAkBpoD,OACxDmpD,EAAmBnkC,KAAKujC,aAAavoD,OAASsoD,EAAgBtoD,OAC9DopD,EAA2B,GAAhBH,GAAuB,EAAIC,EAAelkC,KAAKqjC,SAASroD,QACnEqpD,EAAyB,GAAhBJ,GAAuB,EAAIE,EAAmBnkC,KAAKujC,aAAavoD,QAGzEspD,EAFgC,GAAhBL,GAAuBC,EAAelkC,KAAKqjC,SAASroD,QACtC,GAAhBipD,GAAuBE,EAAmBnkC,KAAKujC,aAAavoD,QAIhF,MAAO,CAACopD,EAFmB,GAAVE,GAAiB,EAAIJ,EAAelkC,KAAKqjC,SAASroD,QAEtCqpD,EADJ,GAAVC,GAAiB,EAAIH,EAAmBnkC,KAAKujC,aAAavoD,QAE3E,EACiC,IAA7BooD,EAAkBpoD,SACpBg+B,EAAQljB,YACNimC,GACE,EACA,oCACAE,GAAcmH,GACE,WAAhBpjC,KAAKusB,SAGTvT,EAAQljB,YACNimC,GACE,EACA,yDACA1iD,SAASwf,eACP,GAAG,GAAgC,IAAvBirC,EAAY,KAAM,UAAgB,GAA+B,IAAtBA,EAAY,IAAK,QAE1D,WAAhB9jC,KAAKusB,UAIoB,IAA3B+W,EAAgBtoD,SAClBg+B,EAAQljB,YACNimC,GACE,EACA,kCACAE,GAAcqH,GACE,WAAhBtjC,KAAKusB,SAGTvT,EAAQljB,YACNimC,GACE,EACA,6DACA1iD,SAASwf,eACP,GAAG,GAAgC,IAAvBirC,EAAY,KAAM,UAAgB,GAA+B,IAAtBA,EAAY,IAAK,QAE1D,WAAhB9jC,KAAKusB,UAKS,cAAhBvsB,KAAKusB,QACPvT,EAAQljB,YACNimC,GACE,EACA,kBACA1iD,SAASwf,eAAe,GAASyU,MACjC,IAGF+hB,GACFrW,EAAQljB,YACN+lC,GACE,cACA,wBACAxiD,SAASwf,eAAe,GAAS0U,KACjC,6BAIFi2B,GACFxqB,EAAQljB,YACN+lC,GACE,QACA,yBACAxiD,SAASwf,eAAkB1V,KAAKC,MAA2B,KAApBiqB,GAAe,IAAc,IAA5C,MAIhC,CAEF,OAAO2L,CACT,CDvwBoB,IAElBujB,EAAMzmC,YAAY,GAA2B,eAAgB,YACzDkK,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBlH,QAAQ8hC,SACrEhmD,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IACjC,MAAMwqC,EAAkB5X,GAA4B5yB,GACpDwhD,EAAMzmC,YACJ,GACE,QACA/a,EACAwqC,EAAgB7M,aAAe,IAC3Br/B,SAASwf,eACP,uBAAuB0sB,EAAgB7M,wBAAwB,GAC7D6M,EAAgB9T,UAGpBp4B,SAASwf,eAAe,8CAE/B,IAIL0jC,EAAMzmC,YAAY,GAA2B,gBAAiB,SAC1DkK,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBlH,QAAQ+hC,KAAM,CA+D3E,GA9DAjI,EAAMzmC,YACJ,GACE,QACA,oCACEmhB,GACEjX,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASguB,YAClE,GACA,GACEnY,GACEjX,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASguB,sBAGxEnY,GACEjX,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASguB,YAEpE,IACkF,IAAnFpvB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASguB,WACjE,UACA,eAEV/1C,SAASwf,eAAe,GAASgiB,KAAU,MAG/C0hB,EAAMzmC,YACJ,GACE,QACA,0CACEohB,GACElX,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmuB,iBAGgB,IAAtFvvB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmuB,cAChE,UACA,cAENl2C,SAASwf,eAAe,GAASqV,GAAoB,MAGzDquB,EAAMzmC,YACJ,GACE,QACA,+BACEohB,GACElX,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmuB,iBAGgB,IAAtFvvB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmuB,cAChE,UACA,cAENl2C,SAASwf,eACP,GACEiR,EAA8BmkB,QAC5B/f,GACEgJ,GACElX,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmuB,oBAO9EvvB,KAAKmsB,IAAI,mBAAoB,CAC/B,MAAMjI,EAAW,GACjB3lC,OAAO6C,KAAK,IAAmB+e,SAASplB,IACjCilB,KAAKmsB,IAAI,GAAkBpxC,KAC9BmpC,EAASrnC,KAAK,GAAkB9B,GAClC,IAEsB,IAApBmpC,EAASlpC,QACXuhD,EAAMzmC,YACJ,GACE,QACA,+BACA,GAA6BouB,IAGrC,CAUA,GATIlkB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS+2B,cACtEoE,EAAMzmC,YACJ,GACE,QACA,wBACAzc,SAASwf,eAAe,GAASmH,KAAKykC,uBAIxCzkC,KAAKqrB,MAAMC,SAAU,CACvB,MAAM1P,EAAQviC,SAAS4D,cAAc,QACrC2+B,EAAMxb,GAAK,uBACXwb,EAAMhV,UAAY5G,KAAKyrB,QACV,GAAXzrB,KAAKwB,KAAYxB,KAAKgsB,SAAW,EAAIhsB,KAAK0rB,GAAgB,GAAX1rB,KAAKwB,MACpD,GAEF+6B,EAAMzmC,YAAY,GAA4B,QAAS,qBAAsB8lB,GAC/E,CACF,CAEA/vB,EAAE,QAAQ6X,aAAa64B,EAAO1wC,EAAE,QAAQmuB,WAAW,IAE/Cha,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS42B,iB7BpNxEnsC,EAAE,QAAQmuB,WAAW7Z,SAASukC,IAC5B,GAAIA,EAAYnkC,SAAS,GACvB,GAA0C,aAAtCmkC,EAAYnkC,SAAS,GAAG7I,WAA4B0W,GAA8B,CACpF,MAAMu2B,EACJv2B,GAA6B3yB,MAAM,IAAIZ,OAAO,MAAO,MAAQ,GAAIG,OAAS,EACtEwsB,EAAQnuB,SAAS4D,cAAc,OACrCuqB,EAAMpH,GAAK,iCACXoH,EAAMhsB,UAAY,UAClB,MAAMopD,EAAYvrD,SAAS4D,cAAc,OACzC2nD,EAAUltC,UAAY,qCAAqCitC,KACzD3kC,KAAK6kC,iBAAiB7pD,WACnBmI,KAAKgE,MAAOw9C,EAA0B3kC,KAAK6kC,iBAAiB7pD,OAAU,SAC3EwsB,EAAM1R,YAAY8uC,GAClBF,EAAY5uC,YAAY0R,GACxB,MAAMqb,EAAWxpC,SAAS4D,cAAc,OACxC4lC,EAASrnC,UAAY,mBACrBqnC,EAASnrB,UAAY0W,GACrBs2B,EAAY5uC,YAAY+sB,EAC1B,MAAO,GAA0C,aAAtC6hB,EAAYnkC,SAAS,GAAG7I,UAA0B,CAC3D,GAAIyW,GAAsB,CACxB,MAAM22B,EACJ32B,GAAqB1yB,MAAM,IAAIZ,OAAO,MAAO,MAAQ,GAAIG,OAAS,EAC9DwsB,EAAQnuB,SAAS4D,cAAc,OACrCuqB,EAAMpH,GAAK,yBACXoH,EAAMhsB,UAAY,UAClB,MAAMopD,EAAYvrD,SAAS4D,cAAc,OACzC2nD,EAAUltC,UAAY,mCAAmCotC,KACvD9kC,KAAKgf,eAAe,IAAIhkC,OAASglB,KAAKgf,eAAe+lB,KAAK/pD,WACvDmI,KAAKgE,MACP29C,GACE9kC,KAAKgf,eAAe,IAAIhkC,OAASglB,KAAKgf,eAAe+lB,KAAK/pD,QAC3D,SAEJwsB,EAAM1R,YAAY8uC,GAClBF,EAAYhhC,aAAa8D,EAAOk9B,EAAY1qB,WAAW,IACvD,MAAM6I,EAAWxpC,SAAS4D,cAAc,OACxC4lC,EAASrnC,UAAY,mBACrBqnC,EAASnrB,UAAYyW,GACrBu2B,EAAYhhC,aACVmf,EACAxpC,SAASkrB,eAAe,0BAA0BygC,YAEtD,CACA,GAAI32B,GAA6B,CAC/B,MAAM42B,EACJ52B,GAA4B5yB,MAAM,IAAIZ,OAAO,MAAO,MAAQ,GAAIG,OAAS,EACrEwsB,EAAQnuB,SAAS4D,cAAc,OACrCuqB,EAAMpH,GAAK,gCACXoH,EAAMhsB,UAAY,UAClB,MAAMopD,EAAYvrD,SAAS4D,cAAc,OACzC2nD,EAAUltC,UAAY,mCAAmCutC,KACvDjlC,KAAKgf,eAAekmB,OAAOlqD,WACxBmI,KAAKgE,MAAO89C,EAAwBjlC,KAAKgf,eAAekmB,OAAOlqD,OAAU,SAC9EwsB,EAAM1R,YAAY8uC,GAClBF,EAAY5uC,YAAY0R,GACxB,MAAMqb,EAAWxpC,SAAS4D,cAAc,OACxC4lC,EAASrnC,UAAY,mBACrBqnC,EAASnrB,UAAY2W,GACrBq2B,EAAY5uC,YAAY+sB,EAC1B,CACF,CACF,I6B0JE7iB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS62B,qBGvL3D,WACb,IAAIkN,EACJ5mD,OAAOu6B,OAAOz/B,SAASsB,iBAAiB,cAAcwlB,SAASplB,IACzDA,EAAEqD,YAAYuoB,SAAS,kBACzBw+B,EAAUpqD,EAAEqqD,cAAczqD,iBAAiB,wBAAwB,GACrE,IAEEqlB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS62B,qBACtE15C,OAAOu6B,OAAOqsB,EAAQ5kC,UAAUJ,SAASklC,IACvC,IAAKA,EAAa7pD,UAAUmrB,SAAS,WAAY,CAC/C,MAAMvG,EAAKilC,EAAahlC,QAAQhd,WAAW5B,MAAM,cAAc,IACzD,KAAE4wC,GAASryB,KAAKslC,iBAAiBllC,GAEvCilC,EAAaxiD,MAAMuV,mBAAqB,GAAc,IAAVi6B,EAAK,QAAwB,IAAVA,EAAK,OAEpEgT,EAAar+B,YAAc,WACpBhH,KAAKulC,YACRvlC,KAAKwlC,WAAW/rD,MAChBumB,KAAKiH,QAAQ+tB,QAAU,EACvBh1B,KAAKiH,QAAQhV,KACXxY,MACA,IAjEd,SAAwCogC,GACtC,MAAM4rB,EAAO,GACG,WAAZ5rB,EAAGjJ,KAAmB60B,EAAK5oD,KAAK,qBAAsB,WACrD4oD,EAAK5oD,KAAK,cAAe,GAC9B4oD,EAAK5oD,KAAK,SAAU,GAEpB,IAAI6oD,EAAa,GACb1lC,KAAKmsB,IAAI,eAAkBnsB,KAAK2lC,QAAsB,UAAZ9rB,EAAGjJ,QAAmB80B,EAAa,GAC7EA,GAAyB,IAAX7rB,EAAGsG,IAAWslB,EAAK5oD,KAAK,gBAAiB,WAClD6oD,GAAc7rB,EAAGsG,IAAM,GAAGslB,EAAK5oD,KAAK,iBAAkB,WAE/D,IAAI,KAAEw1C,GAASxY,EACXA,EAAGyY,eAAcD,EAAOxY,EAAGyY,gBAE/B,IAAI,KAAE/qB,GAASsS,EACXA,EAAG+rB,WAAUr+B,EAAOsS,EAAG+rB,SAAS,UAEpC,IAAIC,EAAU,GACd,IAAK,IAAI9qD,EAAI,EAAGA,EAAI0qD,EAAKzqD,OAAQD,GAAK,EAChCA,EAAI,GAAM,IACZ8qD,GAAW,kCAAkD,IAAhBJ,EAAK1qD,EAAI,GAAW,OAAS0qD,EAAK1qD,EAAI,SACjF0qD,EAAK1qD,aAKX,OAFA8qD,EAAUA,EAAQ3pB,UAAU,GAErB,yJAEM,IAAVmW,EAAK,QACS,IAAVA,EAAK,sCACQxY,EAAGv6B,iBACrBumD,qDAA2Dt+B,oBAE3DvH,KAAK2lC,OACD,oCAAoC9rB,EAAGzZ,gBAAgBjd,KAAKgE,MAAM0yB,EAAGS,SACnET,EAAGhJ,KAAO,aAAagJ,EAAGhJ,OAAS,WAErC,IAER,CA4ByBi1B,CAA+B9lC,KAAKslC,iBAAiBllC,KAEhE,OAEFJ,KAAKiH,QAAQguB,SAEjB,CACF,IAGN,CHuJI8Q,EAEJ,CIjOe,SAASC,GAAU5lD,GAChC,GACmF,IAAjF4f,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS8b,UACgB,IAApFld,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS+b,YACpE,CACA,MAAM8oB,EAAiBz+C,SAASqE,EAAE,cAAchJ,MAAMiG,OAAQ,IAC9DkX,KAAKkmC,QAAUD,EACf7lD,IACA4f,KAAKkmC,QAAUD,CACjB,MACE7lD,GAEJ,CCKe,SAAS+lD,KAEtB/xB,GAAgBW,SAAWA,SAE3BA,SAAW,GAEXX,GAAgB8M,eAAiBlhB,KAAKkhB,eACtClhB,KAAKkhB,eAAiB,WACpB9M,GAAgB8M,iBAChBpV,GAAY,EACZuI,GAAyBC,KAAKC,MAC9BC,GAAyBF,KAAKC,KAChC,EAEAH,GAAgBnN,QAAU,CAAC,EAC3BmN,GAAgBnN,QAAQhV,KAAO+N,KAAKiH,QAAQhV,KAC5CmiB,GAAgBnN,QAAQm/B,QAAU,IAAI5pD,SACpC,UAAUwjB,KAAKiH,QAAQhV,KAAK5O,WAAW5B,MAAM,QAAQ6C,KAAK,kBAD1B,GAGlC0b,KAAKiH,QAAQhV,KAAO,SAAUo0C,EAAMx9B,EAAMzL,GACxCgX,GAAgBnN,QAAQm/B,QAAQC,EAAMx9B,EAAMzL,EAC9C,EAEAgX,GAAgBnN,QAAQq/B,OAAStmC,KAAKiH,QAAQq/B,OAC9ClyB,GAAgBnN,QAAQs/B,UAAY,IAAI/pD,SACtC,UAAUwjB,KAAKiH,QAAQq/B,OAAOjjD,WAAW5B,MAAM,SAAS6C,KAAK,mBAD3B,GAGpC0b,KAAKiH,QAAQq/B,OAAS,WACpBlyB,GAAgBnN,QAAQs/B,YC9Cb,WACb,GAA4B,UAAxBvmC,KAAKiH,QAAQ7J,OAAoB,CACnC,IAAIopC,EAAa,EAEuE,IAAtFxmC,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASupB,eACgB,IAApF3qB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASyjB,aAChC,OAApCh5B,EAAE,gCAEF26C,EAAa36C,EAAE,8BAA8BnF,aAAe,GAE9DsZ,KAAKiH,QAAQw/B,IAAI5jD,MAAMoC,IAAM,GAAG9B,KAAKyD,IACnCY,SAASwY,KAAKiH,QAAQw/B,IAAI5jD,MAAMoC,IAAK,IACrC4G,EAAE,QAAQnF,aACRmF,EAAE,UAAUnF,aACZsZ,KAAKiH,QAAQy/B,GAAGhgD,aAChB8/C,EACA,OAEN,CAKF,CDwBIG,EACF,EAEAvyB,GAAgBwyB,gBAAkB5mC,KAAK4mC,gBACvC5mC,KAAK4mC,gBAAkB,WACrBZ,GAAU5xB,GAAgBwyB,gBAC5B,EAEAxyB,GAAgByyB,cAAgB7mC,KAAK6mC,cACrC7mC,KAAK6mC,cAAgB,WACnBb,GAAU5xB,GAAgByyB,cAC5B,EAGAh7C,EAAE,aAAanN,oBAAoB,QAASshB,KAAK8mC,aAAa,GAC9Dj7C,EAAE,aAAa1R,iBACb,SACCmuB,IACC09B,IAAU,IAAMhmC,KAAK8mC,YAAYx+B,EAAO,IAAG,IAE7C,GAGF8L,GAAgBojB,gBAAkBx3B,KAAKw3B,gBACvCx3B,KAAKw3B,gBAAkB,WACrBpjB,GAAgBojB,kBEnElBrjB,GAAuB,GACvB51B,OAAO6C,KAAK4e,KAAK4Z,iBAAiBzZ,SAASplB,IACJ,OAAjC8Q,EAAE,UAAU9Q,KAAKisB,cACnBmN,GAAqBp5B,GAAK8Q,EAAE,UAAU9Q,KAAKisB,YAC3Cnb,EAAE,UAAU9Q,KAAKisB,YAAc,WACxBhH,KAAKulC,YACRvlC,KAAKwlC,WAAW/rD,MAChBumB,KAAKiH,QAAQ+tB,QAAU,EACvBh1B,KAAKiH,QAAQhV,KAAKxY,MAAM,IAAMk6C,GAAc,IAAK,GAAG54C,MAAM,SAC1DilB,KAAKiH,QAAQguB,SAEjB,EACF,IFyDAj1B,KAAKkhB,gBACP,EAEA9M,GAAgB2yB,aAAe/mC,KAAK+mC,aAKpC/mC,KAAK+mC,aAAe,SAAU92B,KAEzBjQ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASy5B,cACrE76B,KAAK6jB,YAAY5T,GAAM0M,WAAa3c,KAAK4c,UACvB,IAAlB5c,KAAKkY,UAEL9D,GAAgB2yB,aAAa92B,EAEjC,EAEAmE,GAAgB4yB,mBAAqBhnC,KAAKgnC,mBAM1ChnC,KAAKgnC,mBAAqB,SAAUC,GAClC7yB,GAAgB4yB,mBAAmBC,GG3FhC,SAAqBA,GAC1B,GAA2F,IAAvFjnC,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASw2B,eAAsB,CAC5F,MAAOsP,EAAUC,GCKN,SAA6BF,GAC1CtnB,KAGwB9zB,EAAE,iBAAiB0U,SAAS,GAAG7I,UAAUiP,SAAS,aACrD+E,GAAiBu7B,EACjCx7B,GAAgBw7B,EAGrB,IAAIx1B,EAAQ,EACZ,GAAIhG,KAAkBS,IAAmBR,KAAmBS,GAC1D,IAAK,IAAIpxB,EAAIilB,KAAK6jB,YAAY7oC,OAAS,EAAGD,GAAK,IAAKA,EAClD,GAAIilB,KAAK6jB,YAAY9oC,GAAGo3B,OAAS,EAAG,CAClC,MAAMi1B,EAAkBv3B,GAAW7P,KAAK6jB,YAAY9oC,GAAGuE,MAAMA,KAC7DuwB,GAAWu3B,GAAiBj1B,QAAU,EACtChH,GAAqB,EACrBsG,EACE5B,GAAWu3B,GAAiBn1B,UAC5BjS,KAAK0S,eACHvvB,KAAK2D,IAAI,EAAG+oB,GAAWu3B,GAAiBj1B,OAAS,EAAItC,GAAWu3B,GAAiBl1B,MACrFT,EAAQzR,KAAK2S,oBAAoB9C,GAAWu3B,GAAkB31B,GAC9DA,EAAQtuB,KAAKiL,KAAKqjB,GAClB,KACF,CAIJ,MAAM6S,EAAwBhZ,GAO9B,OANA4V,KAEAqC,KACIe,IAA0BhZ,IAC5B4V,KAEK,CAAClV,GAAehM,KAAKgb,UAAWvJ,EACzC,CDxCsC41B,CAAoBJ,GAChDK,EAAgB/sB,GAAW4sB,GAAiBD,EAAWlnC,KAAKgb,YAClE,IAAIusB,EACsBA,EAAH,IAAnBvnC,KAAKgb,UAAsC,GAASnG,KAC9B,GAAUqyB,EAAWlnC,KAAKgb,UAAa,KAEjEnvB,EAAE,kBAAkBhJ,MAAMq2B,UAAY,OACtCrtB,EAAE,kBAAkBhJ,MAAM04B,OAAS,MACnC1vB,EAAE,kBAAkBiK,YAAYzc,SAAS4D,cAAc,QAAQzB,UAAY,OAC3E,MAAM+qB,EAAMltB,SAAS4D,cAAc,OACnCspB,EAAI1jB,MAAMqqC,SAAW,QACrB3mB,EAAI1jB,MAAM6V,UAAY,SACtB6N,EAAInoB,YAAc,wCAAwC,GACxD8oD,OACIK,sBACN17C,EAAE,kBAAkBiK,YAAYyQ,GAChC,MAAMihC,EAAOnuD,SAAS4D,cAAc,OACpCuqD,EAAK3kD,MAAMqqC,SAAW,QACtBsa,EAAK3kD,MAAM6V,UAAY,SACvB8uC,EAAKppD,YAAc,gBAAgBkpD,yBACnCz7C,EAAE,kBAAkBiK,YAAY0xC,EAClC,CACF,CHoEIC,CAAYR,EACd,EAEA7yB,GAAgBszB,kBAAoB1nC,KAAK0nC,kBAIzC1nC,KAAK0nC,kBAAoB,SAAUC,GACjCvzB,GAAgBszB,kBAAkBC,GGtE/B,WAEL,GAEwE,QADrE97C,EAAE,gBAAgBrQ,UAAUC,MAAM,aACjCoQ,EAAE,gBAAgB0U,SAAS,GAAG1d,MAAMqB,WAAWzI,MAAM,WAEvD,IAAK,IAAIV,EAAI,EAAGA,EAAI8Q,EAAE,gBAAgBmuB,WAAWh/B,OAAQD,IACL,cAA9C8Q,EAAE,gBAAgBmuB,WAAWj/B,GAAGS,YAClCqQ,EAAE,gBAAgB0U,SAASxlB,GAAGisB,YAAc,WAC1CyuB,KACAz1B,KAAKiH,QAAQ+tB,QAAU,EACvBh1B,KAAKiH,QAAQhV,KACXpG,EAAE,gBACF,mDAAmDwgB,WACnD,QAEFrM,KAAKiH,QAAQguB,QACf,EACAppC,EAAE,gBAAgB0U,SAASxlB,GAAGmsB,WAAa,WACzClH,KAAKiH,QAAQ2gC,WAAa,CAC5B,EAIR,CH+CIC,EACF,EAEAzzB,GAAgBnQ,WAAajE,KAAKiE,WAClCjE,KAAKiE,WAAa,gBACc,IAAnB,iBAAkE,IAAzB,mBAClDmQ,GAAgBnQ,aKjHP,WACb,MAAMuD,EAAQnuB,SAAS4D,cAAc,OACrCuqB,EAAMhsB,UAAY,QAEE,UAAhBwkB,KAAKwD,OACHxD,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASoqB,QACtEhkB,EAAMppB,YAAc,4BACpBk+C,GAAa90B,IAEU,UAAhBxH,KAAKwD,QAEd3X,EAAE,QAAQmuB,WAAW,GAAGtW,aACtBq3B,KACAlvC,EAAE,QAAQmuB,WAAW,GAAGA,WAAWnuB,EAAE,QAAQmuB,WAAW,GAAGA,WAAWh/B,OAAS,GAGrF,CLkGM8sD,GAEJ,EAEA1zB,GAAgBqX,QAAUzrB,KAAKyrB,QAE/B5U,GAAY,SAAU2D,EAAMutB,GAC1B,OAAI/yB,OAAOvZ,MAAM+e,IAASA,GAAQ,EAAUpG,GAAgBqX,QAAQjR,EAAMutB,GACnExtB,GAAWC,EAAOxa,KAAKwB,IAAK,EACrC,EAEA4S,GAAgB4zB,MAAQhoC,KAAKgoC,MAC7BhoC,KAAKgoC,MAAQ,WACX5zB,GAAgB4zB,QAGhB,IAAIxgC,EAAQ,iBACQ,UAAhBxH,KAAKusB,SAAoB/kB,EAAQ,gBAErCuQ,GAAQ,GAAG/X,KAAKgsB,SAAW,cAAgB,KAAK,GAAWhsB,KAAK4c,YAC7C,IAAjB5c,KAAK4c,QAAgB,SAAW,eAC5BpV,IMlIK,WACb,GACExH,KAAKgsB,UACyE,IAA9EhsB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2W,MAEpE1+B,SAASmuB,MAAQuQ,QACZ,GAAkF,IAA9E/X,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2W,MAAa,CAC1F,IAEIkwB,EACAC,EACAC,EAJAC,GAAQ,EACRC,GAAQ,EAORJ,EAFA74B,GACEA,GAA0BwlB,MAClB,KAAKzxC,KAAKiL,KAAKghB,GAA0Bk5B,KAAOtoC,KAAKwB,QAClD,KAAKre,KAAKiL,KAAKghB,GAA0Bk5B,KAAOtoC,KAAKwB,QAC1DxB,KAAKmsB,IAAI,uBAIJ,OAHL,IAAInX,OAAOnpB,EAAE,sBAAsBzN,aAAe,EAAI,IAAM,KAAK+E,KAAKiL,MAC7E4R,KAAKwiB,aAAaC,OAAO4J,QAAUrsB,KAAKwiB,aAAaC,OAAOjI,MAAQxa,KAAKwB,QAI1EiS,KACF20B,GAAQ,EACRF,EAAU,OAGQ,cAAhBloC,KAAKusB,SACP8b,GAAQ,EACkBF,EAAtB30B,GAAgC,KAAKrwB,KAAKiL,KAAKihB,GAAsBi5B,KAAOtoC,KAAKwB,QAEzE,IAAIwT,OAAOnpB,EAAE,uBAAuBzN,aAAe,EAAI,IAAM,KAAK+E,KAAKiL,MAC9E4R,KAAKwiB,aAAagK,SAASH,QAAUrsB,KAAKwiB,aAAagK,SAAShS,MAAQxa,KAAKwB,SAMpF,IAAIrlB,EAAM47B,GACY,MAAlB57B,EAAIsL,OAAO,KACbtL,EAAMA,EAAI+/B,UAAU//B,EAAIosD,YAAY,KAAO,IAE7ClvD,SAASmuB,MAAQ,GAAGygC,GAAWG,EAAQF,EAAU,KAAOG,EAAQF,EAAU,OAAOhsD,GACnF,MAAO,GAAkF,IAA9E6jB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2W,MAAa,CAC1F,IAAI57B,EAAM,GACNqsD,GAAQ,EACRp5B,KACFo5B,GAAQ,EACJp5B,GAA0BwlB,MAC5Bz4C,GAAO,KAAKgH,KAAKiL,KAAKghB,GAA0Bk5B,KAAOtoC,KAAKwB,QACzDrlB,GAAO,KAAKgH,KAAKiL,KAAKghB,GAA0Bk5B,KAAOtoC,KAAKwB,SAE/DiS,KACF+0B,GAAQ,EACRrsD,GAAO,OAEW,cAAhB6jB,KAAKusB,QAA0B/Y,KACjCr3B,GAAO,KAAKgH,KAAKiL,KAAKihB,GAAsBi5B,KAAOtoC,KAAKwB,QACxDgnC,GAAQ,GAENA,IAAOrsD,GAAO,OAClB,IAAIqrB,EAAQ,iBACQ,UAAhBxH,KAAKusB,SAAoB/kB,EAAQ,gBACrCrrB,GAAOqrB,EACPnuB,SAASmuB,MAAQrrB,CACnB,CACF,CNgEIssD,GOlIW,WACb,MAAMC,EAAgBvlD,KAAK2D,IACzB,EACAkZ,KAAK0gC,oBACHv9C,KAAKgE,MAAM6Y,KAAK6xB,gBAAgB7xB,KAAK8xB,aAAe9xB,KAAK2uB,gBAAkB,IAE1E3uB,KAAK2uB,cAAgB3uB,KAAK8xB,eAGzB3P,EAAYniB,KAAKyrB,SAAUnX,KAAKC,MAAQvU,KAAKmiB,WAAa,IAAQniB,KAAKwB,KAAM,GACnF,IAAIrlB,EAAM,kCACM,KAAdgmC,EAAmB,gBAAkBA,yCAGnCniB,KAAKggB,SAAW,IAClB7jC,GAAO,uCAAuC,GAAS6jB,KAAKggB,2BAA2B,GACrFhgB,KAAKggB,6CAIuB7jC,GAA5B6uB,EAAyB,EAAU,6CAC9BA,EAAyB,EAE9B,6GAEK,uCAAuC,GAC5CA,4BACyB,GAASA,sBAA2C,GAC7EA,kCAEJ7uB,GAAO,2CACO,GAASusD,kDAErB1oC,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS22B,oBAChE,oCAAoCzoB,kDAAyE,GAC3GlC,GACA,iDAEF,KAENvhB,EAAE,iBAAiB6L,UAAYvb,CACjC,CP4FIwsD,EACF,CACF,CQzHe,SAASC,KAEtBpvD,OAAO60C,kBAAoB,CAAC,EAK5BruB,KAAKiB,KAAKC,uBAAuBkD,UAAUQ,YAAY/nB,KAAKk+C,IAE5DjG,KACApC,KACAc,KAGAxgB,GAAez0B,OAAO6C,KAAK4e,KAAKiB,MAAMjmB,OCjCtCg5B,GAAU36B,SAAS4D,cAAc,SACjC+2B,GAAQ54B,KAAO,WACf44B,GAAQ5T,GAAK,QAEb/mB,SAASwvD,KAAK/yC,YAAYke,I9FKrB,WACL,MAAMsI,EAASjjC,SAAS4D,cAAc,OACtCq/B,EAAOlc,GAAK,WACZkc,EAAOz5B,MAAMiG,OAAS,OACtBwzB,EAAOz5B,MAAMgG,MAAQ,OACrByzB,EAAOz5B,MAAM8H,SAAW,WACxB2xB,EAAOz5B,MAAM2U,QAAU,OACvB8kB,EAAOz5B,MAAMkU,gBAAkB,UAC/BulB,EAAOz5B,MAAMoV,gBAAkB,+CAC/BqkB,EAAOz5B,MAAMimD,UAAY,kBACzBxsB,EAAOz5B,MAAM0U,SAAW,OACxB+kB,EAAOz5B,MAAMkmD,WAAa,uDAE1B,MAAMC,EAAQ1sB,EAAOxmB,YAAYzc,SAAS4D,cAAc,UACxD+rD,EAAMnmD,MAAMgG,MAAQ,OACpBmgD,EAAMnmD,MAAM6V,UAAY,SACxBswC,EAAMnmD,MAAM0V,WAAa,SACzB,MAAM0wC,EAAQD,EAAMlzC,YAAYzc,SAAS4D,cAAc,UAEjDisD,EAAW,SAAUrgC,EAAMwP,GAC/B,MAAM8wB,EAAK9vD,SAAS4D,cAAc,MAIlC,OAHAksD,EAAGtmD,MAAM6V,UAAY,QACrBywC,EAAG3tD,UAAYm6B,GAAgB0C,EAC/B8wB,EAAG/qD,YAAcyqB,EACVsgC,CACT,EACM/tD,EAAO6tD,EAAMnzC,YAAYzc,SAAS4D,cAAc,OACtD7B,EAAKyH,MAAMw9B,WAAa,OACxBjlC,EAAK0a,YAAYozC,EAAS,cAAsCnzB,KAClDkzB,EAAMnzC,YAAYzc,SAAS4D,cAAc,OACjD6Y,YAAYozC,EAAS,eAAgBrzB,KAChCozB,EAAMnzC,YAAYzc,SAAS4D,cAAc,OACjD6Y,YAAYozC,EAAS,iBAAkBrzB,KAC7BozB,EAAMnzC,YAAYzc,SAAS4D,cAAc,OACjD6Y,YAAYozC,EAAS,YAAarzB,KAEvChqB,EAAE,WAAWiK,YAAYwmB,GAEzB/9B,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IACjC+gC,GAA2B/gC,EAAE,GAEjC,C6FbEquD,G1D5BK,WACL,MAAMlsB,EAAW7jC,SAAS4D,cAAc,OACxCigC,EAAS9c,GAAK,aACd8c,EAASr6B,MAAM8H,SAAW,WAC1BuyB,EAASr6B,MAAM2U,QAAU,OACzB0lB,EAASr6B,MAAMiG,OAAS,MACxBo0B,EAASr6B,MAAMihB,SAAW,OAC1BoZ,EAASr6B,MAAMw9B,WAAa,OAC5BnD,EAASr6B,MAAMkU,gBAAkB,QAGjC,MAAMsyC,EAAqBjuB,GAAY,qBAAsB,WAAY,CACvE,CAAEhb,GAAI,wBAAyBiY,OAAQnC,MAEzCgH,EAASpnB,YAAYuzC,GAGrB,MAAMC,EAAeluB,GAAY,eAAgB,cAAe,CAC9D,CAAEhb,GAAI,qBAAsBiY,OAAQlC,IACpC,CAAE/V,GAAI,kBAAmBiY,OAAQnC,MAEnCgH,EAASpnB,YAAYwzC,GAGrB,MAAMC,EAAgBnuB,GAAY,gBAAiB,gBAAiB,CAClE,CAAEhb,GAAI,sBAAuBiY,OAAQlC,IACrC,CAAE/V,GAAI,mBAAoBiY,OAAQrC,MAEpCkH,EAASpnB,YAAYyzC,GACrB,MAAMC,EAAqBnwD,SAAS4D,cAAc,OAClDusD,EAAmBppC,GAAK,uBACxB8c,EAASpnB,YAAY0zC,GAErB39C,EAAE,WAAWiK,YAAYonB,EAC3B,C0DLEusB,GEQa,WACb,MAAMC,EAAarwD,SAAS4D,cAAc,OAC1CysD,EAAWtpC,GAAK,eAChBspC,EAAW7mD,MAAMgG,MAAQ,OACzB6gD,EAAW7mD,MAAMkU,gBAAkB,QACnC2yC,EAAW7mD,MAAM6V,UAAY,SAC7BgxC,EAAW7mD,MAAMw9B,WAAa,OAC9BqpB,EAAW7mD,MAAM2U,QAAU,OAC3BkyC,EAAW7mD,MAAM+T,OAAS,KAC1B8yC,EAAWxiC,WAAa,WACtBlH,KAAKiH,QAAQxV,MACf,EAEA,MAAMu7B,EAAc3zC,SAAS4D,cAAc,OAC3C+vC,EAAYl3B,YAnDd,WACE,MAAM6zC,EAAStwD,SAAS4D,cAAc,OACtC0sD,EAAO9mD,MAAMqqC,SAAW,QACxByc,EAAO9mD,MAAM29B,aAAe,MAC5B,MAAMhZ,EAAQnuB,SAAS4D,cAAc,OACrCuqB,EAAMhsB,UAAY,OAClBgsB,EAAM3kB,MAAM29B,aAAe,MAC3BhZ,EAAMppB,YAAc,SACpBurD,EAAO7zC,YAAY0R,GAEnB,MAAMoiC,EAAa,SAAUvxB,EAAQxP,GACnC,MAAMtC,EAAMltB,SAAS4D,cAAc,OACnCspB,EAAI1jB,MAAMkhB,cAAgB,SAC1B,MAAM+D,EAAOzuB,SAAS4D,cAAc,QAQpC,OAPA6qB,EAAKtsB,UAAYo6B,GAAgByC,EACjCvQ,EAAKjlB,MAAM2U,QAAU,eACrBsQ,EAAKjlB,MAAMiG,OAAS,OACpBgf,EAAKjlB,MAAMgG,MAAQ,OACnBif,EAAKjlB,MAAM24B,YAAc,MACzBjV,EAAIzQ,YAAYgS,GAChBvB,EAAIzQ,YAAYzc,SAASwf,eAAegQ,IACjCtC,CACT,EASA,OAPAojC,EAAO7zC,YAAY8zC,EAAW/zB,GAAY,iDAC1C8zB,EAAO7zC,YAAY8zC,EAAW9zB,GAAa,wCAC3C6zB,EAAO7zC,YAAY8zC,EAAW7zB,GAAc,0CAC5C4zB,EAAO7zC,YAAY8zC,EAAW5zB,GAAc,0CAC5C2zB,EAAO7zC,YAAY8zC,EAAW3zB,GAAW,0CACzC0zB,EAAO7zC,YAAY8zC,EAAW1zB,GAAc,8CAC5CyzB,EAAO7zC,YAAY8zC,EAAWzzB,GAAY,4BACnCwzB,CACT,CAmB0BE,IACxBH,EAAW1iC,YAAc,WACvBhH,KAAKiH,QAAQhV,KAAKxY,KAAM4oB,OAAO2qB,EAAYt1B,WAAY,QACzD,EAEA,MAAMoyC,EAAgB,SAAU1pC,EAAIiY,GAClC,MAAMvQ,EAAOzuB,SAAS4D,cAAc,QAMpC,OALA6qB,EAAK1H,GAAKA,EACV0H,EAAKtsB,UAAYm6B,GAAgB0C,EACjCvQ,EAAKjlB,MAAMgG,MAAQ,qBACnBif,EAAKjlB,MAAM2U,QAAU,eACrBsQ,EAAK1pB,YAAc,IACZ0pB,CACT,EACA4hC,EAAW5zC,YAAYg0C,EAAc,mBAAoBj0B,KACzD6zB,EAAW5zC,YAAYg0C,EAAc,oBAAqBh0B,KAC1D4zB,EAAW5zC,YAAYg0C,EAAc,qBAAsB/zB,KAC3D2zB,EAAW5zC,YAAYg0C,EAAc,qBAAsB9zB,KAC3D0zB,EAAW5zC,YAAYg0C,EAAc,kBAAmB7zB,KACxDyzB,EAAW5zC,YAAYg0C,EAAc,qBAAsB5zB,KAC3DwzB,EAAW5zC,YAAYg0C,EAAc,mBAAoB3zB,KAEzDtqB,EAAE,YAAYwN,WAAWqK,aAAagmC,EAAY79C,EAAE,YAAYwN,WAAW2gB,WAAW,GACxF,CF5CE+vB,GG3Ca,WACb,MAAMxjC,EAAMltB,SAAS4D,cAAc,OACnCspB,EAAInG,GAAK,sBACTmG,EAAI1jB,MAAM6V,UAAY,SACtB,MAAMjV,EAAIpK,SAAS4D,cAAc,KACjCwG,EAAEjI,UAAY,SACdiI,EAAE4c,QAAU,WAC0B,SAAhCxU,EAAE,YAAYhJ,MAAM2U,SACtB3L,EAAE,YAAYhJ,MAAM2U,QAAU,OAC9B3L,EAAE,kBAAkBhJ,MAAM2U,QAAU,OACpC3L,EAAE,gBAAgBhJ,MAAM2U,QAAU,OAClC3L,EAAE,iBAAiBhJ,MAAM2U,QAAU,SAEnC3L,EAAE,YAAYhJ,MAAM2U,QAAU,OACc,IAAxC3L,EAAE,kBAAkB0U,SAASvlB,SAAc6Q,EAAE,kBAAkBhJ,MAAM2U,QAAU,SACzC,IAAtC3L,EAAE,gBAAgB0U,SAASvlB,SAAc6Q,EAAE,gBAAgBhJ,MAAM2U,QAAU,SACpC,IAAvC3L,EAAE,iBAAiB0U,SAASvlB,SAAc6Q,EAAE,iBAAiBhJ,MAAM2U,QAAU,SAErF,EACA/T,EAAErF,YAAc,qBAChBmoB,EAAIzQ,YAAYrS,GAChB,MAAMP,EAAI7J,SAAS4D,cAAc,KACjCiG,EAAE1H,UAAY,SACd0H,EAAEmd,QAAU,WAC0B,SAAhCxU,EAAE,YAAYhJ,MAAM2U,QAAoB3L,EAAE,YAAYhJ,MAAM2U,QAAU,OACrE3L,EAAE,YAAYhJ,MAAM2U,QAAU,MACrC,EACAtU,EAAE9E,YAAc,sBAChBmoB,EAAIzQ,YAAY5S,GAChB2I,EAAE,SAAS6X,aAAa6C,EAAK1a,EAAE,SAASmuB,WAAW,GACrD,CHcEgwB,GjCzCK,WACL,MAAMrV,EAAUt7C,SAAS4D,cAAc,QACvC03C,EAAQv0B,GAAK,YACbu0B,EAAQhkC,IAAM,gBACdgkC,EAAQE,KAAO,uDACfx7C,SAAS4wD,qBAAqB,QAAQ,GAAGn0C,YAAY6+B,EACvD,CiCoCEuV,GACA3rD,OAAO6C,KAAKm1B,IAAapW,SAASplB,KlClC7B,SAA6BiyC,EAAankB,EAAMqkB,GACrD,MAAMmJ,EAAUh9C,SAAS4D,cAAc,OACvCo5C,EAAQj2B,GAAK4sB,EACb,MAAMzlB,EAAOluB,SAAS4D,cAAc,OACpCsqB,EAAK1kB,MAAMqqC,SAAWA,EACtB3lB,EAAK1kB,MAAM29B,aAAe,MAC1B,MAAMja,EAAMltB,SAAS4D,cAAc,OACnCspB,EAAI1jB,MAAM6V,UAAY,OACtB6N,EAAInoB,YAAcyqB,EAClBtB,EAAKzR,YAAYyQ,GACjB8vB,EAAQvgC,YAAYyR,GACpBiP,GAAsBwW,GAAeqJ,CACvC,CkCuBI8T,CAAoB5zB,GAAYx7B,GAAG,GAAIw7B,GAAYx7B,GAAG,GAAIw7B,GAAYx7B,GAAG,GAAG,II3CjE,WACb,MAAM8nD,EAAUxpD,SAAS4D,cAAc,KACvC4lD,EAAQziC,GAAK,6BACbyiC,EAAQzkD,YAAc,iBACtBykD,EAAQrnD,UAAY,SACpBqnD,EAAQxiC,QAAU,WAChBozB,IACF,EACAoP,EAAQ37B,WAAa,WACnBlH,KAAKiH,QAAQ2gC,WAAa,CAC5B,EACA/E,EAAQ77B,YAAc,WACpBhH,KAAKiH,QAAQ+tB,QAAU,EACvBh1B,KAAKiH,QAAQhV,KAAKxY,MAAM,IAAMk6C,GAAc,KAAM,iBAAiB,QACnE3zB,KAAKiH,QAAQguB,QACf,EACAppC,EAAE,oBAAoB0U,SAAS,GAAG6pC,OAAOvH,GACzC,MAAME,EAAc1pD,SAAS4D,cAAc,KAC3C8lD,EAAY3iC,GAAK,2BACjB2iC,EAAY3kD,YAAc,qBAC1B2kD,EAAYvnD,UAAY,SACxBunD,EAAY1iC,QAAU,WACa,OAA7ByN,GAAsB,KAAa9N,KAAKkb,UAAUpN,GAAsB,IAAI4lB,GAAK,EACvF,EACAqP,EAAY77B,WAAa,WACvBlH,KAAKiH,QAAQ2gC,WAAa,CAC5B,EACA7E,EAAY/7B,YAAc,WACxBhH,KAAKiH,QAAQ+tB,QAAU,EACvBh1B,KAAKiH,QAAQhV,KAAKxY,MAAM,IAAMk6C,GAAc,KAAM,eAAe,QACjE3zB,KAAKiH,QAAQguB,QACf,EACAppC,EAAE,oBAAoB0U,SAAS,GAAG6pC,OAAOrH,EAC3C,CJYEsH,GKhDAx+C,EAAE,YAAYhJ,MAAM2U,QAAU,OAC9B3L,EAAE,aAAahJ,MAAM+1B,QAAU,MAE/B/sB,EAAE,YAAYhJ,MAAM2U,QAAU,OAC9B3L,EAAE,YAAYhJ,MAAM,aAAe,OCFnCtE,OAAO6C,KAAKyK,EAAE,QAAQ0U,UAAUJ,SAASizB,IACvC,MAAMkX,EAAiBz+C,EAAE,QAAQ0U,SAAS6yB,GAAO7yB,SAAS,GACpDgqC,EAASlxD,SAAS4D,cAAc,OACtCstD,EAAOnqC,GAAK,cAAc4U,OAAOoe,GAAS,IAC1CmX,EAAO/uD,UAAY,gBACnB+uD,EAAO7yC,UAAY,OACnB6yC,EAAOlqC,QAAU,YCRN,SAA4B+yB,GACE,SAAvCvnC,EAAE,cAAcunC,KAAS17B,WAE3BsI,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiB6gC,gBAAgB3tD,KACzEu2C,EAAM/vC,YAIRwI,EAAE,MAAMunC,KAASvwC,MAAM6iB,cAAgB,OACvC7Z,EAAE,MAAMunC,KAASvwC,MAAMmU,QAAU,MACjCnL,EAAE,cAAcunC,KAAS17B,UAAY,SACrC7L,EAAE,cAAcunC,KAASvwC,MAAM6iB,cAAgB,SAI7C1F,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiB6gC,gBAAgB7jC,SACzEysB,EAAM/vC,cAGR2c,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiB6gC,gBACzDxqC,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiB6gC,gBAAgB3jC,QACxE1oB,GAAUA,IAAUi1C,EAAM/vC,cAKjCwI,EAAE,cAAcunC,KAAS17B,UAAY,OACrC7L,EAAE,MAAMunC,KAASvwC,MAAM6iB,cAAgB,OACvC7Z,EAAE,MAAMunC,KAASvwC,MAAMmU,QAAU,IAErC,CDrBMyzC,CAAmBz1B,OAAOoe,GAAS,EACrC,EACAkX,EAAex0C,YAAYy0C,EAAO,IEJpChsD,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IACjC,MAAM8+B,EAAK7Z,KAAKoR,QAAQr2B,GACiB,OAArC8Q,EAAE,UAAUguB,EAAGzZ,MAAM4G,cACvBiN,GAAmBl5B,GAAK8Q,EAAE,UAAUguB,EAAGzZ,MAAM4G,YAC7Cnb,EAAE,UAAUguB,EAAGzZ,MAAM4G,YAAc,WACjChH,KAAKiH,QAAQ+tB,QAAU,EACvBh1B,KAAKiH,QAAQhV,KAAKxY,MAAM,IAAMk6C,GAAc,IAAK,GAAG54C,MAAM,SAC1DilB,KAAKiH,QAAQguB,QACf,EACF,IAQEj1B,KAAK0qC,aACPz3B,GAAoBpnB,EAAE,SAASmb,YAC/Bnb,EAAE,SAASmb,YAAc,WACvBhH,KAAKiH,QAAQ+tB,QAAU,EACvBh1B,KAAKiH,QAAQhV,KAAKxY,MAAM,IAAMk6C,GAAc,IAAK,SAAS,QAC1D3zB,KAAKiH,QAAQguB,QACf,GA0EF1hB,GAAgBvT,KAAKuT,cACrBvT,KAAKuT,cAAgB,WACnBA,KApEEvT,KAAKoR,QAAQ6V,KAAKpV,iBACpBhmB,EAAE,gBAAgBmb,YAAc,WAC9BhH,KAAKiH,QAAQ+tB,QAAU,EACvBh1B,KAAKiH,QAAQhV,KAAKxY,MAAM,IAAMk6C,GAAc,KAAM,qBAAqB,QACvE3zB,KAAKiH,QAAQguB,QACf,EACA7wC,MAAMiiD,KAAKx6C,EAAE,cAAc0U,UAAUJ,SAASwqC,IAC5C,MAAMC,EAASD,EAAMvqC,GAAGrC,OAAO,GAE/B4sC,EAAM3jC,YAAc,WAClBhH,KAAKiH,QAAQ+tB,QAAU,EACvBh1B,KAAKiH,QAAQhV,KAAKxY,MAAM,IAAMk6C,GAAc,IAAK,CAAC,GAAGiX,EAAO,KAAM,GAAGA,EAAO,QAAQ,QACpF5qC,KAAKiH,QAAQguB,QACf,CAAC,KAyDHF,KAjDJ,WACE,GAAI/0B,KAAKoR,QAAQ0W,KAAKjW,eACpB,IAAK,IAAI92B,EAAI,EAAGA,EAAIilB,KAAKoR,QAAQ0W,KAAK3W,SAAS8W,UAAUjtC,OAAQD,IAC/D8Q,EAAE,YAAY9Q,KAAK6C,WAAWopB,YAAc,WAC1ChH,KAAKiH,QAAQ+tB,QAAU,EACvBh1B,KAAKiH,QAAQhV,KAAKxY,MAAM,IAAMk6C,GAAc,KAAM54C,IAAI,QACtDilB,KAAKiH,QAAQguB,QACf,CAGN,CAwCI4V,GAtCJ,WACE,GAAI7qC,KAAKoR,QAAQF,OAAOW,eAAgB,CACtC,IAAK,IAAI92B,EAAI,EAAGA,EAAI,GAAIA,GAAK,EAC3B8Q,EAAE,YAAY9Q,KAAKisB,YAAc,WAC/BhH,KAAKiH,QAAQ+tB,QAAU,EACvBh1B,KAAKiH,QAAQhV,KAAKxY,MAAM,IAAMk6C,GAAc,MAAO54C,IAAI,QACvDilB,KAAKiH,QAAQguB,QACf,EAEF,IAAK,IAAIl6C,EAAI,EAAGA,EAAI,EAAGA,GAAK,EAC1B8Q,EAAE,aAAa9Q,KAAKisB,YAAc,WAChChH,KAAKiH,QAAQ+tB,QAAU,EACvBh1B,KAAKiH,QAAQhV,KACXxY,MACA,IAAMk6C,GAAc,MAAO,CAAC54C,EAAGilB,KAAKoR,QAAQF,OAAOC,SAAS+O,KAAKnlC,MACjE,QAEFilB,KAAKiH,QAAQguB,QACf,CAEJ,CACF,CAkBI6V,GACAxV,IACF,EACAt1B,KAAKuT,gBC9GL1nB,EAAE,wBAAwBmb,YAAc,WACtC0P,GAAsB,CACxB,EACA7qB,EAAE,wBAAwBqb,WAAa,WACrCwP,GAAsB,EACtB1W,KAAKiH,QAAQxV,OACblT,OAAO6C,KAAK4e,KAAKkb,WAAW/a,SAASplB,IACnC67B,GAA0B77B,GAAK,CAAC,GAEpC,ET4CAorD,KACA7Q,KACAt1B,KAAKkhB,iBAELzK,GAAoBzW,KAAKgsB,SAErBhsB,KAAKqrB,MAAM0f,OACb/qC,KAAKgrC,MAAM,2CACRhrC,KAAKirC,OAAO,0CAAkE,GAAI,GAAI,EAAG,GAE9FjrC,KAAKkrC,IAAI,cACX,CU3De,SAASC,GAAmB95B,EAAK6O,GAC9C,IAAKlgB,KAAKoR,QAAQF,OAAOW,eAAgB,OAAO,EAChD8N,KACA,MAAM,SAAExO,GAAanR,KAAKoR,QAAQF,OAC5Bk6B,EAAcj6B,EAASk6B,SAASh6B,GAAK6O,KACvB,MAAhBkrB,EAAqBz/B,GAAUwF,EAAS+O,KAAKA,GACxB,MAAhBkrB,EAAqBx/B,GAAUuF,EAAS+O,KAAKA,GAC7B,MAAhBkrB,IAAqBv/B,GAAUsF,EAAS+O,KAAKA,IAEzC,IAATA,EAAYvU,GAAU0F,EACR,IAAT6O,EAAYtU,GAAUyF,EACb,IAAT6O,IAAYrU,GAAUwF,GAG/B,MAAMiT,EAAwBhZ,GAO9B,OANA4V,KAEAqC,KACIe,IAA0BhZ,IAC5B4V,KAEKlV,GAAehM,KAAKgb,SAC7B,CCLe,SAASswB,KAKtB,GAJI1zB,KAAoB5X,KAAKgsB,WAC3BpU,GAAkB5X,KAAKgsB,SCrBrBhsB,KAAKgsB,UACPngC,EAAE,QAAQhJ,MAAMwV,OAAS,MAC0D,IAA/E2H,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkb,SACtEzwB,EAAE,YAAYhJ,MAAM2U,QAAU,QACqD,IAAjFwI,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS8b,WACtErxB,EAAE,cAAchJ,MAAM2U,QAAU,UAElCigC,KACAra,MAEFP,ODcK7c,KAAKgsB,UAAiC,IAArBhsB,KAAKurC,YAAmB,CAExCv4B,KAAiBz0B,OAAO6C,KAAK4e,KAAKiB,MAAMjmB,SAC1C85C,KACAtB,KACAxgB,GAAez0B,OAAO6C,KAAK4e,KAAKiB,MAAMjmB,QAIpC8wB,KACFinB,IAA6B,GAC7BjC,KEnCA9wB,KAAKmsB,IAAI,wBCDbxM,KACA7P,GAAY,uBAAZ,OAA4C,EAC5CoR,KDAElU,GCCKhB,IDAAgB,GAA6BhN,KAAKgb,UAEzCmT,GAAa,CAAEnhB,2BAA0B,KFkCrC2lB,KACAD,KACAT,KACAR,KACAgE,KI7CS,WACb,IAAK,IAAIpkB,EAAM,EAAGA,EAAM,GAAIA,GAAO,EACjC,IAAK,IAAI6O,EAAO,EAAGA,EAAO,EAAGA,GAAQ,EACnCtQ,GAAUyB,GAAK6O,GAAQirB,GAAmB95B,EAAK6O,GAInDiO,GAAa,CAAEve,UAAS,IAC1B,CJsCM47B,GAEA/Y,KK9CS,WACb,IAAIgZ,EAAY,EAEhB,GAAIzrC,KAAKoR,QAAQ0W,KAAKjW,eAAgB,CACpC,MAAM65B,EAAc1rC,KAAKoR,QAAQ0W,KAAK3W,SAASw6B,MAC/C,IAAIC,EAAW,EACfrtD,OAAO6C,KAAKsqD,GAAavrC,SAASplB,IAChC,MAAM8wD,EAAaH,EAAY3wD,GAC/B6wD,GAAYC,EAAW7jB,MAAQ6jB,EAAWtuD,GAAG,IAE/CkuD,GAAaG,EAAW5rC,KAAK8rC,mBAC/B,CAEAL,GCba,WACb,IAAIA,EAAY,EAEhB9rB,KAGA,IAAIosB,EAAuB,EACL,IAAlBtgC,IAAyC,KAAlBA,KACzBsgC,GAAwB,GAEH,IAAnBrgC,IAA2C,KAAnBA,KAC1BqgC,GAAwB,GAE1BtgC,GAAgB,EAChBC,GAAiB,GAGjB,IAAK,IAAI3wB,EAAI,EAAGA,EAAIgxD,IAAwBhxD,EAAG,CAC7C,IAAIqsD,EAAkB,SACtB7oD,OAAO6C,KAAKyuB,IAAY1P,SAAS4Z,IAC3BlK,GAAWkK,GAAG5H,OAAS,IACzBi1B,EAAkBrtB,EACpB,IAEFlK,GAAWu3B,GAAiBj1B,QAAU,EACtChH,GAAqB,CACvB,CAcA,OAXA5sB,OAAO6C,KAAKyuB,IAAY1P,SAASplB,IAC/B,MAAM8+B,EAAKhK,GAAW90B,GACtB0wD,GAAa15B,GACX/R,KAAKoR,QAAQyI,EAAGv6B,MAChB0gB,KAAKoR,QAAQr2B,GAAGk3B,UAChB4H,EAAG1H,OACHnS,KAAKoR,QAAQr2B,GAAGm3B,KAChB2H,EAAG1H,OACJ,IAGIs5B,CACT,CD5BeO,GACbr8B,GAAqB87B,EAErBtd,GAAa,CAAExe,mBAAkB,IACnC,CL8BMs8B,GAEAngC,GAAY,GAId,MAAMogC,EAAelsC,KAAK0iB,SAAS,kBAAoB,GAClDxX,GAAqBghC,GACxBhhC,GAAoB,EACpBD,EAA2B,GAClBC,IAAsBghC,IAC/BhhC,GAAoB,EACpBD,EAA2B,GAGzBA,IACF4lB,KACA5lB,EAA2B,GO3DlB,WAEbsoB,KAEA,KACAR,IAA6B,GCVhB,WACbhlB,GAA2B,EAC3B,IAAIwO,EAAQ,EACZh+B,OAAO6C,KAAK4e,KAAKkb,WAAW/a,SAASplB,IACH,IAA5BilB,KAAKkb,UAAUngC,GAAG+xC,QAAavQ,GAAS,EAAC,IAE/C,IAAI4vB,EAAU,EACd,GAAIt8B,GAAWqB,OAAOW,eAAgB,CACpC,MAAMC,EAAS9R,KAAKiR,OAAO,SACZ,IAAXa,EAAcq6B,GAAW,KACT,IAAXr6B,EAAcq6B,GAAW,IACd,IAAXr6B,IAAcq6B,GAAW,KACpC,CACAn+B,GAAyBuO,EACzBxO,GACEwO,GACS,IAARA,EAAe,MACuB,IAAtCvc,KAAKmsB,IAAI,2BAAoC,IACjB,IAA5BnsB,KAAKmsB,IAAI,iBAA0B,GACpCggB,EAEFhe,GAAa,CAAEngB,uBAAsB,4BAA0B,IACjE,CDXEo+B,GACA5d,KACAmD,KAEA,MAAM+W,EACJ1oC,KAAK0gC,oBACHv9C,KAAKgE,MAAM6Y,KAAK6xB,gBAAgB7xB,KAAK8xB,aAAe9xB,KAAK2uB,gBAAkB,IAE5E3uB,KAAK2uB,cAAgB3uB,KAAK8xB,cAC7BxiB,GAA4BiL,GAAWmuB,EAAgB7tB,KACzD,CP8CIwxB,GSpEE54B,MAA4BzT,KAAKssC,cAA2C,YAA3BtsC,KAAKssC,aAAalxD,QACrEq4B,GAAyBzT,KAAKssC,cAA2C,YAA3BtsC,KAAKssC,aAAalxD,KAC5Dq4B,KACF,cAAe,mBAAoB,EAAG,gBAAgB,GACtD,cACE,mBACAzT,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS23B,gBACpE,eACA,iBACA,GAEF,qBACE,mBACA,sBACA,uBACA,kDCdFvlB,KAAyBxT,KAAKwiB,aAAagK,SAASN,UACtD1Y,GAAuBxT,KAAKwiB,aAAagK,SAASN,QAClD3tC,OAAO6C,KAAK4e,KAAKusC,UAAUpsC,SAASplB,IAC9BilB,KAAKusC,SAASxxD,GAAGyxD,WAAuC,aAA1BxsC,KAAKusC,SAASxxD,GAAGK,OACjDi0B,GAAwBrP,KAAKusC,SAASxxD,GACxC,IAEF,cAAe,mBAAoB,EAAG,YAAY,GAClD,cACE,mBACAilB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASi4B,YACpE,WACA,aACA,GAEF,qBACE,mBACA,kBACA,oBACA,0CCpBFr5B,KAAKoR,QAAQ6V,KAAKpV,gBAClB6B,KAAuB1T,KAAKoR,QAAQ6V,KAAK9V,SAASs7B,WAEvB,IAAvB/4B,IAA4BA,GAAqBY,KAAKC,QACxD,cAAe,mBAAoB,EAAG,aAAa,GACnD,cACE,mBACAvU,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASs4B,aACpE,YACA,cACA,IAGJhmB,GAAqB1T,KAAKoR,QAAQ6V,KAAK9V,SAASs7B,UCdrC,WACb,GACEzsC,KAAKoR,QAAQ,gBAAgBS,gBACuD,IAApF7R,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS+zB,YACpE,CACA,MAAM,SAAEhkB,GAAanR,KAAKoR,QAAQ,gBAC9BD,EAASwT,MAAQxT,EAASsV,OAAQ5S,IAAmB,EAC/CA,KACRA,IAAmB,EACnB,cAAe,mBAAoB,EAAG,cAAc,GACpD,cACE,mBACA7T,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS44B,cACpE,aACA,eACA,GAEF,qBACE,mBACA,oBACA,mBACA,2CAGN,CACF,CZkDI0S,Ga3EW,WACb,GAAI1sC,KAAK6J,WAAa,EAAG,CACvB,IAAI8iC,EAAmB,EACvBpuD,OAAO6C,KAAK4e,KAAKkb,WAAW/a,SAASplB,IACH,IAA5BilB,KAAKkb,UAAUngC,GAAG+xC,QAAa6f,GAAoB,EAAC,IAEtDA,EAAmB54B,IACrBA,GAAoB44B,EAElBA,IAAqB3sC,KAAK4sC,mBAC1B5sC,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASo5B,iBAEpE,cAAe,mBAAoB,EAAG,oBAAoB,GAE1D,cAAe,mBAAoB,EAAG,iBAAiB,GAGvDmS,IAAqB3sC,KAAK4sC,mBAC1B5sC,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASs5B,iBAEpE,cACE,mBACA16B,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASw5B,oBACpE,mBACA,qBACA,GAGF,cACE,mBACA56B,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASk5B,iBACpE,gBACA,kBACA,GAIFqS,IAAqB3sC,KAAK4sC,mBAC1B5sC,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASm5B,wBAEpE,qBACE,mBACA,0BACA,4BACA,sDAGF,qBACE,mBACA,uBACA,sBACA,gCAIJxmB,GAAoB44B,CAExB,CACF,CbkBIE,EACF,CcnEA/4B,GAA+B,EAC/BpE,GAA0B,CAAC,EAC3BnxB,OAAO6C,KAAK4e,KAAKusC,UAAUpsC,SAASplB,IAClC20B,GAAwB1P,KAAKusC,SAASxxD,GAAGqlB,IAAMJ,KAAKusC,SAASxxD,GACzDilB,KAAKusC,SAASxxD,GAAGyxD,WAAuC,WAA1BxsC,KAAKusC,SAASxxD,GAAGK,OACjDg0B,GAA4BpP,KAAKusC,SAASxxD,GAC1C+4B,IAAgC,EAClC,IAUFv1B,OAAO6C,KAAK02B,IAAU3X,SAASplB,SACa,IAA/B20B,GAAwB30B,KACjC+8B,GAAS/8B,GAAGse,WAAWxb,YAAYi6B,GAAS/8B,WACrC+8B,GAAS/8B,GAClB,IAEE44B,KAA0B3T,KAAKwiB,aAAaC,OAAOzkC,GACrD21B,GAAwB3T,KAAKwiB,aAAaC,OAAOzkC,EAC7C21B,KACEC,GAA+BE,KACjC,cAAe,mBAAoB,EAAG,WAAW,GACjD,cACE,mBACA9T,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASq3B,WACpE,UACA,YACA,GAEF,qBACE,mBACA,iBACA,wBACA,+CAIJl6C,OAAO6C,KAAK4e,KAAKusC,UAAUpsC,SAASplB,SACW,IAAlC+8B,GAAS9X,KAAKusC,SAASxxD,GAAGqlB,KCrD9B,SAAuB8kC,GACpC,MAAMrN,EAAUx+C,SAAS4D,cAAc,OACvC46C,EAAQz3B,GAAK,UAAU8kC,EAAO9kC,KAC9By3B,EAAQh1C,MAAMgG,MAAQ,OACtBgvC,EAAQh1C,MAAMiG,OAAS,OACvB+uC,EAAQh1C,MAAM8H,SAAW,WACzBktC,EAAQh1C,MAAM+T,OAAS,cACvBihC,EAAQh1C,MAAM6V,UAAY,SAC1Bm/B,EAAQh1C,MAAM+V,WAAa,OAC3Bi/B,EAAQh1C,MAAM84C,WAAa,2BAC3B9D,EAAQh1C,MAAMihB,SAAW,OACzB+zB,EAAQh1C,MAAMqU,OAAS,UACvB2gC,EAAQh1C,MAAM2U,QAAU,QACxBqgC,EAAQh1C,MAAM6iB,cAAgB,OACsD,IAAhF1F,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASy2B,UACtEA,EAAQh1C,MAAM2U,QAAU,QAC1BqgC,EAAQh1C,MAAMmC,KAAOkgD,EAAOr5C,EAAEhJ,MAAMmC,KACpC6yC,EAAQh1C,MAAMoC,IAAMigD,EAAOr5C,EAAEhJ,MAAMoC,IACnC4yC,EAAQx3B,QAAU,WAChB6kC,EAAO4H,KACT,EACAjV,EAAQ7wB,YAAc,WACpBk+B,EAAOr5C,EAAEhJ,MAAMgkB,OAAS,gEACxBq+B,EAAOr5C,EAAEhJ,MAAMkqD,aAAe,+DAChC,EACAlV,EAAQ3wB,WAAa,WACnBg+B,EAAOr5C,EAAEhJ,MAAMgkB,OAAS,GACxBq+B,EAAOr5C,EAAEhJ,MAAMkqD,aAAe,EAChC,EAEAj1B,GAASotB,EAAO9kC,IAAMy3B,EACtBhsC,EAAE,YAAYiK,YAAY+hC,EAC5B,CDsBUmV,CAAchtC,KAAKusC,SAASxxD,GAC9B,KAGJ25C,KACA9gB,GAA+BE,GACM,IAAjCA,KAAoC1E,GAA4B,IAEY,IAAhFpP,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASy2B,SACpElkB,IAEAp1B,OAAO6C,KAAK02B,IAAU3X,SAASplB,IAC7B+8B,GAAS/8B,GAAG8H,MAAMmU,QAAU0Y,GAAwB30B,GAAG8Q,EAAEhJ,MAAMmU,QAC/D8gB,GAAS/8B,GAAG8H,MAAMoqD,UAAYv9B,GAAwB30B,GAAG8Q,EAAEhJ,MAAMoqD,UACjEn1B,GAAS/8B,GAAGqD,YAAc+E,KAAKiL,KAAKshB,GAAwB30B,GAAGutD,KAAOtoC,KAAKwB,IAAI,GdWrF,CgBtFA,MA+BA,GA/BgB,CACdw0B,UAAW,EACXC,YAAa,EACbC,SAAU,EACVC,QAAS,EACTC,YAAa,EACbC,QAAS,EACTC,WAAY,EACZjtB,aAAc,EACdotB,oBAAqB,EACrBC,eAAgB,EAChBC,eAAgB,EAChBC,gBAAiB,EACjBC,iBAAkB,EAClBC,iBAAkB,EAClBC,kBAAmB,EACnBC,qBAAsB,EACtBT,cAAe,EACfiG,MAAO,EACPiB,MAAO,EACPwB,OAAQ,EACRY,OAAQ,EACRU,SAAU,EACVoC,MAAO,EACPc,IAAK,EACLc,QAAS,EACTC,KAAM,EACNxgC,SAAU,EACVY,YAAa,GChBA,SAAS,GAAKzoB,GAC3B24C,KAGAvrB,EAAwB1E,QAAQ,mBAAoB1oB,EAAK,GAAU,GAASmvD,SAG1E,IADOtrC,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiB6gC,kBAGlExqC,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiB6gC,gBAAkB,IAI/E1P,KACA,IACE,IAAI1H,EAAQ,EACZA,EAAQpzB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiB6gC,gBAAgBxvD,OACnFo4C,IACA,CACA,MAAM8Z,EACJltC,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiB6gC,gBAAgBpX,GAC7EvnC,EAAE,MAAMqhD,KAAiBrqD,MAAM6iB,cAAgB,OAC/C7Z,EAAE,MAAMqhD,KAAiBrqD,MAAMmU,QAAU,MACzCnL,EAAE,cAAcqhD,KAAiBx1C,UAAY,SAC7C7L,EAAE,cAAcqhD,KAAiBrqD,MAAM6iB,cAAgB,MACzD,MAIgF,IAAvE1F,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBwjC,SAEhE,aADFntC,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBwjC,UAGvDntC,KAAKqrB,MAAM0f,OACb/qC,KAAKgrC,MACH,iGAGFhrC,KAAKirC,OACH,gGACA,GACA,GACA,EACA,GAGR,CCvDA,MAAMmC,GAAK,CACT/yD,KCSa,WACb,IAAIgzD,GAAU,EAGdvnC,IACAtsB,OAAO6nB,2BAA2BC,gBAAiB,EACnDwE,EAA0B,oBAEtB9F,KAAKmtC,UAAYn4B,OCpBK,WDsBxBq4B,EAAUC,QACR,6JAGAD,IACFzE,KACA5oC,KAAK4F,aAAa,QAAS4nB,IAC3BxtB,KAAK4F,aAAa,OAAQwlB,IAC1BprB,KAAK4F,aAAa,QAAS0lC,SAGsB,IAAtCtrC,KAAKkF,YAAYyE,kBAC1B,GAAK,MAGX,EDjCEpE,KAAI,GACJM,KGAa,WACb,MAAM0C,EAAavI,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAE7D,OADApB,EAAW4kC,QAAU,WACd/wD,KAAKulB,UAAU4G,EACxB,GHDqB,oBAAVglC,MAEThsC,YAAW,WACTvB,KAAK+F,YAAY,gBAAiBqnC,IAIlC5zD,OAAO6nB,2BAA2BC,gBAAiB,CACrD,GAAG,MAEHtB,KAAK+F,YAAY,gBAAiBqnC,IAClC5zD,OAAO6nB,2BAA2BC,gBAAiB","sources":["webpack:///./node_modules/@eastdesire/jscolor/jscolor.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/baseSetting.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/notifications/prompt.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/notifications/flash.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/savingAndLoading/saveFramework.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/toggles/toggleHeader.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/notifications/sound.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/toggleConfigVolume.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/menuSections/addMenu.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/menuSections/info/addInfoMenuSection.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/menuSections/info/createFrameworkInfoMenuSection.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/data/modInfo.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/draw/drawLoop.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/data/headers.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/savingAndLoading/loadMod.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/savingAndLoading/createSaveDataObject.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/logic/logicLoop.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/data/settings.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/load.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/cookieMonsterFramework.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/init.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/init/createFlashScreen.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/save.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/index.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/init/initModFramework.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/init/registerMod.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/listings/createInfoListing.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/listings/createOptionListing.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/listings/createOptionsFavouriteStar.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/toggles/toggleFavourite.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/toggleConfig.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/toggleConfigKeycode.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/listings/createOptionsSubHeader.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/createModMenuSection.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/notifications/notification.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingColours.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingInputNumber.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingStandard.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingStandardWithFunc.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingVolume.js","webpack:///./src/Config/Toggles/ToggleWrinklerButtons.js","webpack:///./src/Cache/VariablesAndData.js","webpack:///./src/Sim/VariablesAndData.js","webpack:///./src/Sim/ReplacedGameFunctions/SimAuraMult.js","webpack:///./src/Sim/ReplacedGameFunctions/SimGetSellMultiplier.js","webpack:///./src/Sim/ReplacedGameFunctions/SimEff.js","webpack:///./src/Sim/ReplacedGameFunctions/SimHas.js","webpack:///./src/Sim/ReplacedGameFunctions/SimHasAura.js","webpack:///./src/Sim/ReplacedGameFunctions/SimHasGod.js","webpack:///./src/Sim/ReplacedGameFunctions/SimModifyBuidlingPrice.js","webpack:///./src/Sim/SimulationEvents/SellBuilding.js","webpack:///./src/Data/Scales.js","webpack:///./src/Main/VariablesAndData.js","webpack:///./src/Disp/VariablesAndData.js","webpack:///./src/Disp/BeautifyAndFormatting/Beautify.js","webpack:///./src/Disp/BuildingsUpgrades/Buildings.js","webpack:///./src/Disp/BuildingsUpgrades/UpdateUpgradeSectionsHeight.js","webpack:///./src/Disp/BuildingsUpgrades/Upgrades.js","webpack:///./src/Disp/BeautifyAndFormatting/FormatTime.js","webpack:///./src/Disp/BeautifyAndFormatting/GetTimeColour.js","webpack:///./src/Disp/HelperFunctions/GetCPS.js","webpack:///./src/Disp/HelperFunctions/GetWrinkConfigBank.js","webpack:///./src/Disp/InfoBars/CreateDOMElements.js","webpack:///./src/Disp/InfoBars/BottomBar.js","webpack:///./src/Disp/HelperFunctions/UpdateBackground.js","webpack:///./src/Config/SpecificToggles.js","webpack:///./src/Cache/Dragon/CacheDragonAuras.js","webpack:///./src/Sim/InitializeData/InitAchievement.js","webpack:///./src/Sim/ReplacedGameFunctions/SimGetTieredCpsMult.js","webpack:///./src/Sim/InitializeData/InitialBuildingData.js","webpack:///./src/Sim/InitializeData/InitUpgrade.js","webpack:///./src/Sim/SimulationData/CopyData.js","webpack:///./src/Disp/Tooltips/CreateTooltip.js","webpack:///./src/Cache/PP/ColourOfPP.js","webpack:///./src/Cache/CPS/GetCPSBuffMult.js","webpack:///./src/Sim/SimulationData/SimWin.js","webpack:///./src/Sim/Calculations/CalculateGains.js","webpack:///./src/Sim/ReplacedGameFunctions/SimGetHeavenlyMultiplier.js","webpack:///./src/Data/Gamedata.js","webpack:///./src/Sim/ReplacedGameFunctions/SimHasAchiev.js","webpack:///./src/Sim/Calculations/CheckOtherAchiev.js","webpack:///./src/Sim/SimulationEvents/BuyBuildingBonusIncome.js","webpack:///./src/Disp/HelperFunctions/CalculateGrimoireRefillTime.js","webpack:///./src/Config/Toggles/ToggleToolWarnPos.js","webpack:///./src/Disp/Tooltips/UpdateTooltips.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/Building.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/Upgrade.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/SugarLump.js","webpack:///./src/Disp/HelperFunctions/GetLumpColour.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/Grimoire.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/GardenPlots.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/HarvestAll.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/StockMarket.js","webpack:///./src/Disp/HelperFunctions/CalculateStockNextExpectedValue.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/WrinklerButton.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/PantheonGods.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/Warnings.js","webpack:///./src/Disp/DrawHook.js","webpack:///./src/Disp/InfoBars/TimerBar.js","webpack:///./src/Disp/Tooltips/WrinklerTooltips.js","webpack:///./src/Disp/MenuSections/Refreshmenu.js","webpack:///./src/Main/ClickHook.js","webpack:///./src/Cache/CPS/AverageQueue.js","webpack:///./src/Cache/FillCMDCache.js","webpack:///./src/Cache/CPS/CPS.js","webpack:///./src/Sim/SimulationEvents/BuyBuilding.js","webpack:///./src/Cache/PP/Building.js","webpack:///./src/Cache/PP/PP.js","webpack:///./src/Cache/PP/Upgrade.js","webpack:///./src/Sim/SimulationEvents/BuyUpgrades.js","webpack:///./src/Cache/PriceAndIncome/PriceAndIncome.js","webpack:///./src/Cache/Stats/ChainCookies.js","webpack:///./src/Cache/Stats/HeavenlyChips.js","webpack:///./src/Cache/Stats/MissingUpgrades.js","webpack:///./src/Disp/MenuSections/Statistics/CreateMissingUpgrades.js","webpack:///./src/Cache/Stats/Reindeer.js","webpack:///./src/Cache/Stats/Stats.js","webpack:///./src/Cache/TillNextAchievement/AllAmountTillNextAchievement.js","webpack:///./src/Cache/TillNextAchievement/IndividualAmountTillNextAchievement.js","webpack:///./src/Cache/Wrinklers/Wrinklers.js","webpack:///./src/Cache/CacheInit.js","webpack:///./src/Disp/HelperFunctions/PopWrinklers.js","webpack:///./src/Disp/Tooltips/Tooltip.js","webpack:///./src/Disp/TabTitle/FavIcon.js","webpack:///./src/Sim/InitializeData/InitData.js","webpack:///./src/Main/ReplaceGameElements/TooltipGrimoire.js","webpack:///./src/Main/ReplaceGameElements/NativeGrimoire.js","webpack:///./src/Cache/Dragon/Dragon.js","webpack:///./src/Data/Sectionheaders.js","webpack:///./src/Config/CheckNotificationPermissions.js","webpack:///./src/Disp/HelperFunctions/RefreshScale.js","webpack:///./src/Config/Toggles/ToggleBotBar.js","webpack:///./src/Data/settings.js","webpack:///./src/Config/Toggles/ToggleDetailedTime.js","webpack:///./src/Config/Toggles/ToggleUpgradeBarAndColour.js","webpack:///./src/Config/Toggles/ToggleUpgradeBarFixedPos.js","webpack:///./src/Config/Toggles/ToggleGCTimer.js","webpack:///./src/Config/Toggles/ToggleSectionHideButtons.js","webpack:///./src/Disp/HelperFunctions/UpdateColours.js","webpack:///./src/Disp/MenuSections/createMenuOptions.js","webpack:///./src/Disp/HelperFunctions/CalculateLuckyLevels.js","webpack:///./src/Disp/MenuSections/Statistics/CreateDOMElements.js","webpack:///./src/Config/ToggleSetting.js","webpack:///./src/Disp/MenuSections/Statistics/AddStatsPage.js","webpack:///./src/Disp/MenuSections/Statistics/CreateStatsSections.js","webpack:///./src/Sim/SimulationEvents/ResetAscension.js","webpack:///./src/Disp/MenuSections/Statistics/CreateMissingAchievements.js","webpack:///./src/Main/ReplaceGameFunctions/FixMouse.js","webpack:///./src/Main/ReplaceGameFunctions/ReplaceNative.js","webpack:///./src/Disp/Tooltips/PositionLocation.js","webpack:///./src/Main/ReplaceGameElements/TooltipUpgrades.js","webpack:///./src/Disp/Dragon/Dragon.js","webpack:///./src/Sim/SimulationEvents/AuraChange.js","webpack:///./src/Disp/MenuSections/AddMenus.js","webpack:///./src/Disp/TabTitle/TabTitle.js","webpack:///./src/Disp/Tooltips/AscendButton.js","webpack:///./src/Main/Initialization.js","webpack:///./src/Disp/Initialization/CssArea.js","webpack:///./src/Disp/BuildingsUpgrades/UpgradeBar.js","webpack:///./src/Disp/Initialization/CreateSectionHideButtons.js","webpack:///./src/Disp/Initialization/CreateWrinklerButton.js","webpack:///./src/Disp/Initialization/UpdateBuildingUpgradeStyle.js","webpack:///./src/Disp/buildingTiles/createBuildingLockButtons.js","webpack:///./src/Disp/buildingTiles/toggleBuildingLock.js","webpack:///./src/Main/ReplaceGameElements/Tooltips.js","webpack:///./src/Main/WrinklerArea/AddDetectArea.js","webpack:///./src/Sim/SimulationEvents/GodChange.js","webpack:///./src/Main/LoopHook.js","webpack:///./src/Disp/HelperFunctions/UpdateAscendState.js","webpack:///./src/Cache/CPS/NoGoldSwitchCPS.js","webpack:///./src/Sim/Calculations/NoGoldenSwitchCalc.js","webpack:///./src/Cache/PantheonGods/CacheGods.js","webpack:///./src/Cache/CPS/SellChoEgg.js","webpack:///./src/Sim/SimulationEvents/SellBuildingForChoEgg.js","webpack:///./src/Cache/CacheLoop.js","webpack:///./src/Cache/CPS/CurrWrinklerCPS.js","webpack:///./src/Main/CheckStates/Ticker.js","webpack:///./src/Main/CheckStates/Season.js","webpack:///./src/Main/CheckStates/Garden.js","webpack:///./src/Main/CheckStates/Grimoire.js","webpack:///./src/Main/CheckStates/Wrinkler.js","webpack:///./src/Main/CheckStates/GoldenCookie.js","webpack:///./src/Disp/GoldenCookieTimers/GoldenCookieTimers.js","webpack:///./src/Data/headers.js","webpack:///./src/InitSaveLoad/load.js","webpack:///./src/CookieMonster.js","webpack:///./src/InitSaveLoad/init.js","webpack:///./src/Data/Moddata.js","webpack:///./src/InitSaveLoad/save.js"],"sourcesContent":["/**\r\n * jscolor - JavaScript Color Picker\r\n *\r\n * @link http://jscolor.com\r\n * @license For open source use: GPLv3\r\n * For commercial use: JSColor Commercial License\r\n * @author Jan Odvarko - East Desire\r\n *\r\n * See usage examples at http://jscolor.com/examples/\r\n */\r\n\r\n\r\n(function (global, factory) {\r\n\r\n\t'use strict';\r\n\r\n\tif (typeof module === 'object' && typeof module.exports === 'object') {\r\n\t\t// Export jscolor as a module\r\n\t\tmodule.exports = global.document ?\r\n\t\t\tfactory (global) :\r\n\t\t\tfunction (win) {\r\n\t\t\t\tif (!win.document) {\r\n\t\t\t\t\tthrow new Error('jscolor needs a window with document');\r\n\t\t\t\t}\r\n\t\t\t\treturn factory(win);\r\n\t\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\t// Default use (no module export)\r\n\tfactory(global);\r\n\r\n})(typeof window !== 'undefined' ? window : this, function (window) { // BEGIN factory\r\n\r\n// BEGIN jscolor code\r\n\r\n\r\n'use strict';\r\n\r\n\r\nvar jscolor = (function () { // BEGIN jscolor\r\n\r\nvar jsc = {\r\n\r\n\r\n\tinitialized : false,\r\n\r\n\tinstances : [], // created instances of jscolor\r\n\r\n\treadyQueue : [], // functions waiting to be called after init\r\n\r\n\r\n\tregister : function () {\r\n\t\tif (typeof window !== 'undefined' && window.document) {\r\n\t\t\twindow.document.addEventListener('DOMContentLoaded', jsc.pub.init, false);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tinstallBySelector : function (selector, rootNode) {\r\n\t\trootNode = rootNode ? jsc.node(rootNode) : window.document;\r\n\t\tif (!rootNode) {\r\n\t\t\tthrow new Error('Missing root node');\r\n\t\t}\r\n\r\n\t\tvar elms = rootNode.querySelectorAll(selector);\r\n\r\n\t\t// for backward compatibility with DEPRECATED installation/configuration using className\r\n\t\tvar matchClass = new RegExp('(^|\\\\s)(' + jsc.pub.lookupClass + ')(\\\\s*(\\\\{[^}]*\\\\})|\\\\s|$)', 'i');\r\n\r\n\t\tfor (var i = 0; i < elms.length; i += 1) {\r\n\r\n\t\t\tif (elms[i].jscolor && elms[i].jscolor instanceof jsc.pub) {\r\n\t\t\t\tcontinue; // jscolor already installed on this element\r\n\t\t\t}\r\n\r\n\t\t\tif (elms[i].type !== undefined && elms[i].type.toLowerCase() == 'color' && jsc.isColorAttrSupported) {\r\n\t\t\t\tcontinue; // skips inputs of type 'color' if supported by the browser\r\n\t\t\t}\r\n\r\n\t\t\tvar dataOpts, m;\r\n\r\n\t\t\tif (\r\n\t\t\t\t(dataOpts = jsc.getDataAttr(elms[i], 'jscolor')) !== null ||\r\n\t\t\t\t(elms[i].className && (m = elms[i].className.match(matchClass))) // installation using className (DEPRECATED)\r\n\t\t\t) {\r\n\t\t\t\tvar targetElm = elms[i];\r\n\r\n\t\t\t\tvar optsStr = '';\r\n\t\t\t\tif (dataOpts !== null) {\r\n\t\t\t\t\toptsStr = dataOpts;\r\n\r\n\t\t\t\t} else if (m) { // installation using className (DEPRECATED)\r\n\t\t\t\t\tconsole.warn('Installation using class name is DEPRECATED. Use data-jscolor=\"\" attribute instead.' + jsc.docsRef);\r\n\t\t\t\t\tif (m[4]) {\r\n\t\t\t\t\t\toptsStr = m[4];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar opts = null;\r\n\t\t\t\tif (optsStr.trim()) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\topts = jsc.parseOptionsStr(optsStr);\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tconsole.warn(e + '\\n' + optsStr);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tnew jsc.pub(targetElm, opts);\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tparseOptionsStr : function (str) {\r\n\t\tvar opts = null;\r\n\r\n\t\ttry {\r\n\t\t\topts = JSON.parse(str);\r\n\r\n\t\t} catch (eParse) {\r\n\t\t\tif (!jsc.pub.looseJSON) {\r\n\t\t\t\tthrow new Error('Could not parse jscolor options as JSON: ' + eParse);\r\n\t\t\t} else {\r\n\t\t\t\t// loose JSON syntax is enabled -> try to evaluate the options string as JavaScript object\r\n\t\t\t\ttry {\r\n\t\t\t\t\topts = (new Function ('var opts = (' + str + '); return typeof opts === \"object\" ? opts : {};'))();\r\n\t\t\t\t} catch (eEval) {\r\n\t\t\t\t\tthrow new Error('Could not evaluate jscolor options: ' + eEval);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn opts;\r\n\t},\r\n\r\n\r\n\tgetInstances : function () {\r\n\t\tvar inst = [];\r\n\t\tfor (var i = 0; i < jsc.instances.length; i += 1) {\r\n\t\t\t// if the targetElement still exists, the instance is considered \"alive\"\r\n\t\t\tif (jsc.instances[i] && jsc.instances[i].targetElement) {\r\n\t\t\t\tinst.push(jsc.instances[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn inst;\r\n\t},\r\n\r\n\r\n\tcreateEl : function (tagName) {\r\n\t\tvar el = window.document.createElement(tagName);\r\n\t\tjsc.setData(el, 'gui', true);\r\n\t\treturn el;\r\n\t},\r\n\r\n\r\n\tnode : function (nodeOrSelector) {\r\n\t\tif (!nodeOrSelector) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif (typeof nodeOrSelector === 'string') {\r\n\t\t\t// query selector\r\n\t\t\tvar sel = nodeOrSelector;\r\n\t\t\tvar el = null;\r\n\t\t\ttry {\r\n\t\t\t\tel = window.document.querySelector(sel);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tconsole.warn(e);\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tif (!el) {\r\n\t\t\t\tconsole.warn('No element matches the selector: %s', sel);\r\n\t\t\t}\r\n\t\t\treturn el;\r\n\t\t}\r\n\r\n\t\tif (jsc.isNode(nodeOrSelector)) {\r\n\t\t\t// DOM node\r\n\t\t\treturn nodeOrSelector;\r\n\t\t}\r\n\r\n\t\tconsole.warn('Invalid node of type %s: %s', typeof nodeOrSelector, nodeOrSelector);\r\n\t\treturn null;\r\n\t},\r\n\r\n\r\n\t// See https://stackoverflow.com/questions/384286/\r\n\tisNode : function (val) {\r\n\t\tif (typeof Node === 'object') {\r\n\t\t\treturn val instanceof Node;\r\n\t\t}\r\n\t\treturn val && typeof val === 'object' && typeof val.nodeType === 'number' && typeof val.nodeName === 'string';\r\n\t},\r\n\r\n\r\n\tnodeName : function (node) {\r\n\t\tif (node && node.nodeName) {\r\n\t\t\treturn node.nodeName.toLowerCase();\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\r\n\tremoveChildren : function (node) {\r\n\t\twhile (node.firstChild) {\r\n\t\t\tnode.removeChild(node.firstChild);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tisTextInput : function (el) {\r\n\t\treturn el && jsc.nodeName(el) === 'input' && el.type.toLowerCase() === 'text';\r\n\t},\r\n\r\n\r\n\tisButton : function (el) {\r\n\t\tif (!el) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tvar n = jsc.nodeName(el);\r\n\t\treturn (\r\n\t\t\t(n === 'button') ||\r\n\t\t\t(n === 'input' && ['button', 'submit', 'reset'].indexOf(el.type.toLowerCase()) > -1)\r\n\t\t);\r\n\t},\r\n\r\n\r\n\tisButtonEmpty : function (el) {\r\n\t\tswitch (jsc.nodeName(el)) {\r\n\t\t\tcase 'input': return (!el.value || el.value.trim() === '');\r\n\t\t\tcase 'button': return (el.textContent.trim() === '');\r\n\t\t}\r\n\t\treturn null; // could not determine element's text\r\n\t},\r\n\r\n\r\n\t// See https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\r\n\tisPassiveEventSupported : (function () {\r\n\t\tvar supported = false;\r\n\r\n\t\ttry {\r\n\t\t\tvar opts = Object.defineProperty({}, 'passive', {\r\n\t\t\t\tget: function () { supported = true; }\r\n\t\t\t});\r\n\t\t\twindow.addEventListener('testPassive', null, opts);\r\n\t\t\twindow.removeEventListener('testPassive', null, opts);\r\n\t\t} catch (e) {}\r\n\r\n\t\treturn supported;\r\n\t})(),\r\n\r\n\r\n\tisColorAttrSupported : (function () {\r\n\t\tvar elm = window.document.createElement('input');\r\n\t\tif (elm.setAttribute) {\r\n\t\t\telm.setAttribute('type', 'color');\r\n\t\t\tif (elm.type.toLowerCase() == 'color') {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t})(),\r\n\r\n\r\n\tdataProp : '_data_jscolor',\r\n\r\n\r\n\t// usage:\r\n\t// setData(obj, prop, value)\r\n\t// setData(obj, {prop:value, ...})\r\n\t//\r\n\tsetData : function () {\r\n\t\tvar obj = arguments[0];\r\n\r\n\t\tif (arguments.length === 3) {\r\n\t\t\t// setting a single property\r\n\t\t\tvar data = obj.hasOwnProperty(jsc.dataProp) ? obj[jsc.dataProp] : (obj[jsc.dataProp] = {});\r\n\t\t\tvar prop = arguments[1];\r\n\t\t\tvar value = arguments[2];\r\n\r\n\t\t\tdata[prop] = value;\r\n\t\t\treturn true;\r\n\r\n\t\t} else if (arguments.length === 2 && typeof arguments[1] === 'object') {\r\n\t\t\t// setting multiple properties\r\n\t\t\tvar data = obj.hasOwnProperty(jsc.dataProp) ? obj[jsc.dataProp] : (obj[jsc.dataProp] = {});\r\n\t\t\tvar map = arguments[1];\r\n\r\n\t\t\tfor (var prop in map) {\r\n\t\t\t\tif (map.hasOwnProperty(prop)) {\r\n\t\t\t\t\tdata[prop] = map[prop];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tthrow new Error('Invalid arguments');\r\n\t},\r\n\r\n\r\n\t// usage:\r\n\t// removeData(obj, prop, [prop...])\r\n\t//\r\n\tremoveData : function () {\r\n\t\tvar obj = arguments[0];\r\n\t\tif (!obj.hasOwnProperty(jsc.dataProp)) {\r\n\t\t\treturn true; // data object does not exist\r\n\t\t}\r\n\t\tfor (var i = 1; i < arguments.length; i += 1) {\r\n\t\t\tvar prop = arguments[i];\r\n\t\t\tdelete obj[jsc.dataProp][prop];\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n\r\n\r\n\tgetData : function (obj, prop, setDefault) {\r\n\t\tif (!obj.hasOwnProperty(jsc.dataProp)) {\r\n\t\t\t// data object does not exist\r\n\t\t\tif (setDefault !== undefined) {\r\n\t\t\t\tobj[jsc.dataProp] = {}; // create data object\r\n\t\t\t} else {\r\n\t\t\t\treturn undefined; // no value to return\r\n\t\t\t}\r\n\t\t}\r\n\t\tvar data = obj[jsc.dataProp];\r\n\r\n\t\tif (!data.hasOwnProperty(prop) && setDefault !== undefined) {\r\n\t\t\tdata[prop] = setDefault;\r\n\t\t}\r\n\t\treturn data[prop];\r\n\t},\r\n\r\n\r\n\tgetDataAttr : function (el, name) {\r\n\t\tvar attrName = 'data-' + name;\r\n\t\tvar attrValue = el.getAttribute(attrName);\r\n\t\treturn attrValue;\r\n\t},\r\n\r\n\r\n\tsetDataAttr : function (el, name, value) {\r\n\t\tvar attrName = 'data-' + name;\r\n\t\tel.setAttribute(attrName, value);\r\n\t},\r\n\r\n\r\n\t_attachedGroupEvents : {},\r\n\r\n\r\n\tattachGroupEvent : function (groupName, el, evnt, func) {\r\n\t\tif (!jsc._attachedGroupEvents.hasOwnProperty(groupName)) {\r\n\t\t\tjsc._attachedGroupEvents[groupName] = [];\r\n\t\t}\r\n\t\tjsc._attachedGroupEvents[groupName].push([el, evnt, func]);\r\n\t\tel.addEventListener(evnt, func, false);\r\n\t},\r\n\r\n\r\n\tdetachGroupEvents : function (groupName) {\r\n\t\tif (jsc._attachedGroupEvents.hasOwnProperty(groupName)) {\r\n\t\t\tfor (var i = 0; i < jsc._attachedGroupEvents[groupName].length; i += 1) {\r\n\t\t\t\tvar evt = jsc._attachedGroupEvents[groupName][i];\r\n\t\t\t\tevt[0].removeEventListener(evt[1], evt[2], false);\r\n\t\t\t}\r\n\t\t\tdelete jsc._attachedGroupEvents[groupName];\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tpreventDefault : function (e) {\r\n\t\tif (e.preventDefault) { e.preventDefault(); }\r\n\t\te.returnValue = false;\r\n\t},\r\n\r\n\r\n\tcaptureTarget : function (target) {\r\n\t\t// IE\r\n\t\tif (target.setCapture) {\r\n\t\t\tjsc._capturedTarget = target;\r\n\t\t\tjsc._capturedTarget.setCapture();\r\n\t\t}\r\n\t},\r\n\r\n\r\n\treleaseTarget : function () {\r\n\t\t// IE\r\n\t\tif (jsc._capturedTarget) {\r\n\t\t\tjsc._capturedTarget.releaseCapture();\r\n\t\t\tjsc._capturedTarget = null;\r\n\t\t}\r\n\t},\r\n\r\n\r\n\ttriggerEvent : function (el, eventName, bubbles, cancelable) {\r\n\t\tif (!el) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar ev = null;\r\n\r\n\t\tif (typeof Event === 'function') {\r\n\t\t\tev = new Event(eventName, {\r\n\t\t\t\tbubbles: bubbles,\r\n\t\t\t\tcancelable: cancelable\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\t// IE\r\n\t\t\tev = window.document.createEvent('Event');\r\n\t\t\tev.initEvent(eventName, bubbles, cancelable);\r\n\t\t}\r\n\r\n\t\tif (!ev) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// so that we know that the event was triggered internally\r\n\t\tjsc.setData(ev, 'internal', true);\r\n\r\n\t\tel.dispatchEvent(ev);\r\n\t\treturn true;\r\n\t},\r\n\r\n\r\n\ttriggerInputEvent : function (el, eventName, bubbles, cancelable) {\r\n\t\tif (!el) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (jsc.isTextInput(el)) {\r\n\t\t\tjsc.triggerEvent(el, eventName, bubbles, cancelable);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\teventKey : function (ev) {\r\n\t\tvar keys = {\r\n\t\t\t9: 'Tab',\r\n\t\t\t13: 'Enter',\r\n\t\t\t27: 'Escape',\r\n\t\t};\r\n\t\tif (typeof ev.code === 'string') {\r\n\t\t\treturn ev.code;\r\n\t\t} else if (ev.keyCode !== undefined && keys.hasOwnProperty(ev.keyCode)) {\r\n\t\t\treturn keys[ev.keyCode];\r\n\t\t}\r\n\t\treturn null;\r\n\t},\r\n\r\n\r\n\tstrList : function (str) {\r\n\t\tif (!str) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t\treturn str.replace(/^\\s+|\\s+$/g, '').split(/\\s+/);\r\n\t},\r\n\r\n\r\n\t// The className parameter (str) can only contain a single class name\r\n\thasClass : function (elm, className) {\r\n\t\tif (!className) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (elm.classList !== undefined) {\r\n\t\t\treturn elm.classList.contains(className);\r\n\t\t}\r\n\t\t// polyfill\r\n\t\treturn -1 != (' ' + elm.className.replace(/\\s+/g, ' ') + ' ').indexOf(' ' + className + ' ');\r\n\t},\r\n\r\n\r\n\t// The className parameter (str) can contain multiple class names separated by whitespace\r\n\taddClass : function (elm, className) {\r\n\t\tvar classNames = jsc.strList(className);\r\n\r\n\t\tif (elm.classList !== undefined) {\r\n\t\t\tfor (var i = 0; i < classNames.length; i += 1) {\r\n\t\t\t\telm.classList.add(classNames[i]);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// polyfill\r\n\t\tfor (var i = 0; i < classNames.length; i += 1) {\r\n\t\t\tif (!jsc.hasClass(elm, classNames[i])) {\r\n\t\t\t\telm.className += (elm.className ? ' ' : '') + classNames[i];\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t// The className parameter (str) can contain multiple class names separated by whitespace\r\n\tremoveClass : function (elm, className) {\r\n\t\tvar classNames = jsc.strList(className);\r\n\r\n\t\tif (elm.classList !== undefined) {\r\n\t\t\tfor (var i = 0; i < classNames.length; i += 1) {\r\n\t\t\t\telm.classList.remove(classNames[i]);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// polyfill\r\n\t\tfor (var i = 0; i < classNames.length; i += 1) {\r\n\t\t\tvar repl = new RegExp(\r\n\t\t\t\t'^\\\\s*' + classNames[i] + '\\\\s*|' +\r\n\t\t\t\t'\\\\s*' + classNames[i] + '\\\\s*$|' +\r\n\t\t\t\t'\\\\s+' + classNames[i] + '(\\\\s+)',\r\n\t\t\t\t'g'\r\n\t\t\t);\r\n\t\t\telm.className = elm.className.replace(repl, '$1');\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tgetCompStyle : function (elm) {\r\n\t\tvar compStyle = window.getComputedStyle ? window.getComputedStyle(elm) : elm.currentStyle;\r\n\r\n\t\t// Note: In Firefox, getComputedStyle returns null in a hidden iframe,\r\n\t\t// that's why we need to check if the returned value is non-empty\r\n\t\tif (!compStyle) {\r\n\t\t\treturn {};\r\n\t\t}\r\n\t\treturn compStyle;\r\n\t},\r\n\r\n\r\n\t// Note:\r\n\t// Setting a property to NULL reverts it to the state before it was first set\r\n\t// with the 'reversible' flag enabled\r\n\t//\r\n\tsetStyle : function (elm, styles, important, reversible) {\r\n\t\t// using '' for standard priority (IE10 apparently doesn't like value undefined)\r\n\t\tvar priority = important ? 'important' : '';\r\n\t\tvar origStyle = null;\r\n\r\n\t\tfor (var prop in styles) {\r\n\t\t\tif (styles.hasOwnProperty(prop)) {\r\n\t\t\t\tvar setVal = null;\r\n\r\n\t\t\t\tif (styles[prop] === null) {\r\n\t\t\t\t\t// reverting a property value\r\n\r\n\t\t\t\t\tif (!origStyle) {\r\n\t\t\t\t\t\t// get the original style object, but dont't try to create it if it doesn't exist\r\n\t\t\t\t\t\torigStyle = jsc.getData(elm, 'origStyle');\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (origStyle && origStyle.hasOwnProperty(prop)) {\r\n\t\t\t\t\t\t// we have property's original value -> use it\r\n\t\t\t\t\t\tsetVal = origStyle[prop];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// setting a property value\r\n\r\n\t\t\t\t\tif (reversible) {\r\n\t\t\t\t\t\tif (!origStyle) {\r\n\t\t\t\t\t\t\t// get the original style object and if it doesn't exist, create it\r\n\t\t\t\t\t\t\torigStyle = jsc.getData(elm, 'origStyle', {});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!origStyle.hasOwnProperty(prop)) {\r\n\t\t\t\t\t\t\t// original property value not yet stored -> store it\r\n\t\t\t\t\t\t\torigStyle[prop] = elm.style[prop];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tsetVal = styles[prop];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (setVal !== null) {\r\n\t\t\t\t\telm.style.setProperty(prop, setVal, priority);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\thexColor : function (r, g, b) {\r\n\t\treturn '#' + (\r\n\t\t\t('0' + Math.round(r).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(g).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(b).toString(16)).substr(-2)\r\n\t\t).toUpperCase();\r\n\t},\r\n\r\n\r\n\thexaColor : function (r, g, b, a) {\r\n\t\treturn '#' + (\r\n\t\t\t('0' + Math.round(r).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(g).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(b).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(a * 255).toString(16)).substr(-2)\r\n\t\t).toUpperCase();\r\n\t},\r\n\r\n\r\n\trgbColor : function (r, g, b) {\r\n\t\treturn 'rgb(' +\r\n\t\t\tMath.round(r) + ',' +\r\n\t\t\tMath.round(g) + ',' +\r\n\t\t\tMath.round(b) +\r\n\t\t')';\r\n\t},\r\n\r\n\r\n\trgbaColor : function (r, g, b, a) {\r\n\t\treturn 'rgba(' +\r\n\t\t\tMath.round(r) + ',' +\r\n\t\t\tMath.round(g) + ',' +\r\n\t\t\tMath.round(b) + ',' +\r\n\t\t\t(Math.round((a===undefined || a===null ? 1 : a) * 100) / 100) +\r\n\t\t')';\r\n\t},\r\n\r\n\r\n\tlinearGradient : (function () {\r\n\r\n\t\tfunction getFuncName () {\r\n\t\t\tvar stdName = 'linear-gradient';\r\n\t\t\tvar prefixes = ['', '-webkit-', '-moz-', '-o-', '-ms-'];\r\n\t\t\tvar helper = window.document.createElement('div');\r\n\r\n\t\t\tfor (var i = 0; i < prefixes.length; i += 1) {\r\n\t\t\t\tvar tryFunc = prefixes[i] + stdName;\r\n\t\t\t\tvar tryVal = tryFunc + '(to right, rgba(0,0,0,0), rgba(0,0,0,0))';\r\n\r\n\t\t\t\thelper.style.background = tryVal;\r\n\t\t\t\tif (helper.style.background) { // CSS background successfully set -> function name is supported\r\n\t\t\t\t\treturn tryFunc;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn stdName; // fallback to standard 'linear-gradient' without vendor prefix\r\n\t\t}\r\n\r\n\t\tvar funcName = getFuncName();\r\n\r\n\t\treturn function () {\r\n\t\t\treturn funcName + '(' + Array.prototype.join.call(arguments, ', ') + ')';\r\n\t\t};\r\n\r\n\t})(),\r\n\r\n\r\n\tsetBorderRadius : function (elm, value) {\r\n\t\tjsc.setStyle(elm, {'border-radius' : value || '0'});\r\n\t},\r\n\r\n\r\n\tsetBoxShadow : function (elm, value) {\r\n\t\tjsc.setStyle(elm, {'box-shadow': value || 'none'});\r\n\t},\r\n\r\n\r\n\tgetElementPos : function (e, relativeToViewport) {\r\n\t\tvar x=0, y=0;\r\n\t\tvar rect = e.getBoundingClientRect();\r\n\t\tx = rect.left;\r\n\t\ty = rect.top;\r\n\t\tif (!relativeToViewport) {\r\n\t\t\tvar viewPos = jsc.getViewPos();\r\n\t\t\tx += viewPos[0];\r\n\t\t\ty += viewPos[1];\r\n\t\t}\r\n\t\treturn [x, y];\r\n\t},\r\n\r\n\r\n\tgetElementSize : function (e) {\r\n\t\treturn [e.offsetWidth, e.offsetHeight];\r\n\t},\r\n\r\n\r\n\t// get pointer's X/Y coordinates relative to viewport\r\n\tgetAbsPointerPos : function (e) {\r\n\t\tvar x = 0, y = 0;\r\n\t\tif (typeof e.changedTouches !== 'undefined' && e.changedTouches.length) {\r\n\t\t\t// touch devices\r\n\t\t\tx = e.changedTouches[0].clientX;\r\n\t\t\ty = e.changedTouches[0].clientY;\r\n\t\t} else if (typeof e.clientX === 'number') {\r\n\t\t\tx = e.clientX;\r\n\t\t\ty = e.clientY;\r\n\t\t}\r\n\t\treturn { x: x, y: y };\r\n\t},\r\n\r\n\r\n\t// get pointer's X/Y coordinates relative to target element\r\n\tgetRelPointerPos : function (e) {\r\n\t\tvar target = e.target || e.srcElement;\r\n\t\tvar targetRect = target.getBoundingClientRect();\r\n\r\n\t\tvar x = 0, y = 0;\r\n\r\n\t\tvar clientX = 0, clientY = 0;\r\n\t\tif (typeof e.changedTouches !== 'undefined' && e.changedTouches.length) {\r\n\t\t\t// touch devices\r\n\t\t\tclientX = e.changedTouches[0].clientX;\r\n\t\t\tclientY = e.changedTouches[0].clientY;\r\n\t\t} else if (typeof e.clientX === 'number') {\r\n\t\t\tclientX = e.clientX;\r\n\t\t\tclientY = e.clientY;\r\n\t\t}\r\n\r\n\t\tx = clientX - targetRect.left;\r\n\t\ty = clientY - targetRect.top;\r\n\t\treturn { x: x, y: y };\r\n\t},\r\n\r\n\r\n\tgetViewPos : function () {\r\n\t\tvar doc = window.document.documentElement;\r\n\t\treturn [\r\n\t\t\t(window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0),\r\n\t\t\t(window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0)\r\n\t\t];\r\n\t},\r\n\r\n\r\n\tgetViewSize : function () {\r\n\t\tvar doc = window.document.documentElement;\r\n\t\treturn [\r\n\t\t\t(window.innerWidth || doc.clientWidth),\r\n\t\t\t(window.innerHeight || doc.clientHeight),\r\n\t\t];\r\n\t},\r\n\r\n\r\n\t// r: 0-255\r\n\t// g: 0-255\r\n\t// b: 0-255\r\n\t//\r\n\t// returns: [ 0-360, 0-100, 0-100 ]\r\n\t//\r\n\tRGB_HSV : function (r, g, b) {\r\n\t\tr /= 255;\r\n\t\tg /= 255;\r\n\t\tb /= 255;\r\n\t\tvar n = Math.min(Math.min(r,g),b);\r\n\t\tvar v = Math.max(Math.max(r,g),b);\r\n\t\tvar m = v - n;\r\n\t\tif (m === 0) { return [ null, 0, 100 * v ]; }\r\n\t\tvar h = r===n ? 3+(b-g)/m : (g===n ? 5+(r-b)/m : 1+(g-r)/m);\r\n\t\treturn [\r\n\t\t\t60 * (h===6?0:h),\r\n\t\t\t100 * (m/v),\r\n\t\t\t100 * v\r\n\t\t];\r\n\t},\r\n\r\n\r\n\t// h: 0-360\r\n\t// s: 0-100\r\n\t// v: 0-100\r\n\t//\r\n\t// returns: [ 0-255, 0-255, 0-255 ]\r\n\t//\r\n\tHSV_RGB : function (h, s, v) {\r\n\t\tvar u = 255 * (v / 100);\r\n\r\n\t\tif (h === null) {\r\n\t\t\treturn [ u, u, u ];\r\n\t\t}\r\n\r\n\t\th /= 60;\r\n\t\ts /= 100;\r\n\r\n\t\tvar i = Math.floor(h);\r\n\t\tvar f = i%2 ? h-i : 1-(h-i);\r\n\t\tvar m = u * (1 - s);\r\n\t\tvar n = u * (1 - s * f);\r\n\t\tswitch (i) {\r\n\t\t\tcase 6:\r\n\t\t\tcase 0: return [u,n,m];\r\n\t\t\tcase 1: return [n,u,m];\r\n\t\t\tcase 2: return [m,u,n];\r\n\t\t\tcase 3: return [m,n,u];\r\n\t\t\tcase 4: return [n,m,u];\r\n\t\t\tcase 5: return [u,m,n];\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tparseColorString : function (str) {\r\n\t\tvar ret = {\r\n\t\t\trgba: null,\r\n\t\t\tformat: null // 'hex' | 'hexa' | 'rgb' | 'rgba'\r\n\t\t};\r\n\r\n\t\tvar m;\r\n\r\n\t\tif (m = str.match(/^\\W*([0-9A-F]{3,8})\\W*$/i)) {\r\n\t\t\t// HEX notation\r\n\r\n\t\t\tif (m[1].length === 8) {\r\n\t\t\t\t// 8-char notation (= with alpha)\r\n\t\t\t\tret.format = 'hexa';\r\n\t\t\t\tret.rgba = [\r\n\t\t\t\t\tparseInt(m[1].substr(0,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(2,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(4,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(6,2),16) / 255\r\n\t\t\t\t];\r\n\r\n\t\t\t} else if (m[1].length === 6) {\r\n\t\t\t\t// 6-char notation\r\n\t\t\t\tret.format = 'hex';\r\n\t\t\t\tret.rgba = [\r\n\t\t\t\t\tparseInt(m[1].substr(0,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(2,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(4,2),16),\r\n\t\t\t\t\tnull\r\n\t\t\t\t];\r\n\r\n\t\t\t} else if (m[1].length === 3) {\r\n\t\t\t\t// 3-char notation\r\n\t\t\t\tret.format = 'hex';\r\n\t\t\t\tret.rgba = [\r\n\t\t\t\t\tparseInt(m[1].charAt(0) + m[1].charAt(0),16),\r\n\t\t\t\t\tparseInt(m[1].charAt(1) + m[1].charAt(1),16),\r\n\t\t\t\t\tparseInt(m[1].charAt(2) + m[1].charAt(2),16),\r\n\t\t\t\t\tnull\r\n\t\t\t\t];\r\n\r\n\t\t\t} else {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\treturn ret;\r\n\t\t}\r\n\r\n\t\tif (m = str.match(/^\\W*rgba?\\(([^)]*)\\)\\W*$/i)) {\r\n\t\t\t// rgb(...) or rgba(...) notation\r\n\r\n\t\t\tvar par = m[1].split(',');\r\n\t\t\tvar re = /^\\s*(\\d+|\\d*\\.\\d+|\\d+\\.\\d*)\\s*$/;\r\n\t\t\tvar mR, mG, mB, mA;\r\n\t\t\tif (\r\n\t\t\t\tpar.length >= 3 &&\r\n\t\t\t\t(mR = par[0].match(re)) &&\r\n\t\t\t\t(mG = par[1].match(re)) &&\r\n\t\t\t\t(mB = par[2].match(re))\r\n\t\t\t) {\r\n\t\t\t\tret.format = 'rgb';\r\n\t\t\t\tret.rgba = [\r\n\t\t\t\t\tparseFloat(mR[1]) || 0,\r\n\t\t\t\t\tparseFloat(mG[1]) || 0,\r\n\t\t\t\t\tparseFloat(mB[1]) || 0,\r\n\t\t\t\t\tnull\r\n\t\t\t\t];\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tpar.length >= 4 &&\r\n\t\t\t\t\t(mA = par[3].match(re))\r\n\t\t\t\t) {\r\n\t\t\t\t\tret.format = 'rgba';\r\n\t\t\t\t\tret.rgba[3] = parseFloat(mA[1]) || 0;\r\n\t\t\t\t}\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\r\n\tparsePaletteValue : function (mixed) {\r\n\t\tvar vals = [];\r\n\r\n\t\tif (typeof mixed === 'string') { // input is a string of space separated color values\r\n\t\t\t// rgb() and rgba() may contain spaces too, so let's find all color values by regex\r\n\t\t\tmixed.replace(/#[0-9A-F]{3}([0-9A-F]{3})?|rgba?\\(([^)]*)\\)/ig, function (val) {\r\n\t\t\t\tvals.push(val);\r\n\t\t\t});\r\n\t\t} else if (Array.isArray(mixed)) { // input is an array of color values\r\n\t\t\tvals = mixed;\r\n\t\t}\r\n\r\n\t\t// convert all values into uniform color format\r\n\r\n\t\tvar colors = [];\r\n\r\n\t\tfor (var i = 0; i < vals.length; i++) {\r\n\t\t\tvar color = jsc.parseColorString(vals[i]);\r\n\t\t\tif (color) {\r\n\t\t\t\tcolors.push(color);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn colors;\r\n\t},\r\n\r\n\r\n\tcontainsTranparentColor : function (colors) {\r\n\t\tfor (var i = 0; i < colors.length; i++) {\r\n\t\t\tvar a = colors[i].rgba[3];\r\n\t\t\tif (a !== null && a < 1.0) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\r\n\tisAlphaFormat : function (format) {\r\n\t\tswitch (format.toLowerCase()) {\r\n\t\tcase 'hexa':\r\n\t\tcase 'rgba':\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\r\n\t// Canvas scaling for retina displays\r\n\t//\r\n\t// adapted from https://www.html5rocks.com/en/tutorials/canvas/hidpi/\r\n\t//\r\n\tscaleCanvasForHighDPR : function (canvas) {\r\n\t\tvar dpr = window.devicePixelRatio || 1;\r\n\t\tcanvas.width *= dpr;\r\n\t\tcanvas.height *= dpr;\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\t\tctx.scale(dpr, dpr);\r\n\t},\r\n\r\n\r\n\tgenColorPreviewCanvas : function (color, separatorPos, specWidth, scaleForHighDPR) {\r\n\r\n\t\tvar sepW = Math.round(jsc.pub.previewSeparator.length);\r\n\t\tvar sqSize = jsc.pub.chessboardSize;\r\n\t\tvar sqColor1 = jsc.pub.chessboardColor1;\r\n\t\tvar sqColor2 = jsc.pub.chessboardColor2;\r\n\r\n\t\tvar cWidth = specWidth ? specWidth : sqSize * 2;\r\n\t\tvar cHeight = sqSize * 2;\r\n\r\n\t\tvar canvas = jsc.createEl('canvas');\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\r\n\t\tcanvas.width = cWidth;\r\n\t\tcanvas.height = cHeight;\r\n\t\tif (scaleForHighDPR) {\r\n\t\t\tjsc.scaleCanvasForHighDPR(canvas);\r\n\t\t}\r\n\r\n\t\t// transparency chessboard - background\r\n\t\tctx.fillStyle = sqColor1;\r\n\t\tctx.fillRect(0, 0, cWidth, cHeight);\r\n\r\n\t\t// transparency chessboard - squares\r\n\t\tctx.fillStyle = sqColor2;\r\n\t\tfor (var x = 0; x < cWidth; x += sqSize * 2) {\r\n\t\t\tctx.fillRect(x, 0, sqSize, sqSize);\r\n\t\t\tctx.fillRect(x + sqSize, sqSize, sqSize, sqSize);\r\n\t\t}\r\n\r\n\t\tif (color) {\r\n\t\t\t// actual color in foreground\r\n\t\t\tctx.fillStyle = color;\r\n\t\t\tctx.fillRect(0, 0, cWidth, cHeight);\r\n\t\t}\r\n\r\n\t\tvar start = null;\r\n\t\tswitch (separatorPos) {\r\n\t\t\tcase 'left':\r\n\t\t\t\tstart = 0;\r\n\t\t\t\tctx.clearRect(0, 0, sepW/2, cHeight);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'right':\r\n\t\t\t\tstart = cWidth - sepW;\r\n\t\t\t\tctx.clearRect(cWidth - (sepW/2), 0, sepW/2, cHeight);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tif (start !== null) {\r\n\t\t\tctx.lineWidth = 1;\r\n\t\t\tfor (var i = 0; i < jsc.pub.previewSeparator.length; i += 1) {\r\n\t\t\t\tctx.beginPath();\r\n\t\t\t\tctx.strokeStyle = jsc.pub.previewSeparator[i];\r\n\t\t\t\tctx.moveTo(0.5 + start + i, 0);\r\n\t\t\t\tctx.lineTo(0.5 + start + i, cHeight);\r\n\t\t\t\tctx.stroke();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tcanvas: canvas,\r\n\t\t\twidth: cWidth,\r\n\t\t\theight: cHeight,\r\n\t\t};\r\n\t},\r\n\r\n\r\n\t// if position or width is not set => fill the entire element (0%-100%)\r\n\tgenColorPreviewGradient : function (color, position, width) {\r\n\t\tvar params = [];\r\n\r\n\t\tif (position && width) {\r\n\t\t\tparams = [\r\n\t\t\t\t'to ' + {'left':'right', 'right':'left'}[position],\r\n\t\t\t\tcolor + ' 0%',\r\n\t\t\t\tcolor + ' ' + width + 'px',\r\n\t\t\t\t'rgba(0,0,0,0) ' + (width + 1) + 'px',\r\n\t\t\t\t'rgba(0,0,0,0) 100%',\r\n\t\t\t];\r\n\t\t} else {\r\n\t\t\tparams = [\r\n\t\t\t\t'to right',\r\n\t\t\t\tcolor + ' 0%',\r\n\t\t\t\tcolor + ' 100%',\r\n\t\t\t];\r\n\t\t}\r\n\r\n\t\treturn jsc.linearGradient.apply(this, params);\r\n\t},\r\n\r\n\r\n\tredrawPosition : function () {\r\n\r\n\t\tif (!jsc.picker || !jsc.picker.owner) {\r\n\t\t\treturn; // picker is not shown\r\n\t\t}\r\n\r\n\t\tvar thisObj = jsc.picker.owner;\r\n\r\n\t\tvar tp, vp;\r\n\r\n\t\tif (thisObj.fixed) {\r\n\t\t\t// Fixed elements are positioned relative to viewport,\r\n\t\t\t// therefore we can ignore the scroll offset\r\n\t\t\ttp = jsc.getElementPos(thisObj.targetElement, true); // target pos\r\n\t\t\tvp = [0, 0]; // view pos\r\n\t\t} else {\r\n\t\t\ttp = jsc.getElementPos(thisObj.targetElement); // target pos\r\n\t\t\tvp = jsc.getViewPos(); // view pos\r\n\t\t}\r\n\r\n\t\tvar ts = jsc.getElementSize(thisObj.targetElement); // target size\r\n\t\tvar vs = jsc.getViewSize(); // view size\r\n\t\tvar pd = jsc.getPickerDims(thisObj);\r\n\t\tvar ps = [pd.borderW, pd.borderH]; // picker outer size\r\n\t\tvar a, b, c;\r\n\t\tswitch (thisObj.position.toLowerCase()) {\r\n\t\t\tcase 'left': a=1; b=0; c=-1; break;\r\n\t\t\tcase 'right':a=1; b=0; c=1; break;\r\n\t\t\tcase 'top': a=0; b=1; c=-1; break;\r\n\t\t\tdefault: a=0; b=1; c=1; break;\r\n\t\t}\r\n\t\tvar l = (ts[b]+ps[b])/2;\r\n\r\n\t\t// compute picker position\r\n\t\tif (!thisObj.smartPosition) {\r\n\t\t\tvar pp = [\r\n\t\t\t\ttp[a],\r\n\t\t\t\ttp[b]+ts[b]-l+l*c\r\n\t\t\t];\r\n\t\t} else {\r\n\t\t\tvar pp = [\r\n\t\t\t\t-vp[a]+tp[a]+ps[a] > vs[a] ?\r\n\t\t\t\t\t(-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) :\r\n\t\t\t\t\ttp[a],\r\n\t\t\t\t-vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ?\r\n\t\t\t\t\t(-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) :\r\n\t\t\t\t\t(tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c)\r\n\t\t\t];\r\n\t\t}\r\n\r\n\t\tvar x = pp[a];\r\n\t\tvar y = pp[b];\r\n\t\tvar positionValue = thisObj.fixed ? 'fixed' : 'absolute';\r\n\t\tvar contractShadow =\r\n\t\t\t(pp[0] + ps[0] > tp[0] || pp[0] < tp[0] + ts[0]) &&\r\n\t\t\t(pp[1] + ps[1] < tp[1] + ts[1]);\r\n\r\n\t\tjsc._drawPosition(thisObj, x, y, positionValue, contractShadow);\r\n\t},\r\n\r\n\r\n\t_drawPosition : function (thisObj, x, y, positionValue, contractShadow) {\r\n\t\tvar vShadow = contractShadow ? 0 : thisObj.shadowBlur; // px\r\n\r\n\t\tjsc.picker.wrap.style.position = positionValue;\r\n\t\tjsc.picker.wrap.style.left = x + 'px';\r\n\t\tjsc.picker.wrap.style.top = y + 'px';\r\n\r\n\t\tjsc.setBoxShadow(\r\n\t\t\tjsc.picker.boxS,\r\n\t\t\tthisObj.shadow ?\r\n\t\t\t\tnew jsc.BoxShadow(0, vShadow, thisObj.shadowBlur, 0, thisObj.shadowColor) :\r\n\t\t\t\tnull);\r\n\t},\r\n\r\n\r\n\tgetPickerDims : function (thisObj) {\r\n\t\tvar w = 2 * thisObj.controlBorderWidth + thisObj.width;\r\n\t\tvar h = 2 * thisObj.controlBorderWidth + thisObj.height;\r\n\r\n\t\tvar sliderSpace = 2 * thisObj.controlBorderWidth + 2 * jsc.getControlPadding(thisObj) + thisObj.sliderSize;\r\n\r\n\t\tif (jsc.getSliderChannel(thisObj)) {\r\n\t\t\tw += sliderSpace;\r\n\t\t}\r\n\t\tif (thisObj.hasAlphaChannel()) {\r\n\t\t\tw += sliderSpace;\r\n\t\t}\r\n\r\n\t\tvar pal = jsc.getPaletteDims(thisObj, w);\r\n\r\n\t\tif (pal.height) {\r\n\t\t\th += pal.height + thisObj.padding;\r\n\t\t}\r\n\t\tif (thisObj.closeButton) {\r\n\t\t\th += 2 * thisObj.controlBorderWidth + thisObj.padding + thisObj.buttonHeight;\r\n\t\t}\r\n\r\n\t\tvar pW = w + (2 * thisObj.padding);\r\n\t\tvar pH = h + (2 * thisObj.padding);\r\n\r\n\t\treturn {\r\n\t\t\tcontentW: w,\r\n\t\t\tcontentH: h,\r\n\t\t\tpaddedW: pW,\r\n\t\t\tpaddedH: pH,\r\n\t\t\tborderW: pW + (2 * thisObj.borderWidth),\r\n\t\t\tborderH: pH + (2 * thisObj.borderWidth),\r\n\t\t\tpalette: pal,\r\n\t\t};\r\n\t},\r\n\r\n\r\n\tgetPaletteDims : function (thisObj, width) {\r\n\t\tvar cols = 0, rows = 0, cellW = 0, cellH = 0, height = 0;\r\n\t\tvar sampleCount = thisObj._palette ? thisObj._palette.length : 0;\r\n\r\n\t\tif (sampleCount) {\r\n\t\t\tcols = thisObj.paletteCols;\r\n\t\t\trows = cols > 0 ? Math.ceil(sampleCount / cols) : 0;\r\n\r\n\t\t\t// color sample's dimensions (includes border)\r\n\t\t\tcellW = Math.max(1, Math.floor((width - ((cols - 1) * thisObj.paletteSpacing)) / cols));\r\n\t\t\tcellH = thisObj.paletteHeight ? Math.min(thisObj.paletteHeight, cellW) : cellW;\r\n\t\t}\r\n\r\n\t\tif (rows) {\r\n\t\t\theight =\r\n\t\t\t\trows * cellH +\r\n\t\t\t\t(rows - 1) * thisObj.paletteSpacing;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tcols: cols,\r\n\t\t\trows: rows,\r\n\t\t\tcellW: cellW,\r\n\t\t\tcellH: cellH,\r\n\t\t\twidth: width,\r\n\t\t\theight: height,\r\n\t\t};\r\n\t},\r\n\r\n\r\n\tgetControlPadding : function (thisObj) {\r\n\t\treturn Math.max(\r\n\t\t\tthisObj.padding / 2,\r\n\t\t\t(2 * thisObj.pointerBorderWidth + thisObj.pointerThickness) - thisObj.controlBorderWidth\r\n\t\t);\r\n\t},\r\n\r\n\r\n\tgetPadYChannel : function (thisObj) {\r\n\t\tswitch (thisObj.mode.charAt(1).toLowerCase()) {\r\n\t\t\tcase 'v': return 'v'; break;\r\n\t\t}\r\n\t\treturn 's';\r\n\t},\r\n\r\n\r\n\tgetSliderChannel : function (thisObj) {\r\n\t\tif (thisObj.mode.length > 2) {\r\n\t\t\tswitch (thisObj.mode.charAt(2).toLowerCase()) {\r\n\t\t\t\tcase 's': return 's'; break;\r\n\t\t\t\tcase 'v': return 'v'; break;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t},\r\n\r\n\r\n\t// calls function specified in picker's property\r\n\ttriggerCallback : function (thisObj, prop) {\r\n\t\tif (!thisObj[prop]) {\r\n\t\t\treturn; // callback func not specified\r\n\t\t}\r\n\t\tvar callback = null;\r\n\r\n\t\tif (typeof thisObj[prop] === 'string') {\r\n\t\t\t// string with code\r\n\t\t\ttry {\r\n\t\t\t\tcallback = new Function (thisObj[prop]);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tconsole.error(e);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// function\r\n\t\t\tcallback = thisObj[prop];\r\n\t\t}\r\n\r\n\t\tif (callback) {\r\n\t\t\tcallback.call(thisObj);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t// Triggers a color change related event(s) on all picker instances.\r\n\t// It is possible to specify multiple events separated with a space.\r\n\ttriggerGlobal : function (eventNames) {\r\n\t\tvar inst = jsc.getInstances();\r\n\t\tfor (var i = 0; i < inst.length; i += 1) {\r\n\t\t\tinst[i].trigger(eventNames);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t_pointerMoveEvent : {\r\n\t\tmouse: 'mousemove',\r\n\t\ttouch: 'touchmove'\r\n\t},\r\n\t_pointerEndEvent : {\r\n\t\tmouse: 'mouseup',\r\n\t\ttouch: 'touchend'\r\n\t},\r\n\r\n\r\n\t_pointerOrigin : null,\r\n\t_capturedTarget : null,\r\n\r\n\r\n\tonDocumentKeyUp : function (e) {\r\n\t\tif (['Tab', 'Escape'].indexOf(jsc.eventKey(e)) !== -1) {\r\n\t\t\tif (jsc.picker && jsc.picker.owner) {\r\n\t\t\t\tjsc.picker.owner.tryHide();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonWindowResize : function (e) {\r\n\t\tjsc.redrawPosition();\r\n\t},\r\n\r\n\r\n\tonWindowScroll : function (e) {\r\n\t\tjsc.redrawPosition();\r\n\t},\r\n\r\n\r\n\tonParentScroll : function (e) {\r\n\t\t// hide the picker when one of the parent elements is scrolled\r\n\t\tif (jsc.picker && jsc.picker.owner) {\r\n\t\t\tjsc.picker.owner.tryHide();\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonDocumentMouseDown : function (e) {\r\n\t\tvar target = e.target || e.srcElement;\r\n\r\n\t\tif (target.jscolor && target.jscolor instanceof jsc.pub) { // clicked targetElement -> show picker\r\n\t\t\tif (target.jscolor.showOnClick && !target.disabled) {\r\n\t\t\t\ttarget.jscolor.show();\r\n\t\t\t}\r\n\t\t} else if (jsc.getData(target, 'gui')) { // clicked jscolor's GUI element\r\n\t\t\tvar control = jsc.getData(target, 'control');\r\n\t\t\tif (control) {\r\n\t\t\t\t// jscolor's control\r\n\t\t\t\tjsc.onControlPointerStart(e, target, jsc.getData(target, 'control'), 'mouse');\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// mouse is outside the picker's controls -> hide the color picker!\r\n\t\t\tif (jsc.picker && jsc.picker.owner) {\r\n\t\t\t\tjsc.picker.owner.tryHide();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonPickerTouchStart : function (e) {\r\n\t\tvar target = e.target || e.srcElement;\r\n\r\n\t\tif (jsc.getData(target, 'control')) {\r\n\t\t\tjsc.onControlPointerStart(e, target, jsc.getData(target, 'control'), 'touch');\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonControlPointerStart : function (e, target, controlName, pointerType) {\r\n\t\tvar thisObj = jsc.getData(target, 'instance');\r\n\r\n\t\tjsc.preventDefault(e);\r\n\t\tjsc.captureTarget(target);\r\n\r\n\t\tvar registerDragEvents = function (doc, offset) {\r\n\t\t\tjsc.attachGroupEvent('drag', doc, jsc._pointerMoveEvent[pointerType],\r\n\t\t\t\tjsc.onDocumentPointerMove(e, target, controlName, pointerType, offset));\r\n\t\t\tjsc.attachGroupEvent('drag', doc, jsc._pointerEndEvent[pointerType],\r\n\t\t\t\tjsc.onDocumentPointerEnd(e, target, controlName, pointerType));\r\n\t\t};\r\n\r\n\t\tregisterDragEvents(window.document, [0, 0]);\r\n\r\n\t\tif (window.parent && window.frameElement) {\r\n\t\t\tvar rect = window.frameElement.getBoundingClientRect();\r\n\t\t\tvar ofs = [-rect.left, -rect.top];\r\n\t\t\tregisterDragEvents(window.parent.window.document, ofs);\r\n\t\t}\r\n\r\n\t\tvar abs = jsc.getAbsPointerPos(e);\r\n\t\tvar rel = jsc.getRelPointerPos(e);\r\n\t\tjsc._pointerOrigin = {\r\n\t\t\tx: abs.x - rel.x,\r\n\t\t\ty: abs.y - rel.y\r\n\t\t};\r\n\r\n\t\tswitch (controlName) {\r\n\t\tcase 'pad':\r\n\t\t\t// if the value slider is at the bottom, move it up\r\n\t\t\tif (jsc.getSliderChannel(thisObj) === 'v' && thisObj.channels.v === 0) {\r\n\t\t\t\tthisObj.fromHSVA(null, null, 100, null);\r\n\t\t\t}\r\n\t\t\tjsc.setPad(thisObj, e, 0, 0);\r\n\t\t\tbreak;\r\n\r\n\t\tcase 'sld':\r\n\t\t\tjsc.setSld(thisObj, e, 0);\r\n\t\t\tbreak;\r\n\r\n\t\tcase 'asld':\r\n\t\t\tjsc.setASld(thisObj, e, 0);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tthisObj.trigger('input');\r\n\t},\r\n\r\n\r\n\tonDocumentPointerMove : function (e, target, controlName, pointerType, offset) {\r\n\t\treturn function (e) {\r\n\t\t\tvar thisObj = jsc.getData(target, 'instance');\r\n\t\t\tswitch (controlName) {\r\n\t\t\tcase 'pad':\r\n\t\t\t\tjsc.setPad(thisObj, e, offset[0], offset[1]);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'sld':\r\n\t\t\t\tjsc.setSld(thisObj, e, offset[1]);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'asld':\r\n\t\t\t\tjsc.setASld(thisObj, e, offset[1]);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tthisObj.trigger('input');\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonDocumentPointerEnd : function (e, target, controlName, pointerType) {\r\n\t\treturn function (e) {\r\n\t\t\tvar thisObj = jsc.getData(target, 'instance');\r\n\t\t\tjsc.detachGroupEvents('drag');\r\n\t\t\tjsc.releaseTarget();\r\n\r\n\t\t\t// Always trigger changes AFTER detaching outstanding mouse handlers,\r\n\t\t\t// in case some color change that occured in user-defined onChange/onInput handler\r\n\t\t\t// intruded into current mouse events\r\n\t\t\tthisObj.trigger('input');\r\n\t\t\tthisObj.trigger('change');\r\n\t\t};\r\n\t},\r\n\r\n\r\n\tonPaletteSampleClick : function (e) {\r\n\t\tvar target = e.currentTarget;\r\n\t\tvar thisObj = jsc.getData(target, 'instance');\r\n\t\tvar color = jsc.getData(target, 'color');\r\n\r\n\t\t// when format is flexible, use the original format of this color sample\r\n\t\tif (thisObj.format.toLowerCase() === 'any') {\r\n\t\t\tthisObj._setFormat(color.format); // adapt format\r\n\t\t\tif (!jsc.isAlphaFormat(thisObj.getFormat())) {\r\n\t\t\t\tcolor.rgba[3] = 1.0; // when switching to a format that doesn't support alpha, set full opacity\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// if this color doesn't specify alpha, use alpha of 1.0 (if applicable)\r\n\t\tif (color.rgba[3] === null) {\r\n\t\t\tif (thisObj.paletteSetsAlpha === true || (thisObj.paletteSetsAlpha === 'auto' && thisObj._paletteHasTransparency)) {\r\n\t\t\t\tcolor.rgba[3] = 1.0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthisObj.fromRGBA.apply(thisObj, color.rgba);\r\n\r\n\t\tthisObj.trigger('input');\r\n\t\tthisObj.trigger('change');\r\n\r\n\t\tif (thisObj.hideOnPaletteClick) {\r\n\t\t\tthisObj.hide();\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tsetPad : function (thisObj, e, ofsX, ofsY) {\r\n\t\tvar pointerAbs = jsc.getAbsPointerPos(e);\r\n\t\tvar x = ofsX + pointerAbs.x - jsc._pointerOrigin.x - thisObj.padding - thisObj.controlBorderWidth;\r\n\t\tvar y = ofsY + pointerAbs.y - jsc._pointerOrigin.y - thisObj.padding - thisObj.controlBorderWidth;\r\n\r\n\t\tvar xVal = x * (360 / (thisObj.width - 1));\r\n\t\tvar yVal = 100 - (y * (100 / (thisObj.height - 1)));\r\n\r\n\t\tswitch (jsc.getPadYChannel(thisObj)) {\r\n\t\tcase 's': thisObj.fromHSVA(xVal, yVal, null, null); break;\r\n\t\tcase 'v': thisObj.fromHSVA(xVal, null, yVal, null); break;\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tsetSld : function (thisObj, e, ofsY) {\r\n\t\tvar pointerAbs = jsc.getAbsPointerPos(e);\r\n\t\tvar y = ofsY + pointerAbs.y - jsc._pointerOrigin.y - thisObj.padding - thisObj.controlBorderWidth;\r\n\t\tvar yVal = 100 - (y * (100 / (thisObj.height - 1)));\r\n\r\n\t\tswitch (jsc.getSliderChannel(thisObj)) {\r\n\t\tcase 's': thisObj.fromHSVA(null, yVal, null, null); break;\r\n\t\tcase 'v': thisObj.fromHSVA(null, null, yVal, null); break;\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tsetASld : function (thisObj, e, ofsY) {\r\n\t\tvar pointerAbs = jsc.getAbsPointerPos(e);\r\n\t\tvar y = ofsY + pointerAbs.y - jsc._pointerOrigin.y - thisObj.padding - thisObj.controlBorderWidth;\r\n\t\tvar yVal = 1.0 - (y * (1.0 / (thisObj.height - 1)));\r\n\r\n\t\tif (yVal < 1.0) {\r\n\t\t\t// if format is flexible and the current format doesn't support alpha, switch to a suitable one\r\n\t\t\tvar fmt = thisObj.getFormat();\r\n\t\t\tif (thisObj.format.toLowerCase() === 'any' && !jsc.isAlphaFormat(fmt)) {\r\n\t\t\t\tthisObj._setFormat(fmt === 'hex' ? 'hexa' : 'rgba');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthisObj.fromHSVA(null, null, null, yVal);\r\n\t},\r\n\r\n\r\n\tcreatePadCanvas : function () {\r\n\r\n\t\tvar ret = {\r\n\t\t\telm: null,\r\n\t\t\tdraw: null\r\n\t\t};\r\n\r\n\t\tvar canvas = jsc.createEl('canvas');\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\r\n\t\tvar drawFunc = function (width, height, type) {\r\n\t\t\tcanvas.width = width;\r\n\t\t\tcanvas.height = height;\r\n\r\n\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tvar hGrad = ctx.createLinearGradient(0, 0, canvas.width, 0);\r\n\t\t\thGrad.addColorStop(0 / 6, '#F00');\r\n\t\t\thGrad.addColorStop(1 / 6, '#FF0');\r\n\t\t\thGrad.addColorStop(2 / 6, '#0F0');\r\n\t\t\thGrad.addColorStop(3 / 6, '#0FF');\r\n\t\t\thGrad.addColorStop(4 / 6, '#00F');\r\n\t\t\thGrad.addColorStop(5 / 6, '#F0F');\r\n\t\t\thGrad.addColorStop(6 / 6, '#F00');\r\n\r\n\t\t\tctx.fillStyle = hGrad;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tvar vGrad = ctx.createLinearGradient(0, 0, 0, canvas.height);\r\n\t\t\tswitch (type.toLowerCase()) {\r\n\t\t\tcase 's':\r\n\t\t\t\tvGrad.addColorStop(0, 'rgba(255,255,255,0)');\r\n\t\t\t\tvGrad.addColorStop(1, 'rgba(255,255,255,1)');\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'v':\r\n\t\t\t\tvGrad.addColorStop(0, 'rgba(0,0,0,0)');\r\n\t\t\t\tvGrad.addColorStop(1, 'rgba(0,0,0,1)');\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tctx.fillStyle = vGrad;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\t\t};\r\n\r\n\t\tret.elm = canvas;\r\n\t\tret.draw = drawFunc;\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\r\n\tcreateSliderGradient : function () {\r\n\r\n\t\tvar ret = {\r\n\t\t\telm: null,\r\n\t\t\tdraw: null\r\n\t\t};\r\n\r\n\t\tvar canvas = jsc.createEl('canvas');\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\r\n\t\tvar drawFunc = function (width, height, color1, color2) {\r\n\t\t\tcanvas.width = width;\r\n\t\t\tcanvas.height = height;\r\n\r\n\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tvar grad = ctx.createLinearGradient(0, 0, 0, canvas.height);\r\n\t\t\tgrad.addColorStop(0, color1);\r\n\t\t\tgrad.addColorStop(1, color2);\r\n\r\n\t\t\tctx.fillStyle = grad;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\t\t};\r\n\r\n\t\tret.elm = canvas;\r\n\t\tret.draw = drawFunc;\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\r\n\tcreateASliderGradient : function () {\r\n\r\n\t\tvar ret = {\r\n\t\t\telm: null,\r\n\t\t\tdraw: null\r\n\t\t};\r\n\r\n\t\tvar canvas = jsc.createEl('canvas');\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\r\n\t\tvar drawFunc = function (width, height, color) {\r\n\t\t\tcanvas.width = width;\r\n\t\t\tcanvas.height = height;\r\n\r\n\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tvar sqSize = canvas.width / 2;\r\n\t\t\tvar sqColor1 = jsc.pub.chessboardColor1;\r\n\t\t\tvar sqColor2 = jsc.pub.chessboardColor2;\r\n\r\n\t\t\t// dark gray background\r\n\t\t\tctx.fillStyle = sqColor1;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tif (sqSize > 0) { // to avoid infinite loop\r\n\t\t\t\tfor (var y = 0; y < canvas.height; y += sqSize * 2) {\r\n\t\t\t\t\t// light gray squares\r\n\t\t\t\t\tctx.fillStyle = sqColor2;\r\n\t\t\t\t\tctx.fillRect(0, y, sqSize, sqSize);\r\n\t\t\t\t\tctx.fillRect(sqSize, y + sqSize, sqSize, sqSize);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar grad = ctx.createLinearGradient(0, 0, 0, canvas.height);\r\n\t\t\tgrad.addColorStop(0, color);\r\n\t\t\tgrad.addColorStop(1, 'rgba(0,0,0,0)');\r\n\r\n\t\t\tctx.fillStyle = grad;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\t\t};\r\n\r\n\t\tret.elm = canvas;\r\n\t\tret.draw = drawFunc;\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\r\n\tBoxShadow : (function () {\r\n\t\tvar BoxShadow = function (hShadow, vShadow, blur, spread, color, inset) {\r\n\t\t\tthis.hShadow = hShadow;\r\n\t\t\tthis.vShadow = vShadow;\r\n\t\t\tthis.blur = blur;\r\n\t\t\tthis.spread = spread;\r\n\t\t\tthis.color = color;\r\n\t\t\tthis.inset = !!inset;\r\n\t\t};\r\n\r\n\t\tBoxShadow.prototype.toString = function () {\r\n\t\t\tvar vals = [\r\n\t\t\t\tMath.round(this.hShadow) + 'px',\r\n\t\t\t\tMath.round(this.vShadow) + 'px',\r\n\t\t\t\tMath.round(this.blur) + 'px',\r\n\t\t\t\tMath.round(this.spread) + 'px',\r\n\t\t\t\tthis.color\r\n\t\t\t];\r\n\t\t\tif (this.inset) {\r\n\t\t\t\tvals.push('inset');\r\n\t\t\t}\r\n\t\t\treturn vals.join(' ');\r\n\t\t};\r\n\r\n\t\treturn BoxShadow;\r\n\t})(),\r\n\r\n\r\n\tflags : {\r\n\t\tleaveValue : 1 << 0,\r\n\t\tleaveAlpha : 1 << 1,\r\n\t\tleavePreview : 1 << 2,\r\n\t},\r\n\r\n\r\n\tenumOpts : {\r\n\t\tformat: ['auto', 'any', 'hex', 'hexa', 'rgb', 'rgba'],\r\n\t\tpreviewPosition: ['left', 'right'],\r\n\t\tmode: ['hsv', 'hvs', 'hs', 'hv'],\r\n\t\tposition: ['left', 'right', 'top', 'bottom'],\r\n\t\talphaChannel: ['auto', true, false],\r\n\t\tpaletteSetsAlpha: ['auto', true, false],\r\n\t},\r\n\r\n\r\n\tdeprecatedOpts : {\r\n\t\t// <old_option>: <new_option> (<new_option> can be null)\r\n\t\t'styleElement': 'previewElement',\r\n\t\t'onFineChange': 'onInput',\r\n\t\t'overwriteImportant': 'forceStyle',\r\n\t\t'closable': 'closeButton',\r\n\t\t'insetWidth': 'controlBorderWidth',\r\n\t\t'insetColor': 'controlBorderColor',\r\n\t\t'refine': null,\r\n\t},\r\n\r\n\r\n\tdocsRef : ' ' + 'See https://jscolor.com/docs/',\r\n\r\n\r\n\t//\r\n\t// Usage:\r\n\t// var myPicker = new JSColor(<targetElement> [, <options>])\r\n\t//\r\n\t// (constructor is accessible via both 'jscolor' and 'JSColor' name)\r\n\t//\r\n\r\n\tpub : function (targetElement, opts) {\r\n\r\n\t\tvar THIS = this;\r\n\r\n\t\tif (!opts) {\r\n\t\t\topts = {};\r\n\t\t}\r\n\r\n\t\tthis.channels = {\r\n\t\t\tr: 255, // red [0-255]\r\n\t\t\tg: 255, // green [0-255]\r\n\t\t\tb: 255, // blue [0-255]\r\n\t\t\th: 0, // hue [0-360]\r\n\t\t\ts: 0, // saturation [0-100]\r\n\t\t\tv: 100, // value (brightness) [0-100]\r\n\t\t\ta: 1.0, // alpha (opacity) [0.0 - 1.0]\r\n\t\t};\r\n\r\n\t\t// General options\r\n\t\t//\r\n\t\tthis.format = 'auto'; // 'auto' | 'any' | 'hex' | 'hexa' | 'rgb' | 'rgba' - Format of the input/output value\r\n\t\tthis.value = undefined; // INITIAL color value in any supported format. To change it later, use method fromString(), fromHSVA(), fromRGBA() or channel()\r\n\t\tthis.alpha = undefined; // INITIAL alpha value. To change it later, call method channel('A', <value>)\r\n\t\tthis.random = false; // whether to randomize the initial color. Either true | false, or an array of ranges: [minV, maxV, minS, maxS, minH, maxH, minA, maxA]\r\n\t\tthis.onChange = undefined; // called when color changes. Value can be either a function or a string with JS code.\r\n\t\tthis.onInput = undefined; // called repeatedly as the color is being changed, e.g. while dragging a slider. Value can be either a function or a string with JS code.\r\n\t\tthis.valueElement = undefined; // element that will be used to display and input the color value\r\n\t\tthis.alphaElement = undefined; // element that will be used to display and input the alpha (opacity) value\r\n\t\tthis.previewElement = undefined; // element that will preview the picked color using CSS background\r\n\t\tthis.previewPosition = 'left'; // 'left' | 'right' - position of the color preview in previewElement\r\n\t\tthis.previewSize = 32; // (px) width of the color preview displayed in previewElement\r\n\t\tthis.previewPadding = 8; // (px) space between color preview and content of the previewElement\r\n\t\tthis.required = true; // whether the associated text input must always contain a color value. If false, the input can be left empty.\r\n\t\tthis.hash = true; // whether to prefix the HEX color code with # symbol (only applicable for HEX format)\r\n\t\tthis.uppercase = true; // whether to show the HEX color code in upper case (only applicable for HEX format)\r\n\t\tthis.forceStyle = true; // whether to overwrite CSS style of the previewElement using !important flag\r\n\r\n\t\t// Color Picker options\r\n\t\t//\r\n\t\tthis.width = 181; // width of the color spectrum (in px)\r\n\t\tthis.height = 101; // height of the color spectrum (in px)\r\n\t\tthis.mode = 'HSV'; // 'HSV' | 'HVS' | 'HS' | 'HV' - layout of the color picker controls\r\n\t\tthis.alphaChannel = 'auto'; // 'auto' | true | false - if alpha channel is enabled, the alpha slider will be visible. If 'auto', it will be determined according to color format\r\n\t\tthis.position = 'bottom'; // 'left' | 'right' | 'top' | 'bottom' - position relative to the target element\r\n\t\tthis.smartPosition = true; // automatically change picker position when there is not enough space for it\r\n\t\tthis.showOnClick = true; // whether to show the picker when user clicks its target element\r\n\t\tthis.hideOnLeave = true; // whether to automatically hide the picker when user leaves its target element (e.g. upon clicking the document)\r\n\t\tthis.palette = []; // colors to be displayed in the palette, specified as an array or a string of space separated color values (in any supported format)\r\n\t\tthis.paletteCols = 10; // number of columns in the palette\r\n\t\tthis.paletteSetsAlpha = 'auto'; // 'auto' | true | false - if true, palette colors that don't specify alpha will set alpha to 1.0\r\n\t\tthis.paletteHeight = 16; // maximum height (px) of a row in the palette\r\n\t\tthis.paletteSpacing = 4; // distance (px) between color samples in the palette\r\n\t\tthis.hideOnPaletteClick = false; // when set to true, clicking the palette will also hide the color picker\r\n\t\tthis.sliderSize = 16; // px\r\n\t\tthis.crossSize = 8; // px\r\n\t\tthis.closeButton = false; // whether to display the Close button\r\n\t\tthis.closeText = 'Close';\r\n\t\tthis.buttonColor = 'rgba(0,0,0,1)'; // CSS color\r\n\t\tthis.buttonHeight = 18; // px\r\n\t\tthis.padding = 12; // px\r\n\t\tthis.backgroundColor = 'rgba(255,255,255,1)'; // CSS color\r\n\t\tthis.borderWidth = 1; // px\r\n\t\tthis.borderColor = 'rgba(187,187,187,1)'; // CSS color\r\n\t\tthis.borderRadius = 8; // px\r\n\t\tthis.controlBorderWidth = 1; // px\r\n\t\tthis.controlBorderColor = 'rgba(187,187,187,1)'; // CSS color\r\n\t\tthis.shadow = true; // whether to display a shadow\r\n\t\tthis.shadowBlur = 15; // px\r\n\t\tthis.shadowColor = 'rgba(0,0,0,0.2)'; // CSS color\r\n\t\tthis.pointerColor = 'rgba(76,76,76,1)'; // CSS color\r\n\t\tthis.pointerBorderWidth = 1; // px\r\n\t\tthis.pointerBorderColor = 'rgba(255,255,255,1)'; // CSS color\r\n\t\tthis.pointerThickness = 2; // px\r\n\t\tthis.zIndex = 5000;\r\n\t\tthis.container = undefined; // where to append the color picker (BODY element by default)\r\n\r\n\t\t// Experimental\r\n\t\t//\r\n\t\tthis.minS = 0; // min allowed saturation (0 - 100)\r\n\t\tthis.maxS = 100; // max allowed saturation (0 - 100)\r\n\t\tthis.minV = 0; // min allowed value (brightness) (0 - 100)\r\n\t\tthis.maxV = 100; // max allowed value (brightness) (0 - 100)\r\n\t\tthis.minA = 0.0; // min allowed alpha (opacity) (0.0 - 1.0)\r\n\t\tthis.maxA = 1.0; // max allowed alpha (opacity) (0.0 - 1.0)\r\n\r\n\r\n\t\t// Getter: option(name)\r\n\t\t// Setter: option(name, value)\r\n\t\t// option({name:value, ...})\r\n\t\t//\r\n\t\tthis.option = function () {\r\n\t\t\tif (!arguments.length) {\r\n\t\t\t\tthrow new Error('No option specified');\r\n\t\t\t}\r\n\r\n\t\t\tif (arguments.length === 1 && typeof arguments[0] === 'string') {\r\n\t\t\t\t// getting a single option\r\n\t\t\t\ttry {\r\n\t\t\t\t\treturn getOption(arguments[0]);\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\r\n\t\t\t} else if (arguments.length >= 2 && typeof arguments[0] === 'string') {\r\n\t\t\t\t// setting a single option\r\n\t\t\t\ttry {\r\n\t\t\t\t\tif (!setOption(arguments[0], arguments[1])) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tthis.redraw(); // immediately redraws the picker, if it's displayed\r\n\t\t\t\tthis.exposeColor(); // in case some preview-related or format-related option was changed\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t} else if (arguments.length === 1 && typeof arguments[0] === 'object') {\r\n\t\t\t\t// setting multiple options\r\n\t\t\t\tvar opts = arguments[0];\r\n\t\t\t\tvar success = true;\r\n\t\t\t\tfor (var opt in opts) {\r\n\t\t\t\t\tif (opts.hasOwnProperty(opt)) {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tif (!setOption(opt, opts[opt])) {\r\n\t\t\t\t\t\t\t\tsuccess = false;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\t\t\tsuccess = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tthis.redraw(); // immediately redraws the picker, if it's displayed\r\n\t\t\t\tthis.exposeColor(); // in case some preview-related or format-related option was changed\r\n\t\t\t\treturn success;\r\n\t\t\t}\r\n\r\n\t\t\tthrow new Error('Invalid arguments');\r\n\t\t}\r\n\r\n\r\n\t\t// Getter: channel(name)\r\n\t\t// Setter: channel(name, value)\r\n\t\t//\r\n\t\tthis.channel = function (name, value) {\r\n\t\t\tif (typeof name !== 'string') {\r\n\t\t\t\tthrow new Error('Invalid value for channel name: ' + name);\r\n\t\t\t}\r\n\r\n\t\t\tif (value === undefined) {\r\n\t\t\t\t// getting channel value\r\n\t\t\t\tif (!this.channels.hasOwnProperty(name.toLowerCase())) {\r\n\t\t\t\t\tconsole.warn('Getting unknown channel: ' + name);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\treturn this.channels[name.toLowerCase()];\r\n\r\n\t\t\t} else {\r\n\t\t\t\t// setting channel value\r\n\t\t\t\tvar res = false;\r\n\t\t\t\tswitch (name.toLowerCase()) {\r\n\t\t\t\t\tcase 'r': res = this.fromRGBA(value, null, null, null); break;\r\n\t\t\t\t\tcase 'g': res = this.fromRGBA(null, value, null, null); break;\r\n\t\t\t\t\tcase 'b': res = this.fromRGBA(null, null, value, null); break;\r\n\t\t\t\t\tcase 'h': res = this.fromHSVA(value, null, null, null); break;\r\n\t\t\t\t\tcase 's': res = this.fromHSVA(null, value, null, null); break;\r\n\t\t\t\t\tcase 'v': res = this.fromHSVA(null, null, value, null); break;\r\n\t\t\t\t\tcase 'a': res = this.fromHSVA(null, null, null, value); break;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tconsole.warn('Setting unknown channel: ' + name);\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif (res) {\r\n\t\t\t\t\tthis.redraw(); // immediately redraws the picker, if it's displayed\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\r\n\t\t// Triggers given input event(s) by:\r\n\t\t// - executing on<Event> callback specified as picker's option\r\n\t\t// - triggering standard DOM event listeners attached to the value element\r\n\t\t//\r\n\t\t// It is possible to specify multiple events separated with a space.\r\n\t\t//\r\n\t\tthis.trigger = function (eventNames) {\r\n\t\t\tvar evs = jsc.strList(eventNames);\r\n\t\t\tfor (var i = 0; i < evs.length; i += 1) {\r\n\t\t\t\tvar ev = evs[i].toLowerCase();\r\n\r\n\t\t\t\t// trigger a callback\r\n\t\t\t\tvar callbackProp = null;\r\n\t\t\t\tswitch (ev) {\r\n\t\t\t\t\tcase 'input': callbackProp = 'onInput'; break;\r\n\t\t\t\t\tcase 'change': callbackProp = 'onChange'; break;\r\n\t\t\t\t}\r\n\t\t\t\tif (callbackProp) {\r\n\t\t\t\t\tjsc.triggerCallback(this, callbackProp);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// trigger standard DOM event listeners on the value element\r\n\t\t\t\tjsc.triggerInputEvent(this.valueElement, ev, true, true);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\t// h: 0-360\r\n\t\t// s: 0-100\r\n\t\t// v: 0-100\r\n\t\t// a: 0.0-1.0\r\n\t\t//\r\n\t\tthis.fromHSVA = function (h, s, v, a, flags) { // null = don't change\r\n\t\t\tif (h === undefined) { h = null; }\r\n\t\t\tif (s === undefined) { s = null; }\r\n\t\t\tif (v === undefined) { v = null; }\r\n\t\t\tif (a === undefined) { a = null; }\r\n\r\n\t\t\tif (h !== null) {\r\n\t\t\t\tif (isNaN(h)) { return false; }\r\n\t\t\t\tthis.channels.h = Math.max(0, Math.min(360, h));\r\n\t\t\t}\r\n\t\t\tif (s !== null) {\r\n\t\t\t\tif (isNaN(s)) { return false; }\r\n\t\t\t\tthis.channels.s = Math.max(0, Math.min(100, this.maxS, s), this.minS);\r\n\t\t\t}\r\n\t\t\tif (v !== null) {\r\n\t\t\t\tif (isNaN(v)) { return false; }\r\n\t\t\t\tthis.channels.v = Math.max(0, Math.min(100, this.maxV, v), this.minV);\r\n\t\t\t}\r\n\t\t\tif (a !== null) {\r\n\t\t\t\tif (isNaN(a)) { return false; }\r\n\t\t\t\tthis.channels.a = this.hasAlphaChannel() ?\r\n\t\t\t\t\tMath.max(0, Math.min(1, this.maxA, a), this.minA) :\r\n\t\t\t\t\t1.0; // if alpha channel is disabled, the color should stay 100% opaque\r\n\t\t\t}\r\n\r\n\t\t\tvar rgb = jsc.HSV_RGB(\r\n\t\t\t\tthis.channels.h,\r\n\t\t\t\tthis.channels.s,\r\n\t\t\t\tthis.channels.v\r\n\t\t\t);\r\n\t\t\tthis.channels.r = rgb[0];\r\n\t\t\tthis.channels.g = rgb[1];\r\n\t\t\tthis.channels.b = rgb[2];\r\n\r\n\t\t\tthis.exposeColor(flags);\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\r\n\t\t// r: 0-255\r\n\t\t// g: 0-255\r\n\t\t// b: 0-255\r\n\t\t// a: 0.0-1.0\r\n\t\t//\r\n\t\tthis.fromRGBA = function (r, g, b, a, flags) { // null = don't change\r\n\t\t\tif (r === undefined) { r = null; }\r\n\t\t\tif (g === undefined) { g = null; }\r\n\t\t\tif (b === undefined) { b = null; }\r\n\t\t\tif (a === undefined) { a = null; }\r\n\r\n\t\t\tif (r !== null) {\r\n\t\t\t\tif (isNaN(r)) { return false; }\r\n\t\t\t\tr = Math.max(0, Math.min(255, r));\r\n\t\t\t}\r\n\t\t\tif (g !== null) {\r\n\t\t\t\tif (isNaN(g)) { return false; }\r\n\t\t\t\tg = Math.max(0, Math.min(255, g));\r\n\t\t\t}\r\n\t\t\tif (b !== null) {\r\n\t\t\t\tif (isNaN(b)) { return false; }\r\n\t\t\t\tb = Math.max(0, Math.min(255, b));\r\n\t\t\t}\r\n\t\t\tif (a !== null) {\r\n\t\t\t\tif (isNaN(a)) { return false; }\r\n\t\t\t\tthis.channels.a = this.hasAlphaChannel() ?\r\n\t\t\t\t\tMath.max(0, Math.min(1, this.maxA, a), this.minA) :\r\n\t\t\t\t\t1.0; // if alpha channel is disabled, the color should stay 100% opaque\r\n\t\t\t}\r\n\r\n\t\t\tvar hsv = jsc.RGB_HSV(\r\n\t\t\t\tr===null ? this.channels.r : r,\r\n\t\t\t\tg===null ? this.channels.g : g,\r\n\t\t\t\tb===null ? this.channels.b : b\r\n\t\t\t);\r\n\t\t\tif (hsv[0] !== null) {\r\n\t\t\t\tthis.channels.h = Math.max(0, Math.min(360, hsv[0]));\r\n\t\t\t}\r\n\t\t\tif (hsv[2] !== 0) { // fully black color stays black through entire saturation range, so let's not change saturation\r\n\t\t\t\tthis.channels.s = Math.max(0, this.minS, Math.min(100, this.maxS, hsv[1]));\r\n\t\t\t}\r\n\t\t\tthis.channels.v = Math.max(0, this.minV, Math.min(100, this.maxV, hsv[2]));\r\n\r\n\t\t\t// update RGB according to final HSV, as some values might be trimmed\r\n\t\t\tvar rgb = jsc.HSV_RGB(this.channels.h, this.channels.s, this.channels.v);\r\n\t\t\tthis.channels.r = rgb[0];\r\n\t\t\tthis.channels.g = rgb[1];\r\n\t\t\tthis.channels.b = rgb[2];\r\n\r\n\t\t\tthis.exposeColor(flags);\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\r\n\t\t// DEPRECATED. Use .fromHSVA() instead\r\n\t\t//\r\n\t\tthis.fromHSV = function (h, s, v, flags) {\r\n\t\t\tconsole.warn('fromHSV() method is DEPRECATED. Using fromHSVA() instead.' + jsc.docsRef);\r\n\t\t\treturn this.fromHSVA(h, s, v, null, flags);\r\n\t\t};\r\n\r\n\r\n\t\t// DEPRECATED. Use .fromRGBA() instead\r\n\t\t//\r\n\t\tthis.fromRGB = function (r, g, b, flags) {\r\n\t\t\tconsole.warn('fromRGB() method is DEPRECATED. Using fromRGBA() instead.' + jsc.docsRef);\r\n\t\t\treturn this.fromRGBA(r, g, b, null, flags);\r\n\t\t};\r\n\r\n\r\n\t\tthis.fromString = function (str, flags) {\r\n\t\t\tif (!this.required && str.trim() === '') {\r\n\t\t\t\t// setting empty string to an optional color input\r\n\t\t\t\tthis.setPreviewElementBg(null);\r\n\t\t\t\tthis.setValueElementValue('');\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\tvar color = jsc.parseColorString(str);\r\n\t\t\tif (!color) {\r\n\t\t\t\treturn false; // could not parse\r\n\t\t\t}\r\n\t\t\tif (this.format.toLowerCase() === 'any') {\r\n\t\t\t\tthis._setFormat(color.format); // adapt format\r\n\t\t\t\tif (!jsc.isAlphaFormat(this.getFormat())) {\r\n\t\t\t\t\tcolor.rgba[3] = 1.0; // when switching to a format that doesn't support alpha, set full opacity\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.fromRGBA(\r\n\t\t\t\tcolor.rgba[0],\r\n\t\t\t\tcolor.rgba[1],\r\n\t\t\t\tcolor.rgba[2],\r\n\t\t\t\tcolor.rgba[3],\r\n\t\t\t\tflags\r\n\t\t\t);\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\r\n\t\tthis.randomize = function (minV, maxV, minS, maxS, minH, maxH, minA, maxA) {\r\n\t\t\tif (minV === undefined) { minV = 0; }\r\n\t\t\tif (maxV === undefined) { maxV = 100; }\r\n\t\t\tif (minS === undefined) { minS = 0; }\r\n\t\t\tif (maxS === undefined) { maxS = 100; }\r\n\t\t\tif (minH === undefined) { minH = 0; }\r\n\t\t\tif (maxH === undefined) { maxH = 359; }\r\n\t\t\tif (minA === undefined) { minA = 1; }\r\n\t\t\tif (maxA === undefined) { maxA = 1; }\r\n\r\n\t\t\tthis.fromHSVA(\r\n\t\t\t\tminH + Math.floor(Math.random() * (maxH - minH + 1)),\r\n\t\t\t\tminS + Math.floor(Math.random() * (maxS - minS + 1)),\r\n\t\t\t\tminV + Math.floor(Math.random() * (maxV - minV + 1)),\r\n\t\t\t\t((100 * minA) + Math.floor(Math.random() * (100 * (maxA - minA) + 1))) / 100\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toString = function (format) {\r\n\t\t\tif (format === undefined) {\r\n\t\t\t\tformat = this.getFormat(); // format not specified -> use the current format\r\n\t\t\t}\r\n\t\t\tswitch (format.toLowerCase()) {\r\n\t\t\t\tcase 'hex': return this.toHEXString(); break;\r\n\t\t\t\tcase 'hexa': return this.toHEXAString(); break;\r\n\t\t\t\tcase 'rgb': return this.toRGBString(); break;\r\n\t\t\t\tcase 'rgba': return this.toRGBAString(); break;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t};\r\n\r\n\r\n\t\tthis.toHEXString = function () {\r\n\t\t\treturn jsc.hexColor(\r\n\t\t\t\tthis.channels.r,\r\n\t\t\t\tthis.channels.g,\r\n\t\t\t\tthis.channels.b\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toHEXAString = function () {\r\n\t\t\treturn jsc.hexaColor(\r\n\t\t\t\tthis.channels.r,\r\n\t\t\t\tthis.channels.g,\r\n\t\t\t\tthis.channels.b,\r\n\t\t\t\tthis.channels.a\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toRGBString = function () {\r\n\t\t\treturn jsc.rgbColor(\r\n\t\t\t\tthis.channels.r,\r\n\t\t\t\tthis.channels.g,\r\n\t\t\t\tthis.channels.b\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toRGBAString = function () {\r\n\t\t\treturn jsc.rgbaColor(\r\n\t\t\t\tthis.channels.r,\r\n\t\t\t\tthis.channels.g,\r\n\t\t\t\tthis.channels.b,\r\n\t\t\t\tthis.channels.a\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toGrayscale = function () {\r\n\t\t\treturn (\r\n\t\t\t\t0.213 * this.channels.r +\r\n\t\t\t\t0.715 * this.channels.g +\r\n\t\t\t\t0.072 * this.channels.b\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toCanvas = function () {\r\n\t\t\treturn jsc.genColorPreviewCanvas(this.toRGBAString()).canvas;\r\n\t\t};\r\n\r\n\r\n\t\tthis.toDataURL = function () {\r\n\t\t\treturn this.toCanvas().toDataURL();\r\n\t\t};\r\n\r\n\r\n\t\tthis.toBackground = function () {\r\n\t\t\treturn jsc.pub.background(this.toRGBAString());\r\n\t\t};\r\n\r\n\r\n\t\tthis.isLight = function () {\r\n\t\t\treturn this.toGrayscale() > 255 / 2;\r\n\t\t};\r\n\r\n\r\n\t\tthis.hide = function () {\r\n\t\t\tif (isPickerOwner()) {\r\n\t\t\t\tdetachPicker();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.show = function () {\r\n\t\t\tdrawPicker();\r\n\t\t};\r\n\r\n\r\n\t\tthis.redraw = function () {\r\n\t\t\tif (isPickerOwner()) {\r\n\t\t\t\tdrawPicker();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.getFormat = function () {\r\n\t\t\treturn this._currentFormat;\r\n\t\t};\r\n\r\n\r\n\t\tthis._setFormat = function (format) {\r\n\t\t\tthis._currentFormat = format.toLowerCase();\r\n\t\t};\r\n\r\n\r\n\t\tthis.hasAlphaChannel = function () {\r\n\t\t\tif (this.alphaChannel === 'auto') {\r\n\t\t\t\treturn (\r\n\t\t\t\t\tthis.format.toLowerCase() === 'any' || // format can change on the fly (e.g. from hex to rgba), so let's consider the alpha channel enabled\r\n\t\t\t\t\tjsc.isAlphaFormat(this.getFormat()) || // the current format supports alpha channel\r\n\t\t\t\t\tthis.alpha !== undefined || // initial alpha value is set, so we're working with alpha channel\r\n\t\t\t\t\tthis.alphaElement !== undefined // the alpha value is redirected, so we're working with alpha channel\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\treturn this.alphaChannel; // the alpha channel is explicitly set\r\n\t\t};\r\n\r\n\r\n\t\tthis.processValueInput = function (str) {\r\n\t\t\tif (!this.fromString(str)) {\r\n\t\t\t\t// could not parse the color value - let's just expose the current color\r\n\t\t\t\tthis.exposeColor();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.processAlphaInput = function (str) {\r\n\t\t\tif (!this.fromHSVA(null, null, null, parseFloat(str))) {\r\n\t\t\t\t// could not parse the alpha value - let's just expose the current color\r\n\t\t\t\tthis.exposeColor();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.exposeColor = function (flags) {\r\n\t\t\tvar colorStr = this.toString();\r\n\t\t\tvar fmt = this.getFormat();\r\n\r\n\t\t\t// reflect current color in data- attribute\r\n\t\t\tjsc.setDataAttr(this.targetElement, 'current-color', colorStr);\r\n\r\n\t\t\tif (!(flags & jsc.flags.leaveValue) && this.valueElement) {\r\n\t\t\t\tif (fmt === 'hex' || fmt === 'hexa') {\r\n\t\t\t\t\tif (!this.uppercase) { colorStr = colorStr.toLowerCase(); }\r\n\t\t\t\t\tif (!this.hash) { colorStr = colorStr.replace(/^#/, ''); }\r\n\t\t\t\t}\r\n\t\t\t\tthis.setValueElementValue(colorStr);\r\n\t\t\t}\r\n\r\n\t\t\tif (!(flags & jsc.flags.leaveAlpha) && this.alphaElement) {\r\n\t\t\t\tvar alphaVal = Math.round(this.channels.a * 100) / 100;\r\n\t\t\t\tthis.setAlphaElementValue(alphaVal);\r\n\t\t\t}\r\n\r\n\t\t\tif (!(flags & jsc.flags.leavePreview) && this.previewElement) {\r\n\t\t\t\tvar previewPos = null; // 'left' | 'right' (null -> fill the entire element)\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tjsc.isTextInput(this.previewElement) || // text input\r\n\t\t\t\t\t(jsc.isButton(this.previewElement) && !jsc.isButtonEmpty(this.previewElement)) // button with text\r\n\t\t\t\t) {\r\n\t\t\t\t\tpreviewPos = this.previewPosition;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.setPreviewElementBg(this.toRGBAString());\r\n\t\t\t}\r\n\r\n\t\t\tif (isPickerOwner()) {\r\n\t\t\t\tredrawPad();\r\n\t\t\t\tredrawSld();\r\n\t\t\t\tredrawASld();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.setPreviewElementBg = function (color) {\r\n\t\t\tif (!this.previewElement) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar position = null; // color preview position: null | 'left' | 'right'\r\n\t\t\tvar width = null; // color preview width: px | null = fill the entire element\r\n\t\t\tif (\r\n\t\t\t\tjsc.isTextInput(this.previewElement) || // text input\r\n\t\t\t\t(jsc.isButton(this.previewElement) && !jsc.isButtonEmpty(this.previewElement)) // button with text\r\n\t\t\t) {\r\n\t\t\t\tposition = this.previewPosition;\r\n\t\t\t\twidth = this.previewSize;\r\n\t\t\t}\r\n\r\n\t\t\tvar backgrounds = [];\r\n\r\n\t\t\tif (!color) {\r\n\t\t\t\t// there is no color preview to display -> let's remove any previous background image\r\n\t\t\t\tbackgrounds.push({\r\n\t\t\t\t\timage: 'none',\r\n\t\t\t\t\tposition: 'left top',\r\n\t\t\t\t\tsize: 'auto',\r\n\t\t\t\t\trepeat: 'no-repeat',\r\n\t\t\t\t\torigin: 'padding-box',\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\t// CSS gradient for background color preview\r\n\t\t\t\tbackgrounds.push({\r\n\t\t\t\t\timage: jsc.genColorPreviewGradient(\r\n\t\t\t\t\t\tcolor,\r\n\t\t\t\t\t\tposition,\r\n\t\t\t\t\t\twidth ? width - jsc.pub.previewSeparator.length : null\r\n\t\t\t\t\t),\r\n\t\t\t\t\tposition: 'left top',\r\n\t\t\t\t\tsize: 'auto',\r\n\t\t\t\t\trepeat: position ? 'repeat-y' : 'repeat',\r\n\t\t\t\t\torigin: 'padding-box',\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// data URL of generated PNG image with a gray transparency chessboard\r\n\t\t\t\tvar preview = jsc.genColorPreviewCanvas(\r\n\t\t\t\t\t'rgba(0,0,0,0)',\r\n\t\t\t\t\tposition ? {'left':'right', 'right':'left'}[position] : null,\r\n\t\t\t\t\twidth,\r\n\t\t\t\t\ttrue\r\n\t\t\t\t);\r\n\t\t\t\tbackgrounds.push({\r\n\t\t\t\t\timage: 'url(\\'' + preview.canvas.toDataURL() + '\\')',\r\n\t\t\t\t\tposition: (position || 'left') + ' top',\r\n\t\t\t\t\tsize: preview.width + 'px ' + preview.height + 'px',\r\n\t\t\t\t\trepeat: position ? 'repeat-y' : 'repeat',\r\n\t\t\t\t\torigin: 'padding-box',\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tvar bg = {\r\n\t\t\t\timage: [],\r\n\t\t\t\tposition: [],\r\n\t\t\t\tsize: [],\r\n\t\t\t\trepeat: [],\r\n\t\t\t\torigin: [],\r\n\t\t\t};\r\n\t\t\tfor (var i = 0; i < backgrounds.length; i += 1) {\r\n\t\t\t\tbg.image.push(backgrounds[i].image);\r\n\t\t\t\tbg.position.push(backgrounds[i].position);\r\n\t\t\t\tbg.size.push(backgrounds[i].size);\r\n\t\t\t\tbg.repeat.push(backgrounds[i].repeat);\r\n\t\t\t\tbg.origin.push(backgrounds[i].origin);\r\n\t\t\t}\r\n\r\n\t\t\t// set previewElement's background-images\r\n\t\t\tvar sty = {\r\n\t\t\t\t'background-image': bg.image.join(', '),\r\n\t\t\t\t'background-position': bg.position.join(', '),\r\n\t\t\t\t'background-size': bg.size.join(', '),\r\n\t\t\t\t'background-repeat': bg.repeat.join(', '),\r\n\t\t\t\t'background-origin': bg.origin.join(', '),\r\n\t\t\t};\r\n\t\t\tjsc.setStyle(this.previewElement, sty, this.forceStyle);\r\n\r\n\r\n\t\t\t// set/restore previewElement's padding\r\n\t\t\tvar padding = {\r\n\t\t\t\tleft: null,\r\n\t\t\t\tright: null,\r\n\t\t\t};\r\n\t\t\tif (position) {\r\n\t\t\t\tpadding[position] = (this.previewSize + this.previewPadding) + 'px';\r\n\t\t\t}\r\n\r\n\t\t\tvar sty = {\r\n\t\t\t\t'padding-left': padding.left,\r\n\t\t\t\t'padding-right': padding.right,\r\n\t\t\t};\r\n\t\t\tjsc.setStyle(this.previewElement, sty, this.forceStyle, true);\r\n\t\t};\r\n\r\n\r\n\t\tthis.setValueElementValue = function (str) {\r\n\t\t\tif (this.valueElement) {\r\n\t\t\t\tif (jsc.nodeName(this.valueElement) === 'input') {\r\n\t\t\t\t\tthis.valueElement.value = str;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.valueElement.innerHTML = str;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.setAlphaElementValue = function (str) {\r\n\t\t\tif (this.alphaElement) {\r\n\t\t\t\tif (jsc.nodeName(this.alphaElement) === 'input') {\r\n\t\t\t\t\tthis.alphaElement.value = str;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.alphaElement.innerHTML = str;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis._processParentElementsInDOM = function () {\r\n\t\t\tif (this._parentElementsProcessed) { return; }\r\n\t\t\tthis._parentElementsProcessed = true;\r\n\r\n\t\t\tvar elm = this.targetElement;\r\n\t\t\tdo {\r\n\t\t\t\t// If the target element or one of its parent nodes has fixed position,\r\n\t\t\t\t// then use fixed positioning instead\r\n\t\t\t\tvar compStyle = jsc.getCompStyle(elm);\r\n\t\t\t\tif (compStyle.position && compStyle.position.toLowerCase() === 'fixed') {\r\n\t\t\t\t\tthis.fixed = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (elm !== this.targetElement) {\r\n\t\t\t\t\t// Ensure to attach onParentScroll only once to each parent element\r\n\t\t\t\t\t// (multiple targetElements can share the same parent nodes)\r\n\t\t\t\t\t//\r\n\t\t\t\t\t// Note: It's not just offsetParents that can be scrollable,\r\n\t\t\t\t\t// that's why we loop through all parent nodes\r\n\t\t\t\t\tif (!jsc.getData(elm, 'hasScrollListener')) {\r\n\t\t\t\t\t\telm.addEventListener('scroll', jsc.onParentScroll, false);\r\n\t\t\t\t\t\tjsc.setData(elm, 'hasScrollListener', true);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} while ((elm = elm.parentNode) && jsc.nodeName(elm) !== 'body');\r\n\t\t};\r\n\r\n\r\n\t\tthis.tryHide = function () {\r\n\t\t\tif (this.hideOnLeave) {\r\n\t\t\t\tthis.hide();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.set__palette = function (val) {\r\n\t\t\tthis.palette = val;\r\n\t\t\tthis._palette = jsc.parsePaletteValue(val);\r\n\t\t\tthis._paletteHasTransparency = jsc.containsTranparentColor(this._palette);\r\n\t\t};\r\n\r\n\r\n\t\tfunction setOption (option, value) {\r\n\t\t\tif (typeof option !== 'string') {\r\n\t\t\t\tthrow new Error('Invalid value for option name: ' + option);\r\n\t\t\t}\r\n\r\n\t\t\t// enum option\r\n\t\t\tif (jsc.enumOpts.hasOwnProperty(option)) {\r\n\t\t\t\tif (typeof value === 'string') { // enum string values are case insensitive\r\n\t\t\t\t\tvalue = value.toLowerCase();\r\n\t\t\t\t}\r\n\t\t\t\tif (jsc.enumOpts[option].indexOf(value) === -1) {\r\n\t\t\t\t\tthrow new Error('Option \\'' + option + '\\' has invalid value: ' + value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// deprecated option\r\n\t\t\tif (jsc.deprecatedOpts.hasOwnProperty(option)) {\r\n\t\t\t\tvar oldOpt = option;\r\n\t\t\t\tvar newOpt = jsc.deprecatedOpts[option];\r\n\t\t\t\tif (newOpt) {\r\n\t\t\t\t\t// if we have a new name for this option, let's log a warning and use the new name\r\n\t\t\t\t\tconsole.warn('Option \\'%s\\' is DEPRECATED, using \\'%s\\' instead.' + jsc.docsRef, oldOpt, newOpt);\r\n\t\t\t\t\toption = newOpt;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// new name not available for the option\r\n\t\t\t\t\tthrow new Error('Option \\'' + option + '\\' is DEPRECATED');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar setter = 'set__' + option;\r\n\r\n\t\t\tif (typeof THIS[setter] === 'function') { // a setter exists for this option\r\n\t\t\t\tTHIS[setter](value);\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t} else if (option in THIS) { // option exists as a property\r\n\t\t\t\tTHIS[option] = value;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\tthrow new Error('Unrecognized configuration option: ' + option);\r\n\t\t}\r\n\r\n\r\n\t\tfunction getOption (option) {\r\n\t\t\tif (typeof option !== 'string') {\r\n\t\t\t\tthrow new Error('Invalid value for option name: ' + option);\r\n\t\t\t}\r\n\r\n\t\t\t// deprecated option\r\n\t\t\tif (jsc.deprecatedOpts.hasOwnProperty(option)) {\r\n\t\t\t\tvar oldOpt = option;\r\n\t\t\t\tvar newOpt = jsc.deprecatedOpts[option];\r\n\t\t\t\tif (newOpt) {\r\n\t\t\t\t\t// if we have a new name for this option, let's log a warning and use the new name\r\n\t\t\t\t\tconsole.warn('Option \\'%s\\' is DEPRECATED, using \\'%s\\' instead.' + jsc.docsRef, oldOpt, newOpt);\r\n\t\t\t\t\toption = newOpt;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// new name not available for the option\r\n\t\t\t\t\tthrow new Error('Option \\'' + option + '\\' is DEPRECATED');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar getter = 'get__' + option;\r\n\r\n\t\t\tif (typeof THIS[getter] === 'function') { // a getter exists for this option\r\n\t\t\t\treturn THIS[getter](value);\r\n\r\n\t\t\t} else if (option in THIS) { // option exists as a property\r\n\t\t\t\treturn THIS[option];\r\n\t\t\t}\r\n\r\n\t\t\tthrow new Error('Unrecognized configuration option: ' + option);\r\n\t\t}\r\n\r\n\r\n\t\tfunction detachPicker () {\r\n\t\t\tjsc.removeClass(THIS.targetElement, jsc.pub.activeClassName);\r\n\t\t\tjsc.picker.wrap.parentNode.removeChild(jsc.picker.wrap);\r\n\t\t\tdelete jsc.picker.owner;\r\n\t\t}\r\n\r\n\r\n\t\tfunction drawPicker () {\r\n\r\n\t\t\t// At this point, when drawing the picker, we know what the parent elements are\r\n\t\t\t// and we can do all related DOM operations, such as registering events on them\r\n\t\t\t// or checking their positioning\r\n\t\t\tTHIS._processParentElementsInDOM();\r\n\r\n\t\t\tif (!jsc.picker) {\r\n\t\t\t\tjsc.picker = {\r\n\t\t\t\t\towner: null, // owner picker instance\r\n\t\t\t\t\twrap : jsc.createEl('div'),\r\n\t\t\t\t\tbox : jsc.createEl('div'),\r\n\t\t\t\t\tboxS : jsc.createEl('div'), // shadow area\r\n\t\t\t\t\tboxB : jsc.createEl('div'), // border\r\n\t\t\t\t\tpad : jsc.createEl('div'),\r\n\t\t\t\t\tpadB : jsc.createEl('div'), // border\r\n\t\t\t\t\tpadM : jsc.createEl('div'), // mouse/touch area\r\n\t\t\t\t\tpadCanvas : jsc.createPadCanvas(),\r\n\t\t\t\t\tcross : jsc.createEl('div'),\r\n\t\t\t\t\tcrossBY : jsc.createEl('div'), // border Y\r\n\t\t\t\t\tcrossBX : jsc.createEl('div'), // border X\r\n\t\t\t\t\tcrossLY : jsc.createEl('div'), // line Y\r\n\t\t\t\t\tcrossLX : jsc.createEl('div'), // line X\r\n\t\t\t\t\tsld : jsc.createEl('div'), // slider\r\n\t\t\t\t\tsldB : jsc.createEl('div'), // border\r\n\t\t\t\t\tsldM : jsc.createEl('div'), // mouse/touch area\r\n\t\t\t\t\tsldGrad : jsc.createSliderGradient(),\r\n\t\t\t\t\tsldPtrS : jsc.createEl('div'), // slider pointer spacer\r\n\t\t\t\t\tsldPtrIB : jsc.createEl('div'), // slider pointer inner border\r\n\t\t\t\t\tsldPtrMB : jsc.createEl('div'), // slider pointer middle border\r\n\t\t\t\t\tsldPtrOB : jsc.createEl('div'), // slider pointer outer border\r\n\t\t\t\t\tasld : jsc.createEl('div'), // alpha slider\r\n\t\t\t\t\tasldB : jsc.createEl('div'), // border\r\n\t\t\t\t\tasldM : jsc.createEl('div'), // mouse/touch area\r\n\t\t\t\t\tasldGrad : jsc.createASliderGradient(),\r\n\t\t\t\t\tasldPtrS : jsc.createEl('div'), // slider pointer spacer\r\n\t\t\t\t\tasldPtrIB : jsc.createEl('div'), // slider pointer inner border\r\n\t\t\t\t\tasldPtrMB : jsc.createEl('div'), // slider pointer middle border\r\n\t\t\t\t\tasldPtrOB : jsc.createEl('div'), // slider pointer outer border\r\n\t\t\t\t\tpal : jsc.createEl('div'), // palette\r\n\t\t\t\t\tbtn : jsc.createEl('div'),\r\n\t\t\t\t\tbtnT : jsc.createEl('span'), // text\r\n\t\t\t\t};\r\n\r\n\t\t\t\tjsc.picker.pad.appendChild(jsc.picker.padCanvas.elm);\r\n\t\t\t\tjsc.picker.padB.appendChild(jsc.picker.pad);\r\n\t\t\t\tjsc.picker.cross.appendChild(jsc.picker.crossBY);\r\n\t\t\t\tjsc.picker.cross.appendChild(jsc.picker.crossBX);\r\n\t\t\t\tjsc.picker.cross.appendChild(jsc.picker.crossLY);\r\n\t\t\t\tjsc.picker.cross.appendChild(jsc.picker.crossLX);\r\n\t\t\t\tjsc.picker.padB.appendChild(jsc.picker.cross);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.padB);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.padM);\r\n\r\n\t\t\t\tjsc.picker.sld.appendChild(jsc.picker.sldGrad.elm);\r\n\t\t\t\tjsc.picker.sldB.appendChild(jsc.picker.sld);\r\n\t\t\t\tjsc.picker.sldB.appendChild(jsc.picker.sldPtrOB);\r\n\t\t\t\tjsc.picker.sldPtrOB.appendChild(jsc.picker.sldPtrMB);\r\n\t\t\t\tjsc.picker.sldPtrMB.appendChild(jsc.picker.sldPtrIB);\r\n\t\t\t\tjsc.picker.sldPtrIB.appendChild(jsc.picker.sldPtrS);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.sldB);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.sldM);\r\n\r\n\t\t\t\tjsc.picker.asld.appendChild(jsc.picker.asldGrad.elm);\r\n\t\t\t\tjsc.picker.asldB.appendChild(jsc.picker.asld);\r\n\t\t\t\tjsc.picker.asldB.appendChild(jsc.picker.asldPtrOB);\r\n\t\t\t\tjsc.picker.asldPtrOB.appendChild(jsc.picker.asldPtrMB);\r\n\t\t\t\tjsc.picker.asldPtrMB.appendChild(jsc.picker.asldPtrIB);\r\n\t\t\t\tjsc.picker.asldPtrIB.appendChild(jsc.picker.asldPtrS);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.asldB);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.asldM);\r\n\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.pal);\r\n\r\n\t\t\t\tjsc.picker.btn.appendChild(jsc.picker.btnT);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.btn);\r\n\r\n\t\t\t\tjsc.picker.boxB.appendChild(jsc.picker.box);\r\n\t\t\t\tjsc.picker.wrap.appendChild(jsc.picker.boxS);\r\n\t\t\t\tjsc.picker.wrap.appendChild(jsc.picker.boxB);\r\n\r\n\t\t\t\tjsc.picker.wrap.addEventListener('touchstart', jsc.onPickerTouchStart,\r\n\t\t\t\t\tjsc.isPassiveEventSupported ? {passive: false} : false);\r\n\t\t\t}\r\n\r\n\t\t\tvar p = jsc.picker;\r\n\r\n\t\t\tvar displaySlider = !!jsc.getSliderChannel(THIS);\r\n\t\t\tvar displayAlphaSlider = THIS.hasAlphaChannel();\r\n\t\t\tvar pickerDims = jsc.getPickerDims(THIS);\r\n\t\t\tvar crossOuterSize = (2 * THIS.pointerBorderWidth + THIS.pointerThickness + 2 * THIS.crossSize);\r\n\t\t\tvar controlPadding = jsc.getControlPadding(THIS);\r\n\t\t\tvar borderRadius = Math.min(\r\n\t\t\t\tTHIS.borderRadius,\r\n\t\t\t\tMath.round(THIS.padding * Math.PI)); // px\r\n\t\t\tvar padCursor = 'crosshair';\r\n\r\n\t\t\t// wrap\r\n\t\t\tp.wrap.className = 'jscolor-picker-wrap';\r\n\t\t\tp.wrap.style.clear = 'both';\r\n\t\t\tp.wrap.style.width = pickerDims.borderW + 'px';\r\n\t\t\tp.wrap.style.height = pickerDims.borderH + 'px';\r\n\t\t\tp.wrap.style.zIndex = THIS.zIndex;\r\n\r\n\t\t\t// picker\r\n\t\t\tp.box.className = 'jscolor-picker';\r\n\t\t\tp.box.style.width = pickerDims.paddedW + 'px';\r\n\t\t\tp.box.style.height = pickerDims.paddedH + 'px';\r\n\t\t\tp.box.style.position = 'relative';\r\n\r\n\t\t\t// picker shadow\r\n\t\t\tp.boxS.className = 'jscolor-picker-shadow';\r\n\t\t\tp.boxS.style.position = 'absolute';\r\n\t\t\tp.boxS.style.left = '0';\r\n\t\t\tp.boxS.style.top = '0';\r\n\t\t\tp.boxS.style.width = '100%';\r\n\t\t\tp.boxS.style.height = '100%';\r\n\t\t\tjsc.setBorderRadius(p.boxS, borderRadius + 'px');\r\n\r\n\t\t\t// picker border\r\n\t\t\tp.boxB.className = 'jscolor-picker-border';\r\n\t\t\tp.boxB.style.position = 'relative';\r\n\t\t\tp.boxB.style.border = THIS.borderWidth + 'px solid';\r\n\t\t\tp.boxB.style.borderColor = THIS.borderColor;\r\n\t\t\tp.boxB.style.background = THIS.backgroundColor;\r\n\t\t\tjsc.setBorderRadius(p.boxB, borderRadius + 'px');\r\n\r\n\t\t\t// IE hack:\r\n\t\t\t// If the element is transparent, IE will trigger the event on the elements under it,\r\n\t\t\t// e.g. on Canvas or on elements with border\r\n\t\t\tp.padM.style.background = 'rgba(255,0,0,.2)';\r\n\t\t\tp.sldM.style.background = 'rgba(0,255,0,.2)';\r\n\t\t\tp.asldM.style.background = 'rgba(0,0,255,.2)';\r\n\r\n\t\t\tp.padM.style.opacity =\r\n\t\t\tp.sldM.style.opacity =\r\n\t\t\tp.asldM.style.opacity =\r\n\t\t\t\t'0';\r\n\r\n\t\t\t// pad\r\n\t\t\tp.pad.style.position = 'relative';\r\n\t\t\tp.pad.style.width = THIS.width + 'px';\r\n\t\t\tp.pad.style.height = THIS.height + 'px';\r\n\r\n\t\t\t// pad - color spectrum (HSV and HVS)\r\n\t\t\tp.padCanvas.draw(THIS.width, THIS.height, jsc.getPadYChannel(THIS));\r\n\r\n\t\t\t// pad border\r\n\t\t\tp.padB.style.position = 'absolute';\r\n\t\t\tp.padB.style.left = THIS.padding + 'px';\r\n\t\t\tp.padB.style.top = THIS.padding + 'px';\r\n\t\t\tp.padB.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\tp.padB.style.borderColor = THIS.controlBorderColor;\r\n\r\n\t\t\t// pad mouse area\r\n\t\t\tp.padM.style.position = 'absolute';\r\n\t\t\tp.padM.style.left = 0 + 'px';\r\n\t\t\tp.padM.style.top = 0 + 'px';\r\n\t\t\tp.padM.style.width = (THIS.padding + 2 * THIS.controlBorderWidth + THIS.width + controlPadding) + 'px';\r\n\t\t\tp.padM.style.height = (2 * THIS.controlBorderWidth + 2 * THIS.padding + THIS.height) + 'px';\r\n\t\t\tp.padM.style.cursor = padCursor;\r\n\t\t\tjsc.setData(p.padM, {\r\n\t\t\t\tinstance: THIS,\r\n\t\t\t\tcontrol: 'pad',\r\n\t\t\t})\r\n\r\n\t\t\t// pad cross\r\n\t\t\tp.cross.style.position = 'absolute';\r\n\t\t\tp.cross.style.left =\r\n\t\t\tp.cross.style.top =\r\n\t\t\t\t'0';\r\n\t\t\tp.cross.style.width =\r\n\t\t\tp.cross.style.height =\r\n\t\t\t\tcrossOuterSize + 'px';\r\n\r\n\t\t\t// pad cross border Y and X\r\n\t\t\tp.crossBY.style.position =\r\n\t\t\tp.crossBX.style.position =\r\n\t\t\t\t'absolute';\r\n\t\t\tp.crossBY.style.background =\r\n\t\t\tp.crossBX.style.background =\r\n\t\t\t\tTHIS.pointerBorderColor;\r\n\t\t\tp.crossBY.style.width =\r\n\t\t\tp.crossBX.style.height =\r\n\t\t\t\t(2 * THIS.pointerBorderWidth + THIS.pointerThickness) + 'px';\r\n\t\t\tp.crossBY.style.height =\r\n\t\t\tp.crossBX.style.width =\r\n\t\t\t\tcrossOuterSize + 'px';\r\n\t\t\tp.crossBY.style.left =\r\n\t\t\tp.crossBX.style.top =\r\n\t\t\t\t(Math.floor(crossOuterSize / 2) - Math.floor(THIS.pointerThickness / 2) - THIS.pointerBorderWidth) + 'px';\r\n\t\t\tp.crossBY.style.top =\r\n\t\t\tp.crossBX.style.left =\r\n\t\t\t\t'0';\r\n\r\n\t\t\t// pad cross line Y and X\r\n\t\t\tp.crossLY.style.position =\r\n\t\t\tp.crossLX.style.position =\r\n\t\t\t\t'absolute';\r\n\t\t\tp.crossLY.style.background =\r\n\t\t\tp.crossLX.style.background =\r\n\t\t\t\tTHIS.pointerColor;\r\n\t\t\tp.crossLY.style.height =\r\n\t\t\tp.crossLX.style.width =\r\n\t\t\t\t(crossOuterSize - 2 * THIS.pointerBorderWidth) + 'px';\r\n\t\t\tp.crossLY.style.width =\r\n\t\t\tp.crossLX.style.height =\r\n\t\t\t\tTHIS.pointerThickness + 'px';\r\n\t\t\tp.crossLY.style.left =\r\n\t\t\tp.crossLX.style.top =\r\n\t\t\t\t(Math.floor(crossOuterSize / 2) - Math.floor(THIS.pointerThickness / 2)) + 'px';\r\n\t\t\tp.crossLY.style.top =\r\n\t\t\tp.crossLX.style.left =\r\n\t\t\t\tTHIS.pointerBorderWidth + 'px';\r\n\r\n\r\n\t\t\t// slider\r\n\t\t\tp.sld.style.overflow = 'hidden';\r\n\t\t\tp.sld.style.width = THIS.sliderSize + 'px';\r\n\t\t\tp.sld.style.height = THIS.height + 'px';\r\n\r\n\t\t\t// slider gradient\r\n\t\t\tp.sldGrad.draw(THIS.sliderSize, THIS.height, '#000', '#000');\r\n\r\n\t\t\t// slider border\r\n\t\t\tp.sldB.style.display = displaySlider ? 'block' : 'none';\r\n\t\t\tp.sldB.style.position = 'absolute';\r\n\t\t\tp.sldB.style.left = (THIS.padding + THIS.width + 2 * THIS.controlBorderWidth + 2 * controlPadding) + 'px';\r\n\t\t\tp.sldB.style.top = THIS.padding + 'px';\r\n\t\t\tp.sldB.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\tp.sldB.style.borderColor = THIS.controlBorderColor;\r\n\r\n\t\t\t// slider mouse area\r\n\t\t\tp.sldM.style.display = displaySlider ? 'block' : 'none';\r\n\t\t\tp.sldM.style.position = 'absolute';\r\n\t\t\tp.sldM.style.left = (THIS.padding + THIS.width + 2 * THIS.controlBorderWidth + controlPadding) + 'px';\r\n\t\t\tp.sldM.style.top = 0 + 'px';\r\n\t\t\tp.sldM.style.width = (\r\n\t\t\t\t\t(THIS.sliderSize + 2 * controlPadding + 2 * THIS.controlBorderWidth) +\r\n\t\t\t\t\t(displayAlphaSlider ? 0 : Math.max(0, THIS.padding - controlPadding)) // remaining padding to the right edge\r\n\t\t\t\t) + 'px';\r\n\t\t\tp.sldM.style.height = (2 * THIS.controlBorderWidth + 2 * THIS.padding + THIS.height) + 'px';\r\n\t\t\tp.sldM.style.cursor = 'default';\r\n\t\t\tjsc.setData(p.sldM, {\r\n\t\t\t\tinstance: THIS,\r\n\t\t\t\tcontrol: 'sld',\r\n\t\t\t});\r\n\r\n\t\t\t// slider pointer inner and outer border\r\n\t\t\tp.sldPtrIB.style.border =\r\n\t\t\tp.sldPtrOB.style.border =\r\n\t\t\t\tTHIS.pointerBorderWidth + 'px solid ' + THIS.pointerBorderColor;\r\n\r\n\t\t\t// slider pointer outer border\r\n\t\t\tp.sldPtrOB.style.position = 'absolute';\r\n\t\t\tp.sldPtrOB.style.left = -(2 * THIS.pointerBorderWidth + THIS.pointerThickness) + 'px';\r\n\t\t\tp.sldPtrOB.style.top = '0';\r\n\r\n\t\t\t// slider pointer middle border\r\n\t\t\tp.sldPtrMB.style.border = THIS.pointerThickness + 'px solid ' + THIS.pointerColor;\r\n\r\n\t\t\t// slider pointer spacer\r\n\t\t\tp.sldPtrS.style.width = THIS.sliderSize + 'px';\r\n\t\t\tp.sldPtrS.style.height = jsc.pub.sliderInnerSpace + 'px';\r\n\r\n\r\n\t\t\t// alpha slider\r\n\t\t\tp.asld.style.overflow = 'hidden';\r\n\t\t\tp.asld.style.width = THIS.sliderSize + 'px';\r\n\t\t\tp.asld.style.height = THIS.height + 'px';\r\n\r\n\t\t\t// alpha slider gradient\r\n\t\t\tp.asldGrad.draw(THIS.sliderSize, THIS.height, '#000');\r\n\r\n\t\t\t// alpha slider border\r\n\t\t\tp.asldB.style.display = displayAlphaSlider ? 'block' : 'none';\r\n\t\t\tp.asldB.style.position = 'absolute';\r\n\t\t\tp.asldB.style.left = (\r\n\t\t\t\t\t(THIS.padding + THIS.width + 2 * THIS.controlBorderWidth + controlPadding) +\r\n\t\t\t\t\t(displaySlider ? (THIS.sliderSize + 3 * controlPadding + 2 * THIS.controlBorderWidth) : 0)\r\n\t\t\t\t) + 'px';\r\n\t\t\tp.asldB.style.top = THIS.padding + 'px';\r\n\t\t\tp.asldB.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\tp.asldB.style.borderColor = THIS.controlBorderColor;\r\n\r\n\t\t\t// alpha slider mouse area\r\n\t\t\tp.asldM.style.display = displayAlphaSlider ? 'block' : 'none';\r\n\t\t\tp.asldM.style.position = 'absolute';\r\n\t\t\tp.asldM.style.left = (\r\n\t\t\t\t\t(THIS.padding + THIS.width + 2 * THIS.controlBorderWidth + controlPadding) +\r\n\t\t\t\t\t(displaySlider ? (THIS.sliderSize + 2 * controlPadding + 2 * THIS.controlBorderWidth) : 0)\r\n\t\t\t\t) + 'px';\r\n\t\t\tp.asldM.style.top = 0 + 'px';\r\n\t\t\tp.asldM.style.width = (\r\n\t\t\t\t\t(THIS.sliderSize + 2 * controlPadding + 2 * THIS.controlBorderWidth) +\r\n\t\t\t\t\tMath.max(0, THIS.padding - controlPadding) // remaining padding to the right edge\r\n\t\t\t\t) + 'px';\r\n\t\t\tp.asldM.style.height = (2 * THIS.controlBorderWidth + 2 * THIS.padding + THIS.height) + 'px';\r\n\t\t\tp.asldM.style.cursor = 'default';\r\n\t\t\tjsc.setData(p.asldM, {\r\n\t\t\t\tinstance: THIS,\r\n\t\t\t\tcontrol: 'asld',\r\n\t\t\t})\r\n\r\n\t\t\t// alpha slider pointer inner and outer border\r\n\t\t\tp.asldPtrIB.style.border =\r\n\t\t\tp.asldPtrOB.style.border =\r\n\t\t\t\tTHIS.pointerBorderWidth + 'px solid ' + THIS.pointerBorderColor;\r\n\r\n\t\t\t// alpha slider pointer outer border\r\n\t\t\tp.asldPtrOB.style.position = 'absolute';\r\n\t\t\tp.asldPtrOB.style.left = -(2 * THIS.pointerBorderWidth + THIS.pointerThickness) + 'px';\r\n\t\t\tp.asldPtrOB.style.top = '0';\r\n\r\n\t\t\t// alpha slider pointer middle border\r\n\t\t\tp.asldPtrMB.style.border = THIS.pointerThickness + 'px solid ' + THIS.pointerColor;\r\n\r\n\t\t\t// alpha slider pointer spacer\r\n\t\t\tp.asldPtrS.style.width = THIS.sliderSize + 'px';\r\n\t\t\tp.asldPtrS.style.height = jsc.pub.sliderInnerSpace + 'px';\r\n\r\n\r\n\t\t\t// palette\r\n\t\t\tp.pal.className = 'jscolor-palette';\r\n\t\t\tp.pal.style.display = pickerDims.palette.rows ? 'block' : 'none';\r\n\t\t\tp.pal.style.position = 'absolute';\r\n\t\t\tp.pal.style.left = THIS.padding + 'px';\r\n\t\t\tp.pal.style.top = (2 * THIS.controlBorderWidth + 2 * THIS.padding + THIS.height) + 'px';\r\n\r\n\t\t\t// palette's color samples\r\n\r\n\t\t\tp.pal.innerHTML = '';\r\n\r\n\t\t\tvar chessboard = jsc.genColorPreviewCanvas('rgba(0,0,0,0)');\r\n\r\n\t\t\tvar si = 0; // color sample's index\r\n\t\t\tfor (var r = 0; r < pickerDims.palette.rows; r++) {\r\n\t\t\t\tfor (var c = 0; c < pickerDims.palette.cols && si < THIS._palette.length; c++, si++) {\r\n\t\t\t\t\tvar sampleColor = THIS._palette[si];\r\n\t\t\t\t\tvar sampleCssColor = jsc.rgbaColor.apply(null, sampleColor.rgba);\r\n\r\n\t\t\t\t\tvar sc = jsc.createEl('div'); // color sample's color\r\n\t\t\t\t\tsc.style.width = (pickerDims.palette.cellW - 2 * THIS.controlBorderWidth) + 'px';\r\n\t\t\t\t\tsc.style.height = (pickerDims.palette.cellH - 2 * THIS.controlBorderWidth) + 'px';\r\n\t\t\t\t\tsc.style.backgroundColor = sampleCssColor;\r\n\r\n\t\t\t\t\tvar sw = jsc.createEl('div'); // color sample's wrap\r\n\t\t\t\t\tsw.className = 'jscolor-palette-sample';\r\n\t\t\t\t\tsw.style.display = 'block';\r\n\t\t\t\t\tsw.style.position = 'absolute';\r\n\t\t\t\t\tsw.style.left = (\r\n\t\t\t\t\t\t\tpickerDims.palette.cols <= 1 ? 0 :\r\n\t\t\t\t\t\t\tMath.round(10 * (c * ((pickerDims.contentW - pickerDims.palette.cellW) / (pickerDims.palette.cols - 1)))) / 10\r\n\t\t\t\t\t\t) + 'px';\r\n\t\t\t\t\tsw.style.top = (r * (pickerDims.palette.cellH + THIS.paletteSpacing)) + 'px';\r\n\t\t\t\t\tsw.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\t\t\tsw.style.borderColor = THIS.controlBorderColor;\r\n\t\t\t\t\tsw.style.cursor = 'pointer';\r\n\t\t\t\t\tif (sampleColor.rgba[3] !== null && sampleColor.rgba[3] < 1.0) { // only create chessboard background if the sample has transparency\r\n\t\t\t\t\t\tsw.style.backgroundImage = 'url(\\'' + chessboard.canvas.toDataURL() + '\\')';\r\n\t\t\t\t\t\tsw.style.backgroundRepeat = 'repeat';\r\n\t\t\t\t\t\tsw.style.backgroundPosition = 'center center';\r\n\t\t\t\t\t}\r\n\t\t\t\t\tjsc.setData(sw, {\r\n\t\t\t\t\t\tinstance: THIS,\r\n\t\t\t\t\t\tcontrol: 'palette-sample',\r\n\t\t\t\t\t\tcolor: sampleColor,\r\n\t\t\t\t\t})\r\n\t\t\t\t\tsw.addEventListener('click', jsc.onPaletteSampleClick, false);\r\n\t\t\t\t\tsw.appendChild(sc);\r\n\t\t\t\t\tp.pal.appendChild(sw);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\r\n\t\t\t// the Close button\r\n\t\t\tfunction setBtnBorder () {\r\n\t\t\t\tvar insetColors = THIS.controlBorderColor.split(/\\s+/);\r\n\t\t\t\tvar outsetColor = insetColors.length < 2 ? insetColors[0] : insetColors[1] + ' ' + insetColors[0] + ' ' + insetColors[0] + ' ' + insetColors[1];\r\n\t\t\t\tp.btn.style.borderColor = outsetColor;\r\n\t\t\t}\r\n\t\t\tvar btnPadding = 15; // px\r\n\t\t\tp.btn.className = 'jscolor-btn-close';\r\n\t\t\tp.btn.style.display = THIS.closeButton ? 'block' : 'none';\r\n\t\t\tp.btn.style.position = 'absolute';\r\n\t\t\tp.btn.style.left = THIS.padding + 'px';\r\n\t\t\tp.btn.style.bottom = THIS.padding + 'px';\r\n\t\t\tp.btn.style.padding = '0 ' + btnPadding + 'px';\r\n\t\t\tp.btn.style.maxWidth = (pickerDims.contentW - 2 * THIS.controlBorderWidth - 2 * btnPadding) + 'px';\r\n\t\t\tp.btn.style.overflow = 'hidden';\r\n\t\t\tp.btn.style.height = THIS.buttonHeight + 'px';\r\n\t\t\tp.btn.style.whiteSpace = 'nowrap';\r\n\t\t\tp.btn.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\tsetBtnBorder();\r\n\t\t\tp.btn.style.color = THIS.buttonColor;\r\n\t\t\tp.btn.style.font = '12px sans-serif';\r\n\t\t\tp.btn.style.textAlign = 'center';\r\n\t\t\tp.btn.style.cursor = 'pointer';\r\n\t\t\tp.btn.onmousedown = function () {\r\n\t\t\t\tTHIS.hide();\r\n\t\t\t};\r\n\t\t\tp.btnT.style.lineHeight = THIS.buttonHeight + 'px';\r\n\t\t\tp.btnT.innerHTML = '';\r\n\t\t\tp.btnT.appendChild(window.document.createTextNode(THIS.closeText));\r\n\r\n\t\t\t// reposition the pointers\r\n\t\t\tredrawPad();\r\n\t\t\tredrawSld();\r\n\t\t\tredrawASld();\r\n\r\n\t\t\t// If we are changing the owner without first closing the picker,\r\n\t\t\t// make sure to first deal with the old owner\r\n\t\t\tif (jsc.picker.owner && jsc.picker.owner !== THIS) {\r\n\t\t\t\tjsc.removeClass(jsc.picker.owner.targetElement, jsc.pub.activeClassName);\r\n\t\t\t}\r\n\r\n\t\t\t// Set a new picker owner\r\n\t\t\tjsc.picker.owner = THIS;\r\n\r\n\t\t\t// The redrawPosition() method needs picker.owner to be set, that's why we call it here,\r\n\t\t\t// after setting the owner\r\n\t\t\tif (THIS.container === window.document.body) {\r\n\t\t\t\tjsc.redrawPosition();\r\n\t\t\t} else {\r\n\t\t\t\tjsc._drawPosition(THIS, 0, 0, 'relative', false);\r\n\t\t\t}\r\n\r\n\t\t\tif (p.wrap.parentNode !== THIS.container) {\r\n\t\t\t\tTHIS.container.appendChild(p.wrap);\r\n\t\t\t}\r\n\r\n\t\t\tjsc.addClass(THIS.targetElement, jsc.pub.activeClassName);\r\n\t\t}\r\n\r\n\r\n\t\tfunction redrawPad () {\r\n\t\t\t// redraw the pad pointer\r\n\t\t\tvar yChannel = jsc.getPadYChannel(THIS);\r\n\t\t\tvar x = Math.round((THIS.channels.h / 360) * (THIS.width - 1));\r\n\t\t\tvar y = Math.round((1 - THIS.channels[yChannel] / 100) * (THIS.height - 1));\r\n\t\t\tvar crossOuterSize = (2 * THIS.pointerBorderWidth + THIS.pointerThickness + 2 * THIS.crossSize);\r\n\t\t\tvar ofs = -Math.floor(crossOuterSize / 2);\r\n\t\t\tjsc.picker.cross.style.left = (x + ofs) + 'px';\r\n\t\t\tjsc.picker.cross.style.top = (y + ofs) + 'px';\r\n\r\n\t\t\t// redraw the slider\r\n\t\t\tswitch (jsc.getSliderChannel(THIS)) {\r\n\t\t\tcase 's':\r\n\t\t\t\tvar rgb1 = jsc.HSV_RGB(THIS.channels.h, 100, THIS.channels.v);\r\n\t\t\t\tvar rgb2 = jsc.HSV_RGB(THIS.channels.h, 0, THIS.channels.v);\r\n\t\t\t\tvar color1 = 'rgb(' +\r\n\t\t\t\t\tMath.round(rgb1[0]) + ',' +\r\n\t\t\t\t\tMath.round(rgb1[1]) + ',' +\r\n\t\t\t\t\tMath.round(rgb1[2]) + ')';\r\n\t\t\t\tvar color2 = 'rgb(' +\r\n\t\t\t\t\tMath.round(rgb2[0]) + ',' +\r\n\t\t\t\t\tMath.round(rgb2[1]) + ',' +\r\n\t\t\t\t\tMath.round(rgb2[2]) + ')';\r\n\t\t\t\tjsc.picker.sldGrad.draw(THIS.sliderSize, THIS.height, color1, color2);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'v':\r\n\t\t\t\tvar rgb = jsc.HSV_RGB(THIS.channels.h, THIS.channels.s, 100);\r\n\t\t\t\tvar color1 = 'rgb(' +\r\n\t\t\t\t\tMath.round(rgb[0]) + ',' +\r\n\t\t\t\t\tMath.round(rgb[1]) + ',' +\r\n\t\t\t\t\tMath.round(rgb[2]) + ')';\r\n\t\t\t\tvar color2 = '#000';\r\n\t\t\t\tjsc.picker.sldGrad.draw(THIS.sliderSize, THIS.height, color1, color2);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\t// redraw the alpha slider\r\n\t\t\tjsc.picker.asldGrad.draw(THIS.sliderSize, THIS.height, THIS.toHEXString());\r\n\t\t}\r\n\r\n\r\n\t\tfunction redrawSld () {\r\n\t\t\tvar sldChannel = jsc.getSliderChannel(THIS);\r\n\t\t\tif (sldChannel) {\r\n\t\t\t\t// redraw the slider pointer\r\n\t\t\t\tvar y = Math.round((1 - THIS.channels[sldChannel] / 100) * (THIS.height - 1));\r\n\t\t\t\tjsc.picker.sldPtrOB.style.top = (y - (2 * THIS.pointerBorderWidth + THIS.pointerThickness) - Math.floor(jsc.pub.sliderInnerSpace / 2)) + 'px';\r\n\t\t\t}\r\n\r\n\t\t\t// redraw the alpha slider\r\n\t\t\tjsc.picker.asldGrad.draw(THIS.sliderSize, THIS.height, THIS.toHEXString());\r\n\t\t}\r\n\r\n\r\n\t\tfunction redrawASld () {\r\n\t\t\tvar y = Math.round((1 - THIS.channels.a) * (THIS.height - 1));\r\n\t\t\tjsc.picker.asldPtrOB.style.top = (y - (2 * THIS.pointerBorderWidth + THIS.pointerThickness) - Math.floor(jsc.pub.sliderInnerSpace / 2)) + 'px';\r\n\t\t}\r\n\r\n\r\n\t\tfunction isPickerOwner () {\r\n\t\t\treturn jsc.picker && jsc.picker.owner === THIS;\r\n\t\t}\r\n\r\n\r\n\t\tfunction onValueKeyDown (ev) {\r\n\t\t\tif (jsc.eventKey(ev) === 'Enter') {\r\n\t\t\t\tif (THIS.valueElement) {\r\n\t\t\t\t\tTHIS.processValueInput(THIS.valueElement.value);\r\n\t\t\t\t}\r\n\t\t\t\tTHIS.tryHide();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction onAlphaKeyDown (ev) {\r\n\t\t\tif (jsc.eventKey(ev) === 'Enter') {\r\n\t\t\t\tif (THIS.alphaElement) {\r\n\t\t\t\t\tTHIS.processAlphaInput(THIS.alphaElement.value);\r\n\t\t\t\t}\r\n\t\t\t\tTHIS.tryHide();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction onValueChange (ev) {\r\n\t\t\tif (jsc.getData(ev, 'internal')) {\r\n\t\t\t\treturn; // skip if the event was internally triggered by jscolor\r\n\t\t\t}\r\n\r\n\t\t\tvar oldVal = THIS.valueElement.value;\r\n\r\n\t\t\tTHIS.processValueInput(THIS.valueElement.value); // this might change the value\r\n\r\n\t\t\tjsc.triggerCallback(THIS, 'onChange');\r\n\r\n\t\t\tif (THIS.valueElement.value !== oldVal) {\r\n\t\t\t\t// value was additionally changed -> let's trigger the change event again, even though it was natively dispatched\r\n\t\t\t\tjsc.triggerInputEvent(THIS.valueElement, 'change', true, true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction onAlphaChange (ev) {\r\n\t\t\tif (jsc.getData(ev, 'internal')) {\r\n\t\t\t\treturn; // skip if the event was internally triggered by jscolor\r\n\t\t\t}\r\n\r\n\t\t\tvar oldVal = THIS.alphaElement.value;\r\n\r\n\t\t\tTHIS.processAlphaInput(THIS.alphaElement.value); // this might change the value\r\n\r\n\t\t\tjsc.triggerCallback(THIS, 'onChange');\r\n\r\n\t\t\t// triggering valueElement's onChange (because changing alpha changes the entire color, e.g. with rgba format)\r\n\t\t\tjsc.triggerInputEvent(THIS.valueElement, 'change', true, true);\r\n\r\n\t\t\tif (THIS.alphaElement.value !== oldVal) {\r\n\t\t\t\t// value was additionally changed -> let's trigger the change event again, even though it was natively dispatched\r\n\t\t\t\tjsc.triggerInputEvent(THIS.alphaElement, 'change', true, true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction onValueInput (ev) {\r\n\t\t\tif (jsc.getData(ev, 'internal')) {\r\n\t\t\t\treturn; // skip if the event was internally triggered by jscolor\r\n\t\t\t}\r\n\r\n\t\t\tif (THIS.valueElement) {\r\n\t\t\t\tTHIS.fromString(THIS.valueElement.value, jsc.flags.leaveValue);\r\n\t\t\t}\r\n\r\n\t\t\tjsc.triggerCallback(THIS, 'onInput');\r\n\r\n\t\t\t// triggering valueElement's onInput\r\n\t\t\t// (not needed, it was dispatched normally by the browser)\r\n\t\t}\r\n\r\n\r\n\t\tfunction onAlphaInput (ev) {\r\n\t\t\tif (jsc.getData(ev, 'internal')) {\r\n\t\t\t\treturn; // skip if the event was internally triggered by jscolor\r\n\t\t\t}\r\n\r\n\t\t\tif (THIS.alphaElement) {\r\n\t\t\t\tTHIS.fromHSVA(null, null, null, parseFloat(THIS.alphaElement.value), jsc.flags.leaveAlpha);\r\n\t\t\t}\r\n\r\n\t\t\tjsc.triggerCallback(THIS, 'onInput');\r\n\r\n\t\t\t// triggering valueElement's onInput (because changing alpha changes the entire color, e.g. with rgba format)\r\n\t\t\tjsc.triggerInputEvent(THIS.valueElement, 'input', true, true);\r\n\t\t}\r\n\r\n\r\n\t\t// let's process the DEPRECATED 'options' property (this will be later removed)\r\n\t\tif (jsc.pub.options) {\r\n\t\t\t// let's set custom default options, if specified\r\n\t\t\tfor (var opt in jsc.pub.options) {\r\n\t\t\t\tif (jsc.pub.options.hasOwnProperty(opt)) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tsetOption(opt, jsc.pub.options[opt]);\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\t// let's apply configuration presets\r\n\t\t//\r\n\t\tvar presetsArr = [];\r\n\r\n\t\tif (opts.preset) {\r\n\t\t\tif (typeof opts.preset === 'string') {\r\n\t\t\t\tpresetsArr = opts.preset.split(/\\s+/);\r\n\t\t\t} else if (Array.isArray(opts.preset)) {\r\n\t\t\t\tpresetsArr = opts.preset.slice(); // slice() to clone\r\n\t\t\t} else {\r\n\t\t\t\tconsole.warn('Unrecognized preset value');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// always use the 'default' preset. If it's not listed, append it to the end.\r\n\t\tif (presetsArr.indexOf('default') === -1) {\r\n\t\t\tpresetsArr.push('default');\r\n\t\t}\r\n\r\n\t\t// let's apply the presets in reverse order, so that should there be any overlapping options,\r\n\t\t// the formerly listed preset will override the latter\r\n\t\tfor (var i = presetsArr.length - 1; i >= 0; i -= 1) {\r\n\t\t\tvar pres = presetsArr[i];\r\n\t\t\tif (!pres) {\r\n\t\t\t\tcontinue; // preset is empty string\r\n\t\t\t}\r\n\t\t\tif (!jsc.pub.presets.hasOwnProperty(pres)) {\r\n\t\t\t\tconsole.warn('Unknown preset: %s', pres);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tfor (var opt in jsc.pub.presets[pres]) {\r\n\t\t\t\tif (jsc.pub.presets[pres].hasOwnProperty(opt)) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tsetOption(opt, jsc.pub.presets[pres][opt]);\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\t// let's set specific options for this color picker\r\n\t\tvar nonProperties = [\r\n\t\t\t// these options won't be set as instance properties\r\n\t\t\t'preset',\r\n\t\t];\r\n\t\tfor (var opt in opts) {\r\n\t\t\tif (opts.hasOwnProperty(opt)) {\r\n\t\t\t\tif (nonProperties.indexOf(opt) === -1) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tsetOption(opt, opts[opt]);\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\t//\r\n\t\t// Install the color picker on chosen element(s)\r\n\t\t//\r\n\r\n\r\n\t\t// Determine picker's container element\r\n\t\tif (this.container === undefined) {\r\n\t\t\tthis.container = window.document.body; // default container is BODY element\r\n\r\n\t\t} else { // explicitly set to custom element\r\n\t\t\tthis.container = jsc.node(this.container);\r\n\t\t}\r\n\r\n\t\tif (!this.container) {\r\n\t\t\tthrow new Error('Cannot instantiate color picker without a container element');\r\n\t\t}\r\n\r\n\r\n\t\t// Fetch the target element\r\n\t\tthis.targetElement = jsc.node(targetElement);\r\n\r\n\t\tif (!this.targetElement) {\r\n\t\t\t// temporarily customized error message to help with migrating from versions prior to 2.2\r\n\t\t\tif (typeof targetElement === 'string' && /^[a-zA-Z][\\w:.-]*$/.test(targetElement)) {\r\n\t\t\t\t// targetElement looks like valid ID\r\n\t\t\t\tvar possiblyId = targetElement;\r\n\t\t\t\tthrow new Error('If \\'' + possiblyId + '\\' is supposed to be an ID, please use \\'#' + possiblyId + '\\' or any valid CSS selector.');\r\n\t\t\t}\r\n\r\n\t\t\tthrow new Error('Cannot instantiate color picker without a target element');\r\n\t\t}\r\n\r\n\t\tif (this.targetElement.jscolor && this.targetElement.jscolor instanceof jsc.pub) {\r\n\t\t\tthrow new Error('Color picker already installed on this element');\r\n\t\t}\r\n\r\n\r\n\t\t// link this instance with the target element\r\n\t\tthis.targetElement.jscolor = this;\r\n\t\tjsc.addClass(this.targetElement, jsc.pub.className);\r\n\r\n\t\t// register this instance\r\n\t\tjsc.instances.push(this);\r\n\r\n\r\n\t\t// if target is BUTTON\r\n\t\tif (jsc.isButton(this.targetElement)) {\r\n\r\n\t\t\tif (this.targetElement.type.toLowerCase() !== 'button') {\r\n\t\t\t\t// on buttons, always force type to be 'button', e.g. in situations the target <button> has no type\r\n\t\t\t\t// and thus defaults to 'submit' and would submit the form when clicked\r\n\t\t\t\tthis.targetElement.type = 'button';\r\n\t\t\t}\r\n\r\n\t\t\tif (jsc.isButtonEmpty(this.targetElement)) { // empty button\r\n\t\t\t\t// it is important to clear element's contents first.\r\n\t\t\t\t// if we're re-instantiating color pickers on DOM that has been modified by changing page's innerHTML,\r\n\t\t\t\t// we would keep adding more non-breaking spaces to element's content (because element's contents survive\r\n\t\t\t\t// innerHTML changes, but picker instances don't)\r\n\t\t\t\tjsc.removeChildren(this.targetElement);\r\n\r\n\t\t\t\t// let's insert a non-breaking space\r\n\t\t\t\tthis.targetElement.appendChild(window.document.createTextNode('\\xa0'));\r\n\r\n\t\t\t\t// set min-width = previewSize, if not already greater\r\n\t\t\t\tvar compStyle = jsc.getCompStyle(this.targetElement);\r\n\t\t\t\tvar currMinWidth = parseFloat(compStyle['min-width']) || 0;\r\n\t\t\t\tif (currMinWidth < this.previewSize) {\r\n\t\t\t\t\tjsc.setStyle(this.targetElement, {\r\n\t\t\t\t\t\t'min-width': this.previewSize + 'px',\r\n\t\t\t\t\t}, this.forceStyle);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Determine the value element\r\n\t\tif (this.valueElement === undefined) {\r\n\t\t\tif (jsc.isTextInput(this.targetElement)) {\r\n\t\t\t\t// for text inputs, default valueElement is targetElement\r\n\t\t\t\tthis.valueElement = this.targetElement;\r\n\t\t\t} else {\r\n\t\t\t\t// leave it undefined\r\n\t\t\t}\r\n\r\n\t\t} else if (this.valueElement === null) { // explicitly set to null\r\n\t\t\t// leave it null\r\n\r\n\t\t} else { // explicitly set to custom element\r\n\t\t\tthis.valueElement = jsc.node(this.valueElement);\r\n\t\t}\r\n\r\n\t\t// Determine the alpha element\r\n\t\tif (this.alphaElement) {\r\n\t\t\tthis.alphaElement = jsc.node(this.alphaElement);\r\n\t\t}\r\n\r\n\t\t// Determine the preview element\r\n\t\tif (this.previewElement === undefined) {\r\n\t\t\tthis.previewElement = this.targetElement; // default previewElement is targetElement\r\n\r\n\t\t} else if (this.previewElement === null) { // explicitly set to null\r\n\t\t\t// leave it null\r\n\r\n\t\t} else { // explicitly set to custom element\r\n\t\t\tthis.previewElement = jsc.node(this.previewElement);\r\n\t\t}\r\n\r\n\t\t// valueElement\r\n\t\tif (this.valueElement && jsc.isTextInput(this.valueElement)) {\r\n\r\n\t\t\t// If the value element has onInput event already set, we need to detach it and attach AFTER our listener.\r\n\t\t\t// otherwise the picker instance would still contain the old color when accessed from the onInput handler.\r\n\t\t\tvar valueElementOrigEvents = {\r\n\t\t\t\tonInput: this.valueElement.oninput\r\n\t\t\t};\r\n\t\t\tthis.valueElement.oninput = null;\r\n\r\n\t\t\tthis.valueElement.addEventListener('keydown', onValueKeyDown, false);\r\n\t\t\tthis.valueElement.addEventListener('change', onValueChange, false);\r\n\t\t\tthis.valueElement.addEventListener('input', onValueInput, false);\r\n\t\t\t// the original event listener must be attached AFTER our handler (to let it first set picker's color)\r\n\t\t\tif (valueElementOrigEvents.onInput) {\r\n\t\t\t\tthis.valueElement.addEventListener('input', valueElementOrigEvents.onInput, false);\r\n\t\t\t}\r\n\r\n\t\t\tthis.valueElement.setAttribute('autocomplete', 'off');\r\n\t\t\tthis.valueElement.setAttribute('autocorrect', 'off');\r\n\t\t\tthis.valueElement.setAttribute('autocapitalize', 'off');\r\n\t\t\tthis.valueElement.setAttribute('spellcheck', false);\r\n\t\t}\r\n\r\n\t\t// alphaElement\r\n\t\tif (this.alphaElement && jsc.isTextInput(this.alphaElement)) {\r\n\t\t\tthis.alphaElement.addEventListener('keydown', onAlphaKeyDown, false);\r\n\t\t\tthis.alphaElement.addEventListener('change', onAlphaChange, false);\r\n\t\t\tthis.alphaElement.addEventListener('input', onAlphaInput, false);\r\n\r\n\t\t\tthis.alphaElement.setAttribute('autocomplete', 'off');\r\n\t\t\tthis.alphaElement.setAttribute('autocorrect', 'off');\r\n\t\t\tthis.alphaElement.setAttribute('autocapitalize', 'off');\r\n\t\t\tthis.alphaElement.setAttribute('spellcheck', false);\r\n\t\t}\r\n\r\n\t\t// determine initial color value\r\n\t\t//\r\n\t\tvar initValue = 'FFFFFF';\r\n\r\n\t\tif (this.value !== undefined) {\r\n\t\t\tinitValue = this.value; // get initial color from the 'value' property\r\n\t\t} else if (this.valueElement && this.valueElement.value !== undefined) {\r\n\t\t\tinitValue = this.valueElement.value; // get initial color from valueElement's value\r\n\t\t}\r\n\r\n\t\t// determine initial alpha value\r\n\t\t//\r\n\t\tvar initAlpha = undefined;\r\n\r\n\t\tif (this.alpha !== undefined) {\r\n\t\t\tinitAlpha = (''+this.alpha); // get initial alpha value from the 'alpha' property\r\n\t\t} else if (this.alphaElement && this.alphaElement.value !== undefined) {\r\n\t\t\tinitAlpha = this.alphaElement.value; // get initial color from alphaElement's value\r\n\t\t}\r\n\r\n\t\t// determine current format based on the initial color value\r\n\t\t//\r\n\t\tthis._currentFormat = null;\r\n\r\n\t\tif (['auto', 'any'].indexOf(this.format.toLowerCase()) > -1) {\r\n\t\t\t// format is 'auto' or 'any' -> let's auto-detect current format\r\n\t\t\tvar color = jsc.parseColorString(initValue);\r\n\t\t\tthis._currentFormat = color ? color.format : 'hex';\r\n\t\t} else {\r\n\t\t\t// format is specified\r\n\t\t\tthis._currentFormat = this.format.toLowerCase();\r\n\t\t}\r\n\r\n\r\n\t\t// let's parse the initial color value and expose color's preview\r\n\t\tthis.processValueInput(initValue);\r\n\r\n\t\t// let's also parse and expose the initial alpha value, if any\r\n\t\t//\r\n\t\t// Note: If the initial color value contains alpha value in it (e.g. in rgba format),\r\n\t\t// this will overwrite it. So we should only process alpha input if there was initial\r\n\t\t// alpha explicitly set, otherwise we could needlessly lose initial value's alpha\r\n\t\tif (initAlpha !== undefined) {\r\n\t\t\tthis.processAlphaInput(initAlpha);\r\n\t\t}\r\n\r\n\t\tif (this.random) {\r\n\t\t\t// randomize the initial color value\r\n\t\t\tthis.randomize.apply(this, Array.isArray(this.random) ? this.random : []);\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n\r\n//================================\r\n// Public properties and methods\r\n//================================\r\n\r\n//\r\n// These will be publicly available via jscolor.<name> and JSColor.<name>\r\n//\r\n\r\n\r\n// class that will be set to elements having jscolor installed on them\r\njsc.pub.className = 'jscolor';\r\n\r\n\r\n// class that will be set to elements having jscolor active on them\r\njsc.pub.activeClassName = 'jscolor-active';\r\n\r\n\r\n// whether to try to parse the options string by evaluating it using 'new Function()'\r\n// in case it could not be parsed with JSON.parse()\r\njsc.pub.looseJSON = true;\r\n\r\n\r\n// presets\r\njsc.pub.presets = {};\r\n\r\n// built-in presets\r\njsc.pub.presets['default'] = {}; // baseline for customization\r\n\r\njsc.pub.presets['light'] = { // default color scheme\r\n\tbackgroundColor: 'rgba(255,255,255,1)',\r\n\tcontrolBorderColor: 'rgba(187,187,187,1)',\r\n\tbuttonColor: 'rgba(0,0,0,1)',\r\n};\r\njsc.pub.presets['dark'] = {\r\n\tbackgroundColor: 'rgba(51,51,51,1)',\r\n\tcontrolBorderColor: 'rgba(153,153,153,1)',\r\n\tbuttonColor: 'rgba(240,240,240,1)',\r\n};\r\n\r\njsc.pub.presets['small'] = { width:101, height:101, padding:10, sliderSize:14, paletteCols:8 };\r\njsc.pub.presets['medium'] = { width:181, height:101, padding:12, sliderSize:16, paletteCols:10 }; // default size\r\njsc.pub.presets['large'] = { width:271, height:151, padding:12, sliderSize:24, paletteCols:15 };\r\n\r\njsc.pub.presets['thin'] = { borderWidth:1, controlBorderWidth:1, pointerBorderWidth:1 }; // default thickness\r\njsc.pub.presets['thick'] = { borderWidth:2, controlBorderWidth:2, pointerBorderWidth:2 };\r\n\r\n\r\n// size of space in the sliders\r\njsc.pub.sliderInnerSpace = 3; // px\r\n\r\n// transparency chessboard\r\njsc.pub.chessboardSize = 8; // px\r\njsc.pub.chessboardColor1 = '#666666';\r\njsc.pub.chessboardColor2 = '#999999';\r\n\r\n// preview separator\r\njsc.pub.previewSeparator = ['rgba(255,255,255,.65)', 'rgba(128,128,128,.65)'];\r\n\r\n\r\n// Initializes jscolor\r\njsc.pub.init = function () {\r\n\tif (jsc.initialized) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t// attach some necessary handlers\r\n\twindow.document.addEventListener('mousedown', jsc.onDocumentMouseDown, false);\r\n\twindow.document.addEventListener('keyup', jsc.onDocumentKeyUp, false);\r\n\twindow.addEventListener('resize', jsc.onWindowResize, false);\r\n\twindow.addEventListener('scroll', jsc.onWindowScroll, false);\r\n\r\n\t// install jscolor on current DOM\r\n\tjsc.pub.install();\r\n\r\n\tjsc.initialized = true;\r\n\r\n\t// call functions waiting in the queue\r\n\twhile (jsc.readyQueue.length) {\r\n\t\tvar func = jsc.readyQueue.shift();\r\n\t\tfunc();\r\n\t}\r\n};\r\n\r\n\r\n// Installs jscolor on current DOM tree\r\njsc.pub.install = function (rootNode) {\r\n\tvar success = true;\r\n\r\n\ttry {\r\n\t\tjsc.installBySelector('[data-jscolor]', rootNode);\r\n\t} catch (e) {\r\n\t\tsuccess = false;\r\n\t\tconsole.warn(e);\r\n\t}\r\n\r\n\t// for backward compatibility with DEPRECATED installation using class name\r\n\tif (jsc.pub.lookupClass) {\r\n\t\ttry {\r\n\t\t\tjsc.installBySelector(\r\n\t\t\t\t(\r\n\t\t\t\t\t'input.' + jsc.pub.lookupClass + ', ' +\r\n\t\t\t\t\t'button.' + jsc.pub.lookupClass\r\n\t\t\t\t),\r\n\t\t\t\trootNode\r\n\t\t\t);\r\n\t\t} catch (e) {}\r\n\t}\r\n\r\n\treturn success;\r\n};\r\n\r\n\r\n// Registers function to be called as soon as jscolor is initialized (or immediately, if it already is).\r\n//\r\njsc.pub.ready = function (func) {\r\n\tif (typeof func !== 'function') {\r\n\t\tconsole.warn('Passed value is not a function');\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif (jsc.initialized) {\r\n\t\tfunc();\r\n\t} else {\r\n\t\tjsc.readyQueue.push(func);\r\n\t}\r\n\treturn true;\r\n};\r\n\r\n\r\n// Triggers given input event(s) (e.g. 'input' or 'change') on all color pickers.\r\n//\r\n// It is possible to specify multiple events separated with a space.\r\n// If called before jscolor is initialized, then the events will be triggered after initialization.\r\n//\r\njsc.pub.trigger = function (eventNames) {\r\n\tvar triggerNow = function () {\r\n\t\tjsc.triggerGlobal(eventNames);\r\n\t};\r\n\r\n\tif (jsc.initialized) {\r\n\t\ttriggerNow();\r\n\t} else {\r\n\t\tjsc.pub.ready(triggerNow);\r\n\t}\r\n};\r\n\r\n\r\n// Hides current color picker box\r\njsc.pub.hide = function () {\r\n\tif (jsc.picker && jsc.picker.owner) {\r\n\t\tjsc.picker.owner.hide();\r\n\t}\r\n};\r\n\r\n\r\n// Returns a data URL of a gray chessboard image that indicates transparency\r\njsc.pub.chessboard = function (color) {\r\n\tif (!color) {\r\n\t\tcolor = 'rgba(0,0,0,0)';\r\n\t}\r\n\tvar preview = jsc.genColorPreviewCanvas(color);\r\n\treturn preview.canvas.toDataURL();\r\n};\r\n\r\n\r\n// Returns a data URL of a gray chessboard image that indicates transparency\r\njsc.pub.background = function (color) {\r\n\tvar backgrounds = [];\r\n\r\n\t// CSS gradient for background color preview\r\n\tbackgrounds.push(jsc.genColorPreviewGradient(color));\r\n\r\n\t// data URL of generated PNG image with a gray transparency chessboard\r\n\tvar preview = jsc.genColorPreviewCanvas();\r\n\tbackgrounds.push([\r\n\t\t'url(\\'' + preview.canvas.toDataURL() + '\\')',\r\n\t\t'left top',\r\n\t\t'repeat',\r\n\t].join(' '));\r\n\r\n\treturn backgrounds.join(', ');\r\n};\r\n\r\n\r\n//\r\n// DEPRECATED properties and methods\r\n//\r\n\r\n\r\n// DEPRECATED. Use jscolor.presets.default instead.\r\n//\r\n// Custom default options for all color pickers, e.g. { hash: true, width: 300 }\r\njsc.pub.options = {};\r\n\r\n\r\n// DEPRECATED. Use data-jscolor attribute instead, which installs jscolor on given element.\r\n//\r\n// By default, we'll search for all elements with class=\"jscolor\" and install a color picker on them.\r\n//\r\n// You can change what class name will be looked for by setting the property jscolor.lookupClass\r\n// anywhere in your HTML document. To completely disable the automatic lookup, set it to null.\r\n//\r\njsc.pub.lookupClass = 'jscolor';\r\n\r\n\r\n// DEPRECATED. Use data-jscolor attribute instead, which installs jscolor on given element.\r\n//\r\n// Install jscolor on all elements that have the specified class name\r\njsc.pub.installByClassName = function () {\r\n\tconsole.error('jscolor.installByClassName() is DEPRECATED. Use data-jscolor=\"\" attribute instead of a class name.' + jsc.docsRef);\r\n\treturn false;\r\n};\r\n\r\n\r\njsc.register();\r\n\r\n\r\nreturn jsc.pub;\r\n\r\n\r\n})(); // END jscolor\r\n\r\n\r\nif (typeof window.jscolor === 'undefined') {\r\n\twindow.jscolor = window.JSColor = jscolor;\r\n}\r\n\r\n\r\n// END jscolor code\r\n\r\nreturn jscolor;\r\n\r\n}); // END factory\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/** The basic setting class */\nexport default class Setting {\n constructor(defaultValue, type, group) {\n this.defaultValue = defaultValue;\n this.type = type;\n this.group = group;\n }\n}\n","/** Creates a Prompt similar to the base game fixing some of the stuff breaking them\n * @param \t{string}\tcontent\t The outerHTML of the inputPrompt\n * @param \t{Array}\t\toptions\t An array containing labels and functions for the buttons of the prompt\n */\nexport default function cookieMonsterPrompt(content, options) {\n Game.promptWrapL.className = 'framed';\n Game.promptL.innerHTML = `${content}<div class=\"optionBox\"></div>`;\n Object.keys(options).forEach((i) => {\n const option = document.createElement('a');\n option.id = `promptOption${i}`;\n option.className = 'option';\n option.onclick = function () {\n PlaySound('snd/tick.mp3');\n options[i][1]();\n };\n option.textContent = options[i][0]; // eslint-disable-line prefer-destructuring\n Game.promptL.children[1].appendChild(option);\n });\n Game.promptAnchorL.style.display = 'block';\n Game.darkenL.style.display = 'block';\n Game.promptL.focus();\n Game.promptOn = 1;\n Game.UpdatePrompt();\n}\n","/**\n * This function creates a flash depending on config\n * @param\t{string}\tmodName\t The name of the mod\n * @param\t{number}\tmode\t Sets the intensity of the flash, used to recursively dim flash\n * \t\t\t\t\t\t\t\t All initial calls of function have use mode === 3\n * @param\t{string}\tconfigName\tThe setting that is checked before creating the flash\n * @param\t{bool} forced\t Whether the sound should play regardless of settings, used to test the sound\n */\n\nexport default function createFlash(modName, mode, configName, forced) {\n // The arguments check makes the sound not play upon initialization of the mod\n if (\n ((Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] === 1 || forced) &&\n mode === 3 &&\n window.cookieMonsterFrameworkData.isInitializing === false) ||\n mode === 1\n ) {\n l('CMFlashScreen').style.backgroundColor =\n Game.mods.cookieMonsterFramework.saveData[modName].settings[`Colour${configName}`];\n l('CMFlashScreen').style.opacity = '0.5';\n if (mode === 3) {\n l('CMFlashScreen').style.display = 'inline';\n setTimeout(() => {\n createFlash(modName, 2, configName, true);\n }, 1000 / Game.fps);\n } else {\n setTimeout(() => {\n createFlash(modName, 0, configName, true);\n }, 1000 / Game.fps);\n }\n } else if (mode === 2) {\n l('CMFlashScreen').style.opacity = '1';\n setTimeout(() => {\n createFlash(modName, 1, configName, true);\n }, 1000 / Game.fps);\n } else if (mode === 0) l('CMFlashScreen').style.display = 'none';\n}\n","/**\n * This function saves the settings and headers within the Framework without saving any of the other save-data\n * This allows saving in between the autosave intervals\n */\nexport default function saveFramework() {\n Object.keys(Game.mods.cookieMonsterFramework.saveData).forEach((modName) => {\n const modSaveString = JSON.stringify(Game.mods.cookieMonsterFramework.saveData[modName]);\n\n const cookieClickerSaveString = b64_to_utf8(\n unescape(localStorage.getItem('CookieClickerGame')).split('!END!')[0],\n );\n const pattern = new RegExp(`${modName}.*(;|$)`);\n const modSave = cookieClickerSaveString.match(pattern);\n if (modSave !== null) {\n const newSaveString = cookieClickerSaveString.replace(\n modSave[0],\n `${modName}:${modSaveString}`,\n );\n localStorage.setItem('CookieClickerGame', escape(`${utf8_to_b64(newSaveString)}!END!`));\n }\n });\n}\n","import saveFramework from '../../savingAndLoading/saveFramework';\n\n/**\n * This function toggles header options by incrementing them with 1 and handling changes\n * It is called by the onclick event of the +/- next to headers\n * @param \t{string}\tconfig\tThe name of the header\n */\nexport default function toggleHeader(modName, headerName) {\n if (\n typeof Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName] === 'undefined'\n ) {\n Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName] = 1;\n }\n switch (Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName]) {\n case 0:\n Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName] = 1;\n break;\n default:\n Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName] = 0;\n break;\n }\n saveFramework();\n}\n","/**\n * This function plays a sound depending on config\n * @param\t{string}\tmodName\t The name of the mod\n * @param\t{variable}\turl\t\t\tA variable that gives the url for the sound (e.g., CM.Options.GCSoundURL)\n * @param\t{string}\tsndConfig\tThe setting in CM.Options that is checked before creating the sound\n * @param\t{string}\tvolConfig\tThe setting in CM.Options that is checked to determine volume\n * @param\t{bool} forced\t\tWhether the sound should play regardless of settings, used to test the sound\n */\nexport default function playCMSound(modName, url, sndConfig, volConfig, forced) {\n if (\n (Game.mods.cookieMonsterFramework.saveData[modName].settings[sndConfig] === 1 || forced) &&\n window.cookieMonsterFrameworkData.isInitializing === false\n ) {\n // eslint-disable-next-line new-cap\n const sound = new Audio(url);\n if (Game.mods.cookieMonsterFramework.saveData[modName].settings.GeneralSound)\n sound.volume =\n (Game.mods.cookieMonsterFramework.saveData[modName].settings[volConfig] / 100) *\n (Game.volume / 100);\n else\n sound.volume = Game.mods.cookieMonsterFramework.saveData[modName].settings[volConfig] / 100;\n sound.play();\n }\n}\n","import saveFramework from '../savingAndLoading/saveFramework';\n\n/**\n * This function sets the value of the specified volume-option and updates the display in the options menu\n * It is called by the oninput and onchange event of \"vol\" type options\n * @param \t{string}\tmodName\t The name of the option\n * @param \t{string} configName The name of the option\n */\nexport default function toggleConfigVolume(modName, configName) {\n if (l(`slider${modName}${configName}`) !== null) {\n l(`slider${modName}${configName}right`).innerHTML = `${\n l(`slider${modName}${configName}`).value\n }%`;\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = Math.round(\n l(`slider${modName}${configName}`).value,\n );\n }\n saveFramework();\n}\n","import addInfoMenuSection from './info/addInfoMenuSection';\n// import addOptionsMenuSection from './options/addOptionsMenuSection';\n\n/**\n * Call the function to add a Menu based on the current menu\n * @param {MutationObserver} The observer object that is listening to DOM-changes of id='menu'\n */\nexport default function addMenu(_, observer) {\n // Disconnect observer to avoid infinite loop\n observer.disconnect();\n\n if (Game.onMenu === 'log') {\n addInfoMenuSection();\n } else if (Game.onMenu === 'prefs') {\n // Commented out because this is broken\n // addOptionsMenuSection();\n }\n\n // Reconnect observer to monitor changes\n observer.observe(document.getElementById('menu'), {\n attributes: true,\n childList: true,\n subtree: true,\n });\n}\n","import createFrameworkInfoMenuSection from './createFrameworkInfoMenuSection';\n/**\n * Add things to the Info menu\n * The listeners.infoMenu objects contains functions which create <div>'s to add to the menu section\n */\nexport default function addInfoMenuSection() {\n const menu = l('menu').children[1];\n menu.insertBefore(createFrameworkInfoMenuSection(), menu.children[1]);\n\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu) {\n const listeners = Game.mods.cookieMonsterFramework.listeners.infoMenu;\n for (let i = 0; i < listeners.length; i++) {\n l('cookieMonsterFrameworkMenuSection').appendChild(listeners[i]());\n }\n }\n}\n","import modDescription from '../../data/modInfo';\nimport toggleHeader from '../../../menu/toggles/toggleHeader';\n/**\n * Add things to the Info menu\n * @returns {object} frameworkInfoDiv Subsection to which other mods can add their info sections\n */\nexport default function createFrameworkInfoMenuSection() {\n const frameworkInfoDiv = document.createElement('div');\n frameworkInfoDiv.className = 'subsection';\n frameworkInfoDiv.id = 'cookieMonsterFrameworkMenuSection';\n\n const titleDiv = document.createElement('div');\n titleDiv.className = 'title';\n titleDiv.innerHTML = 'Cookie Monster Mod Family';\n\n const buttonSpan = document.createElement('span');\n buttonSpan.style.cursor = 'pointer';\n buttonSpan.style.display = 'inline-block';\n buttonSpan.style.height = '14px';\n buttonSpan.style.width = '14px';\n buttonSpan.style.borderRadius = '7px';\n buttonSpan.style.textAlign = 'center';\n buttonSpan.style.backgroundColor = '#C0C0C0';\n buttonSpan.style.color = 'black';\n buttonSpan.style.fontSize = '13px';\n buttonSpan.style.verticalAlign = 'middle';\n buttonSpan.textContent = Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers\n .infoMenu\n ? '-'\n : '+';\n buttonSpan.onclick = function () {\n toggleHeader('cookieMonsterFramework', 'infoMenu');\n Game.UpdateMenu();\n };\n titleDiv.appendChild(buttonSpan);\n\n frameworkInfoDiv.appendChild(titleDiv);\n\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu) {\n const descriptionDiv = document.createElement('div');\n descriptionDiv.className = 'listing';\n descriptionDiv.innerHTML = modDescription;\n frameworkInfoDiv.appendChild(descriptionDiv);\n }\n\n return frameworkInfoDiv;\n}\n","/**\n * Short description of the mod\n */\nconst modDescription = `<a href=\"https://github.com/CookieMonsterTeam\" target=\"blank\">Cookie Monster Team</a>\noffers a suite of tools to enhance your game experience.</br>\nOriginally known from our work on the Cookie Monster add-on we are now expanding and working on new tools within the Cookie Monster Mod Family.</br>\nKeep an eye on our GitHub to see future work or use it to report bugs or feature requests!</br>\n`;\n\nexport default modDescription;\n","/**\n * Main draw loop\n */\nexport default function drawLoop() {}\n","/** This includes all headers of the Cookie Monster Framework and their relevant data */\nconst headers = { infoMenu: 1, optionsMenu: 1 };\nexport default headers;\n","import createSaveDataObject from './createSaveDataObject';\nimport saveFramework from './saveFramework';\n\n/**\n * Load the data from a save-file into a mod\n * @param {string} modName The name of the mode to be saved\n * @param {string} saveData JSON-string of the save data\n * @param {object} settingsData The data containing default values of settings\n * @param {object} headersData The data containing default values of headers\n * @param {Function} logicLoop The logic-loop of the mod\n */\nexport default function loadMod(modName, saveData, settingsData, headersData, logicLoop) {\n const saveDataObject = JSON.parse(saveData);\n Game.mods.cookieMonsterFramework.saveData[modName] = createSaveDataObject(\n saveDataObject,\n settingsData,\n headersData,\n );\n saveFramework();\n logicLoop();\n Object.keys(Game.mods.cookieMonsterFramework.saveData[modName].settings).forEach((i) => {\n if (typeof settingsData[i].func !== 'undefined') {\n settingsData[i].func();\n }\n });\n Game.UpdateMenu();\n}\n","/**\n * Creates the save data object to be stored\n * @param {object} saveData The loaded save data\n * @param {object} settingsData The data containing default values of settings\n * @param {object} headersData The data containing default values of headers\n */\nexport default function createSaveDataObject(saveData, settingsData, headersData) {\n const modSaveData = {};\n\n // When a setting is missing (because it is new or modified) these lines add the default value\n const settingsObject = {};\n Object.keys(settingsData).forEach((i) => {\n if (typeof saveData.settings === 'undefined' || typeof saveData.settings[i] === 'undefined') {\n settingsObject[i] = settingsData[i].defaultValue; // eslint-disable-line prefer-destructuring\n } else {\n settingsObject[i] = saveData.settings[i];\n }\n });\n modSaveData.settings = settingsObject;\n\n // When a header is missing (because it is new or modified) these lines add the default value\n const headersObject = {};\n Object.keys(headersData).forEach((i) => {\n if (typeof saveData.headers === 'undefined' || typeof saveData.headers[i] === 'undefined') {\n headersObject[i] = headersData[i];\n } else {\n headersObject[i] = saveData.headers[i];\n }\n });\n modSaveData.headers = headersObject;\n\n Object.keys(saveData).forEach((key) => {\n if (key !== 'settings' && key !== 'headers') {\n modSaveData[key] = saveData[key];\n }\n });\n\n if (typeof modSaveData.favouriteSettings === 'undefined') {\n modSaveData.favouriteSettings = [];\n }\n return modSaveData;\n}\n","/**\n * Main logic loop\n */\nexport default function logicLoop() {}\n","/** This includes all options of the Cookie Monster Framework and their relevant data */\nconst settings = {};\nexport default settings;\n","import headers from './data/headers';\nimport loadMod from '../savingAndLoading/loadMod';\nimport logicLoop from './logic/logicLoop';\nimport settings from './data/settings';\n\n/**\n * This creates a load function to the CM object. Per Game code/comments:\n * \"do stuff with the string data you saved previously\"\n * @param {string} JSON string of save-data\n */\nexport default function load(str) {\n loadMod('cookieMonsterFramework', str, settings, headers, logicLoop);\n}\n","import init from './init';\nimport load from './load';\nimport save from './save';\n\n/** The mod object to be registered with the Modding API */\nconst cookieMonsterFramework = {\n init,\n load,\n save,\n listeners: {\n infoMenu: [],\n optionsMenu: [],\n },\n saveData: { cookieMonsterFramework: { headers: {}, settings: {} } },\n};\n\nexport default cookieMonsterFramework;\n","import addMenu from './menuSections/addMenu';\nimport createFlashScreen from './init/createFlashScreen';\nimport drawLoop from './draw/drawLoop';\nimport load from './load';\n\n/**\n * This creates a init function for the CM object. Per Game code/comments:\n * \"this function is called as soon as the mod is registered\n * declare hooks here\"\n * It starts the further initialization of CookieMonster and registers hooks\n */\nexport default function init() {\n // Create Data object in global scope\n window.cookieMonsterFrameworkData = { isInitializing: true };\n\n // Create MutationObserver for menu sections\n const observer = new MutationObserver(addMenu);\n observer.observe(document.getElementById('menu'), {\n attributes: true,\n childList: true,\n subtree: true,\n });\n\n // Draw initiaization\n createFlashScreen();\n\n // Register hooks\n Game.registerHook('draw', drawLoop);\n\n // Load defaults if there is no previous save\n if (typeof Game.modSaveData.cookieMonsterFramework === 'undefined') {\n load('{}');\n }\n window.cookieMonsterFrameworkData.isInitializing = false;\n}\n","/**\n * This function creates a white square over the full screen and appends it to l('wrapper')\n */\nexport default function createFlashScreen() {\n const WhiteScreen = document.createElement('div');\n WhiteScreen.id = 'CMFlashScreen';\n WhiteScreen.style.width = '100%';\n WhiteScreen.style.height = '100%';\n WhiteScreen.style.backgroundColor = 'white';\n WhiteScreen.style.display = 'none';\n WhiteScreen.style.zIndex = '9999999999';\n WhiteScreen.style.position = 'absolute';\n WhiteScreen.style.pointerEvents = \"none\";\n l('wrapper').appendChild(WhiteScreen);\n}\n","/**\n * This creates a save function to the CM object. Per Game code/comments:\n * \"use this to store persistent data associated with your mod\n * return 'a string to be saved';\"\n * @returns {string} The data to be saved\n */\nexport default function save() {\n return JSON.stringify(Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework);\n}\n","import SettingColours from './options/settingClasses/settingColours';\nimport SettingInputNumber from './options/settingClasses/settingInputNumber';\nimport SettingKeycode from './options/settingClasses/settingKeycode';\nimport SettingStandard from './options/settingClasses/settingStandard';\nimport SettingStandardWithFunc from './options/settingClasses/settingStandardWithFunc';\nimport SettingVolume from './options/settingClasses/settingVolume';\nimport cookieMonsterPrompt from './notifications/prompt';\nimport createFlash from './notifications/flash';\nimport createInfoListing from './menu/listings/createInfoListing';\nimport createModMenuSection from './menu/createModMenuSection';\nimport createNotification from './notifications/notification';\nimport createOptionsListing from './menu/listings/createOptionListing';\nimport createOptionsSubHeader from './menu/listings/createOptionsSubHeader';\nimport initModFramework from './init/initModFramework';\nimport loadMod from './savingAndLoading/loadMod';\nimport playCMSound from './notifications/sound';\nimport registerMod from './init/registerMod';\nimport saveFramework from './savingAndLoading/saveFramework';\n\nexport const initFunctions = {\n initModFramework,\n registerMod,\n};\nexport const menuFunctions = {\n listings: {\n createInfoListing,\n createOptionsListing,\n createOptionsSubHeader,\n },\n createModMenuSection,\n};\n\nexport const notificationsFunctions = {\n createFlash,\n createNotification,\n cookieMonsterPrompt,\n playCMSound,\n};\n\nexport const optionFunctions = {};\n\nexport const saveAndLoadingFunctions = {\n loadMod,\n saveFramework,\n};\n\nexport const settingClasses = {\n SettingColours,\n SettingInputNumber,\n SettingStandard,\n SettingStandardWithFunc,\n SettingKeycode,\n SettingVolume,\n};\n","import cookieMonsterFramework from '../frameworkDataObject/cookieMonsterFramework';\n\n/** Check if Cookie Monster Mod Framework has been loaded yet and if not, does so */\nexport default function initModFramework() {\n if (typeof cookieMonsterFrameworkData === 'undefined') {\n Game.registerMod('cookieMonsterFramework', cookieMonsterFramework);\n }\n}\n","/**\n * Adds the mod to the saveData object to store (favourite) settings and headers\n */\nexport default function registerMod(modName) {\n Game.mods.cookieMonsterFramework.saveData[modName] = {\n favouriteSettings: [],\n headers: {},\n settings: {},\n };\n}\n","/**\n * Returns a subsection for the mod to add listings/info to\n * @param {string} listingHTML The innerHTML of the listing\n * @returns {object} listingDiv Div of the subseciont\n */\nexport default function createInfoListing(listingHTML) {\n const listingDiv = document.createElement('div');\n listingDiv.className = 'listing';\n listingDiv.innerHTML = listingHTML;\n return listingDiv;\n}\n","import jscolor, * as JsColor from '@eastdesire/jscolor';\n\nimport cookieMonsterPrompt from '../../notifications/prompt';\nimport createFavouriteStar from './createOptionsFavouriteStar';\nimport createFlash from '../../notifications/flash';\nimport playCMSound from '../../notifications/sound';\nimport saveFramework from '../../savingAndLoading/saveFramework';\nimport toggleConfig from '../../options/toggleConfig';\nimport toggleConfigKeycode from '../../options/toggleConfigKeycode';\nimport toggleConfigVolume from '../../options/toggleConfigVolume';\n\n/**\n * This function creates an option listing div-object\n * @param \t{string}\t\tmodName\t The name of the option\n * @param \t{string}\t\tconfigName\t The name of the option\n * @param \t{object}\t\tsettingsData\t Object with data about the settings\n * @param \t{function}\tupdateColoursFunc\tFunction to be called to update colours\n * @param \t{function}\trefreshScaleFunc\tFunction to be called to refresh scale\n * @returns\t{object}\t\tdiv\t\t The option object\n */\nexport default function createOptionsListing(\n modName,\n configName,\n settingsData,\n updateColoursFunc,\n refreshScaleFunc,\n) {\n const div = document.createElement('div');\n div.className = 'listing';\n\n if (Game.mods.cookieMonsterFramework.saveData[modName].settings.FavouriteSettings === 1) {\n div.appendChild(\n createFavouriteStar(\n modName,\n configName,\n Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings,\n ),\n );\n }\n\n if (settingsData[configName].type === 'bool') {\n // Create toggle button\n const a = document.createElement('a');\n if (\n settingsData[configName].toggle &&\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] === 0\n ) {\n a.className = 'option off';\n } else {\n a.className = 'option';\n }\n a.id = `${modName}Options${configName}`;\n a.onclick = function () {\n toggleConfig(modName, configName, settingsData);\n Game.UpdateMenu();\n };\n a.textContent =\n settingsData[configName].label[\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName]\n ];\n div.appendChild(a);\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n div.appendChild(label);\n return div;\n }\n\n if (settingsData[configName].type === 'vol') {\n const volume = document.createElement('div');\n\n // Create slider\n volume.className = 'sliderBox';\n const title = document.createElement('div');\n title.style.float = 'left';\n title.innerHTML = settingsData[configName].desc;\n volume.appendChild(title);\n const percent = document.createElement('div');\n percent.id = `slider${modName}${configName}right`;\n percent.style.float = 'right';\n percent.innerHTML = `${Game.mods.cookieMonsterFramework.saveData[modName].settings[configName]}%`;\n volume.appendChild(percent);\n const slider = document.createElement('input');\n slider.className = 'slider';\n slider.id = `slider${modName}${configName}`;\n slider.style.clear = 'both';\n slider.type = 'range';\n slider.min = '0';\n slider.max = '100';\n slider.step = '1';\n slider.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n slider.oninput = function () {\n toggleConfigVolume(modName, configName);\n Game.UpdateMenu();\n };\n slider.onchange = function () {\n toggleConfigVolume(modName, configName);\n Game.UpdateMenu();\n };\n volume.appendChild(slider);\n div.appendChild(volume);\n\n // Create test sound button\n const a = document.createElement('a');\n a.className = 'option';\n a.onclick = function () {\n playCMSound(\n modName,\n Game.mods.cookieMonsterFramework.saveData[modName].settings[\n configName.replace('Volume', 'SoundURL')\n ],\n configName.replace('Volume', 'Sound'),\n configName,\n true,\n );\n };\n a.textContent = 'Test sound';\n div.appendChild(a);\n return div;\n }\n\n if (settingsData[configName].type === 'url') {\n // Create label\n const span = document.createElement('span');\n span.className = 'option';\n span.textContent = `${settingsData[configName].label} `;\n span.style.lineHeight = '1.6';\n div.appendChild(span);\n\n // Create input\n const input = document.createElement('input');\n input.id = `${modName}Options${configName}`;\n input.className = 'option';\n input.type = 'text';\n input.readOnly = true;\n input.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n input.style.width = '300px';\n div.appendChild(input);\n div.appendChild(document.createTextNode(' '));\n\n // Create prompt\n const inputPrompt = document.createElement('input');\n inputPrompt.id = `${modName}Options${configName}Prompt`;\n inputPrompt.className = 'option';\n inputPrompt.type = 'text';\n inputPrompt.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n\n const a = document.createElement('a');\n a.className = 'option';\n a.onclick = function () {\n cookieMonsterPrompt(inputPrompt.outerHTML, [\n [\n 'Save',\n function () {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = l(\n `${modName}Options${configName}Prompt`,\n ).value;\n saveFramework();\n Game.ClosePrompt();\n Game.UpdateMenu();\n },\n ],\n [\n 'Cancel',\n function () {\n Game.ClosePrompt();\n },\n ],\n ]);\n };\n a.textContent = 'Edit';\n div.appendChild(a);\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n div.appendChild(label);\n return div;\n }\n\n if (settingsData[configName].type === 'colour') {\n const innerSpan = document.createElement('span');\n innerSpan.className = 'option';\n\n // Create input\n const input = document.createElement('input');\n input.id = configName;\n input.style.width = '65px';\n input.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n innerSpan.appendChild(input);\n const change = function () {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[this.targetElement.id] =\n this.toHEXString();\n updateColoursFunc();\n saveFramework();\n Game.UpdateMenu();\n };\n // eslint-disable-next-line no-new\n new JsColor(input, { hash: true, position: 'right', onInput: change });\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n innerSpan.appendChild(label);\n\n // Create test button for flash colour\n if (configName.includes('Flash')) {\n const a = document.createElement('a');\n a.className = 'option';\n a.onclick = function () {\n createFlash(modName, 3, configName.replace('Colour', ''), true);\n };\n a.textContent = 'Test flash';\n innerSpan.appendChild(a);\n }\n div.appendChild(innerSpan);\n jscolor.init();\n return div;\n }\n\n if (settingsData[configName].type === 'numscale') {\n const span = document.createElement('span');\n span.className = 'option';\n span.textContent = `${settingsData[configName].label} `;\n span.style.lineHeight = '1.6';\n div.appendChild(span);\n\n // Create input\n const input = document.createElement('input');\n input.id = `${modName}Options${configName}`;\n input.className = 'option';\n input.type = 'number';\n input.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n input.min = settingsData[configName].min;\n input.max = settingsData[configName].max;\n input.oninput = function () {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = this.value;\n saveFramework();\n refreshScaleFunc();\n Game.UpdateMenu();\n };\n div.appendChild(input);\n div.appendChild(document.createTextNode(' '));\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n div.appendChild(label);\n return div;\n }\n\n if (settingsData[configName].type === 'keycode') {\n // Create prompt\n const inputPrompt = document.createElement('input');\n inputPrompt.id = `${modName}Options${configName}Prompt`;\n inputPrompt.className = 'option';\n inputPrompt.type = 'text';\n inputPrompt.value =\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName].displayName;\n\n // Create toggle button\n const a = document.createElement('a');\n a.className = 'option';\n a.id = `${modName}Options${configName}`;\n a.onclick = function () {\n cookieMonsterPrompt(inputPrompt.outerHTML, []);\n l(`${modName}Options${configName}Prompt`).addEventListener('keyup', (e) => {\n toggleConfigKeycode(modName, configName, e);\n Game.ClosePrompt();\n Game.UpdateMenu();\n });\n };\n a.textContent =\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName].displayName;\n div.appendChild(a);\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n div.appendChild(label);\n return div;\n }\n return div;\n}\n","import saveFramework from '../../savingAndLoading/saveFramework';\nimport toggleFavouriteSetting from '../toggles/toggleFavourite';\n/**\n * This function creates the favourite setting star div-object\n * @param \t{string} modName\t The name of the Mod\n * @param \t{string} configName\tThe name of the option\n * @parm {array} favourites An array with the names of all settings that are currently favourited\n * @returns\t{object} div\t\t The option object\n */\nexport default function createFavouriteStar(modName, configName, favourites) {\n const FavStar = document.createElement('a');\n if (favourites.includes(configName)) {\n FavStar.innerText = '★';\n FavStar.style.color = 'yellow';\n } else FavStar.innerText = '☆';\n FavStar.className = 'option';\n FavStar.onclick = function () {\n toggleFavouriteSetting(modName, configName);\n saveFramework();\n Game.UpdateMenu();\n };\n FavStar.onmouseover = function () {\n Game.tooltip.draw(\n this,\n escape(\n '<div style=\"min-width: 250px; margin-bottom: 4px;\"><div style=\"text-align: left;\">Click to set this setting as favourite and show it in \\'favourite\\' settings at the top of the Cookie Monster Settings</div></div>',\n ),\n );\n };\n FavStar.onmouseout = function () {\n Game.tooltip.hide();\n };\n FavStar.appendChild(document.createTextNode(' '));\n return FavStar;\n}\n","import saveFramework from '../../savingAndLoading/saveFramework';\n\n/**\n * This function toggles favourite settings by adding them to an array in the savedata\n * It is called by the onclick event of the favourite stars\n * @param \t{string} modName\t The name of the mod\n * @param \t{string}\tconfigName\tThe name of the setting\n */\nexport default function toggleFavouriteSetting(modName, configName) {\n if (Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings.includes(configName))\n Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings =\n Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings.filter(\n (ele) => ele !== configName,\n );\n else Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings.push(configName);\n saveFramework();\n}\n","import saveFramework from '../savingAndLoading/saveFramework';\n\n/**\n * This function toggles options by incrementing them with 1 and handling changes\n * It is called by the onclick event of options of the \"bool\" type\n * @param \t{string}\tmodName\t The name of the option\n * @param \t{string}\tconfigName\t The name of the option\n * @param \t{object}\tsettingsData\tObject with data about the settings\n */\nexport default function toggleConfig(modName, configName, settingsData) {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] += 1;\n if (\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] ===\n settingsData[configName].label.length\n ) {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = 0;\n if (settingsData[configName].toggle)\n l(`${modName}Options${configName}`).className = 'option off';\n } else l(`${modName}Options${configName}`).className = 'option';\n\n if (typeof settingsData[configName].func !== 'undefined') {\n settingsData[configName].func();\n }\n\n saveFramework();\n}\n","import saveFramework from '../savingAndLoading/saveFramework';\n\n/**\n * This function toggles options by deconstructing the KeyboardEvent\n * It is called by the onclick event of prompts of the \"keycode\" type\n * @param \t{string}\tmodName\t The name of the option\n * @param \t{string}\tconfigName\t The name of the option\n * @param {object} event The KeyboardEvent\n */\nexport default function toggleConfigKeycode(modName, configName, event) {\n const saveObject = {\n key: event.key,\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n shiftKey: event.shiftKey,\n displayName: `${event.shiftKey ? `Shift + ` : ''}${event.altKey ? `Alt + ` : ''}${\n event.ctrlKey ? `Ctrl + ` : ''\n }${event.key}`,\n };\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = saveObject;\n saveFramework();\n}\n","import toggleHeader from '../toggles/toggleHeader';\n\n/**\n * This function creates a header-object for the options page\n * @param \t{string}\t\tmodName\t The name of the mod\n * @param \t{string}\t\tconfigName\tThe name of the Config-group\n * @param \t{string}\t\ttext\t The to-be displayed name of the header\n * @returns\t{object}\t\tdiv\t\t The header object\n */\nexport default function createOptionsSubHeader(modName, configName, text) {\n const div = document.createElement('div');\n div.className = 'title';\n\n div.style.opacity = '0.7';\n div.style.fontSize = '17px';\n div.appendChild(document.createTextNode(`${text} `));\n\n // Creates the +/- button\n const span = document.createElement('span');\n span.style.cursor = 'pointer';\n span.style.display = 'inline-block';\n span.style.height = '14px';\n span.style.width = '14px';\n span.style.borderRadius = '7px';\n span.style.textAlign = 'center';\n span.style.backgroundColor = '#C0C0C0';\n span.style.color = 'black';\n span.style.fontSize = '13px';\n span.style.verticalAlign = 'middle';\n span.textContent = Game.mods.cookieMonsterFramework.saveData[modName].headers[configName]\n ? '-'\n : '+';\n span.onclick = function () {\n toggleHeader(modName, configName);\n Game.UpdateMenu();\n };\n div.appendChild(span);\n return div;\n}\n","import toggleHeader from './toggles/toggleHeader';\n\n/**\n * Returns a subsection for the mod to add listings/info to\n * @param {string} modName The name of the mod (i.e., CookieMonster)\n * @param {string} modDisplayName Display name of the mod (i.e., Cookie Monster)\n * @param {string} menuName Name of the menu (i.e., Info, Options)\n * @returns {object} modSectionDiv Div of the subseciont\n */\nexport default function createModMenuSection(modName, modDisplayName, menuName) {\n const modSectionDiv = document.createElement('div');\n modSectionDiv.className = 'subsection';\n modSectionDiv.id = `${modName}MenuSection`;\n\n const titleDiv = document.createElement('div');\n titleDiv.className = 'title';\n titleDiv.style.fontSize = '18px';\n titleDiv.innerHTML = modDisplayName;\n\n const buttonSpan = document.createElement('span'); // Creates the +/- button\n buttonSpan.style.cursor = 'pointer';\n buttonSpan.style.display = 'inline-block';\n buttonSpan.style.height = '14px';\n buttonSpan.style.width = '14px';\n buttonSpan.style.borderRadius = '7px';\n buttonSpan.style.textAlign = 'center';\n buttonSpan.style.backgroundColor = '#C0C0C0';\n buttonSpan.style.color = 'black';\n buttonSpan.style.fontSize = '13px';\n buttonSpan.style.verticalAlign = 'middle';\n buttonSpan.textContent = Game.mods.cookieMonsterFramework.saveData[modName].headers[menuName]\n ? '-'\n : '+';\n buttonSpan.onclick = function () {\n toggleHeader(modName, menuName);\n Game.UpdateMenu();\n };\n\n titleDiv.appendChild(buttonSpan);\n\n modSectionDiv.appendChild(titleDiv);\n\n return modSectionDiv;\n}\n","/**\n * This function creates a notifcation depending on config\n * @param\t{string}\tmodName\t The name of the mod\n * @param\t{string}\tconfigName\tThe setting in CM.Options that is checked before creating the notification\n * @param\t{string}\ttitle\t\t\t The title of the to-be created notifications\n * @param\t{string}\tmessage\t\t\tThe text of the to-be created notifications\n */\nexport default function createNotification(modName, configName, title, message) {\n if (\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] === 1 &&\n document.visibilityState === 'hidden' &&\n window.cookieMonsterFrameworkData.isInitializing === false\n ) {\n // eslint-disable-next-line no-new\n new Notification(title, {\n body: message,\n badge: 'https://orteil.dashnet.org/cookieclicker/favicon.ico',\n });\n }\n}\n","import Setting from './baseSetting';\n\n/** The colour picker setting class */\nexport default class SettingColours extends Setting {\n constructor(defaultValue, type, group, desc) {\n super(defaultValue, type, group);\n this.desc = desc;\n }\n}\n","import Setting from './baseSetting';\n\n/** The number input setting class */\nexport default class SettingInputNumber extends Setting {\n constructor(defaultValue, type, group, label, desc, min, max) {\n super(defaultValue, type, group);\n this.label = label;\n this.desc = desc;\n this.min = min;\n this.max = max;\n }\n}\n","import Setting from './baseSetting';\n\n/** The standard toggle setting class */\nexport default class SettingStandard extends Setting {\n constructor(defaultValue, type, group, label, desc, toggle) {\n super(defaultValue, type, group);\n this.label = label;\n this.desc = desc;\n this.toggle = toggle;\n }\n}\n","import Setting from './baseSetting';\n\n/** The standard toggle setting class with functions */\nexport default class SettingStandardWithFunc extends Setting {\n constructor(defaultValue, type, group, label, desc, toggle, func) {\n super(defaultValue, type, group);\n this.label = label;\n this.desc = desc;\n this.toggle = toggle;\n if (func !== undefined) {\n this.func = func;\n }\n }\n}\n","import Setting from './baseSetting';\n\n/** The volume level setting class */\nexport default class SettingVolume extends Setting {\n constructor(defaultValue, type, group, label, desc) {\n super(defaultValue, type, group);\n this.label = label;\n this.desc = desc;\n for (let i = 0; i < 101; i++) {\n this.label[i] = `${i}%`;\n }\n }\n}\n","/**\r\n * This function updates the display setting of the two objects created by CM.Disp.CreateWrinklerButtons()\r\n * It is called by changes in CM.Options.WrinklerButtons\r\n */\r\nexport default function ToggleWrinklerButtons() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerButtons &&\r\n Game.elderWrath\r\n ) {\r\n l('PopAllNormalWrinklerButton').style.display = '';\r\n l('PopFattestWrinklerButton').style.display = '';\r\n } else {\r\n l('PopAllNormalWrinklerButton').style.display = 'none';\r\n l('PopFattestWrinklerButton').style.display = 'none';\r\n }\r\n}\r\n","/* eslint-disable prefer-const */\r\n\r\nexport let CacheDragonAura = 0;\r\nexport let CacheDragonAura2 = 0;\r\nexport let CacheLastDragonLevel = 0;\r\nexport let CacheCostDragonUpgrade = 0;\r\nexport let CacheLucky = 0;\r\nexport let CacheLuckyReward = 0;\r\nexport let CacheLuckyWrathReward = 0;\r\nexport let CacheLuckyFrenzy = 0;\r\nexport let CacheLuckyRewardFrenzy = 0;\r\nexport let CacheLuckyWrathRewardFrenzy = 0;\r\nexport let CacheConjure = 0;\r\nexport let CacheConjureReward = 0;\r\nexport let CacheEdifice = 0;\r\nexport let CacheEdificeBuilding = 0;\r\nexport let CacheNoGoldSwitchCookiesPS = 0;\r\nexport let CacheDragonsFortuneMultAdjustment = 1;\r\nexport let CacheGoldenCookiesMult = 1;\r\nexport let CacheWrathCookiesMult = 1;\r\n\r\nexport let CacheHCPerSecond = 0;\r\n\r\nexport let CacheCentEgg = 0;\r\nexport let CacheSeaSpec = 0;\r\nexport let CacheLastChoEgg = 0;\r\n\r\nexport let CacheObjects1 = {};\r\nexport let CacheObjects10 = {};\r\nexport let CacheObjects100 = {};\r\nexport let CacheObjectsNextAchievement = {};\r\n\r\nexport let CacheWrinklersTotal = 0;\r\nexport let CacheWrinklersNormal = 0;\r\nexport let CacheWrinklersFattest = [0, null];\r\n\r\nexport let CacheCurrWrinklerCPSMult = 0;\r\nexport let CacheCurrWrinklerCount = 0;\r\n\r\nexport let CacheUpgrades = {};\r\n\r\nexport let CacheAverageClicks = {};\r\nexport let CacheAverageCookiesFromClicks;\r\n\r\nexport let CacheMissingUpgrades = {};\r\nexport let CacheMissingUpgradesPrestige = {};\r\nexport let CacheMissingUpgradesCookies = {};\r\n\r\nexport let CacheChainRequired = 0;\r\nexport let CacheChainRequiredNext = 0;\r\nexport let CacheChainMaxReward = [];\r\nexport let CacheChainWrathRequired = 0;\r\nexport let CacheChainWrathRequiredNext = 0;\r\nexport let CacheChainWrathMaxReward = [];\r\nexport let CacheChainFrenzyRequired = 0;\r\nexport let CacheChainFrenzyRequiredNext = 0;\r\nexport let CacheChainFrenzyMaxReward = [];\r\nexport let CacheChainFrenzyWrathRequired = 0;\r\nexport let CacheChainFrenzyWrathRequiredNext = 0;\r\nexport let CacheChainFrenzyWrathMaxReward = [];\r\n\r\nexport let CacheRealCookiesEarned = 0;\r\nexport let CacheAvgCPSWithChoEgg = 0;\r\n\r\nexport let CacheSpawnedGoldenShimmer = {};\r\nexport let CacheSeasonPopShimmer = {};\r\n\r\nexport let CacheTimeTillNextPrestige = 0;\r\n\r\n/** Stores lowest PP value */\r\nexport let CacheMinPP = 0;\r\n/** Stores lowest PP value category */\r\nexport let CacheMinPPBulk = 0;\r\n/** Stores all PP values of all buildings for all buy settings (1, 10, 100) */\r\nexport let CachePPArray = [];\r\n\r\nexport let CacheGoldenShimmersByID = {};\r\n\r\nexport let CacheSellForChoEgg = 0;\r\n\r\nexport let CookiesDiff;\r\nexport let WrinkDiff;\r\nexport let WrinkFattestDiff;\r\nexport let ChoEggDiff;\r\nexport let ClicksDiff;\r\nexport let HeavenlyChipsDiff;\r\n\r\nexport let CacheLastCPSCheck;\r\nexport let CacheLastCookies;\r\nexport let CacheLastWrinkCookies;\r\nexport let CacheLastWrinkFattestCookies;\r\nexport let CacheLastClicks;\r\n\r\nexport let CacheAverageGainBank;\r\nexport let CacheAverageGainWrink;\r\nexport let CacheAverageGainWrinkFattest;\r\nexport let CacheAverageGainChoEgg;\r\nexport let CacheAverageCPS;\r\n\r\nexport let CacheLastHeavenlyCheck;\r\nexport let CacheLastHeavenlyChips;\r\n\r\nexport let CacheDoRemakeBuildPrices;\r\n\r\nexport let CacheHadBuildAura;\r\n\r\n/** Store the CPS effect of each god if it was put into each slot */\r\nexport let CacheGods = {\r\n 0: [0, 0, 0],\r\n 1: [0, 0, 0],\r\n 2: [0, 0, 0],\r\n 3: [0, 0, 0],\r\n 4: [0, 0, 0],\r\n 5: [0, 0, 0],\r\n 6: [0, 0, 0],\r\n 7: [0, 0, 0],\r\n 8: [0, 0, 0],\r\n 9: [0, 0, 0],\r\n 10: [0, 0, 0],\r\n};\r\n","/** All variables used by simulation functions */\r\n\r\nexport let SimObjects = []; // eslint-disable-line prefer-const\r\nexport let SimUpgrades = []; // eslint-disable-line prefer-const\r\nexport let SimAchievements = []; // eslint-disable-line prefer-const\r\nexport let SimBuildingsOwned;\r\nexport let SimUpgradesOwned;\r\nexport let SimPledges;\r\nexport let SimAchievementsOwned;\r\nexport let SimHeavenlyPower;\r\nexport let SimPrestige;\r\nexport let SimDragonAura;\r\nexport let SimDragonAura2;\r\nexport let SimGod1;\r\nexport let SimGod2;\r\nexport let SimGod3;\r\nexport let SimDoSims;\r\nexport let SimEffs;\r\nexport let SimCookiesPs;\r\nexport let SimCookiesPsRaw;\r\n","import { SimDragonAura, SimDragonAura2 } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.auraMult but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimAuraMult(what) {\r\n let n = 0;\r\n if (\r\n Game.dragonAuras[SimDragonAura].name === what ||\r\n Game.dragonAuras[SimDragonAura2].name === what\r\n )\r\n n = 1;\r\n if (\r\n Game.dragonAuras[SimDragonAura].name === 'Reality Bending' ||\r\n (Game.dragonAuras[SimDragonAura2].name === 'Reality Bending' &&\r\n Game.dragonLevel >= Game.dragonAurasBN[what].id + 4)\r\n )\r\n n += 0.1;\r\n return n;\r\n}\r\n","import SimAuraMult from './SimAuraMult';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.getSellMultiplier but checks Sim Data instead of Game Data\r\n * @returns {number}\tgiveBack\tThe multiplier\r\n */\r\nexport default function SimGetSellMultiplier() {\r\n let giveBack = 0.25;\r\n giveBack *= 1 + SimAuraMult('Earth Shatterer');\r\n return giveBack;\r\n}\r\n","import { SimEffs } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.Eff but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimEff(name, def) {\r\n if (typeof SimEffs[name] === 'undefined') {\r\n return typeof def === 'undefined' ? 1 : def;\r\n }\r\n return SimEffs[name];\r\n}\r\n","import { SimUpgrades } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.Has but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimHas(what) {\r\n const it = SimUpgrades[what];\r\n if (it && Game.ascensionMode === 1 && (it.pool === 'prestige' || it.tier === 'fortune')) return 0;\r\n return it ? it.bought : 0;\r\n}\r\n","import { SimDragonAura, SimDragonAura2 } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.hasAura but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimHasAura(what) {\r\n if (\r\n Game.dragonAuras[SimDragonAura].name === what ||\r\n Game.dragonAuras[SimDragonAura2].name === what\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n","import { SimGod1, SimGod2, SimGod3, SimObjects } from '../VariablesAndData';\r\nimport SimHasAura from './SimHasAura';\r\n\r\n/**\r\n * This function checks for the current God level in the sim data\r\n * It functions similarly to Game.hasGod()\r\n * @param\t{string}\twhat\tName of the achievement\r\n */\r\nexport default function SimHasGod(what) {\r\n if (Game.hasGod) {\r\n if (SimObjects.Temple.minigame === undefined) {\r\n SimObjects.Temple.minigame = Game.Objects.Temple.minigame;\r\n }\r\n const god = SimObjects.Temple.minigame.gods[what];\r\n if (SimGod1 === god.id) {\r\n return 1;\r\n }\r\n if (SimGod2 === god.id) {\r\n if (SimHasAura('Supreme Intellect')) {\r\n return 1;\r\n }\r\n return 2;\r\n }\r\n if (SimGod3 === god.id) {\r\n if (SimHasAura('Supreme Intellect')) {\r\n return 2;\r\n }\r\n return 3;\r\n }\r\n }\r\n return false;\r\n}\r\n","import { SimObjects } from '../VariablesAndData';\r\nimport SimAuraMult from './SimAuraMult';\r\nimport SimEff from './SimEff';\r\nimport SimHas from './SimHas';\r\nimport SimHasGod from './SimHasGod';\r\n\r\n/**\r\n * This function calculates the sell price of a building based on current \"sim data\"\r\n * @param\t{string}\tbuilding\tName of the building\r\n * @param\t{number}\tprice\t\tCurrent price of building\r\n * @returns {number}\tModifiedPrice\t\tThe modified building price\r\n */\r\nexport default function SimModifyBuildingPrice(building, price) {\r\n let ModifiedPrice = price;\r\n if (SimHas('Season savings')) ModifiedPrice *= 0.99;\r\n if (SimHas(\"Santa's dominion\")) ModifiedPrice *= 0.99;\r\n if (SimHas('Faberge egg')) ModifiedPrice *= 0.99;\r\n if (SimHas('Divine discount')) ModifiedPrice *= 0.99;\r\n if (SimHas('Fortune #100')) ModifiedPrice *= 0.99;\r\n // if (SimHasAura('Fierce Hoarder')) ModifiedPrice *= 0.98;\r\n ModifiedPrice *= 1 - SimAuraMult('Fierce Hoarder') * 0.02;\r\n if (Game.hasBuff('Everything must go')) ModifiedPrice *= 0.95;\r\n if (Game.hasBuff('Crafty pixies')) ModifiedPrice *= 0.98;\r\n if (Game.hasBuff('Nasty goblins')) ModifiedPrice *= 1.02;\r\n if (building.fortune && SimHas(building.fortune.name)) ModifiedPrice *= 0.93;\r\n ModifiedPrice *= SimEff('buildingCost');\r\n if (SimObjects.Temple.minigameLoaded) {\r\n const godLvl = SimHasGod('creation');\r\n if (godLvl === 1) ModifiedPrice *= 0.93;\r\n else if (godLvl === 2) ModifiedPrice *= 0.95;\r\n else if (godLvl === 3) ModifiedPrice *= 0.98;\r\n }\r\n return ModifiedPrice;\r\n}\r\n","import SimGetSellMultiplier from '../ReplacedGameFunctions/SimGetSellMultiplier';\r\nimport SimModifyBuildingPrice from '../ReplacedGameFunctions/SimModifyBuidlingPrice';\r\n\r\n/**\r\n * This function calculates the cookies returned for selling a building\r\n * Base Game does not do this correctly\r\n * @param\t{string}\tbuild\t\tName of the building\r\n * @param\t{number}\tbasePrice\tBase Price of building\r\n * @param\t{number}\tstart\t\tStarting amount of building\r\n * @param\t{number}\tfree\t\tFree amount of building\r\n * @param\t{number}\tincrease\tIncrease of building\r\n * @param\t{number}\tnoSim\t\t1 of 0 depending on if function is called from CM.Sim\r\n * @returns {number}\tmoni\t\tTotal price gained\r\n */\r\nexport default function BuildingSell(build, basePrice, start, free, amount, noSim) {\r\n // Calculate money gains from selling buildings\r\n // If noSim is set, use Game methods to compute price instead of Sim ones.\r\n const noSimRes = typeof noSim === 'undefined' ? 0 : noSim;\r\n let toChange = amount;\r\n let startingAmount = start;\r\n let moni = 0;\r\n if (amount === -1) toChange = startingAmount;\r\n if (!amount) toChange = Game.buyBulk;\r\n for (let i = 0; i < toChange; i++) {\r\n let price = basePrice * Game.priceIncrease ** Math.max(0, startingAmount - free);\r\n price = noSimRes\r\n ? Game.modifyBuildingPrice(build, price)\r\n : SimModifyBuildingPrice(build, price);\r\n price = Math.ceil(price);\r\n const giveBack = noSimRes ? build.getSellMultiplier() : SimGetSellMultiplier();\r\n price = Math.floor(price * giveBack);\r\n if (startingAmount > 0) {\r\n moni += price;\r\n startingAmount -= 1;\r\n }\r\n }\r\n return moni;\r\n}\r\n","/** Data related directly to the scales used by Cookie Monster */\r\n\r\n/** Array of abbreviations used in the \"Metric\" scale */\r\nexport const metric = ['', '', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'];\r\n\r\n/** Array of abbreviations used in the \"Short\" scale */\r\nexport const shortScale = [\r\n '',\r\n '',\r\n 'M',\r\n 'B',\r\n 'Tr',\r\n 'Quadr',\r\n 'Quint',\r\n 'Sext',\r\n 'Sept',\r\n 'Oct',\r\n 'Non',\r\n 'Dec',\r\n 'Undec',\r\n 'Duodec',\r\n 'Tredec',\r\n 'Quattuordec',\r\n 'Quindec',\r\n 'Sexdec',\r\n 'Septendec',\r\n 'Octodec',\r\n 'Novemdec',\r\n 'Vigint',\r\n 'Unvigint',\r\n 'Duovigint',\r\n 'Trevigint',\r\n 'Quattuorvigint',\r\n];\r\n\r\n/** Array of abbreviations used in the \"Abbreviated Short\" scale */\r\nexport const shortScaleAbbreviated = [\r\n '',\r\n 'K',\r\n 'M',\r\n 'B',\r\n 'T',\r\n 'Qa',\r\n 'Qi',\r\n 'Sx',\r\n 'Sp',\r\n 'Oc',\r\n 'No',\r\n 'De',\r\n 'UDe',\r\n 'DDe',\r\n 'TDe',\r\n 'QaDe',\r\n 'QiDe',\r\n 'SxDe',\r\n 'SpDe',\r\n 'ODe',\r\n 'NDe',\r\n 'Vi',\r\n 'UVi',\r\n 'DVi',\r\n 'TVi',\r\n 'QaVi',\r\n 'QiVi',\r\n 'SxVi',\r\n 'SpVi',\r\n 'OVi',\r\n 'NVi',\r\n 'Tr',\r\n 'UTr',\r\n 'DTr',\r\n 'TTr',\r\n 'QaTr',\r\n 'QiTr',\r\n 'SxTr',\r\n 'SpTr',\r\n 'OTr',\r\n 'NTr',\r\n 'Qaa',\r\n 'UQa',\r\n 'DQa',\r\n 'TQa',\r\n 'QaQa',\r\n 'QiQa',\r\n 'SxQa',\r\n 'SpQa',\r\n 'OQa',\r\n 'NQa',\r\n 'Qia',\r\n 'UQi',\r\n 'DQi',\r\n 'TQi',\r\n 'QaQi',\r\n 'QiQi',\r\n 'SxQi',\r\n 'SpQi',\r\n 'OQi',\r\n 'NQi',\r\n 'Sxa',\r\n 'USx',\r\n 'DSx',\r\n 'TSx',\r\n 'QaSx',\r\n 'QiSx',\r\n 'SxSx',\r\n 'SpSx',\r\n 'OSx',\r\n 'NSx',\r\n 'Spa',\r\n 'USp',\r\n 'DSp',\r\n 'TSp',\r\n 'QaSp',\r\n 'QiSp',\r\n 'SxSp',\r\n 'SpSp',\r\n 'OSp',\r\n 'NSp',\r\n 'Oco',\r\n 'UOc',\r\n 'DOc',\r\n 'TOc',\r\n 'QaOc',\r\n 'QiOc',\r\n 'SxOc',\r\n 'SpOc',\r\n 'OOc',\r\n 'NOc',\r\n 'Noa',\r\n 'UNo',\r\n 'DNo',\r\n 'TNo',\r\n 'QaNo',\r\n 'QiNo',\r\n 'SxNo',\r\n 'SpNo',\r\n 'ONo',\r\n 'NNo',\r\n 'Ct',\r\n 'UCt',\r\n];\r\n","export let LastModCount;\r\nexport let TooltipBuildBackup = []; // eslint-disable-line prefer-const\r\nexport let TooltipLumpBackup;\r\nexport let TooltipGrimoireBackup = []; // eslint-disable-line prefer-const\r\nexport let TooltipUpgradeBackup = []; // eslint-disable-line prefer-const\r\nexport let BackupGrimoireLaunch;\r\nexport let BackupGrimoireLaunchMod;\r\nexport let BackupGrimoireDraw;\r\nexport let HasReplaceNativeGrimoireLaunch;\r\nexport let HasReplaceNativeGrimoireDraw;\r\nexport let LoadMinigames;\r\nexport let BackupFunctions = {}; // eslint-disable-line prefer-const\r\n\r\nexport let LastSeasonPopupState;\r\nexport let LastTickerFortuneState;\r\nexport let LastGardenNextStep;\r\nexport let LastGoldenCookieState;\r\nexport let LastSpawnedGoldenCookieState;\r\nexport let LastMagicBarFull;\r\nexport let CurrSpawnedGoldenCookieState;\r\nexport let LastWrinklerCount;\r\n\r\n/** Stores the date at Game.CalculateGains for God Cyclius\r\n */\r\nexport let CycliusDateAtBeginLoop = Date.now(); // eslint-disable-line prefer-const\r\n\r\n/** Stores the date at Game.CalculateGains for the Century egg\r\n */\r\nexport let CenturyDateAtBeginLoop = Date.now(); // eslint-disable-line prefer-const\r\n","/**\r\n * Section: Variables used in Disp functions */\r\n\r\nexport let DispCSS;\r\n\r\n/**\r\n * These are variables used to create DOM object names and id (e.g., 'CMTextTooltip)\r\n */\r\nexport const ColourTextPre = 'CMText';\r\nexport const ColourBackPre = 'CMBack';\r\nexport const ColourBorderPre = 'CMBorder';\r\n\r\n/**\r\n * These are variables which can be set in the options by the user to standardize colours throughout CookieMonster\r\n */\r\nexport const ColourBlue = 'Blue';\r\nexport const ColourGreen = 'Green';\r\nexport const ColourYellow = 'Yellow';\r\nexport const ColourOrange = 'Orange';\r\nexport const ColourRed = 'Red';\r\nexport const ColourPurple = 'Purple';\r\nexport const ColourGray = 'Gray';\r\nexport const ColourPink = 'Pink';\r\nexport const ColourBrown = 'Brown';\r\nexport const ColoursOrdering = [\r\n ColourBlue,\r\n ColourGreen,\r\n ColourYellow,\r\n ColourOrange,\r\n ColourRed,\r\n ColourPurple,\r\n ColourPink,\r\n ColourBrown,\r\n ColourGray,\r\n];\r\n\r\n/**\r\n * This list is used to make some very basic tooltips.\r\n * It is used by CM.Main.DelayInit() in the call of CM.Disp.CreateSimpleTooltip()\r\n * @item\t{string}\tplaceholder\r\n * @item\t{string}\ttext\r\n * @item\t{string}\tminWidth\r\n */\r\nexport const TooltipText = [\r\n ['GoldCookTooltipPlaceholder', 'Calculated with Golden Switch off', '200px'],\r\n [\r\n 'GoldCookDragonsFortuneTooltipPlaceholder',\r\n 'Calculated with Golden Switch off and at least one golden cookie on-screen',\r\n '240px',\r\n ],\r\n [\r\n 'PrestMaxTooltipPlaceholder',\r\n 'The MAX prestige is calculated with the cookies gained from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and buying Chocolate egg',\r\n '320px',\r\n ],\r\n [\r\n 'NextPrestTooltipPlaceholder',\r\n 'Calculated with cookies gained from wrinklers and Chocolate egg',\r\n '200px',\r\n ],\r\n [\r\n 'HeavenChipMaxTooltipPlaceholder',\r\n 'The MAX heavenly chips is calculated with the cookies gained from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and buying Chocolate egg',\r\n '330px',\r\n ],\r\n [\r\n 'ResetTooltipPlaceholder',\r\n 'The bonus income you would get from new prestige levels unlocked at 100% of its potential and from ascension achievements if you have the same buildings/upgrades after reset',\r\n '370px',\r\n ],\r\n [\r\n 'ChoEggTooltipPlaceholder',\r\n 'The amount of cookies you would get from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and then buying Chocolate egg',\r\n '300px',\r\n ],\r\n ['ChainNextLevelPlaceholder', 'Cheated cookies might break this formula', '250px'],\r\n [\r\n 'FavouriteSettingPlaceholder',\r\n \"Click to set this setting as favourite and show it in 'favourite' settings at the top of the Cookie Monster Settings\",\r\n '250px',\r\n ],\r\n];\r\nexport const SimpleTooltipElements = {};\r\n\r\n/**\r\n * These are variables used by the functions that create tooltips for wrinklers\r\n * See CM.Disp.CheckWrinklerTooltip(), CM.Disp.UpdateWrinklerTooltip() and CM.Main.AddWrinklerAreaDetect()\r\n */\r\nexport let TooltipWrinklerArea = 0; // eslint-disable-line prefer-const\r\nexport let TooltipWrinkler = -1; // eslint-disable-line prefer-const\r\n\r\n/**\r\n * This array is used to store whether a Wrinkler tooltip is being shown or not\r\n * [i] = 1 means tooltip is being shown, [i] = 0 means hidden\r\n * It is used by CM.Disp.CheckWrinklerTooltip() and CM.Main.AddWrinklerAreaDetect()\r\n */\r\nexport let TooltipWrinklerBeingShown = []; // eslint-disable-line prefer-const\r\n\r\nexport let CMLastAscendState;\r\nexport let CMSayTime = function () {}; // eslint-disable-line prefer-const\r\n\r\n/**\r\n * These are variables used to create various displays when the game is loaded on the \"sell all\" screen\r\n */\r\nexport let LastTargetBotBar = 1; // eslint-disable-line prefer-const\r\nexport let LastTargetBuildings = 1; // eslint-disable-line prefer-const\r\nexport let LastTargetTooltipBuilding = 1; // eslint-disable-line prefer-const\r\n\r\n/**\r\n * These arrays are used in the stats page to show\r\n * average cookies per {CM.Disp.cookieTimes/CM.Disp.clickTimes} seconds\r\n */\r\nexport const CookieTimes = [10, 15, 30, 60, 300, 600, 900, 1800];\r\nexport const ClickTimes = [1, 5, 10, 15, 30];\r\n\r\n/**\r\n * This array is used to give certain timers specific colours\r\n */\r\nexport const BuffColours = {\r\n Frenzy: ColourYellow,\r\n 'Dragon Harvest': ColourBrown,\r\n 'Elder frenzy': ColourGreen,\r\n Clot: ColourRed,\r\n 'Click frenzy': ColourBlue,\r\n Dragonflight: ColourPink,\r\n};\r\n\r\n/**\r\n * This array is used to track GC timers\r\n */\r\nexport let GCTimers = {}; // eslint-disable-line prefer-const\r\n\r\n/**\r\n * Used to store the number of cookies to be displayed in the tab-title\r\n */\r\nexport let Title = ''; // eslint-disable-line prefer-const\r\n\r\nexport let TooltipPrice;\r\nexport let TooltipBonusIncome;\r\nexport let TooltipType;\r\nexport let TooltipName;\r\nexport let TooltipBonusMouse;\r\n\r\nexport let LastAscendState;\r\nexport let LastNumberOfTimers;\r\n\r\n/**\r\n * This stores the names of settings shown in the favourites section\r\n */\r\nexport let FavouriteSettings = []; // eslint-disable-line prefer-const\r\n","/** General functions to format or beautify strings */\r\n\r\nimport { metric, shortScale, shortScaleAbbreviated } from '../../Data/Scales';\r\nimport { BackupFunctions } from '../../Main/VariablesAndData';\r\n\r\n/**\r\n * This function returns formats number based on the Scale setting\r\n * @param\t{number}\tnum\t\tNumber to be beautified\r\n * @param \t{any}\t\tfloats \tUsed in some scenario's by CM.Backup.Beautify (Game's original function)\r\n * @param\t{number}\tforced\tUsed to force (type 3) in certains cases\r\n * @returns\t{string}\t\t\tFormatted number\r\n */\r\nexport default function Beautify(num, floats, forced) {\r\n const decimals =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleDecimals + 1;\r\n if (num === Infinity) {\r\n return 'Infinity';\r\n }\r\n if (typeof num === 'undefined') {\r\n return '0';\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 0) {\r\n return BackupFunctions.Beautify(num, floats);\r\n }\r\n if (Number.isFinite(num)) {\r\n if (num < 0) {\r\n return `-${Beautify(Math.abs(num))}`;\r\n }\r\n let answer = '';\r\n if (num === 0) {\r\n return num.toString();\r\n }\r\n if (\r\n num > 0.001 &&\r\n num < Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleCutoff\r\n ) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator)\r\n answer = num.toLocaleString('nl');\r\n else answer = num.toLocaleString('en');\r\n return answer;\r\n }\r\n if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 4 &&\r\n !forced) ||\r\n forced === 4\r\n ) {\r\n // Scientific notation, 123456789 => 1.235E+8\r\n answer = num.toExponential(decimals).toString().replace('e', 'E');\r\n } else {\r\n const exponential = num.toExponential().toString();\r\n const AmountOfTenPowerThree = Math.floor(exponential.slice(exponential.indexOf('e') + 1) / 3);\r\n answer = (num / Number(`1e${AmountOfTenPowerThree * 3}`)).toFixed(decimals);\r\n // answer is now \"xxx.xx\" (e.g., 123456789 would be 123.46)\r\n if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 1 &&\r\n !forced) ||\r\n forced === 1\r\n ) {\r\n // Metric scale, 123456789 => 123.457 M\r\n if (num >= 0.01 && num < Number(`1e${metric.length * 3}`)) {\r\n answer += ` ${metric[AmountOfTenPowerThree]}`;\r\n } else answer = Beautify(num, 0, 4); // If number is too large or little, revert to scientific notation\r\n } else if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 2 &&\r\n !forced) ||\r\n forced === 2\r\n ) {\r\n // Short scale, 123456789 => 123.457 M\r\n if (num >= 0.01 && num < Number(`1e${shortScale.length * 3}`)) {\r\n answer += ` ${shortScale[AmountOfTenPowerThree]}`;\r\n } else answer = Beautify(num, 0, 4); // If number is too large or little, revert to scientific notation\r\n } else if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 3 &&\r\n !forced) ||\r\n forced === 3\r\n ) {\r\n // Short scale, 123456789 => 123.457 M\r\n if (num >= 0.01 && num < Number(`1e${shortScaleAbbreviated.length * 3}`)) {\r\n answer += ` ${shortScaleAbbreviated[AmountOfTenPowerThree]}`;\r\n } else answer = Beautify(num, 0, 4); // If number is too large or little, revert to scientific notation\r\n } else if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 5 &&\r\n !forced) ||\r\n forced === 5\r\n ) {\r\n // Engineering notation, 123456789 => 123.457E+6\r\n answer += `E${AmountOfTenPowerThree * 3}`;\r\n }\r\n }\r\n if (answer === '') {\r\n // eslint-disable-next-line no-console\r\n console.log(`Could not beautify number with Cookie Monster Beautify: ${num}`);\r\n answer = BackupFunctions.Beautify(num, floats);\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator)\r\n answer = answer.replace('.', ',');\r\n return answer;\r\n }\r\n console.log(`Could not beautify number with Cookie Monster Beautify: ${num}`); // eslint-disable-line no-console\r\n return BackupFunctions.Beautify(num, floats);\r\n}\r\n","import {\r\n CacheMinPPBulk,\r\n CacheObjects1,\r\n CacheObjects10,\r\n CacheObjects100,\r\n CacheObjectsNextAchievement,\r\n} from '../../Cache/VariablesAndData';\r\nimport BuildingSell from '../../Sim/SimulationEvents/SellBuilding';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\nimport { ColoursOrdering, LastTargetBuildings } from '../VariablesAndData';\r\n\r\n/**\r\n * Section: Functions related to right column of the screen (buildings/upgrades)\r\n\r\n/**\r\n * This function adjusts some things in the column of buildings.\r\n * It colours them, helps display the correct sell-price and shuffles the order when CM.Options.SortBuildings is set\r\n * The function is called by CM.Disp.Draw(), CM.Disp.UpdateColours() & CM.Disp.RefreshScale()\r\n * And by changes in CM.Options.BuildColour, CM.Options.SortBuild & CM.Data.Config.BulkBuildColour\r\n */\r\nexport default function UpdateBuildings() {\r\n let target = Game.buyBulk;\r\n if (Game.buyMode === 1) {\r\n LastTargetBuildings = target;\r\n } else {\r\n target = LastTargetBuildings;\r\n }\r\n if (target === 1) target = CacheObjects1;\r\n else if (target === 10) target = CacheObjects10;\r\n else if (target === 100) target = CacheObjects100;\r\n\r\n // Remove colour if applied\r\n l(`storeBulk1`).style.removeProperty('color');\r\n l(`storeBulk10`).style.removeProperty('color');\r\n l(`storeBulk100`).style.removeProperty('color');\r\n\r\n if (Game.buyMode === 1) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BuildColour === 1) {\r\n Object.keys(target).forEach((i) => {\r\n l(`productPrice${Game.Objects[i].id}`).style.color =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[\r\n `Colour${target[i].colour}`\r\n ];\r\n });\r\n l(`storeBulk${CacheMinPPBulk}`).style.color =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ColourGreen;\r\n } else {\r\n Object.keys(Game.Objects).forEach((i) => {\r\n l(`productPrice${Game.Objects[i].id}`).style.removeProperty('color');\r\n });\r\n }\r\n } else if (Game.buyMode === -1) {\r\n Object.keys(CacheObjects1).forEach((i) => {\r\n const o = Game.Objects[i];\r\n l(`productPrice${o.id}`).style.color = '';\r\n /*\r\n * Fix sell price displayed in the object in the store.\r\n *\r\n * The buildings sell price displayed by the game itself (without any mod) is incorrect.\r\n * The following line of code fixes this issue, and can be safely removed when the game gets fixed.\r\n *\r\n * This issue is extensively detailed here: https://github.com/Aktanusa/CookieMonster/issues/359#issuecomment-735658262\r\n */\r\n l(`productPrice${o.id}`).innerHTML = Beautify(\r\n BuildingSell(o, o.basePrice, o.amount, o.free, Game.buyBulk, 1),\r\n );\r\n });\r\n }\r\n\r\n // Build array of pointers and sort according to the user's configured sort option.\r\n // This regulates sorting of buildings.\r\n let arr;\r\n if (\r\n Game.buyMode !== 1 ||\r\n !Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings\r\n ) {\r\n arr = Object.keys(CacheObjects1).map((k) => {\r\n const o = {};\r\n o.name = k;\r\n o.id = Game.Objects[k].id;\r\n return o;\r\n });\r\n // Sort using default order.\r\n arr.sort((a, b) => a.id - b.id);\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings === 1\r\n ) {\r\n arr = Object.keys(CacheObjects1).map((k) => {\r\n const o = {};\r\n o.name = k;\r\n o.pp = CacheObjects1[k].pp;\r\n o.colour = CacheObjects1[k].colour;\r\n return o;\r\n });\r\n // Sort by pp colour group, then by pp.\r\n arr.sort((a, b) =>\r\n ColoursOrdering.indexOf(a.colour) === ColoursOrdering.indexOf(b.colour)\r\n ? a.pp - b.pp\r\n : ColoursOrdering.indexOf(a.colour) - ColoursOrdering.indexOf(b.colour),\r\n );\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings === 2\r\n ) {\r\n arr = Object.keys(target).map((k) => {\r\n const o = {};\r\n o.name = k;\r\n o.pp = target[k].pp;\r\n o.colour = target[k].colour;\r\n return o;\r\n });\r\n // Sort by pp colour group, then by pp.\r\n arr.sort((a, b) =>\r\n ColoursOrdering.indexOf(a.colour) === ColoursOrdering.indexOf(b.colour)\r\n ? a.pp - b.pp\r\n : ColoursOrdering.indexOf(a.colour) - ColoursOrdering.indexOf(b.colour),\r\n );\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings === 3\r\n ) {\r\n arr = Object.keys(CacheObjectsNextAchievement).map((k) => {\r\n const o = {};\r\n o.name = k;\r\n o.id = Game.Objects[k].id;\r\n o.amountUntilNext = CacheObjectsNextAchievement[k].AmountNeeded;\r\n o.priceUntilNext = CacheObjectsNextAchievement[k].price;\r\n return o;\r\n });\r\n // First, sort using default order.\r\n arr.sort((a, b) => a.id - b.id);\r\n // Sort by price until next achievement.\r\n // Buildings that aren't within 100 of an achievement are placed at the end, still in\r\n // default order relative to each other because sort() is guaranteed stable.\r\n arr.sort(\r\n (a, b) =>\r\n (a.amountUntilNext !== 101 ? a.priceUntilNext : Infinity) -\r\n (b.amountUntilNext !== 101 ? b.priceUntilNext : Infinity),\r\n );\r\n }\r\n\r\n // Use array index (+2) as the grid row number.\r\n // (grid rows are 1-based indexing, and row 1 is the bulk buy/sell options)\r\n for (let x = 0; x < arr.length; x++) {\r\n Game.Objects[arr[x].name].l.style.gridRow = `${x + 2}/${x + 2}`;\r\n }\r\n}\r\n","/**\r\n * This function toggles the upgrade to be always expanded\r\n * It is called by a change in CM.Options.ToolWarnPos\r\n * and upon creation of the warning tooltip by CM.Disp.UpdateTooltipWarnings()\r\n */\r\nexport default function UpdateUpgradeSectionsHeight() {\r\n Object.values(document.getElementsByClassName('storeSection')).forEach((section) => {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpgradesNeverCollapse ||\r\n section.id === 'products'\r\n ) {\r\n section.style.height = 'auto'; // eslint-disable-line no-param-reassign\r\n } else if (section.id === 'vaultUpgrades') {\r\n section.style.height = ''; // eslint-disable-line no-param-reassign\r\n section.style.minHeight = '0px'; // eslint-disable-line no-param-reassign\r\n } else if (section.id === 'upgrades') {\r\n section.style.height = ''; // eslint-disable-line no-param-reassign\r\n if (section.className.includes('hasMenu')) {\r\n section.style.minHeight = '82px'; // eslint-disable-line no-param-reassign\r\n } else {\r\n section.style.minHeight = '60px'; // eslint-disable-line no-param-reassign\r\n }\r\n } else {\r\n section.style.height = ''; // eslint-disable-line no-param-reassign\r\n section.style.minHeight = '60px'; // eslint-disable-line no-param-reassign\r\n }\r\n });\r\n}\r\n","import { CacheUpgrades } from '../../Cache/VariablesAndData';\r\nimport {\r\n ColourBackPre,\r\n ColourBlue,\r\n ColourGray,\r\n ColourGreen,\r\n ColourOrange,\r\n ColourPurple,\r\n ColourRed,\r\n ColoursOrdering,\r\n ColourYellow,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function adjusts some things in the upgrades section\r\n * It colours them and shuffles the order when CM.Options.SortBuildings is set\r\n * The function is called by CM.Disp.Draw(), CM.Disp.ToggleUpgradeBarAndColour & CM.Disp.RefreshScale()\r\n * And by changes in CM.Options.SortUpgrades\r\n */\r\nexport default function UpdateUpgrades() {\r\n // This counts the amount of upgrades for each pp group and updates the Upgrade Bar\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour > 0) {\r\n let blue = 0;\r\n let green = 0;\r\n let yellow = 0;\r\n let orange = 0;\r\n let red = 0;\r\n let purple = 0;\r\n let gray = 0;\r\n\r\n Object.keys(Game.UpgradesInStore).forEach((i) => {\r\n const me = Game.UpgradesInStore[i];\r\n let addedColour = false;\r\n for (let j = 0; j < l(`upgrade${i}`).childNodes.length; j += 1) {\r\n if (l(`upgrade${i}`).childNodes[j].className.indexOf(ColourBackPre) !== -1) {\r\n l(`upgrade${i}`).childNodes[j].className = ColourBackPre + CacheUpgrades[me.name].colour;\r\n addedColour = true;\r\n break;\r\n }\r\n }\r\n if (!addedColour) {\r\n const div = document.createElement('div');\r\n div.style.width = '10px';\r\n div.style.height = '10px';\r\n div.className = ColourBackPre + CacheUpgrades[me.name].colour;\r\n l(`upgrade${i}`).appendChild(div);\r\n }\r\n if (CacheUpgrades[me.name].colour === ColourBlue) blue += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourGreen) green += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourYellow) yellow += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourOrange) orange += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourRed) red += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourPurple) purple += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourGray) gray += 1;\r\n });\r\n\r\n l('CMUpgradeBarBlue').textContent = blue;\r\n l('CMUpgradeBarGreen').textContent = green;\r\n l('CMUpgradeBarYellow').textContent = yellow;\r\n l('CMUpgradeBarOrange').textContent = orange;\r\n l('CMUpgradeBarRed').textContent = red;\r\n l('CMUpgradeBarPurple').textContent = purple;\r\n l('CMUpgradeBarGray').textContent = gray;\r\n }\r\n\r\n const arr = [];\r\n // Build array of pointers, sort by pp, set flex positions\r\n // This regulates sorting of upgrades\r\n for (let x = 0; x < Game.UpgradesInStore.length; x += 1) {\r\n const o = {};\r\n o.name = Game.UpgradesInStore[x].name;\r\n o.price = Game.UpgradesInStore[x].basePrice;\r\n o.pp = CacheUpgrades[o.name].pp;\r\n o.colour = CacheUpgrades[o.name].colour;\r\n arr.push(o);\r\n }\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortUpgrades) {\r\n // Sort by pp colour group, then by pp.\r\n arr.sort((a, b) =>\r\n ColoursOrdering.indexOf(a.colour) === ColoursOrdering.indexOf(b.colour)\r\n ? a.pp - b.pp\r\n : ColoursOrdering.indexOf(a.colour) - ColoursOrdering.indexOf(b.colour),\r\n );\r\n } else {\r\n arr.sort((a, b) => a.price - b.price);\r\n }\r\n\r\n const nameChecker = function (arr2, upgrade) {\r\n return arr2.findIndex((e) => e.name === upgrade.name);\r\n };\r\n for (let x = 0; x < Game.UpgradesInStore.length; x += 1) {\r\n l(`upgrade${x}`).style.order = nameChecker(arr, Game.UpgradesInStore[x]) + 1;\r\n }\r\n}\r\n","/**\r\n * This function returns time as a string depending on TimeFormat setting\r\n * @param \t{number} \ttime\t\tTime to be formatted\r\n * @param \t{number}\tlongFormat \t1 or 0\r\n * @returns\t{string}\t\t\t\tFormatted time\r\n */\r\nexport default function FormatTime(time, longFormat) {\r\n /* eslint-disable no-nested-ternary */\r\n let formattedTime = time;\r\n if (time === Infinity) return time;\r\n if (time < 0) return 'Negative time period';\r\n formattedTime = Math.ceil(time);\r\n const y = Math.floor(formattedTime / 31536000);\r\n const d = Math.floor((formattedTime % 31536000) / 86400);\r\n const h = Math.floor(((formattedTime % 31536000) % 86400) / 3600);\r\n const m = Math.floor((((formattedTime % 31536000) % 86400) % 3600) / 60);\r\n const s = Math.floor((((formattedTime % 31536000) % 86400) % 3600) % 60);\r\n let str = '';\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat === 0) {\r\n if (formattedTime > 777600000) return longFormat ? 'Over 9000 days!' : '>9000d';\r\n str += y > 0 ? `${y + (longFormat ? (y === 1 ? ' year' : ' years') : 'y')}, ` : '';\r\n if (str.length > 0 || d > 0)\r\n str += `${d + (longFormat ? (d === 1 ? ' day' : ' days') : 'd')}, `;\r\n if (str.length > 0 || h > 0)\r\n str += `${h + (longFormat ? (h === 1 ? ' hour' : ' hours') : 'h')}, `;\r\n if (str.length > 0 || m > 0)\r\n str += `${m + (longFormat ? (m === 1 ? ' minute' : ' minutes') : 'm')}, `;\r\n str += s + (longFormat ? (s === 1 ? ' second' : ' seconds') : 's');\r\n } else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat === 1) {\r\n if (formattedTime > 3155760000) return 'XX:XX:XX:XX:XX';\r\n str += `${(y < 10 ? '0' : '') + y}:`;\r\n str += `${(d < 10 ? '0' : '') + d}:`;\r\n str += `${(h < 10 ? '0' : '') + h}:`;\r\n str += `${(m < 10 ? '0' : '') + m}:`;\r\n str += (s < 10 ? '0' : '') + s;\r\n } else {\r\n // Similar to TimeFormat === 0, but only two most significant components are included.\r\n if (formattedTime > 777600000) return longFormat ? 'Over 9000 days!' : '>9000d';\r\n if (y > 0) {\r\n str += `${y + (longFormat ? (y === 1 ? ' year' : ' years') : 'y')}, `;\r\n str += `${d + (longFormat ? (d === 1 ? ' day' : ' days') : 'd')}`;\r\n } else if (d > 0) {\r\n str += `${d + (longFormat ? (d === 1 ? ' day' : ' days') : 'd')}, `;\r\n str += `${h + (longFormat ? (h === 1 ? ' hour' : ' hours') : 'h')}`;\r\n } else if (h > 0) {\r\n str += `${h + (longFormat ? (h === 1 ? ' hour' : ' hours') : 'h')}, `;\r\n str += `${m + (longFormat ? (m === 1 ? ' minute' : ' minutes') : 'm')}`;\r\n } else if (m > 0) {\r\n str += `${m + (longFormat ? (m === 1 ? ' minute' : ' minutes') : 'm')}, `;\r\n str += s + (longFormat ? (s === 1 ? ' second' : ' seconds') : 's');\r\n } else {\r\n str += s + (longFormat ? (s === 1 ? ' second' : ' seconds') : 's');\r\n }\r\n }\r\n return str;\r\n}\r\n","import { ColourGreen, ColourOrange, ColourRed, ColourYellow } from '../VariablesAndData';\r\nimport FormatTime from './FormatTime';\r\n\r\n/**\r\n * This function returns the colour to be used for time-strings\r\n * @param\t{number}\t\t\ttime\t\t\tTime to be coloured\r\n * @returns {{string, string}}\t{text, colour}\tBoth the formatted time and colour as strings in an array\r\n */\r\nexport default function GetTimeColour(time) {\r\n let colour;\r\n let text;\r\n if (time <= 0) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat === 1)\r\n text = '00:00:00:00:00';\r\n else text = 'Done!';\r\n colour = ColourGreen;\r\n } else {\r\n text = FormatTime(time);\r\n if (time > 300) colour = ColourRed;\r\n else if (time > 60) colour = ColourOrange;\r\n else colour = ColourYellow;\r\n }\r\n return { text, colour };\r\n}\r\n","import {\r\n CacheAverageCPS,\r\n CacheCurrWrinklerCount,\r\n CacheCurrWrinklerCPSMult,\r\n CacheWrinklersFattest,\r\n} from '../../Cache/VariablesAndData';\r\n\r\n/**\r\n * This function returns the cps as either current or average CPS depending on CM.Options.CPSMode\r\n * @returns\t{number}\tThe average or current cps\r\n */\r\nexport default function GetCPS() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CPSMode) {\r\n return CacheAverageCPS;\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 0) {\r\n return Game.cookiesPs * (1 - Game.cpsSucked);\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 1) {\r\n return Game.cookiesPs * (CacheCurrWrinklerCPSMult + (1 - CacheCurrWrinklerCount * 0.05));\r\n }\r\n if (CacheWrinklersFattest[1] !== null)\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 2 &&\r\n Game.wrinklers[CacheWrinklersFattest[1]].type === 1\r\n ) {\r\n return (\r\n Game.cookiesPs *\r\n ((CacheCurrWrinklerCPSMult * 3) / CacheCurrWrinklerCount +\r\n (1 - CacheCurrWrinklerCount * 0.05))\r\n );\r\n }\r\n return (\r\n Game.cookiesPs *\r\n (CacheCurrWrinklerCPSMult / CacheCurrWrinklerCount + (1 - CacheCurrWrinklerCount * 0.05))\r\n );\r\n}\r\n","import { CacheWrinklersFattest, CacheWrinklersTotal } from '../../Cache/VariablesAndData';\r\n\r\n/**\r\n * This function returns the total amount stored in the Wrinkler Bank\r\n * as calculated by CM.Cache.CacheWrinklers() if CM.Options.CalcWrink is set\r\n * @returns\t{number}\t0 or the amount of cookies stored (CM.Cache.WrinklersTotal)\r\n */\r\nexport default function GetWrinkConfigBank() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 1) {\r\n return CacheWrinklersTotal;\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 2) {\r\n return CacheWrinklersFattest[0];\r\n }\r\n return 0;\r\n}\r\n","/** Functions to create various DOM elements used by the Bars */\r\n\r\nimport { ColourBackPre, ColourBlue, ColourTextPre } from '../VariablesAndData';\r\n\r\n/**\r\n * This function creates an indivudual timer for the timer bar\r\n * @param\t{string}\t\t\t\t\tid\t\t\t\t\tAn id to identify the timer\r\n * @param\t{string}\t\t\t\t\tname\t\t\t\tThe title of the timer\r\n * @param\t[{{string}, {string}}, ...]\tbars ([id, colour])\tThe id and colours of individual parts of the timer\r\n */\r\nexport function CreateTimer(id, name, bars) {\r\n const timerBar = document.createElement('div');\r\n timerBar.id = id;\r\n timerBar.style.height = '12px';\r\n timerBar.style.margin = '0px 10px';\r\n timerBar.style.position = 'relative';\r\n\r\n const div = document.createElement('div');\r\n div.style.width = '100%';\r\n div.style.height = '10px';\r\n div.style.margin = 'auto';\r\n div.style.position = 'absolute';\r\n div.style.left = '0px';\r\n div.style.top = '0px';\r\n div.style.right = '0px';\r\n div.style.bottom = '0px';\r\n\r\n const type = document.createElement('span');\r\n type.style.display = 'inline-block';\r\n type.style.textAlign = 'right';\r\n type.style.fontSize = '10px';\r\n type.style.width = '108px';\r\n type.style.marginRight = '5px';\r\n type.style.verticalAlign = 'text-top';\r\n type.textContent = name;\r\n div.appendChild(type);\r\n\r\n for (let i = 0; i < bars.length; i++) {\r\n const colourBar = document.createElement('span');\r\n colourBar.id = bars[i].id;\r\n colourBar.style.display = 'inline-block';\r\n colourBar.style.height = '10px';\r\n colourBar.style.verticalAlign = 'text-top';\r\n colourBar.style.textAlign = 'center';\r\n if (bars.length - 1 === i) {\r\n colourBar.style.borderTopRightRadius = '10px';\r\n colourBar.style.borderBottomRightRadius = '10px';\r\n }\r\n if (typeof bars[i].colour !== 'undefined') {\r\n colourBar.className = ColourBackPre + bars[i].colour;\r\n }\r\n div.appendChild(colourBar);\r\n }\r\n\r\n const timer = document.createElement('span');\r\n timer.id = `${id}Time`;\r\n timer.style.marginLeft = '5px';\r\n timer.style.verticalAlign = 'text-top';\r\n div.appendChild(timer);\r\n\r\n timerBar.appendChild(div);\r\n\r\n return timerBar;\r\n}\r\n\r\n/**\r\n * This function extends the bottom bar (created by CM.Disp.CreateBotBar) with a column for the given building.\r\n * @param\t{string}\tbuildingName\tObjectname to be added (e.g., \"Cursor\")\r\n */\r\nexport function CreateBotBarBuildingColumn(buildingName) {\r\n if (l('CMBotBar') !== null) {\r\n const type = l('CMBotBar').firstChild.firstChild.childNodes[0];\r\n const bonus = l('CMBotBar').firstChild.firstChild.childNodes[1];\r\n const pp = l('CMBotBar').firstChild.firstChild.childNodes[2];\r\n const time = l('CMBotBar').firstChild.firstChild.childNodes[3];\r\n\r\n const i = buildingName;\r\n const header = type.appendChild(document.createElement('td'));\r\n header.appendChild(\r\n document.createTextNode(`${i.indexOf(' ') !== -1 ? i.substring(0, i.indexOf(' ')) : i} (`),\r\n );\r\n\r\n const span = header.appendChild(document.createElement('span'));\r\n span.className = ColourTextPre + ColourBlue;\r\n\r\n header.appendChild(document.createTextNode(')'));\r\n type.lastChild.style.paddingLeft = '8px';\r\n bonus.appendChild(document.createElement('td'));\r\n bonus.lastChild.style.paddingLeft = '8px';\r\n pp.appendChild(document.createElement('td'));\r\n pp.lastChild.style.paddingLeft = '8px';\r\n time.appendChild(document.createElement('td'));\r\n time.lastChild.style.paddingLeft = '2px';\r\n }\r\n}\r\n","/** Functions related to the Bottom Bar */\r\n\r\nimport { CacheObjects1, CacheObjects10, CacheObjects100 } from '../../Cache/VariablesAndData';\r\nimport { VersionMajor, VersionMinor } from '../../Data/Moddata';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../BeautifyAndFormatting/FormatTime';\r\nimport GetTimeColour from '../BeautifyAndFormatting/GetTimeColour';\r\n\r\nimport GetCPS from '../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../HelperFunctions/GetWrinkConfigBank';\r\nimport { ColourBlue, ColourTextPre, ColourYellow, LastTargetBotBar } from '../VariablesAndData';\r\nimport { CreateBotBarBuildingColumn } from './CreateDOMElements';\r\n\r\n/**\r\n * This function creates the bottom bar and appends it to l('wrapper')\r\n */\r\nexport function CreateBotBar() {\r\n const BotBar = document.createElement('div');\r\n BotBar.id = 'CMBotBar';\r\n BotBar.style.height = '69px';\r\n BotBar.style.width = '100%';\r\n BotBar.style.position = 'absolute';\r\n BotBar.style.display = 'none';\r\n BotBar.style.backgroundColor = '#262224';\r\n BotBar.style.backgroundImage = 'linear-gradient(to bottom, #4d4548, #000000)';\r\n BotBar.style.borderTop = '1px solid black';\r\n BotBar.style.overflow = 'auto';\r\n BotBar.style.textShadow = '-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black';\r\n\r\n const table = BotBar.appendChild(document.createElement('table'));\r\n table.style.width = '100%';\r\n table.style.textAlign = 'center';\r\n table.style.whiteSpace = 'nowrap';\r\n const tbody = table.appendChild(document.createElement('tbody'));\r\n\r\n const firstCol = function (text, colour) {\r\n const td = document.createElement('td');\r\n td.style.textAlign = 'right';\r\n td.className = ColourTextPre + colour;\r\n td.textContent = text;\r\n return td;\r\n };\r\n const type = tbody.appendChild(document.createElement('tr'));\r\n type.style.fontWeight = 'bold';\r\n type.appendChild(firstCol(`CM ${VersionMajor}.${VersionMinor}`, ColourYellow));\r\n const bonus = tbody.appendChild(document.createElement('tr'));\r\n bonus.appendChild(firstCol('Bonus Income', ColourBlue));\r\n const pp = tbody.appendChild(document.createElement('tr'));\r\n pp.appendChild(firstCol('Payback Period', ColourBlue));\r\n const time = tbody.appendChild(document.createElement('tr'));\r\n time.appendChild(firstCol('Time Left', ColourBlue));\r\n\r\n l('wrapper').appendChild(BotBar);\r\n\r\n Object.keys(Game.Objects).forEach((i) => {\r\n CreateBotBarBuildingColumn(i);\r\n });\r\n}\r\n\r\n/**\r\n * This function updates the bonus-, pp-, and time-rows in the the bottom bar\r\n */\r\nexport function UpdateBotBar() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1 &&\r\n CacheObjects1 &&\r\n Game.buyMode === 1\r\n ) {\r\n let count = 0;\r\n Object.keys(CacheObjects1).forEach((i) => {\r\n let target = Game.buyBulk;\r\n if (Game.buyMode === 1) {\r\n LastTargetBotBar = target;\r\n } else {\r\n target = LastTargetBotBar;\r\n }\r\n if (target === 1) target = CacheObjects1;\r\n if (target === 10) target = CacheObjects10;\r\n if (target === 100) target = CacheObjects100;\r\n count += 1;\r\n l('CMBotBar').firstChild.firstChild.childNodes[0].childNodes[\r\n count\r\n ].childNodes[1].textContent = Game.Objects[i].amount;\r\n l('CMBotBar').firstChild.firstChild.childNodes[1].childNodes[count].textContent = Beautify(\r\n target[i].bonus,\r\n 2,\r\n );\r\n l('CMBotBar').firstChild.firstChild.childNodes[2].childNodes[count].className =\r\n ColourTextPre + target[i].colour;\r\n let PPString;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime)\r\n PPString = FormatTime(Math.round(target[i].pp));\r\n else PPString = Beautify(Math.round(target[i].pp), 2);\r\n l('CMBotBar').firstChild.firstChild.childNodes[2].childNodes[count].textContent = PPString;\r\n const timeColour = GetTimeColour(\r\n (Game.Objects[i].bulkPrice - (Game.cookies + GetWrinkConfigBank())) / GetCPS(),\r\n );\r\n l('CMBotBar').firstChild.firstChild.childNodes[3].childNodes[count].className =\r\n ColourTextPre + timeColour.colour;\r\n if (timeColour.text === 'Done!' && Game.cookies < Game.Objects[i].bulkPrice) {\r\n l('CMBotBar').firstChild.firstChild.childNodes[3].childNodes[count].textContent =\r\n `${timeColour.text} (with Wrink)`;\r\n } else\r\n l('CMBotBar').firstChild.firstChild.childNodes[3].childNodes[count].textContent =\r\n timeColour.text;\r\n });\r\n }\r\n}\r\n","/**\r\n * This function sets the size of the background of the full game and the left column\r\n * depending on whether certain abrs are activated\r\n * It is called by CM.Disp.UpdateAscendState() and CM.Disp.UpdateBotTimerBarPosition()\r\n */\r\nexport default function UpdateBackground() {\r\n Game.Background.canvas.width = Game.Background.canvas.parentNode.offsetWidth;\r\n Game.Background.canvas.height = Game.Background.canvas.parentNode.offsetHeight;\r\n Game.LeftBackground.canvas.width = Game.LeftBackground.canvas.parentNode.offsetWidth;\r\n Game.LeftBackground.canvas.height = Game.LeftBackground.canvas.parentNode.offsetHeight;\r\n Game.DrawBackground();\r\n}\r\n","/** Called by the \"func\" of individual settings */\r\n\r\nimport UpdateBackground from '../Disp/HelperFunctions/UpdateBackground';\r\n\r\n/**\r\n * This function changes the position of both the bottom and timer bar\r\n */\r\nexport function UpdateBotTimerBarPosition() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 1\r\n ) {\r\n l('CMBotBar').style.bottom = l('CMTimerBar').style.height;\r\n l('game').style.bottom = `${Number(l('CMTimerBar').style.height.replace('px', '')) + 70}px`;\r\n } else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1) {\r\n l('CMBotBar').style.bottom = '0px';\r\n l('game').style.bottom = '70px';\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 1\r\n ) {\r\n l('game').style.bottom = l('CMTimerBar').style.height;\r\n } else {\r\n // No bars\r\n l('game').style.bottom = '0px';\r\n }\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 0\r\n ) {\r\n l('sectionLeft').style.top = l('CMTimerBar').style.height;\r\n } else {\r\n l('sectionLeft').style.top = '';\r\n }\r\n\r\n UpdateBackground();\r\n}\r\n\r\n/**\r\n * This function changes the visibility of the timer bar\r\n */\r\nexport function ToggleTimerBar() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1)\r\n l('CMTimerBar').style.display = '';\r\n else l('CMTimerBar').style.display = 'none';\r\n UpdateBotTimerBarPosition();\r\n}\r\n\r\n/**\r\n * This function changes the position of the timer bar\r\n */\r\nexport function ToggleTimerBarPos() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 0) {\r\n l('CMTimerBar').style.width = '30%';\r\n l('CMTimerBar').style.bottom = '';\r\n l('game').insertBefore(l('CMTimerBar'), l('sectionLeft'));\r\n } else {\r\n l('CMTimerBar').style.width = '100%';\r\n l('CMTimerBar').style.bottom = '0px';\r\n l('wrapper').appendChild(l('CMTimerBar'));\r\n }\r\n UpdateBotTimerBarPosition();\r\n}\r\n","import { CacheDragonAura, CacheDragonAura2 } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This functions caches the currently selected Dragon Auras\r\n */\r\nexport default function CacheDragonAuras() {\r\n CacheDragonAura = Game.dragonAura;\r\n CacheDragonAura2 = Game.dragonAura2;\r\n}\r\n","/**\r\n * This function constructs an object with the static properties of an achievement\r\n * @param\t{string}\tachievementName\tName of the Achievement\r\n * @returns {Object}\tyou\t\t\t\tThe static object\r\n */\r\nexport default function InitAchievement(achievementName) {\r\n const me = Game.Achievements[achievementName];\r\n const you = {};\r\n you.name = me.name;\r\n return you;\r\n}\r\n","import { SimObjects } from '../VariablesAndData';\r\nimport SimHas from './SimHas';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.GetTieredCpsMult but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimGetTieredCpsMult(me) {\r\n let mult = 1;\r\n Object.keys(me.tieredUpgrades).forEach((i) => {\r\n if (!Game.Tiers[me.tieredUpgrades[i].tier].special && SimHas(me.tieredUpgrades[i].name)) {\r\n let tierMult = 2;\r\n // unshackled multipliers\r\n if (\r\n Game.ascensionMode !== 1 &&\r\n SimHas(me.unshackleUpgrade) &&\r\n SimHas(Game.Tiers[me.tieredUpgrades[i].tier].unshackleUpgrade)\r\n )\r\n tierMult += me.id === 1 ? 0.5 : (20 - me.id) * 0.1;\r\n mult *= tierMult;\r\n }\r\n });\r\n Object.keys(me.synergies).forEach((i) => {\r\n if (SimHas(me.synergies[i].name)) {\r\n const syn = me.synergies[i];\r\n if (syn.buildingTie1.name === me.name) mult *= 1 + 0.05 * syn.buildingTie2.amount;\r\n else if (syn.buildingTie2.name === me.name) mult *= 1 + 0.001 * syn.buildingTie1.amount;\r\n }\r\n });\r\n if (me.fortune && SimHas(me.fortune.name)) mult *= 1.07;\r\n if (me.grandma && SimHas(me.grandma.name))\r\n mult *= 1 + SimObjects.Grandma.amount * 0.01 * (1 / (me.id - 1));\r\n if (typeof me.tieredUpgrades.misfortune === 'object') {\r\n if (me.vanilla === 1 && SimHas(me.tieredUpgrades.misfortune.name)) {\r\n switch (Game.elderWrath) {\r\n default:\r\n mult *= 1;\r\n break;\r\n case 1:\r\n mult *= 1.02;\r\n break;\r\n case 2:\r\n mult *= 1.04;\r\n break;\r\n case 3:\r\n mult *= 1.06;\r\n break;\r\n }\r\n }\r\n }\r\n return mult;\r\n}\r\n","import SimAuraMult from '../ReplacedGameFunctions/SimAuraMult';\r\nimport SimEff from '../ReplacedGameFunctions/SimEff';\r\nimport SimGetTieredCpsMult from '../ReplacedGameFunctions/SimGetTieredCpsMult';\r\nimport SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport { SimObjects } from '../VariablesAndData';\r\n\r\n/**\r\n * This function constructs an object with the static properties of a building,\r\n * but with a 'cps' method changed to check sim data\r\n *\r\n * @param\t{string}\tbuildingName\tName of the building\r\n * @returns {Object}\tyou\t\t\t\tThe static object\r\n */\r\nexport default function InitialBuildingData(buildingName) {\r\n const me = Game.Objects[buildingName];\r\n const you = {};\r\n if (me.name === 'Cursor') {\r\n you.cps = function (it) {\r\n let add = 0;\r\n if (SimHas('Thousand fingers')) add += 0.1;\r\n if (SimHas('Million fingers')) add *= 5;\r\n if (SimHas('Billion fingers')) add *= 10;\r\n if (SimHas('Trillion fingers')) add *= 20;\r\n if (SimHas('Quadrillion fingers')) add *= 20;\r\n if (SimHas('Quintillion fingers')) add *= 20;\r\n if (SimHas('Sextillion fingers')) add *= 20;\r\n if (SimHas('Septillion fingers')) add *= 20;\r\n if (SimHas('Octillion fingers')) add *= 20;\r\n if (SimHas('Nonillion fingers')) add *= 20;\r\n if (SimHas('Decillion fingers')) add *= 20;\r\n if (SimHas('Undecillion fingers')) add *= 20;\r\n if (SimHas('Unshackled cursors')) add *= 25;\r\n let mult = 1;\r\n let num = 0;\r\n Object.keys(SimObjects).forEach((i) => {\r\n if (SimObjects[i].name !== 'Cursor') num += SimObjects[i].amount;\r\n });\r\n add *= num;\r\n mult *= SimGetTieredCpsMult(it);\r\n mult *= Game.magicCpS('Cursor');\r\n mult *= SimEff('cursorCps');\r\n return (\r\n Game.ComputeCps(\r\n 0.1,\r\n SimHas('Reinforced index finger') +\r\n SimHas('Carpal tunnel prevention cream') +\r\n SimHas('Ambidextrous'),\r\n add,\r\n ) * mult\r\n );\r\n };\r\n } else if (me.name === 'Grandma') {\r\n you.cps = function (it) {\r\n let mult = 1;\r\n Object.keys(Game.GrandmaSynergies).forEach((i) => {\r\n if (SimHas(Game.GrandmaSynergies[i])) mult *= 2;\r\n });\r\n if (SimHas('Bingo center/Research facility')) mult *= 4;\r\n if (SimHas('Ritual rolling pins')) mult *= 2;\r\n if (SimHas('Naughty list')) mult *= 2;\r\n\r\n if (SimHas('Elderwort biscuits')) mult *= 1.02;\r\n\r\n mult *= SimEff('grandmaCps');\r\n\r\n if (SimHas('Cat ladies')) {\r\n for (let i = 0; i < Game.UpgradesByPool.kitten.length; i++) {\r\n if (SimHas(Game.UpgradesByPool.kitten[i].name)) mult *= 1.29;\r\n }\r\n }\r\n\r\n mult *= SimGetTieredCpsMult(it);\r\n\r\n let add = 0;\r\n if (SimHas('One mind')) add += SimObjects.Grandma.amount * 0.02;\r\n if (SimHas('Communal brainsweep')) add += SimObjects.Grandma.amount * 0.02;\r\n if (SimHas('Elder Pact')) add += SimObjects.Portal.amount * 0.05;\r\n\r\n let num = 0;\r\n Object.keys(SimObjects).forEach((i) => {\r\n if (SimObjects[i].name !== 'Grandma') num += SimObjects[i].amount;\r\n });\r\n // if (Game.hasAura('Elder Battalion')) mult*=1+0.01*num;\r\n mult *= 1 + SimAuraMult('Elder Battalion') * 0.01 * num;\r\n\r\n mult *= Game.magicCpS(me.name);\r\n\r\n return (me.baseCps + add) * mult;\r\n };\r\n } else {\r\n you.cps = function (it) {\r\n let mult = 1;\r\n mult *= SimGetTieredCpsMult(it);\r\n mult *= Game.magicCpS(it.name);\r\n return it.baseCPS * mult;\r\n };\r\n }\r\n\r\n // Below is needed for above eval, specifically for the SimGetTieredCpsMult function\r\n you.baseCps = me.baseCps;\r\n you.name = me.name;\r\n you.tieredUpgrades = me.tieredUpgrades;\r\n you.synergies = me.synergies;\r\n you.fortune = me.fortune;\r\n you.grandma = me.grandma;\r\n you.baseCPS = me.baseCps;\r\n you.id = me.id;\r\n you.vanilla = me.vanilla;\r\n you.unshackleUpgrade = me.unshackleUpgrade;\r\n return you;\r\n}\r\n","import SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport SimHasGod from '../ReplacedGameFunctions/SimHasGod';\r\nimport { SimObjects } from '../VariablesAndData';\r\n\r\n/**\r\n * This function constructs an object with the static properties of an upgrade\r\n * @param\t{string}\tupgradeName\t\tName of the Upgrade\r\n * @returns {Object}\tyou\t\t\t\tThe static object\r\n */\r\nexport default function InitUpgrade(upgradeName) {\r\n const me = Game.Upgrades[upgradeName];\r\n const you = {};\r\n // Some upgrades have a function for .power (notably the valentine cookies)\r\n you.power = me.power;\r\n if (typeof you.power === 'function') {\r\n if (me.name === 'Sugar crystal cookies') {\r\n you.power = function () {\r\n let n = 5;\r\n Object.keys(SimObjects).forEach((i) => {\r\n if (SimObjects[i].level >= 10) n += 1;\r\n });\r\n return n;\r\n };\r\n } else {\r\n you.power = function () {\r\n let pow = 2;\r\n if (SimHas('Starlove')) pow = 3;\r\n if (Game.hasGod) {\r\n const godLvl = SimHasGod('seasons');\r\n if (godLvl === 1) pow *= 1.3;\r\n else if (godLvl === 2) pow *= 1.2;\r\n else if (godLvl === 3) pow *= 1.1;\r\n }\r\n return pow;\r\n };\r\n }\r\n }\r\n you.pool = me.pool;\r\n you.name = me.name;\r\n return you;\r\n}\r\n","import CacheDragonAuras from '../../Cache/Dragon/CacheDragonAuras';\r\nimport { CacheDragonAura, CacheDragonAura2 } from '../../Cache/VariablesAndData';\r\nimport { CreateBotBarBuildingColumn } from '../../Disp/InfoBars/CreateDOMElements';\r\nimport InitAchievement from '../InitializeData/InitAchievement';\r\nimport InitialBuildingData from '../InitializeData/InitialBuildingData';\r\nimport InitUpgrade from '../InitializeData/InitUpgrade';\r\nimport {\r\n SimAchievements,\r\n SimAchievementsOwned, // eslint-disable-line no-unused-vars\r\n SimDragonAura, // eslint-disable-line no-unused-vars\r\n SimDragonAura2, // eslint-disable-line no-unused-vars\r\n SimGod1, // eslint-disable-line no-unused-vars\r\n SimGod2, // eslint-disable-line no-unused-vars\r\n SimGod3, // eslint-disable-line no-unused-vars\r\n SimHeavenlyPower, // eslint-disable-line no-unused-vars\r\n SimObjects,\r\n SimPledges, // eslint-disable-line no-unused-vars\r\n SimPrestige, // eslint-disable-line no-unused-vars\r\n SimUpgrades,\r\n SimUpgradesOwned, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function copies all relevant data and therefore sets a new iteration of the \"sim data\"\r\n * It is called at the start of any function that simulates certain behaviour or actions\r\n */\r\nexport default function CopyData() {\r\n // Other variables\r\n SimUpgradesOwned = Game.UpgradesOwned;\r\n SimPledges = Game.pledges;\r\n SimAchievementsOwned = Game.AchievementsOwned;\r\n SimHeavenlyPower = Game.heavenlyPower;\r\n SimPrestige = Game.prestige;\r\n\r\n // Buildings\r\n Object.keys(Game.Objects).forEach((i) => {\r\n const me = Game.Objects[i];\r\n let you = SimObjects[i];\r\n if (you === undefined) {\r\n // New building!\r\n SimObjects[i] = InitialBuildingData(i);\r\n you = SimObjects[i];\r\n CreateBotBarBuildingColumn(i); // Add new building to the bottom bar\r\n }\r\n you.amount = me.amount;\r\n you.level = me.level;\r\n you.totalCookies = me.totalCookies;\r\n you.basePrice = me.basePrice;\r\n you.free = me.free;\r\n if (me.minigameLoaded) {\r\n if (me.name === 'Temple') {\r\n SimGod1 = me.minigame.slot[0];\r\n SimGod2 = me.minigame.slot[1];\r\n SimGod3 = me.minigame.slot[2];\r\n }\r\n you.minigameLoaded = me.minigameLoaded;\r\n you.minigame = me.minigame;\r\n }\r\n SimObjects[i] = you;\r\n });\r\n\r\n // Upgrades\r\n Object.keys(Game.Upgrades).forEach((i) => {\r\n const me = Game.Upgrades[i];\r\n let you = SimUpgrades[i];\r\n if (you === undefined) {\r\n SimUpgrades[i] = InitUpgrade(i);\r\n you = SimUpgrades[i];\r\n }\r\n you.bought = me.bought;\r\n SimUpgrades[i] = you;\r\n });\r\n\r\n // Achievements\r\n Object.keys(Game.Achievements).forEach((i) => {\r\n const me = Game.Achievements[i];\r\n let you = SimAchievements[i];\r\n if (you === undefined) {\r\n SimAchievements[i] = InitAchievement(i);\r\n you = SimAchievements[i];\r\n }\r\n you.won = me.won;\r\n SimAchievements[i] = you;\r\n });\r\n\r\n // Auras\r\n CacheDragonAuras();\r\n SimDragonAura = CacheDragonAura;\r\n SimDragonAura2 = CacheDragonAura2;\r\n}\r\n","import {\r\n ColourTextPre,\r\n ColourBorderPre,\r\n ColourGray,\r\n ColourBlue,\r\n ColourRed,\r\n ColourYellow,\r\n ColourPurple,\r\n TooltipType,\r\n} from '../VariablesAndData';\r\n\r\n/** Creates various sections of tooltips */\r\n\r\n/**\r\n * This function creates a tooltipBox object which contains all CookieMonster added tooltip information.\r\n * @returns {object}\tdiv\t\tAn object containing the stylized box\r\n */\r\nexport function TooltipCreateTooltipBox() {\r\n l('tooltip').firstChild.style.paddingBottom = '4px'; // Sets padding on base-tooltip\r\n const tooltipBox = document.createElement('div');\r\n tooltipBox.style.border = '1px solid';\r\n tooltipBox.style.padding = '4px';\r\n tooltipBox.style.margin = '0px -4px';\r\n tooltipBox.id = 'CMTooltipBorder';\r\n tooltipBox.className = ColourTextPre + ColourGray;\r\n return tooltipBox;\r\n}\r\n\r\n/**\r\n * This function creates a header object for tooltips.\r\n * @param\t{string}\ttext\tTitle of header\r\n * @returns {object}\tdiv\t\tAn object containing the stylized header\r\n */\r\nexport function TooltipCreateHeader(text) {\r\n const div = document.createElement('div');\r\n div.style.fontWeight = 'bold';\r\n div.id = `${text}Title`;\r\n div.className = ColourTextPre + ColourBlue;\r\n div.textContent = text;\r\n return div;\r\n}\r\n\r\n/**\r\n * This function creates the tooltip objectm for warnings\r\n * The object is also removed by CM.Disp.UpdateTooltipWarnings() when type is 's' or 'g'\r\n * @returns {object}\tTooltipWarn\tThe Warnings-tooltip object\r\n */\r\nexport function TooltipCreateWarningSection() {\r\n const TooltipWarn = document.createElement('div');\r\n TooltipWarn.style.position = 'absolute';\r\n TooltipWarn.style.display = 'block';\r\n TooltipWarn.style.left = 'auto';\r\n TooltipWarn.style.bottom = 'auto';\r\n TooltipWarn.id = 'CMDispTooltipWarningParent';\r\n\r\n const create = function (boxId, colour, labelTextFront, labelTextBack, deficitId) {\r\n const box = document.createElement('div');\r\n box.id = boxId;\r\n box.style.display = 'none';\r\n box.style.transition = 'opacity 0.1s ease-out';\r\n box.className = ColourBorderPre + colour;\r\n box.style.padding = '2px';\r\n box.style.background = '#000 url(img/darkNoise.png)';\r\n const labelDiv = document.createElement('div');\r\n box.appendChild(labelDiv);\r\n const labelSpan = document.createElement('span');\r\n labelSpan.className = ColourTextPre + colour;\r\n labelSpan.style.fontWeight = 'bold';\r\n labelSpan.textContent = labelTextFront;\r\n labelDiv.appendChild(labelSpan);\r\n labelDiv.appendChild(document.createTextNode(labelTextBack));\r\n const deficitDiv = document.createElement('div');\r\n box.appendChild(deficitDiv);\r\n const deficitSpan = document.createElement('span');\r\n deficitSpan.id = deficitId;\r\n deficitDiv.appendChild(document.createTextNode('Deficit: '));\r\n deficitDiv.appendChild(deficitSpan);\r\n return box;\r\n };\r\n\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnLucky',\r\n ColourRed,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies required for \"Lucky!\"',\r\n 'CMDispTooltipWarnLuckyText',\r\n ),\r\n );\r\n TooltipWarn.firstChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnLuckyFrenzy',\r\n ColourYellow,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies required for \"Lucky!\" (Frenzy)',\r\n 'CMDispTooltipWarnLuckyFrenzyText',\r\n ),\r\n );\r\n TooltipWarn.lastChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnConjure',\r\n ColourPurple,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies required for \"Conjure Baked Goods\"',\r\n 'CMDispTooltipWarnConjureText',\r\n ),\r\n );\r\n TooltipWarn.lastChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnConjureFrenzy',\r\n ColourPurple,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies required for \"Conjure Baked Goods\" (Frenzy)',\r\n 'CMDispTooltipWarnConjureFrenzyText',\r\n ),\r\n );\r\n TooltipWarn.lastChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnEdifice',\r\n ColourPurple,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies needed for \"Spontaneous Edifice\" to possibly give you your most expensive building\"',\r\n 'CMDispTooltipWarnEdificeText',\r\n ),\r\n );\r\n TooltipWarn.lastChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnUser',\r\n ColourRed,\r\n 'Warning: ',\r\n `Purchase of this item will put you under the number of Cookies equal to ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser} seconds of CPS`,\r\n 'CMDispTooltipWarnUserText',\r\n ),\r\n );\r\n\r\n return TooltipWarn;\r\n}\r\n\r\n/**\r\n * This function appends the sections for Bonus Income, PP and Time left (to achiev) to the tooltip-object\r\n * The actual data is added by the Update-functions themselves\r\n * @param\t{object}\ttooltip\t\tObject of a TooltipBox, normally created by a call to CM.Disp.TooltipCreateTooltipBox()\r\n */\r\nexport function TooltipCreateCalculationSection(tooltip) {\r\n tooltip.appendChild(TooltipCreateHeader('Bonus Income'));\r\n const income = document.createElement('div');\r\n income.style.marginBottom = '4px';\r\n income.style.color = 'white';\r\n income.id = 'CMTooltipIncome';\r\n tooltip.appendChild(income);\r\n\r\n tooltip.appendChild(TooltipCreateHeader('Bonus Cookies per Click'));\r\n tooltip.lastChild.style.display = 'none'; // eslint-disable-line no-param-reassign\r\n const click = document.createElement('div');\r\n click.style.marginBottom = '4px';\r\n click.style.color = 'white';\r\n click.style.display = 'none';\r\n click.id = 'CMTooltipCookiePerClick';\r\n tooltip.appendChild(click);\r\n\r\n tooltip.appendChild(TooltipCreateHeader('Payback Period'));\r\n const pp = document.createElement('div');\r\n pp.style.marginBottom = '4px';\r\n pp.id = 'CMTooltipPP';\r\n tooltip.appendChild(pp);\r\n\r\n tooltip.appendChild(TooltipCreateHeader('Time Left'));\r\n const time = document.createElement('div');\r\n time.id = 'CMTooltipTime';\r\n tooltip.appendChild(time);\r\n\r\n if (TooltipType === 'b') {\r\n tooltip.appendChild(TooltipCreateHeader('Production left till next achievement'));\r\n tooltip.lastChild.id = 'CMTooltipProductionLeftHeader'; // eslint-disable-line no-param-reassign\r\n const production = document.createElement('div');\r\n production.id = 'CMTooltipProductionLeft';\r\n tooltip.appendChild(production);\r\n }\r\n if (TooltipType === 'b') {\r\n tooltip.appendChild(TooltipCreateHeader('Buildings (price / PP) left till next achievement'));\r\n tooltip.lastChild.id = 'CMTooltipNextAchievementHeader'; // eslint-disable-line no-param-reassign\r\n const production = document.createElement('div');\r\n production.id = 'CMTooltipNextAchievement';\r\n tooltip.appendChild(production);\r\n }\r\n}\r\n","import GetCPS from '../../Disp/HelperFunctions/GetCPS';\r\nimport {\r\n ColourBlue,\r\n ColourGray,\r\n ColourGreen,\r\n ColourOrange,\r\n ColourPurple,\r\n ColourRed,\r\n ColourYellow,\r\n} from '../../Disp/VariablesAndData';\r\nimport { CacheMinPP, CachePPArray } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions return the colour assosciated with the given pp value\r\n * It is called by CM.Cache.CacheBuildingsPP(), CM.Cache.CacheBuildingsBulkPP() and CM.Cache.CacheUpgradePP()\r\n * @params\t{object}\tobj\t\tThe obj of which the pp value should be checked\r\n * @params\t{number}\tprice\tThe price of the object\r\n * @returns {string}\tcolour\tThe colour assosciated with the pp value\r\n */\r\nexport default function ColourOfPP(me, price) {\r\n let colour = '';\r\n // Colour based on PP\r\n if (me.pp <= 0 || me.pp === Infinity) colour = ColourGray;\r\n else if (me.pp < CacheMinPP) colour = ColourBlue;\r\n else if (me.pp === CacheMinPP) colour = ColourGreen;\r\n else if (me.pp < CachePPArray[10][0]) colour = ColourYellow;\r\n else if (me.pp < CachePPArray[20][0]) colour = ColourOrange;\r\n else if (me.pp < CachePPArray[30][0]) colour = ColourRed;\r\n else colour = ColourPurple;\r\n\r\n // Colour based on price in terms of CPS\r\n if (\r\n Number(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPSecondsLowerLimit,\r\n ) !== 0\r\n ) {\r\n if (\r\n price / GetCPS() <\r\n Number(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPSecondsLowerLimit,\r\n )\r\n )\r\n colour = ColourBlue;\r\n }\r\n // Colour based on being able to purchase\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPOnlyConsiderBuyable) {\r\n if (price - Game.cookies > 0) colour = ColourRed;\r\n }\r\n return colour;\r\n}\r\n","/**\r\n * This function returns the current CPS buff\r\n * @returns {number}\tmult\tThe multiplier\r\n */\r\nexport default function GetCPSBuffMult() {\r\n let mult = 1;\r\n Object.keys(Game.buffs).forEach((i) => {\r\n if (typeof Game.buffs[i].multCpS !== 'undefined') mult *= Game.buffs[i].multCpS;\r\n });\r\n return mult;\r\n}\r\n","import { SimAchievements, SimAchievementsOwned } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This function \"wins\" an achievement in the current sim data\r\n * It functions similarly to Game.Win()\r\n * It is not created by CM.Sim.CreateSimFunctions() in order to avoid spamming pop-ups upon winning\r\n * @param\t{string}\twhat\tName of the achievement\r\n */\r\nexport default function SimWin(what) {\r\n if (SimAchievements[what]) {\r\n if (SimAchievements[what].won === 0) {\r\n SimAchievements[what].won = 1;\r\n if (Game.Achievements[what].pool !== 'shadow') SimAchievementsOwned += 1;\r\n }\r\n }\r\n}\r\n","import GetCPSBuffMult from '../../Cache/CPS/GetCPSBuffMult';\r\nimport { CacheCentEgg } from '../../Cache/VariablesAndData';\r\nimport { CenturyDateAtBeginLoop, CycliusDateAtBeginLoop } from '../../Main/VariablesAndData';\r\nimport SimAuraMult from '../ReplacedGameFunctions/SimAuraMult';\r\nimport SimEff from '../ReplacedGameFunctions/SimEff';\r\nimport SimGetHeavenlyMultiplier from '../ReplacedGameFunctions/SimGetHeavenlyMultiplier';\r\nimport SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport SimHasGod from '../ReplacedGameFunctions/SimHasGod';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport {\r\n SimAchievementsOwned,\r\n SimCookiesPs,\r\n SimCookiesPsRaw, // eslint-disable-line no-unused-vars\r\n SimEffs, // eslint-disable-line no-unused-vars\r\n SimHeavenlyPower,\r\n SimObjects,\r\n SimPrestige,\r\n SimUpgrades,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates the CPS of the current \"sim data\"\r\n * It is similar to Game.CalculateGains()\r\n * It is called at the start of any function that simulates certain behaviour or actions\r\n * @global\t{number}\tCM.Sim.cookiesPs\tThe CPS of the current sim data\r\n */\r\nexport default function CalculateGains() {\r\n SimCookiesPs = 0;\r\n let mult = 1;\r\n // Include minigame effects\r\n const effs = {};\r\n Object.keys(Game.Objects).forEach((i) => {\r\n if (Game.Objects[i].minigameLoaded && Game.Objects[i].minigame.effs) {\r\n const myEffs = Game.Objects[i].minigame.effs;\r\n Object.keys(myEffs).forEach((ii) => {\r\n if (effs[ii]) effs[ii] *= myEffs[ii];\r\n else effs[ii] = myEffs[ii];\r\n });\r\n }\r\n });\r\n SimEffs = effs;\r\n\r\n if (Game.ascensionMode !== 1)\r\n mult += parseFloat(SimPrestige) * 0.01 * SimHeavenlyPower * SimGetHeavenlyMultiplier();\r\n\r\n mult *= SimEff('cps');\r\n\r\n if (SimHas('Heralds') && Game.ascensionMode !== 1) mult *= 1 + 0.01 * Game.heralds;\r\n\r\n Object.keys(Game.cookieUpgrades).forEach((i) => {\r\n const me = Game.cookieUpgrades[i];\r\n if (SimHas(me.name)) {\r\n // Some upgrades have a function as .power (notably the valentine cookies)\r\n // CM.Sim.InitialBuildingData has changed to use CM.Sim.Has instead of Game.Has etc.\r\n // Therefore this call is to the .power of the Sim.Object\r\n if (typeof me.power === 'function') {\r\n mult *= 1 + SimUpgrades[me.name].power(SimUpgrades[me.name]) * 0.01;\r\n } else mult *= 1 + me.power * 0.01;\r\n }\r\n });\r\n\r\n if (SimHas('Specialized chocolate chips')) mult *= 1.01;\r\n if (SimHas('Designer cocoa beans')) mult *= 1.02;\r\n if (SimHas('Underworld ovens')) mult *= 1.03;\r\n if (SimHas('Exotic nuts')) mult *= 1.04;\r\n if (SimHas('Arcane sugar')) mult *= 1.05;\r\n\r\n if (SimHas('Increased merriness')) mult *= 1.15;\r\n if (SimHas('Improved jolliness')) mult *= 1.15;\r\n if (SimHas('A lump of coal')) mult *= 1.01;\r\n if (SimHas('An itchy sweater')) mult *= 1.01;\r\n if (SimHas(\"Santa's dominion\")) mult *= 1.2;\r\n\r\n if (SimHas('Fortune #100')) mult *= 1.01;\r\n if (SimHas('Fortune #101')) mult *= 1.07;\r\n\r\n if (SimHas('Dragon scale')) mult *= 1.03;\r\n\r\n // Check effect of chosen Gods\r\n let buildMult = 1;\r\n if (SimHasGod) {\r\n let godLvl = SimHasGod('asceticism');\r\n if (godLvl === 1) mult *= 1.15;\r\n else if (godLvl === 2) mult *= 1.1;\r\n else if (godLvl === 3) mult *= 1.05;\r\n\r\n godLvl = SimHasGod('ages');\r\n if (godLvl === 1)\r\n mult *= 1 + 0.15 * Math.sin((CycliusDateAtBeginLoop / 1000 / (60 * 60 * 3)) * Math.PI * 2);\r\n else if (godLvl === 2)\r\n mult *= 1 + 0.15 * Math.sin((CycliusDateAtBeginLoop / 1000 / (60 * 60 * 12)) * Math.PI * 2);\r\n else if (godLvl === 3)\r\n mult *= 1 + 0.15 * Math.sin((CycliusDateAtBeginLoop / 1000 / (60 * 60 * 24)) * Math.PI * 2);\r\n\r\n godLvl = SimHasGod('decadence');\r\n if (godLvl === 1) buildMult *= 0.93;\r\n else if (godLvl === 2) buildMult *= 0.95;\r\n else if (godLvl === 3) buildMult *= 0.98;\r\n\r\n godLvl = SimHasGod('industry');\r\n if (godLvl === 1) buildMult *= 1.1;\r\n else if (godLvl === 2) buildMult *= 1.06;\r\n else if (godLvl === 3) buildMult *= 1.03;\r\n\r\n godLvl = SimHasGod('labor');\r\n if (godLvl === 1) buildMult *= 0.97;\r\n else if (godLvl === 2) buildMult *= 0.98;\r\n else if (godLvl === 3) buildMult *= 0.99;\r\n }\r\n\r\n if (SimHas(\"Santa's legacy\")) mult *= 1 + (Game.santaLevel + 1) * 0.03;\r\n\r\n const milkProgress = SimAchievementsOwned / 25;\r\n let milkMult = 1;\r\n if (SimHas(\"Santa's milk and cookies\")) milkMult *= 1.05;\r\n // if (CM.Sim.hasAura('Breath of Milk')) milkMult *= 1.05;\r\n milkMult *= 1 + SimAuraMult('Breath of Milk') * 0.05;\r\n if (SimHasGod) {\r\n const godLvl = SimHasGod('mother');\r\n if (godLvl === 1) milkMult *= 1.1;\r\n else if (godLvl === 2) milkMult *= 1.05;\r\n else if (godLvl === 3) milkMult *= 1.03;\r\n }\r\n milkMult *= SimEff('milk');\r\n\r\n let catMult = 1;\r\n\r\n if (SimHas('Kitten helpers')) catMult *= 1 + milkProgress * 0.1 * milkMult;\r\n if (SimHas('Kitten workers')) catMult *= 1 + milkProgress * 0.125 * milkMult;\r\n if (SimHas('Kitten engineers')) catMult *= 1 + milkProgress * 0.15 * milkMult;\r\n if (SimHas('Kitten overseers')) catMult *= 1 + milkProgress * 0.175 * milkMult;\r\n if (SimHas('Kitten managers')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten accountants')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten specialists')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten experts')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten consultants')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten assistants to the regional manager'))\r\n catMult *= 1 + milkProgress * 0.175 * milkMult;\r\n if (SimHas('Kitten marketeers')) catMult *= 1 + milkProgress * 0.15 * milkMult;\r\n if (SimHas('Kitten analysts')) catMult *= 1 + milkProgress * 0.125 * milkMult;\r\n if (SimHas('Kitten executives')) catMult *= 1 + milkProgress * 0.115 * milkMult;\r\n if (SimHas('Kitten admins')) catMult *= 1 + milkProgress * 0.11 * milkMult;\r\n if (SimHas('Kitten strategists')) catMult *= 1 + milkProgress * 0.105 * milkMult;\r\n if (SimHas('Kitten angels')) catMult *= 1 + milkProgress * 0.1 * milkMult;\r\n if (SimHas('Fortune #103')) catMult *= 1 + milkProgress * 0.05 * milkMult;\r\n\r\n Object.keys(SimObjects).forEach((i) => {\r\n const me = SimObjects[i];\r\n let storedCps = me.cps(me);\r\n if (Game.ascensionMode !== 1) storedCps *= (1 + me.level * 0.01) * buildMult;\r\n if (me.name === 'Grandma' && SimHas('Milkhelp® lactose intolerance relief tablets'))\r\n storedCps *= 1 + 0.05 * milkProgress * milkMult;\r\n SimCookiesPs += me.amount * storedCps;\r\n });\r\n\r\n if (SimHas('\"egg\"')) SimCookiesPs += 9; // \"egg\"\r\n\r\n mult *= catMult;\r\n\r\n let eggMult = 1;\r\n if (SimHas('Chicken egg')) eggMult *= 1.01;\r\n if (SimHas('Duck egg')) eggMult *= 1.01;\r\n if (SimHas('Turkey egg')) eggMult *= 1.01;\r\n if (SimHas('Quail egg')) eggMult *= 1.01;\r\n if (SimHas('Robin egg')) eggMult *= 1.01;\r\n if (SimHas('Ostrich egg')) eggMult *= 1.01;\r\n if (SimHas('Cassowary egg')) eggMult *= 1.01;\r\n if (SimHas('Salmon roe')) eggMult *= 1.01;\r\n if (SimHas('Frogspawn')) eggMult *= 1.01;\r\n if (SimHas('Shark egg')) eggMult *= 1.01;\r\n if (SimHas('Turtle egg')) eggMult *= 1.01;\r\n if (SimHas('Ant larva')) eggMult *= 1.01;\r\n if (SimHas('Century egg')) {\r\n // The boost increases a little every day, with diminishing returns up to +10% on the 100th day\r\n let day =\r\n (Math.floor((CenturyDateAtBeginLoop - Game.startDate) / 1000 / 10) * 10) / 60 / 60 / 24;\r\n day = Math.min(day, 100);\r\n // Sets a Cache value to be displayed in the Stats page, could be moved...\r\n CacheCentEgg = 1 + (1 - (1 - day / 100) ** 3) * 0.1;\r\n eggMult *= CacheCentEgg;\r\n }\r\n mult *= eggMult;\r\n\r\n if (SimHas('Sugar baking')) mult *= 1 + Math.min(100, Game.lumps) * 0.01;\r\n\r\n // if (CM.Sim.hasAura('Radiant Appetite')) mult *= 2;\r\n mult *= 1 + SimAuraMult('Radiant Appetite');\r\n\r\n const rawCookiesPs = SimCookiesPs * mult;\r\n Object.keys(Game.CpsAchievements).forEach((i) => {\r\n if (rawCookiesPs >= Game.CpsAchievements[i].threshold) SimWin(Game.CpsAchievements[i].name);\r\n });\r\n\r\n SimCookiesPsRaw = rawCookiesPs;\r\n\r\n const { n } = Game.shimmerTypes.golden;\r\n const auraMult = SimAuraMult(\"Dragon's Fortune\");\r\n for (let i = 0; i < n; i++) {\r\n mult *= 1 + auraMult * 1.23;\r\n }\r\n\r\n const name = Game.bakeryName.toLowerCase();\r\n if (name === 'orteil') mult *= 0.99;\r\n else if (name === 'ortiel') mult *= 0.98;\r\n\r\n if (SimHas('Elder Covenant')) mult *= 0.95;\r\n\r\n if (SimHas('Golden switch [off]')) {\r\n let goldenSwitchMult = 1.5;\r\n if (SimHas('Residual luck')) {\r\n const upgrades = Game.goldenCookieUpgrades;\r\n Object.keys(upgrades).forEach((i) => {\r\n if (SimHas(upgrades[i])) goldenSwitchMult += 0.1;\r\n });\r\n }\r\n mult *= goldenSwitchMult;\r\n }\r\n if (SimHas('Shimmering veil [off]')) {\r\n let veilMult = 0.5;\r\n if (SimHas('Reinforced membrane')) veilMult += 0.1;\r\n if (SimHas('Delicate touch')) veilMult += 0.05;\r\n if (SimHas('Steadfast murmur')) veilMult += 0.05;\r\n if (SimHas('Glittering edge')) veilMult += 0.05;\r\n mult *= 1 + veilMult;\r\n }\r\n\r\n if (SimHas('Magic shenanigans')) mult *= 1000;\r\n if (SimHas('Occult obstruction')) mult *= 0;\r\n\r\n SimCookiesPs = Game.runModHookOnValue('cps', SimCookiesPs);\r\n\r\n mult *= GetCPSBuffMult();\r\n\r\n SimCookiesPs *= mult;\r\n\r\n // if (Game.hasBuff('Cursed finger')) Game.cookiesPs = 0;\r\n}\r\n","import SimAuraMult from './SimAuraMult';\r\nimport SimHas from './SimHas';\r\nimport SimHasGod from './SimHasGod';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.GetHeavenlyMultiplier but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimGetHeavenlyMultiplier() {\r\n let heavenlyMult = 0;\r\n if (SimHas('Heavenly chip secret')) heavenlyMult += 0.05;\r\n if (SimHas('Heavenly cookie stand')) heavenlyMult += 0.2;\r\n if (SimHas('Heavenly bakery')) heavenlyMult += 0.25;\r\n if (SimHas('Heavenly confectionery')) heavenlyMult += 0.25;\r\n if (SimHas('Heavenly key')) heavenlyMult += 0.25;\r\n // if (SimHasAura('Dragon God')) heavenlyMult*=1.05;\r\n heavenlyMult *= 1 + SimAuraMult('Dragon God') * 0.05;\r\n if (SimHas('Lucky digit')) heavenlyMult *= 1.01;\r\n if (SimHas('Lucky number')) heavenlyMult *= 1.01;\r\n if (SimHas('Lucky payout')) heavenlyMult *= 1.01;\r\n if (Game.hasGod) {\r\n const godLvl = SimHasGod('creation');\r\n if (godLvl === 1) heavenlyMult *= 0.7;\r\n else if (godLvl === 2) heavenlyMult *= 0.8;\r\n else if (godLvl === 3) heavenlyMult *= 0.9;\r\n }\r\n return heavenlyMult;\r\n}\r\n","/** Data copied directly from the game */\r\n\r\n/** Array of the names of all fortune cookies obtainable from the ticker */\r\nexport const Fortunes = [\r\n 'Fortune #001',\r\n 'Fortune #002',\r\n 'Fortune #003',\r\n 'Fortune #004',\r\n 'Fortune #005',\r\n 'Fortune #006',\r\n 'Fortune #007',\r\n 'Fortune #008',\r\n 'Fortune #009',\r\n 'Fortune #010',\r\n 'Fortune #011',\r\n 'Fortune #012',\r\n 'Fortune #013',\r\n 'Fortune #014',\r\n 'Fortune #015',\r\n 'Fortune #016',\r\n 'Fortune #017',\r\n 'Fortune #018',\r\n 'Fortune #019',\r\n 'Fortune #020',\r\n 'Fortune #100',\r\n 'Fortune #101',\r\n 'Fortune #102',\r\n 'Fortune #103',\r\n 'Fortune #104',\r\n];\r\n\r\n/** Array of the names of all Halloween cookies */\r\nexport const HalloCookies = [\r\n 'Skull cookies',\r\n 'Ghost cookies',\r\n 'Bat cookies',\r\n 'Slime cookies',\r\n 'Pumpkin cookies',\r\n 'Eyeball cookies',\r\n 'Spider cookies',\r\n];\r\n\r\n/** Array of the names of all Christmas cookies */\r\nexport const ChristCookies = [\r\n 'Christmas tree biscuits',\r\n 'Snowflake biscuits',\r\n 'Snowman biscuits',\r\n 'Holly biscuits',\r\n 'Candy cane biscuits',\r\n 'Bell biscuits',\r\n 'Present biscuits',\r\n];\r\n\r\n/** Array of the names of all Valentine cookies */\r\nexport const ValCookies = [\r\n 'Pure heart biscuits',\r\n 'Ardent heart biscuits',\r\n 'Sour heart biscuits',\r\n 'Weeping heart biscuits',\r\n 'Golden heart biscuits',\r\n 'Eternal heart biscuits',\r\n 'Prism heart biscuits',\r\n];\r\n\r\n/** Array of the names of all plant drops */\r\nexport const PlantDrops = [\r\n 'Elderwort biscuits',\r\n 'Bakeberry cookies',\r\n 'Duketater cookies',\r\n 'Green yeast digestives',\r\n 'Wheat slims',\r\n 'Fern tea',\r\n 'Ichor syrup',\r\n];\r\n\r\n/** All possible effects plants and other items can have with a display-title */\r\nexport const Effects = {\r\n buildingCost: 'Building prices',\r\n click: 'Cookies per click',\r\n cps: 'Total CPS',\r\n cursorCps: 'Cursor CPS',\r\n goldenCookieDur: 'Golden cookie duration',\r\n goldenCookieEffDur: 'Golden cookie effect duration',\r\n goldenCookieFreq: 'Golden cookie frequency',\r\n goldenCookieGain: 'Golden cookie gains',\r\n grandmaCps: 'Grandma CPS',\r\n itemDrops: 'Random item drop chance',\r\n milk: 'Effect from milk',\r\n reindeerDur: 'Reindeer duration',\r\n reindeerFreq: 'Reindeer frequency',\r\n reindeerGain: 'Reindeer gains',\r\n upgradeCost: 'Upgrade prices',\r\n wrathCookieDur: 'Wrath cookie duration',\r\n wrathCookieEffDur: 'Wrath cookie effect duration',\r\n wrathCookieFreq: 'Wrath cookie frequency',\r\n wrathCookieGain: 'Wrath cookie gains',\r\n wrinklerEat: 'Wrinkler ',\r\n wrinklerSpawn: 'Wrinkler spawn frequency',\r\n};\r\n","import { SimAchievements } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.HasAchiev but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimHasAchiev(what) {\r\n return SimAchievements[what] ? SimAchievements[what].won : 0;\r\n}\r\n","import { ChristCookies, HalloCookies } from '../../Data/Gamedata';\r\nimport SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport SimHasAchiev from '../ReplacedGameFunctions/SimHasAchiev';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport { SimObjects, SimUpgradesOwned } from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates if any special achievements have been obtained\r\n * If so it SimWin()'s them and the caller function will know to recall CM.Sim.CalculateGains()\r\n * It is called at the end of any functions that simulates certain behaviour\r\n */\r\nexport default function CheckOtherAchiev() {\r\n let grandmas = 0;\r\n Object.keys(Game.GrandmaSynergies).forEach((i) => {\r\n if (SimHas(Game.GrandmaSynergies[i])) grandmas += 1;\r\n });\r\n if (!SimHasAchiev('Elder') && grandmas >= 7) SimWin('Elder');\r\n if (!SimHasAchiev('Veteran') && grandmas >= 14) SimWin('Veteran');\r\n\r\n let buildingsOwned = 0;\r\n let mathematician = 1;\r\n let base10 = 1;\r\n let minAmount = 100000;\r\n Object.keys(SimObjects).forEach((i) => {\r\n buildingsOwned += SimObjects[i].amount;\r\n minAmount = Math.min(SimObjects[i].amount, minAmount);\r\n if (!SimHasAchiev('Mathematician')) {\r\n if (\r\n SimObjects[i].amount <\r\n Math.min(128, 2 ** (Game.ObjectsById.length - Game.Objects[i].id - 1))\r\n )\r\n mathematician = 0;\r\n }\r\n if (!SimHasAchiev('Base 10')) {\r\n if (SimObjects[i].amount < (Game.ObjectsById.length - Game.Objects[i].id) * 10) base10 = 0;\r\n }\r\n });\r\n if (minAmount >= 1) SimWin('One with everything');\r\n if (mathematician === 1) SimWin('Mathematician');\r\n if (base10 === 1) SimWin('Base 10');\r\n if (minAmount >= 100) SimWin('Centennial');\r\n if (minAmount >= 150) SimWin('Centennial and a half');\r\n if (minAmount >= 200) SimWin('Bicentennial');\r\n if (minAmount >= 250) SimWin('Bicentennial and a half');\r\n if (minAmount >= 300) SimWin('Tricentennial');\r\n if (minAmount >= 350) SimWin('Tricentennial and a half');\r\n if (minAmount >= 400) SimWin('Quadricentennial');\r\n if (minAmount >= 450) SimWin('Quadricentennial and a half');\r\n if (minAmount >= 500) SimWin('Quincentennial');\r\n if (minAmount >= 550) SimWin('Quincentennial and a half');\r\n if (minAmount >= 600) SimWin('Sexcentennial');\r\n if (minAmount >= 650) SimWin('Sexcentennial and a half');\r\n if (minAmount >= 700) SimWin('Septcentennial');\r\n\r\n if (buildingsOwned >= 100) SimWin('Builder');\r\n if (buildingsOwned >= 500) SimWin('Architect');\r\n if (buildingsOwned >= 1000) SimWin('Engineer');\r\n if (buildingsOwned >= 2500) SimWin('Lord of Constructs');\r\n if (buildingsOwned >= 5000) SimWin('Grand design');\r\n if (buildingsOwned >= 7500) SimWin('Ecumenopolis');\r\n if (buildingsOwned >= 10000) SimWin('Myriad');\r\n\r\n if (SimUpgradesOwned >= 20) SimWin('Enhancer');\r\n if (SimUpgradesOwned >= 50) SimWin('Augmenter');\r\n if (SimUpgradesOwned >= 100) SimWin('Upgrader');\r\n if (SimUpgradesOwned >= 200) SimWin('Lord of Progress');\r\n if (SimUpgradesOwned >= 300) SimWin('The full picture');\r\n if (SimUpgradesOwned >= 400) SimWin(\"When there's nothing left to add\");\r\n if (SimUpgradesOwned >= 500) SimWin('Kaizen');\r\n if (SimUpgradesOwned >= 600) SimWin('Beyond quality');\r\n if (SimUpgradesOwned >= 700) SimWin(\"Oft we mar what's well\");\r\n\r\n if (buildingsOwned >= 4000 && SimUpgradesOwned >= 300) SimWin('Polymath');\r\n if (buildingsOwned >= 8000 && SimUpgradesOwned >= 400) SimWin('Renaissance baker');\r\n\r\n if (SimObjects.Cursor.amount + SimObjects.Grandma.amount >= 777) SimWin('The elder scrolls');\r\n\r\n let hasAllHalloCook = true;\r\n Object.keys(HalloCookies).forEach((i) => {\r\n if (!SimHas(HalloCookies[i])) hasAllHalloCook = false;\r\n });\r\n if (hasAllHalloCook) SimWin('Spooky cookies');\r\n\r\n let hasAllChristCook = true;\r\n Object.keys(ChristCookies).forEach((i) => {\r\n if (!SimHas(ChristCookies[i])) hasAllChristCook = false;\r\n });\r\n if (hasAllChristCook) SimWin('Let it snow');\r\n\r\n if (SimHas('Fortune cookies')) {\r\n const list = Game.Tiers.fortune.upgrades;\r\n let fortunes = 0;\r\n Object.keys(list).forEach((i) => {\r\n if (SimHas(list[i].name)) fortunes += 1;\r\n });\r\n if (fortunes >= list.length) SimWin('O Fortuna');\r\n }\r\n}\r\n","import CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport { SimAchievementsOwned, SimCookiesPs, SimObjects } from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates the bonus income of buying a building\r\n * It is called by CM.Cache.CacheBuildingIncome()\r\n * @param\t{string}\tbuilding\tThe name of the building to be bought\r\n * @param\t{number}\tamount\t\tThe amount to be bought\r\n * @returns {number}\t\t\t\tThe bonus income of the building\r\n */\r\nexport default function BuyBuildingsBonusIncome(building, amount) {\r\n CopyData();\r\n SimObjects[building].amount += amount;\r\n const me = SimObjects[building];\r\n\r\n if (building === 'Cursor') {\r\n if (me.amount >= 1) SimWin('Click');\r\n if (me.amount >= 2) SimWin('Double-click');\r\n if (me.amount >= 50) SimWin('Mouse wheel');\r\n if (me.amount >= 100) SimWin('Of Mice and Men');\r\n if (me.amount >= 200) SimWin('The Digital');\r\n if (me.amount >= 300) SimWin('Extreme polydactyly');\r\n if (me.amount >= 400) SimWin('Dr. T');\r\n if (me.amount >= 500) SimWin('Thumbs, phalanges, metacarpals');\r\n if (me.amount >= 600) SimWin('With her finger and her thumb');\r\n if (me.amount >= 700) SimWin('Gotta hand it to you');\r\n if (me.amount >= 800) SimWin(\"The devil's workshop\");\r\n if (me.amount >= 900) SimWin('All on deck');\r\n if (me.amount >= 1000) SimWin('A round of applause');\r\n } else {\r\n Object.keys(Game.Objects[me.name].tieredAchievs).forEach((j) => {\r\n if (me.amount >= Game.Tiers[Game.Objects[me.name].tieredAchievs[j].tier].achievUnlock) {\r\n SimWin(Game.Objects[me.name].tieredAchievs[j].name);\r\n }\r\n });\r\n }\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n\r\n return SimCookiesPs - Game.cookiesPs;\r\n}\r\n","/**\r\n * This function calculates the time it takes to reach a certain magic level\r\n * @param\t{number}\tcurrentMagic\t\tThe current magic level\r\n * @param\t{number}\tmaxMagic\t\t\tThe user's max magic level\r\n * @param\t{number}\ttargetMagic\t\t\tThe target magic level\r\n * @returns\t{number}\tcount / Game.fps\tThe time it takes to reach targetMagic\r\n */\r\nexport default function CalculateGrimoireRefillTime(currentMagic, maxMagic, targetMagic) {\r\n let magic = currentMagic;\r\n let count = 0;\r\n while (magic < targetMagic) {\r\n magic += Math.max(0.002, (magic / Math.max(maxMagic, 100)) ** 0.5) * 0.002;\r\n count += 1;\r\n }\r\n return count / Game.fps;\r\n}\r\n","/**\r\n * This function toggles the position of the warnings created by CM.Disp.TooltipCreateWarningSection()\r\n * It is called by a change in CM.Options.ToolWarnPos\r\n * and upon creation of the warning tooltip by CM.Disp.UpdateTooltipWarnings()\r\n */\r\nexport default function ToggleToolWarnPos() {\r\n if (l('CMDispTooltipWarningParent') !== null) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos === 0) {\r\n l('CMDispTooltipWarningParent').style.top = 'auto';\r\n l('CMDispTooltipWarningParent').style.margin = '4px -4px';\r\n l('CMDispTooltipWarningParent').style.padding = '3px 4px';\r\n } else {\r\n l('CMDispTooltipWarningParent').style.right = 'auto';\r\n l('CMDispTooltipWarningParent').style.margin = '4px';\r\n l('CMDispTooltipWarningParent').style.padding = '4px 3px';\r\n }\r\n }\r\n}\r\n","import CopyData from '../../Sim/SimulationData/CopyData';\r\nimport { TooltipName, TooltipType } from '../VariablesAndData';\r\nimport * as Create from './CreateTooltip';\r\nimport Building from './TypesOfTooltips/Building';\r\nimport GardenPlots from './TypesOfTooltips/GardenPlots';\r\nimport StockMarket from './TypesOfTooltips/StockMarket';\r\nimport Grimoire from './TypesOfTooltips/Grimoire';\r\nimport HarvestAll from './TypesOfTooltips/HarvestAll';\r\nimport PantheonGods from './TypesOfTooltips/PantheonGods';\r\nimport SugarLump from './TypesOfTooltips/SugarLump';\r\nimport Upgrade from './TypesOfTooltips/Upgrade';\r\nimport Warnings from './TypesOfTooltips/Warnings';\r\nimport WrinklerButton from './TypesOfTooltips/WrinklerButton';\r\n\r\n/**\r\n * This function updates the sections of the tooltips created by CookieMonster\r\n */\r\nexport default function UpdateTooltips() {\r\n CopyData();\r\n if (l('tooltipAnchor').style.display !== 'none' && l('CMTooltipArea')) {\r\n l('CMTooltipArea').innerHTML = '';\r\n const tooltipBox = Create.TooltipCreateTooltipBox();\r\n l('CMTooltipArea').appendChild(tooltipBox);\r\n\r\n if (TooltipType === 'b') {\r\n Building();\r\n } else if (TooltipType === 'u') {\r\n Upgrade();\r\n } else if (TooltipType === 's') {\r\n SugarLump();\r\n } else if (TooltipType === 'g') {\r\n Grimoire();\r\n } else if (TooltipType === 'p') {\r\n GardenPlots();\r\n } else if (TooltipType === 'ha') {\r\n HarvestAll();\r\n } else if (TooltipType === 'sm') {\r\n StockMarket();\r\n } else if (TooltipType === 'wb') {\r\n WrinklerButton();\r\n } else if (TooltipType === 'pag' || (TooltipType === 'pas' && TooltipName[1] !== -1)) {\r\n PantheonGods();\r\n }\r\n Warnings();\r\n } else if (l('CMTooltipArea') === null) {\r\n // Remove warnings if its a basic tooltip\r\n if (l('CMDispTooltipWarningParent') !== null) {\r\n l('CMDispTooltipWarningParent').remove();\r\n }\r\n }\r\n}\r\n","import ColourOfPP from '../../../Cache/PP/ColourOfPP';\r\nimport {\r\n CacheObjects1,\r\n CacheObjects10,\r\n CacheObjects100,\r\n CacheObjectsNextAchievement,\r\n} from '../../../Cache/VariablesAndData';\r\n\r\nimport BuyBuildingsBonusIncome from '../../../Sim/SimulationEvents/BuyBuildingBonusIncome';\r\nimport { SimObjects } from '../../../Sim/VariablesAndData';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../BeautifyAndFormatting/FormatTime';\r\nimport GetTimeColour from '../../BeautifyAndFormatting/GetTimeColour';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../../HelperFunctions/GetWrinkConfigBank';\r\nimport {\r\n ColourTextPre,\r\n LastTargetTooltipBuilding,\r\n TooltipBonusIncome,\r\n TooltipName,\r\n TooltipPrice,\r\n} from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Building tooltips\r\n */\r\nexport default function Building() {\r\n let target;\r\n if (Game.buyMode === 1) {\r\n LastTargetTooltipBuilding = target;\r\n } else {\r\n target = LastTargetTooltipBuilding;\r\n }\r\n if (Game.buyBulk === 1) target = CacheObjects1;\r\n else if (Game.buyBulk === 10) target = CacheObjects10;\r\n else if (Game.buyBulk === 100) target = CacheObjects100;\r\n\r\n TooltipPrice = Game.Objects[TooltipName].bulkPrice;\r\n TooltipBonusIncome = target[TooltipName].bonus;\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade === 1 &&\r\n Game.buyMode === 1\r\n ) {\r\n const tooltipBox = l('CMTooltipBorder');\r\n Create.TooltipCreateCalculationSection(tooltipBox);\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade ===\r\n 1 &&\r\n Game.buyMode === 1\r\n ) {\r\n l('CMTooltipIncome').textContent = Beautify(TooltipBonusIncome, 2);\r\n const increase = Math.round((TooltipBonusIncome / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n l('CMTooltipIncome').textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n l('CMTooltipIncome').textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n l('CMTooltipBorder').className = ColourTextPre + target[TooltipName].colour;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime)\r\n l('CMTooltipPP').textContent = FormatTime(target[TooltipName].pp);\r\n else l('CMTooltipPP').textContent = Beautify(target[TooltipName].pp, 2);\r\n l('CMTooltipPP').className = ColourTextPre + target[TooltipName].colour;\r\n const timeColour = GetTimeColour(\r\n (TooltipPrice - (Game.cookies + GetWrinkConfigBank())) / GetCPS(),\r\n );\r\n l('CMTooltipTime').textContent = timeColour.text;\r\n if (timeColour.text === 'Done!' && Game.cookies < target[TooltipName].price) {\r\n l('CMTooltipTime').textContent = `${timeColour.text} (with Wrink)`;\r\n } else l('CMTooltipTime').textContent = timeColour.text;\r\n l('CMTooltipTime').className = ColourTextPre + timeColour.colour;\r\n }\r\n\r\n // Add \"production left till next achievement\"-bar\r\n l('CMTooltipProductionLeftHeader').style.display = 'none';\r\n l('CMTooltipTime').style.marginBottom = '0px';\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n for (const i of Object.keys(Game.Objects[TooltipName].productionAchievs)) {\r\n if (!Game.HasAchiev(Game.Objects[TooltipName].productionAchievs[i].achiev.name)) {\r\n const nextProductionAchiev = Game.Objects[TooltipName].productionAchievs[i];\r\n l('CMTooltipTime').style.marginBottom = '4px';\r\n l('CMTooltipProductionLeftHeader').style.display = '';\r\n l('CMTooltipProductionLeft').className = `ProdAchievement${TooltipName}`;\r\n l('CMTooltipProductionLeft').textContent = Beautify(\r\n nextProductionAchiev.pow - SimObjects[TooltipName].totalCookies,\r\n 15,\r\n );\r\n l('CMTooltipProductionLeft').style.color = 'white';\r\n break;\r\n }\r\n }\r\n\r\n const ObjectsTillNext = CacheObjectsNextAchievement[TooltipName];\r\n if (ObjectsTillNext.AmountNeeded < 101) {\r\n l('CMTooltipProductionLeft').style.marginBottom = '4px';\r\n l('CMTooltipNextAchievementHeader').style.display = '';\r\n\r\n let PPOfAmount;\r\n if (Game.cookiesPs) {\r\n PPOfAmount =\r\n Math.max(ObjectsTillNext.price - (Game.cookies + GetWrinkConfigBank()), 0) /\r\n Game.cookiesPs +\r\n ObjectsTillNext.price /\r\n BuyBuildingsBonusIncome(TooltipName, ObjectsTillNext.AmountNeeded);\r\n } else\r\n PPOfAmount =\r\n ObjectsTillNext.price /\r\n BuyBuildingsBonusIncome(TooltipName, ObjectsTillNext.AmountNeeded);\r\n\r\n l('CMTooltipNextAchievement').textContent = `${Beautify(\r\n ObjectsTillNext.AmountNeeded,\r\n )} / ${Beautify(ObjectsTillNext.price)} / `;\r\n l('CMTooltipNextAchievement').style.color = 'white';\r\n const PPFrag = document.createElement('span');\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime)\r\n PPFrag.textContent = FormatTime(PPOfAmount);\r\n else PPFrag.textContent = Beautify(PPOfAmount);\r\n PPFrag.className = ColourTextPre + ColourOfPP({ pp: PPOfAmount }, ObjectsTillNext.price);\r\n l('CMTooltipNextAchievement').appendChild(PPFrag);\r\n } else {\r\n l('CMTooltipNextAchievementHeader').style.display = 'none';\r\n l('CMTooltipProductionLeft').style.marginBottom = '0px';\r\n }\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import { CacheLastChoEgg, CacheUpgrades } from '../../../Cache/VariablesAndData';\r\n\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../BeautifyAndFormatting/FormatTime';\r\nimport GetTimeColour from '../../BeautifyAndFormatting/GetTimeColour';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../../HelperFunctions/GetWrinkConfigBank';\r\nimport {\r\n ColourTextPre,\r\n TooltipBonusIncome,\r\n TooltipBonusMouse,\r\n TooltipName,\r\n TooltipPrice,\r\n} from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Upgrade tooltips\r\n */\r\nexport default function Upgrade() {\r\n const tooltipBox = l('CMTooltipBorder');\r\n Create.TooltipCreateCalculationSection(tooltipBox);\r\n\r\n TooltipBonusIncome = CacheUpgrades[Game.UpgradesInStore[TooltipName].name].bonus;\r\n TooltipPrice = Game.Upgrades[Game.UpgradesInStore[TooltipName].name].getPrice();\r\n TooltipBonusMouse = CacheUpgrades[Game.UpgradesInStore[TooltipName].name].bonusMouse;\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade === 1\r\n ) {\r\n l('CMTooltipIncome').textContent = Beautify(TooltipBonusIncome, 2);\r\n const increase = Math.round((TooltipBonusIncome / Game.cookiesPs) * 10000);\r\n // Don't display certain parts of tooltip if not applicable\r\n if (l('CMTooltipIncome').textContent === '0') {\r\n l('Bonus IncomeTitle').style.display = 'none';\r\n l('CMTooltipIncome').style.display = 'none';\r\n l('Payback PeriodTitle').style.display = 'none';\r\n l('CMTooltipPP').style.display = 'none';\r\n } else {\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n l('CMTooltipIncome').textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n l('CMTooltipIncome').textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n l('CMTooltipBorder').className =\r\n ColourTextPre + CacheUpgrades[Game.UpgradesInStore[TooltipName].name].colour;\r\n }\r\n\r\n // If clicking power upgrade\r\n if (TooltipBonusMouse) {\r\n l('CMTooltipCookiePerClick').textContent = Beautify(TooltipBonusMouse);\r\n l('CMTooltipCookiePerClick').style.display = 'block';\r\n l('CMTooltipCookiePerClick').previousSibling.style.display = 'block';\r\n }\r\n // If only a clicking power upgrade change PP to click-based period\r\n if (!TooltipBonusIncome && TooltipBonusMouse) {\r\n l('CMTooltipPP').textContent = `${Beautify(TooltipPrice / TooltipBonusMouse)} Clicks`;\r\n l('CMTooltipPP').style.color = 'white';\r\n l('Payback PeriodTitle').style.display = 'block';\r\n l('CMTooltipPP').style.display = 'block';\r\n } else {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime)\r\n l('CMTooltipPP').textContent = FormatTime(\r\n CacheUpgrades[Game.UpgradesInStore[TooltipName].name].pp,\r\n );\r\n else\r\n l('CMTooltipPP').textContent = Beautify(\r\n CacheUpgrades[Game.UpgradesInStore[TooltipName].name].pp,\r\n 2,\r\n );\r\n l('CMTooltipPP').className =\r\n ColourTextPre + CacheUpgrades[Game.UpgradesInStore[TooltipName].name].colour;\r\n }\r\n const timeColour = GetTimeColour(\r\n (TooltipPrice - (Game.cookies + GetWrinkConfigBank())) / GetCPS(),\r\n );\r\n l('CMTooltipTime').textContent = timeColour.text;\r\n if (\r\n timeColour.text === 'Done!' &&\r\n Game.cookies < Game.UpgradesInStore[TooltipName].getPrice()\r\n ) {\r\n l('CMTooltipTime').textContent = `${timeColour.text} (with Wrink)`;\r\n } else l('CMTooltipTime').textContent = timeColour.text;\r\n l('CMTooltipTime').className = ColourTextPre + timeColour.colour;\r\n\r\n // Add extra info to Chocolate egg tooltip\r\n if (Game.UpgradesInStore[TooltipName].name === 'Chocolate egg') {\r\n l('CMTooltipBorder').lastChild.style.marginBottom = '4px';\r\n l('CMTooltipBorder').appendChild(\r\n Create.TooltipCreateHeader('Cookies to be gained (Currently/Max)'),\r\n );\r\n const chocolate = document.createElement('div');\r\n chocolate.style.color = 'white';\r\n chocolate.textContent = `${Beautify(Game.cookies * 0.05)} / ${Beautify(CacheLastChoEgg)}`;\r\n l('CMTooltipBorder').appendChild(chocolate);\r\n }\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import GetLumpColour from '../../HelperFunctions/GetLumpColour';\r\nimport { ColourTextPre } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n/**\r\n * This function adds extra info to the Sugar Lump tooltip\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function SugarLump() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipLump === 1) {\r\n const tooltipBox = l('CMTooltipBorder');\r\n\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Current Sugar Lump'));\r\n\r\n const lumpType = document.createElement('div');\r\n lumpType.id = 'CMTooltipTime';\r\n tooltipBox.appendChild(lumpType);\r\n const lumpColour = GetLumpColour(Game.lumpCurrentType);\r\n lumpType.textContent = lumpColour.text;\r\n lumpType.className = ColourTextPre + lumpColour.colour;\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import {\r\n ColourGray,\r\n ColourGreen,\r\n ColourOrange,\r\n ColourPurple,\r\n ColourRed,\r\n ColourYellow,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function returns Name and Colour as object for sugar lump type that is given as input param.\r\n * It is called by CM.Disp.UpdateTooltipSugarLump()\r\n * @param \t{string} \t\t\t\ttype \t\t\tSugar Lump Type.\r\n * @returns {{string}, {string}}\ttext, colour\t\tAn array containing the text and display-colour of the sugar lump\r\n */\r\nexport default function GetLumpColour(type) {\r\n if (type === 0) {\r\n return { text: 'Normal', colour: ColourGray };\r\n }\r\n if (type === 1) {\r\n return { text: 'Bifurcated', colour: ColourGreen };\r\n }\r\n if (type === 2) {\r\n return { text: 'Golden', colour: ColourYellow };\r\n }\r\n if (type === 3) {\r\n return { text: 'Meaty', colour: ColourOrange };\r\n }\r\n if (type === 4) {\r\n return { text: 'Caramelized', colour: ColourPurple };\r\n }\r\n return { text: 'Unknown Sugar Lump', colour: ColourRed };\r\n}\r\n","import Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport GetTimeColour from '../../BeautifyAndFormatting/GetTimeColour';\r\nimport CalculateGrimoireRefillTime from '../../HelperFunctions/CalculateGrimoireRefillTime';\r\nimport { ColourTextPre, TooltipName } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Grimoire tooltips\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function Grimoire() {\r\n const { minigame } = Game.Objects['Wizard tower'];\r\n const spellCost = minigame.getSpellCost(minigame.spellsById[TooltipName]);\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipGrim === 1 &&\r\n spellCost <= minigame.magicM\r\n ) {\r\n const tooltipBox = l('CMTooltipBorder');\r\n\r\n // Time left till enough magic for spell\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Time Left'));\r\n const time = document.createElement('div');\r\n time.id = 'CMTooltipTime';\r\n tooltipBox.appendChild(time);\r\n const timeColour = GetTimeColour(\r\n CalculateGrimoireRefillTime(minigame.magic, minigame.magicM, spellCost),\r\n );\r\n time.textContent = timeColour.text;\r\n time.className = ColourTextPre + timeColour.colour;\r\n\r\n // Time left untill magic spent is recovered\r\n if (spellCost <= minigame.magic) {\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Recover Time'));\r\n const recover = document.createElement('div');\r\n recover.id = 'CMTooltipRecover';\r\n tooltipBox.appendChild(recover);\r\n const recoverColour = GetTimeColour(\r\n CalculateGrimoireRefillTime(\r\n Math.max(0, minigame.magic - spellCost),\r\n minigame.magicM,\r\n minigame.magic,\r\n ),\r\n );\r\n recover.textContent = recoverColour.text;\r\n recover.className = ColourTextPre + recoverColour.colour;\r\n }\r\n\r\n // Extra information on cookies gained when spell is Conjure Baked Goods (Name === 0)\r\n if (TooltipName === '0') {\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Cookies to be gained/lost'));\r\n const conjure = document.createElement('div');\r\n conjure.id = 'x';\r\n tooltipBox.appendChild(conjure);\r\n const reward = document.createElement('span');\r\n reward.style.color = '#33FF00';\r\n reward.textContent = Beautify(\r\n Math.max(Math.min(Game.cookies * 0.15, Game.cookiesPs * 60 * 30), 7),\r\n 2,\r\n );\r\n conjure.appendChild(reward);\r\n const seperator = document.createElement('span');\r\n seperator.textContent = ' / ';\r\n conjure.appendChild(seperator);\r\n const loss = document.createElement('span');\r\n loss.style.color = 'red';\r\n loss.textContent = Beautify(\r\n Math.min(Game.cookies, Math.min(Game.cookies * 0.15, Game.cookiesPs * 60 * 15) + 13),\r\n 2,\r\n );\r\n conjure.appendChild(loss);\r\n }\r\n\r\n l('CMTooltipArea').appendChild(tooltipBox);\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport { TooltipName } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Garden plots tooltips\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function GardenPlots() {\r\n const { minigame } = Game.Objects.Farm;\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipPlots &&\r\n minigame.plot[TooltipName[1]][TooltipName[0]][0] !== 0\r\n ) {\r\n const mature =\r\n minigame.plot[TooltipName[1]][TooltipName[0]][1] >\r\n minigame.plantsById[minigame.plot[TooltipName[1]][TooltipName[0]][0] - 1].mature;\r\n const plantName =\r\n minigame.plantsById[minigame.plot[TooltipName[1]][TooltipName[0]][0] - 1].name;\r\n l('CMTooltipBorder').appendChild(Create.TooltipCreateHeader('Reward (Current / Maximum)'));\r\n const reward = document.createElement('div');\r\n reward.id = 'CMTooltipPlantReward';\r\n l('CMTooltipBorder').appendChild(reward);\r\n if (plantName === 'Chocoroot' || plantName === 'White chocoroot') {\r\n l('CMTooltipPlantReward').textContent = `${\r\n mature ? Beautify(Math.min(Game.cookies * 0.03, Game.cookiesPs * 60 * 3)) : '0'\r\n } / ${Beautify(Game.cookiesPs * 60 * 3)}`;\r\n } else if (plantName === 'Bakeberry') {\r\n l('CMTooltipPlantReward').textContent = `${\r\n mature ? Beautify(Math.min(Game.cookies * 0.03, Game.cookiesPs * 60 * 30)) : '0'\r\n } / ${Beautify(Game.cookiesPs * 60 * 30)}`;\r\n } else if (plantName === 'Queenbeet') {\r\n l('CMTooltipPlantReward').textContent = `${\r\n mature ? Beautify(Math.min(Game.cookies * 0.04, Game.cookiesPs * 60 * 60)) : '0'\r\n } / ${Beautify(Game.cookiesPs * 60 * 60)}`;\r\n } else if (plantName === 'Duketater') {\r\n l('CMTooltipPlantReward').textContent = `${\r\n mature ? Beautify(Math.min(Game.cookies * 0.08, Game.cookiesPs * 60 * 120)) : '0'\r\n } / ${Beautify(Game.cookiesPs * 60 * 120)}`;\r\n } else l('CMTooltipArea').style.display = 'none';\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Garden Harvest All tooltip\r\n * It is called when the Harvest All tooltip is created or refreshed by CM.Disp.UpdateTooltip()\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function HarvestAll() {\r\n const { minigame } = Game.Objects.Farm;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipLump) {\r\n l('CMTooltipBorder').appendChild(Create.TooltipCreateHeader('Cookies gained from harvesting:'));\r\n let totalGain = 0;\r\n let mortal = 0;\r\n if (Game.keys[16] && Game.keys[17]) mortal = 1;\r\n for (let y = 0; y < 6; y++) {\r\n for (let x = 0; x < 6; x++) {\r\n if (minigame.plot[y][x][0] >= 1) {\r\n const tile = minigame.plot[y][x];\r\n const me = minigame.plantsById[tile[0] - 1];\r\n const plantName = me.name;\r\n\r\n let count = true;\r\n if (mortal && me.immortal) count = false;\r\n if (tile[1] < me.matureBase) count = false;\r\n if (count && plantName === 'Bakeberry') {\r\n totalGain += Math.min(Game.cookies * 0.03, Game.cookiesPs * 60 * 30);\r\n } else if ((count && plantName === 'Chocoroot') || plantName === 'White chocoroot') {\r\n totalGain += Math.min(Game.cookies * 0.03, Game.cookiesPs * 60 * 3);\r\n } else if (count && plantName === 'Queenbeet') {\r\n totalGain += Math.min(Game.cookies * 0.04, Game.cookiesPs * 60 * 60);\r\n } else if (count && plantName === 'Duketater') {\r\n totalGain += Math.min(Game.cookies * 0.08, Game.cookiesPs * 60 * 120);\r\n }\r\n }\r\n }\r\n }\r\n l('CMTooltipBorder').appendChild(document.createTextNode(Beautify(totalGain)));\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport {\r\n TooltipName,\r\n ColourTextPre,\r\n ColourGreen,\r\n ColourYellow,\r\n ColourOrange,\r\n ColourRed,\r\n ColourPurple,\r\n ColourGray,\r\n} from '../../VariablesAndData';\r\nimport CalculateStockNextExpectedValue from '../../HelperFunctions/CalculateStockNextExpectedValue';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the stock market\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function StockMarket() {\r\n const { minigame } = Game.Objects.Bank;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipStocks) {\r\n const tooltipBox = l('CMTooltipBorder');\r\n const stock = minigame.goodsById[TooltipName];\r\n\r\n // Current stock mode\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Current Mode'));\r\n const stockMode = document.createElement('div');\r\n stockMode.id = 'CMTooltipMode';\r\n tooltipBox.appendChild(stockMode);\r\n const modeIndex = stock.mode;\r\n const modes = ['Stable', 'Slow Rise', 'Slow Fall', 'Fast Rise', 'Fast Fall', 'Chaotic'];\r\n stockMode.textContent = modes[modeIndex];\r\n const colours = [ColourGray, ColourYellow, ColourOrange, ColourGreen, ColourRed, ColourPurple];\r\n stockMode.className = ColourTextPre + colours[modeIndex];\r\n\r\n // Current stock delta value\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Delta'));\r\n const delta = document.createElement('div');\r\n delta.id = 'CMTooltipDelta';\r\n tooltipBox.appendChild(delta);\r\n delta.textContent = Beautify(stock.d);\r\n const deltaColour = stock.d < 0 ? ColourRed : ColourGreen;\r\n delta.className = ColourTextPre + deltaColour;\r\n\r\n // Stock resting value\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Resting Value'));\r\n const restingValue = document.createElement('div');\r\n restingValue.id = 'CMTooltipRestingValue';\r\n tooltipBox.appendChild(restingValue);\r\n restingValue.textContent = `$${Beautify(minigame.getRestingVal(stock.id))}`;\r\n restingValue.style.color = 'white';\r\n\r\n // Next expected value\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Expected Next Value'));\r\n const expectedNextValue = document.createElement('div');\r\n expectedNextValue.id = 'CMTooltipExpectedValue';\r\n tooltipBox.appendChild(expectedNextValue);\r\n const expectedValue = CalculateStockNextExpectedValue(\r\n stock.val,\r\n stock.d,\r\n minigame.getRestingVal(stock.id),\r\n stock.mode,\r\n Game.Objects.Bank.level,\r\n Game.auraMult('Supreme Intellect'),\r\n );\r\n expectedNextValue.textContent = `$${Beautify(expectedValue) + (expectedValue < stock.val ? '\\u25bc' : '\\u25b2')}`;\r\n const expectedNextValueColour = expectedValue < stock.val ? ColourRed : ColourGreen;\r\n expectedNextValue.className = ColourTextPre + expectedNextValueColour;\r\n\r\n l('CMTooltipArea').appendChild(tooltipBox);\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","/**\r\n * This function calculates a stock's next expected value\r\n * @param\t{number}\tvalue\t\t The stock's current value\r\n * @param\t{number}\tdelta\t\t\t The stock's current delta\r\n * @param\t{number}\trestingValue\t\tThe stock's resting value\r\n * @param\t{number}\tmode\t\t The stock's current mode\r\n * @param\t{number}\tbankLevel\t\t The bank building level\r\n * @param\t{number}\tdragonBoost\t\t The current aura multiplier from Supreme Intellect and Reality Bending\r\n * @returns\t{number}\tvalue + delta The stock's next expected value\r\n */\r\nexport default function CalculateStockNextExpectedValue(\r\n pValue,\r\n pDelta,\r\n restingValue,\r\n mode,\r\n bankLevel,\r\n dragonBoost,\r\n) {\r\n let value = pValue;\r\n let delta = pDelta;\r\n delta *= 0.97 + 0.01 * dragonBoost;\r\n switch (mode) {\r\n case 0:\r\n delta *= 0.95;\r\n break;\r\n case 1:\r\n delta *= 0.99;\r\n delta += 0.02;\r\n break;\r\n case 2:\r\n delta *= 0.99;\r\n delta -= 0.02;\r\n break;\r\n case 3:\r\n delta += 0.06;\r\n value += 2.5;\r\n break;\r\n case 4:\r\n delta -= 0.06;\r\n value -= 2.5;\r\n break;\r\n default:\r\n break;\r\n }\r\n value += (restingValue - value) * 0.01;\r\n if (mode === 3) value -= 0.582;\r\n if (mode === 4) value += 0.6;\r\n if (value > 100 + (bankLevel - 1) * 3 && delta > 0) delta *= 0.9;\r\n if (value < 5) value += (5 - value) * 0.5;\r\n if (value < 5 && delta < 0) delta *= 0.95;\r\n return Math.max(value + delta, 1);\r\n}\r\n","import { CacheWrinklersFattest, CacheWrinklersNormal } from '../../../Cache/VariablesAndData';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport { TooltipName } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the wrinkler button tooltip\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function WrinklerButton() {\r\n l('tooltip').innerHTML = '';\r\n l('tooltip').appendChild(Create.TooltipCreateHeader('Reward:'));\r\n\r\n const WrinklerReward = document.createElement('div');\r\n WrinklerReward.id = 'CMWrinklerReward';\r\n if (TooltipName === 'PopAllNormal') {\r\n WrinklerReward.textContent = Beautify(CacheWrinklersNormal);\r\n } else if (TooltipName === 'PopFattest') {\r\n WrinklerReward.textContent = Beautify(CacheWrinklersFattest[0]);\r\n }\r\n\r\n l('tooltip').appendChild(WrinklerReward);\r\n}\r\n","import { CacheGods } from '../../../Cache/VariablesAndData';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport { TooltipName, TooltipType } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Pantheon Gods tooltip\r\n * It is called when the Harvest All tooltip is created or refreshed by CM.Disp.UpdateTooltip()\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function PantheonGods() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipPantheon === 1) {\r\n const tooltipBox = l('CMTooltipBorder');\r\n let GodID;\r\n if (TooltipType === 'pas') GodID = TooltipName[1];\r\n else GodID = TooltipName;\r\n\r\n // Time left till enough magic for spell\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Effect in position 1:'));\r\n const cps1 = document.createElement('div');\r\n cps1.id = 'CMPantheonTooltipPosition1';\r\n if (CacheGods[GodID][0] !== 0) {\r\n cps1.textContent = Beautify(CacheGods[GodID][0]);\r\n const increase = Math.round((CacheGods[GodID][0] / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n cps1.textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n cps1.textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n } else cps1.textContent = 'No effect to CPS';\r\n tooltipBox.appendChild(cps1);\r\n\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Effect in position 2:'));\r\n const cps2 = document.createElement('div');\r\n cps2.id = 'CMPantheonTooltipPosition2';\r\n if (CacheGods[GodID][1] !== 0) {\r\n cps2.textContent = Beautify(CacheGods[GodID][1]);\r\n const increase = Math.round((CacheGods[GodID][1] / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n cps2.textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n cps2.textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n } else cps2.textContent = 'No effect to CPS';\r\n tooltipBox.appendChild(cps2);\r\n\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Effect in position 3:'));\r\n const cps3 = document.createElement('div');\r\n cps3.id = 'CMPantheonTooltipPosition2';\r\n if (CacheGods[GodID][2] !== 0) {\r\n cps3.textContent = Beautify(CacheGods[GodID][2]);\r\n const increase = Math.round((CacheGods[GodID][2] / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n cps3.textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n cps3.textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n } else cps3.textContent = 'No effect to CPS';\r\n tooltipBox.appendChild(cps3);\r\n\r\n l('CMTooltipArea').appendChild(tooltipBox);\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import GetCPSBuffMult from '../../../Cache/CPS/GetCPSBuffMult';\r\nimport { CacheEdifice, CacheLucky } from '../../../Cache/VariablesAndData';\r\nimport ToggleToolWarnPos from '../../../Config/Toggles/ToggleToolWarnPos';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../BeautifyAndFormatting/FormatTime';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../../HelperFunctions/GetWrinkConfigBank';\r\nimport { TooltipBonusIncome, TooltipPrice, TooltipType } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function updates the warnings section of the building and upgrade tooltips\r\n */\r\nexport default function Warnings() {\r\n if (TooltipType === 'b' || TooltipType === 'u') {\r\n if (document.getElementById('CMDispTooltipWarningParent') === null) {\r\n l('tooltipAnchor').appendChild(Create.TooltipCreateWarningSection());\r\n ToggleToolWarnPos();\r\n }\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos === 0)\r\n l('CMDispTooltipWarningParent').style.right = '0px';\r\n else l('CMDispTooltipWarningParent').style.top = `${l('tooltip').offsetHeight}px`;\r\n\r\n l('CMDispTooltipWarningParent').style.width = `${l('tooltip').offsetWidth - 6}px`;\r\n\r\n const amount = Game.cookies + GetWrinkConfigBank() - TooltipPrice;\r\n const bonusIncomeUsed = Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings\r\n .ToolWarnBon\r\n ? TooltipBonusIncome\r\n : 0;\r\n let limitLucky = CacheLucky;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnBon === 1) {\r\n let bonusNoFren = TooltipBonusIncome;\r\n bonusNoFren /= GetCPSBuffMult();\r\n limitLucky += (bonusNoFren * 60 * 15) / 0.15;\r\n }\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLucky === 1) {\r\n if (amount < limitLucky && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnLucky').style.display = '';\r\n l('CMDispTooltipWarnLuckyText').textContent = `${Beautify(\r\n limitLucky - amount,\r\n )} (${FormatTime((limitLucky - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnLucky').style.display = 'none';\r\n } else l('CMDispTooltipWarnLucky').style.display = 'none';\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLuckyFrenzy === 1\r\n ) {\r\n const limitLuckyFrenzy = limitLucky * 7;\r\n if (amount < limitLuckyFrenzy && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnLuckyFrenzy').style.display = '';\r\n l('CMDispTooltipWarnLuckyFrenzyText').textContent = `${Beautify(\r\n limitLuckyFrenzy - amount,\r\n )} (${FormatTime((limitLuckyFrenzy - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnLuckyFrenzy').style.display = 'none';\r\n } else l('CMDispTooltipWarnLuckyFrenzy').style.display = 'none';\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnConjure === 1) {\r\n const limitConjure = limitLucky * 2;\r\n if (amount < limitConjure && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnConjure').style.display = '';\r\n l('CMDispTooltipWarnConjureText').textContent = `${Beautify(\r\n limitConjure - amount,\r\n )} (${FormatTime((limitConjure - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnConjure').style.display = 'none';\r\n } else l('CMDispTooltipWarnConjure').style.display = 'none';\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnConjureFrenzy ===\r\n 1\r\n ) {\r\n const limitConjureFrenzy = limitLucky * 2 * 7;\r\n if (amount < limitConjureFrenzy && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnConjureFrenzy').style.display = '';\r\n l('CMDispTooltipWarnConjureFrenzyText').textContent = `${Beautify(\r\n limitConjureFrenzy - amount,\r\n )} (${FormatTime((limitConjureFrenzy - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnConjureFrenzy').style.display = 'none';\r\n } else l('CMDispTooltipWarnConjureFrenzy').style.display = 'none';\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnEdifice === 1 &&\r\n Game.Objects['Wizard tower'].minigameLoaded\r\n ) {\r\n if (CacheEdifice && amount < CacheEdifice && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnEdifice').style.display = '';\r\n l('CMDispTooltipWarnEdificeText').textContent = `${Beautify(\r\n CacheEdifice - amount,\r\n )} (${FormatTime((CacheEdifice - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnEdifice').style.display = 'none';\r\n } else l('CMDispTooltipWarnEdifice').style.display = 'none';\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser > 0) {\r\n if (\r\n amount <\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser *\r\n GetCPS() &&\r\n (TooltipType !== 'b' || Game.buyMode === 1)\r\n ) {\r\n l('CMDispTooltipWarnUser').style.display = '';\r\n // Need to update tooltip text dynamically\r\n l('CMDispTooltipWarnUser').children[0].textContent =\r\n `Purchase of this item will put you under the number of Cookies equal to ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser} seconds of CPS`;\r\n l('CMDispTooltipWarnUserText').textContent = `${Beautify(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser *\r\n GetCPS() -\r\n amount,\r\n )} (${FormatTime(\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser *\r\n GetCPS() -\r\n amount) /\r\n (GetCPS() + bonusIncomeUsed),\r\n )})`;\r\n } else l('CMDispTooltipWarnUser').style.display = 'none';\r\n } else l('CMDispTooltipWarnUser').style.display = 'none';\r\n } else if (l('CMDispTooltipWarningParent') !== null) {\r\n l('CMDispTooltipWarningParent').remove();\r\n }\r\n}\r\n","import ToggleWrinklerButtons from '../Config/Toggles/ToggleWrinklerButtons';\r\nimport UpdateBuildings from './BuildingsUpgrades/Buildings';\r\nimport UpdateUpgradeSectionsHeight from './BuildingsUpgrades/UpdateUpgradeSectionsHeight';\r\nimport UpdateUpgrades from './BuildingsUpgrades/Upgrades';\r\nimport { UpdateBotBar } from './InfoBars/BottomBar';\r\nimport { UpdateTimerBar } from './InfoBars/TimerBar';\r\nimport RefreshMenu from './MenuSections/Refreshmenu';\r\nimport UpdateTooltips from './Tooltips/UpdateTooltips';\r\nimport { CheckWrinklerTooltip, UpdateWrinklerTooltip } from './Tooltips/WrinklerTooltips';\r\n\r\n/**\r\n * This function handles all custom drawing for the Game.Draw() function.\r\n * It is hooked on 'draw' by CM.RegisterHooks()\r\n */\r\nexport default function CMDrawHook() {\r\n // Draw autosave timer in stats menu, this must be done here to make it count down correctly\r\n if (\r\n Game.prefs.autosave &&\r\n Game.drawT % 10 === 0 && // with autosave ON and every 10 ticks\r\n Game.onMenu === 'stats' &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Stats // while being on the stats menu only\r\n ) {\r\n const timer = document.getElementById('CMStatsAutosaveTimer');\r\n if (timer) {\r\n timer.innerText = Game.sayTime(Game.fps * 60 - (Game.T % (Game.fps * 60)), 4);\r\n }\r\n }\r\n\r\n // Update colours\r\n UpdateBuildings();\r\n UpdateUpgrades();\r\n UpdateUpgradeSectionsHeight();\r\n\r\n // Redraw timers\r\n UpdateTimerBar();\r\n\r\n // Update Bottom Bar\r\n UpdateBotBar();\r\n\r\n // Update Tooltip\r\n UpdateTooltips();\r\n\r\n // Update Wrinkler Tooltip\r\n CheckWrinklerTooltip();\r\n UpdateWrinklerTooltip();\r\n\r\n // Change menu refresh interval\r\n RefreshMenu();\r\n\r\n // Update display of wrinkler buttons, this checks if Elder Pledge has been bought and if they should be disabled\r\n ToggleWrinklerButtons();\r\n}\r\n","/** Functions related to the Timer Bar */\r\n\r\nimport { UpdateBotTimerBarPosition } from '../../Config/SpecificToggles';\r\nimport {\r\n BuffColours,\r\n ColourBackPre,\r\n ColourGray,\r\n ColourOrange,\r\n ColourPurple,\r\n LastNumberOfTimers,\r\n} from '../VariablesAndData';\r\nimport { CreateTimer } from './CreateDOMElements';\r\n\r\n/**\r\n * This function creates the TimerBar and appends it to l('wrapper')\r\n */\r\nexport function CreateTimerBar() {\r\n const TimerBar = document.createElement('div');\r\n TimerBar.id = 'CMTimerBar';\r\n TimerBar.style.position = 'absolute';\r\n TimerBar.style.display = 'none';\r\n TimerBar.style.height = '0px';\r\n TimerBar.style.fontSize = '10px';\r\n TimerBar.style.fontWeight = 'bold';\r\n TimerBar.style.backgroundColor = 'black';\r\n\r\n // Create standard Autosave bar\r\n const CMTimerBarAutosave = CreateTimer('CMTimerBarAutosave', 'Autosave', [\r\n { id: 'CMTimerBarAutosaveBar', colour: ColourPurple },\r\n ]);\r\n TimerBar.appendChild(CMTimerBarAutosave);\r\n\r\n // Create standard Golden Cookie bar\r\n const CMTimerBarGC = CreateTimer('CMTimerBarGC', 'Next Cookie', [\r\n { id: 'CMTimerBarGCMinBar', colour: ColourGray },\r\n { id: 'CMTimerBarGCBar', colour: ColourPurple },\r\n ]);\r\n TimerBar.appendChild(CMTimerBarGC);\r\n\r\n // Create standard Reindeer bar\r\n const CMTimerBarRen = CreateTimer('CMTimerBarRen', 'Next Reindeer', [\r\n { id: 'CMTimerBarRenMinBar', colour: ColourGray },\r\n { id: 'CMTimerBarRenBar', colour: ColourOrange },\r\n ]);\r\n TimerBar.appendChild(CMTimerBarRen);\r\n const TimerBarBuffTimers = document.createElement('div');\r\n TimerBarBuffTimers.id = 'CMTimerBarBuffTimers';\r\n TimerBar.appendChild(TimerBarBuffTimers);\r\n\r\n l('wrapper').appendChild(TimerBar);\r\n}\r\n\r\n/**\r\n * This function updates indivudual timers in the timer bar\r\n */\r\nexport function UpdateTimerBar() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1) {\r\n // label width: 113, timer width: 30, div margin: 20\r\n const maxWidthTwoBar = l('CMTimerBar').offsetWidth - 163;\r\n // label width: 113, div margin: 20, calculate timer width at runtime\r\n const maxWidthOneBar = l('CMTimerBar').offsetWidth - 133;\r\n let numberOfTimers = 0;\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AutosaveTimerBar &&\r\n Game.prefs.autosave\r\n ) {\r\n const timeTillNextAutosave =\r\n (Game.fps * 60 - (Game.OnAscend ? 0 : Game.T % (Game.fps * 60))) / Game.fps;\r\n l('CMTimerBarAutosave').style.display = '';\r\n l('CMTimerBarAutosaveBar').style.width = `${Math.round(\r\n (timeTillNextAutosave *\r\n (maxWidthOneBar - Math.ceil(timeTillNextAutosave).toString().length * 8)) /\r\n 60,\r\n )}px`;\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1\r\n ) {\r\n l('CMTimerBarAutosaveBar').textContent = Math.ceil(timeTillNextAutosave);\r\n } else l('CMTimerBarAutosaveBar').textContent = '';\r\n l('CMTimerBarAutosaveTime').textContent = Math.ceil(timeTillNextAutosave);\r\n numberOfTimers += 1;\r\n } else l('CMTimerBarAutosave').style.display = 'none';\r\n\r\n // Regulates visibility of Golden Cookie timer\r\n if (Game.shimmerTypes.golden.spawned === 0 && !Game.Has('Golden switch [off]')) {\r\n l('CMTimerBarGC').style.display = '';\r\n l('CMTimerBarGCMinBar').style.width = `${Math.round(\r\n (Math.max(0, Game.shimmerTypes.golden.minTime - Game.shimmerTypes.golden.time) *\r\n maxWidthTwoBar) /\r\n Game.shimmerTypes.golden.maxTime,\r\n )}px`;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1)\r\n l('CMTimerBarGCMinBar').textContent = Math.ceil(\r\n (Game.shimmerTypes.golden.minTime - Game.shimmerTypes.golden.time) / Game.fps,\r\n );\r\n else l('CMTimerBarGCMinBar').textContent = '';\r\n if (Game.shimmerTypes.golden.minTime === Game.shimmerTypes.golden.maxTime) {\r\n l('CMTimerBarGCMinBar').style.borderTopRightRadius = '10px';\r\n l('CMTimerBarGCMinBar').style.borderBottomRightRadius = '10px';\r\n } else {\r\n l('CMTimerBarGCMinBar').style.borderTopRightRadius = '';\r\n l('CMTimerBarGCMinBar').style.borderBottomRightRadius = '';\r\n }\r\n l('CMTimerBarGCBar').style.width = `${Math.round(\r\n (Math.min(\r\n Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.minTime,\r\n Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.time,\r\n ) *\r\n maxWidthTwoBar) /\r\n Game.shimmerTypes.golden.maxTime,\r\n )}px`;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1)\r\n l('CMTimerBarGCBar').textContent = Math.ceil(\r\n Math.min(\r\n Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.minTime,\r\n Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.time,\r\n ) / Game.fps,\r\n );\r\n else l('CMTimerBarGCBar').textContent = '';\r\n const chanceToSpawn =\r\n Math.max(\r\n 0,\r\n (Game.shimmerTypes.golden.time - Game.shimmerTypes.golden.minTime) /\r\n (Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.minTime),\r\n ) ** 5;\r\n l('CMTimerBarGCTime').textContent = `${Math.ceil(\r\n (Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.time) / Game.fps,\r\n )} ${chanceToSpawn < 0.01 ? '<' : ''}${chanceToSpawn.toLocaleString('en', {\r\n style: 'percent',\r\n })}`;\r\n numberOfTimers += 1;\r\n } else l('CMTimerBarGC').style.display = 'none';\r\n\r\n // Regulates visibility of Reindeer timer\r\n if (Game.season === 'christmas' && Game.shimmerTypes.reindeer.spawned === 0) {\r\n l('CMTimerBarRen').style.display = '';\r\n l('CMTimerBarRenMinBar').style.width = `${Math.round(\r\n (Math.max(0, Game.shimmerTypes.reindeer.minTime - Game.shimmerTypes.reindeer.time) *\r\n maxWidthTwoBar) /\r\n Game.shimmerTypes.reindeer.maxTime,\r\n )}px`;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1)\r\n l('CMTimerBarRenMinBar').textContent = Math.ceil(\r\n (Game.shimmerTypes.reindeer.minTime - Game.shimmerTypes.reindeer.time) / Game.fps,\r\n );\r\n else l('CMTimerBarRenMinBar').textContent = '';\r\n l('CMTimerBarRenBar').style.width = `${Math.round(\r\n (Math.min(\r\n Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.minTime,\r\n Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.time,\r\n ) *\r\n maxWidthTwoBar) /\r\n Game.shimmerTypes.reindeer.maxTime,\r\n )}px`;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1)\r\n l('CMTimerBarRenBar').textContent = Math.ceil(\r\n Math.min(\r\n Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.minTime,\r\n Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.time,\r\n ) / Game.fps,\r\n );\r\n else l('CMTimerBarRenBar').textContent = '';\r\n const chanceToSpawn =\r\n Math.max(\r\n 0,\r\n (Game.shimmerTypes.reindeer.time - Game.shimmerTypes.reindeer.minTime) /\r\n (Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.minTime),\r\n ) ** 5;\r\n l('CMTimerBarRenTime').textContent = `${Math.ceil(\r\n (Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.time) / Game.fps,\r\n )} ${chanceToSpawn < 0.01 ? '<' : ''}${chanceToSpawn.toLocaleString('en', {\r\n style: 'percent',\r\n })}`;\r\n numberOfTimers += 1;\r\n } else {\r\n l('CMTimerBarRen').style.display = 'none';\r\n }\r\n\r\n // On every frame all buff-timers are deleted and re-created\r\n const BuffTimerBars = {};\r\n l('CMTimerBarBuffTimers').innerHTML = '';\r\n Object.keys(Game.buffs).forEach((i) => {\r\n if (Game.buffs[i]) {\r\n const timer = CreateTimer(Game.buffs[i].name, Game.buffs[i].name, [\r\n { id: `${Game.buffs[i].name}Bar` },\r\n ]);\r\n timer.style.display = '';\r\n let classColour = '';\r\n // Gives specific timers specific colours\r\n if (typeof BuffColours[Game.buffs[i].name] !== 'undefined') {\r\n classColour = BuffColours[Game.buffs[i].name];\r\n } else classColour = ColourPurple;\r\n timer.lastChild.children[1].className = ColourBackPre + classColour;\r\n timer.lastChild.children[1].style.color = 'black';\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay === 2\r\n )\r\n timer.lastChild.children[1].textContent = `${Math.round(\r\n 100 * (Game.buffs[i].time / Game.buffs[i].maxTime),\r\n )}%`;\r\n else timer.lastChild.children[1].textContent = '';\r\n timer.lastChild.children[1].style.width = `${Math.round(\r\n (Game.buffs[i].time *\r\n (maxWidthOneBar - Math.ceil(Game.buffs[i].time / Game.fps).toString().length * 8)) /\r\n Game.buffs[i].maxTime,\r\n )}px`;\r\n timer.lastChild.children[2].textContent = Math.ceil(Game.buffs[i].time / Game.fps);\r\n numberOfTimers += 1;\r\n BuffTimerBars[Game.buffs[i].name] = timer;\r\n }\r\n });\r\n Object.keys(BuffTimerBars).forEach((i) => {\r\n l('CMTimerBarBuffTimers').appendChild(BuffTimerBars[i]);\r\n });\r\n\r\n if (numberOfTimers !== 0) {\r\n l('CMTimerBar').style.height = `${numberOfTimers * 12 + 2}px`;\r\n }\r\n if (LastNumberOfTimers !== numberOfTimers) {\r\n LastNumberOfTimers = numberOfTimers;\r\n UpdateBotTimerBarPosition();\r\n }\r\n }\r\n}\r\n","import { SimObjects } from '../../Sim/VariablesAndData';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\nimport {\r\n TooltipWrinkler,\r\n TooltipWrinklerArea,\r\n TooltipWrinklerBeingShown,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks and create a tooltip for the wrinklers\r\n * It is called by CM.Disp.Draw()\r\n * As wrinklers are not appended to the DOM we us a different system than for other tooltips\r\n */\r\nexport function CheckWrinklerTooltip() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipWrink === 1 &&\r\n TooltipWrinklerArea === 1\r\n ) {\r\n // Latter is set by CM.Main.AddWrinklerAreaDetect\r\n let showingTooltip = false;\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n const me = Game.wrinklers[i];\r\n if (me.phase > 0 && me.selected) {\r\n showingTooltip = true;\r\n if (TooltipWrinklerBeingShown[i] === 0 || TooltipWrinklerBeingShown[i] === undefined) {\r\n const placeholder = document.createElement('div');\r\n const wrinkler = document.createElement('div');\r\n wrinkler.style.minWidth = '120px';\r\n wrinkler.style.marginBottom = '4px';\r\n const div = document.createElement('div');\r\n div.style.textAlign = 'center';\r\n div.id = 'CMTooltipWrinkler';\r\n wrinkler.appendChild(div);\r\n placeholder.appendChild(wrinkler);\r\n Game.tooltip.draw(this, escape(placeholder.innerHTML));\r\n TooltipWrinkler = i;\r\n TooltipWrinklerBeingShown[i] = 1;\r\n }\r\n } else {\r\n TooltipWrinklerBeingShown[i] = 0;\r\n }\r\n });\r\n if (!showingTooltip) {\r\n Game.tooltip.hide();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * This function updates the amount to be displayed by the wrinkler tooltip created by CM.Disp.CheckWrinklerTooltip()\r\n * It is called by CM.Disp.Draw()\r\n * As wrinklers are not appended to the DOM we us a different system than for other tooltips\r\n */\r\nexport function UpdateWrinklerTooltip() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipWrink === 1 &&\r\n l('CMTooltipWrinkler') !== null\r\n ) {\r\n let { sucked } = Game.wrinklers[TooltipWrinkler];\r\n let toSuck = 1.1;\r\n if (Game.Has('Sacrilegious corruption')) toSuck *= 1.05;\r\n if (Game.wrinklers[TooltipWrinkler].type === 1) toSuck *= 3; // Shiny wrinklers\r\n sucked *= toSuck;\r\n if (Game.Has('Wrinklerspawn')) sucked *= 1.05;\r\n if (SimObjects.Temple.minigameLoaded) {\r\n const godLvl = Game.hasGod('scorn');\r\n if (godLvl === 1) sucked *= 1.15;\r\n else if (godLvl === 2) sucked *= 1.1;\r\n else if (godLvl === 3) sucked *= 1.05;\r\n }\r\n l('CMTooltipWrinkler').textContent = Beautify(sucked);\r\n }\r\n}\r\n","/**\r\n * This function refreshes the stats page, CM.Options.UpStats determines the rate at which that happens\r\n * It is called by CM.Disp.Draw()\r\n */\r\nexport default function RefreshMenu() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpStats &&\r\n Game.onMenu === 'stats' &&\r\n (Game.drawT - 1) % (Game.fps * 5) !== 0 &&\r\n (Game.drawT - 1) % Game.fps === 0\r\n )\r\n Game.UpdateMenu();\r\n}\r\n","import { CacheAverageCookiesFromClicks } from '../Cache/VariablesAndData';\r\n\r\nexport default function CMClickHook() {\r\n // Add cookies from click to array that stores average\r\n CacheAverageCookiesFromClicks.addLatest(Game.computedMouseCps);\r\n}\r\n","import { ClickTimes, CookieTimes } from '../../Disp/VariablesAndData';\r\nimport {\r\n ChoEggDiff, // eslint-disable-line no-unused-vars\r\n ClicksDiff, // eslint-disable-line no-unused-vars\r\n CookiesDiff, // eslint-disable-line no-unused-vars\r\n WrinkDiff, // eslint-disable-line no-unused-vars\r\n WrinkFattestDiff, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * @class\r\n * @classdesc \tThis is a class used to store values used to calculate average over time (mostly cps)\r\n * @var\t\t\t{number}\t\t\t\tmaxLength\tThe maximum length of the value-storage\r\n * @var\t\t\t{[]}\t\t\t\t\tqueue\t\tThe values stored\r\n * @method\t\taddLatest(newValue)\t\tAppends newValue to the value storage\r\n * @method\t\tcalcAverage(timePeriod)\tReturns the average over the specified timeperiod\r\n */\r\nexport class CMAvgQueue {\r\n constructor(maxLength) {\r\n this.maxLength = maxLength;\r\n this.queue = [];\r\n }\r\n\r\n addLatest(newValue) {\r\n if (this.queue.push(newValue) > this.maxLength) {\r\n this.queue.shift();\r\n }\r\n }\r\n\r\n /**\r\n * This functions returns the average of the values in the queue\r\n * @param \t{number}\ttimePeriod\tThe period in seconds to computer average over\r\n * @returns {number}\tret\t\t\tThe average\r\n */\r\n calcAverage(timePeriod) {\r\n let time = timePeriod;\r\n if (time > this.maxLength) time = this.maxLength;\r\n if (time > this.queue.length) time = this.queue.length;\r\n let ret = 0;\r\n for (let i = this.queue.length - 1; i >= 0 && i > this.queue.length - 1 - time; i--) {\r\n ret += this.queue[i];\r\n }\r\n if (ret === 0) {\r\n return 0;\r\n }\r\n return ret / time;\r\n }\r\n\r\n calcSum(timePeriod) {\r\n let time = timePeriod;\r\n if (time > this.maxLength) time = this.maxLength;\r\n if (time > this.queue.length) time = this.queue.length;\r\n if (time === 0) return 0;\r\n return this.queue.slice(-time).reduce((a, b) => a + b, 0);\r\n }\r\n}\r\n\r\n/**\r\n * This functions caches creates the CMAvgQueue used by CM.Cache.CacheAvgCPS() to calculate CPS\r\n * Called by CM.Cache.InitCache()\r\n */\r\nexport function InitCookiesDiff() {\r\n CookiesDiff = new CMAvgQueue(CookieTimes[CookieTimes.length - 1]);\r\n WrinkDiff = new CMAvgQueue(CookieTimes[CookieTimes.length - 1]);\r\n WrinkFattestDiff = new CMAvgQueue(CookieTimes[CookieTimes.length - 1]);\r\n ChoEggDiff = new CMAvgQueue(CookieTimes[CookieTimes.length - 1]);\r\n ClicksDiff = new CMAvgQueue(ClickTimes[ClickTimes.length - 1]);\r\n}\r\n","/**\r\n * Insert the provided values into `window.CookieMonsterData.Cache`.\r\n *\r\n * The initial 'Cache' is dropped from the name, so e.g. `CacheWrinklersTotal`\r\n * becomes `window.CookieMonsterData.Cache.WrinklersTotal`.\r\n */\r\nexport default function FillCMDCache(caches) {\r\n if (!('Cache' in window.CookieMonsterData)) {\r\n window.CookieMonsterData.Cache = {};\r\n }\r\n\r\n Object.keys(caches).forEach((name) => {\r\n const exportName = name.replace(/^Cache/, '');\r\n\r\n if (typeof caches[name] === 'undefined') {\r\n window.CookieMonsterData.Cache[exportName] = undefined;\r\n } else {\r\n // Passing through JSON ensures that no references are retained.\r\n window.CookieMonsterData.Cache[exportName] = JSON.parse(JSON.stringify(caches[name]));\r\n }\r\n });\r\n}\r\n","import { ClickTimes, CookieTimes } from '../../Disp/VariablesAndData';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheAverageClicks,\r\n CacheAverageCPS,\r\n CacheAverageGainBank,\r\n CacheAverageGainChoEgg,\r\n CacheAverageGainWrink,\r\n CacheAverageGainWrinkFattest,\r\n CacheAvgCPSWithChoEgg,\r\n CacheLastChoEgg,\r\n CacheLastClicks,\r\n CacheLastCookies,\r\n CacheLastCPSCheck,\r\n CacheLastWrinkCookies,\r\n CacheLastWrinkFattestCookies,\r\n CacheRealCookiesEarned,\r\n CacheSellForChoEgg,\r\n CacheWrinklersFattest,\r\n CacheWrinklersTotal,\r\n ChoEggDiff,\r\n ClicksDiff,\r\n CookiesDiff,\r\n WrinkDiff,\r\n WrinkFattestDiff,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches two variables related average CPS and Clicks\r\n * It is called by CM.Cache.LoopCache()\r\n * @global\t{number}\tCM.Cache.RealCookiesEarned\tCookies earned including the Chocolate Egg\r\n * @global\t{number}\tCM.Cache.AvgCPS\t\t\t\tAverage cookies over time-period as defined by AvgCPSHist\r\n * @global\t{number}\tCM.Cache.AverageClicks\t\tAverage cookies from clicking over time-period as defined by AvgClicksHist\r\n * @global\t{number}\tCM.Cache.AvgCPSChoEgg\t\tAverage cookies from combination of normal CPS and average Chocolate Cookie CPS\r\n */\r\nexport default function CacheAvgCPS() {\r\n const currDate = Math.floor(Date.now() / 1000);\r\n // Only calculate every new second\r\n if ((Game.T / Game.fps) % 1 === 0) {\r\n let choEggTotal = Game.cookies + CacheSellForChoEgg;\r\n if (Game.cpsSucked > 0) choEggTotal += CacheWrinklersTotal;\r\n CacheRealCookiesEarned = Math.max(Game.cookiesEarned, choEggTotal);\r\n choEggTotal *= 0.05;\r\n\r\n // Add recent gains to AvgQueue's\r\n const timeDiff = currDate - CacheLastCPSCheck;\r\n const bankDiffAvg = Math.max(0, Game.cookies - CacheLastCookies) / timeDiff;\r\n const wrinkDiffAvg = Math.max(0, CacheWrinklersTotal - CacheLastWrinkCookies) / timeDiff;\r\n const wrinkFattestDiffAvg =\r\n Math.max(0, CacheWrinklersFattest[0] - CacheLastWrinkFattestCookies) / timeDiff;\r\n const choEggDiffAvg = Math.max(0, choEggTotal - CacheLastChoEgg) / timeDiff;\r\n const clicksDiffAvg = (Game.cookieClicks - CacheLastClicks) / timeDiff;\r\n for (let i = 0; i < timeDiff; i++) {\r\n CookiesDiff.addLatest(bankDiffAvg);\r\n WrinkDiff.addLatest(wrinkDiffAvg);\r\n WrinkFattestDiff.addLatest(wrinkFattestDiffAvg);\r\n ChoEggDiff.addLatest(choEggDiffAvg);\r\n ClicksDiff.addLatest(clicksDiffAvg);\r\n }\r\n\r\n // Store current data for next loop\r\n CacheLastCPSCheck = currDate;\r\n CacheLastCookies = Game.cookies;\r\n CacheLastWrinkCookies = CacheWrinklersTotal;\r\n CacheLastWrinkFattestCookies = CacheWrinklersFattest[0];\r\n CacheLastChoEgg = choEggTotal;\r\n CacheLastClicks = Game.cookieClicks;\r\n\r\n // Get average gain over period of cpsLength seconds\r\n const cpsLength =\r\n CookieTimes[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist];\r\n CacheAverageGainBank = CookiesDiff.calcAverage(cpsLength);\r\n CacheAverageGainWrink = WrinkDiff.calcAverage(cpsLength);\r\n CacheAverageGainWrinkFattest = WrinkFattestDiff.calcAverage(cpsLength);\r\n CacheAverageGainChoEgg = ChoEggDiff.calcAverage(cpsLength);\r\n CacheAverageCPS = CacheAverageGainBank;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 1)\r\n CacheAverageCPS += CacheAverageGainWrink;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 2)\r\n CacheAverageCPS += CacheAverageGainWrinkFattest;\r\n\r\n const choEgg = Game.HasUnlocked('Chocolate egg') && !Game.Has('Chocolate egg');\r\n\r\n if (\r\n choEgg ||\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 0\r\n ) {\r\n CacheAvgCPSWithChoEgg =\r\n CacheAverageGainBank + CacheAverageGainWrink + (choEgg ? CacheAverageGainChoEgg : 0);\r\n } else CacheAvgCPSWithChoEgg = CacheAverageCPS;\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n CacheAverageClicks = ClicksDiff.calcAverage(\r\n ClickTimes[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist],\r\n );\r\n }\r\n\r\n FillCMDCache({\r\n CacheRealCookiesEarned,\r\n CacheLastCPSCheck,\r\n CacheLastCookies,\r\n CacheLastWrinkCookies,\r\n CacheLastWrinkFattestCookies,\r\n CacheLastChoEgg,\r\n CacheLastClicks,\r\n CacheAverageGainBank,\r\n CacheAverageGainWrink,\r\n CacheAverageGainWrinkFattest,\r\n CacheAverageGainChoEgg,\r\n CacheAverageCPS,\r\n CacheAvgCPSWithChoEgg,\r\n CacheAverageClicks,\r\n });\r\n}\r\n","/**\r\n * This function calculates the total price for buying \"increase\" of a building\r\n * @param\t{string}\tbuild\t\tName of the building\r\n * @param\t{number}\tbasePrice\tBase Price of building\r\n * @param\t{number}\tstart\t\tStarting amount of building\r\n * @param\t{number}\tfree\t\tFree amount of building\r\n * @param\t{number}\tincrease\tIncrease of building\r\n * @returns {number}\tmoni\t\tTotal price\r\n */\r\nexport default function BuildingGetPrice(build, basePrice, start, free, increase) {\r\n let partialPrice = 0;\r\n for (let i = Math.max(0, start); i < Math.max(0, start + increase); i++) {\r\n partialPrice += Game.priceIncrease ** Math.max(0, i - free);\r\n }\r\n let price = basePrice * partialPrice;\r\n price = Game.modifyBuildingPrice(Game.Objects[build], price);\r\n return Math.ceil(price);\r\n}\r\n","import GetWrinkConfigBank from '../../Disp/HelperFunctions/GetWrinkConfigBank';\r\nimport { ColourGray } from '../../Disp/VariablesAndData';\r\nimport BuildingGetPrice from '../../Sim/SimulationEvents/BuyBuilding';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheMinPP,\r\n CacheMinPPBulk,\r\n CacheObjects1,\r\n CacheObjects10,\r\n CacheObjects100,\r\n CachePPArray,\r\n} from '../VariablesAndData';\r\nimport ColourOfPP from './ColourOfPP';\r\n\r\n/**\r\n * This functions caches the buildings of bulk-buy mode when PP is compared against optimal single-purchase building\r\n * It saves all date in CM.Cache.Objects...\r\n * It is called by CM.Cache.CacheBuildingsPP()\r\n */\r\nfunction CacheColour(target, amount) {\r\n Object.keys(target).forEach((i) => {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPRigidelMode &&\r\n amount === 1\r\n ) {\r\n target[i].colour = ColourGray; // eslint-disable-line no-param-reassign\r\n return;\r\n }\r\n // eslint-disable-next-line no-param-reassign\r\n target[i].colour = ColourOfPP(\r\n target[i],\r\n BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n amount,\r\n ),\r\n );\r\n // Colour based on excluding certain top-buildings\r\n for (\r\n let j = 0;\r\n j < Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop;\r\n j++\r\n ) {\r\n if (target[i].pp === CachePPArray[j][0]) target[i].colour = ColourGray; // eslint-disable-line no-param-reassign\r\n }\r\n });\r\n}\r\n\r\nfunction CachePP(target, amount) {\r\n Object.keys(target).forEach((i) => {\r\n const price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n amount,\r\n );\r\n if (Game.cookiesPs) {\r\n target[i].pp = // eslint-disable-line no-param-reassign\r\n Math.max(price - (Game.cookies + GetWrinkConfigBank()), 0) / Game.cookiesPs +\r\n price / target[i].bonus;\r\n } else target[i].pp = price / target[i].bonus; // eslint-disable-line no-param-reassign\r\n if (\r\n !(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPRigidelMode &&\r\n amount === 1\r\n )\r\n )\r\n CachePPArray.push([target[i].pp, amount, price]);\r\n });\r\n}\r\n\r\n/**\r\n * This functions caches the PP of each building it saves all date in CM.Cache.Objects...\r\n * It is called by CM.Cache.CachePP()\r\n */\r\nexport default function CacheBuildingsPP() {\r\n CacheMinPP = Infinity;\r\n CachePPArray = [];\r\n if (\r\n typeof Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop ===\r\n 'undefined'\r\n )\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop = 0; // Otherwise breaks during initialization\r\n\r\n // Calculate PP and colours\r\n CachePP(CacheObjects1, 1);\r\n CachePP(CacheObjects10, 10);\r\n CachePP(CacheObjects100, 100);\r\n\r\n // Set CM.Cache.min to best non-excluded buidliung\r\n CachePPArray.sort((a, b) => a[0] - b[0]);\r\n let indexOfMin = Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPOnlyConsiderBuyable) {\r\n while (CachePPArray[indexOfMin][2] > Game.cookies) {\r\n indexOfMin += 1;\r\n if (CachePPArray.length === indexOfMin + 1) {\r\n break;\r\n }\r\n }\r\n }\r\n CacheMinPP = CachePPArray[indexOfMin][0];\r\n CacheMinPPBulk = CachePPArray[indexOfMin][1];\r\n\r\n CacheColour(CacheObjects1, 1);\r\n CacheColour(CacheObjects10, 10);\r\n CacheColour(CacheObjects100, 100);\r\n\r\n FillCMDCache({ CacheMinPP, CacheMinPPBulk, CachePPArray });\r\n}\r\n","/**\r\n * Section: Functions related to caching PP */\r\n\r\nimport { CacheObjects1, CacheObjects10, CacheObjects100, CacheUpgrades } from '../VariablesAndData';\r\nimport CacheBuildingsPP from './Building';\r\nimport CacheUpgradePP from './Upgrade';\r\n\r\n/**\r\n * This functions caches the PP of each building and upgrade and stores it in the cache\r\n * It is called by CM.Cache.LoopCache() and CM.Cache.InitCache()\r\n */\r\nexport default function CachePP() {\r\n CacheBuildingsPP();\r\n CacheUpgradePP();\r\n window.CookieMonsterData.Objects1 = JSON.parse(JSON.stringify(CacheObjects1));\r\n window.CookieMonsterData.Objects10 = JSON.parse(JSON.stringify(CacheObjects10));\r\n window.CookieMonsterData.Objects100 = JSON.parse(JSON.stringify(CacheObjects100));\r\n window.CookieMonsterData.Upgrades = [];\r\n Object.entries(CacheUpgrades).forEach((i) => {\r\n window.CookieMonsterData.Upgrades[i[0]] = JSON.parse(JSON.stringify(i[1]));\r\n });\r\n}\r\n","import GetWrinkConfigBank from '../../Disp/HelperFunctions/GetWrinkConfigBank';\r\nimport { CacheUpgrades } from '../VariablesAndData';\r\nimport ColourOfPP from './ColourOfPP';\r\n\r\n/**\r\n * This functions caches the PP of each building it saves all date in CM.Cache.Upgrades\r\n * It is called by CM.Cache.CachePP()\r\n */\r\nexport default function CacheUpgradePP() {\r\n Object.keys(CacheUpgrades).forEach((i) => {\r\n if (Game.cookiesPs) {\r\n CacheUpgrades[i].pp =\r\n Math.max(Game.Upgrades[i].getPrice() - (Game.cookies + GetWrinkConfigBank()), 0) /\r\n Game.cookiesPs +\r\n Game.Upgrades[i].getPrice() / CacheUpgrades[i].bonus;\r\n } else CacheUpgrades[i].pp = Game.Upgrades[i].getPrice() / CacheUpgrades[i].bonus;\r\n if (Number.isNaN(CacheUpgrades[i].pp)) CacheUpgrades[i].pp = Infinity;\r\n\r\n CacheUpgrades[i].colour = ColourOfPP(CacheUpgrades[i], Game.Upgrades[i].getPrice());\r\n });\r\n}\r\n","import CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport SimAuraMult from '../ReplacedGameFunctions/SimAuraMult';\r\nimport SimEff from '../ReplacedGameFunctions/SimEff';\r\nimport SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport SimHasGod from '../ReplacedGameFunctions/SimHasGod';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport {\r\n SimAchievementsOwned,\r\n SimCookiesPs,\r\n SimObjects,\r\n SimPledges,\r\n SimUpgrades,\r\n SimUpgradesOwned, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates the cookies per click\r\n * It is called by CM.Sim.BuyUpgradesBonusIncome() when an upgrades has no bonus-income (and is thus a clicking-upgrade)\r\n * @returns\t{number}\tout\tThe clicking power\r\n */\r\nfunction MouseCps() {\r\n let add = 0;\r\n if (SimHas('Thousand fingers')) add += 0.1;\r\n if (SimHas('Million fingers')) add *= 5;\r\n if (SimHas('Billion fingers')) add *= 10;\r\n if (SimHas('Trillion fingers')) add *= 20;\r\n if (SimHas('Quadrillion fingers')) add *= 20;\r\n if (SimHas('Quintillion fingers')) add *= 20;\r\n if (SimHas('Sextillion fingers')) add *= 20;\r\n if (SimHas('Septillion fingers')) add *= 20;\r\n if (SimHas('Octillion fingers')) add *= 20;\r\n if (SimHas('Nonillion fingers')) add *= 20;\r\n if (SimHas('Decillion fingers')) add *= 20;\r\n if (SimHas('Undecillion fingers')) add *= 20;\r\n if (SimHas('Unshackled cursors')) add *= 25;\r\n let num = 0;\r\n Object.keys(SimObjects).forEach((i) => {\r\n num += SimObjects[i].amount;\r\n });\r\n num -= SimObjects.Cursor.amount;\r\n add *= num;\r\n\r\n // Can use SimCookiesPs as function is always called after CM.Sim.CalculateGains()\r\n if (SimHas('Plastic mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Iron mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Titanium mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Adamantium mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Unobtainium mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Eludium mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Wishalloy mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Fantasteel mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Nevercrack mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Armythril mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Technobsidian mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Plasmarble mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Miraculite mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Aetherice mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Omniplast mouse')) add += SimCookiesPs * 0.01;\r\n\r\n if (SimHas('Fortune #104')) add += SimCookiesPs * 0.01;\r\n\r\n let mult = 1;\r\n if (SimHas(\"Santa's helpers\")) mult *= 1.1;\r\n if (SimHas('Cookie egg')) mult *= 1.1;\r\n if (SimHas('Halo gloves')) mult *= 1.1;\r\n if (SimHas('Dragon claw')) mult *= 1.03;\r\n\r\n if (SimHas('Aura gloves')) {\r\n mult *= 1 + 0.05 * Math.min(Game.Objects.Cursor.level, SimHas('Luminous gloves') ? 20 : 10);\r\n }\r\n\r\n mult *= SimEff('click');\r\n if (SimObjects.Temple.minigameLoaded) {\r\n if (SimHasGod) {\r\n const godLvl = SimHasGod('labor');\r\n if (godLvl === 1) mult *= 1.15;\r\n else if (godLvl === 2) mult *= 1.1;\r\n else if (godLvl === 3) mult *= 1.05;\r\n }\r\n }\r\n\r\n Object.keys(Game.buffs).forEach((i) => {\r\n if (typeof Game.buffs[i].multClick !== 'undefined') mult *= Game.buffs[i].multClick;\r\n });\r\n\r\n // if (CM.Sim.auraMult('Dragon Cursor')) mult*=1.05;\r\n mult *= 1 + SimAuraMult('Dragon Cursor') * 0.05;\r\n\r\n // No need to make this function a CM function\r\n let out =\r\n mult *\r\n Game.ComputeCps(\r\n 1,\r\n SimHas('Reinforced index finger') +\r\n SimHas('Carpal tunnel prevention cream') +\r\n SimHas('Ambidextrous'),\r\n add,\r\n );\r\n\r\n out = Game.runModHookOnValue('cookiesPerClick', out);\r\n\r\n if (Game.hasBuff('Cursed finger')) out = Game.buffs['Cursed finger'].power;\r\n\r\n return out;\r\n}\r\n\r\n/**\r\n * This function calculates the bonus income of buying a building\r\n * It is called by CM.Cache.CacheBuildingIncome()\r\n * @param\t{string}\t\t\t\tbuilding\tThe name of the upgrade to be bought\r\n * @returns {[{number, number}]}\t\t\t\tThe bonus income of the upgrade and the difference in MouseCPS\r\n */\r\nexport default function BuyUpgradesBonusIncome(upgrade) {\r\n if (\r\n Game.Upgrades[upgrade].pool === 'toggle' ||\r\n (Game.Upgrades[upgrade].bought === 0 &&\r\n Game.Upgrades[upgrade].unlocked &&\r\n Game.Upgrades[upgrade].pool !== 'prestige')\r\n ) {\r\n CopyData();\r\n if (SimUpgrades[upgrade].name === 'Shimmering veil [on]') {\r\n SimUpgrades['Shimmering veil [off]'].bought = 0;\r\n } else if (SimUpgrades[upgrade].name === 'Golden switch [on]') {\r\n SimUpgrades['Golden switch [off]'].bought = 0;\r\n } else {\r\n SimUpgrades[upgrade].bought = (SimUpgrades[upgrade].bought + 1) % 2;\r\n }\r\n if (Game.CountsAsUpgradeOwned(Game.Upgrades[upgrade].pool)) SimUpgradesOwned += 1;\r\n\r\n if (upgrade === 'Elder Pledge') {\r\n SimPledges += 1;\r\n if (SimPledges > 0) SimWin('Elder nap');\r\n if (SimPledges >= 5) SimWin('Elder slumber');\r\n } else if (upgrade === 'Elder Covenant') {\r\n SimWin('Elder calm');\r\n } else if (upgrade === 'Prism heart biscuits') {\r\n SimWin('Lovely cookies');\r\n } else if (upgrade === 'Heavenly key') {\r\n SimWin('Wholesome');\r\n }\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n\r\n const diffMouseCPS = MouseCps() - Game.computedMouseCps;\r\n if (diffMouseCPS) {\r\n return [SimCookiesPs - Game.cookiesPs, diffMouseCPS];\r\n }\r\n return [SimCookiesPs - Game.cookiesPs];\r\n }\r\n return [];\r\n}\r\n","/** Section: Functions related to caching income */\r\n\r\nimport BuildingGetPrice from '../../Sim/SimulationEvents/BuyBuilding';\r\nimport BuyBuildingsBonusIncome from '../../Sim/SimulationEvents/BuyBuildingBonusIncome';\r\nimport BuyUpgradesBonusIncome from '../../Sim/SimulationEvents/BuyUpgrades';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheAverageGainBank,\r\n CacheAverageGainWrink,\r\n CacheAverageGainWrinkFattest,\r\n CacheDoRemakeBuildPrices, // eslint-disable-line no-unused-vars\r\n CacheObjects1,\r\n CacheObjects10,\r\n CacheObjects100,\r\n CacheObjectsNextAchievement,\r\n CacheUpgrades,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions starts the calculation/simulation of the bonus income of buildings\r\n * It is called by CM.Cache.CacheIncome()\r\n * @param\t{amount}\tamount\tAmount to be bought\r\n * @parem\t{string}\ttarget\tThe target Cache object (\"Objects1\", \"Objects10\" or \"Objects100\")\r\n */\r\nfunction CacheBuildingIncome(amount) {\r\n const result = {};\r\n Object.keys(Game.Objects).forEach((i) => {\r\n result[i] = {};\r\n result[i].bonus = BuyBuildingsBonusIncome(i, amount);\r\n if (amount !== 1) {\r\n CacheDoRemakeBuildPrices = 1;\r\n }\r\n });\r\n return result;\r\n}\r\n\r\n/**\r\n * This functions starts the calculation/simulation of the bonus income of upgrades\r\n * It is called by CM.Cache.CacheIncome()\r\n */\r\nfunction CacheUpgradeIncome() {\r\n CacheUpgrades = {};\r\n for (let i = 0; i < Game.UpgradesInStore.length; i++) {\r\n const upgradeName = Game.UpgradesInStore[i].name;\r\n const bonusIncome = BuyUpgradesBonusIncome(upgradeName);\r\n if (upgradeName === 'Elder Pledge') {\r\n CacheUpgrades[upgradeName] = {\r\n bonus: Game.cookiesPs - CacheAverageGainBank,\r\n };\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 1)\r\n CacheUpgrades[upgradeName].bonus -= CacheAverageGainWrink;\r\n else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 2)\r\n CacheUpgrades[upgradeName].bonus -= CacheAverageGainWrinkFattest;\r\n if (!Number.isFinite(CacheUpgrades[upgradeName].bonus)) CacheUpgrades[upgradeName].bonus = 0;\r\n } else {\r\n CacheUpgrades[upgradeName] = {};\r\n if (bonusIncome[0]) CacheUpgrades[upgradeName].bonus = bonusIncome[0];\r\n if (bonusIncome[1]) CacheUpgrades[upgradeName].bonusMouse = bonusIncome[1];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * This functions caches the price of each building and stores it in the cache\r\n */\r\nexport function CacheBuildingsPrices() {\r\n Object.keys(Game.Objects).forEach((i) => {\r\n CacheObjects1[i].price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n 1,\r\n );\r\n CacheObjects10[i].price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n 10,\r\n );\r\n CacheObjects100[i].price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n 100,\r\n );\r\n CacheObjectsNextAchievement[i].price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n CacheObjectsNextAchievement[i].AmountNeeded,\r\n );\r\n });\r\n\r\n FillCMDCache({ CacheObjectsNextAchievement });\r\n}\r\n\r\n/**\r\n * This functions caches the income gain of each building and upgrade and stores it in the cache\r\n * It is called by CM.Main.Loop() and CM.Cache.InitCache()\r\n */\r\nexport function CacheIncome() {\r\n // Simulate Building Buys for 1, 10 and 100 amount\r\n CacheObjects1 = CacheBuildingIncome(1);\r\n CacheObjects10 = CacheBuildingIncome(10);\r\n CacheObjects100 = CacheBuildingIncome(100);\r\n\r\n // Simulate Upgrade Buys\r\n CacheUpgradeIncome();\r\n}\r\n","import GetCPSBuffMult from '../CPS/GetCPSBuffMult';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheChainFrenzyMaxReward,\r\n CacheChainFrenzyRequired,\r\n CacheChainFrenzyRequiredNext,\r\n CacheChainFrenzyWrathMaxReward,\r\n CacheChainFrenzyWrathRequired,\r\n CacheChainFrenzyWrathRequiredNext,\r\n CacheChainMaxReward,\r\n CacheChainRequired,\r\n CacheChainRequiredNext,\r\n CacheChainWrathMaxReward,\r\n CacheChainWrathRequired,\r\n CacheChainWrathRequiredNext,\r\n CacheDragonsFortuneMultAdjustment,\r\n CacheGoldenCookiesMult,\r\n CacheNoGoldSwitchCookiesPS,\r\n CacheWrathCookiesMult,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions calculates the max possible payout given a set of variables\r\n * It is called by CM.Disp.CreateStatsChainSection() and CM.Cache.CacheChain()\r\n * @param\t{number}\t\t\t\t\tdigit\t\tNumber of Golden Cookies in chain\r\n * @param\t{number}\t\t\t\t\tmaxPayout\tMaximum payout\r\n * @param\t{number}\t\t\t\t\tmult\t\tMultiplier\r\n * @returns\t[{number, number, number}]\t\t\t\tTotal cookies earned, cookie needed for this and next level\r\n */\r\nexport function MaxChainCookieReward(digit, maxPayout, mult) {\r\n let totalFromChain = 0;\r\n let moni = 0;\r\n let nextMoni = 0;\r\n let nextRequired = 0;\r\n let chain = 1 + Math.max(0, Math.ceil(Math.log(Game.cookies) / Math.LN10) - 10);\r\n while (nextMoni < maxPayout * mult) {\r\n moni = Math.max(\r\n digit,\r\n Math.min(Math.floor((1 / 9) * 10 ** chain * digit * mult), maxPayout * mult),\r\n );\r\n nextMoni = Math.max(\r\n digit,\r\n Math.min(Math.floor((1 / 9) * 10 ** (chain + 1) * digit * mult), maxPayout * mult),\r\n );\r\n nextRequired = Math.floor((1 / 9) * 10 ** (chain + 1) * digit * mult);\r\n totalFromChain += moni;\r\n chain += 1;\r\n }\r\n return [totalFromChain, moni, nextRequired];\r\n}\r\n\r\n/**\r\n * This functions caches data related to Chain Cookies reward from Golden Cookioes\r\n * It is called by CM.Main.Loop() upon changes to cps and CM.Cache.InitCache()\r\n * @global\t[{number, number}]\tCM.Cache.ChainMaxReward\t\t\tTotal cookies earned, and cookies needed for next level for normal chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainRequired\t\t\tCookies needed for maximum reward for normal chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainRequiredNext\t\tTotal cookies needed for next level for normal chain\r\n * @global\t[{number, number}]\tCM.Cache.ChainMaxWrathReward\t\t\tTotal cookies earned, and cookies needed for next level for wrath chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainWrathRequired\t\t\tCookies needed for maximum reward for wrath chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainWrathRequiredNext\t\tTotal cookies needed for next level for wrath chain\r\n * @global\t[{number, number}]\tCM.Cache.ChainFrenzyMaxReward\t\t\tTotal cookies earned, and cookies needed for next level for normal frenzy chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainFrenzyRequired\t\t\tCookies needed for maximum reward for normal frenzy chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainFrenzyRequiredNext\t\tTotal cookies needed for next level for normal frenzy chain\r\n * @global\t[{number, number}]\tCM.Cache.ChainFrenzyWrathMaxReward\t\t\tTotal cookies earned, and cookies needed for next level for wrath frenzy chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainFrenzyWrathRequired\t\t\tCookies needed for maximum reward for wrath frenzy chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainFrenzyWrathRequiredNext\t\tTotal cookies needed for next level for wrath frenzy chain\r\n */\r\nexport function CacheChain() {\r\n let maxPayout = CacheNoGoldSwitchCookiesPS * 60 * 60 * 6 * CacheDragonsFortuneMultAdjustment;\r\n // Removes effect of Frenzy etc.\r\n const cpsBuffMult = GetCPSBuffMult();\r\n if (cpsBuffMult > 0) maxPayout /= cpsBuffMult;\r\n else maxPayout = 0;\r\n\r\n CacheChainMaxReward = MaxChainCookieReward(7, maxPayout, CacheGoldenCookiesMult);\r\n CacheChainRequired = (CacheChainMaxReward[1] * 2) / CacheGoldenCookiesMult;\r\n CacheChainRequiredNext = CacheChainMaxReward[2] / 60 / 60 / 6 / CacheDragonsFortuneMultAdjustment;\r\n\r\n CacheChainWrathMaxReward = MaxChainCookieReward(6, maxPayout, CacheWrathCookiesMult);\r\n CacheChainWrathRequired = (CacheChainWrathMaxReward[1] * 2) / CacheWrathCookiesMult;\r\n CacheChainWrathRequiredNext =\r\n CacheChainWrathMaxReward[2] / 60 / 60 / 6 / CacheDragonsFortuneMultAdjustment;\r\n\r\n CacheChainFrenzyMaxReward = MaxChainCookieReward(7, maxPayout * 7, CacheGoldenCookiesMult);\r\n CacheChainFrenzyRequired = (CacheChainFrenzyMaxReward[1] * 2) / CacheGoldenCookiesMult;\r\n CacheChainFrenzyRequiredNext =\r\n CacheChainFrenzyMaxReward[2] / 60 / 60 / 6 / CacheDragonsFortuneMultAdjustment;\r\n\r\n CacheChainFrenzyWrathMaxReward = MaxChainCookieReward(6, maxPayout * 7, CacheWrathCookiesMult);\r\n CacheChainFrenzyWrathRequired = (CacheChainFrenzyWrathMaxReward[1] * 2) / CacheWrathCookiesMult;\r\n CacheChainFrenzyWrathRequiredNext =\r\n CacheChainFrenzyWrathMaxReward[2] / 60 / 60 / 6 / CacheDragonsFortuneMultAdjustment;\r\n\r\n FillCMDCache({\r\n CacheChainMaxReward,\r\n CacheChainRequired,\r\n CacheChainRequiredNext,\r\n CacheChainWrathMaxReward,\r\n CacheChainWrathRequired,\r\n CacheChainWrathRequiredNext,\r\n CacheChainFrenzyMaxReward,\r\n CacheChainFrenzyRequired,\r\n CacheChainFrenzyRequiredNext,\r\n CacheChainFrenzyWrathMaxReward,\r\n CacheChainFrenzyWrathRequired,\r\n CacheChainFrenzyWrathRequiredNext,\r\n });\r\n}\r\n","import FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheHCPerSecond,\r\n CacheLastHeavenlyCheck,\r\n CacheLastHeavenlyChips,\r\n HeavenlyChipsDiff,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the heavenly chips per second in the last five seconds\r\n * It is called by CM.Cache.LoopCache()\r\n * @global\t{number}\tCM.Cache.HCPerSecond\tThe Heavenly Chips per second in the last five seconds\r\n */\r\nexport default function CacheHeavenlyChipsPS() {\r\n const currDate = Math.floor(Date.now() / 1000);\r\n // Only calculate every new second\r\n if ((Game.T / Game.fps) % 1 === 0) {\r\n const chipsOwned = Game.HowMuchPrestige(Game.cookiesReset);\r\n const ascendNowToOwn = Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned));\r\n const ascendNowToGet = ascendNowToOwn - Math.floor(chipsOwned);\r\n\r\n // Add recent gains to AvgQueue's\r\n const timeDiff = currDate - CacheLastHeavenlyCheck;\r\n const heavenlyChipsDiffAvg = Math.max(0, ascendNowToGet - CacheLastHeavenlyChips) / timeDiff;\r\n for (let i = 0; i < timeDiff; i++) {\r\n HeavenlyChipsDiff.addLatest(heavenlyChipsDiffAvg);\r\n }\r\n\r\n // Store current data for next loop\r\n CacheLastHeavenlyCheck = currDate;\r\n CacheLastHeavenlyChips = ascendNowToGet;\r\n\r\n // Get average gain over period of 5 seconds\r\n CacheHCPerSecond = HeavenlyChipsDiff.calcAverage(5);\r\n }\r\n\r\n FillCMDCache({ CacheLastHeavenlyCheck, CacheLastHeavenlyChips, CacheHCPerSecond });\r\n}\r\n","import { crateMissing } from '../../Disp/MenuSections/Statistics/CreateMissingUpgrades';\r\nimport {\r\n CacheMissingUpgrades, // eslint-disable-line no-unused-vars\r\n CacheMissingUpgradesCookies, // eslint-disable-line no-unused-vars\r\n CacheMissingUpgradesPrestige, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches variables related to missing upgrades\r\n * It is called by CM.Main.Loop() and CM.Cache.InitCache()\r\n * @global\t{string}\tCM.Cache.MissingUpgrades\t\t\tString containig the HTML to create the \"crates\" for missing normal upgrades\r\n * @global\t{string}\tCM.Cache.MissingUpgradesCookies\t\tString containig the HTML to create the \"crates\" for missing cookie upgrades\r\n * @global\t{string}\tCM.Cache.MissingUpgradesPrestige\tString containig the HTML to create the \"crates\" for missing prestige upgrades\r\n */\r\nexport default function CacheAllMissingUpgrades() {\r\n CacheMissingUpgrades = '';\r\n CacheMissingUpgradesCookies = '';\r\n CacheMissingUpgradesPrestige = '';\r\n const list = [];\r\n // sort the upgrades\r\n Object.keys(Game.Upgrades).forEach((i) => {\r\n list.push(Game.Upgrades[i]);\r\n });\r\n const sortMap = function (a, b) {\r\n if (a.order > b.order) return 1;\r\n if (a.order < b.order) return -1;\r\n return 0;\r\n };\r\n list.sort(sortMap);\r\n\r\n Object.keys(list).forEach((i) => {\r\n const me = list[i];\r\n\r\n if (me.bought === 0) {\r\n let str = '';\r\n\r\n str += crateMissing(me);\r\n /* eslint-disable no-unused-vars */\r\n if (me.pool === 'prestige') CacheMissingUpgradesPrestige += str;\r\n else if (me.pool === 'cookie') CacheMissingUpgradesCookies += str;\r\n else if (me.pool !== 'toggle' && me.pool !== 'unused' && me.pool !== 'debug')\r\n CacheMissingUpgrades += str;\r\n /* eslint-enable no-unused-vars */\r\n }\r\n });\r\n}\r\n","/** Functions related to displaying the missing upgrades in the Statistics page */\r\n\r\nimport {\r\n CacheMissingUpgrades,\r\n CacheMissingUpgradesCookies,\r\n CacheMissingUpgradesPrestige,\r\n} from '../../../Cache/VariablesAndData';\r\n\r\n/**\r\n * This function creates the missing upgrades sections for prestige, normal and cookie upgrades\r\n */\r\nexport function AddMissingUpgrades() {\r\n l('menu').childNodes.forEach((menuSection) => {\r\n if (menuSection.children[0]) {\r\n if (menuSection.children[0].innerHTML === 'Prestige' && CacheMissingUpgradesPrestige) {\r\n const prestigeUpgradesMissing =\r\n CacheMissingUpgradesPrestige.match(new RegExp('div', 'g') || []).length / 2;\r\n const title = document.createElement('div');\r\n title.id = 'CMMissingUpgradesPrestigeTitle';\r\n title.className = 'listing';\r\n const titlefrag = document.createElement('div');\r\n titlefrag.innerHTML = `<b>Missing Prestige upgrades:</b> ${prestigeUpgradesMissing}/${\r\n Game.PrestigeUpgrades.length\r\n } (${Math.floor((prestigeUpgradesMissing / Game.PrestigeUpgrades.length) * 100)}%)`;\r\n title.appendChild(titlefrag);\r\n menuSection.appendChild(title);\r\n const upgrades = document.createElement('div');\r\n upgrades.className = 'listing crateBox';\r\n upgrades.innerHTML = CacheMissingUpgradesPrestige;\r\n menuSection.appendChild(upgrades);\r\n } else if (menuSection.children[0].innerHTML === 'Upgrades') {\r\n if (CacheMissingUpgrades) {\r\n const normalUpgradesMissing =\r\n CacheMissingUpgrades.match(new RegExp('div', 'g') || []).length / 2;\r\n const title = document.createElement('div');\r\n title.id = 'CMMissingUpgradesTitle';\r\n title.className = 'listing';\r\n const titlefrag = document.createElement('div');\r\n titlefrag.innerHTML = `<b>Missing normal upgrades:</b> ${normalUpgradesMissing}/${\r\n Game.UpgradesByPool[''].length + Game.UpgradesByPool.tech.length\r\n } (${Math.floor(\r\n (normalUpgradesMissing /\r\n (Game.UpgradesByPool[''].length + Game.UpgradesByPool.tech.length)) *\r\n 100,\r\n )}%)`;\r\n title.appendChild(titlefrag);\r\n menuSection.insertBefore(title, menuSection.childNodes[3]);\r\n const upgrades = document.createElement('div');\r\n upgrades.className = 'listing crateBox';\r\n upgrades.innerHTML = CacheMissingUpgrades;\r\n menuSection.insertBefore(\r\n upgrades,\r\n document.getElementById('CMMissingUpgradesTitle').nextSibling,\r\n );\r\n }\r\n if (CacheMissingUpgradesCookies) {\r\n const cookieUpgradesMissing =\r\n CacheMissingUpgradesCookies.match(new RegExp('div', 'g') || []).length / 2;\r\n const title = document.createElement('div');\r\n title.id = 'CMMissingUpgradesCookiesTitle';\r\n title.className = 'listing';\r\n const titlefrag = document.createElement('div');\r\n titlefrag.innerHTML = `<b>Missing Cookie upgrades:</b> ${cookieUpgradesMissing}/${\r\n Game.UpgradesByPool.cookie.length\r\n } (${Math.floor((cookieUpgradesMissing / Game.UpgradesByPool.cookie.length) * 100)}%)`;\r\n title.appendChild(titlefrag);\r\n menuSection.appendChild(title);\r\n const upgrades = document.createElement('div');\r\n upgrades.className = 'listing crateBox';\r\n upgrades.innerHTML = CacheMissingUpgradesCookies;\r\n menuSection.appendChild(upgrades);\r\n }\r\n }\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * This function returns the \"crates\" (icons) for missing upgrades in the stats sections\r\n * It returns a html string that gets appended to the respective CM.Cache.MissingUpgrades-variable by CM.Cache.CacheMissingUpgrades()\r\n * @param\t{object}\tme\tThe upgrade object\r\n * @returns\t{string}\t?\tThe HTML string that creates the icon.\r\n */\r\nexport function crateMissing(me) {\r\n let classes = 'crate upgrade missing';\r\n if (me.pool === 'prestige') classes += ' heavenly';\r\n\r\n let noFrame = 0;\r\n if (!Game.prefs.crates) noFrame = 1;\r\n if (noFrame) classes += ' noFrame';\r\n\r\n let { icon } = me;\r\n if (me.iconFunction) icon = me.iconFunction();\r\n const tooltip = `function() {return Game.crateTooltip(Game.UpgradesById[${me.id}], 'stats');}`;\r\n return `<div class=\"${classes}\"\r\n\t${Game.getDynamicTooltip(tooltip, 'top', true)}\r\n\tstyle = \"${`${icon[2] ? `background-image: url(${icon[2]});` : ''}background-position:${\r\n -icon[0] * 48\r\n }px ${-icon[1] * 48}px`};\">\r\n\t</div>`;\r\n}\r\n","import FillCMDCache from '../FillCMDCache';\r\nimport { CacheSeaSpec } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the reward of popping a reindeer\r\n * It is called by CM.Main.Loop() and CM.Cache.InitCache()\r\n * @global\t{number}\tCM.Cache.SeaSpec\tThe reward for popping a reindeer\r\n */\r\nexport default function CacheSeasonSpec() {\r\n if (Game.season === 'christmas') {\r\n let val = Game.cookiesPs * 60;\r\n if (Game.hasBuff('Elder frenzy')) val *= 0.5;\r\n if (Game.hasBuff('Frenzy')) val *= 0.75;\r\n CacheSeaSpec = Math.max(25, val);\r\n if (Game.Has('Ho ho ho-flavored frosting')) CacheSeaSpec *= 2;\r\n }\r\n\r\n FillCMDCache({ CacheSeaSpec });\r\n}\r\n","/** Functions related to Caching stats */\r\n\r\nimport SimHas from '../../Sim/ReplacedGameFunctions/SimHas';\r\nimport GetCPSBuffMult from '../CPS/GetCPSBuffMult';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheConjure,\r\n CacheConjureReward,\r\n CacheDragonsFortuneMultAdjustment,\r\n CacheEdifice,\r\n CacheEdificeBuilding,\r\n CacheGoldenCookiesMult,\r\n CacheLucky,\r\n CacheLuckyFrenzy,\r\n CacheLuckyReward,\r\n CacheLuckyRewardFrenzy,\r\n CacheLuckyWrathReward,\r\n CacheLuckyWrathRewardFrenzy,\r\n CacheNoGoldSwitchCookiesPS,\r\n CacheWrathCookiesMult,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches variables related to the stats page\r\n */\r\nexport function CacheStatsCookies() {\r\n CacheLucky = (CacheNoGoldSwitchCookiesPS * 900) / 0.15;\r\n CacheLucky *= CacheDragonsFortuneMultAdjustment;\r\n const cpsBuffMult = GetCPSBuffMult();\r\n if (cpsBuffMult > 0) CacheLucky /= cpsBuffMult;\r\n else CacheLucky = 0;\r\n CacheLuckyReward = CacheGoldenCookiesMult * (CacheLucky * 0.15) + 13;\r\n CacheLuckyWrathReward = CacheWrathCookiesMult * (CacheLucky * 0.15) + 13;\r\n CacheLuckyFrenzy = CacheLucky * 7;\r\n CacheLuckyRewardFrenzy = CacheGoldenCookiesMult * (CacheLuckyFrenzy * 0.15) + 13;\r\n CacheLuckyWrathRewardFrenzy = CacheWrathCookiesMult * (CacheLuckyFrenzy * 0.15) + 13;\r\n CacheConjure = CacheLucky * 2;\r\n CacheConjureReward = CacheConjure * 0.15;\r\n\r\n CacheEdifice = 0;\r\n let max = 0;\r\n let n = 0;\r\n Object.keys(Game.Objects).forEach((i) => {\r\n if (Game.Objects[i].amount > max) max = Game.Objects[i].amount;\r\n if (Game.Objects[i].amount > 0) n += 1;\r\n });\r\n Object.keys(Game.Objects).forEach((i) => {\r\n if (\r\n (Game.Objects[i].amount < max || n === 1) &&\r\n Game.Objects[i].amount < 400 &&\r\n Game.Objects[i].price * 2 > CacheEdifice\r\n ) {\r\n CacheEdifice = Game.Objects[i].price * 2;\r\n CacheEdificeBuilding = i;\r\n }\r\n });\r\n\r\n FillCMDCache({\r\n CacheLucky,\r\n CacheLuckyReward,\r\n CacheLuckyWrathReward,\r\n CacheLuckyFrenzy,\r\n CacheLuckyRewardFrenzy,\r\n CacheLuckyWrathRewardFrenzy,\r\n CacheConjure,\r\n CacheConjureReward,\r\n CacheEdifice,\r\n CacheEdificeBuilding,\r\n });\r\n}\r\n\r\n/**\r\n * This functions calculates the multipliers of Golden and Wrath cookie rewards\r\n */\r\nexport function CacheGoldenAndWrathCookiesMults() {\r\n let goldenMult = 1;\r\n let wrathMult = 1;\r\n let mult = 1;\r\n\r\n // Factor auras and upgrade in mults\r\n if (SimHas('Green yeast digestives')) mult *= 1.01;\r\n if (SimHas('Dragon fang')) mult *= 1.03;\r\n\r\n goldenMult *= 1 + Game.auraMult('Ancestral Metamorphosis') * 0.1;\r\n goldenMult *= Game.eff('goldenCookieGain');\r\n wrathMult *= 1 + Game.auraMult('Unholy Dominion') * 0.1;\r\n wrathMult *= Game.eff('wrathCookieGain');\r\n\r\n // Calculate final golden and wrath multipliers\r\n CacheGoldenCookiesMult = mult * goldenMult;\r\n CacheWrathCookiesMult = mult * wrathMult;\r\n\r\n // Calculate Dragon's Fortune multiplier adjustment:\r\n // If Dragon's Fortune (or Reality Bending) aura is active and there are currently no golden cookies,\r\n // compute a multiplier adjustment to apply on the current CPS to simulate 1 golden cookie on screen.\r\n // Otherwise, the aura effect will be factored in the base CPS making the multiplier not requiring adjustment.\r\n CacheDragonsFortuneMultAdjustment = 1;\r\n if (Game.shimmerTypes.golden.n === 0) {\r\n CacheDragonsFortuneMultAdjustment *= 1 + Game.auraMult(\"Dragon's Fortune\") * 1.23;\r\n }\r\n\r\n FillCMDCache({\r\n CacheGoldenCookiesMult,\r\n CacheWrathCookiesMult,\r\n CacheDragonsFortuneMultAdjustment,\r\n });\r\n}\r\n","import BuildingGetPrice from '../../Sim/SimulationEvents/BuyBuilding';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheObjectsNextAchievement } from '../VariablesAndData';\r\nimport IndividualAmountTillNextAchievement from './IndividualAmountTillNextAchievement';\r\n\r\n/**\r\n * This functions caches the amount of buildings needed till next achievement\r\n * @param\t{boolean}\tforceRecalc\tWhether a recalcution should be forced (after CPS change)\r\n */\r\nexport default function AllAmountTillNextAchievement(forceRecalc) {\r\n const result = {};\r\n\r\n Object.keys(Game.Objects).forEach((i) => {\r\n if (\r\n Object.keys(CacheObjectsNextAchievement).length !== 0 &&\r\n CacheObjectsNextAchievement[i].TotalNeeded > Game.Objects[i].amount &&\r\n !forceRecalc\r\n ) {\r\n result[i] = {\r\n AmountNeeded: CacheObjectsNextAchievement[i].TotalNeeded - Game.Objects[i].amount,\r\n TotalNeeded: CacheObjectsNextAchievement[i].TotalNeeded,\r\n price: BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n CacheObjectsNextAchievement[i].TotalNeeded - Game.Objects[i].amount,\r\n ),\r\n };\r\n } else {\r\n const tillNext = IndividualAmountTillNextAchievement(i);\r\n result[i] = {\r\n AmountNeeded: tillNext,\r\n TotalNeeded: Game.Objects[i].amount + tillNext,\r\n price: BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n tillNext,\r\n ),\r\n };\r\n }\r\n });\r\n CacheObjectsNextAchievement = result;\r\n\r\n FillCMDCache({ CacheObjectsNextAchievement });\r\n}\r\n","import BuyBuildingsBonusIncome from '../../Sim/SimulationEvents/BuyBuildingBonusIncome';\r\nimport { SimAchievementsOwned } from '../../Sim/VariablesAndData';\r\n\r\nexport default function IndividualAmountTillNextAchievement(building) {\r\n const AchievementsAtStart = Game.AchievementsOwned;\r\n let index = 100;\r\n let lastIndexWithChange = 100;\r\n while (index > -1) {\r\n BuyBuildingsBonusIncome(building, index);\r\n if (SimAchievementsOwned > AchievementsAtStart) {\r\n lastIndexWithChange = index;\r\n index -= 10;\r\n } else if (index === 100) {\r\n return 101;\r\n } else {\r\n index += 1;\r\n while (index <= lastIndexWithChange) {\r\n BuyBuildingsBonusIncome(building, index);\r\n if (SimAchievementsOwned > AchievementsAtStart) {\r\n return index;\r\n }\r\n index += 1;\r\n }\r\n }\r\n }\r\n return 101;\r\n}\r\n","/** Caches data related to Wrinklers */\r\n\r\nimport { SimObjects } from '../../Sim/VariablesAndData';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheWrinklersFattest,\r\n CacheWrinklersNormal,\r\n CacheWrinklersTotal,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches data related to Wrinklers\r\n * It is called by CM.Cache.LoopCache() and CM.Cache.InitCache()\r\n * @global\t{number}\t\t\t\tCM.Cache.WrinklersTotal\t\tThe cookies of all wrinklers\r\n * @global\t{number}\t\t\t\tCM.Cache.WrinklersNormal\tThe cookies of all normal wrinklers\r\n * @global\t{[{number}, {number}]}\tCM.Cache.WrinklersFattest\tA list containing the cookies and the id of the fattest non-shiny wrinkler\r\n */\r\nexport default function CacheWrinklers() {\r\n CacheWrinklersTotal = 0;\r\n CacheWrinklersNormal = 0;\r\n CacheWrinklersFattest = [0, null];\r\n for (let i = 0; i < Game.wrinklers.length; i++) {\r\n let { sucked } = Game.wrinklers[i];\r\n let toSuck = 1.1;\r\n if (Game.Has('Sacrilegious corruption')) toSuck *= 1.05;\r\n if (Game.wrinklers[i].type === 1) toSuck *= 3; // Shiny wrinklers\r\n sucked *= toSuck;\r\n if (Game.Has('Wrinklerspawn')) sucked *= 1.05;\r\n if (SimObjects.Temple.minigameLoaded) {\r\n const godLvl = Game.hasGod('scorn');\r\n if (godLvl === 1) sucked *= 1.15;\r\n else if (godLvl === 2) sucked *= 1.1;\r\n else if (godLvl === 3) sucked *= 1.05;\r\n }\r\n CacheWrinklersTotal += sucked;\r\n if (Game.wrinklers[i].type === 0) {\r\n CacheWrinklersNormal += sucked;\r\n if (sucked > CacheWrinklersFattest[0]) CacheWrinklersFattest = [sucked, i];\r\n }\r\n }\r\n\r\n FillCMDCache({ CacheWrinklersTotal, CacheWrinklersNormal, CacheWrinklersFattest });\r\n}\r\n","import { ClickTimes } from '../Disp/VariablesAndData';\r\nimport { CMAvgQueue, InitCookiesDiff } from './CPS/AverageQueue';\r\nimport CacheAvgCPS from './CPS/CPS';\r\nimport CacheDragonAuras from './Dragon/CacheDragonAuras';\r\nimport CachePP from './PP/PP';\r\nimport { CacheBuildingsPrices, CacheIncome } from './PriceAndIncome/PriceAndIncome';\r\nimport { CacheChain } from './Stats/ChainCookies';\r\nimport CacheHeavenlyChipsPS from './Stats/HeavenlyChips';\r\nimport CacheAllMissingUpgrades from './Stats/MissingUpgrades';\r\nimport CacheSeasonSpec from './Stats/Reindeer';\r\nimport { CacheGoldenAndWrathCookiesMults, CacheStatsCookies } from './Stats/Stats';\r\nimport AllAmountTillNextAchievement from './TillNextAchievement/AllAmountTillNextAchievement';\r\nimport { CacheAverageCookiesFromClicks, HeavenlyChipsDiff } from './VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport CacheWrinklers from './Wrinklers/Wrinklers';\r\n\r\n/**\r\n * This functions runs all cache-functions to generate all \"full\" cache\r\n */\r\nexport default function InitCache() {\r\n CacheDragonAuras();\r\n CacheWrinklers();\r\n CacheStatsCookies();\r\n CacheGoldenAndWrathCookiesMults();\r\n CacheChain();\r\n CacheAllMissingUpgrades();\r\n CacheSeasonSpec();\r\n InitCookiesDiff();\r\n /** Used by CM.Cache.CacheHeavenlyChipsPS() */\r\n HeavenlyChipsDiff = new CMAvgQueue(5);\r\n CacheAverageCookiesFromClicks = new CMAvgQueue(ClickTimes[ClickTimes.length - 1] * 20);\r\n CacheHeavenlyChipsPS();\r\n AllAmountTillNextAchievement();\r\n CacheAvgCPS();\r\n CacheIncome();\r\n CacheBuildingsPrices();\r\n CachePP();\r\n}\r\n","/**\r\n * This function pops all normal wrinklers\r\n * It is called by a click of the 'pop all' button created by CM.Disp.AddMenuStats()\r\n */\r\nexport default function PopAllNormalWrinklers() {\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n if (Game.wrinklers[i].sucked > 0 && Game.wrinklers[i].type === 0) {\r\n Game.wrinklers[i].hp = 0;\r\n }\r\n });\r\n}\r\n","import UpdateTooltips from './UpdateTooltips';\r\nimport { SimpleTooltipElements, TooltipName, TooltipType } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport BuildingGetPrice from '../../Sim/SimulationEvents/BuyBuilding';\r\nimport GetTimeColour from '../BeautifyAndFormatting/GetTimeColour';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\n\r\n/** All general functions related to creating and updating tooltips */\r\n\r\n/**\r\n * This function creates some very basic tooltips, (e.g., the tooltips in the stats page)\r\n * The tooltips are created with CM.Disp[placeholder].appendChild(desc)\r\n * @param\t{string}\tplaceholder\tThe name used to later refer and spawn the tooltip\r\n * @param\t{string}\ttext\t\tThe text of the tooltip\r\n * @param\t{string}\tminWidth\tThe minimum width of the tooltip\r\n */\r\nexport function CreateSimpleTooltip(placeholder, text, minWidth) {\r\n const Tooltip = document.createElement('div');\r\n Tooltip.id = placeholder;\r\n const desc = document.createElement('div');\r\n desc.style.minWidth = minWidth;\r\n desc.style.marginBottom = '4px';\r\n const div = document.createElement('div');\r\n div.style.textAlign = 'left';\r\n div.textContent = text;\r\n desc.appendChild(div);\r\n Tooltip.appendChild(desc);\r\n SimpleTooltipElements[placeholder] = Tooltip;\r\n}\r\n\r\n/**\r\n * This function enhance the standard tooltips by creating and changing l('tooltip')\r\n * The function is called by .onmouseover events that have replaced original code to use CM.Disp.Tooltip()\r\n * @param\t{string}\ttype\t\t\t\t\tType of tooltip (b, u, s or g)\r\n * @param\t{string}\tname\t\t\t\t\tName of the object/item the tooltip relates to\r\n * @returns {string}\tl('tooltip').innerHTML\tThe HTML of the l('tooltip')-object\r\n */\r\nexport function CreateTooltip(type, name) {\r\n if (type === 'b') {\r\n // Buildings\r\n l('tooltip').innerHTML = Game.Objects[name].tooltip();\r\n // Adds amortization info to the list of info per building\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipAmor === 1) {\r\n const buildPrice = BuildingGetPrice(\r\n name,\r\n Game.Objects[name].basePrice,\r\n 0,\r\n Game.Objects[name].free,\r\n Game.Objects[name].amount,\r\n );\r\n const amortizeAmount = buildPrice - Game.Objects[name].totalCookies;\r\n if (amortizeAmount > 0) {\r\n l('tooltip').innerHTML = l('tooltip')\r\n .innerHTML.split('so far</div>')\r\n .join(\r\n `so far<br/>• <b>${Beautify(amortizeAmount)}</b> ${\r\n Math.floor(amortizeAmount) === 1 ? 'cookie' : 'cookies'\r\n } left to amortize (${\r\n GetTimeColour(\r\n (buildPrice - Game.Objects[name].totalCookies) /\r\n (Game.Objects[name].storedTotalCps * Game.globalCpsMult),\r\n ).text\r\n })</div>`,\r\n );\r\n }\r\n }\r\n if (Game.buyMode === -1) {\r\n /*\r\n * Fix sell price displayed in the object tooltip.\r\n *\r\n * The buildings sell price displayed by the game itself (without any mod) is incorrect.\r\n * The following line of code fixes this issue, and can be safely removed when the game gets fixed.\r\n *\r\n * This issue is extensively detailed here: https://github.com/Aktanusa/CookieMonster/issues/359#issuecomment-735658262\r\n */\r\n l('tooltip').innerHTML = l('tooltip')\r\n .innerHTML.split(Beautify(Game.Objects[name].bulkPrice))\r\n .join(\r\n Beautify(\r\n (Game.Objects[name],\r\n Game.Objects[name].basePrice,\r\n Game.Objects[name].amount,\r\n Game.Objects[name].free,\r\n Game.buyBulk,\r\n 1),\r\n ),\r\n );\r\n }\r\n } else if (type === 'u') {\r\n // Upgrades\r\n if (!Game.UpgradesInStore[name]) return '';\r\n l('tooltip').innerHTML = Game.crateTooltip(Game.UpgradesInStore[name], 'store');\r\n } else if (type === 's') l('tooltip').innerHTML = Game.lumpTooltip();\r\n // Sugar Lumps\r\n else if (type === 'g')\r\n l('tooltip').innerHTML = Game.Objects['Wizard tower'].minigame.spellTooltip(name)();\r\n // Grimoire\r\n else if (type === 'p')\r\n l('tooltip').innerHTML = Game.ObjectsById[2].minigame.tileTooltip(name[0], name[1])();\r\n // Harvest all button in garden\r\n else if (type === 'ha') l('tooltip').innerHTML = Game.ObjectsById[2].minigame.toolTooltip(1)();\r\n // Stock market\r\n else if (type === 'sm') l('tooltip').innerHTML = Game.Objects.Bank.minigame.goodTooltip(name)();\r\n else if (type === 'wb') l('tooltip').innerHTML = '';\r\n else if (type === 'pag') l('tooltip').innerHTML = Game.Objects.Temple.minigame.godTooltip(name)();\r\n else if (type === 'pas')\r\n l('tooltip').innerHTML = Game.Objects.Temple.minigame.slotTooltip(name[0])();\r\n\r\n // Adds area for extra tooltip-sections\r\n if (\r\n (type === 'b' && Game.buyMode === 1) ||\r\n type === 'u' ||\r\n type === 's' ||\r\n type === 'g' ||\r\n (type === 'p' && !Game.keys[16]) ||\r\n type === 'ha' ||\r\n type === 'sm' ||\r\n type === 'wb' ||\r\n type === 'pag' ||\r\n (type === 'pas' && name[1] !== -1)\r\n ) {\r\n const area = document.createElement('div');\r\n area.id = 'CMTooltipArea';\r\n l('tooltip').appendChild(area);\r\n }\r\n\r\n // Sets global variables used by CM.Disp.UpdateTooltip()\r\n TooltipType = type;\r\n TooltipName = name;\r\n\r\n UpdateTooltips();\r\n\r\n return l('tooltip').innerHTML;\r\n}\r\n","import { CacheSpawnedGoldenShimmer } from '../../Cache/VariablesAndData';\r\nimport { LastGoldenCookieState } from '../../Main/VariablesAndData';\r\n\r\n/**\r\n * This function creates the Favicon, it is called by CM.Main.DelayInit()\r\n */\r\nexport function CreateFavicon() {\r\n const Favicon = document.createElement('link');\r\n Favicon.id = 'CMFavicon';\r\n Favicon.rel = 'shortcut icon';\r\n Favicon.href = 'https://orteil.dashnet.org/cookieclicker/favicon.ico';\r\n document.getElementsByTagName('head')[0].appendChild(Favicon);\r\n}\r\n\r\n/**\r\n * This function updates the Favicon depending on whether a Golden Cookie has spawned\r\n * By relying on CM.Cache.spawnedGoldenShimmer it only changes for non-user spawned cookie\r\n */\r\nexport function UpdateFavicon() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Favicon === 1 &&\r\n LastGoldenCookieState > 0\r\n ) {\r\n if (CacheSpawnedGoldenShimmer.wrath)\r\n l('CMFavicon').href =\r\n 'https://CookieMonsterTeam.github.io/CookieMonster/favicon/wrathCookie.ico';\r\n else\r\n l('CMFavicon').href =\r\n 'https://CookieMonsterTeam.github.io/CookieMonster/favicon/goldenCookie.ico';\r\n } else l('CMFavicon').href = 'https://orteil.dashnet.org/cookieclicker/favicon.ico';\r\n}\r\n","/** Functions used to create static objects of Buildings, Upgrades and Achievements */\r\n\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport { SimAchievements, SimObjects, SimUpgrades } from '../VariablesAndData';\r\nimport InitAchievement from './InitAchievement';\r\nimport InitialBuildingData from './InitialBuildingData';\r\nimport InitUpgrade from './InitUpgrade';\r\n\r\n/**\r\n * This function creates static objects for Buildings, Upgrades and Achievements\r\n */\r\nexport default function InitData() {\r\n // Buildings\r\n SimObjects = [];\r\n Object.keys(Game.Objects).forEach((i) => {\r\n SimObjects[i] = InitialBuildingData(i);\r\n });\r\n\r\n // Upgrades\r\n SimUpgrades = [];\r\n Object.keys(Game.Upgrades).forEach((i) => {\r\n SimUpgrades[i] = InitUpgrade(i);\r\n });\r\n\r\n // Achievements\r\n SimAchievements = [];\r\n Object.keys(Game.Achievements).forEach((i) => {\r\n SimAchievements[i] = InitAchievement(i);\r\n });\r\n CopyData();\r\n}\r\n","import { CreateTooltip } from '../../Disp/Tooltips/Tooltip';\r\nimport { TooltipGrimoireBackup } from '../VariablesAndData';\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of the Grimoire minigame\r\n */\r\nexport default function ReplaceTooltipGrimoire() {\r\n if (Game.Objects['Wizard tower'].minigameLoaded) {\r\n Object.keys(Game.Objects['Wizard tower'].minigame.spellsById).forEach((i) => {\r\n if (l(`grimoireSpell${i}`).onmouseover !== null) {\r\n TooltipGrimoireBackup[i] = l(`grimoireSpell${i}`).onmouseover;\r\n l(`grimoireSpell${i}`).onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('g', `${i}`), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n });\r\n }\r\n}\r\n","import FormatTime from '../../Disp/BeautifyAndFormatting/FormatTime';\r\nimport CalculateGrimoireRefillTime from '../../Disp/HelperFunctions/CalculateGrimoireRefillTime';\r\nimport {\r\n BackupGrimoireDraw,\r\n BackupGrimoireLaunch, // eslint-disable-line no-unused-vars\r\n BackupGrimoireLaunchMod,\r\n HasReplaceNativeGrimoireDraw,\r\n HasReplaceNativeGrimoireLaunch,\r\n} from '../VariablesAndData';\r\nimport ReplaceTooltipGrimoire from './TooltipGrimoire';\r\n\r\n/**\r\n * This function fixes replaces the .draw function of the Grimoire\r\n */\r\nfunction ReplaceNativeGrimoireDraw() {\r\n if (!HasReplaceNativeGrimoireDraw && Game.Objects['Wizard tower'].minigameLoaded) {\r\n const { minigame } = Game.Objects['Wizard tower'];\r\n BackupGrimoireDraw = minigame.draw;\r\n Game.Objects['Wizard tower'].minigame.draw = function () {\r\n BackupGrimoireDraw();\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GrimoireBar === 1 &&\r\n minigame.magic < minigame.magicM &&\r\n Game.drawT % 5 === 0\r\n ) {\r\n minigame.magicBarTextL.innerHTML += ` (${FormatTime(\r\n CalculateGrimoireRefillTime(minigame.magic, minigame.magicM, minigame.magicM),\r\n )})`;\r\n minigame.magicBarL.style.width = '75%'; // TODO: Fix this after Orteil pushes fix to main game;\r\n }\r\n };\r\n HasReplaceNativeGrimoireDraw = true;\r\n }\r\n}\r\n\r\n/**\r\n * This function fixes replaces the .launch function of the Grimoire\r\n */\r\nfunction ReplaceNativeGrimoireLaunch() {\r\n if (!HasReplaceNativeGrimoireLaunch && Game.Objects['Wizard tower'].minigameLoaded) {\r\n const { minigame } = Game.Objects['Wizard tower'];\r\n BackupGrimoireLaunch = minigame.launch;\r\n BackupGrimoireLaunchMod = new Function( // eslint-disable-line no-new-func\r\n `return ${minigame.launch\r\n .toString()\r\n .split('=this')\r\n .join(\"= Game.Objects['Wizard tower'].minigame\")}`,\r\n );\r\n Game.Objects['Wizard tower'].minigame.launch = function () {\r\n BackupGrimoireLaunchMod();\r\n ReplaceTooltipGrimoire();\r\n HasReplaceNativeGrimoireDraw = false;\r\n ReplaceNativeGrimoireDraw();\r\n\r\n HasReplaceNativeGrimoireLaunch = true;\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * This function fixes replaces the Launch and Draw functions of the Grimoire\r\n */\r\nexport default function ReplaceNativeGrimoire() {\r\n ReplaceNativeGrimoireLaunch();\r\n ReplaceNativeGrimoireDraw();\r\n}\r\n","/** Functions related to the Dragon */\r\n\r\nimport Beautify from '../../Disp/BeautifyAndFormatting/Beautify';\r\nimport CopyData from '../../Sim/SimulationData/CopyData';\r\nimport { SimDoSims, SimObjects } from '../../Sim/VariablesAndData';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheCostDragonUpgrade, CacheLastDragonLevel } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This functions caches the current cost of upgrading the dragon level so it can be displayed in the tooltip\r\n */\r\nexport default function CacheDragonCost() {\r\n if (CacheLastDragonLevel !== Game.dragonLevel || SimDoSims) {\r\n if (\r\n Game.dragonLevel < 25 &&\r\n Game.dragonLevels[Game.dragonLevel].buy.toString().includes('sacrifice')\r\n ) {\r\n const objectMatch = Game.dragonLevels[Game.dragonLevel].buy\r\n .toString()\r\n .match(/Objects\\[(.*)\\]/);\r\n let target =\r\n objectMatch !== null ? objectMatch[1] : Game.ObjectsById[Game.dragonLevel - 5].name;\r\n const amount = Game.dragonLevels[Game.dragonLevel].buy\r\n .toString()\r\n .match(/sacrifice\\((.*?)\\)/)[1];\r\n if (target !== 'i') {\r\n target = target.replaceAll(\"'\", '');\r\n if (Game.Objects[target].amount < amount) {\r\n CacheCostDragonUpgrade = 'Not enough buildings to sell';\r\n } else {\r\n let cost = 0;\r\n CopyData();\r\n for (let i = 0; i < amount; i++) {\r\n let price =\r\n SimObjects[target].basePrice *\r\n Game.priceIncrease **\r\n Math.max(0, SimObjects[target].amount - 1 - SimObjects[target].free);\r\n price = Game.modifyBuildingPrice(SimObjects[target], price);\r\n price = Math.ceil(price);\r\n cost += price;\r\n SimObjects[target].amount -= 1;\r\n }\r\n CacheCostDragonUpgrade = `Cost to rebuy: ${Beautify(cost)}`;\r\n }\r\n } else {\r\n let cost = 0;\r\n CopyData();\r\n Object.keys(Game.Objects).forEach((j) => {\r\n target = j;\r\n if (Game.Objects[target].amount < amount) {\r\n CacheCostDragonUpgrade = 'Not enough buildings to sell';\r\n return;\r\n }\r\n for (let i = 0; i < amount; i++) {\r\n let price =\r\n SimObjects[target].basePrice *\r\n Game.priceIncrease **\r\n Math.max(0, SimObjects[target].amount - 1 - SimObjects[target].free);\r\n price = Game.modifyBuildingPrice(SimObjects[target], price);\r\n price = Math.ceil(price);\r\n cost += price;\r\n SimObjects[target].amount -= 1;\r\n }\r\n CacheCostDragonUpgrade = `Cost to rebuy: ${Beautify(cost)}`;\r\n });\r\n }\r\n }\r\n CacheLastDragonLevel = Game.dragonLevel;\r\n }\r\n\r\n FillCMDCache({ CacheLastDragonLevel });\r\n}\r\n","/** Data related to the display titles of certain sections in menu screens */\r\n\r\n/** Display titles of the headers of the Cookie Monster settings section */\r\nexport const ConfigGroups = {\r\n Favourite: 'Favourite Settings',\r\n Calculation: 'Calculation',\r\n Notation: 'Notation',\r\n Colours: 'Colours and colour coding',\r\n BarsDisplay: 'Infobars and visual settings',\r\n Tooltip: 'Tooltips',\r\n Statistics: 'Statistics',\r\n Notification: 'Notifications',\r\n Miscellaneous: 'Miscellaneous',\r\n};\r\n\r\n/** Display titles of the headers of the notification section of the Cookie Monster settings */\r\nexport const ConfigGroupsNotification = {\r\n NotificationGeneral: 'General Notifications',\r\n NotificationGC: 'Golden Cookie',\r\n NotificationFC: 'Fortune Cookie',\r\n NotificationSea: 'Season Special',\r\n NotificationGard: 'Garden Tick',\r\n NotificationMagi: 'Full Magic Bar',\r\n NotificationWrink: 'Wrinkler',\r\n NotificationWrinkMax: 'Maximum Wrinklers',\r\n};\r\n","/**\r\n * This function checks if the user has given permissions for notifications\r\n * It is called by a change in any of the notification options\r\n * Note that most browsers will stop asking if the user has ignored the prompt around 6 times\r\n * @param \t{number}\tToggleOnOff\t\tA number indicating whether the option has been turned off (0) or on (1)\r\n */\r\nfunction CheckNotificationPermissions(ToggleOnOff) {\r\n if (ToggleOnOff === 1) {\r\n // Check if browser support Promise version of Notification Permissions\r\n const checkNotificationPromise = function () {\r\n try {\r\n Notification.requestPermission().then();\r\n } catch (e) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n // Check if the browser supports notifications and which type\r\n if (!('Notification' in window)) {\r\n console.log('This browser does not support notifications.'); // eslint-disable-line no-console\r\n } else if (checkNotificationPromise()) {\r\n Notification.requestPermission().then();\r\n } else {\r\n Notification.requestPermission();\r\n }\r\n }\r\n}\r\n\r\nexport default CheckNotificationPermissions;\r\n","import UpdateBuildings from '../BuildingsUpgrades/Buildings';\r\nimport UpdateUpgrades from '../BuildingsUpgrades/Upgrades';\r\nimport { UpdateBotBar } from '../InfoBars/BottomBar';\r\n\r\n/**\r\n * This function refreshes all numbers after a change in scale-setting\r\n * It is therefore called by a changes in CM.Options.Scale, CM.Options.ScaleDecimals, CM.Options.ScaleSeparator and CM.Options.ScaleCutoff\r\n */\r\nexport default function RefreshScale() {\r\n BeautifyAll();\r\n Game.RefreshStore();\r\n Game.RebuildUpgrades();\r\n\r\n UpdateBotBar();\r\n UpdateBuildings();\r\n UpdateUpgrades();\r\n}\r\n","import { UpdateBotBar } from '../../Disp/InfoBars/BottomBar';\r\nimport { UpdateBotTimerBarPosition } from '../SpecificToggles';\r\n\r\n/**\r\n * This function toggle the bottom bar\r\n * It is called by CM.Disp.UpdateAscendState() and a change in Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar\r\n */\r\nexport default function ToggleBotBar() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1) {\r\n l('CMBotBar').style.display = '';\r\n UpdateBotBar();\r\n } else {\r\n l('CMBotBar').style.display = 'none';\r\n }\r\n UpdateBotTimerBarPosition();\r\n}\r\n","import { settingClasses } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\n\r\nimport CheckNotificationPermissions from '../Config/CheckNotificationPermissions';\r\nimport RefreshScale from '../Disp/HelperFunctions/RefreshScale';\r\nimport { SimDoSims } from '../Sim/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport ToggleBotBar from '../Config/Toggles/ToggleBotBar';\r\nimport ToggleDetailedTime from '../Config/Toggles/ToggleDetailedTime';\r\nimport ToggleGCTimer from '../Config/Toggles/ToggleGCTimer';\r\nimport ToggleSectionHideButtons from '../Config/Toggles/ToggleSectionHideButtons';\r\nimport ToggleToolWarnPos from '../Config/Toggles/ToggleToolWarnPos';\r\nimport ToggleUpgradeBarAndColour from '../Config/Toggles/ToggleUpgradeBarAndColour';\r\nimport ToggleUpgradeBarFixedPos from '../Config/Toggles/ToggleUpgradeBarFixedPos';\r\nimport ToggleWrinklerButtons from '../Config/Toggles/ToggleWrinklerButtons';\r\nimport UpdateBuildings from '../Disp/BuildingsUpgrades/Buildings';\r\nimport { UpdateFavicon } from '../Disp/TabTitle/FavIcon';\r\nimport UpdateUpgradeSectionsHeight from '../Disp/BuildingsUpgrades/UpdateUpgradeSectionsHeight';\r\nimport UpdateUpgrades from '../Disp/BuildingsUpgrades/Upgrades';\r\nimport { ToggleTimerBar, ToggleTimerBarPos } from '../Config/SpecificToggles';\r\n\r\n/** This includes all options of CookieMonster and their relevant data */\r\nconst settings = {\r\n // Calculation\r\n CPSMode: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Calculation',\r\n ['Current cookies per second', 'Average cookies per second'],\r\n 'Calculate times using current cookies per second or average cookies per second',\r\n false,\r\n ),\r\n AvgCPSHist: new settingClasses.SettingStandard(\r\n 3,\r\n 'bool',\r\n 'Calculation',\r\n [\r\n 'Average CPS in past 10s',\r\n 'Average CPS in past 15s',\r\n 'Average CPS in past 30s',\r\n 'Average CPS in past 1m',\r\n 'Average CPS in past 5m',\r\n 'Average CPS in past 10m',\r\n 'Average CPS in past 15m',\r\n 'Average CPS in past 30m',\r\n ],\r\n 'How much time average Cookies Per Second should consider',\r\n false,\r\n ),\r\n AvgClicksHist: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Calculation',\r\n [\r\n 'Average clicks in past 1s',\r\n 'Average clicks in past 5s',\r\n 'Average clicks in past 10s',\r\n 'Average clicks in past 15s',\r\n 'Average clicks in past 30s',\r\n ],\r\n 'How much time average Cookie Clicks should consider',\r\n false,\r\n ),\r\n CalcWrink: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'Calculation',\r\n [\r\n 'Calculate with wrinklers OFF',\r\n 'Calculate with wrinklers ON',\r\n 'Calculate with single fattest wrinkler ON',\r\n ],\r\n 'Calculate times and average Cookies Per Second with (only the single non-shiny fattest) wrinklers',\r\n true,\r\n () => {\r\n SimDoSims = true;\r\n },\r\n ),\r\n\r\n // Notation\r\n Scale: new settingClasses.SettingStandardWithFunc(\r\n 2,\r\n 'bool',\r\n 'Notation',\r\n [\r\n \"Game's setting scale\",\r\n 'Metric',\r\n 'Short scale',\r\n 'Short scale (Abbreviated)',\r\n 'Scientific notation',\r\n 'Engineering notation',\r\n ],\r\n 'Change how long numbers are formatted',\r\n false,\r\n () => {\r\n RefreshScale();\r\n },\r\n ),\r\n ScaleDecimals: new settingClasses.SettingStandardWithFunc(\r\n 2,\r\n 'bool',\r\n 'Notation',\r\n ['1 decimals', '2 decimals', '3 decimals'],\r\n `Set the number of decimals used when applicable. This only works with Cookie Monster scales and not with \"Game's Setting Scale\"`,\r\n false,\r\n () => {\r\n RefreshScale();\r\n },\r\n ),\r\n ScaleSeparator: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'Notation',\r\n ['. for decimals (standard)', '. for thousands'],\r\n 'Set the separator used for decimals and thousands',\r\n false,\r\n () => {\r\n RefreshScale();\r\n },\r\n ),\r\n ScaleCutoff: new settingClasses.SettingInputNumber(\r\n 999999,\r\n 'numscale',\r\n 'Notation',\r\n 'Notation cut-off point: ',\r\n 'The number from which Cookie Monster will start formatting numbers based on chosen scale. Standard is 999,999. Setting this above 999,999,999 might break certain notations',\r\n 1,\r\n 999999999,\r\n ),\r\n TimeFormat: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Notation',\r\n ['Time XXd, XXh, XXm, XXs', 'Time XX:XX:XX:XX:XX', 'Time XXx, XXx'],\r\n 'Change the time format',\r\n false,\r\n ),\r\n DetailedTime: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'Notation',\r\n ['Detailed time OFF', 'Detailed time ON'],\r\n 'Change how time is displayed in certain statistics and tooltips',\r\n true,\r\n () => {\r\n ToggleDetailedTime();\r\n },\r\n ),\r\n PPDisplayTime: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Notation',\r\n ['PP as value (standard)', 'PP as time unit'],\r\n 'Display PP as calculated value or as approximate time unit. Note that PP does not translate directly into a time unit and this is therefore only an approximation.',\r\n false,\r\n ),\r\n\r\n // Colours\r\n BuildColour: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'Colours',\r\n ['Building colours OFF', 'Building colours ON'],\r\n 'Colour code buildings',\r\n true,\r\n () => {\r\n UpdateBuildings();\r\n },\r\n ),\r\n PPOnlyConsiderBuyable: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Colours',\r\n [\"Don't ignore non-buyable\", 'Ignore non-buyable'],\r\n \"Makes Cookie Monster label buildings and upgrades you can't buy right now red, useful in those situations where you just want to spend your full bank 'most optimally'\",\r\n true,\r\n ),\r\n PPExcludeTop: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Colours',\r\n [\r\n \"Don't ignore any\",\r\n 'Ignore 1st best',\r\n 'Ignore 1st and 2nd best',\r\n 'Ignore 1st, 2nd and 3rd best',\r\n ],\r\n 'Makes Cookie Monster ignore the 1st, 2nd or 3rd best buildings in labeling and colouring PP values',\r\n true,\r\n ),\r\n PPRigidelMode: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Colours',\r\n ['Rigidel mode OFF', 'Rigidel mode ON'],\r\n 'Makes Cookie Monster ignore all \"buy 1\" options when colouring PP in order to stay at a total building count ending in 10 for pantheon god Rigidel',\r\n true,\r\n ),\r\n PPSecondsLowerLimit: new settingClasses.SettingInputNumber(\r\n 0,\r\n 'numscale',\r\n 'Colours',\r\n 'Lower limit for PP (in seconds): ',\r\n 'If a building or upgrade costs less than the specified seconds of CPS it will also be considered optimal and label it as such (\"PP is less than xx seconds of CPS\"); setting to 0 ignores this option',\r\n 0,\r\n Infinity,\r\n ),\r\n ColourBlue: new settingClasses.SettingColours(\r\n '#4bb8f0',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is blue. Used to show upgrades better than best PP building, for Click Frenzy bar, and for various labels',\r\n ),\r\n ColourGreen: new settingClasses.SettingColours(\r\n '#00ff00',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is green. Used to show best PP building, for Blood Frenzy bar, and for various labels',\r\n ),\r\n ColourYellow: new settingClasses.SettingColours(\r\n '#ffff00',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is yellow. Used to show buildings within the top 10 of PP, for Frenzy bar, and for various labels',\r\n ),\r\n ColourOrange: new settingClasses.SettingColours(\r\n '#ff7f00',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is orange. Used to show buildings within the top 20 of PP, for Next Reindeer bar, and for various labels',\r\n ),\r\n ColourRed: new settingClasses.SettingColours(\r\n '#ff0000',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is Red. Used to show buildings within the top 30 of PP, for Clot bar, and for various labels',\r\n ),\r\n ColourPurple: new settingClasses.SettingColours(\r\n '#ff00ff',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is purple. Used to show buildings outside of the top 30 of PP, for Next Cookie bar, and for various labels',\r\n ),\r\n ColourGray: new settingClasses.SettingColours(\r\n '#b3b3b3',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is gray. Used to show negative or infinity PP, and for Next Cookie/Next Reindeer bar',\r\n ),\r\n ColourPink: new settingClasses.SettingColours(\r\n '#ff1493',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is pink. Used for Dragonflight bar',\r\n ),\r\n ColourBrown: new settingClasses.SettingColours(\r\n '#8b4513',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is brown. Used for Dragon Harvest bar',\r\n ),\r\n\r\n // BarsDisplay\r\n BotBar: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Bottom bar OFF', 'Bottom bar ON'],\r\n 'Building information',\r\n true,\r\n () => {\r\n ToggleBotBar();\r\n },\r\n ),\r\n TimerBar: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Timer bar OFF', 'Timer bar ON'],\r\n 'Bar with timers for golden cookie, season popup, Frenzy (Normal, Clot, Elder), Click Frenzy',\r\n true,\r\n () => {\r\n ToggleTimerBar();\r\n },\r\n ),\r\n TimerBarPos: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Timer bar position (top left)', 'Timer bar position (bottom)'],\r\n 'Placement of the timer bar',\r\n false,\r\n () => {\r\n ToggleTimerBarPos();\r\n },\r\n ),\r\n TimerBarOverlay: new settingClasses.SettingStandard(\r\n 2,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Timer bar overlay OFF', 'Timer bar overlay only seconds', 'Timer bar overlay full'],\r\n 'Overlay on timers displaying seconds and/or percentage left',\r\n true,\r\n ),\r\n AutosaveTimerBar: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Autosave timer bar OFF', 'Autosave timer bar ON'],\r\n 'Show a timer counting down till next autosave in the timer bar',\r\n true,\r\n ),\r\n UpBarColour: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Upgrade colours/bar OFF', 'Upgrade colours with bar ON', 'Upgrade colours without bar ON'],\r\n 'Colour code upgrades and optionally add a counter bar',\r\n false,\r\n () => {\r\n ToggleUpgradeBarAndColour();\r\n },\r\n ),\r\n UpgradeBarFixedPos: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Upgrade bar fixed position OFF', 'Upgrade bar fixed position ON'],\r\n 'Lock the upgrade bar at top of the screen to prevent it from moving ofscreen when scrolling',\r\n true,\r\n () => {\r\n ToggleUpgradeBarFixedPos();\r\n },\r\n ),\r\n SortBuildings: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n [\r\n 'Sort buildings: default',\r\n 'Sort buildings: PP of x1 purchase',\r\n 'Sort buildings: PP of selected bulk mode',\r\n 'Sort buildings: price until next achievement',\r\n ],\r\n 'Sort the display of buildings in default order, by PP, or until next achievement',\r\n false,\r\n () => {\r\n UpdateBuildings();\r\n },\r\n ),\r\n SortUpgrades: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Sort upgrades: default', 'Sort upgrades: PP'],\r\n 'Sort the display of upgrades in either default order or by PP',\r\n false,\r\n () => {\r\n UpdateUpgrades();\r\n },\r\n ),\r\n UpgradesNeverCollapse: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Upgrades always expanded OFF', 'Upgrades always expanded ON'],\r\n 'Toggle to make the upgrades sections always expanded to the size needed to display all upgrades',\r\n true,\r\n () => {\r\n UpdateUpgradeSectionsHeight();\r\n },\r\n ),\r\n DragonAuraInfo: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Extra dragon aura info OFF', 'Extra dragon aura info ON'],\r\n 'Shows information about changes in CPS and costs in the dragon aura interface.',\r\n true,\r\n ),\r\n GrimoireBar: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Grimoire magic meter timer OFF', 'Grimoire magic meter timer ON'],\r\n 'A timer overlay showing how long till the Grimoire magic meter is full',\r\n true,\r\n ),\r\n GCTimer: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Golden cookie timer OFF', 'Golden cookie timer ON'],\r\n 'A timer on the golden cookie when it has been spawned',\r\n true,\r\n () => {\r\n ToggleGCTimer();\r\n },\r\n ),\r\n Favicon: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Favicon OFF', 'Favicon ON'],\r\n 'Update favicon with golden/wrath cookie',\r\n true,\r\n () => {\r\n UpdateFavicon();\r\n },\r\n ),\r\n WrinklerButtons: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Extra wrinkler buttons OFF', 'Extra wrinkler buttons ON'],\r\n 'Show buttons for popping wrinklers at bottom of cookie section',\r\n true,\r\n () => {\r\n ToggleWrinklerButtons();\r\n },\r\n ),\r\n HideSectionsButtons: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Hide buildings/upgrades button OFF', 'Hide buildings/upgrades button ON'],\r\n 'Show buttons for hiding and showing the buildings and upgrades sections in the right column',\r\n true,\r\n () => {\r\n ToggleSectionHideButtons();\r\n },\r\n ),\r\n\r\n // Tooltip\r\n TooltipBuildUpgrade: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Building/upgrade tooltip information OFF', 'Building/upgrade tooltip information ON'],\r\n 'Extra information in building/upgrade tooltips',\r\n true,\r\n ),\r\n TooltipAmor: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Tooltip',\r\n [\r\n 'Buildings tooltip amortization information OFF',\r\n 'Buildings tooltip amortization information ON',\r\n ],\r\n 'Add amortization information to buildings tooltip',\r\n true,\r\n ),\r\n ToolWarnLucky: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip lucky warning OFF', 'Tooltip lucky warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for max \"Lucky!\" rewards',\r\n true,\r\n ),\r\n ToolWarnLuckyFrenzy: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip lucky frenzy warning OFF', 'Tooltip lucky frenzy warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for max \"Lucky!\" (Frenzy) rewards',\r\n true,\r\n ),\r\n ToolWarnConjure: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip conjure warning OFF', 'Tooltip conjure warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for max \"Conjure Baked Goods\" rewards',\r\n true,\r\n ),\r\n ToolWarnConjureFrenzy: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip conjure frenzy warning OFF', 'Tooltip conjure frenzy warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for max \"Conjure Baked Goods\" rewards with Frenzy active',\r\n true,\r\n ),\r\n ToolWarnEdifice: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip edifice warning OFF', 'Tooltip edifice warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for \"Spontaneous Edifice\" to possibly give you your most expensive building',\r\n true,\r\n ),\r\n ToolWarnUser: new settingClasses.SettingInputNumber(\r\n 0,\r\n 'numscale',\r\n 'Tooltip',\r\n 'Tooltip warning at x times CPS: ',\r\n 'Use this to show a customized warning if buying it will put the bank under the amount equal to value times cps; setting to 0 disables the function altogether',\r\n 0,\r\n Infinity,\r\n ),\r\n ToolWarnBon: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Calculate tooltip warning with bonus CPS OFF', 'Calculate tooltip warning with bonus CPS ON'],\r\n 'Calculate the warning with or without the bonus CPS you get from buying',\r\n true,\r\n ),\r\n ToolWarnPos: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip warning position (left)', 'Tooltip warning position (bottom)'],\r\n 'Placement of the warning boxes',\r\n false,\r\n () => {\r\n ToggleToolWarnPos();\r\n },\r\n ),\r\n TooltipGrim: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Grimoire tooltip information OFF', 'Grimoire tooltip information ON'],\r\n 'Extra information in tooltip for grimoire',\r\n true,\r\n ),\r\n TooltipWrink: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Wrinkler tooltip OFF', 'Wrinkler tooltip ON'],\r\n 'Shows the amount of cookies a wrinkler will give when popping it',\r\n true,\r\n ),\r\n TooltipLump: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Sugar lump tooltip OFF', 'Sugar lump tooltip ON'],\r\n 'Shows the current Sugar Lump type in Sugar lump tooltip.',\r\n true,\r\n ),\r\n TooltipPlots: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Garden plots tooltip OFF', 'Garden plots tooltip ON'],\r\n 'Shows a tooltip for plants that have a cookie reward.',\r\n true,\r\n ),\r\n TooltipStocks: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Stock market tooltips OFF', 'Stock market tooltips ON'],\r\n 'Shows additional info in the stock market tooltips.',\r\n true,\r\n ),\r\n TooltipPantheon: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Pantheon tooltip OFF', 'Pantheon tooltip ON'],\r\n 'Shows additional info in the pantheon tooltip',\r\n true,\r\n ),\r\n TooltipAscendButton: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Show Extra Info Ascend Tooltip OFF', 'Show Extra Info Ascend Tooltip ON'],\r\n 'Shows additional info in the ascend tooltip',\r\n true,\r\n ),\r\n\r\n // Statistics\r\n Stats: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Statistics',\r\n ['Statistics OFF', 'Statistics ON'],\r\n 'Extra Cookie Monster statistics!',\r\n true,\r\n ),\r\n MissingUpgrades: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Statistics',\r\n ['Missing upgrades OFF', 'Missing upgrades ON'],\r\n 'Shows missing upgrades in statistics menu',\r\n true,\r\n ),\r\n MissingAchievements: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Statistics',\r\n ['Missing Achievements OFF', 'Missing Normal Achievements ON'],\r\n 'Shows missing normal achievements in statistics menu.',\r\n true,\r\n ),\r\n UpStats: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Statistics',\r\n ['Statistics update rate (default)', 'Statistics update rate (1s)'],\r\n 'Default rate is once every 5 seconds',\r\n false,\r\n ),\r\n HeavenlyChipsTarget: new settingClasses.SettingInputNumber(\r\n 1,\r\n 'numscale',\r\n 'Statistics',\r\n 'Heavenly chips target: ',\r\n 'Use this to set a heavenly chips target that will be counted towards in the \"prestige\" statsistics sections',\r\n 1,\r\n Infinity,\r\n ),\r\n ShowMissedGC: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Statistics',\r\n ['Missed GC OFF', 'Missed GC ON'],\r\n 'Show a stat in the statistics screen that counts how many golden cookies you have missed',\r\n true,\r\n ),\r\n\r\n // Notification\r\n Title: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGeneral',\r\n ['Title OFF', 'Title ON', 'Title pinned tab highlight'],\r\n 'Update title with colden cookie/season popup timers; pinned tab highlight only changes the title when a golden cookie/season popup spawns; \"!\" means that golden cookie/reindeer can spawn',\r\n true,\r\n ),\r\n GeneralSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGeneral',\r\n ['Consider game volume setting OFF', 'Consider game volume setting ON'],\r\n 'Turning this toggle to \"off\" makes Cookie Monster no longer consider the volume setting of the base game, allowing mod notifications to play with base game volume turned down',\r\n true,\r\n ),\r\n GCNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationGC',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when golden cookie spawns',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCNotification,\r\n );\r\n },\r\n ),\r\n GCFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGC',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen on golden cookie',\r\n true,\r\n ),\r\n ColourGCFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationGC',\r\n 'The colour of the GC flash, standard colour is white',\r\n ),\r\n GCSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGC',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound on golden cookie',\r\n true,\r\n ),\r\n GCVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationGC', [], 'Volume'),\r\n GCSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/66/66717_931655-lq.mp3',\r\n 'url',\r\n 'NotificationGC',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when a golden cookie spawns',\r\n ),\r\n FortuneNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationFC',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when fortune cookie is on the ticker',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FortuneNotification,\r\n );\r\n },\r\n ),\r\n FortuneFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationFC',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen on fortune cookie spawn',\r\n true,\r\n ),\r\n ColourFortuneFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationFC',\r\n 'The colour of the fortune flash, standard colour is white',\r\n ),\r\n FortuneSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationFC',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound on fortune cookie spawn',\r\n true,\r\n ),\r\n FortuneVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationFC', [], 'Volume'),\r\n FortuneSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/174/174027_3242494-lq.mp3',\r\n 'url',\r\n 'NotificationFC',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when the ticker has a fortune cookie',\r\n ),\r\n SeaNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationSea',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification on season popup',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SeaNotification,\r\n );\r\n },\r\n ),\r\n SeaFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationSea',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen on season popup',\r\n true,\r\n ),\r\n ColourSeaFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationSea',\r\n 'The colour of the season popup flash, standard colour is white',\r\n ),\r\n SeaSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationSea',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound on season popup',\r\n true,\r\n ),\r\n SeaVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationSea', [], 'Volume'),\r\n SeaSoundURL: new settingClasses.SettingStandard(\r\n 'https://www.freesound.org/data/previews/121/121099_2193266-lq.mp3',\r\n 'url',\r\n 'NotificationSea',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when on season popup spawns',\r\n ),\r\n GardFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGard',\r\n ['Garden Tick Flash OFF', 'Flash ON'],\r\n 'Flash screen on garden tick',\r\n true,\r\n ),\r\n ColourGardFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationGard',\r\n 'The colour of the garden flash, standard colour is white',\r\n ),\r\n GardSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGard',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound on garden tick',\r\n true,\r\n ),\r\n GardVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationGard', [], 'Volume'),\r\n GardSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/103/103046_861714-lq.mp3',\r\n 'url',\r\n 'NotificationGard',\r\n 'Garden Tick Sound URL:',\r\n 'URL of the sound to be played when the garden ticks',\r\n ),\r\n MagicNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationMagi',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when magic reaches maximum',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MagicNotification,\r\n );\r\n },\r\n ),\r\n MagicFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationMagi',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen when magic reaches maximum',\r\n true,\r\n ),\r\n ColourMagicFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationMagi',\r\n 'The colour of the magic flash, standard colour is white',\r\n ),\r\n MagicSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationMagi',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound when magic reaches maximum',\r\n true,\r\n ),\r\n MagicVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationMagi', [], 'Volume'),\r\n MagicSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/221/221683_1015240-lq.mp3',\r\n 'url',\r\n 'NotificationMagi',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when magic reaches maxium',\r\n ),\r\n WrinklerNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationWrink',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when a wrinkler appears',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerNotification,\r\n );\r\n },\r\n ),\r\n WrinklerFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationWrink',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen when a wrinkler appears',\r\n true,\r\n ),\r\n ColourWrinklerFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationWrink',\r\n 'The colour of the wrinkler flash, standard colour is white',\r\n ),\r\n WrinklerSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationWrink',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound when a wrinkler appears',\r\n true,\r\n ),\r\n WrinklerVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationWrink', [], 'Volume'),\r\n WrinklerSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/124/124186_8043-lq.mp3',\r\n 'url',\r\n 'NotificationWrink',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when a wrinkler appears',\r\n ),\r\n WrinklerMaxNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationWrinkMax',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when the maximum amount of wrinklers has appeared',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxNotification,\r\n );\r\n },\r\n ),\r\n WrinklerMaxFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationWrinkMax',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen when the maximum amount of Wrinklers has appeared',\r\n true,\r\n ),\r\n ColourWrinklerMaxFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationWrinkMax',\r\n 'The colour of the maximum wrinkler flash, standard colour is white',\r\n ),\r\n WrinklerMaxSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationWrinkMax',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound when the maximum amount of wrinklers has appeared',\r\n true,\r\n ),\r\n WrinklerMaxVolume: new settingClasses.SettingVolume(\r\n 100,\r\n 'vol',\r\n 'NotificationWrinkMax',\r\n [],\r\n 'Volume',\r\n ),\r\n WrinklerMaxSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/152/152743_15663-lq.mp3',\r\n 'url',\r\n 'NotificationWrinkMax',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when the maximum amount of wrinklers has appeared',\r\n ),\r\n\r\n // Miscellaneous\r\n BulkBuyBlock: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Miscellaneous',\r\n ['Block bulk buying OFF', 'Block bulk buying ON'],\r\n \"Block clicking bulk buying when you can't buy all. This prevents buying 7 of a building when you are in buy-10 or buy-100 mode.\",\r\n true,\r\n ),\r\n FavouriteSettings: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'Miscellaneous',\r\n [\r\n 'Favourite settings section OFF',\r\n 'Favourite settings section ON',\r\n 'Favourite settings section ON (Locked)',\r\n ],\r\n \"Show stars before each setting which allows selecting it for a 'favourites' section at the top of the Cookie Monster settings. Setting this to Locked removes the stars but shows the 'favourites' section\",\r\n true,\r\n () => {\r\n Game.UpdateMenu();\r\n },\r\n ),\r\n};\r\n\r\nexport default settings;\r\n","import { CMSayTime } from '../../Disp/VariablesAndData';\r\nimport { BackupFunctions } from '../../Main/VariablesAndData';\r\n\r\n/**\r\n * This function changes some of the time-displays in the game to be more detailed\r\n * It is called by a change in CM.Options.DetailedTime\r\n */\r\nexport default function ToggleDetailedTime() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.DetailedTime === 1)\r\n Game.sayTime = CMSayTime;\r\n else Game.sayTime = BackupFunctions.sayTime;\r\n}\r\n","import UpdateUpgrades from '../../Disp/BuildingsUpgrades/Upgrades';\r\n\r\n/**\r\n * This function toggles the upgrade bar and the colours of upgrades\r\n * It is called by a change in CM.Options.UpBarColour\r\n */\r\nexport default function ToggleUpgradeBarAndColour() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour === 1) {\r\n // Colours and bar on\r\n l('CMUpgradeBar').style.display = '';\r\n UpdateUpgrades();\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour === 2\r\n ) {\r\n // Colours on and bar off\r\n l('CMUpgradeBar').style.display = 'none';\r\n UpdateUpgrades();\r\n } else {\r\n // Colours and bar off\r\n l('CMUpgradeBar').style.display = 'none';\r\n Game.RebuildUpgrades();\r\n }\r\n}\r\n","/**\r\n * This function toggles the position of the upgrade bar from fixed or non-fixed mode\r\n * It is called by a change in CM.Options.UpgradeBarFixedPos\r\n */\r\nexport default function ToggleUpgradeBarFixedPos() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpgradeBarFixedPos === 1\r\n ) {\r\n // Fix to top of screen when scrolling\r\n l('CMUpgradeBar').style.position = 'sticky';\r\n l('CMUpgradeBar').style.top = '0px';\r\n } else {\r\n l('CMUpgradeBar').style.position = ''; // Possible to scroll offscreen\r\n }\r\n}\r\n","import { CacheGoldenShimmersByID } from '../../Cache/VariablesAndData';\r\nimport { GCTimers } from '../../Disp/VariablesAndData';\r\n\r\n/**\r\n * This function toggles GC Timers are visible\r\n * It is called by a change in CM.Options.GCTimer\r\n */\r\nexport default function ToggleGCTimer() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer === 1) {\r\n Object.keys(GCTimers).forEach((i) => {\r\n GCTimers[i].style.display = 'block';\r\n GCTimers[i].style.left = CacheGoldenShimmersByID[i].l.style.left;\r\n GCTimers[i].style.top = CacheGoldenShimmersByID[i].l.style.top;\r\n });\r\n } else {\r\n // eslint-disable-next-line no-return-assign\r\n Object.keys(GCTimers).forEach((i) => (GCTimers[i].style.display = 'none'));\r\n }\r\n}\r\n","/**\r\n * This function updates the display setting of the two objects created by CM.Disp.CreateWrinklerButtons()\r\n * It is called by changes in CM.Options.WrinklerButtons\r\n */\r\nexport default function ToggleSectionHideButtons() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.HideSectionsButtons) {\r\n l('CMSectionHidButtons').style.display = '';\r\n } else {\r\n l('CMSectionHidButtons').style.display = 'none';\r\n }\r\n}\r\n","import UpdateBuildings from '../BuildingsUpgrades/Buildings';\r\nimport {\r\n ColourBackPre,\r\n ColourBorderPre,\r\n ColoursOrdering,\r\n ColourTextPre,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function changes/refreshes colours if the user has set new standard colours\r\n * The function is therefore called by a change in CM.Options.Colours\r\n */\r\nexport default function UpdateColours() {\r\n let str = '';\r\n for (let i = 0; i < ColoursOrdering.length; i++) {\r\n str += `.${ColourTextPre}${ColoursOrdering[i]} { color: ${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[\r\n `Colour${ColoursOrdering[i]}`\r\n ]\r\n }; }\\n`;\r\n }\r\n for (let i = 0; i < ColoursOrdering.length; i++) {\r\n str += `.${ColourBackPre}${ColoursOrdering[i]} { background-color: ${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[\r\n `Colour${ColoursOrdering[i]}`\r\n ]\r\n }; }\\n`;\r\n }\r\n for (let i = 0; i < ColoursOrdering.length; i++) {\r\n str += `.${ColourBorderPre}${ColoursOrdering[i]} { border: 1px solid ${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[\r\n `Colour${ColoursOrdering[i]}`\r\n ]\r\n }; }\\n`;\r\n }\r\n l('CMCSS').textContent = str;\r\n UpdateBuildings(); // Class has been already set\r\n}\r\n","import { menuFunctions as mF } from '@cookiemonsterteam/cookiemonsterframework';\r\nimport { ConfigGroups, ConfigGroupsNotification } from '../../Data/Sectionheaders';\r\nimport settings from '../../Data/settings';\r\nimport UpdateColours from '../HelperFunctions/UpdateColours';\r\nimport RefreshScale from '../HelperFunctions/RefreshScale';\r\n\r\n/**\r\n * Creates the <div> to be added to the Options section\r\n * @returns {object} menuDiv\tObject of the <div> of Cookie Monster in options tab\r\n */\r\nexport default function createMenuOptions() {\r\n const menuDiv = mF.createModMenuSection('cookieMonsterMod', 'Cookie Monster', 'optionsMenu');\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.optionsMenu) {\r\n Object.keys(ConfigGroups).forEach((group) => {\r\n if (group === 'Favourite') {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings.length !==\r\n 0 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FavouriteSettings > 0\r\n ) {\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsSubHeader('cookieMonsterMod', group, ConfigGroups[group]),\r\n );\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[group])\r\n for (\r\n let index = 0;\r\n index <\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings.length;\r\n index++\r\n ) {\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsListing(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings[\r\n index\r\n ],\r\n settings,\r\n UpdateColours,\r\n RefreshScale,\r\n ),\r\n );\r\n }\r\n }\r\n } else {\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsSubHeader('cookieMonsterMod', group, ConfigGroups[group]),\r\n );\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[group]) {\r\n // 0 is show, 1 is collapsed\r\n // Make sub-sections of Notification section\r\n if (group === 'Notification') {\r\n Object.keys(ConfigGroupsNotification).forEach((subGroup) => {\r\n const subGroupObject = mF.listings.createOptionsSubHeader(\r\n 'cookieMonsterMod',\r\n subGroup,\r\n ConfigGroupsNotification[subGroup],\r\n );\r\n subGroupObject.style.fontSize = '15px';\r\n subGroupObject.style.opacity = '0.5';\r\n menuDiv.appendChild(subGroupObject);\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[subGroup]) {\r\n Object.keys(settings).forEach((option) => {\r\n if (settings[option].group === subGroup)\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsListing(\r\n 'cookieMonsterMod',\r\n option,\r\n settings,\r\n UpdateColours,\r\n RefreshScale,\r\n ),\r\n );\r\n });\r\n }\r\n });\r\n } else {\r\n Object.keys(settings).forEach((option) => {\r\n if (settings[option].group === group)\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsListing(\r\n 'cookieMonsterMod',\r\n option,\r\n settings,\r\n UpdateColours,\r\n RefreshScale,\r\n ),\r\n );\r\n });\r\n }\r\n }\r\n }\r\n });\r\n }\r\n return menuDiv;\r\n}\r\n","const SPECIAL_DIGIT = 7;\r\n\r\n/**\r\n * Count the number of 7s in any number\r\n * @param\t{number}\tnumber\tThe number to count sevens for\r\n * @returns\t{number}\tThe number of 7s in the provided number\r\n */\r\nexport function CountSevens(number) {\r\n return String(number).split(String(SPECIAL_DIGIT)).length - 1;\r\n}\r\n\r\n/**\r\n * Calculate the delta for the next number where the given digit is a 7\r\n * @param\t{number}\tnumber\t\t\tThe starting number to calculate the delta for\r\n * @param\t{number}\tdigitPlace\t1 for ones place, 10 for tens place, 100 for hundreds place, etc\r\n * @returns\t{number}\tThe calculated delta\r\n */\r\nexport function CalculateSevenDelta(number, digitPlace) {\r\n const target = SPECIAL_DIGIT * digitPlace;\r\n const modulus = digitPlace * 10;\r\n\r\n let delta = target - (number % modulus) + (number % digitPlace);\r\n if (delta < 0) delta += modulus;\r\n\r\n return delta;\r\n}\r\n\r\n/**\r\n * This function calculates each of the next \"lucky\" prestige levels\r\n * @param\t{number}\tcurrentLevel\tThe user's prestige level, including levels earned since the last ascension\r\n * @returns\t{{number}, {number}, {number}}\tluckyDigit, luckyNumber, luckyPayout\tThe next eligible level for each upgrade\r\n */\r\nexport default function CalculateLuckyLevels(currentLevel) {\r\n const result = {};\r\n let sevenCount = CountSevens(currentLevel);\r\n const numberOfDigits = String(currentLevel).length;\r\n\r\n if (sevenCount >= 1) {\r\n result.luckyDigit = currentLevel;\r\n if (sevenCount >= 2) {\r\n result.luckyNumber = currentLevel;\r\n if (sevenCount >= 4) {\r\n result.luckyPayout = currentLevel;\r\n return result;\r\n }\r\n }\r\n }\r\n\r\n // Consider only top 15 digits if it is big number\r\n let localLevel;\r\n if (numberOfDigits >= 16) {\r\n localLevel = Math.ceil(currentLevel / 10 ** (numberOfDigits - 15));\r\n } else {\r\n localLevel = currentLevel;\r\n }\r\n sevenCount = CountSevens(localLevel);\r\n\r\n if (result.luckyDigit === undefined) {\r\n if (sevenCount < 1) {\r\n const delta = CalculateSevenDelta(localLevel, 1);\r\n\r\n localLevel += delta;\r\n sevenCount = CountSevens(localLevel);\r\n }\r\n\r\n result.luckyDigit = localLevel;\r\n if (numberOfDigits >= 16) {\r\n result.luckyDigit *= 10 ** Number(numberOfDigits - 15);\r\n }\r\n }\r\n\r\n if (result.luckyNumber === undefined) {\r\n while (sevenCount < 2) {\r\n let delta = CalculateSevenDelta(localLevel, 1);\r\n if (delta === 0) delta = CalculateSevenDelta(localLevel, 10);\r\n\r\n localLevel += delta;\r\n sevenCount = CountSevens(localLevel);\r\n }\r\n\r\n result.luckyNumber = localLevel;\r\n if (numberOfDigits >= 16) {\r\n result.luckyNumber *= 10 ** Number(numberOfDigits - 15);\r\n }\r\n }\r\n\r\n let digitPlace = 1;\r\n while (sevenCount < 4) {\r\n const delta = CalculateSevenDelta(localLevel, digitPlace);\r\n if (delta === 0) {\r\n digitPlace *= 10;\r\n } else {\r\n localLevel += delta;\r\n sevenCount = CountSevens(localLevel);\r\n }\r\n }\r\n\r\n result.luckyPayout = localLevel;\r\n if (numberOfDigits >= 16) {\r\n result.luckyPayout *= 10 ** Number(numberOfDigits - 15);\r\n }\r\n\r\n return result;\r\n}\r\n","/** Section: Functions related to the creation of basic DOM elements page */\r\n\r\nimport { ToggleHeader } from '../../../Config/ToggleSetting';\r\n\r\nimport { SimpleTooltipElements } from '../../VariablesAndData';\r\n\r\n/**\r\n * This function creates a header-object for the stats page\r\n * It is called by CM.Disp.AddMenuStats()\r\n * @param \t{string}\t\tconfig\tThe name of the Config-group\r\n * @param \t{string}\t\ttext\tThe to-be displayed name of the header\r\n * @returns\t{object}\t\tdiv\t\tThe header object\r\n */\r\nexport function StatsHeader(text, config) {\r\n const div = document.createElement('div');\r\n div.className = 'title';\r\n div.style.padding = '0px 16px';\r\n div.style.opacity = '0.7';\r\n div.style.fontSize = '17px';\r\n div.style.fontFamily = '\"Kavoon\", Georgia, serif';\r\n div.appendChild(document.createTextNode(`${text} `));\r\n const span = document.createElement('span');\r\n span.style.cursor = 'pointer';\r\n span.style.display = 'inline-block';\r\n span.style.height = '14px';\r\n span.style.width = '14px';\r\n span.style.borderRadius = '7px';\r\n span.style.textAlign = 'center';\r\n span.style.backgroundColor = '#C0C0C0';\r\n span.style.color = 'black';\r\n span.style.fontSize = '13px';\r\n span.style.verticalAlign = 'middle';\r\n span.textContent = Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[config]\r\n ? '-'\r\n : '+';\r\n span.onclick = function () {\r\n ToggleHeader(config);\r\n Game.UpdateMenu();\r\n };\r\n div.appendChild(span);\r\n return div;\r\n}\r\n\r\n/**\r\n * This function creates an stats-listing-object for the stats page\r\n * It is called by CM.Disp.AddMenuStats()\r\n * @param \t{string}\t\ttype\t\tThe type fo the listing\r\n * @param \t{string}\t\tname\t\tThe name of the option\r\n * @param \t{object}\t\ttext\t\tThe text-object of the option\r\n * @param \t{string}\t\tplaceholder\tThe id of the to-be displayed tooltip if applicable\r\n * @returns\t{object}\t\tdiv\t\t\tThe option object\r\n */\r\nexport function StatsListing(type, name, text, placeholder) {\r\n const div = document.createElement('div');\r\n div.className = 'listing';\r\n\r\n const listingName = document.createElement('b');\r\n listingName.textContent = name;\r\n div.appendChild(listingName);\r\n if (type === 'withTooltip') {\r\n div.className = 'listing';\r\n div.appendChild(document.createTextNode(' '));\r\n\r\n const tooltip = document.createElement('span');\r\n tooltip.onmouseout = function () {\r\n Game.tooltip.hide();\r\n };\r\n tooltip.onmouseover = function () {\r\n Game.tooltip.draw(this, escape(SimpleTooltipElements[placeholder].innerHTML));\r\n };\r\n tooltip.style.cursor = 'default';\r\n tooltip.style.display = 'inline-block';\r\n tooltip.style.height = '10px';\r\n tooltip.style.width = '10px';\r\n tooltip.style.borderRadius = '5px';\r\n tooltip.style.textAlign = 'center';\r\n tooltip.style.backgroundColor = '#C0C0C0';\r\n tooltip.style.color = 'black';\r\n tooltip.style.fontSize = '9px';\r\n tooltip.style.verticalAlign = 'bottom';\r\n tooltip.textContent = '?';\r\n div.appendChild(tooltip);\r\n }\r\n div.appendChild(document.createTextNode(': '));\r\n div.appendChild(text);\r\n return div;\r\n}\r\n\r\n/**\r\n * This function creates an stats-listing-object for the stats page for missing items displays\r\n * It is called by CM.Disp.AddMenuStats()\r\n * @param \t{string}\t\ttype\t\tThe type fo the listing\r\n * @param \t{string}\t\tname\t\tThe name of the option\r\n * @param \t{object}\t\ttext\t\tThe text-object of the option\r\n * @param \t{bool}\t\t current Whether the season of the item is the current season\r\n * @returns\t{object}\t\tdiv\t\t\tThe option object\r\n */\r\nexport function StatsMissDispListing(type, name, text, current) {\r\n const div = document.createElement('div');\r\n div.className = 'listing';\r\n\r\n const listingName = document.createElement('b');\r\n listingName.textContent = name;\r\n if (current === true)\r\n listingName.style.color =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ColourGreen;\r\n div.appendChild(listingName);\r\n div.appendChild(document.createTextNode(': '));\r\n div.appendChild(text);\r\n return div;\r\n}\r\n\r\n/**\r\n * This function creates a tooltip containing all missing holiday items contained in the list theMissDisp\r\n * @param \t{list}\t\t\ttheMissDisp\t\tA list of the missing holiday items\r\n * @returns\t{object}\t\tfrag\t\t\tThe tooltip object\r\n */\r\nexport function StatsMissDisp(theMissDisp) {\r\n const frag = document.createDocumentFragment();\r\n frag.appendChild(document.createTextNode(`${theMissDisp.length} `));\r\n const span = document.createElement('span');\r\n span.onmouseout = function () {\r\n Game.tooltip.hide();\r\n };\r\n const placeholder = document.createElement('div');\r\n const missing = document.createElement('div');\r\n missing.style.minWidth = '140px';\r\n missing.style.marginBottom = '4px';\r\n const title = document.createElement('div');\r\n title.className = 'name';\r\n title.style.marginBottom = '4px';\r\n title.style.textAlign = 'center';\r\n title.textContent = 'Missing';\r\n missing.appendChild(title);\r\n Object.keys(theMissDisp).forEach((i) => {\r\n const div = document.createElement('div');\r\n div.style.textAlign = 'center';\r\n div.appendChild(document.createTextNode(theMissDisp[i]));\r\n missing.appendChild(div);\r\n });\r\n placeholder.appendChild(missing);\r\n span.onmouseover = function () {\r\n Game.tooltip.draw(this, escape(placeholder.innerHTML));\r\n };\r\n span.style.cursor = 'default';\r\n span.style.display = 'inline-block';\r\n span.style.height = '10px';\r\n span.style.width = '10px';\r\n span.style.borderRadius = '5px';\r\n span.style.textAlign = 'center';\r\n span.style.backgroundColor = '#C0C0C0';\r\n span.style.color = 'black';\r\n span.style.fontSize = '9px';\r\n span.style.verticalAlign = 'bottom';\r\n span.textContent = '?';\r\n frag.appendChild(span);\r\n return frag;\r\n}\r\n","import { saveAndLoadingFunctions } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\n\r\n/** Functions related to toggling or changing an individual setting */\r\n\r\n/** Used to name certain DOM or outside facing elements and refer to them */\r\nexport const ConfigPrefix = 'CMConfig';\r\n\r\n/**\r\n * This function toggles header options by incrementing them with 1 and handling changes\r\n * It is called by the onclick event of the +/- next to headers\r\n * @param \t{string}\tconfig\tThe name of the header\r\n */\r\nexport function ToggleHeader(config) {\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[config] += 1;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[config] > 1)\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[config] = 0;\r\n saveAndLoadingFunctions.saveFramework();\r\n}\r\n","/** Main function to create the sections of Cookie Monster on the Statistics page */\r\n\r\nimport { AddMissingUpgrades } from './CreateMissingUpgrades';\r\nimport * as CreateSections from './CreateStatsSections';\r\nimport * as CreateElements from './CreateDOMElements';\r\nimport * as GameData from '../../../Data/Gamedata';\r\n\r\nimport {\r\n CacheAverageClicks,\r\n CacheAverageCookiesFromClicks,\r\n CacheObjectsNextAchievement,\r\n CacheWrinklersFattest,\r\n CacheWrinklersNormal,\r\n CacheWrinklersTotal,\r\n} from '../../../Cache/VariablesAndData';\r\nimport PopAllNormalWrinklers from '../../HelperFunctions/PopWrinklers';\r\nimport { ClickTimes, CookieTimes } from '../../VariablesAndData';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport AddMissingAchievements from './CreateMissingAchievements';\r\n\r\n/**\r\n * This function adds stats created by CookieMonster to the stats page\r\n * It is called by CM.Disp.AddMenu\r\n * @param {object} title\tOn object that includes the title of the menu\r\n */\r\nexport default function AddMenuStats(title) {\r\n const stats = document.createElement('div');\r\n stats.className = 'subsection';\r\n stats.appendChild(title);\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Lucky Cookies', 'Lucky'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Lucky) {\r\n stats.appendChild(CreateSections.LuckySection());\r\n }\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Chain Cookies', 'Chain'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Chain) {\r\n stats.appendChild(CreateSections.ChainSection());\r\n }\r\n\r\n if (Game.Objects['Wizard tower'].minigameLoaded) {\r\n stats.appendChild(CreateElements.StatsHeader('Spells', 'Spells'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Spells) {\r\n stats.appendChild(CreateSections.SpellsSection());\r\n }\r\n }\r\n\r\n if (Game.Objects.Farm.minigameLoaded) {\r\n stats.appendChild(CreateElements.StatsHeader('Garden', 'Garden'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Garden) {\r\n stats.appendChild(CreateSections.GardenSection());\r\n }\r\n }\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Prestige', 'Prestige'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Prestige) {\r\n stats.appendChild(CreateSections.PrestigeSection());\r\n }\r\n\r\n if (Game.cpsSucked > 0) {\r\n stats.appendChild(CreateElements.StatsHeader('Wrinklers', 'Wrink'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Wrink) {\r\n const popAllFrag = document.createDocumentFragment();\r\n popAllFrag.appendChild(\r\n document.createTextNode(\r\n `${Beautify(CacheWrinklersTotal)} / ${Beautify(CacheWrinklersNormal)} `,\r\n ),\r\n );\r\n const popAllA = document.createElement('a');\r\n popAllA.textContent = 'Pop All Normal';\r\n popAllA.className = 'option';\r\n popAllA.onclick = function () {\r\n PopAllNormalWrinklers();\r\n };\r\n popAllFrag.appendChild(popAllA);\r\n stats.appendChild(\r\n CreateElements.StatsListing('basic', 'Rewards of Popping (All/Normal)', popAllFrag),\r\n );\r\n const popFattestFrag = document.createDocumentFragment();\r\n popFattestFrag.appendChild(document.createTextNode(`${Beautify(CacheWrinklersFattest[0])} `));\r\n const popFattestA = document.createElement('a');\r\n popFattestA.textContent = 'Pop Single Fattest';\r\n popFattestA.className = 'option';\r\n popFattestA.onclick = function () {\r\n if (CacheWrinklersFattest[1] !== null) Game.wrinklers[CacheWrinklersFattest[1]].hp = 0;\r\n };\r\n popFattestFrag.appendChild(popFattestA);\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n `Rewards of Popping Single Fattest Non-Shiny Wrinkler (id: ${\r\n CacheWrinklersFattest[1] !== null ? CacheWrinklersFattest[1] : 'None'\r\n })`,\r\n popFattestFrag,\r\n ),\r\n );\r\n }\r\n }\r\n\r\n stats.appendChild(CreateSections.SeasonSection());\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Achievements', 'Achievs'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Achievs) {\r\n Object.keys(Game.Objects).forEach((i) => {\r\n const ObjectsTillNext = CacheObjectsNextAchievement[i];\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n i,\r\n ObjectsTillNext.AmountNeeded < 101\r\n ? document.createTextNode(\r\n `Next achievement in ${ObjectsTillNext.AmountNeeded}, price: ${Beautify(\r\n ObjectsTillNext.price,\r\n )}`,\r\n )\r\n : document.createTextNode('No new achievement for next 100 buildings'),\r\n ),\r\n );\r\n });\r\n }\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Miscellaneous', 'Misc'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Misc) {\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n `Average cookies per second (past ${\r\n CookieTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist\r\n ] < 60\r\n ? `${\r\n CookieTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist\r\n ]\r\n } seconds`\r\n : CookieTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist\r\n ] /\r\n 60 +\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist === 3\r\n ? ' minute'\r\n : ' minutes')\r\n })`,\r\n document.createTextNode(Beautify(GetCPS(), 3)),\r\n ),\r\n );\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n `Average cookie clicks per second (past ${\r\n ClickTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist\r\n ]\r\n }${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist === 0\r\n ? ' second'\r\n : ' seconds'\r\n })`,\r\n document.createTextNode(Beautify(CacheAverageClicks, 1)),\r\n ),\r\n );\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n `Cookies from clicking (past ${\r\n ClickTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist\r\n ]\r\n }${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist === 0\r\n ? ' second'\r\n : ' seconds'\r\n })`,\r\n document.createTextNode(\r\n Beautify(\r\n CacheAverageCookiesFromClicks.calcSum(\r\n CacheAverageClicks *\r\n ClickTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist\r\n ],\r\n ),\r\n ),\r\n ),\r\n ),\r\n );\r\n if (Game.Has('Fortune cookies')) {\r\n const fortunes = [];\r\n Object.keys(GameData.Fortunes).forEach((i) => {\r\n if (!Game.Has(GameData.Fortunes[i])) {\r\n fortunes.push(GameData.Fortunes[i]);\r\n }\r\n });\r\n if (fortunes.length !== 0)\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n 'Fortune Upgrades Left to Buy',\r\n CreateElements.StatsMissDisp(fortunes),\r\n ),\r\n );\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ShowMissedGC) {\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n 'Missed golden cookies',\r\n document.createTextNode(Beautify(Game.missedGoldenClicks)),\r\n ),\r\n );\r\n }\r\n if (Game.prefs.autosave) {\r\n const timer = document.createElement('span');\r\n timer.id = 'CMStatsAutosaveTimer';\r\n timer.innerText = Game.sayTime(\r\n Game.fps * 60 - (Game.OnAscend ? 0 : Game.T % (Game.fps * 60)),\r\n 4,\r\n );\r\n stats.appendChild(CreateElements.StatsListing('basic', 'Time till autosave', timer));\r\n }\r\n }\r\n\r\n l('menu').insertBefore(stats, l('menu').childNodes[2]);\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingUpgrades) {\r\n AddMissingUpgrades();\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingAchievements) {\r\n AddMissingAchievements();\r\n }\r\n}\r\n","/** Functions to create the individual sections of the Statistics page */\r\n\r\nimport * as GameData from '../../../Data/Gamedata';\r\nimport { MaxChainCookieReward } from '../../../Cache/Stats/ChainCookies';\r\nimport {\r\n CacheAvgCPSWithChoEgg,\r\n CacheCentEgg,\r\n CacheChainFrenzyMaxReward,\r\n CacheChainFrenzyRequired,\r\n CacheChainFrenzyRequiredNext,\r\n CacheChainFrenzyWrathRequired,\r\n CacheChainFrenzyWrathRequiredNext,\r\n CacheChainMaxReward,\r\n CacheChainRequired,\r\n CacheChainRequiredNext,\r\n CacheChainWrathMaxReward,\r\n CacheChainWrathRequired,\r\n CacheChainWrathRequiredNext,\r\n CacheConjure,\r\n CacheConjureReward,\r\n CacheDragonsFortuneMultAdjustment,\r\n CacheEdifice,\r\n CacheEdificeBuilding,\r\n CacheGoldenCookiesMult,\r\n CacheHCPerSecond,\r\n CacheLastChoEgg,\r\n CacheLucky,\r\n CacheLuckyFrenzy,\r\n CacheLuckyReward,\r\n CacheLuckyRewardFrenzy,\r\n CacheLuckyWrathReward,\r\n CacheLuckyWrathRewardFrenzy,\r\n CacheNoGoldSwitchCookiesPS,\r\n CacheRealCookiesEarned,\r\n CacheSeaSpec,\r\n CacheWrathCookiesMult,\r\n CacheWrinklersTotal,\r\n} from '../../../Cache/VariablesAndData';\r\nimport ResetBonus from '../../../Sim/SimulationEvents/ResetAscension';\r\nimport CalculateLuckyLevels from '../../HelperFunctions/CalculateLuckyLevels';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../../HelperFunctions/GetWrinkConfigBank';\r\nimport { ColourGreen, ColourRed, ColourTextPre } from '../../VariablesAndData';\r\nimport {\r\n StatsListing,\r\n StatsHeader,\r\n StatsMissDisp,\r\n StatsMissDispListing,\r\n} from './CreateDOMElements';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../BeautifyAndFormatting/FormatTime';\r\n\r\n/**\r\n * This function creates the \"Lucky\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Lucky section\r\n */\r\nexport function LuckySection() {\r\n // This sets which tooltip to display for certain stats\r\n const goldCookTooltip = Game.auraMult(\"Dragon's Fortune\")\r\n ? 'GoldCookDragonsFortuneTooltipPlaceholder'\r\n : 'GoldCookTooltipPlaceholder';\r\n\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsLuckySection';\r\n\r\n const luckyColour = Game.cookies + GetWrinkConfigBank() < CacheLucky ? ColourRed : ColourGreen;\r\n const luckyTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheLucky\r\n ? FormatTime((CacheLucky - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const luckyReqFrag = document.createDocumentFragment();\r\n const luckyReqSpan = document.createElement('span');\r\n luckyReqSpan.style.fontWeight = 'bold';\r\n luckyReqSpan.className = ColourTextPre + luckyColour;\r\n luckyReqSpan.textContent = Beautify(CacheLucky);\r\n luckyReqFrag.appendChild(luckyReqSpan);\r\n if (luckyTime !== '') {\r\n const luckyReqSmall = document.createElement('small');\r\n luckyReqSmall.textContent = ` (${luckyTime})`;\r\n luckyReqFrag.appendChild(luckyReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing('withTooltip', '\"Lucky!\" cookies required', luckyReqFrag, goldCookTooltip),\r\n );\r\n\r\n const luckyColourFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheLuckyFrenzy ? ColourRed : ColourGreen;\r\n const luckyTimeFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheLuckyFrenzy\r\n ? FormatTime((CacheLuckyFrenzy - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const luckyReqFrenFrag = document.createDocumentFragment();\r\n const luckyReqFrenSpan = document.createElement('span');\r\n luckyReqFrenSpan.style.fontWeight = 'bold';\r\n luckyReqFrenSpan.className = ColourTextPre + luckyColourFrenzy;\r\n luckyReqFrenSpan.textContent = Beautify(CacheLuckyFrenzy);\r\n luckyReqFrenFrag.appendChild(luckyReqFrenSpan);\r\n if (luckyTimeFrenzy !== '') {\r\n const luckyReqFrenSmall = document.createElement('small');\r\n luckyReqFrenSmall.textContent = ` (${luckyTimeFrenzy})`;\r\n luckyReqFrenFrag.appendChild(luckyReqFrenSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Lucky!\" cookies required (frenzy)',\r\n luckyReqFrenFrag,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const luckySplit = CacheLuckyReward !== CacheLuckyWrathReward;\r\n\r\n const luckyRewardMaxSpan = document.createElement('span');\r\n luckyRewardMaxSpan.style.fontWeight = 'bold';\r\n luckyRewardMaxSpan.className = ColourTextPre + CacheLuckyReward;\r\n luckyRewardMaxSpan.textContent =\r\n Beautify(CacheLuckyReward) + (luckySplit ? ` / ${Beautify(CacheLuckyWrathReward)}` : '');\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n `\"Lucky!\" reward (max)${luckySplit ? ' (golden / wrath)' : ''}`,\r\n luckyRewardMaxSpan,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const luckyRewardFrenzyMaxSpan = document.createElement('span');\r\n luckyRewardFrenzyMaxSpan.style.fontWeight = 'bold';\r\n luckyRewardFrenzyMaxSpan.className = ColourTextPre + luckyRewardFrenzyMaxSpan;\r\n luckyRewardFrenzyMaxSpan.textContent =\r\n Beautify(CacheLuckyRewardFrenzy) +\r\n (luckySplit ? ` / ${Beautify(CacheLuckyWrathRewardFrenzy)}` : '');\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n `\"Lucky!\" reward (max) (frenzy)${luckySplit ? ' (golden / wrath)' : ''}`,\r\n luckyRewardFrenzyMaxSpan,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const luckyCurBase =\r\n Math.min(\r\n (Game.cookies + GetWrinkConfigBank()) * 0.15,\r\n CacheNoGoldSwitchCookiesPS * CacheDragonsFortuneMultAdjustment * 60 * 15,\r\n ) + 13;\r\n const luckyCurSpan = document.createElement('span');\r\n luckyCurSpan.style.fontWeight = 'bold';\r\n luckyCurSpan.className = ColourTextPre + luckyCurSpan;\r\n luckyCurSpan.textContent =\r\n Beautify(CacheGoldenCookiesMult * luckyCurBase) +\r\n (luckySplit ? ` / ${Beautify(CacheWrathCookiesMult * luckyCurBase)}` : '');\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n `\"Lucky!\" reward (cur)${luckySplit ? ' (golden / wrath)' : ''}`,\r\n luckyCurSpan,\r\n goldCookTooltip,\r\n ),\r\n );\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Chain\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Chain section\r\n */\r\nexport function ChainSection() {\r\n // This sets which tooltip to display for certain stats\r\n const goldCookTooltip = Game.auraMult(\"Dragon's Fortune\")\r\n ? 'GoldCookDragonsFortuneTooltipPlaceholder'\r\n : 'GoldCookTooltipPlaceholder';\r\n\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsChainSection';\r\n\r\n const chainColour =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainRequired ? ColourRed : ColourGreen;\r\n const chainTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainRequired\r\n ? FormatTime((CacheChainRequired - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const chainReqFrag = document.createDocumentFragment();\r\n const chainReqSpan = document.createElement('span');\r\n chainReqSpan.style.fontWeight = 'bold';\r\n chainReqSpan.className = ColourTextPre + chainColour;\r\n chainReqSpan.textContent = Beautify(CacheChainRequired);\r\n chainReqFrag.appendChild(chainReqSpan);\r\n if (chainTime !== '') {\r\n const chainReqSmall = document.createElement('small');\r\n chainReqSmall.textContent = ` (${chainTime})`;\r\n chainReqFrag.appendChild(chainReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing('withTooltip', '\"Chain\" cookies required', chainReqFrag, goldCookTooltip),\r\n );\r\n\r\n const chainWrathColour =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainWrathRequired ? ColourRed : ColourGreen;\r\n const chainWrathTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainWrathRequired\r\n ? FormatTime((CacheChainWrathRequired - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const chainWrathReqFrag = document.createDocumentFragment();\r\n const chainWrathReqSpan = document.createElement('span');\r\n chainWrathReqSpan.style.fontWeight = 'bold';\r\n chainWrathReqSpan.className = ColourTextPre + chainWrathColour;\r\n chainWrathReqSpan.textContent = Beautify(CacheChainWrathRequired);\r\n chainWrathReqFrag.appendChild(chainWrathReqSpan);\r\n if (chainWrathTime !== '') {\r\n const chainWrathReqSmall = document.createElement('small');\r\n chainWrathReqSmall.textContent = ` (${chainWrathTime})`;\r\n chainWrathReqFrag.appendChild(chainWrathReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" cookies required (Wrath)',\r\n chainWrathReqFrag,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const chainColourFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainFrenzyRequired ? ColourRed : ColourGreen;\r\n const chainTimeFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainFrenzyRequired\r\n ? FormatTime((CacheChainFrenzyRequired - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const chainReqFrenFrag = document.createDocumentFragment();\r\n const chainReqFrenSpan = document.createElement('span');\r\n chainReqFrenSpan.style.fontWeight = 'bold';\r\n chainReqFrenSpan.className = ColourTextPre + chainColourFrenzy;\r\n chainReqFrenSpan.textContent = Beautify(CacheChainFrenzyRequired);\r\n chainReqFrenFrag.appendChild(chainReqFrenSpan);\r\n if (chainTimeFrenzy !== '') {\r\n const chainReqFrenSmall = document.createElement('small');\r\n chainReqFrenSmall.textContent = ` (${chainTimeFrenzy})`;\r\n chainReqFrenFrag.appendChild(chainReqFrenSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" cookies required (Frenzy)',\r\n chainReqFrenFrag,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const chainWrathColourFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainFrenzyWrathRequired ? ColourRed : ColourGreen;\r\n const chainWrathTimeFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainFrenzyWrathRequired\r\n ? FormatTime(\r\n (CacheChainFrenzyWrathRequired - (Game.cookies + GetWrinkConfigBank())) / GetCPS(),\r\n )\r\n : '';\r\n const chainWrathReqFrenFrag = document.createDocumentFragment();\r\n const chainWrathReqFrenSpan = document.createElement('span');\r\n chainWrathReqFrenSpan.style.fontWeight = 'bold';\r\n chainWrathReqFrenSpan.className = ColourTextPre + chainWrathColourFrenzy;\r\n chainWrathReqFrenSpan.textContent = Beautify(CacheChainFrenzyWrathRequired);\r\n chainWrathReqFrenFrag.appendChild(chainWrathReqFrenSpan);\r\n if (chainWrathTimeFrenzy !== '') {\r\n const chainWrathReqFrenSmall = document.createElement('small');\r\n chainWrathReqFrenSmall.textContent = ` (${chainWrathTimeFrenzy})`;\r\n chainWrathReqFrenFrag.appendChild(chainWrathReqFrenSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" cookies required (frenzy) (Wrath)',\r\n chainWrathReqFrenFrag,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" reward (max) (golden / wrath)',\r\n document.createTextNode(\r\n `${Beautify(CacheChainMaxReward[0])} / ${Beautify(CacheChainWrathMaxReward[0])}`,\r\n ),\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" reward (max) (frenzy) (golden / wrath)',\r\n document.createTextNode(\r\n `${Beautify(CacheChainFrenzyMaxReward[0])} / ${Beautify(CacheChainFrenzyMaxReward[0])}`,\r\n ),\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const chainCurMax = Math.min(\r\n Game.cookiesPs * 60 * 60 * 6 * CacheDragonsFortuneMultAdjustment,\r\n Game.cookies * 0.5,\r\n );\r\n const chainCur = MaxChainCookieReward(7, chainCurMax, CacheGoldenCookiesMult)[0];\r\n const chainCurWrath = MaxChainCookieReward(6, chainCurMax, CacheWrathCookiesMult)[0];\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" reward (cur) (golden / wrath)',\r\n document.createTextNode(`${Beautify(chainCur)} / ${Beautify(chainCurWrath)}`),\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'CPS needed for next level (g / w)',\r\n document.createTextNode(\r\n `${Beautify(CacheChainRequiredNext)} / ${Beautify(CacheChainWrathRequiredNext)}`,\r\n ),\r\n 'ChainNextLevelPlaceholder',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'CPS needed for next level (frenzy) (g / w)',\r\n document.createTextNode(\r\n `${Beautify(CacheChainFrenzyRequiredNext)} / ${Beautify(\r\n CacheChainFrenzyWrathRequiredNext,\r\n )}`,\r\n ),\r\n 'ChainNextLevelPlaceholder',\r\n ),\r\n );\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Spells\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Spells section\r\n */\r\nexport function SpellsSection() {\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsSpellsSection';\r\n\r\n const conjureColour =\r\n Game.cookies + GetWrinkConfigBank() < CacheConjure ? ColourRed : ColourGreen;\r\n const conjureTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheConjure\r\n ? FormatTime((CacheConjure - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n\r\n const conjureReqFrag = document.createDocumentFragment();\r\n const conjureReqSpan = document.createElement('span');\r\n conjureReqSpan.style.fontWeight = 'bold';\r\n conjureReqSpan.className = ColourTextPre + conjureColour;\r\n conjureReqSpan.textContent = Beautify(CacheConjure);\r\n conjureReqFrag.appendChild(conjureReqSpan);\r\n if (conjureTime !== '') {\r\n const conjureReqSmall = document.createElement('small');\r\n conjureReqSmall.textContent = ` (${conjureTime})`;\r\n conjureReqFrag.appendChild(conjureReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" cookies required',\r\n conjureReqFrag,\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" reward (max)',\r\n document.createTextNode(Beautify(CacheConjureReward)),\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n\r\n const conjureFrenzyColour =\r\n Game.cookies + GetWrinkConfigBank() < CacheConjure * 7 ? ColourRed : ColourGreen;\r\n const conjureFrenzyCur = Math.min(\r\n (Game.cookies + GetWrinkConfigBank()) * 0.15,\r\n CacheNoGoldSwitchCookiesPS * 60 * 30,\r\n );\r\n const conjureFrenzyTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheConjure * 7\r\n ? FormatTime((CacheConjure * 7 - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n\r\n const conjureFrenzyReqFrag = document.createDocumentFragment();\r\n const conjureFrenzyReqSpan = document.createElement('span');\r\n conjureFrenzyReqSpan.style.fontWeight = 'bold';\r\n conjureFrenzyReqSpan.className = ColourTextPre + conjureFrenzyColour;\r\n conjureFrenzyReqSpan.textContent = Beautify(CacheConjure * 7);\r\n conjureFrenzyReqFrag.appendChild(conjureFrenzyReqSpan);\r\n if (conjureFrenzyTime !== '') {\r\n const conjureFrenzyReqSmall = document.createElement('small');\r\n conjureFrenzyReqSmall.textContent = ` (${conjureFrenzyTime})`;\r\n conjureFrenzyReqFrag.appendChild(conjureFrenzyReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" cookies required (frenzy)',\r\n conjureFrenzyReqFrag,\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" reward (max) (frenzy)',\r\n document.createTextNode(Beautify(CacheConjureReward * 7)),\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" reward (cur)',\r\n document.createTextNode(Beautify(conjureFrenzyCur)),\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n if (CacheEdifice) {\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Spontaneous Edifice\" cookies required (most expensive building)',\r\n document.createTextNode(`${Beautify(CacheEdifice)} (${CacheEdificeBuilding})`),\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n }\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Garden\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Spells section\r\n */\r\nexport function GardenSection() {\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsGardenSection';\r\n\r\n const bakeberryColour = Game.cookies < Game.cookiesPs * 60 * 10 * 100 ? ColourRed : ColourGreen;\r\n const bakeberryFrag = document.createElement('span');\r\n bakeberryFrag.style.fontWeight = 'bold';\r\n bakeberryFrag.className = ColourTextPre + bakeberryColour;\r\n bakeberryFrag.textContent = Beautify(Game.cookiesPs * 60 * 10 * 100);\r\n section.appendChild(\r\n StatsListing('basic', 'Cookies required for max reward of Bakeberry: ', bakeberryFrag),\r\n );\r\n\r\n const chocorootColour = Game.cookies < Game.cookiesPs * 60 * 100 ? ColourRed : ColourGreen;\r\n const chocorootFrag = document.createElement('span');\r\n chocorootFrag.style.fontWeight = 'bold';\r\n chocorootFrag.className = ColourTextPre + chocorootColour;\r\n chocorootFrag.textContent = Beautify(Game.cookiesPs * 60 * 100);\r\n section.appendChild(\r\n StatsListing('basic', 'Cookies required for max reward of Chocoroot: ', chocorootFrag),\r\n );\r\n\r\n const queenbeetColour = Game.cookies < Game.cookiesPs * 60 * 60 * 25 ? ColourRed : ColourGreen;\r\n const queenbeetFrag = document.createElement('span');\r\n queenbeetFrag.style.fontWeight = 'bold';\r\n queenbeetFrag.className = ColourTextPre + queenbeetColour;\r\n queenbeetFrag.textContent = Beautify(Game.cookiesPs * 60 * 60 * 25);\r\n section.appendChild(\r\n StatsListing('basic', 'Cookies required for max reward of Queenbeet: ', queenbeetFrag),\r\n );\r\n\r\n const duketaterColour = Game.cookies < Game.cookiesPs * 60 * 15 * 100 ? ColourRed : ColourGreen;\r\n const duketaterFrag = document.createElement('span');\r\n duketaterFrag.style.fontWeight = 'bold';\r\n duketaterFrag.className = ColourTextPre + duketaterColour;\r\n duketaterFrag.textContent = Beautify(Game.cookiesPs * 60 * 15 * 100);\r\n section.appendChild(\r\n StatsListing('basic', 'Cookies required for max reward of Duketater: ', duketaterFrag),\r\n );\r\n const missingPlantDrops = [];\r\n Object.keys(GameData.PlantDrops).forEach((i) => {\r\n if (!Game.HasUnlocked(GameData.PlantDrops[i])) {\r\n missingPlantDrops.push(GameData.PlantDrops[i]);\r\n }\r\n });\r\n if (missingPlantDrops.length !== 0) {\r\n section.appendChild(\r\n StatsListing('basic', 'Rare plant drops left to unlock', StatsMissDisp(missingPlantDrops)),\r\n );\r\n }\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Prestige\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Prestige section\r\n */\r\nexport function PrestigeSection() {\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsPrestigeSection';\r\n\r\n const possiblePresMax = Math.floor(\r\n Game.HowMuchPrestige(\r\n CacheRealCookiesEarned +\r\n Game.cookiesReset +\r\n CacheWrinklersTotal +\r\n (Game.HasUnlocked('Chocolate egg') && !Game.Has('Chocolate egg') ? CacheLastChoEgg : 0),\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'Prestige level (cur / max)',\r\n document.createTextNode(`${Beautify(Game.prestige)} / ${Beautify(possiblePresMax)}`),\r\n 'PrestMaxTooltipPlaceholder',\r\n ),\r\n );\r\n\r\n const neededCook = Math.max(\r\n 0,\r\n Game.HowManyCookiesReset(possiblePresMax + 1) -\r\n (CacheRealCookiesEarned +\r\n Game.cookiesReset +\r\n CacheWrinklersTotal +\r\n ((Game.HasUnlocked('Chocolate egg') && !Game.Has('Chocolate egg') ? CacheLastChoEgg : 0)\r\n ? CacheLastChoEgg\r\n : 0)),\r\n );\r\n const cookiesNextFrag = document.createDocumentFragment();\r\n cookiesNextFrag.appendChild(document.createTextNode(Beautify(neededCook)));\r\n const cookiesNextSmall = document.createElement('small');\r\n cookiesNextSmall.textContent = ` (${FormatTime(neededCook / CacheAvgCPSWithChoEgg, 1)})`;\r\n cookiesNextFrag.appendChild(cookiesNextSmall);\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'Cookies to next level',\r\n cookiesNextFrag,\r\n 'NextPrestTooltipPlaceholder',\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'Heavenly chips (cur / max)',\r\n document.createTextNode(\r\n `${Beautify(Game.heavenlyChips)} / ${Beautify(\r\n possiblePresMax - Game.prestige + Game.heavenlyChips,\r\n )}`,\r\n ),\r\n 'HeavenChipMaxTooltipPlaceholder',\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'basic',\r\n 'Heavenly chips per second (last 5 seconds)',\r\n document.createTextNode(Beautify(CacheHCPerSecond, 2)),\r\n ),\r\n );\r\n\r\n const HCTarget = Number(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.HeavenlyChipsTarget,\r\n );\r\n if (!Number.isNaN(HCTarget)) {\r\n const CookiesTillTarget =\r\n HCTarget - Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned));\r\n if (CookiesTillTarget > 0) {\r\n section.appendChild(\r\n StatsListing(\r\n 'basic',\r\n 'Heavenly chips to target set in settings (cur)',\r\n document.createTextNode(Beautify(CookiesTillTarget)),\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'basic',\r\n 'Time till target (cur, current 5 second average)',\r\n document.createTextNode(FormatTime(CookiesTillTarget / CacheHCPerSecond)),\r\n ),\r\n );\r\n }\r\n }\r\n\r\n const resetBonus = ResetBonus(possiblePresMax);\r\n const resetFrag = document.createDocumentFragment();\r\n resetFrag.appendChild(document.createTextNode(Beautify(resetBonus)));\r\n const increase = Math.round((resetBonus / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n const resetSmall = document.createElement('small');\r\n resetSmall.textContent = ` (${increase / 100}% of income)`;\r\n resetFrag.appendChild(resetSmall);\r\n }\r\n section.appendChild(\r\n StatsListing('withTooltip', 'Reset bonus income', resetFrag, 'ResetTooltipPlaceholder'),\r\n );\r\n\r\n const currentPrestige = Math.floor(Game.HowMuchPrestige(Game.cookiesReset));\r\n const willHave = Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned));\r\n const willGet = willHave - currentPrestige;\r\n const { luckyDigit, luckyNumber, luckyPayout } = CalculateLuckyLevels(willHave);\r\n if (!Game.Has('Lucky digit')) {\r\n const luckyDigitDelta = luckyDigit - willHave;\r\n const luckyDigitReset = willGet + luckyDigitDelta;\r\n const fragLuckyDigit = document.createDocumentFragment();\r\n fragLuckyDigit.appendChild(\r\n document.createTextNode(\r\n `${luckyDigit.toLocaleString()} / ${luckyDigitReset.toLocaleString()} (+${luckyDigitDelta})`,\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing('basic', 'Next \"Lucky Digit\" (total / reset)', fragLuckyDigit),\r\n );\r\n }\r\n\r\n if (!Game.Has('Lucky number')) {\r\n const luckyNumberDelta = luckyNumber - willHave;\r\n const luckyNumberReset = willGet + luckyNumberDelta;\r\n const fragLuckyNumber = document.createDocumentFragment();\r\n fragLuckyNumber.appendChild(\r\n document.createTextNode(\r\n `${luckyNumber.toLocaleString()} / ${luckyNumberReset.toLocaleString()} (+${luckyNumberDelta})`,\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing('basic', 'Next \"Lucky Number\" (total / reset)', fragLuckyNumber),\r\n );\r\n }\r\n\r\n if (!Game.Has('Lucky payout')) {\r\n const luckyPayoutDelta = luckyPayout - willHave;\r\n const luckyPayoutReset = willGet + luckyPayoutDelta;\r\n const fragLuckyPayout = document.createDocumentFragment();\r\n fragLuckyPayout.appendChild(\r\n document.createTextNode(\r\n `${luckyPayout.toLocaleString()} / ${luckyPayoutReset.toLocaleString()} (+${luckyPayoutDelta})`,\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing('basic', 'Next \"Lucky Payout\" (total / reset)', fragLuckyPayout),\r\n );\r\n }\r\n\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Season Specials\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Season Specials section\r\n */\r\nexport function SeasonSection() {\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsSeasonSection';\r\n\r\n let specDisp = false;\r\n const missingHalloweenCookies = [];\r\n Object.keys(GameData.HalloCookies).forEach((i) => {\r\n if (!Game.Has(GameData.HalloCookies[i])) {\r\n missingHalloweenCookies.push(GameData.HalloCookies[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const missingChristmasCookies = [];\r\n Object.keys(GameData.ChristCookies).forEach((i) => {\r\n if (!Game.Has(GameData.ChristCookies[i])) {\r\n missingChristmasCookies.push(GameData.ChristCookies[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const missingValentineCookies = [];\r\n Object.keys(GameData.ValCookies).forEach((i) => {\r\n if (!Game.Has(GameData.ValCookies[i])) {\r\n missingValentineCookies.push(GameData.ValCookies[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const missingNormalEggs = [];\r\n Object.keys(Game.eggDrops).forEach((i) => {\r\n if (!Game.HasUnlocked(Game.eggDrops[i])) {\r\n missingNormalEggs.push(Game.eggDrops[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const missingRareEggs = [];\r\n Object.keys(Game.rareEggDrops).forEach((i) => {\r\n if (!Game.HasUnlocked(Game.rareEggDrops[i])) {\r\n missingRareEggs.push(Game.rareEggDrops[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const choEgg = Game.HasUnlocked('Chocolate egg') && !Game.Has('Chocolate egg');\r\n const centEgg = Game.Has('Century egg');\r\n\r\n if (Game.season === 'christmas' || specDisp || choEgg || centEgg) {\r\n section.appendChild(StatsHeader('Season Specials', 'Sea'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Sea) {\r\n if (missingHalloweenCookies.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Halloween cookies left to buy',\r\n StatsMissDisp(missingHalloweenCookies),\r\n Game.season === 'halloween',\r\n ),\r\n );\r\n let failRateHalloween = 0.95;\r\n if (Game.HasAchiev('Spooky cookies')) failRateHalloween = 0.8;\r\n if (Game.Has('Starterror')) failRateHalloween *= 0.9;\r\n failRateHalloween *= 1 / Game.dropRateMult();\r\n if (Game.hasGod) {\r\n const godLvl = Game.hasGod('seasons');\r\n if (godLvl === 1) failRateHalloween *= 0.9;\r\n else if (godLvl === 2) failRateHalloween *= 0.95;\r\n else if (godLvl === 3) failRateHalloween *= 0.97;\r\n }\r\n const obtainedCookiesChance = missingHalloweenCookies.length / 7;\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Chance of receiving a cookie from wrinkler/shiny wrinkler',\r\n document.createTextNode(\r\n `${Beautify((1 - failRateHalloween) * obtainedCookiesChance * 100)}% / ${Beautify(\r\n (1 - failRateHalloween * 0.9) * obtainedCookiesChance * 100,\r\n )}%`,\r\n ),\r\n Game.season === 'halloween',\r\n ),\r\n );\r\n }\r\n if (missingChristmasCookies.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Christmas cookies left to buy',\r\n StatsMissDisp(missingChristmasCookies),\r\n Game.season === 'christmas',\r\n ),\r\n );\r\n let failRateChristmas = 0.8;\r\n if (Game.HasAchiev('Let it snow')) failRateChristmas = 0.6;\r\n failRateChristmas *= 1 / Game.dropRateMult();\r\n if (Game.Has('Starsnow')) failRateChristmas *= 0.95;\r\n if (Game.hasGod) {\r\n const godLvl = Game.hasGod('seasons');\r\n if (godLvl === 1) failRateChristmas *= 0.9;\r\n else if (godLvl === 2) failRateChristmas *= 0.95;\r\n else if (godLvl === 3) failRateChristmas *= 0.97;\r\n }\r\n const obtainedCookiesChance = missingChristmasCookies.length / 7;\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Chance of receiving a cookie from reindeer',\r\n document.createTextNode(\r\n `${Beautify((1 - failRateChristmas) * obtainedCookiesChance * 100)}%`,\r\n ),\r\n Game.season === 'christmas',\r\n ),\r\n );\r\n }\r\n if (missingValentineCookies.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Valentine cookies left to buy',\r\n StatsMissDisp(missingValentineCookies),\r\n Game.season === 'valentines',\r\n ),\r\n );\r\n }\r\n const dropRateEgg = function (StartingFailRate) {\r\n let failRateEgg = StartingFailRate * (1 / Game.dropRateMult());\r\n if (Game.HasAchiev('Hide & seek champion')) failRateEgg *= 0.7;\r\n if (Game.Has('Omelette')) failRateEgg *= 0.9;\r\n if (Game.Has('Starspawn')) failRateEgg *= 0.9;\r\n if (Game.hasGod) {\r\n const godLvl = Game.hasGod('seasons');\r\n if (godLvl === 1) failRateEgg *= 0.9;\r\n else if (godLvl === 2) failRateEgg *= 0.95;\r\n else if (godLvl === 3) failRateEgg *= 0.97;\r\n }\r\n // Calculations courtesy of @svschouw, at https://github.com/Aktanusa/CookieMonster/issues/25\r\n const succesRateEgg = 1 - failRateEgg;\r\n const obtainedEggs = Game.eggDrops.length - missingNormalEggs.length;\r\n const obtainedRareEggs = Game.rareEggDrops.length - missingRareEggs.length;\r\n const pNormal1 = succesRateEgg * 0.9 * (1 - obtainedEggs / Game.eggDrops.length);\r\n const pRare1 = succesRateEgg * 0.1 * (1 - obtainedRareEggs / Game.rareEggDrops.length);\r\n const pRedropNormal = succesRateEgg * 0.9 * (obtainedEggs / Game.eggDrops.length);\r\n const pRedropRare = succesRateEgg * 0.1 * (obtainedRareEggs / Game.rareEggDrops.length);\r\n const pRedrop = pRedropNormal + pRedropRare;\r\n const pNormal2 = pRedrop * 0.9 * (1 - obtainedEggs / Game.eggDrops.length);\r\n const pRare2 = pRedrop * 0.1 * (1 - obtainedRareEggs / Game.rareEggDrops.length);\r\n return [pNormal1 + pNormal2, pRare1 + pRare2];\r\n };\r\n if (missingNormalEggs.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Normal easter eggs left to unlock',\r\n StatsMissDisp(missingNormalEggs),\r\n Game.season === 'easter',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Chance of receiving an egg from wrinkler/golden cookie',\r\n document.createTextNode(\r\n `${Beautify(dropRateEgg(0.98)[0] * 100)}% / ${Beautify(dropRateEgg(0.9)[0] * 100)}%`,\r\n ),\r\n Game.season === 'easter',\r\n ),\r\n );\r\n }\r\n if (missingRareEggs.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Rare easter eggs left to unlock',\r\n StatsMissDisp(missingRareEggs),\r\n Game.season === 'easter',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Chance of receiving a rare egg from wrinkler/golden cookie',\r\n document.createTextNode(\r\n `${Beautify(dropRateEgg(0.98)[1] * 100)}% / ${Beautify(dropRateEgg(0.9)[1] * 100)}%`,\r\n ),\r\n Game.season === 'easter',\r\n ),\r\n );\r\n }\r\n\r\n if (Game.season === 'christmas')\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Reindeer reward',\r\n document.createTextNode(Beautify(CacheSeaSpec)),\r\n true,\r\n ),\r\n );\r\n if (choEgg) {\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'Chocolate egg cookies',\r\n document.createTextNode(Beautify(CacheLastChoEgg)),\r\n 'ChoEggTooltipPlaceholder',\r\n ),\r\n );\r\n }\r\n if (centEgg) {\r\n section.appendChild(\r\n StatsListing(\r\n 'basic',\r\n 'Century egg multiplier',\r\n document.createTextNode(`${Math.round((CacheCentEgg - 1) * 10000) / 100}%`),\r\n ),\r\n );\r\n }\r\n }\r\n }\r\n return section;\r\n}\r\n","import { CacheRealCookiesEarned } from '../../Cache/VariablesAndData';\r\nimport CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport { SimAchievementsOwned, SimCookiesPs, SimPrestige, SimUpgrades } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This function calculates the cookies per click difference betwene current and after a ascension\r\n * It is called by CM.Disp.CreateStatsPrestigeSection()\r\n * @param\t{number}\tnewHeavenlyChips\tThe total heavenly chips after ascension\r\n * @returns\t{number}\tResetCPS\t\t\tThe CPS difference after reset\r\n */\r\nexport default function ResetBonus(newHeavenlyChips) {\r\n // Calculate CPS with all Heavenly upgrades\r\n let curCPS = Game.cookiesPs;\r\n\r\n CopyData();\r\n\r\n if (SimUpgrades['Heavenly key'].bought === 0) {\r\n SimUpgrades['Heavenly chip secret'].bought = 1;\r\n SimUpgrades['Heavenly cookie stand'].bought = 1;\r\n SimUpgrades['Heavenly bakery'].bought = 1;\r\n SimUpgrades['Heavenly confectionery'].bought = 1;\r\n SimUpgrades['Heavenly key'].bought = 1;\r\n\r\n CalculateGains();\r\n\r\n curCPS = SimCookiesPs;\r\n\r\n CopyData();\r\n }\r\n\r\n if (CacheRealCookiesEarned >= 1000000) SimWin('Sacrifice');\r\n if (CacheRealCookiesEarned >= 1000000000) SimWin('Oblivion');\r\n if (CacheRealCookiesEarned >= 1000000000000) SimWin('From scratch');\r\n if (CacheRealCookiesEarned >= 1000000000000000) SimWin('Nihilism');\r\n if (CacheRealCookiesEarned >= 1000000000000000000) SimWin('Dematerialize');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000) SimWin('Nil zero zilch');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000) SimWin('Transcendence');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000) SimWin('Obliterate');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000) SimWin('Negative void');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000) SimWin('To crumbs, you say?');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000) SimWin('You get nothing');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000)\r\n SimWin('Humble rebeginnings');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000)\r\n SimWin('The end of the world');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000000)\r\n SimWin(\"Oh, you're back\");\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000000000)\r\n SimWin('Lazarus');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000000000000)\r\n SimWin('Smurf account');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000000000000000)\r\n SimWin(\"If at first you don't succeed\");\r\n\r\n SimUpgrades['Heavenly chip secret'].bought = 1;\r\n SimUpgrades['Heavenly cookie stand'].bought = 1;\r\n SimUpgrades['Heavenly bakery'].bought = 1;\r\n SimUpgrades['Heavenly confectionery'].bought = 1;\r\n SimUpgrades['Heavenly key'].bought = 1;\r\n\r\n SimPrestige = newHeavenlyChips;\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n\r\n const ResetCPS = SimCookiesPs - curCPS;\r\n\r\n // Reset Pretige level after calculation as it is used in CM.Sim.CalculateGains() so can't be local\r\n SimPrestige = Game.prestige;\r\n\r\n return ResetCPS;\r\n}\r\n","function CrateTooltipLockedAchievements(me) {\r\n const tags = [];\r\n if (me.pool === 'shadow') tags.push('Shadow Achievement', '#9700cf');\r\n else tags.push('Achievement', 0);\r\n tags.push('Locked', 0);\r\n\r\n let neuromancy = 0;\r\n if (Game.Has('Neuromancy') || (Game.sesame && me.pool === 'debug')) neuromancy = 1;\r\n if (neuromancy && me.won === 0) tags.push('Click to win!', '#00c462');\r\n else if (neuromancy && me.won > 0) tags.push('Click to lose!', '#00c462');\r\n\r\n let { icon } = me;\r\n if (me.iconFunction) icon = me.iconFunction();\r\n\r\n let { desc } = me;\r\n if (me.descFunc) desc = me.descFunc('stats');\r\n\r\n let tagsStr = '';\r\n for (let i = 0; i < tags.length; i += 2) {\r\n if (i % 2 === 0)\r\n tagsStr += ` <div class=\"tag\" style=\"color:${tags[i + 1] === 0 ? '#fff' : tags[i + 1]};\">[${\r\n tags[i]\r\n }]</div>`;\r\n }\r\n tagsStr = tagsStr.substring(1);\r\n\r\n return `<div style=\"padding:8px 4px;min-width:350px;opacity:0.5\">\r\n <div class=\"icon\" style=\"float:left;margin-left:-8px;margin-top:-8px;background-position:${\r\n -icon[0] * 48\r\n }px ${-icon[1] * 48}px;\"></div>\r\n <div class=\"name\">${me.name}</div>\r\n ${tagsStr}<div class=\"line\"></div><div class=\"description\">${desc}</div></div>\r\n ${\r\n Game.sesame\r\n ? `<div style=\"font-size:9px;\">Id : ${me.id} | Order : ${Math.floor(me.order)}${\r\n me.tier ? ` | Tier : ${me.tier}` : ''\r\n }</div>`\r\n : ''\r\n }`;\r\n}\r\n\r\n/**\r\n * This function overwrites the crates of missing achievements\r\n */\r\nexport default function AddMissingAchievements() {\r\n let achievs;\r\n Object.values(document.querySelectorAll('div.title')).forEach((i) => {\r\n if (i.textContent.includes('Achievements')) {\r\n achievs = i.parentElement.querySelectorAll('div.listing.crateBox')[0];\r\n }\r\n });\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingAchievements) {\r\n Object.values(achievs.children).forEach((achievsCrate) => {\r\n if (!achievsCrate.className.includes('enabled')) {\r\n const id = achievsCrate.onclick.toString().split(/\\[(.*)\\]/gi)[1];\r\n const { icon } = Game.AchievementsById[id];\r\n // eslint-disable-next-line no-param-reassign\r\n achievsCrate.style.backgroundPosition = `${-icon[0] * 48}px ${-icon[1] * 48}px`;\r\n // eslint-disable-next-line no-param-reassign\r\n achievsCrate.onmouseover = function () {\r\n if (!Game.mouseDown) {\r\n Game.setOnCrate(this);\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(\r\n this,\r\n () =>\r\n (function () {\r\n return CrateTooltipLockedAchievements(Game.AchievementsById[id]);\r\n })(),\r\n 'top',\r\n );\r\n Game.tooltip.wobble();\r\n }\r\n };\r\n }\r\n });\r\n }\r\n}\r\n","/**\r\n * This function fixes Game.mouseY as a result of bars that are added by CookieMonster\r\n * It is called by Game.UpdateWrinklers(), Game.UpdateSpecial() and the .onmousover of the BigCookie\r\n * before execution of their actual function\r\n */\r\nexport default function FixMouseY(target) {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 0\r\n ) {\r\n const timerBarHeight = parseInt(l('CMTimerBar').style.height, 10);\r\n Game.mouseY -= timerBarHeight;\r\n target();\r\n Game.mouseY += timerBarHeight;\r\n } else {\r\n target();\r\n }\r\n}\r\n","import jscolor from '@eastdesire/jscolor';\r\n\r\nimport CMBeautify from '../../Disp/BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../Disp/BeautifyAndFormatting/FormatTime';\r\nimport { AddAuraInfo, AddDragonLevelUpTooltip } from '../../Disp/Dragon/Dragon';\r\nimport AddMenu from '../../Disp/MenuSections/AddMenus';\r\nimport UpdateTitle from '../../Disp/TabTitle/TabTitle';\r\nimport ReplaceAscendTooltip from '../../Disp/Tooltips/AscendButton';\r\nimport UpdateTooltipLocation from '../../Disp/Tooltips/PositionLocation';\r\nimport { CMSayTime, Title } from '../../Disp/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport { SimDoSims } from '../../Sim/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport ReplaceTooltipUpgrade from '../ReplaceGameElements/TooltipUpgrades';\r\nimport {\r\n BackupFunctions,\r\n CenturyDateAtBeginLoop, // eslint-disable-line no-unused-vars\r\n CycliusDateAtBeginLoop, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\nimport FixMouseY from './FixMouse';\r\n\r\n/**\r\n * This function replaces certain native (from the base-game) functions\r\n */\r\nexport default function ReplaceNative() {\r\n // eslint-disable-next-line no-undef\r\n BackupFunctions.Beautify = Beautify;\r\n // eslint-disable-next-line no-undef\r\n Beautify = CMBeautify;\r\n\r\n BackupFunctions.CalculateGains = Game.CalculateGains;\r\n Game.CalculateGains = function () {\r\n BackupFunctions.CalculateGains();\r\n SimDoSims = 1;\r\n CycliusDateAtBeginLoop = Date.now();\r\n CenturyDateAtBeginLoop = Date.now();\r\n };\r\n\r\n BackupFunctions.tooltip = {};\r\n BackupFunctions.tooltip.draw = Game.tooltip.draw;\r\n BackupFunctions.tooltip.drawMod = new Function( // eslint-disable-line no-new-func\r\n `return ${Game.tooltip.draw.toString().split('this').join('Game.tooltip')}`,\r\n )();\r\n Game.tooltip.draw = function (from, text, origin) {\r\n BackupFunctions.tooltip.drawMod(from, text, origin);\r\n };\r\n\r\n BackupFunctions.tooltip.update = Game.tooltip.update;\r\n BackupFunctions.tooltip.updateMod = new Function( // eslint-disable-line no-new-func\r\n `return ${Game.tooltip.update.toString().split('this.').join('Game.tooltip.')}`,\r\n )();\r\n Game.tooltip.update = function () {\r\n BackupFunctions.tooltip.updateMod();\r\n UpdateTooltipLocation();\r\n };\r\n\r\n BackupFunctions.UpdateWrinklers = Game.UpdateWrinklers;\r\n Game.UpdateWrinklers = function () {\r\n FixMouseY(BackupFunctions.UpdateWrinklers);\r\n };\r\n\r\n BackupFunctions.UpdateSpecial = Game.UpdateSpecial;\r\n Game.UpdateSpecial = function () {\r\n FixMouseY(BackupFunctions.UpdateSpecial);\r\n };\r\n\r\n // Assumes newer browsers\r\n l('bigCookie').removeEventListener('click', Game.ClickCookie, false);\r\n l('bigCookie').addEventListener(\r\n 'click',\r\n (event) => {\r\n FixMouseY(() => Game.ClickCookie(event, 0));\r\n },\r\n false,\r\n );\r\n\r\n BackupFunctions.RebuildUpgrades = Game.RebuildUpgrades;\r\n Game.RebuildUpgrades = function () {\r\n BackupFunctions.RebuildUpgrades();\r\n ReplaceTooltipUpgrade();\r\n Game.CalculateGains();\r\n };\r\n\r\n BackupFunctions.ClickProduct = Game.ClickProduct;\r\n /**\r\n * This function adds a check to the purchase of a building to allow BulkBuyBlock to work.\r\n * If the options is 1 (on) bulkPrice is under cookies you can't buy the building.\r\n */\r\n Game.ClickProduct = function (what) {\r\n if (\r\n !Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BulkBuyBlock ||\r\n Game.ObjectsById[what].bulkPrice <= Game.cookies ||\r\n Game.buyMode === -1\r\n ) {\r\n BackupFunctions.ClickProduct(what);\r\n }\r\n };\r\n\r\n BackupFunctions.DescribeDragonAura = Game.DescribeDragonAura;\r\n /**\r\n * This function adds the function CM.Disp.AddAuraInfo() to Game.DescribeDragonAura()\r\n * This adds information about CPS differences and costs to the aura choosing interface\r\n * @param\t{number}\taura\tThe number of the aura currently selected by the mouse/user\r\n */\r\n Game.DescribeDragonAura = function (aura) {\r\n BackupFunctions.DescribeDragonAura(aura);\r\n AddAuraInfo(aura);\r\n };\r\n\r\n BackupFunctions.ToggleSpecialMenu = Game.ToggleSpecialMenu;\r\n /**\r\n * This function adds the code to display the tooltips for the levelUp button of the dragon\r\n */\r\n Game.ToggleSpecialMenu = function (on) {\r\n BackupFunctions.ToggleSpecialMenu(on);\r\n AddDragonLevelUpTooltip();\r\n };\r\n\r\n BackupFunctions.UpdateMenu = Game.UpdateMenu;\r\n Game.UpdateMenu = function () {\r\n if (typeof jscolor.picker === 'undefined' || typeof jscolor.picker.owner === 'undefined') {\r\n BackupFunctions.UpdateMenu();\r\n AddMenu();\r\n }\r\n };\r\n\r\n BackupFunctions.sayTime = Game.sayTime;\r\n // eslint-disable-next-line no-unused-vars\r\n CMSayTime = function (time, detail) {\r\n if (Number.isNaN(time) || time <= 0) return BackupFunctions.sayTime(time, detail);\r\n return FormatTime(time / Game.fps, 1);\r\n };\r\n\r\n BackupFunctions.Logic = Game.Logic;\r\n Game.Logic = function () {\r\n BackupFunctions.Logic();\r\n\r\n // Update tab title\r\n let title = 'Cookie Clicker';\r\n if (Game.season === 'fools') title = 'Cookie Baker';\r\n // eslint-disable-next-line no-unused-vars\r\n Title = `${Game.OnAscend ? 'Ascending! ' : ''}${CMBeautify(Game.cookies)} ${\r\n Game.cookies === 1 ? 'cookie' : 'cookies'\r\n } - ${title}`;\r\n UpdateTitle();\r\n\r\n // Since the Ascend Tooltip is not actually a tooltip we need to add our additional info here...\r\n ReplaceAscendTooltip();\r\n };\r\n}\r\n","/**\r\n * This function updates the location of the tooltip\r\n * It is called by Game.tooltip.update() because of CM.Main.ReplaceNative()\r\n */\r\nexport default function UpdateTooltipLocation() {\r\n if (Game.tooltip.origin === 'store') {\r\n let warnOffset = 0;\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLucky === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos === 1 &&\r\n l('CMDispTooltipWarningParent') !== null\r\n ) {\r\n warnOffset = l('CMDispTooltipWarningParent').clientHeight - 4;\r\n }\r\n Game.tooltip.tta.style.top = `${Math.min(\r\n parseInt(Game.tooltip.tta.style.top, 10),\r\n l('game').clientHeight +\r\n l('topBar').clientHeight -\r\n Game.tooltip.tt.clientHeight -\r\n warnOffset -\r\n 46,\r\n )}px`;\r\n }\r\n // Kept for future possible use if the code changes again\r\n /* else if (!Game.onCrate && !Game.OnAscend && CM.Options.TimerBar === 1 && CM.Options.TimerBarPos === 0) {\r\n\t\tGame.tooltip.tta.style.top = (parseInt(Game.tooltip.tta.style.top) + parseInt(CM.Disp.TimerBar.style.height)) + 'px';\r\n\t} */\r\n}\r\n","import { CreateTooltip } from '../../Disp/Tooltips/Tooltip';\r\nimport { TooltipUpgradeBackup } from '../VariablesAndData';\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of upgrades so that it calls CM.Disp.Tooltip()\r\n * CM.Disp.Tooltip() sets the tooltip type to 'u'\r\n * It is called by Game.RebuildUpgrades() through CM.Main.ReplaceNative() and is therefore not permanent like the other ReplaceTooltip functions\r\n */\r\nexport default function ReplaceTooltipUpgrade() {\r\n TooltipUpgradeBackup = [];\r\n Object.keys(Game.UpgradesInStore).forEach((i) => {\r\n if (l(`upgrade${i}`).onmouseover !== null) {\r\n TooltipUpgradeBackup[i] = l(`upgrade${i}`).onmouseover;\r\n l(`upgrade${i}`).onmouseover = function () {\r\n if (!Game.mouseDown) {\r\n Game.setOnCrate(this);\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('u', `${i}`), 'store');\r\n Game.tooltip.wobble();\r\n }\r\n };\r\n }\r\n });\r\n}\r\n","/** Functions related to the Dragon */\r\n\r\nimport CacheDragonCost from '../../Cache/Dragon/Dragon';\r\nimport { CacheCostDragonUpgrade } from '../../Cache/VariablesAndData';\r\nimport CalculateChangeAura from '../../Sim/SimulationEvents/AuraChange';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../BeautifyAndFormatting/FormatTime';\r\n\r\n/**\r\n * This functions adds the two extra lines about CPS and time to recover to the aura picker infoscreen\r\n * @param\t{number}\taura\tThe number of the aura currently selected by the mouse/user\r\n */\r\nexport function AddAuraInfo(aura) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.DragonAuraInfo === 1) {\r\n const [bonusCPS, priceOfChange] = CalculateChangeAura(aura);\r\n const timeToRecover = FormatTime(priceOfChange / (bonusCPS + Game.cookiesPs));\r\n let bonusCPSPercentage;\r\n if (Game.cookiesPs === 0) bonusCPSPercentage = Beautify(Infinity);\r\n else bonusCPSPercentage = Beautify((bonusCPS / Game.cookiesPs) * 100);\r\n\r\n l('dragonAuraInfo').style.minHeight = '60px';\r\n l('dragonAuraInfo').style.margin = '8px';\r\n l('dragonAuraInfo').appendChild(document.createElement('div')).className = 'line';\r\n const div = document.createElement('div');\r\n div.style.minWidth = '200px';\r\n div.style.textAlign = 'center';\r\n div.textContent = `Picking this aura will change CPS by ${Beautify(\r\n bonusCPS,\r\n )} (${bonusCPSPercentage}% of current CPS).`;\r\n l('dragonAuraInfo').appendChild(div);\r\n const div2 = document.createElement('div');\r\n div2.style.minWidth = '200px';\r\n div2.style.textAlign = 'center';\r\n div2.textContent = `It will take ${timeToRecover} to recover the cost.`;\r\n l('dragonAuraInfo').appendChild(div2);\r\n }\r\n}\r\n\r\n/**\r\n * This functions adds a tooltip to the level up button displaying the cost of rebuying all\r\n * It is called by Game.ToggleSpecialMenu() after CM.Main.ReplaceNative()\r\n */\r\nexport function AddDragonLevelUpTooltip() {\r\n // Check if it is the dragon popup that is on screen\r\n if (\r\n (l('specialPopup').className.match(/onScreen/) &&\r\n l('specialPopup').children[0].style.background.match(/dragon/)) !== null\r\n ) {\r\n for (let i = 0; i < l('specialPopup').childNodes.length; i++) {\r\n if (l('specialPopup').childNodes[i].className === 'optionBox') {\r\n l('specialPopup').children[i].onmouseover = function () {\r\n CacheDragonCost();\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(\r\n l('specialPopup'),\r\n `<div style=\"min-width:200px;text-align:center;\">${CacheCostDragonUpgrade}</div>`,\r\n 'this',\r\n );\r\n Game.tooltip.wobble();\r\n };\r\n l('specialPopup').children[i].onmouseout = function () {\r\n Game.tooltip.shouldHide = 1;\r\n };\r\n }\r\n }\r\n }\r\n}\r\n","import { CacheDragonAura, CacheDragonAura2 } from '../../Cache/VariablesAndData';\r\nimport CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport {\r\n SimAchievementsOwned,\r\n SimBuildingsOwned, // eslint-disable-line no-unused-vars\r\n SimCookiesPs,\r\n SimDragonAura,\r\n SimDragonAura2,\r\n SimObjects,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions calculates the cps and cost of changing a Dragon Aura\r\n * It is called by CM.Disp.AddAuraInfo()\r\n * @param\t{number}\t\t\taura\t\t\t\t\t\t\t\t\t\tThe number of the aura currently selected by the mouse/user\r\n * @returns {[number, number]} \t[CM.Sim.cookiesPs - Game.cookiesPs, price]\tThe bonus cps and the price of the change\r\n */\r\nexport default function CalculateChangeAura(aura) {\r\n CopyData();\r\n\r\n // Check if aura being changed is first or second aura\r\n const auraToBeChanged = l('promptContent').children[0].innerHTML.includes('secondary');\r\n if (auraToBeChanged) SimDragonAura2 = aura;\r\n else SimDragonAura = aura;\r\n\r\n // Sell highest building but only if aura is different\r\n let price = 0;\r\n if (SimDragonAura !== CacheDragonAura || SimDragonAura2 !== CacheDragonAura2) {\r\n for (let i = Game.ObjectsById.length - 1; i > -1; --i) {\r\n if (Game.ObjectsById[i].amount > 0) {\r\n const highestBuilding = SimObjects[Game.ObjectsById[i].name].name;\r\n SimObjects[highestBuilding].amount -= 1;\r\n SimBuildingsOwned -= 1;\r\n price =\r\n SimObjects[highestBuilding].basePrice *\r\n Game.priceIncrease **\r\n Math.max(0, SimObjects[highestBuilding].amount - 1 - SimObjects[highestBuilding].free);\r\n price = Game.modifyBuildingPrice(SimObjects[highestBuilding], price);\r\n price = Math.ceil(price);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n return [SimCookiesPs - Game.cookiesPs, price];\r\n}\r\n","import createMenuOptions from './createMenuOptions';\r\nimport AddMenuStats from './Statistics/AddStatsPage';\r\n\r\n/**\r\n * This function adds the calll the functions to add extra info to the stats and options pages\r\n */\r\nexport default function AddMenu() {\r\n const title = document.createElement('div');\r\n title.className = 'title';\r\n\r\n if (Game.onMenu === 'stats') {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Stats) {\r\n title.textContent = 'Cookie Monster Statistics';\r\n AddMenuStats(title);\r\n }\r\n } else if (Game.onMenu === 'prefs') {\r\n // Added because Framework is broken\r\n l('menu').childNodes[2].insertBefore(\r\n createMenuOptions(),\r\n l('menu').childNodes[2].childNodes[l('menu').childNodes[2].childNodes.length - 1],\r\n );\r\n }\r\n}\r\n","/** Functions related to updating the tab in the browser's tab-bar */\r\n\r\nimport { CacheSeasonPopShimmer, CacheSpawnedGoldenShimmer } from '../../Cache/VariablesAndData';\r\n\r\nimport { LastSeasonPopupState, LastTickerFortuneState } from '../../Main/VariablesAndData';\r\nimport { Title } from '../VariablesAndData';\r\n\r\n/**\r\n * This function updates the tab title\r\n * It is called on every loop by Game.Logic() which also sets CM.Disp.Title to Game.cookies\r\n */\r\nexport default function UpdateTitle() {\r\n if (\r\n Game.OnAscend ||\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title === 0\r\n ) {\r\n document.title = Title;\r\n } else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title === 1) {\r\n let addFC = false;\r\n let addSP = false;\r\n let titleGC;\r\n let titleFC;\r\n let titleSP;\r\n\r\n if (CacheSpawnedGoldenShimmer) {\r\n if (CacheSpawnedGoldenShimmer.wrath)\r\n titleGC = `[W${Math.ceil(CacheSpawnedGoldenShimmer.life / Game.fps)}]`;\r\n else titleGC = `[G${Math.ceil(CacheSpawnedGoldenShimmer.life / Game.fps)}]`;\r\n } else if (!Game.Has('Golden switch [off]')) {\r\n titleGC = `[${Number(l('CMTimerBarGCMinBar').textContent) < 0 ? '!' : ''}${Math.ceil(\r\n (Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.time) / Game.fps,\r\n )}]`;\r\n } else titleGC = '[GS]';\r\n\r\n if (LastTickerFortuneState) {\r\n addFC = true;\r\n titleFC = '[F]';\r\n }\r\n\r\n if (Game.season === 'christmas') {\r\n addSP = true;\r\n if (LastSeasonPopupState) titleSP = `[R${Math.ceil(CacheSeasonPopShimmer.life / Game.fps)}]`;\r\n else {\r\n titleSP = `[${Number(l('CMTimerBarRenMinBar').textContent) < 0 ? '!' : ''}${Math.ceil(\r\n (Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.time) / Game.fps,\r\n )}]`;\r\n }\r\n }\r\n\r\n // Remove previous timers and add current cookies\r\n let str = Title;\r\n if (str.charAt(0) === '[') {\r\n str = str.substring(str.lastIndexOf(']') + 1);\r\n }\r\n document.title = `${titleGC + (addFC ? titleFC : '') + (addSP ? titleSP : '')} ${str}`;\r\n } else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title === 2) {\r\n let str = '';\r\n let spawn = false;\r\n if (CacheSpawnedGoldenShimmer) {\r\n spawn = true;\r\n if (CacheSpawnedGoldenShimmer.wrath)\r\n str += `[W${Math.ceil(CacheSpawnedGoldenShimmer.life / Game.fps)}]`;\r\n else str += `[G${Math.ceil(CacheSpawnedGoldenShimmer.life / Game.fps)}]`;\r\n }\r\n if (LastTickerFortuneState) {\r\n spawn = true;\r\n str += '[F]';\r\n }\r\n if (Game.season === 'christmas' && LastSeasonPopupState) {\r\n str += `[R${Math.ceil(CacheSeasonPopShimmer.life / Game.fps)}]`;\r\n spawn = true;\r\n }\r\n if (spawn) str += ' - ';\r\n let title = 'Cookie Clicker';\r\n if (Game.season === 'fools') title = 'Cookie Baker';\r\n str += title;\r\n document.title = str;\r\n }\r\n}\r\n","import {\r\n CacheHCPerSecond,\r\n CacheLastHeavenlyChips,\r\n CacheTimeTillNextPrestige,\r\n} from '../../Cache/VariablesAndData';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\n\r\n/**\r\n * This function creates a header object for tooltips.\r\n * @param\t{string}\ttext\tTitle of header\r\n * @returns {object}\tdiv\t\tAn object containing the stylized header\r\n */\r\nexport default function ReplaceAscendTooltip() {\r\n const cookiesToNext = Math.max(\r\n 0,\r\n Game.HowManyCookiesReset(\r\n Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned)) + 1,\r\n ) -\r\n (Game.cookiesEarned + Game.cookiesReset),\r\n );\r\n\r\n const startDate = Game.sayTime(((Date.now() - Game.startDate) / 1000) * Game.fps, -1);\r\n let str = `You've been on this run for <b>${\r\n startDate === '' ? 'not very long' : startDate\r\n }</b>.<br>\r\n <div class=\"line\"></div>`;\r\n if (Game.prestige > 0) {\r\n str += `Your prestige level is currently <b>${Beautify(Game.prestige)}</b>.<br>(CpS +${Beautify(\r\n Game.prestige,\r\n )}%)\r\n <div class=\"line\"></div>`;\r\n }\r\n if (CacheLastHeavenlyChips < 1) str += 'Ascending now would grant you no prestige.';\r\n else if (CacheLastHeavenlyChips < 2)\r\n str +=\r\n 'Ascending now would grant you<br><b>1 prestige level</b> (+1% CpS)<br>and <b>1 heavenly chip</b> to spend.';\r\n else\r\n str += `Ascending now would grant you<br><b>${Beautify(\r\n CacheLastHeavenlyChips,\r\n )} prestige levels</b> (+${Beautify(CacheLastHeavenlyChips)}% CpS)<br>and <b>${Beautify(\r\n CacheLastHeavenlyChips,\r\n )} heavenly chips</b> to spend.`;\r\n str += `<div class=\"line\"></div>\r\n You need <b>${Beautify(cookiesToNext)} more cookies</b> for the next level.<br>\r\n ${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipAscendButton\r\n ? `<div class='line'></div>It takes ${CacheTimeTillNextPrestige} to reach the next level and you were making ${Beautify(\r\n CacheHCPerSecond,\r\n 2,\r\n )} chips on average in the last 5 seconds.<br>`\r\n : ''\r\n }`;\r\n l('ascendTooltip').innerHTML = str;\r\n}\r\n","import InitCache from '../Cache/CacheInit';\r\nimport { CacheStatsCookies } from '../Cache/Stats/Stats';\r\nimport { VersionMajor, VersionMinor } from '../Data/Moddata';\r\nimport CreateUpgradeBar from '../Disp/BuildingsUpgrades/UpgradeBar';\r\nimport { CreateBotBar } from '../Disp/InfoBars/BottomBar';\r\nimport { CreateTimerBar } from '../Disp/InfoBars/TimerBar';\r\nimport CreateSectionHideButtons from '../Disp/Initialization/CreateSectionHideButtons';\r\nimport CreateWrinklerButtons from '../Disp/Initialization/CreateWrinklerButton';\r\nimport CreateCssArea from '../Disp/Initialization/CssArea';\r\nimport UpdateBuildingUpgradeStyle from '../Disp/Initialization/UpdateBuildingUpgradeStyle';\r\nimport { CreateFavicon } from '../Disp/TabTitle/FavIcon';\r\nimport { CreateSimpleTooltip } from '../Disp/Tooltips/Tooltip';\r\nimport { CMLastAscendState, TooltipText } from '../Disp/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport InitData from '../Sim/InitializeData/InitData';\r\nimport ReplaceNativeGrimoire from './ReplaceGameElements/NativeGrimoire';\r\nimport ReplaceTooltips from './ReplaceGameElements/Tooltips';\r\nimport ReplaceNative from './ReplaceGameFunctions/ReplaceNative';\r\nimport { LastModCount } from './VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport AddWrinklerAreaDetect from './WrinklerArea/AddDetectArea';\r\nimport createBuildingLockButtons from '../Disp/buildingTiles/createBuildingLockButtons';\r\n// import createMenuInfo from '../Disp/MenuSections/createMenuInfo';\r\nimport createMenuOptions from '../Disp/MenuSections/createMenuOptions';\r\n\r\n/**\r\n * Initialization loop of Cookie Monster\r\n */\r\nexport default function InitializeCookieMonster() {\r\n // Create global data object\r\n window.CookieMonsterData = {};\r\n\r\n // Register listeners in Cookie Monster Mod Framework\r\n // Commented because Framework is currently broken\r\n // Game.mods.cookieMonsterFramework.listeners.infoMenu.push(createMenuInfo);\r\n Game.mods.cookieMonsterFramework.listeners.optionsMenu.push(createMenuOptions);\r\n\r\n InitData();\r\n CacheStatsCookies();\r\n InitCache();\r\n\r\n // Stored to check if we need to re-initiliaze data\r\n LastModCount = Object.keys(Game.mods).length;\r\n\r\n // Creating visual elements\r\n CreateCssArea();\r\n CreateBotBar();\r\n CreateTimerBar();\r\n CreateUpgradeBar();\r\n CreateSectionHideButtons();\r\n CreateFavicon();\r\n Object.keys(TooltipText).forEach((i) => {\r\n CreateSimpleTooltip(TooltipText[i][0], TooltipText[i][1], TooltipText[i][2]);\r\n });\r\n CreateWrinklerButtons();\r\n UpdateBuildingUpgradeStyle();\r\n createBuildingLockButtons();\r\n\r\n ReplaceTooltips();\r\n AddWrinklerAreaDetect();\r\n\r\n // Replace native functions\r\n ReplaceNative();\r\n ReplaceNativeGrimoire();\r\n Game.CalculateGains();\r\n\r\n CMLastAscendState = Game.OnAscend;\r\n\r\n if (Game.prefs.popups)\r\n Game.Popup(`Cookie Monster version ${VersionMajor}.${VersionMinor} loaded!`);\r\n else Game.Notify(`Cookie Monster version ${VersionMajor}.${VersionMinor} loaded!`, '', '', 1, 1);\r\n\r\n Game.Win('Third-party');\r\n}\r\n","import { DispCSS } from '../VariablesAndData';\r\n\r\n/**\r\n * This function creates a CSS style that stores certain standard CSS classes used by CookieMonster\r\n\r\n */\r\nexport default function CreateCssArea() {\r\n DispCSS = document.createElement('style');\r\n DispCSS.type = 'text/css';\r\n DispCSS.id = 'CMCSS';\r\n\r\n document.head.appendChild(DispCSS);\r\n}\r\n","import {\r\n ColourBackPre,\r\n ColourBlue,\r\n ColourGray,\r\n ColourGreen,\r\n ColourOrange,\r\n ColourPurple,\r\n ColourRed,\r\n ColourTextPre,\r\n ColourYellow,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function creates the legend for the upgrade bar\r\n * @returns\t{object}\tlegend\tThe legend-object to be added\r\n */\r\nfunction CreateUpgradeBarLegend() {\r\n const legend = document.createElement('div');\r\n legend.style.minWidth = '330px';\r\n legend.style.marginBottom = '4px';\r\n const title = document.createElement('div');\r\n title.className = 'name';\r\n title.style.marginBottom = '4px';\r\n title.textContent = 'Legend';\r\n legend.appendChild(title);\r\n\r\n const legendLine = function (colour, text) {\r\n const div = document.createElement('div');\r\n div.style.verticalAlign = 'middle';\r\n const span = document.createElement('span');\r\n span.className = ColourBackPre + colour;\r\n span.style.display = 'inline-block';\r\n span.style.height = '10px';\r\n span.style.width = '10px';\r\n span.style.marginRight = '4px';\r\n div.appendChild(span);\r\n div.appendChild(document.createTextNode(text));\r\n return div;\r\n };\r\n\r\n legend.appendChild(legendLine(ColourBlue, 'Better than the best PP of a building option'));\r\n legend.appendChild(legendLine(ColourGreen, 'Same as the best PP building option'));\r\n legend.appendChild(legendLine(ColourYellow, 'Within the top 10 of PP for buildings'));\r\n legend.appendChild(legendLine(ColourOrange, 'Within the top 20 of PP for buildings'));\r\n legend.appendChild(legendLine(ColourRed, 'Within the top 30 of PP for buildings'));\r\n legend.appendChild(legendLine(ColourPurple, 'Outside of the top 30 of PP for buildings'));\r\n legend.appendChild(legendLine(ColourGray, 'Negative or infinity PP'));\r\n return legend;\r\n}\r\n\r\n/**\r\n * This function creates the upgrade bar above the upgrade-section in the right section of the screen\r\n */\r\nexport default function CreateUpgradeBar() {\r\n const UpgradeBar = document.createElement('div');\r\n UpgradeBar.id = 'CMUpgradeBar';\r\n UpgradeBar.style.width = '100%';\r\n UpgradeBar.style.backgroundColor = 'black';\r\n UpgradeBar.style.textAlign = 'center';\r\n UpgradeBar.style.fontWeight = 'bold';\r\n UpgradeBar.style.display = 'none';\r\n UpgradeBar.style.zIndex = '21';\r\n UpgradeBar.onmouseout = function () {\r\n Game.tooltip.hide();\r\n };\r\n\r\n const placeholder = document.createElement('div');\r\n placeholder.appendChild(CreateUpgradeBarLegend());\r\n UpgradeBar.onmouseover = function () {\r\n Game.tooltip.draw(this, escape(placeholder.innerHTML), 'store');\r\n };\r\n\r\n const upgradeNumber = function (id, colour) {\r\n const span = document.createElement('span');\r\n span.id = id;\r\n span.className = ColourTextPre + colour;\r\n span.style.width = '14.28571428571429%';\r\n span.style.display = 'inline-block';\r\n span.textContent = '0';\r\n return span;\r\n };\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarBlue', ColourBlue));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarGreen', ColourGreen));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarYellow', ColourYellow));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarOrange', ColourOrange));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarRed', ColourRed));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarPurple', ColourPurple));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarGray', ColourGray));\r\n\r\n l('upgrades').parentNode.insertBefore(UpgradeBar, l('upgrades').parentNode.childNodes[3]);\r\n}\r\n","/**\r\n * This function creates two objects at the top of the right column that allowing hiding the upgrade and building section\r\n */\r\nexport default function CreateSectionHideButtons() {\r\n const div = document.createElement('div');\r\n div.id = 'CMSectionHidButtons';\r\n div.style.textAlign = 'center';\r\n const a = document.createElement('a');\r\n a.className = 'option';\r\n a.onclick = function () {\r\n if (l('upgrades').style.display === 'flex') {\r\n l('upgrades').style.display = 'none';\r\n l('toggleUpgrades').style.display = 'none';\r\n l('techUpgrades').style.display = 'none';\r\n l('vaultUpgrades').style.display = 'none';\r\n } else {\r\n l('upgrades').style.display = 'flex';\r\n if (l('toggleUpgrades').children.length !== 0) l('toggleUpgrades').style.display = 'block';\r\n if (l('techUpgrades').children.length !== 0) l('techUpgrades').style.display = 'block';\r\n if (l('vaultUpgrades').children.length !== 0) l('vaultUpgrades').style.display = 'block';\r\n }\r\n };\r\n a.textContent = 'Hide/Show Upgrades';\r\n div.appendChild(a);\r\n const b = document.createElement('a');\r\n b.className = 'option';\r\n b.onclick = function () {\r\n if (l('products').style.display === 'grid') l('products').style.display = 'none';\r\n else l('products').style.display = 'grid';\r\n };\r\n b.textContent = 'Hide/Show Buildings';\r\n div.appendChild(b);\r\n l('store').insertBefore(div, l('store').childNodes[2]);\r\n}\r\n","import { CacheWrinklersFattest } from '../../Cache/VariablesAndData';\r\nimport PopAllNormalWrinklers from '../HelperFunctions/PopWrinklers';\r\nimport { CreateTooltip } from '../Tooltips/Tooltip';\r\n\r\n/**\r\n * This function creates two objects at the bottom of the left column that allowing popping of wrinklers\r\n */\r\nexport default function CreateWrinklerButtons() {\r\n const popAllA = document.createElement('a');\r\n popAllA.id = 'PopAllNormalWrinklerButton';\r\n popAllA.textContent = 'Pop All Normal';\r\n popAllA.className = 'option';\r\n popAllA.onclick = function () {\r\n PopAllNormalWrinklers();\r\n };\r\n popAllA.onmouseout = function () {\r\n Game.tooltip.shouldHide = 1;\r\n };\r\n popAllA.onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('wb', 'PopAllNormal'), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n l('sectionLeftExtra').children[0].append(popAllA);\r\n const popFattestA = document.createElement('a');\r\n popFattestA.id = 'PopFattestWrinklerButton';\r\n popFattestA.textContent = 'Pop Single Fattest';\r\n popFattestA.className = 'option';\r\n popFattestA.onclick = function () {\r\n if (CacheWrinklersFattest[1] !== null) Game.wrinklers[CacheWrinklersFattest[1]].hp = 0;\r\n };\r\n popFattestA.onmouseout = function () {\r\n Game.tooltip.shouldHide = 1;\r\n };\r\n popFattestA.onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('wb', 'PopFattest'), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n l('sectionLeftExtra').children[0].append(popFattestA);\r\n}\r\n","/**\r\n * This function updates the style of the building and upgrade sections to make these sortable\r\n */\r\nexport default function UpdateBuildingUpgradeStyle() {\r\n l('products').style.display = 'grid';\r\n l('storeBulk').style.gridRow = '1/1';\r\n\r\n l('upgrades').style.display = 'flex';\r\n l('upgrades').style['flex-wrap'] = 'wrap';\r\n}\r\n","import toggleBuildingLock from './toggleBuildingLock';\r\n\r\n/**\r\n * This function adds a lock button to the \"building view\" in the middle section\r\n */\r\nexport default function createBuildingLockButtons() {\r\n Object.keys(l('rows').children).forEach((index) => {\r\n const productButtons = l('rows').children[index].children[1];\r\n const button = document.createElement('div');\r\n button.id = `productLock${Number(index) + 1}`;\r\n button.className = 'productButton';\r\n button.innerHTML = 'Lock';\r\n button.onclick = function () {\r\n toggleBuildingLock(Number(index) + 1);\r\n };\r\n productButtons.appendChild(button);\r\n });\r\n}\r\n","/**\r\n * This function toggle the locked state of a building\r\n * @param\t{number}\tindex\tIndex of the row to change\r\n */\r\nexport default function toggleBuildingLock(index) {\r\n if (l(`productLock${index}`).innerHTML === 'Lock') {\r\n // Add to storing array\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.push(\r\n index.toString(),\r\n );\r\n\r\n // Update styles\r\n l(`row${index}`).style.pointerEvents = 'none';\r\n l(`row${index}`).style.opacity = '0.4';\r\n l(`productLock${index}`).innerHTML = 'Unlock';\r\n l(`productLock${index}`).style.pointerEvents = 'auto';\r\n } else {\r\n // Remove from storing array\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.includes(\r\n index.toString(),\r\n )\r\n ) {\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.filter(\r\n (value) => value !== index.toString(),\r\n );\r\n }\r\n\r\n // Update styles\r\n l(`productLock${index}`).innerHTML = 'Lock';\r\n l(`row${index}`).style.pointerEvents = 'auto';\r\n l(`row${index}`).style.opacity = '1';\r\n }\r\n}\r\n","/** Functions related to replacing tooltips */\r\n\r\nimport { CreateTooltip } from '../../Disp/Tooltips/Tooltip';\r\nimport { LoadMinigames, TooltipBuildBackup, TooltipLumpBackup } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport ReplaceNativeGrimoire from './NativeGrimoire';\r\nimport ReplaceTooltipGrimoire from './TooltipGrimoire';\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of buildings\r\n */\r\nfunction ReplaceTooltipBuild() {\r\n Object.keys(Game.Objects).forEach((i) => {\r\n const me = Game.Objects[i];\r\n if (l(`product${me.id}`).onmouseover !== null) {\r\n TooltipBuildBackup[i] = l(`product${me.id}`).onmouseover;\r\n l(`product${me.id}`).onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('b', `${i}`), 'store');\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of sugar lumps\r\n */\r\nfunction ReplaceTooltipLump() {\r\n if (Game.canLumps()) {\r\n TooltipLumpBackup = l('lumps').onmouseover;\r\n l('lumps').onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('s', 'Lump'), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of all garden plants\r\n */\r\nfunction ReplaceTooltipGarden() {\r\n if (Game.Objects.Farm.minigameLoaded) {\r\n l('gardenTool-1').onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('ha', 'HarvestAllButton'), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n Array.from(l('gardenPlot').children).forEach((child) => {\r\n const coords = child.id.slice(-3);\r\n // eslint-disable-next-line no-param-reassign\r\n child.onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('p', [`${coords[0]}`, `${coords[2]}`]), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of all stocks\r\n */\r\nfunction ReplaceTooltipMarket() {\r\n if (Game.Objects.Bank.minigameLoaded) {\r\n for (let i = 0; i < Game.Objects.Bank.minigame.goodsById.length; i++) {\r\n l(`bankGood-${i}`).firstChild.onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('sm', i), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n }\r\n}\r\n\r\nfunction ReplaceTooltipPantheon() {\r\n if (Game.Objects.Temple.minigameLoaded) {\r\n for (let i = 0; i < 11; i += 1) {\r\n l(`templeGod${i}`).onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('pag', i), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n for (let i = 0; i < 3; i += 1) {\r\n l(`templeSlot${i}`).onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(\r\n this,\r\n () => CreateTooltip('pas', [i, Game.Objects.Temple.minigame.slot[i]]),\r\n 'this',\r\n );\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * This function call all functions that replace Game-tooltips with Cookie Monster enhanced tooltips\r\n */\r\nexport default function ReplaceTooltips() {\r\n ReplaceTooltipBuild();\r\n ReplaceTooltipLump();\r\n\r\n // Replace Tooltips of Minigames. Nesting it in LoadMinigames makes sure to replace them even if\r\n // they were not loaded initially\r\n // eslint-disable-next-line prefer-destructuring\r\n LoadMinigames = Game.LoadMinigames;\r\n Game.LoadMinigames = function () {\r\n LoadMinigames();\r\n ReplaceTooltipGarden();\r\n ReplaceTooltipGrimoire();\r\n ReplaceTooltipMarket();\r\n ReplaceTooltipPantheon();\r\n ReplaceNativeGrimoire();\r\n };\r\n Game.LoadMinigames();\r\n}\r\n","import { TooltipWrinklerArea, TooltipWrinklerBeingShown } from '../../Disp/VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This function creates .onmouseover/out events that determine if the mouse is hovering-over a Wrinkler\r\n * As wrinklers are not appended to the DOM we us a different system than for other tooltips\r\n */\r\nexport default function AddWrinklerAreaDetect() {\r\n l('backgroundLeftCanvas').onmouseover = function () {\r\n TooltipWrinklerArea = 1;\r\n };\r\n l('backgroundLeftCanvas').onmouseout = function () {\r\n TooltipWrinklerArea = 0;\r\n Game.tooltip.hide();\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n TooltipWrinklerBeingShown[i] = 0;\r\n });\r\n };\r\n}\r\n","import CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport { SimAchievementsOwned, SimCookiesPs, SimGod1, SimGod2, SimGod3 } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This functions calculates the cps and cost of changing a Dragon Aura\r\n * It is called by CM.Disp.AddAuraInfo()\r\n * @param\t{number}\tgod\t\tThe number of the slot to be swapped in\r\n * @param\t{number slot\tThe slot the god will go to\r\n * @returns {number} \tCM.Sim.cookiesPs - Game.cookiesPs The bonus cps and the price of the change\r\n */\r\nexport default function CalculateChangeGod(god, slot) {\r\n if (!Game.Objects.Temple.minigameLoaded) return 0;\r\n CopyData();\r\n const { minigame } = Game.Objects.Temple;\r\n const CurrentSlot = minigame.godsById[god].slot;\r\n if (CurrentSlot === '0') SimGod1 = minigame.slot[slot];\r\n else if (CurrentSlot === '1') SimGod2 = minigame.slot[slot];\r\n else if (CurrentSlot === '2') SimGod3 = minigame.slot[slot];\r\n /* eslint-disable no-unused-vars */\r\n if (slot === 0) SimGod1 = god;\r\n else if (slot === 1) SimGod2 = god;\r\n else if (slot === 2) SimGod3 = god;\r\n /* eslint-enable no-unused-vars */\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n return SimCookiesPs - Game.cookiesPs;\r\n}\r\n","import InitCache from '../Cache/CacheInit';\r\nimport LoopCache from '../Cache/CacheLoop';\r\nimport CacheNoGoldSwitchCPS from '../Cache/CPS/NoGoldSwitchCPS';\r\nimport CacheSellAllForChoEgg from '../Cache/CPS/SellChoEgg';\r\nimport CacheDragonCost from '../Cache/Dragon/Dragon';\r\nimport CachePantheonGods from '../Cache/PantheonGods/CacheGods';\r\nimport { CacheBuildingsPrices, CacheIncome } from '../Cache/PriceAndIncome/PriceAndIncome';\r\nimport { CacheChain } from '../Cache/Stats/ChainCookies';\r\nimport CacheAllMissingUpgrades from '../Cache/Stats/MissingUpgrades';\r\nimport CacheSeasonSpec from '../Cache/Stats/Reindeer';\r\nimport { CacheGoldenAndWrathCookiesMults, CacheStatsCookies } from '../Cache/Stats/Stats';\r\nimport AllAmountTillNextAchievement from '../Cache/TillNextAchievement/AllAmountTillNextAchievement';\r\nimport { CacheDoRemakeBuildPrices, CacheHadBuildAura } from '../Cache/VariablesAndData';\r\nimport UpdateAscendState from '../Disp/HelperFunctions/UpdateAscendState';\r\nimport { LastAscendState } from '../Disp/VariablesAndData';\r\nimport InitData from '../Sim/InitializeData/InitData';\r\nimport { SimDoSims } from '../Sim/VariablesAndData';\r\nimport CheckGardenTick from './CheckStates/Garden';\r\nimport CheckGoldenCookie from './CheckStates/GoldenCookie';\r\nimport CheckMagicMeter from './CheckStates/Grimoire';\r\nimport CheckSeasonPopup from './CheckStates/Season';\r\nimport CheckTickerFortune from './CheckStates/Ticker';\r\nimport CheckWrinklerCount from './CheckStates/Wrinkler';\r\nimport { LastModCount } from './VariablesAndData';\r\n\r\n/**\r\n * Main loop of Cookie Monster\r\n * CM.init registers it to the \"logic\" hook provided by the modding api\r\n */\r\nexport default function CMLoopHook() {\r\n if (LastAscendState !== Game.OnAscend) {\r\n LastAscendState = Game.OnAscend;\r\n UpdateAscendState();\r\n }\r\n if (!Game.OnAscend && Game.AscendTimer === 0) {\r\n // Check if any other mods have been loaded\r\n if (LastModCount !== Object.keys(Game.mods).length) {\r\n InitData();\r\n InitCache();\r\n LastModCount = Object.keys(Game.mods).length;\r\n }\r\n\r\n // CM.Sim.DoSims is set whenever CPS has changed\r\n if (SimDoSims) {\r\n AllAmountTillNextAchievement(true);\r\n CacheIncome();\r\n\r\n CacheNoGoldSwitchCPS(); // Needed first\r\n CacheGoldenAndWrathCookiesMults();\r\n CacheStatsCookies();\r\n CacheAllMissingUpgrades();\r\n CacheChain();\r\n CacheDragonCost();\r\n CachePantheonGods();\r\n\r\n CacheSeasonSpec();\r\n CacheSellAllForChoEgg();\r\n\r\n SimDoSims = 0;\r\n }\r\n\r\n // Check for aura change to recalculate buildings prices\r\n const hasBuildAura = Game.auraMult('Fierce Hoarder') > 0;\r\n if (!CacheHadBuildAura && hasBuildAura) {\r\n CacheHadBuildAura = true;\r\n CacheDoRemakeBuildPrices = 1;\r\n } else if (CacheHadBuildAura && !hasBuildAura) {\r\n CacheHadBuildAura = false;\r\n CacheDoRemakeBuildPrices = 1;\r\n }\r\n\r\n if (CacheDoRemakeBuildPrices) {\r\n CacheBuildingsPrices();\r\n CacheDoRemakeBuildPrices = 0;\r\n }\r\n\r\n LoopCache();\r\n\r\n // Check all changing minigames and game-states\r\n CheckTickerFortune();\r\n CheckSeasonPopup();\r\n CheckGardenTick();\r\n CheckMagicMeter();\r\n CheckWrinklerCount();\r\n }\r\n // To remove Timers when ascending\r\n CheckGoldenCookie();\r\n}\r\n","import { ToggleTimerBar } from '../../Config/SpecificToggles';\r\nimport ToggleBotBar from '../../Config/Toggles/ToggleBotBar';\r\n\r\nimport UpdateBackground from './UpdateBackground';\r\n\r\n/**\r\n * This function disables and shows the bars created by CookieMonster when the game is \"ascending\"\r\n * It is called by CM.Disp.Draw()\r\n */\r\nexport default function UpdateAscendState() {\r\n if (Game.OnAscend) {\r\n l('game').style.bottom = '0px';\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1)\r\n l('CMBotBar').style.display = 'none';\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1)\r\n l('CMTimerBar').style.display = 'none';\r\n } else {\r\n ToggleBotBar();\r\n ToggleTimerBar();\r\n }\r\n UpdateBackground();\r\n}\r\n","import CalcNoGoldSwitchCPS from '../../Sim/Calculations/NoGoldenSwitchCalc';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheNoGoldSwitchCookiesPS } from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates CPS without the Golden Switch as it might be needed in other functions\r\n * If so it CM.Sim.Win()'s them and the caller function will know to recall CM.Sim.CalculateGains()\r\n * It is called at the end of any functions that simulates certain behaviour\r\n */\r\nexport default function CacheNoGoldSwitchCPS() {\r\n if (Game.Has('Golden switch [off]')) {\r\n CacheNoGoldSwitchCookiesPS = CalcNoGoldSwitchCPS();\r\n } else CacheNoGoldSwitchCookiesPS = Game.cookiesPs;\r\n\r\n FillCMDCache({ CacheNoGoldSwitchCookiesPS });\r\n}\r\n","import CopyData from '../SimulationData/CopyData';\r\nimport { SimCookiesPs, SimUpgrades } from '../VariablesAndData';\r\nimport CalculateGains from './CalculateGains';\r\n\r\n/**\r\n * This function calculates CPS without the Golden Switch\r\n * It is called by CM.Cache.NoGoldSwitchCPS()\r\n */\r\nexport default function CalcNoGoldSwitchCPS() {\r\n CopyData();\r\n SimUpgrades['Golden switch [off]'].bought = 0;\r\n CalculateGains();\r\n return SimCookiesPs;\r\n}\r\n","import CalculateChangeGod from '../../Sim/SimulationEvents/GodChange';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheGods } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the cps effect of each God in slot 1, 2 or 3\r\n */\r\nexport default function CachePantheonGods() {\r\n for (let god = 0; god < 11; god += 1) {\r\n for (let slot = 0; slot < 3; slot += 1) {\r\n CacheGods[god][slot] = CalculateChangeGod(god, slot);\r\n }\r\n }\r\n\r\n FillCMDCache({ CacheGods });\r\n}\r\n","import SellBuildingsForChoEgg from '../../Sim/SimulationEvents/SellBuildingForChoEgg';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheSellForChoEgg } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the reward for selling the Chocolate egg\r\n * It is called by CM.Main.Loop()\r\n * @global\t{number}\tCM.Cache.SellForChoEgg\tTotal cookies to be gained from selling Chocolate egg\r\n */\r\nexport default function CacheSellAllForChoEgg() {\r\n let sellTotal = 0;\r\n // Compute cookies earned by selling stock market goods\r\n if (Game.Objects.Bank.minigameLoaded) {\r\n const marketGoods = Game.Objects.Bank.minigame.goods;\r\n let goodsVal = 0;\r\n Object.keys(marketGoods).forEach((i) => {\r\n const marketGood = marketGoods[i];\r\n goodsVal += marketGood.stock * marketGood.val;\r\n });\r\n sellTotal += goodsVal * Game.cookiesPsRawHighest;\r\n }\r\n // Compute cookies earned by selling all buildings with optimal auras (ES + RB)\r\n sellTotal += SellBuildingsForChoEgg();\r\n CacheSellForChoEgg = sellTotal;\r\n\r\n FillCMDCache({ CacheSellForChoEgg });\r\n}\r\n","import CopyData from '../SimulationData/CopyData';\r\nimport { SimBuildingsOwned, SimDragonAura, SimDragonAura2, SimObjects } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport BuildingSell from './SellBuilding';\r\n\r\n/**\r\n * This function calculates the maximum cookies obtained from selling buildings just before purchasing the chocolate egg\r\n * It is called by CM.Cache.CacheSellForChoEgg()\r\n * @returns\t{number}\tsellTotal\tThe maximum cookies to be earned\r\n */\r\nexport default function SellBuildingsForChoEgg() {\r\n let sellTotal = 0;\r\n\r\n CopyData();\r\n\r\n // Change auras to Earth Shatterer + Reality bending to optimize money made by selling\r\n let buildingsToSacrifice = 2;\r\n if (SimDragonAura === 5 || SimDragonAura === 18) {\r\n buildingsToSacrifice -= 1;\r\n }\r\n if (SimDragonAura2 === 5 || SimDragonAura2 === 18) {\r\n buildingsToSacrifice -= 1;\r\n }\r\n SimDragonAura = 5;\r\n SimDragonAura2 = 18;\r\n\r\n // Sacrifice highest buildings for the aura switch\r\n for (let i = 0; i < buildingsToSacrifice; ++i) {\r\n let highestBuilding = 'Cursor';\r\n Object.keys(SimObjects).forEach((j) => {\r\n if (SimObjects[j].amount > 0) {\r\n highestBuilding = j;\r\n }\r\n });\r\n SimObjects[highestBuilding].amount -= 1;\r\n SimBuildingsOwned -= 1;\r\n }\r\n\r\n // Get money made by selling all remaining buildings\r\n Object.keys(SimObjects).forEach((i) => {\r\n const me = SimObjects[i];\r\n sellTotal += BuildingSell(\r\n Game.Objects[me.name],\r\n Game.Objects[i].basePrice,\r\n me.amount,\r\n Game.Objects[i].free,\r\n me.amount,\r\n );\r\n });\r\n\r\n return sellTotal;\r\n}\r\n","import FormatTime from '../Disp/BeautifyAndFormatting/FormatTime';\r\nimport GetCPS from '../Disp/HelperFunctions/GetCPS';\r\nimport CacheAvgCPS from './CPS/CPS';\r\nimport CacheCurrWrinklerCPS from './CPS/CurrWrinklerCPS';\r\nimport CachePP from './PP/PP';\r\nimport CacheHeavenlyChipsPS from './Stats/HeavenlyChips';\r\nimport AllAmountTillNextAchievement from './TillNextAchievement/AllAmountTillNextAchievement';\r\nimport { CacheTimeTillNextPrestige } from './VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport CacheWrinklers from './Wrinklers/Wrinklers';\r\n\r\n/**\r\n * This functions caches variables that are needed every loop\r\n * @global\t{string}\tCM.Cache.TimeTillNextPrestige\tTime requried till next prestige level\r\n */\r\nexport default function LoopCache() {\r\n // Update Wrinkler Bank\r\n CacheWrinklers();\r\n\r\n CachePP();\r\n AllAmountTillNextAchievement(false);\r\n CacheCurrWrinklerCPS();\r\n CacheAvgCPS();\r\n CacheHeavenlyChipsPS();\r\n\r\n const cookiesToNext =\r\n Game.HowManyCookiesReset(\r\n Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned)) + 1,\r\n ) -\r\n (Game.cookiesEarned + Game.cookiesReset);\r\n CacheTimeTillNextPrestige = FormatTime(cookiesToNext / GetCPS());\r\n}\r\n","import { SimObjects } from '../../Sim/VariablesAndData';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheCurrWrinklerCount, CacheCurrWrinklerCPSMult } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the current Wrinkler CPS multiplier\r\n * @global\t{number}\tCM.Cache.CurrWrinklerCount\t\tCurrent number of wrinklers\r\n * @global\t{number}\tCM.Cache.CurrWrinklerCPSMult\tCurrent multiplier of CPS because of wrinklers (excluding their negative sucking effect)\r\n */\r\nexport default function CacheCurrWrinklerCPS() {\r\n CacheCurrWrinklerCPSMult = 0;\r\n let count = 0;\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n if (Game.wrinklers[i].phase === 2) count += 1;\r\n });\r\n let godMult = 1;\r\n if (SimObjects.Temple.minigameLoaded) {\r\n const godLvl = Game.hasGod('scorn');\r\n if (godLvl === 1) godMult *= 1.15;\r\n else if (godLvl === 2) godMult *= 1.1;\r\n else if (godLvl === 3) godMult *= 1.05;\r\n }\r\n CacheCurrWrinklerCount = count;\r\n CacheCurrWrinklerCPSMult =\r\n count *\r\n (count * 0.05 * 1.1) *\r\n (Game.Has('Sacrilegious corruption') * 0.05 + 1) *\r\n (Game.Has('Wrinklerspawn') * 0.05 + 1) *\r\n godMult;\r\n\r\n FillCMDCache({ CacheCurrWrinklerCount, CacheCurrWrinklerCPSMult });\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { LastTickerFortuneState } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if there is a fortune cookie on the ticker\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckTickerFortune() {\r\n if (LastTickerFortuneState !== (Game.TickerEffect && Game.TickerEffect.type === 'fortune')) {\r\n LastTickerFortuneState = Game.TickerEffect && Game.TickerEffect.type === 'fortune';\r\n if (LastTickerFortuneState) {\r\n nF.createFlash('cookieMonsterMod', 3, 'FortuneFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FortuneSoundURL,\r\n 'FortuneSound',\r\n 'FortuneVolume',\r\n false,\r\n );\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'FortuneNotification',\r\n 'Fortune Cookie found',\r\n 'A Fortune Cookie has appeared on the Ticker.',\r\n );\r\n }\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { CacheSeasonPopShimmer } from '../../Cache/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport { LastSeasonPopupState } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if there is reindeer that has spawned\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckSeasonPopup() {\r\n if (LastSeasonPopupState !== Game.shimmerTypes.reindeer.spawned) {\r\n LastSeasonPopupState = Game.shimmerTypes.reindeer.spawned;\r\n Object.keys(Game.shimmers).forEach((i) => {\r\n if (Game.shimmers[i].spawnLead && Game.shimmers[i].type === 'reindeer') {\r\n CacheSeasonPopShimmer = Game.shimmers[i];\r\n }\r\n });\r\n nF.createFlash('cookieMonsterMod', 3, 'SeaFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SeaSoundURL,\r\n 'SeaSound',\r\n 'SeaVolume',\r\n false,\r\n );\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'SeaNotification',\r\n 'Reindeer sighted!',\r\n 'A Reindeer has spawned. Click it now!',\r\n );\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { LastGardenNextStep } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if a garden tick has happened\r\n */\r\nexport default function CheckGardenTick() {\r\n if (\r\n Game.Objects.Farm.minigameLoaded &&\r\n LastGardenNextStep !== Game.Objects.Farm.minigame.nextStep\r\n ) {\r\n if (LastGardenNextStep !== 0 && LastGardenNextStep < Date.now()) {\r\n nF.createFlash('cookieMonsterMod', 3, 'GardFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GardSoundURL,\r\n 'GardSound',\r\n 'GardVolume',\r\n false,\r\n );\r\n }\r\n LastGardenNextStep = Game.Objects.Farm.minigame.nextStep;\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { LastMagicBarFull } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if the magic meter is full\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckMagicMeter() {\r\n if (\r\n Game.Objects['Wizard tower'].minigameLoaded &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GrimoireBar === 1\r\n ) {\r\n const { minigame } = Game.Objects['Wizard tower'];\r\n if (minigame.magic < minigame.magicM) LastMagicBarFull = false;\r\n else if (!LastMagicBarFull) {\r\n LastMagicBarFull = true;\r\n nF.createFlash('cookieMonsterMod', 3, 'MagicFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MagicSoundURL,\r\n 'MagicSound',\r\n 'MagicVolume',\r\n false,\r\n );\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'MagicNotification',\r\n 'Magic Meter full',\r\n 'Your Magic Meter is full. Cast a spell!',\r\n );\r\n }\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { LastWrinklerCount } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if any new Wrinklers have popped up\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckWrinklerCount() {\r\n if (Game.elderWrath > 0) {\r\n let CurrentWrinklers = 0;\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n if (Game.wrinklers[i].phase === 2) CurrentWrinklers += 1;\r\n });\r\n if (CurrentWrinklers > LastWrinklerCount) {\r\n LastWrinklerCount = CurrentWrinklers;\r\n if (\r\n CurrentWrinklers === Game.getWrinklersMax() &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxFlash\r\n ) {\r\n nF.createFlash('cookieMonsterMod', 3, 'WrinklerMaxFlash', false);\r\n } else {\r\n nF.createFlash('cookieMonsterMod', 3, 'WrinklerFlash', false);\r\n }\r\n if (\r\n CurrentWrinklers === Game.getWrinklersMax() &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxSound\r\n ) {\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxSoundURL,\r\n 'WrinklerMaxSound',\r\n 'WrinklerMaxVolume',\r\n false,\r\n );\r\n } else {\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerSoundURL,\r\n 'WrinklerSound',\r\n 'WrinklerVolume',\r\n false,\r\n );\r\n }\r\n if (\r\n CurrentWrinklers === Game.getWrinklersMax() &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxNotification\r\n ) {\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'WrinklerMaxNotification',\r\n 'Maximum Wrinklers Reached',\r\n 'You have reached your maximum ammount of wrinklers',\r\n );\r\n } else {\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'WrinklerNotification',\r\n 'A Wrinkler appeared',\r\n 'A new wrinkler has appeared',\r\n );\r\n }\r\n } else {\r\n LastWrinklerCount = CurrentWrinklers;\r\n }\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { CacheSpawnedGoldenShimmer, CacheGoldenShimmersByID } from '../../Cache/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport CreateGCTimer from '../../Disp/GoldenCookieTimers/GoldenCookieTimers';\r\nimport { UpdateFavicon } from '../../Disp/TabTitle/FavIcon';\r\nimport { GCTimers } from '../../Disp/VariablesAndData';\r\nimport {\r\n CurrSpawnedGoldenCookieState,\r\n LastGoldenCookieState,\r\n LastSpawnedGoldenCookieState,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * Auxilirary function that finds all currently spawned shimmers.\r\n * CM.Cache.spawnedGoldenShimmer stores the non-user spawned cookie to later determine data for the favicon and tab-title\r\n * It is called by CM.CM.Main.CheckGoldenCookie\r\n */\r\nfunction FindShimmer() {\r\n CurrSpawnedGoldenCookieState = 0;\r\n CacheGoldenShimmersByID = {};\r\n Object.keys(Game.shimmers).forEach((i) => {\r\n CacheGoldenShimmersByID[Game.shimmers[i].id] = Game.shimmers[i];\r\n if (Game.shimmers[i].spawnLead && Game.shimmers[i].type === 'golden') {\r\n CacheSpawnedGoldenShimmer = Game.shimmers[i];\r\n CurrSpawnedGoldenCookieState += 1;\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * This function checks for changes in the amount of Golden Cookies\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckGoldenCookie() {\r\n FindShimmer();\r\n Object.keys(GCTimers).forEach((i) => {\r\n if (typeof CacheGoldenShimmersByID[i] === 'undefined') {\r\n GCTimers[i].parentNode.removeChild(GCTimers[i]);\r\n delete GCTimers[i];\r\n }\r\n });\r\n if (LastGoldenCookieState !== Game.shimmerTypes.golden.n) {\r\n LastGoldenCookieState = Game.shimmerTypes.golden.n;\r\n if (LastGoldenCookieState) {\r\n if (LastSpawnedGoldenCookieState < CurrSpawnedGoldenCookieState) {\r\n nF.createFlash('cookieMonsterMod', 3, 'GCFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCSoundURL,\r\n 'GCSound',\r\n 'GCVolume',\r\n false,\r\n );\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'GCNotification',\r\n 'Golden Cookie Spawned',\r\n 'A Golden Cookie has spawned. Click it now!',\r\n );\r\n }\r\n\r\n Object.keys(Game.shimmers).forEach((i) => {\r\n if (typeof GCTimers[Game.shimmers[i].id] === 'undefined') {\r\n CreateGCTimer(Game.shimmers[i]);\r\n }\r\n });\r\n }\r\n UpdateFavicon();\r\n LastSpawnedGoldenCookieState = CurrSpawnedGoldenCookieState;\r\n if (CurrSpawnedGoldenCookieState === 0) CacheSpawnedGoldenShimmer = 0;\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer === 1 &&\r\n LastGoldenCookieState\r\n ) {\r\n Object.keys(GCTimers).forEach((i) => {\r\n GCTimers[i].style.opacity = CacheGoldenShimmersByID[i].l.style.opacity;\r\n GCTimers[i].style.transform = CacheGoldenShimmersByID[i].l.style.transform;\r\n GCTimers[i].textContent = Math.ceil(CacheGoldenShimmersByID[i].life / Game.fps);\r\n });\r\n }\r\n}\r\n","/** Section: Functions related to the Golden Cookie Timers */\r\n\r\nimport { GCTimers } from '../VariablesAndData';\r\n\r\n/**\r\n * This function creates a new Golden Cookie Timer and appends it CM.Disp.GCTimers based on the id of the cookie\r\n * @param\t{object}\tcookie\tA Golden Cookie object\r\n */\r\nexport default function CreateGCTimer(cookie) {\r\n const GCTimer = document.createElement('div');\r\n GCTimer.id = `GCTimer${cookie.id}`;\r\n GCTimer.style.width = '96px';\r\n GCTimer.style.height = '96px';\r\n GCTimer.style.position = 'absolute';\r\n GCTimer.style.zIndex = '10000000001';\r\n GCTimer.style.textAlign = 'center';\r\n GCTimer.style.lineHeight = '96px';\r\n GCTimer.style.fontFamily = '\"Kavoon\", Georgia, serif';\r\n GCTimer.style.fontSize = '35px';\r\n GCTimer.style.cursor = 'pointer';\r\n GCTimer.style.display = 'block';\r\n GCTimer.style.pointerEvents = 'none';\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer === 0)\r\n GCTimer.style.display = 'none';\r\n GCTimer.style.left = cookie.l.style.left;\r\n GCTimer.style.top = cookie.l.style.top;\r\n GCTimer.onclick = function () {\r\n cookie.pop();\r\n };\r\n GCTimer.onmouseover = function () {\r\n cookie.l.style.filter = 'brightness(125%) drop-shadow(0px 0px 3px rgba(255,255,255,1))'; // eslint-disable-line no-param-reassign\r\n cookie.l.style.webkitFilter = 'brightness(125%) drop-shadow(0px 0px 3px rgba(255,255,255,1))'; // eslint-disable-line no-param-reassign\r\n };\r\n GCTimer.onmouseout = function () {\r\n cookie.l.style.filter = ''; // eslint-disable-line no-param-reassign\r\n cookie.l.style.webkitFilter = ''; // eslint-disable-line no-param-reassign\r\n };\r\n\r\n GCTimers[cookie.id] = GCTimer;\r\n l('shimmers').appendChild(GCTimer);\r\n}\r\n","/** This includes all headers of Cookie Monster and their relevant data */\r\nconst headers = {\r\n Favourite: 1,\r\n Calculation: 1,\r\n Notation: 1,\r\n Colours: 1,\r\n BarsDisplay: 1,\r\n Tooltip: 1,\r\n Statistics: 1,\r\n Notification: 1,\r\n NotificationGeneral: 1,\r\n NotificationGC: 1,\r\n NotificationFC: 1,\r\n NotificationSea: 1,\r\n NotificationGard: 1,\r\n NotificationMagi: 1,\r\n NotificationWrink: 1,\r\n NotificationWrinkMax: 1,\r\n Miscellaneous: 1,\r\n Lucky: 1,\r\n Chain: 1,\r\n Spells: 1,\r\n Garden: 1,\r\n Prestige: 1,\r\n Wrink: 1,\r\n Sea: 1,\r\n Achievs: 1,\r\n Misc: 1,\r\n infoMenu: 1,\r\n optionsMenu: 1,\r\n};\r\n\r\nexport default headers;\r\n","import { saveAndLoadingFunctions } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\n\r\nimport headers from '../Data/headers';\r\nimport { VersionMajor, VersionMinor } from '../Data/Moddata';\r\nimport settings from '../Data/settings';\r\nimport UpdateColours from '../Disp/HelperFunctions/UpdateColours';\r\nimport CMLoopHook from '../Main/LoopHook';\r\nimport InitData from '../Sim/InitializeData/InitData';\r\n\r\n/**\r\n * This creates a load function to the CM object. Per Game code/comments:\r\n * \"do stuff with the string data you saved previously\"\r\n */\r\nexport default function load(str) {\r\n InitData();\r\n\r\n // Load saveData\r\n saveAndLoadingFunctions.loadMod('cookieMonsterMod', str, settings, headers, CMLoopHook);\r\n if (\r\n typeof Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames ===\r\n 'undefined'\r\n ) {\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames = [];\r\n }\r\n\r\n // Update display with colours and locking of minigames\r\n UpdateColours();\r\n for (\r\n let index = 0;\r\n index < Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.length;\r\n index++\r\n ) {\r\n const buildingIndex =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames[index];\r\n l(`row${buildingIndex}`).style.pointerEvents = 'none';\r\n l(`row${buildingIndex}`).style.opacity = '0.4';\r\n l(`productLock${buildingIndex}`).innerHTML = 'Unlock';\r\n l(`productLock${buildingIndex}`).style.pointerEvents = 'auto';\r\n }\r\n\r\n // Notify of update\r\n if (\r\n typeof Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.version !== 'undefined' &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.version !==\r\n `${VersionMajor}.${VersionMinor}`\r\n ) {\r\n if (Game.prefs.popups)\r\n Game.Popup(\r\n 'A new version of Cookie Monster has been loaded, check out the release notes in the info tab!',\r\n );\r\n else\r\n Game.Notify(\r\n 'A new version of Cookie Monster has been loaded, check out the release notes in the info tab!',\r\n '',\r\n '',\r\n 0,\r\n 1,\r\n );\r\n }\r\n}\r\n","import init from './InitSaveLoad/init';\r\nimport load from './InitSaveLoad/load';\r\nimport save from './InitSaveLoad/save';\r\n\r\nconst CM = {\r\n init,\r\n load,\r\n save,\r\n};\r\n\r\nif (typeof Steam !== 'undefined') {\r\n // Need to add a delay for steam\r\n setTimeout(function () {\r\n Game.registerMod('CookieMonster', CM);\r\n\r\n // Game.registerMod also calls CM.load() which calls the loop hook\r\n // Thus sounds normally play at start up as Season and Garden states are checked\r\n window.cookieMonsterFrameworkData.isInitializing = false;\r\n }, 2000);\r\n} else {\r\n Game.registerMod('CookieMonster', CM);\r\n window.cookieMonsterFrameworkData.isInitializing = false;\r\n}\r\n","import { initFunctions } from '@cookiemonsterteam/cookiemonsterframework';\r\nimport { VersionMajor, VersionMinor } from '../Data/Moddata';\r\nimport CMDrawHook from '../Disp/DrawHook';\r\nimport CMClickHook from '../Main/ClickHook';\r\nimport InitializeCookieMonster from '../Main/Initialization';\r\nimport CMLoopHook from '../Main/LoopHook';\r\nimport load from './load';\r\n\r\n/**\r\n * This creates a init function for the CM object. Per Game code/comments:\r\n * \"this function is called as soon as the mod is registered\r\n * declare hooks here\"\r\n * It starts the further initialization of CookieMonster and registers hooks\r\n */\r\nexport default function init() {\r\n let proceed = true;\r\n\r\n // Load Cookie Monster Mod Framework and register mod\r\n initFunctions.initModFramework();\r\n window.cookieMonsterFrameworkData.isInitializing = true;\r\n initFunctions.registerMod('cookieMonsterMod');\r\n\r\n if (Game.version !== Number(VersionMajor)) {\r\n // eslint-disable-next-line no-restricted-globals, no-alert\r\n proceed = confirm(\r\n `Cookie Monster version ${VersionMajor}.${VersionMinor} is meant for Game version ${VersionMajor}. Loading a different version may cause errors. Do you still want to load Cookie Monster?`,\r\n );\r\n }\r\n if (proceed) {\r\n InitializeCookieMonster();\r\n Game.registerHook('click', CMClickHook);\r\n Game.registerHook('draw', CMDrawHook);\r\n Game.registerHook('logic', CMLoopHook);\r\n\r\n // Load default settings if no previous saveData is found\r\n if (typeof Game.modSaveData.cookieMonsterMod === 'undefined') {\r\n load('{}');\r\n }\r\n }\r\n}\r\n","/** Data related directly to Cookie Monster */\r\n\r\nexport const VersionMajor = '2.052';\r\nexport const VersionMinor = '10';\r\n\r\n/** Information about Cookie Monster to be displayed in the info section */\r\nexport const ModDescription = `<a href=\"https://github.com/CookieMonsterTeam/CookieMonster\" target=\"blank\">Cookie Monster</a>\r\n offers a wide range of tools and statistics to enhance your game experience.\r\n It is not a cheat interface – although it does offer helpers for golden cookies and such, everything can be toggled off at will to only leave how much information you want.</br>\r\n Progess on new updates and all previous release notes can be found on the GitHub page linked above!</br>\r\n Please also report any bugs you may find over there!</br>\r\n `;\r\n\r\n/** Latest releasenotes of Cookie Monster to be displayed in the info section */\r\nexport const LatestReleaseNotes = `This update adds support for some parts of cookie clicker 2.048</br>\r\n- added support for Dragon Aura 'Supreme Intellect' in the pantheon calculations</br>\r\n- added support for new tiers of Shimmering veil</br>\r\n- added support for unshackled upgrades</br>\r\n- updated some simulator logic to more cloesly match updated cookie clicker logic</br>\r\n- Bugfix: conjure backed goods tooltip used cached no gold switch raw cps instead of live cps</br>\r\n- Bugfix: negative calculations due to glucosimium upgrades, kittens, unshackled, and achievements</br>`;\r\n","import { VersionMajor, VersionMinor } from '../Data/Moddata';\r\n\r\n/**\r\n * This creates a save function to the CM object. Per Game code/comments:\r\n * \"use this to store persistent data associated with your mod\r\n * return 'a string to be saved';\"\r\n */\r\nexport default function save() {\r\n const saveObject = Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod;\r\n saveObject.version = `${VersionMajor}.${VersionMinor}`;\r\n return JSON.stringify(saveObject);\r\n}\r\n"],"names":["global","factory","module","exports","document","win","Error","window","this","BoxShadow","funcName","elm","jsc","jscolor","initialized","instances","readyQueue","register","addEventListener","pub","init","installBySelector","selector","rootNode","node","elms","querySelectorAll","matchClass","RegExp","lookupClass","i","length","dataOpts","m","undefined","type","toLowerCase","isColorAttrSupported","getDataAttr","className","match","targetElm","optsStr","console","warn","docsRef","opts","trim","parseOptionsStr","e","str","JSON","parse","eParse","looseJSON","Function","eEval","getInstances","inst","targetElement","push","createEl","tagName","el","createElement","setData","nodeOrSelector","sel","querySelector","isNode","val","Node","nodeType","nodeName","removeChildren","firstChild","removeChild","isTextInput","isButton","n","indexOf","isButtonEmpty","value","textContent","isPassiveEventSupported","supported","Object","defineProperty","get","removeEventListener","setAttribute","dataProp","obj","arguments","data","hasOwnProperty","prop","map","removeData","getData","setDefault","name","attrName","getAttribute","setDataAttr","_attachedGroupEvents","attachGroupEvent","groupName","evnt","func","detachGroupEvents","evt","preventDefault","returnValue","captureTarget","target","setCapture","_capturedTarget","releaseTarget","releaseCapture","triggerEvent","eventName","bubbles","cancelable","ev","Event","createEvent","initEvent","dispatchEvent","triggerInputEvent","eventKey","keys","code","keyCode","strList","replace","split","hasClass","classList","contains","addClass","classNames","add","removeClass","repl","remove","getCompStyle","getComputedStyle","currentStyle","setStyle","styles","important","reversible","priority","origStyle","setVal","style","setProperty","hexColor","r","g","b","Math","round","toString","substr","toUpperCase","hexaColor","a","rgbColor","rgbaColor","linearGradient","stdName","prefixes","helper","tryFunc","tryVal","background","getFuncName","Array","prototype","join","call","setBorderRadius","setBoxShadow","getElementPos","relativeToViewport","x","y","rect","getBoundingClientRect","left","top","viewPos","getViewPos","getElementSize","offsetWidth","offsetHeight","getAbsPointerPos","changedTouches","clientX","clientY","getRelPointerPos","targetRect","srcElement","doc","documentElement","pageXOffset","scrollLeft","clientLeft","pageYOffset","scrollTop","clientTop","getViewSize","innerWidth","clientWidth","innerHeight","clientHeight","RGB_HSV","min","v","max","h","HSV_RGB","s","u","floor","parseColorString","ret","rgba","format","parseInt","charAt","mR","mG","mB","mA","par","re","parseFloat","parsePaletteValue","mixed","vals","isArray","colors","color","containsTranparentColor","isAlphaFormat","scaleCanvasForHighDPR","canvas","dpr","devicePixelRatio","width","height","getContext","scale","genColorPreviewCanvas","separatorPos","specWidth","scaleForHighDPR","sepW","previewSeparator","sqSize","chessboardSize","sqColor1","chessboardColor1","sqColor2","chessboardColor2","cWidth","cHeight","ctx","fillStyle","fillRect","start","clearRect","lineWidth","beginPath","strokeStyle","moveTo","lineTo","stroke","genColorPreviewGradient","position","params","apply","redrawPosition","picker","owner","tp","vp","thisObj","fixed","c","ts","vs","pd","getPickerDims","ps","borderW","borderH","l","smartPosition","pp","positionValue","contractShadow","_drawPosition","vShadow","shadowBlur","wrap","boxS","shadow","shadowColor","w","controlBorderWidth","sliderSpace","getControlPadding","sliderSize","getSliderChannel","hasAlphaChannel","pal","getPaletteDims","padding","closeButton","buttonHeight","pW","pH","contentW","contentH","paddedW","paddedH","borderWidth","palette","cols","rows","cellW","cellH","sampleCount","_palette","paletteCols","ceil","paletteSpacing","paletteHeight","pointerBorderWidth","pointerThickness","getPadYChannel","mode","triggerCallback","callback","error","triggerGlobal","eventNames","trigger","_pointerMoveEvent","mouse","touch","_pointerEndEvent","_pointerOrigin","onDocumentKeyUp","tryHide","onWindowResize","onWindowScroll","onParentScroll","onDocumentMouseDown","showOnClick","disabled","show","onControlPointerStart","onPickerTouchStart","controlName","pointerType","registerDragEvents","offset","onDocumentPointerMove","onDocumentPointerEnd","parent","frameElement","ofs","abs","rel","channels","fromHSVA","setPad","setSld","setASld","onPaletteSampleClick","currentTarget","_setFormat","getFormat","paletteSetsAlpha","_paletteHasTransparency","fromRGBA","hideOnPaletteClick","hide","ofsX","ofsY","pointerAbs","xVal","yVal","fmt","createPadCanvas","draw","hGrad","createLinearGradient","addColorStop","vGrad","createSliderGradient","color1","color2","grad","createASliderGradient","hShadow","blur","spread","inset","flags","leaveValue","leaveAlpha","leavePreview","enumOpts","previewPosition","alphaChannel","deprecatedOpts","THIS","setOption","option","oldOpt","newOpt","setter","getOption","getter","drawPicker","_processParentElementsInDOM","box","boxB","pad","padB","padM","padCanvas","cross","crossBY","crossBX","crossLY","crossLX","sld","sldB","sldM","sldGrad","sldPtrS","sldPtrIB","sldPtrMB","sldPtrOB","asld","asldB","asldM","asldGrad","asldPtrS","asldPtrIB","asldPtrMB","asldPtrOB","btn","btnT","appendChild","passive","insetColors","outsetColor","p","displaySlider","displayAlphaSlider","pickerDims","crossOuterSize","crossSize","controlPadding","borderRadius","PI","clear","zIndex","border","borderColor","backgroundColor","opacity","controlBorderColor","cursor","instance","control","pointerBorderColor","pointerColor","overflow","display","sliderInnerSpace","innerHTML","chessboard","si","sampleColor","sampleCssColor","sc","sw","backgroundImage","toDataURL","backgroundRepeat","backgroundPosition","bottom","maxWidth","whiteSpace","buttonColor","font","textAlign","onmousedown","lineHeight","createTextNode","closeText","redrawPad","redrawSld","redrawASld","activeClassName","container","body","parentNode","yChannel","rgb1","rgb2","rgb","toHEXString","sldChannel","isPickerOwner","alpha","random","onChange","onInput","valueElement","alphaElement","previewElement","previewSize","previewPadding","required","hash","uppercase","forceStyle","hideOnLeave","minS","maxS","minV","maxV","minA","maxA","redraw","exposeColor","success","opt","channel","res","evs","callbackProp","isNaN","hsv","fromHSV","fromRGB","fromString","setPreviewElementBg","setValueElementValue","randomize","minH","maxH","toHEXAString","toRGBString","toRGBAString","toGrayscale","toCanvas","toBackground","isLight","_currentFormat","processValueInput","processAlphaInput","colorStr","alphaVal","setAlphaElementValue","backgrounds","image","size","repeat","origin","preview","bg","sty","right","_parentElementsProcessed","compStyle","set__palette","options","presetsArr","preset","slice","pres","presets","nonProperties","test","valueElementOrigEvents","oninput","oldVal","initValue","initAlpha","install","shift","ready","triggerNow","installByClassName","JSColor","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","__esModule","d","definition","key","o","enumerable","Setting","constructor","defaultValue","group","cookieMonsterPrompt","content","Game","promptWrapL","promptL","forEach","id","onclick","PlaySound","children","promptAnchorL","darkenL","focus","promptOn","UpdatePrompt","createFlash","modName","configName","forced","mods","cookieMonsterFramework","saveData","settings","cookieMonsterFrameworkData","isInitializing","setTimeout","fps","saveFramework","modSaveString","stringify","cookieClickerSaveString","b64_to_utf8","unescape","localStorage","getItem","pattern","modSave","newSaveString","setItem","escape","utf8_to_b64","toggleHeader","headerName","headers","playCMSound","url","sndConfig","volConfig","sound","Audio","GeneralSound","volume","play","toggleConfigVolume","addMenu","_","observer","disconnect","onMenu","menu","insertBefore","frameworkInfoDiv","titleDiv","buttonSpan","fontSize","verticalAlign","infoMenu","UpdateMenu","descriptionDiv","createFrameworkInfoMenuSection","listeners","addInfoMenuSection","observe","getElementById","attributes","childList","subtree","drawLoop","optionsMenu","loadMod","settingsData","headersData","logicLoop","saveDataObject","modSaveData","settingsObject","headersObject","favouriteSettings","createSaveDataObject","load","MutationObserver","WhiteScreen","pointerEvents","createFlashScreen","registerHook","save","initFunctions","registerMod","menuFunctions","createInfoListing","listingHTML","listingDiv","createOptionsListing","updateColoursFunc","refreshScaleFunc","div","FavouriteSettings","favourites","FavStar","includes","innerText","filter","ele","toggleFavouriteSetting","onmouseover","tooltip","onmouseout","createFavouriteStar","toggle","label","toggleConfig","desc","title","float","percent","slider","step","onchange","span","input","readOnly","inputPrompt","outerHTML","ClosePrompt","innerSpan","displayName","event","saveObject","altKey","ctrlKey","shiftKey","toggleConfigKeycode","createOptionsSubHeader","text","modDisplayName","menuName","modSectionDiv","notificationsFunctions","createNotification","message","visibilityState","Notification","badge","saveAndLoadingFunctions","settingClasses","super","ToggleWrinklerButtons","cookieMonsterMod","WrinklerButtons","elderWrath","CacheAverageCookiesFromClicks","CookiesDiff","WrinkDiff","WrinkFattestDiff","ChoEggDiff","ClicksDiff","HeavenlyChipsDiff","CacheLastCPSCheck","CacheLastCookies","CacheLastWrinkCookies","CacheLastWrinkFattestCookies","CacheLastClicks","CacheAverageGainBank","CacheAverageGainWrink","CacheAverageGainWrinkFattest","CacheAverageGainChoEgg","CacheAverageCPS","CacheLastHeavenlyCheck","CacheLastHeavenlyChips","CacheDoRemakeBuildPrices","CacheHadBuildAura","SimBuildingsOwned","SimUpgradesOwned","SimPledges","SimAchievementsOwned","SimHeavenlyPower","SimPrestige","SimDragonAura","SimDragonAura2","SimGod1","SimGod2","SimGod3","SimDoSims","SimEffs","SimCookiesPs","SimCookiesPsRaw","CacheDragonAura","CacheDragonAura2","CacheLastDragonLevel","CacheCostDragonUpgrade","CacheLucky","CacheLuckyReward","CacheLuckyWrathReward","CacheLuckyFrenzy","CacheLuckyRewardFrenzy","CacheLuckyWrathRewardFrenzy","CacheConjure","CacheConjureReward","CacheEdifice","CacheEdificeBuilding","CacheNoGoldSwitchCookiesPS","CacheDragonsFortuneMultAdjustment","CacheGoldenCookiesMult","CacheWrathCookiesMult","CacheHCPerSecond","CacheCentEgg","CacheSeaSpec","CacheLastChoEgg","CacheObjects1","CacheObjects10","CacheObjects100","CacheObjectsNextAchievement","CacheWrinklersTotal","CacheWrinklersNormal","CacheWrinklersFattest","CacheCurrWrinklerCPSMult","CacheCurrWrinklerCount","CacheUpgrades","CacheAverageClicks","CacheMissingUpgrades","CacheMissingUpgradesPrestige","CacheMissingUpgradesCookies","CacheChainRequired","CacheChainRequiredNext","CacheChainMaxReward","CacheChainWrathRequired","CacheChainWrathRequiredNext","CacheChainWrathMaxReward","CacheChainFrenzyRequired","CacheChainFrenzyRequiredNext","CacheChainFrenzyMaxReward","CacheChainFrenzyWrathRequired","CacheChainFrenzyWrathRequiredNext","CacheChainFrenzyWrathMaxReward","CacheRealCookiesEarned","CacheAvgCPSWithChoEgg","CacheSpawnedGoldenShimmer","CacheSeasonPopShimmer","CacheTimeTillNextPrestige","CacheMinPP","CacheMinPPBulk","CachePPArray","CacheGoldenShimmersByID","CacheSellForChoEgg","CacheGods","SimObjects","SimUpgrades","SimAchievements","SimAuraMult","what","dragonAuras","dragonLevel","dragonAurasBN","SimGetSellMultiplier","giveBack","SimEff","def","SimHas","it","ascensionMode","pool","tier","bought","SimHasAura","SimHasGod","hasGod","Temple","minigame","Objects","god","gods","SimModifyBuildingPrice","building","price","ModifiedPrice","hasBuff","fortune","minigameLoaded","godLvl","BuildingSell","build","basePrice","free","amount","noSim","noSimRes","toChange","startingAmount","moni","buyBulk","priceIncrease","modifyBuildingPrice","getSellMultiplier","metric","shortScale","shortScaleAbbreviated","LastModCount","TooltipLumpBackup","BackupGrimoireLaunch","BackupGrimoireLaunchMod","BackupGrimoireDraw","HasReplaceNativeGrimoireLaunch","HasReplaceNativeGrimoireDraw","LoadMinigames","LastSeasonPopupState","LastTickerFortuneState","LastGardenNextStep","LastGoldenCookieState","LastSpawnedGoldenCookieState","LastMagicBarFull","CurrSpawnedGoldenCookieState","LastWrinklerCount","DispCSS","TooltipBuildBackup","TooltipGrimoireBackup","TooltipUpgradeBackup","BackupFunctions","CycliusDateAtBeginLoop","Date","now","CenturyDateAtBeginLoop","num","floats","decimals","ScaleDecimals","Infinity","Scale","Beautify","Number","isFinite","answer","ScaleCutoff","ScaleSeparator","toLocaleString","toExponential","exponential","AmountOfTenPowerThree","toFixed","log","ColourTextPre","ColourBackPre","ColourBlue","ColourGreen","ColourYellow","ColourOrange","ColourRed","ColourPurple","ColourGray","ColourPink","ColourBrown","ColoursOrdering","TooltipText","SimpleTooltipElements","CMLastAscendState","TooltipWrinklerArea","TooltipWrinkler","TooltipWrinklerBeingShown","CMSayTime","LastTargetBotBar","LastTargetBuildings","LastTargetTooltipBuilding","CookieTimes","ClickTimes","BuffColours","Frenzy","Clot","Dragonflight","TooltipPrice","TooltipBonusIncome","TooltipType","TooltipName","TooltipBonusMouse","LastAscendState","LastNumberOfTimers","GCTimers","Title","UpdateBuildings","arr","buyMode","removeProperty","BuildColour","colour","SortBuildings","k","sort","amountUntilNext","AmountNeeded","priceUntilNext","gridRow","UpdateUpgradeSectionsHeight","values","getElementsByClassName","section","UpgradesNeverCollapse","minHeight","UpdateUpgrades","UpBarColour","blue","green","yellow","orange","red","purple","gray","UpgradesInStore","me","addedColour","j","childNodes","SortUpgrades","nameChecker","arr2","upgrade","findIndex","order","FormatTime","time","longFormat","formattedTime","TimeFormat","GetTimeColour","GetCPS","CPSMode","CalcWrink","cookiesPs","cpsSucked","wrinklers","GetWrinkConfigBank","CreateTimer","bars","timerBar","margin","marginRight","colourBar","borderTopRightRadius","borderBottomRightRadius","timer","marginLeft","CreateBotBarBuildingColumn","buildingName","bonus","header","substring","lastChild","paddingLeft","UpdateBotBar","BotBar","count","PPString","PPDisplayTime","timeColour","bulkPrice","cookies","UpdateBackground","Background","LeftBackground","DrawBackground","UpdateBotTimerBarPosition","TimerBar","TimerBarPos","ToggleTimerBar","CacheDragonAuras","dragonAura","dragonAura2","InitAchievement","achievementName","Achievements","you","SimGetTieredCpsMult","mult","tieredUpgrades","Tiers","special","tierMult","unshackleUpgrade","synergies","syn","buildingTie1","buildingTie2","grandma","Grandma","misfortune","vanilla","InitialBuildingData","cps","magicCpS","ComputeCps","GrandmaSynergies","UpgradesByPool","kitten","Portal","baseCps","baseCPS","InitUpgrade","upgradeName","Upgrades","power","level","pow","CopyData","UpgradesOwned","pledges","AchievementsOwned","heavenlyPower","prestige","totalCookies","slot","won","TooltipCreateHeader","fontWeight","TooltipCreateCalculationSection","income","marginBottom","click","production","ColourOfPP","PPSecondsLowerLimit","PPOnlyConsiderBuyable","GetCPSBuffMult","buffs","multCpS","SimWin","CalculateGains","effs","myEffs","ii","heavenlyMult","SimGetHeavenlyMultiplier","heralds","cookieUpgrades","buildMult","sin","santaLevel","milkProgress","milkMult","catMult","storedCps","eggMult","day","startDate","lumps","rawCookiesPs","CpsAchievements","threshold","shimmerTypes","golden","auraMult","bakeryName","goldenSwitchMult","upgrades","goldenCookieUpgrades","veilMult","runModHookOnValue","Fortunes","HalloCookies","ChristCookies","ValCookies","PlantDrops","SimHasAchiev","CheckOtherAchiev","grandmas","buildingsOwned","mathematician","base10","minAmount","ObjectsById","Cursor","hasAllHalloCook","hasAllChristCook","list","fortunes","BuyBuildingsBonusIncome","tieredAchievs","achievUnlock","lastAchievementsOwned","CalculateGrimoireRefillTime","currentMagic","maxMagic","targetMagic","magic","ToggleToolWarnPos","ToolWarnPos","UpdateTooltips","tooltipBox","paddingBottom","TooltipBuildUpgrade","increase","productionAchievs","HasAchiev","achiev","nextProductionAchiev","ObjectsTillNext","PPOfAmount","PPFrag","Building","getPrice","bonusMouse","previousSibling","chocolate","Upgrade","TooltipLump","lumpType","lumpColour","lumpCurrentType","SugarLump","spellCost","getSpellCost","spellsById","TooltipGrim","magicM","recover","recoverColour","conjure","reward","seperator","loss","Grimoire","Farm","TooltipPlots","plot","mature","plantsById","plantName","GardenPlots","totalGain","mortal","tile","immortal","matureBase","HarvestAll","Bank","TooltipStocks","stock","goodsById","stockMode","modeIndex","modes","colours","delta","deltaColour","restingValue","getRestingVal","expectedNextValue","expectedValue","pValue","pDelta","bankLevel","dragonBoost","CalculateStockNextExpectedValue","expectedNextValueColour","StockMarket","WrinklerReward","WrinklerButton","TooltipPantheon","GodID","cps1","cps2","cps3","PantheonGods","TooltipWarn","create","boxId","labelTextFront","labelTextBack","deficitId","transition","labelDiv","labelSpan","deficitDiv","deficitSpan","ToolWarnUser","bonusIncomeUsed","ToolWarnBon","limitLucky","bonusNoFren","ToolWarnLucky","ToolWarnLuckyFrenzy","limitLuckyFrenzy","ToolWarnConjure","limitConjure","ToolWarnConjureFrenzy","limitConjureFrenzy","ToolWarnEdifice","Warnings","CMDrawHook","prefs","autosave","drawT","Stats","sayTime","T","maxWidthTwoBar","maxWidthOneBar","numberOfTimers","AutosaveTimerBar","timeTillNextAutosave","OnAscend","TimerBarOverlay","spawned","Has","minTime","maxTime","chanceToSpawn","season","reindeer","BuffTimerBars","classColour","UpdateTimerBar","TooltipWrink","showingTooltip","phase","selected","placeholder","wrinkler","minWidth","CheckWrinklerTooltip","sucked","toSuck","UpdateWrinklerTooltip","UpStats","CMClickHook","addLatest","computedMouseCps","CMAvgQueue","maxLength","queue","newValue","calcAverage","timePeriod","calcSum","reduce","FillCMDCache","caches","CookieMonsterData","Cache","exportName","CacheAvgCPS","currDate","choEggTotal","cookiesEarned","timeDiff","bankDiffAvg","wrinkDiffAvg","wrinkFattestDiffAvg","choEggDiffAvg","clicksDiffAvg","cookieClicks","cpsLength","AvgCPSHist","choEgg","HasUnlocked","AvgClicksHist","BuildingGetPrice","partialPrice","CacheColour","PPRigidelMode","PPExcludeTop","CachePP","indexOfMin","CacheBuildingsPP","Objects1","Objects10","Objects100","entries","BuyUpgradesBonusIncome","unlocked","CountsAsUpgradeOwned","diffMouseCPS","multClick","out","MouseCps","CacheBuildingIncome","result","CacheBuildingsPrices","CacheIncome","bonusIncome","CacheUpgradeIncome","MaxChainCookieReward","digit","maxPayout","totalFromChain","nextMoni","nextRequired","chain","LN10","CacheChain","cpsBuffMult","CacheHeavenlyChipsPS","chipsOwned","HowMuchPrestige","cookiesReset","ascendNowToGet","heavenlyChipsDiffAvg","CacheAllMissingUpgrades","classes","noFrame","crates","icon","iconFunction","getDynamicTooltip","crateMissing","CacheSeasonSpec","CacheStatsCookies","CacheGoldenAndWrathCookiesMults","goldenMult","wrathMult","eff","AllAmountTillNextAchievement","forceRecalc","TotalNeeded","tillNext","AchievementsAtStart","index","lastIndexWithChange","IndividualAmountTillNextAchievement","CacheWrinklers","InitCache","PopAllNormalWrinklers","hp","CreateTooltip","TooltipAmor","buildPrice","amortizeAmount","storedTotalCps","globalCpsMult","crateTooltip","lumpTooltip","spellTooltip","tileTooltip","toolTooltip","goodTooltip","godTooltip","slotTooltip","area","UpdateFavicon","Favicon","wrath","href","InitData","ReplaceTooltipGrimoire","dynamic","wobble","ReplaceNativeGrimoireDraw","GrimoireBar","magicBarTextL","magicBarL","ReplaceNativeGrimoire","launch","ReplaceNativeGrimoireLaunch","CacheDragonCost","dragonLevels","buy","objectMatch","replaceAll","cost","ConfigGroups","Favourite","Calculation","Notation","Colours","BarsDisplay","Tooltip","Statistics","Miscellaneous","ConfigGroupsNotification","NotificationGeneral","NotificationGC","NotificationFC","NotificationSea","NotificationGard","NotificationMagi","NotificationWrink","NotificationWrinkMax","ToggleOnOff","checkNotificationPromise","requestPermission","then","RefreshScale","BeautifyAll","RefreshStore","RebuildUpgrades","ToggleBotBar","DetailedTime","UpgradeBarFixedPos","DragonAuraInfo","GCTimer","HideSectionsButtons","TooltipAscendButton","MissingUpgrades","MissingAchievements","HeavenlyChipsTarget","ShowMissedGC","GCNotification","GCFlash","ColourGCFlash","GCSound","GCVolume","GCSoundURL","FortuneNotification","FortuneFlash","ColourFortuneFlash","FortuneSound","FortuneVolume","FortuneSoundURL","SeaNotification","SeaFlash","ColourSeaFlash","SeaSound","SeaVolume","SeaSoundURL","GardFlash","ColourGardFlash","GardSound","GardVolume","GardSoundURL","MagicNotification","MagicFlash","ColourMagicFlash","MagicSound","MagicVolume","MagicSoundURL","WrinklerNotification","WrinklerFlash","ColourWrinklerFlash","WrinklerSound","WrinklerVolume","WrinklerSoundURL","WrinklerMaxNotification","WrinklerMaxFlash","ColourWrinklerMaxFlash","WrinklerMaxSound","WrinklerMaxVolume","WrinklerMaxSoundURL","BulkBuyBlock","UpdateColours","createMenuOptions","menuDiv","subGroup","subGroupObject","CountSevens","number","String","CalculateSevenDelta","digitPlace","modulus","StatsHeader","config","fontFamily","ToggleHeader","StatsListing","listingName","StatsMissDispListing","current","StatsMissDisp","theMissDisp","frag","createDocumentFragment","missing","AddMenuStats","stats","Lucky","goldCookTooltip","luckyColour","luckyTime","luckyReqFrag","luckyReqSpan","luckyReqSmall","luckyColourFrenzy","luckyTimeFrenzy","luckyReqFrenFrag","luckyReqFrenSpan","luckyReqFrenSmall","luckySplit","luckyRewardMaxSpan","luckyRewardFrenzyMaxSpan","luckyCurBase","luckyCurSpan","Chain","chainColour","chainTime","chainReqFrag","chainReqSpan","chainReqSmall","chainWrathColour","chainWrathTime","chainWrathReqFrag","chainWrathReqSpan","chainWrathReqSmall","chainColourFrenzy","chainTimeFrenzy","chainReqFrenFrag","chainReqFrenSpan","chainReqFrenSmall","chainWrathColourFrenzy","chainWrathTimeFrenzy","chainWrathReqFrenFrag","chainWrathReqFrenSpan","chainWrathReqFrenSmall","chainCurMax","chainCur","chainCurWrath","Spells","conjureColour","conjureTime","conjureReqFrag","conjureReqSpan","conjureReqSmall","conjureFrenzyColour","conjureFrenzyCur","conjureFrenzyTime","conjureFrenzyReqFrag","conjureFrenzyReqSpan","conjureFrenzyReqSmall","Garden","bakeberryColour","bakeberryFrag","chocorootColour","chocorootFrag","queenbeetColour","queenbeetFrag","duketaterColour","duketaterFrag","missingPlantDrops","Prestige","possiblePresMax","neededCook","HowManyCookiesReset","cookiesNextFrag","cookiesNextSmall","heavenlyChips","HCTarget","CookiesTillTarget","resetBonus","newHeavenlyChips","curCPS","ResetCPS","ResetBonus","resetFrag","resetSmall","currentPrestige","willHave","willGet","luckyDigit","luckyNumber","luckyPayout","currentLevel","sevenCount","numberOfDigits","localLevel","CalculateLuckyLevels","luckyDigitDelta","luckyDigitReset","fragLuckyDigit","luckyNumberDelta","luckyNumberReset","fragLuckyNumber","luckyPayoutDelta","luckyPayoutReset","fragLuckyPayout","Wrink","popAllFrag","popAllA","popFattestFrag","popFattestA","specDisp","missingHalloweenCookies","missingChristmasCookies","missingValentineCookies","missingNormalEggs","eggDrops","missingRareEggs","rareEggDrops","centEgg","Sea","failRateHalloween","dropRateMult","obtainedCookiesChance","failRateChristmas","dropRateEgg","StartingFailRate","failRateEgg","succesRateEgg","obtainedEggs","obtainedRareEggs","pNormal1","pRare1","pRedrop","Achievs","Misc","missedGoldenClicks","menuSection","prestigeUpgradesMissing","titlefrag","PrestigeUpgrades","normalUpgradesMissing","tech","nextSibling","cookieUpgradesMissing","cookie","achievs","parentElement","achievsCrate","AchievementsById","mouseDown","setOnCrate","tags","neuromancy","sesame","descFunc","tagsStr","CrateTooltipLockedAchievements","AddMissingAchievements","FixMouseY","timerBarHeight","mouseY","ReplaceNative","drawMod","from","update","updateMod","warnOffset","tta","tt","UpdateTooltipLocation","UpdateWrinklers","UpdateSpecial","ClickCookie","ClickProduct","DescribeDragonAura","aura","bonusCPS","priceOfChange","highestBuilding","CalculateChangeAura","timeToRecover","bonusCPSPercentage","div2","AddAuraInfo","ToggleSpecialMenu","on","shouldHide","AddDragonLevelUpTooltip","AddMenu","detail","Logic","titleGC","titleFC","titleSP","addFC","addSP","life","lastIndexOf","spawn","UpdateTitle","cookiesToNext","ReplaceAscendTooltip","InitializeCookieMonster","head","borderTop","textShadow","table","tbody","firstCol","td","CreateBotBar","CMTimerBarAutosave","CMTimerBarGC","CMTimerBarRen","TimerBarBuffTimers","CreateTimerBar","UpgradeBar","legend","legendLine","CreateUpgradeBarLegend","upgradeNumber","CreateUpgradeBar","CreateSectionHideButtons","getElementsByTagName","CreateFavicon","CreateSimpleTooltip","append","CreateWrinklerButtons","productButtons","button","lockedMinigames","toggleBuildingLock","canLumps","child","coords","ReplaceTooltipMarket","ReplaceTooltipPantheon","popups","Popup","Notify","Win","CalculateChangeGod","CurrentSlot","godsById","CMLoopHook","AscendTimer","CachePantheonGods","sellTotal","marketGoods","goods","goodsVal","marketGood","cookiesPsRawHighest","buildingsToSacrifice","SellBuildingsForChoEgg","CacheSellAllForChoEgg","hasBuildAura","godMult","CacheCurrWrinklerCPS","LoopCache","TickerEffect","shimmers","spawnLead","nextStep","CheckMagicMeter","CurrentWrinklers","getWrinklersMax","CheckWrinklerCount","pop","webkitFilter","CreateGCTimer","transform","buildingIndex","version","CM","proceed","confirm","Steam"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/CookieMonsterDev.js b/dist/CookieMonsterDev.js index 7f164f66..873dddae 100644 --- a/dist/CookieMonsterDev.js +++ b/dist/CookieMonsterDev.js @@ -1,3 +1,3 @@ /*! For license information please see CookieMonsterDev.js.LICENSE.txt */ -(()=>{var e={877:function(e){!function(t,o){"use strict";"object"!=typeof e.exports?o(t):e.exports=t.document?o(t):function(e){if(!e.document)throw new Error("jscolor needs a window with document");return o(e)}}("undefined"!=typeof window?window:this,(function(e){"use strict";var t,o,a,n,i=(n={initialized:!1,instances:[],readyQueue:[],register:function(){void 0!==e&&e.document&&e.document.addEventListener("DOMContentLoaded",n.pub.init,!1)},installBySelector:function(t,o){if(!(o=o?n.node(o):e.document))throw new Error("Missing root node");for(var a=o.querySelectorAll(t),i=new RegExp("(^|\\s)("+n.pub.lookupClass+")(\\s*(\\{[^}]*\\})|\\s|$)","i"),r=0;r<a.length;r+=1){var s,l;if(!(a[r].jscolor&&a[r].jscolor instanceof n.pub)&&(void 0===a[r].type||"color"!=a[r].type.toLowerCase()||!n.isColorAttrSupported)&&(null!==(s=n.getDataAttr(a[r],"jscolor"))||a[r].className&&(l=a[r].className.match(i)))){var c=a[r],d="";null!==s?d=s:l&&(console.warn('Installation using class name is DEPRECATED. Use data-jscolor="" attribute instead.'+n.docsRef),l[4]&&(d=l[4]));var m=null;if(d.trim())try{m=n.parseOptionsStr(d)}catch(e){console.warn(e+"\n"+d)}try{new n.pub(c,m)}catch(e){console.warn(e)}}}},parseOptionsStr:function(e){var t=null;try{t=JSON.parse(e)}catch(o){if(!n.pub.looseJSON)throw new Error("Could not parse jscolor options as JSON: "+o);try{t=new Function("var opts = ("+e+'); return typeof opts === "object" ? opts : {};')()}catch(e){throw new Error("Could not evaluate jscolor options: "+e)}}return t},getInstances:function(){for(var e=[],t=0;t<n.instances.length;t+=1)n.instances[t]&&n.instances[t].targetElement&&e.push(n.instances[t]);return e},createEl:function(t){var o=e.document.createElement(t);return n.setData(o,"gui",!0),o},node:function(t){if(!t)return null;if("string"==typeof t){var o=t,a=null;try{a=e.document.querySelector(o)}catch(e){return console.warn(e),null}return a||console.warn("No element matches the selector: %s",o),a}return n.isNode(t)?t:(console.warn("Invalid node of type %s: %s",typeof t,t),null)},isNode:function(e){return"object"==typeof Node?e instanceof Node:e&&"object"==typeof e&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},nodeName:function(e){return!(!e||!e.nodeName)&&e.nodeName.toLowerCase()},removeChildren:function(e){for(;e.firstChild;)e.removeChild(e.firstChild)},isTextInput:function(e){return e&&"input"===n.nodeName(e)&&"text"===e.type.toLowerCase()},isButton:function(e){if(!e)return!1;var t=n.nodeName(e);return"button"===t||"input"===t&&["button","submit","reset"].indexOf(e.type.toLowerCase())>-1},isButtonEmpty:function(e){switch(n.nodeName(e)){case"input":return!e.value||""===e.value.trim();case"button":return""===e.textContent.trim()}return null},isPassiveEventSupported:function(){var t=!1;try{var o=Object.defineProperty({},"passive",{get:function(){t=!0}});e.addEventListener("testPassive",null,o),e.removeEventListener("testPassive",null,o)}catch(e){}return t}(),isColorAttrSupported:(a=e.document.createElement("input"),!(!a.setAttribute||(a.setAttribute("type","color"),"color"!=a.type.toLowerCase()))),dataProp:"_data_jscolor",setData:function(){var e=arguments[0];if(3===arguments.length){var t=e.hasOwnProperty(n.dataProp)?e[n.dataProp]:e[n.dataProp]={},o=arguments[2];return t[i=arguments[1]]=o,!0}if(2===arguments.length&&"object"==typeof arguments[1]){t=e.hasOwnProperty(n.dataProp)?e[n.dataProp]:e[n.dataProp]={};var a=arguments[1];for(var i in a)a.hasOwnProperty(i)&&(t[i]=a[i]);return!0}throw new Error("Invalid arguments")},removeData:function(){var e=arguments[0];if(!e.hasOwnProperty(n.dataProp))return!0;for(var t=1;t<arguments.length;t+=1){var o=arguments[t];delete e[n.dataProp][o]}return!0},getData:function(e,t,o){if(!e.hasOwnProperty(n.dataProp)){if(void 0===o)return;e[n.dataProp]={}}var a=e[n.dataProp];return a.hasOwnProperty(t)||void 0===o||(a[t]=o),a[t]},getDataAttr:function(e,t){var o="data-"+t;return e.getAttribute(o)},setDataAttr:function(e,t,o){var a="data-"+t;e.setAttribute(a,o)},_attachedGroupEvents:{},attachGroupEvent:function(e,t,o,a){n._attachedGroupEvents.hasOwnProperty(e)||(n._attachedGroupEvents[e]=[]),n._attachedGroupEvents[e].push([t,o,a]),t.addEventListener(o,a,!1)},detachGroupEvents:function(e){if(n._attachedGroupEvents.hasOwnProperty(e)){for(var t=0;t<n._attachedGroupEvents[e].length;t+=1){var o=n._attachedGroupEvents[e][t];o[0].removeEventListener(o[1],o[2],!1)}delete n._attachedGroupEvents[e]}},preventDefault:function(e){e.preventDefault&&e.preventDefault(),e.returnValue=!1},captureTarget:function(e){e.setCapture&&(n._capturedTarget=e,n._capturedTarget.setCapture())},releaseTarget:function(){n._capturedTarget&&(n._capturedTarget.releaseCapture(),n._capturedTarget=null)},triggerEvent:function(t,o,a,i){if(t){var r=null;return"function"==typeof Event?r=new Event(o,{bubbles:a,cancelable:i}):(r=e.document.createEvent("Event")).initEvent(o,a,i),!!r&&(n.setData(r,"internal",!0),t.dispatchEvent(r),!0)}},triggerInputEvent:function(e,t,o,a){e&&n.isTextInput(e)&&n.triggerEvent(e,t,o,a)},eventKey:function(e){var t={9:"Tab",13:"Enter",27:"Escape"};return"string"==typeof e.code?e.code:void 0!==e.keyCode&&t.hasOwnProperty(e.keyCode)?t[e.keyCode]:null},strList:function(e){return e?e.replace(/^\s+|\s+$/g,"").split(/\s+/):[]},hasClass:function(e,t){return!!t&&(void 0!==e.classList?e.classList.contains(t):-1!=(" "+e.className.replace(/\s+/g," ")+" ").indexOf(" "+t+" "))},addClass:function(e,t){var o=n.strList(t);if(void 0===e.classList)for(a=0;a<o.length;a+=1)n.hasClass(e,o[a])||(e.className+=(e.className?" ":"")+o[a]);else for(var a=0;a<o.length;a+=1)e.classList.add(o[a])},removeClass:function(e,t){var o=n.strList(t);if(void 0===e.classList)for(i=0;i<o.length;i+=1){var a=new RegExp("^\\s*"+o[i]+"\\s*|\\s*"+o[i]+"\\s*$|\\s+"+o[i]+"(\\s+)","g");e.className=e.className.replace(a,"$1")}else for(var i=0;i<o.length;i+=1)e.classList.remove(o[i])},getCompStyle:function(t){return(e.getComputedStyle?e.getComputedStyle(t):t.currentStyle)||{}},setStyle:function(e,t,o,a){var i=o?"important":"",r=null;for(var s in t)if(t.hasOwnProperty(s)){var l=null;null===t[s]?(r||(r=n.getData(e,"origStyle")),r&&r.hasOwnProperty(s)&&(l=r[s])):(a&&(r||(r=n.getData(e,"origStyle",{})),r.hasOwnProperty(s)||(r[s]=e.style[s])),l=t[s]),null!==l&&e.style.setProperty(s,l,i)}},hexColor:function(e,t,o){return"#"+(("0"+Math.round(e).toString(16)).substr(-2)+("0"+Math.round(t).toString(16)).substr(-2)+("0"+Math.round(o).toString(16)).substr(-2)).toUpperCase()},hexaColor:function(e,t,o,a){return"#"+(("0"+Math.round(e).toString(16)).substr(-2)+("0"+Math.round(t).toString(16)).substr(-2)+("0"+Math.round(o).toString(16)).substr(-2)+("0"+Math.round(255*a).toString(16)).substr(-2)).toUpperCase()},rgbColor:function(e,t,o){return"rgb("+Math.round(e)+","+Math.round(t)+","+Math.round(o)+")"},rgbaColor:function(e,t,o,a){return"rgba("+Math.round(e)+","+Math.round(t)+","+Math.round(o)+","+Math.round(100*(null==a?1:a))/100+")"},linearGradient:(o=function(){for(var t="linear-gradient",o=["","-webkit-","-moz-","-o-","-ms-"],a=e.document.createElement("div"),n=0;n<o.length;n+=1){var i=o[n]+t,r=i+"(to right, rgba(0,0,0,0), rgba(0,0,0,0))";if(a.style.background=r,a.style.background)return i}return t}(),function(){return o+"("+Array.prototype.join.call(arguments,", ")+")"}),setBorderRadius:function(e,t){n.setStyle(e,{"border-radius":t||"0"})},setBoxShadow:function(e,t){n.setStyle(e,{"box-shadow":t||"none"})},getElementPos:function(e,t){var o=0,a=0,i=e.getBoundingClientRect();if(o=i.left,a=i.top,!t){var r=n.getViewPos();o+=r[0],a+=r[1]}return[o,a]},getElementSize:function(e){return[e.offsetWidth,e.offsetHeight]},getAbsPointerPos:function(e){var t=0,o=0;return void 0!==e.changedTouches&&e.changedTouches.length?(t=e.changedTouches[0].clientX,o=e.changedTouches[0].clientY):"number"==typeof e.clientX&&(t=e.clientX,o=e.clientY),{x:t,y:o}},getRelPointerPos:function(e){var t=(e.target||e.srcElement).getBoundingClientRect(),o=0,a=0;return void 0!==e.changedTouches&&e.changedTouches.length?(o=e.changedTouches[0].clientX,a=e.changedTouches[0].clientY):"number"==typeof e.clientX&&(o=e.clientX,a=e.clientY),{x:o-t.left,y:a-t.top}},getViewPos:function(){var t=e.document.documentElement;return[(e.pageXOffset||t.scrollLeft)-(t.clientLeft||0),(e.pageYOffset||t.scrollTop)-(t.clientTop||0)]},getViewSize:function(){var t=e.document.documentElement;return[e.innerWidth||t.clientWidth,e.innerHeight||t.clientHeight]},RGB_HSV:function(e,t,o){e/=255,t/=255,o/=255;var a=Math.min(Math.min(e,t),o),n=Math.max(Math.max(e,t),o),i=n-a;if(0===i)return[null,0,100*n];var r=e===a?3+(o-t)/i:t===a?5+(e-o)/i:1+(t-e)/i;return[60*(6===r?0:r),i/n*100,100*n]},HSV_RGB:function(e,t,o){var a=o/100*255;if(null===e)return[a,a,a];e/=60,t/=100;var n=Math.floor(e),i=a*(1-t),r=a*(1-t*(n%2?e-n:1-(e-n)));switch(n){case 6:case 0:return[a,r,i];case 1:return[r,a,i];case 2:return[i,a,r];case 3:return[i,r,a];case 4:return[r,i,a];case 5:return[a,i,r]}},parseColorString:function(e){var t,o={rgba:null,format:null};if(t=e.match(/^\W*([0-9A-F]{3,8})\W*$/i)){if(8===t[1].length)o.format="hexa",o.rgba=[parseInt(t[1].substr(0,2),16),parseInt(t[1].substr(2,2),16),parseInt(t[1].substr(4,2),16),parseInt(t[1].substr(6,2),16)/255];else if(6===t[1].length)o.format="hex",o.rgba=[parseInt(t[1].substr(0,2),16),parseInt(t[1].substr(2,2),16),parseInt(t[1].substr(4,2),16),null];else{if(3!==t[1].length)return!1;o.format="hex",o.rgba=[parseInt(t[1].charAt(0)+t[1].charAt(0),16),parseInt(t[1].charAt(1)+t[1].charAt(1),16),parseInt(t[1].charAt(2)+t[1].charAt(2),16),null]}return o}if(t=e.match(/^\W*rgba?\(([^)]*)\)\W*$/i)){var a,n,i,r,s=t[1].split(","),l=/^\s*(\d+|\d*\.\d+|\d+\.\d*)\s*$/;if(s.length>=3&&(a=s[0].match(l))&&(n=s[1].match(l))&&(i=s[2].match(l)))return o.format="rgb",o.rgba=[parseFloat(a[1])||0,parseFloat(n[1])||0,parseFloat(i[1])||0,null],s.length>=4&&(r=s[3].match(l))&&(o.format="rgba",o.rgba[3]=parseFloat(r[1])||0),o}return!1},parsePaletteValue:function(e){var t=[];"string"==typeof e?e.replace(/#[0-9A-F]{3}([0-9A-F]{3})?|rgba?\(([^)]*)\)/gi,(function(e){t.push(e)})):Array.isArray(e)&&(t=e);for(var o=[],a=0;a<t.length;a++){var i=n.parseColorString(t[a]);i&&o.push(i)}return o},containsTranparentColor:function(e){for(var t=0;t<e.length;t++){var o=e[t].rgba[3];if(null!==o&&o<1)return!0}return!1},isAlphaFormat:function(e){switch(e.toLowerCase()){case"hexa":case"rgba":return!0}return!1},scaleCanvasForHighDPR:function(t){var o=e.devicePixelRatio||1;t.width*=o,t.height*=o,t.getContext("2d").scale(o,o)},genColorPreviewCanvas:function(e,t,o,a){var i=Math.round(n.pub.previewSeparator.length),r=n.pub.chessboardSize,s=n.pub.chessboardColor1,l=n.pub.chessboardColor2,c=o||2*r,d=2*r,m=n.createEl("canvas"),p=m.getContext("2d");m.width=c,m.height=d,a&&n.scaleCanvasForHighDPR(m),p.fillStyle=s,p.fillRect(0,0,c,d),p.fillStyle=l;for(var u=0;u<c;u+=2*r)p.fillRect(u,0,r,r),p.fillRect(u+r,r,r,r);e&&(p.fillStyle=e,p.fillRect(0,0,c,d));var h=null;switch(t){case"left":h=0,p.clearRect(0,0,i/2,d);break;case"right":h=c-i,p.clearRect(c-i/2,0,i/2,d)}if(null!==h){p.lineWidth=1;for(var g=0;g<n.pub.previewSeparator.length;g+=1)p.beginPath(),p.strokeStyle=n.pub.previewSeparator[g],p.moveTo(.5+h+g,0),p.lineTo(.5+h+g,d),p.stroke()}return{canvas:m,width:c,height:d}},genColorPreviewGradient:function(e,t,o){var a;return a=t&&o?["to "+{left:"right",right:"left"}[t],e+" 0%",e+" "+o+"px","rgba(0,0,0,0) "+(o+1)+"px","rgba(0,0,0,0) 100%"]:["to right",e+" 0%",e+" 100%"],n.linearGradient.apply(this,a)},redrawPosition:function(){if(n.picker&&n.picker.owner){var e,t,o=n.picker.owner;o.fixed?(e=n.getElementPos(o.targetElement,!0),t=[0,0]):(e=n.getElementPos(o.targetElement),t=n.getViewPos());var a,i,r,s=n.getElementSize(o.targetElement),l=n.getViewSize(),c=n.getPickerDims(o),d=[c.borderW,c.borderH];switch(o.position.toLowerCase()){case"left":a=1,i=0,r=-1;break;case"right":a=1,i=0,r=1;break;case"top":a=0,i=1,r=-1;break;default:a=0,i=1,r=1}var m=(s[i]+d[i])/2;if(o.smartPosition)p=[-t[a]+e[a]+d[a]>l[a]&&-t[a]+e[a]+s[a]/2>l[a]/2&&e[a]+s[a]-d[a]>=0?e[a]+s[a]-d[a]:e[a],-t[i]+e[i]+s[i]+d[i]-m+m*r>l[i]?-t[i]+e[i]+s[i]/2>l[i]/2&&e[i]+s[i]-m-m*r>=0?e[i]+s[i]-m-m*r:e[i]+s[i]-m+m*r:e[i]+s[i]-m+m*r>=0?e[i]+s[i]-m+m*r:e[i]+s[i]-m-m*r];else var p=[e[a],e[i]+s[i]-m+m*r];var u=p[a],h=p[i],g=o.fixed?"fixed":"absolute",f=(p[0]+d[0]>e[0]||p[0]<e[0]+s[0])&&p[1]+d[1]<e[1]+s[1];n._drawPosition(o,u,h,g,f)}},_drawPosition:function(e,t,o,a,i){var r=i?0:e.shadowBlur;n.picker.wrap.style.position=a,n.picker.wrap.style.left=t+"px",n.picker.wrap.style.top=o+"px",n.setBoxShadow(n.picker.boxS,e.shadow?new n.BoxShadow(0,r,e.shadowBlur,0,e.shadowColor):null)},getPickerDims:function(e){var t=2*e.controlBorderWidth+e.width,o=2*e.controlBorderWidth+e.height,a=2*e.controlBorderWidth+2*n.getControlPadding(e)+e.sliderSize;n.getSliderChannel(e)&&(t+=a),e.hasAlphaChannel()&&(t+=a);var i=n.getPaletteDims(e,t);i.height&&(o+=i.height+e.padding),e.closeButton&&(o+=2*e.controlBorderWidth+e.padding+e.buttonHeight);var r=t+2*e.padding,s=o+2*e.padding;return{contentW:t,contentH:o,paddedW:r,paddedH:s,borderW:r+2*e.borderWidth,borderH:s+2*e.borderWidth,palette:i}},getPaletteDims:function(e,t){var o=0,a=0,n=0,i=0,r=0,s=e._palette?e._palette.length:0;return s&&(a=(o=e.paletteCols)>0?Math.ceil(s/o):0,n=Math.max(1,Math.floor((t-(o-1)*e.paletteSpacing)/o)),i=e.paletteHeight?Math.min(e.paletteHeight,n):n),a&&(r=a*i+(a-1)*e.paletteSpacing),{cols:o,rows:a,cellW:n,cellH:i,width:t,height:r}},getControlPadding:function(e){return Math.max(e.padding/2,2*e.pointerBorderWidth+e.pointerThickness-e.controlBorderWidth)},getPadYChannel:function(e){return"v"===e.mode.charAt(1).toLowerCase()?"v":"s"},getSliderChannel:function(e){if(e.mode.length>2)switch(e.mode.charAt(2).toLowerCase()){case"s":return"s";case"v":return"v"}return null},triggerCallback:function(e,t){if(e[t]){var o=null;if("string"==typeof e[t])try{o=new Function(e[t])}catch(e){console.error(e)}else o=e[t];o&&o.call(e)}},triggerGlobal:function(e){for(var t=n.getInstances(),o=0;o<t.length;o+=1)t[o].trigger(e)},_pointerMoveEvent:{mouse:"mousemove",touch:"touchmove"},_pointerEndEvent:{mouse:"mouseup",touch:"touchend"},_pointerOrigin:null,_capturedTarget:null,onDocumentKeyUp:function(e){-1!==["Tab","Escape"].indexOf(n.eventKey(e))&&n.picker&&n.picker.owner&&n.picker.owner.tryHide()},onWindowResize:function(e){n.redrawPosition()},onWindowScroll:function(e){n.redrawPosition()},onParentScroll:function(e){n.picker&&n.picker.owner&&n.picker.owner.tryHide()},onDocumentMouseDown:function(e){var t=e.target||e.srcElement;t.jscolor&&t.jscolor instanceof n.pub?t.jscolor.showOnClick&&!t.disabled&&t.jscolor.show():n.getData(t,"gui")?n.getData(t,"control")&&n.onControlPointerStart(e,t,n.getData(t,"control"),"mouse"):n.picker&&n.picker.owner&&n.picker.owner.tryHide()},onPickerTouchStart:function(e){var t=e.target||e.srcElement;n.getData(t,"control")&&n.onControlPointerStart(e,t,n.getData(t,"control"),"touch")},onControlPointerStart:function(t,o,a,i){var r=n.getData(o,"instance");n.preventDefault(t),n.captureTarget(o);var s=function(e,r){n.attachGroupEvent("drag",e,n._pointerMoveEvent[i],n.onDocumentPointerMove(t,o,a,i,r)),n.attachGroupEvent("drag",e,n._pointerEndEvent[i],n.onDocumentPointerEnd(t,o,a,i))};if(s(e.document,[0,0]),e.parent&&e.frameElement){var l=e.frameElement.getBoundingClientRect(),c=[-l.left,-l.top];s(e.parent.window.document,c)}var d=n.getAbsPointerPos(t),m=n.getRelPointerPos(t);switch(n._pointerOrigin={x:d.x-m.x,y:d.y-m.y},a){case"pad":"v"===n.getSliderChannel(r)&&0===r.channels.v&&r.fromHSVA(null,null,100,null),n.setPad(r,t,0,0);break;case"sld":n.setSld(r,t,0);break;case"asld":n.setASld(r,t,0)}r.trigger("input")},onDocumentPointerMove:function(e,t,o,a,i){return function(e){var a=n.getData(t,"instance");switch(o){case"pad":n.setPad(a,e,i[0],i[1]);break;case"sld":n.setSld(a,e,i[1]);break;case"asld":n.setASld(a,e,i[1])}a.trigger("input")}},onDocumentPointerEnd:function(e,t,o,a){return function(e){var o=n.getData(t,"instance");n.detachGroupEvents("drag"),n.releaseTarget(),o.trigger("input"),o.trigger("change")}},onPaletteSampleClick:function(e){var t=e.currentTarget,o=n.getData(t,"instance"),a=n.getData(t,"color");"any"===o.format.toLowerCase()&&(o._setFormat(a.format),n.isAlphaFormat(o.getFormat())||(a.rgba[3]=1)),null===a.rgba[3]&&(!0===o.paletteSetsAlpha||"auto"===o.paletteSetsAlpha&&o._paletteHasTransparency)&&(a.rgba[3]=1),o.fromRGBA.apply(o,a.rgba),o.trigger("input"),o.trigger("change"),o.hideOnPaletteClick&&o.hide()},setPad:function(e,t,o,a){var i=n.getAbsPointerPos(t),r=o+i.x-n._pointerOrigin.x-e.padding-e.controlBorderWidth,s=a+i.y-n._pointerOrigin.y-e.padding-e.controlBorderWidth,l=r*(360/(e.width-1)),c=100-s*(100/(e.height-1));switch(n.getPadYChannel(e)){case"s":e.fromHSVA(l,c,null,null);break;case"v":e.fromHSVA(l,null,c,null)}},setSld:function(e,t,o){var a=100-(o+n.getAbsPointerPos(t).y-n._pointerOrigin.y-e.padding-e.controlBorderWidth)*(100/(e.height-1));switch(n.getSliderChannel(e)){case"s":e.fromHSVA(null,a,null,null);break;case"v":e.fromHSVA(null,null,a,null)}},setASld:function(e,t,o){var a=1-(o+n.getAbsPointerPos(t).y-n._pointerOrigin.y-e.padding-e.controlBorderWidth)*(1/(e.height-1));if(a<1){var i=e.getFormat();"any"!==e.format.toLowerCase()||n.isAlphaFormat(i)||e._setFormat("hex"===i?"hexa":"rgba")}e.fromHSVA(null,null,null,a)},createPadCanvas:function(){var e={elm:null,draw:null},t=n.createEl("canvas"),o=t.getContext("2d");return e.elm=t,e.draw=function(e,a,n){t.width=e,t.height=a,o.clearRect(0,0,t.width,t.height);var i=o.createLinearGradient(0,0,t.width,0);i.addColorStop(0,"#F00"),i.addColorStop(1/6,"#FF0"),i.addColorStop(2/6,"#0F0"),i.addColorStop(.5,"#0FF"),i.addColorStop(4/6,"#00F"),i.addColorStop(5/6,"#F0F"),i.addColorStop(1,"#F00"),o.fillStyle=i,o.fillRect(0,0,t.width,t.height);var r=o.createLinearGradient(0,0,0,t.height);switch(n.toLowerCase()){case"s":r.addColorStop(0,"rgba(255,255,255,0)"),r.addColorStop(1,"rgba(255,255,255,1)");break;case"v":r.addColorStop(0,"rgba(0,0,0,0)"),r.addColorStop(1,"rgba(0,0,0,1)")}o.fillStyle=r,o.fillRect(0,0,t.width,t.height)},e},createSliderGradient:function(){var e={elm:null,draw:null},t=n.createEl("canvas"),o=t.getContext("2d");return e.elm=t,e.draw=function(e,a,n,i){t.width=e,t.height=a,o.clearRect(0,0,t.width,t.height);var r=o.createLinearGradient(0,0,0,t.height);r.addColorStop(0,n),r.addColorStop(1,i),o.fillStyle=r,o.fillRect(0,0,t.width,t.height)},e},createASliderGradient:function(){var e={elm:null,draw:null},t=n.createEl("canvas"),o=t.getContext("2d");return e.elm=t,e.draw=function(e,a,i){t.width=e,t.height=a,o.clearRect(0,0,t.width,t.height);var r=t.width/2,s=n.pub.chessboardColor1,l=n.pub.chessboardColor2;if(o.fillStyle=s,o.fillRect(0,0,t.width,t.height),r>0)for(var c=0;c<t.height;c+=2*r)o.fillStyle=l,o.fillRect(0,c,r,r),o.fillRect(r,c+r,r,r);var d=o.createLinearGradient(0,0,0,t.height);d.addColorStop(0,i),d.addColorStop(1,"rgba(0,0,0,0)"),o.fillStyle=d,o.fillRect(0,0,t.width,t.height)},e},BoxShadow:(t=function(e,t,o,a,n,i){this.hShadow=e,this.vShadow=t,this.blur=o,this.spread=a,this.color=n,this.inset=!!i},t.prototype.toString=function(){var e=[Math.round(this.hShadow)+"px",Math.round(this.vShadow)+"px",Math.round(this.blur)+"px",Math.round(this.spread)+"px",this.color];return this.inset&&e.push("inset"),e.join(" ")},t),flags:{leaveValue:1,leaveAlpha:2,leavePreview:4},enumOpts:{format:["auto","any","hex","hexa","rgb","rgba"],previewPosition:["left","right"],mode:["hsv","hvs","hs","hv"],position:["left","right","top","bottom"],alphaChannel:["auto",!0,!1],paletteSetsAlpha:["auto",!0,!1]},deprecatedOpts:{styleElement:"previewElement",onFineChange:"onInput",overwriteImportant:"forceStyle",closable:"closeButton",insetWidth:"controlBorderWidth",insetColor:"controlBorderColor",refine:null},docsRef:" See https://jscolor.com/docs/",pub:function(t,o){var a=this;function i(e,t){if("string"!=typeof e)throw new Error("Invalid value for option name: "+e);if(n.enumOpts.hasOwnProperty(e)&&("string"==typeof t&&(t=t.toLowerCase()),-1===n.enumOpts[e].indexOf(t)))throw new Error("Option '"+e+"' has invalid value: "+t);if(n.deprecatedOpts.hasOwnProperty(e)){var o=e,i=n.deprecatedOpts[e];if(!i)throw new Error("Option '"+e+"' is DEPRECATED");console.warn("Option '%s' is DEPRECATED, using '%s' instead."+n.docsRef,o,i),e=i}var r="set__"+e;if("function"==typeof a[r])return a[r](t),!0;if(e in a)return a[e]=t,!0;throw new Error("Unrecognized configuration option: "+e)}function r(e){if("string"!=typeof e)throw new Error("Invalid value for option name: "+e);if(n.deprecatedOpts.hasOwnProperty(e)){var t=e,o=n.deprecatedOpts[e];if(!o)throw new Error("Option '"+e+"' is DEPRECATED");console.warn("Option '%s' is DEPRECATED, using '%s' instead."+n.docsRef,t,o),e=o}var i="get__"+e;if("function"==typeof a[i])return a[i](value);if(e in a)return a[e];throw new Error("Unrecognized configuration option: "+e)}function s(){a._processParentElementsInDOM(),n.picker||(n.picker={owner:null,wrap:n.createEl("div"),box:n.createEl("div"),boxS:n.createEl("div"),boxB:n.createEl("div"),pad:n.createEl("div"),padB:n.createEl("div"),padM:n.createEl("div"),padCanvas:n.createPadCanvas(),cross:n.createEl("div"),crossBY:n.createEl("div"),crossBX:n.createEl("div"),crossLY:n.createEl("div"),crossLX:n.createEl("div"),sld:n.createEl("div"),sldB:n.createEl("div"),sldM:n.createEl("div"),sldGrad:n.createSliderGradient(),sldPtrS:n.createEl("div"),sldPtrIB:n.createEl("div"),sldPtrMB:n.createEl("div"),sldPtrOB:n.createEl("div"),asld:n.createEl("div"),asldB:n.createEl("div"),asldM:n.createEl("div"),asldGrad:n.createASliderGradient(),asldPtrS:n.createEl("div"),asldPtrIB:n.createEl("div"),asldPtrMB:n.createEl("div"),asldPtrOB:n.createEl("div"),pal:n.createEl("div"),btn:n.createEl("div"),btnT:n.createEl("span")},n.picker.pad.appendChild(n.picker.padCanvas.elm),n.picker.padB.appendChild(n.picker.pad),n.picker.cross.appendChild(n.picker.crossBY),n.picker.cross.appendChild(n.picker.crossBX),n.picker.cross.appendChild(n.picker.crossLY),n.picker.cross.appendChild(n.picker.crossLX),n.picker.padB.appendChild(n.picker.cross),n.picker.box.appendChild(n.picker.padB),n.picker.box.appendChild(n.picker.padM),n.picker.sld.appendChild(n.picker.sldGrad.elm),n.picker.sldB.appendChild(n.picker.sld),n.picker.sldB.appendChild(n.picker.sldPtrOB),n.picker.sldPtrOB.appendChild(n.picker.sldPtrMB),n.picker.sldPtrMB.appendChild(n.picker.sldPtrIB),n.picker.sldPtrIB.appendChild(n.picker.sldPtrS),n.picker.box.appendChild(n.picker.sldB),n.picker.box.appendChild(n.picker.sldM),n.picker.asld.appendChild(n.picker.asldGrad.elm),n.picker.asldB.appendChild(n.picker.asld),n.picker.asldB.appendChild(n.picker.asldPtrOB),n.picker.asldPtrOB.appendChild(n.picker.asldPtrMB),n.picker.asldPtrMB.appendChild(n.picker.asldPtrIB),n.picker.asldPtrIB.appendChild(n.picker.asldPtrS),n.picker.box.appendChild(n.picker.asldB),n.picker.box.appendChild(n.picker.asldM),n.picker.box.appendChild(n.picker.pal),n.picker.btn.appendChild(n.picker.btnT),n.picker.box.appendChild(n.picker.btn),n.picker.boxB.appendChild(n.picker.box),n.picker.wrap.appendChild(n.picker.boxS),n.picker.wrap.appendChild(n.picker.boxB),n.picker.wrap.addEventListener("touchstart",n.onPickerTouchStart,!!n.isPassiveEventSupported&&{passive:!1}));var t,o,i=n.picker,r=!!n.getSliderChannel(a),s=a.hasAlphaChannel(),m=n.getPickerDims(a),p=2*a.pointerBorderWidth+a.pointerThickness+2*a.crossSize,u=n.getControlPadding(a),h=Math.min(a.borderRadius,Math.round(a.padding*Math.PI));i.wrap.className="jscolor-picker-wrap",i.wrap.style.clear="both",i.wrap.style.width=m.borderW+"px",i.wrap.style.height=m.borderH+"px",i.wrap.style.zIndex=a.zIndex,i.box.className="jscolor-picker",i.box.style.width=m.paddedW+"px",i.box.style.height=m.paddedH+"px",i.box.style.position="relative",i.boxS.className="jscolor-picker-shadow",i.boxS.style.position="absolute",i.boxS.style.left="0",i.boxS.style.top="0",i.boxS.style.width="100%",i.boxS.style.height="100%",n.setBorderRadius(i.boxS,h+"px"),i.boxB.className="jscolor-picker-border",i.boxB.style.position="relative",i.boxB.style.border=a.borderWidth+"px solid",i.boxB.style.borderColor=a.borderColor,i.boxB.style.background=a.backgroundColor,n.setBorderRadius(i.boxB,h+"px"),i.padM.style.background="rgba(255,0,0,.2)",i.sldM.style.background="rgba(0,255,0,.2)",i.asldM.style.background="rgba(0,0,255,.2)",i.padM.style.opacity=i.sldM.style.opacity=i.asldM.style.opacity="0",i.pad.style.position="relative",i.pad.style.width=a.width+"px",i.pad.style.height=a.height+"px",i.padCanvas.draw(a.width,a.height,n.getPadYChannel(a)),i.padB.style.position="absolute",i.padB.style.left=a.padding+"px",i.padB.style.top=a.padding+"px",i.padB.style.border=a.controlBorderWidth+"px solid",i.padB.style.borderColor=a.controlBorderColor,i.padM.style.position="absolute",i.padM.style.left="0px",i.padM.style.top="0px",i.padM.style.width=a.padding+2*a.controlBorderWidth+a.width+u+"px",i.padM.style.height=2*a.controlBorderWidth+2*a.padding+a.height+"px",i.padM.style.cursor="crosshair",n.setData(i.padM,{instance:a,control:"pad"}),i.cross.style.position="absolute",i.cross.style.left=i.cross.style.top="0",i.cross.style.width=i.cross.style.height=p+"px",i.crossBY.style.position=i.crossBX.style.position="absolute",i.crossBY.style.background=i.crossBX.style.background=a.pointerBorderColor,i.crossBY.style.width=i.crossBX.style.height=2*a.pointerBorderWidth+a.pointerThickness+"px",i.crossBY.style.height=i.crossBX.style.width=p+"px",i.crossBY.style.left=i.crossBX.style.top=Math.floor(p/2)-Math.floor(a.pointerThickness/2)-a.pointerBorderWidth+"px",i.crossBY.style.top=i.crossBX.style.left="0",i.crossLY.style.position=i.crossLX.style.position="absolute",i.crossLY.style.background=i.crossLX.style.background=a.pointerColor,i.crossLY.style.height=i.crossLX.style.width=p-2*a.pointerBorderWidth+"px",i.crossLY.style.width=i.crossLX.style.height=a.pointerThickness+"px",i.crossLY.style.left=i.crossLX.style.top=Math.floor(p/2)-Math.floor(a.pointerThickness/2)+"px",i.crossLY.style.top=i.crossLX.style.left=a.pointerBorderWidth+"px",i.sld.style.overflow="hidden",i.sld.style.width=a.sliderSize+"px",i.sld.style.height=a.height+"px",i.sldGrad.draw(a.sliderSize,a.height,"#000","#000"),i.sldB.style.display=r?"block":"none",i.sldB.style.position="absolute",i.sldB.style.left=a.padding+a.width+2*a.controlBorderWidth+2*u+"px",i.sldB.style.top=a.padding+"px",i.sldB.style.border=a.controlBorderWidth+"px solid",i.sldB.style.borderColor=a.controlBorderColor,i.sldM.style.display=r?"block":"none",i.sldM.style.position="absolute",i.sldM.style.left=a.padding+a.width+2*a.controlBorderWidth+u+"px",i.sldM.style.top="0px",i.sldM.style.width=a.sliderSize+2*u+2*a.controlBorderWidth+(s?0:Math.max(0,a.padding-u))+"px",i.sldM.style.height=2*a.controlBorderWidth+2*a.padding+a.height+"px",i.sldM.style.cursor="default",n.setData(i.sldM,{instance:a,control:"sld"}),i.sldPtrIB.style.border=i.sldPtrOB.style.border=a.pointerBorderWidth+"px solid "+a.pointerBorderColor,i.sldPtrOB.style.position="absolute",i.sldPtrOB.style.left=-(2*a.pointerBorderWidth+a.pointerThickness)+"px",i.sldPtrOB.style.top="0",i.sldPtrMB.style.border=a.pointerThickness+"px solid "+a.pointerColor,i.sldPtrS.style.width=a.sliderSize+"px",i.sldPtrS.style.height=n.pub.sliderInnerSpace+"px",i.asld.style.overflow="hidden",i.asld.style.width=a.sliderSize+"px",i.asld.style.height=a.height+"px",i.asldGrad.draw(a.sliderSize,a.height,"#000"),i.asldB.style.display=s?"block":"none",i.asldB.style.position="absolute",i.asldB.style.left=a.padding+a.width+2*a.controlBorderWidth+u+(r?a.sliderSize+3*u+2*a.controlBorderWidth:0)+"px",i.asldB.style.top=a.padding+"px",i.asldB.style.border=a.controlBorderWidth+"px solid",i.asldB.style.borderColor=a.controlBorderColor,i.asldM.style.display=s?"block":"none",i.asldM.style.position="absolute",i.asldM.style.left=a.padding+a.width+2*a.controlBorderWidth+u+(r?a.sliderSize+2*u+2*a.controlBorderWidth:0)+"px",i.asldM.style.top="0px",i.asldM.style.width=a.sliderSize+2*u+2*a.controlBorderWidth+Math.max(0,a.padding-u)+"px",i.asldM.style.height=2*a.controlBorderWidth+2*a.padding+a.height+"px",i.asldM.style.cursor="default",n.setData(i.asldM,{instance:a,control:"asld"}),i.asldPtrIB.style.border=i.asldPtrOB.style.border=a.pointerBorderWidth+"px solid "+a.pointerBorderColor,i.asldPtrOB.style.position="absolute",i.asldPtrOB.style.left=-(2*a.pointerBorderWidth+a.pointerThickness)+"px",i.asldPtrOB.style.top="0",i.asldPtrMB.style.border=a.pointerThickness+"px solid "+a.pointerColor,i.asldPtrS.style.width=a.sliderSize+"px",i.asldPtrS.style.height=n.pub.sliderInnerSpace+"px",i.pal.className="jscolor-palette",i.pal.style.display=m.palette.rows?"block":"none",i.pal.style.position="absolute",i.pal.style.left=a.padding+"px",i.pal.style.top=2*a.controlBorderWidth+2*a.padding+a.height+"px",i.pal.innerHTML="";for(var g=n.genColorPreviewCanvas("rgba(0,0,0,0)"),f=0,k=0;k<m.palette.rows;k++)for(var C=0;C<m.palette.cols&&f<a._palette.length;C++,f++){var M=a._palette[f],y=n.rgbaColor.apply(null,M.rgba),b=n.createEl("div");b.style.width=m.palette.cellW-2*a.controlBorderWidth+"px",b.style.height=m.palette.cellH-2*a.controlBorderWidth+"px",b.style.backgroundColor=y;var G=n.createEl("div");G.className="jscolor-palette-sample",G.style.display="block",G.style.position="absolute",G.style.left=(m.palette.cols<=1?0:Math.round(C*((m.contentW-m.palette.cellW)/(m.palette.cols-1))*10)/10)+"px",G.style.top=k*(m.palette.cellH+a.paletteSpacing)+"px",G.style.border=a.controlBorderWidth+"px solid",G.style.borderColor=a.controlBorderColor,G.style.cursor="pointer",null!==M.rgba[3]&&M.rgba[3]<1&&(G.style.backgroundImage="url('"+g.canvas.toDataURL()+"')",G.style.backgroundRepeat="repeat",G.style.backgroundPosition="center center"),n.setData(G,{instance:a,control:"palette-sample",color:M}),G.addEventListener("click",n.onPaletteSampleClick,!1),G.appendChild(b),i.pal.appendChild(G)}i.btn.className="jscolor-btn-close",i.btn.style.display=a.closeButton?"block":"none",i.btn.style.position="absolute",i.btn.style.left=a.padding+"px",i.btn.style.bottom=a.padding+"px",i.btn.style.padding="0 15px",i.btn.style.maxWidth=m.contentW-2*a.controlBorderWidth-30+"px",i.btn.style.overflow="hidden",i.btn.style.height=a.buttonHeight+"px",i.btn.style.whiteSpace="nowrap",i.btn.style.border=a.controlBorderWidth+"px solid",o=(t=a.controlBorderColor.split(/\s+/)).length<2?t[0]:t[1]+" "+t[0]+" "+t[0]+" "+t[1],i.btn.style.borderColor=o,i.btn.style.color=a.buttonColor,i.btn.style.font="12px sans-serif",i.btn.style.textAlign="center",i.btn.style.cursor="pointer",i.btn.onmousedown=function(){a.hide()},i.btnT.style.lineHeight=a.buttonHeight+"px",i.btnT.innerHTML="",i.btnT.appendChild(e.document.createTextNode(a.closeText)),l(),c(),d(),n.picker.owner&&n.picker.owner!==a&&n.removeClass(n.picker.owner.targetElement,n.pub.activeClassName),n.picker.owner=a,a.container===e.document.body?n.redrawPosition():n._drawPosition(a,0,0,"relative",!1),i.wrap.parentNode!==a.container&&a.container.appendChild(i.wrap),n.addClass(a.targetElement,n.pub.activeClassName)}function l(){var e=n.getPadYChannel(a),t=Math.round(a.channels.h/360*(a.width-1)),o=Math.round((1-a.channels[e]/100)*(a.height-1)),i=2*a.pointerBorderWidth+a.pointerThickness+2*a.crossSize,r=-Math.floor(i/2);switch(n.picker.cross.style.left=t+r+"px",n.picker.cross.style.top=o+r+"px",n.getSliderChannel(a)){case"s":var s=n.HSV_RGB(a.channels.h,100,a.channels.v),l=n.HSV_RGB(a.channels.h,0,a.channels.v),c="rgb("+Math.round(s[0])+","+Math.round(s[1])+","+Math.round(s[2])+")",d="rgb("+Math.round(l[0])+","+Math.round(l[1])+","+Math.round(l[2])+")";n.picker.sldGrad.draw(a.sliderSize,a.height,c,d);break;case"v":var m=n.HSV_RGB(a.channels.h,a.channels.s,100);c="rgb("+Math.round(m[0])+","+Math.round(m[1])+","+Math.round(m[2])+")",d="#000",n.picker.sldGrad.draw(a.sliderSize,a.height,c,d)}n.picker.asldGrad.draw(a.sliderSize,a.height,a.toHEXString())}function c(){var e=n.getSliderChannel(a);if(e){var t=Math.round((1-a.channels[e]/100)*(a.height-1));n.picker.sldPtrOB.style.top=t-(2*a.pointerBorderWidth+a.pointerThickness)-Math.floor(n.pub.sliderInnerSpace/2)+"px"}n.picker.asldGrad.draw(a.sliderSize,a.height,a.toHEXString())}function d(){var e=Math.round((1-a.channels.a)*(a.height-1));n.picker.asldPtrOB.style.top=e-(2*a.pointerBorderWidth+a.pointerThickness)-Math.floor(n.pub.sliderInnerSpace/2)+"px"}function m(){return n.picker&&n.picker.owner===a}if(o||(o={}),this.channels={r:255,g:255,b:255,h:0,s:0,v:100,a:1},this.format="auto",this.value=void 0,this.alpha=void 0,this.random=!1,this.onChange=void 0,this.onInput=void 0,this.valueElement=void 0,this.alphaElement=void 0,this.previewElement=void 0,this.previewPosition="left",this.previewSize=32,this.previewPadding=8,this.required=!0,this.hash=!0,this.uppercase=!0,this.forceStyle=!0,this.width=181,this.height=101,this.mode="HSV",this.alphaChannel="auto",this.position="bottom",this.smartPosition=!0,this.showOnClick=!0,this.hideOnLeave=!0,this.palette=[],this.paletteCols=10,this.paletteSetsAlpha="auto",this.paletteHeight=16,this.paletteSpacing=4,this.hideOnPaletteClick=!1,this.sliderSize=16,this.crossSize=8,this.closeButton=!1,this.closeText="Close",this.buttonColor="rgba(0,0,0,1)",this.buttonHeight=18,this.padding=12,this.backgroundColor="rgba(255,255,255,1)",this.borderWidth=1,this.borderColor="rgba(187,187,187,1)",this.borderRadius=8,this.controlBorderWidth=1,this.controlBorderColor="rgba(187,187,187,1)",this.shadow=!0,this.shadowBlur=15,this.shadowColor="rgba(0,0,0,0.2)",this.pointerColor="rgba(76,76,76,1)",this.pointerBorderWidth=1,this.pointerBorderColor="rgba(255,255,255,1)",this.pointerThickness=2,this.zIndex=5e3,this.container=void 0,this.minS=0,this.maxS=100,this.minV=0,this.maxV=100,this.minA=0,this.maxA=1,this.option=function(){if(!arguments.length)throw new Error("No option specified");if(1===arguments.length&&"string"==typeof arguments[0]){try{return r(arguments[0])}catch(e){console.warn(e)}return!1}if(arguments.length>=2&&"string"==typeof arguments[0]){try{if(!i(arguments[0],arguments[1]))return!1}catch(e){return console.warn(e),!1}return this.redraw(),this.exposeColor(),!0}if(1===arguments.length&&"object"==typeof arguments[0]){var e=arguments[0],t=!0;for(var o in e)if(e.hasOwnProperty(o))try{i(o,e[o])||(t=!1)}catch(e){console.warn(e),t=!1}return this.redraw(),this.exposeColor(),t}throw new Error("Invalid arguments")},this.channel=function(e,t){if("string"!=typeof e)throw new Error("Invalid value for channel name: "+e);if(void 0===t)return this.channels.hasOwnProperty(e.toLowerCase())?this.channels[e.toLowerCase()]:(console.warn("Getting unknown channel: "+e),!1);var o=!1;switch(e.toLowerCase()){case"r":o=this.fromRGBA(t,null,null,null);break;case"g":o=this.fromRGBA(null,t,null,null);break;case"b":o=this.fromRGBA(null,null,t,null);break;case"h":o=this.fromHSVA(t,null,null,null);break;case"s":o=this.fromHSVA(null,t,null,null);break;case"v":o=this.fromHSVA(null,null,t,null);break;case"a":o=this.fromHSVA(null,null,null,t);break;default:return console.warn("Setting unknown channel: "+e),!1}return!!o&&(this.redraw(),!0)},this.trigger=function(e){for(var t=n.strList(e),o=0;o<t.length;o+=1){var a=t[o].toLowerCase(),i=null;switch(a){case"input":i="onInput";break;case"change":i="onChange"}i&&n.triggerCallback(this,i),n.triggerInputEvent(this.valueElement,a,!0,!0)}},this.fromHSVA=function(e,t,o,a,i){if(void 0===e&&(e=null),void 0===t&&(t=null),void 0===o&&(o=null),void 0===a&&(a=null),null!==e){if(isNaN(e))return!1;this.channels.h=Math.max(0,Math.min(360,e))}if(null!==t){if(isNaN(t))return!1;this.channels.s=Math.max(0,Math.min(100,this.maxS,t),this.minS)}if(null!==o){if(isNaN(o))return!1;this.channels.v=Math.max(0,Math.min(100,this.maxV,o),this.minV)}if(null!==a){if(isNaN(a))return!1;this.channels.a=this.hasAlphaChannel()?Math.max(0,Math.min(1,this.maxA,a),this.minA):1}var r=n.HSV_RGB(this.channels.h,this.channels.s,this.channels.v);return this.channels.r=r[0],this.channels.g=r[1],this.channels.b=r[2],this.exposeColor(i),!0},this.fromRGBA=function(e,t,o,a,i){if(void 0===e&&(e=null),void 0===t&&(t=null),void 0===o&&(o=null),void 0===a&&(a=null),null!==e){if(isNaN(e))return!1;e=Math.max(0,Math.min(255,e))}if(null!==t){if(isNaN(t))return!1;t=Math.max(0,Math.min(255,t))}if(null!==o){if(isNaN(o))return!1;o=Math.max(0,Math.min(255,o))}if(null!==a){if(isNaN(a))return!1;this.channels.a=this.hasAlphaChannel()?Math.max(0,Math.min(1,this.maxA,a),this.minA):1}var r=n.RGB_HSV(null===e?this.channels.r:e,null===t?this.channels.g:t,null===o?this.channels.b:o);null!==r[0]&&(this.channels.h=Math.max(0,Math.min(360,r[0]))),0!==r[2]&&(this.channels.s=Math.max(0,this.minS,Math.min(100,this.maxS,r[1]))),this.channels.v=Math.max(0,this.minV,Math.min(100,this.maxV,r[2]));var s=n.HSV_RGB(this.channels.h,this.channels.s,this.channels.v);return this.channels.r=s[0],this.channels.g=s[1],this.channels.b=s[2],this.exposeColor(i),!0},this.fromHSV=function(e,t,o,a){return console.warn("fromHSV() method is DEPRECATED. Using fromHSVA() instead."+n.docsRef),this.fromHSVA(e,t,o,null,a)},this.fromRGB=function(e,t,o,a){return console.warn("fromRGB() method is DEPRECATED. Using fromRGBA() instead."+n.docsRef),this.fromRGBA(e,t,o,null,a)},this.fromString=function(e,t){if(!this.required&&""===e.trim())return this.setPreviewElementBg(null),this.setValueElementValue(""),!0;var o=n.parseColorString(e);return!!o&&("any"===this.format.toLowerCase()&&(this._setFormat(o.format),n.isAlphaFormat(this.getFormat())||(o.rgba[3]=1)),this.fromRGBA(o.rgba[0],o.rgba[1],o.rgba[2],o.rgba[3],t),!0)},this.randomize=function(e,t,o,a,n,i,r,s){void 0===e&&(e=0),void 0===t&&(t=100),void 0===o&&(o=0),void 0===a&&(a=100),void 0===n&&(n=0),void 0===i&&(i=359),void 0===r&&(r=1),void 0===s&&(s=1),this.fromHSVA(n+Math.floor(Math.random()*(i-n+1)),o+Math.floor(Math.random()*(a-o+1)),e+Math.floor(Math.random()*(t-e+1)),(100*r+Math.floor(Math.random()*(100*(s-r)+1)))/100)},this.toString=function(e){switch(void 0===e&&(e=this.getFormat()),e.toLowerCase()){case"hex":return this.toHEXString();case"hexa":return this.toHEXAString();case"rgb":return this.toRGBString();case"rgba":return this.toRGBAString()}return!1},this.toHEXString=function(){return n.hexColor(this.channels.r,this.channels.g,this.channels.b)},this.toHEXAString=function(){return n.hexaColor(this.channels.r,this.channels.g,this.channels.b,this.channels.a)},this.toRGBString=function(){return n.rgbColor(this.channels.r,this.channels.g,this.channels.b)},this.toRGBAString=function(){return n.rgbaColor(this.channels.r,this.channels.g,this.channels.b,this.channels.a)},this.toGrayscale=function(){return.213*this.channels.r+.715*this.channels.g+.072*this.channels.b},this.toCanvas=function(){return n.genColorPreviewCanvas(this.toRGBAString()).canvas},this.toDataURL=function(){return this.toCanvas().toDataURL()},this.toBackground=function(){return n.pub.background(this.toRGBAString())},this.isLight=function(){return this.toGrayscale()>127.5},this.hide=function(){m()&&(n.removeClass(a.targetElement,n.pub.activeClassName),n.picker.wrap.parentNode.removeChild(n.picker.wrap),delete n.picker.owner)},this.show=function(){s()},this.redraw=function(){m()&&s()},this.getFormat=function(){return this._currentFormat},this._setFormat=function(e){this._currentFormat=e.toLowerCase()},this.hasAlphaChannel=function(){return"auto"===this.alphaChannel?"any"===this.format.toLowerCase()||n.isAlphaFormat(this.getFormat())||void 0!==this.alpha||void 0!==this.alphaElement:this.alphaChannel},this.processValueInput=function(e){this.fromString(e)||this.exposeColor()},this.processAlphaInput=function(e){this.fromHSVA(null,null,null,parseFloat(e))||this.exposeColor()},this.exposeColor=function(e){var t=this.toString(),o=this.getFormat();if(n.setDataAttr(this.targetElement,"current-color",t),e&n.flags.leaveValue||!this.valueElement||("hex"!==o&&"hexa"!==o||(this.uppercase||(t=t.toLowerCase()),this.hash||(t=t.replace(/^#/,""))),this.setValueElementValue(t)),!(e&n.flags.leaveAlpha)&&this.alphaElement){var a=Math.round(100*this.channels.a)/100;this.setAlphaElementValue(a)}e&n.flags.leavePreview||!this.previewElement||((n.isTextInput(this.previewElement)||n.isButton(this.previewElement)&&!n.isButtonEmpty(this.previewElement))&&this.previewPosition,this.setPreviewElementBg(this.toRGBAString())),m()&&(l(),c(),d())},this.setPreviewElementBg=function(e){if(this.previewElement){var t=null,o=null;(n.isTextInput(this.previewElement)||n.isButton(this.previewElement)&&!n.isButtonEmpty(this.previewElement))&&(t=this.previewPosition,o=this.previewSize);var a=[];if(e){a.push({image:n.genColorPreviewGradient(e,t,o?o-n.pub.previewSeparator.length:null),position:"left top",size:"auto",repeat:t?"repeat-y":"repeat",origin:"padding-box"});var i=n.genColorPreviewCanvas("rgba(0,0,0,0)",t?{left:"right",right:"left"}[t]:null,o,!0);a.push({image:"url('"+i.canvas.toDataURL()+"')",position:(t||"left")+" top",size:i.width+"px "+i.height+"px",repeat:t?"repeat-y":"repeat",origin:"padding-box"})}else a.push({image:"none",position:"left top",size:"auto",repeat:"no-repeat",origin:"padding-box"});for(var r={image:[],position:[],size:[],repeat:[],origin:[]},s=0;s<a.length;s+=1)r.image.push(a[s].image),r.position.push(a[s].position),r.size.push(a[s].size),r.repeat.push(a[s].repeat),r.origin.push(a[s].origin);var l={"background-image":r.image.join(", "),"background-position":r.position.join(", "),"background-size":r.size.join(", "),"background-repeat":r.repeat.join(", "),"background-origin":r.origin.join(", ")};n.setStyle(this.previewElement,l,this.forceStyle);var c={left:null,right:null};t&&(c[t]=this.previewSize+this.previewPadding+"px"),l={"padding-left":c.left,"padding-right":c.right},n.setStyle(this.previewElement,l,this.forceStyle,!0)}},this.setValueElementValue=function(e){this.valueElement&&("input"===n.nodeName(this.valueElement)?this.valueElement.value=e:this.valueElement.innerHTML=e)},this.setAlphaElementValue=function(e){this.alphaElement&&("input"===n.nodeName(this.alphaElement)?this.alphaElement.value=e:this.alphaElement.innerHTML=e)},this._processParentElementsInDOM=function(){if(!this._parentElementsProcessed){this._parentElementsProcessed=!0;var e=this.targetElement;do{var t=n.getCompStyle(e);t.position&&"fixed"===t.position.toLowerCase()&&(this.fixed=!0),e!==this.targetElement&&(n.getData(e,"hasScrollListener")||(e.addEventListener("scroll",n.onParentScroll,!1),n.setData(e,"hasScrollListener",!0)))}while((e=e.parentNode)&&"body"!==n.nodeName(e))}},this.tryHide=function(){this.hideOnLeave&&this.hide()},this.set__palette=function(e){this.palette=e,this._palette=n.parsePaletteValue(e),this._paletteHasTransparency=n.containsTranparentColor(this._palette)},n.pub.options)for(var p in n.pub.options)if(n.pub.options.hasOwnProperty(p))try{i(p,n.pub.options[p])}catch(e){console.warn(e)}var u=[];o.preset&&("string"==typeof o.preset?u=o.preset.split(/\s+/):Array.isArray(o.preset)?u=o.preset.slice():console.warn("Unrecognized preset value")),-1===u.indexOf("default")&&u.push("default");for(var h=u.length-1;h>=0;h-=1){var g=u[h];if(g)if(n.pub.presets.hasOwnProperty(g)){for(var p in n.pub.presets[g])if(n.pub.presets[g].hasOwnProperty(p))try{i(p,n.pub.presets[g][p])}catch(e){console.warn(e)}}else console.warn("Unknown preset: %s",g)}var f=["preset"];for(var p in o)if(o.hasOwnProperty(p)&&-1===f.indexOf(p))try{i(p,o[p])}catch(e){console.warn(e)}if(void 0===this.container?this.container=e.document.body:this.container=n.node(this.container),!this.container)throw new Error("Cannot instantiate color picker without a container element");if(this.targetElement=n.node(t),!this.targetElement){if("string"==typeof t&&/^[a-zA-Z][\w:.-]*$/.test(t))throw new Error("If '"+t+"' is supposed to be an ID, please use '#"+t+"' or any valid CSS selector.");throw new Error("Cannot instantiate color picker without a target element")}if(this.targetElement.jscolor&&this.targetElement.jscolor instanceof n.pub)throw new Error("Color picker already installed on this element");if(this.targetElement.jscolor=this,n.addClass(this.targetElement,n.pub.className),n.instances.push(this),n.isButton(this.targetElement)&&("button"!==this.targetElement.type.toLowerCase()&&(this.targetElement.type="button"),n.isButtonEmpty(this.targetElement))){n.removeChildren(this.targetElement),this.targetElement.appendChild(e.document.createTextNode(" "));var k=n.getCompStyle(this.targetElement);(parseFloat(k["min-width"])||0)<this.previewSize&&n.setStyle(this.targetElement,{"min-width":this.previewSize+"px"},this.forceStyle)}if(void 0===this.valueElement?n.isTextInput(this.targetElement)&&(this.valueElement=this.targetElement):null===this.valueElement||(this.valueElement=n.node(this.valueElement)),this.alphaElement&&(this.alphaElement=n.node(this.alphaElement)),void 0===this.previewElement?this.previewElement=this.targetElement:null===this.previewElement||(this.previewElement=n.node(this.previewElement)),this.valueElement&&n.isTextInput(this.valueElement)){var C={onInput:this.valueElement.oninput};this.valueElement.oninput=null,this.valueElement.addEventListener("keydown",(function(e){"Enter"===n.eventKey(e)&&(a.valueElement&&a.processValueInput(a.valueElement.value),a.tryHide())}),!1),this.valueElement.addEventListener("change",(function(e){if(!n.getData(e,"internal")){var t=a.valueElement.value;a.processValueInput(a.valueElement.value),n.triggerCallback(a,"onChange"),a.valueElement.value!==t&&n.triggerInputEvent(a.valueElement,"change",!0,!0)}}),!1),this.valueElement.addEventListener("input",(function(e){n.getData(e,"internal")||(a.valueElement&&a.fromString(a.valueElement.value,n.flags.leaveValue),n.triggerCallback(a,"onInput"))}),!1),C.onInput&&this.valueElement.addEventListener("input",C.onInput,!1),this.valueElement.setAttribute("autocomplete","off"),this.valueElement.setAttribute("autocorrect","off"),this.valueElement.setAttribute("autocapitalize","off"),this.valueElement.setAttribute("spellcheck",!1)}this.alphaElement&&n.isTextInput(this.alphaElement)&&(this.alphaElement.addEventListener("keydown",(function(e){"Enter"===n.eventKey(e)&&(a.alphaElement&&a.processAlphaInput(a.alphaElement.value),a.tryHide())}),!1),this.alphaElement.addEventListener("change",(function(e){if(!n.getData(e,"internal")){var t=a.alphaElement.value;a.processAlphaInput(a.alphaElement.value),n.triggerCallback(a,"onChange"),n.triggerInputEvent(a.valueElement,"change",!0,!0),a.alphaElement.value!==t&&n.triggerInputEvent(a.alphaElement,"change",!0,!0)}}),!1),this.alphaElement.addEventListener("input",(function(e){n.getData(e,"internal")||(a.alphaElement&&a.fromHSVA(null,null,null,parseFloat(a.alphaElement.value),n.flags.leaveAlpha),n.triggerCallback(a,"onInput"),n.triggerInputEvent(a.valueElement,"input",!0,!0))}),!1),this.alphaElement.setAttribute("autocomplete","off"),this.alphaElement.setAttribute("autocorrect","off"),this.alphaElement.setAttribute("autocapitalize","off"),this.alphaElement.setAttribute("spellcheck",!1));var M="FFFFFF";void 0!==this.value?M=this.value:this.valueElement&&void 0!==this.valueElement.value&&(M=this.valueElement.value);var y=void 0;if(void 0!==this.alpha?y=""+this.alpha:this.alphaElement&&void 0!==this.alphaElement.value&&(y=this.alphaElement.value),this._currentFormat=null,["auto","any"].indexOf(this.format.toLowerCase())>-1){var b=n.parseColorString(M);this._currentFormat=b?b.format:"hex"}else this._currentFormat=this.format.toLowerCase();this.processValueInput(M),void 0!==y&&this.processAlphaInput(y),this.random&&this.randomize.apply(this,Array.isArray(this.random)?this.random:[])}},n.pub.className="jscolor",n.pub.activeClassName="jscolor-active",n.pub.looseJSON=!0,n.pub.presets={},n.pub.presets.default={},n.pub.presets.light={backgroundColor:"rgba(255,255,255,1)",controlBorderColor:"rgba(187,187,187,1)",buttonColor:"rgba(0,0,0,1)"},n.pub.presets.dark={backgroundColor:"rgba(51,51,51,1)",controlBorderColor:"rgba(153,153,153,1)",buttonColor:"rgba(240,240,240,1)"},n.pub.presets.small={width:101,height:101,padding:10,sliderSize:14,paletteCols:8},n.pub.presets.medium={width:181,height:101,padding:12,sliderSize:16,paletteCols:10},n.pub.presets.large={width:271,height:151,padding:12,sliderSize:24,paletteCols:15},n.pub.presets.thin={borderWidth:1,controlBorderWidth:1,pointerBorderWidth:1},n.pub.presets.thick={borderWidth:2,controlBorderWidth:2,pointerBorderWidth:2},n.pub.sliderInnerSpace=3,n.pub.chessboardSize=8,n.pub.chessboardColor1="#666666",n.pub.chessboardColor2="#999999",n.pub.previewSeparator=["rgba(255,255,255,.65)","rgba(128,128,128,.65)"],n.pub.init=function(){if(!n.initialized)for(e.document.addEventListener("mousedown",n.onDocumentMouseDown,!1),e.document.addEventListener("keyup",n.onDocumentKeyUp,!1),e.addEventListener("resize",n.onWindowResize,!1),e.addEventListener("scroll",n.onWindowScroll,!1),n.pub.install(),n.initialized=!0;n.readyQueue.length;)n.readyQueue.shift()()},n.pub.install=function(e){var t=!0;try{n.installBySelector("[data-jscolor]",e)}catch(e){t=!1,console.warn(e)}if(n.pub.lookupClass)try{n.installBySelector("input."+n.pub.lookupClass+", button."+n.pub.lookupClass,e)}catch(e){}return t},n.pub.ready=function(e){return"function"!=typeof e?(console.warn("Passed value is not a function"),!1):(n.initialized?e():n.readyQueue.push(e),!0)},n.pub.trigger=function(e){var t=function(){n.triggerGlobal(e)};n.initialized?t():n.pub.ready(t)},n.pub.hide=function(){n.picker&&n.picker.owner&&n.picker.owner.hide()},n.pub.chessboard=function(e){return e||(e="rgba(0,0,0,0)"),n.genColorPreviewCanvas(e).canvas.toDataURL()},n.pub.background=function(e){var t=[];t.push(n.genColorPreviewGradient(e));var o=n.genColorPreviewCanvas();return t.push(["url('"+o.canvas.toDataURL()+"')","left top","repeat"].join(" ")),t.join(", ")},n.pub.options={},n.pub.lookupClass="jscolor",n.pub.installByClassName=function(){return console.error('jscolor.installByClassName() is DEPRECATED. Use data-jscolor="" attribute instead of a class name.'+n.docsRef),!1},n.register(),n.pub);return void 0===e.jscolor&&(e.jscolor=e.JSColor=i),i}))}},t={};function o(a){var n=t[a];if(void 0!==n)return n.exports;var i=t[a]={exports:{}};return e[a].call(i.exports,i,i.exports,o),i.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var a in t)o.o(t,a)&&!o.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";class e{constructor(e,t,o){this.defaultValue=e,this.type=t,this.group=o}}function t(e,t){Game.promptWrapL.className="framed",Game.promptL.innerHTML=`${e}<div class="optionBox"></div>`,Object.keys(t).forEach((e=>{const o=document.createElement("a");o.id=`promptOption${e}`,o.className="option",o.onclick=function(){PlaySound("snd/tick.mp3"),t[e][1]()},o.textContent=t[e][0],Game.promptL.children[1].appendChild(o)})),Game.promptAnchorL.style.display="block",Game.darkenL.style.display="block",Game.promptL.focus(),Game.promptOn=1,Game.UpdatePrompt()}function a(e,t,o,n){(1===Game.mods.cookieMonsterFramework.saveData[e].settings[o]||n)&&3===t&&!1===window.cookieMonsterFrameworkData.isInitializing||1===t?(l("CMFlashScreen").style.backgroundColor=Game.mods.cookieMonsterFramework.saveData[e].settings[`Colour${o}`],l("CMFlashScreen").style.opacity="0.5",3===t?(l("CMFlashScreen").style.display="inline",setTimeout((()=>{a(e,2,o,!0)}),1e3/Game.fps)):setTimeout((()=>{a(e,0,o,!0)}),1e3/Game.fps)):2===t?(l("CMFlashScreen").style.opacity="1",setTimeout((()=>{a(e,1,o,!0)}),1e3/Game.fps)):0===t&&(l("CMFlashScreen").style.display="none")}function n(){Object.keys(Game.mods.cookieMonsterFramework.saveData).forEach((e=>{const t=JSON.stringify(Game.mods.cookieMonsterFramework.saveData[e]),o=b64_to_utf8(unescape(localStorage.getItem("CookieClickerGame")).split("!END!")[0]),a=new RegExp(`${e}.*(;|$)`),n=o.match(a);if(null!==n){const a=o.replace(n[0],`${e}:${t}`);localStorage.setItem("CookieClickerGame",escape(`${utf8_to_b64(a)}!END!`))}}))}function i(e,t){void 0===Game.mods.cookieMonsterFramework.saveData[e].headers[t]&&(Game.mods.cookieMonsterFramework.saveData[e].headers[t]=1),0===Game.mods.cookieMonsterFramework.saveData[e].headers[t]?Game.mods.cookieMonsterFramework.saveData[e].headers[t]=1:Game.mods.cookieMonsterFramework.saveData[e].headers[t]=0,n()}var r=o(877),s=o.n(r);function c(e,t,o,a,n){if((1===Game.mods.cookieMonsterFramework.saveData[e].settings[o]||n)&&!1===window.cookieMonsterFrameworkData.isInitializing){const o=new Audio(t);Game.mods.cookieMonsterFramework.saveData[e].settings.GeneralSound?o.volume=Game.mods.cookieMonsterFramework.saveData[e].settings[a]/100*(Game.volume/100):o.volume=Game.mods.cookieMonsterFramework.saveData[e].settings[a]/100,o.play()}}function d(e,t){null!==l(`slider${e}${t}`)&&(l(`slider${e}${t}right`).innerHTML=`${l(`slider${e}${t}`).value}%`,Game.mods.cookieMonsterFramework.saveData[e].settings[t]=Math.round(l(`slider${e}${t}`).value)),n()}function m(e,t){t.disconnect(),"log"===Game.onMenu?function(){const e=l("menu").children[1];if(e.insertBefore(function(){const e=document.createElement("div");e.className="subsection",e.id="cookieMonsterFrameworkMenuSection";const t=document.createElement("div");t.className="title",t.innerHTML="Cookie Monster Mod Family";const o=document.createElement("span");if(o.style.cursor="pointer",o.style.display="inline-block",o.style.height="14px",o.style.width="14px",o.style.borderRadius="7px",o.style.textAlign="center",o.style.backgroundColor="#C0C0C0",o.style.color="black",o.style.fontSize="13px",o.style.verticalAlign="middle",o.textContent=Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu?"-":"+",o.onclick=function(){i("cookieMonsterFramework","infoMenu"),Game.UpdateMenu()},t.appendChild(o),e.appendChild(t),Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu){const t=document.createElement("div");t.className="listing",t.innerHTML='<a href="https://github.com/CookieMonsterTeam" target="blank">Cookie Monster Team</a>\noffers a suite of tools to enhance your game experience.</br>\nOriginally known from our work on the Cookie Monster add-on we are now expanding and working on new tools within the Cookie Monster Mod Family.</br>\nKeep an eye on our GitHub to see future work or use it to report bugs or feature requests!</br>\n',e.appendChild(t)}return e}(),e.children[1]),Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu){const e=Game.mods.cookieMonsterFramework.listeners.infoMenu;for(let t=0;t<e.length;t++)l("cookieMonsterFrameworkMenuSection").appendChild(e[t]())}}():Game.onMenu,t.observe(document.getElementById("menu"),{attributes:!0,childList:!0,subtree:!0})}function p(){}const u={infoMenu:1,optionsMenu:1};function h(e,t,o,a,i){const r=JSON.parse(t);Game.mods.cookieMonsterFramework.saveData[e]=function(e,t,o){const a={},n={};Object.keys(t).forEach((o=>{void 0===e.settings||void 0===e.settings[o]?n[o]=t[o].defaultValue:n[o]=e.settings[o]})),a.settings=n;const i={};return Object.keys(o).forEach((t=>{void 0===e.headers||void 0===e.headers[t]?i[t]=o[t]:i[t]=e.headers[t]})),a.headers=i,Object.keys(e).forEach((t=>{"settings"!==t&&"headers"!==t&&(a[t]=e[t])})),void 0===a.favouriteSettings&&(a.favouriteSettings=[]),a}(r,o,a),n(),i(),Object.keys(Game.mods.cookieMonsterFramework.saveData[e].settings).forEach((e=>{void 0!==o[e].func&&o[e].func()})),Game.UpdateMenu()}function g(){}const f={};function k(e){h("cookieMonsterFramework",e,f,u,g)}const C={init:function(){window.cookieMonsterFrameworkData={isInitializing:!0},new MutationObserver(m).observe(document.getElementById("menu"),{attributes:!0,childList:!0,subtree:!0}),function(){const e=document.createElement("div");e.id="CMFlashScreen",e.style.width="100%",e.style.height="100%",e.style.backgroundColor="white",e.style.display="none",e.style.zIndex="9999999999",e.style.position="absolute",e.style.pointerEvents="none",l("wrapper").appendChild(e)}(),Game.registerHook("draw",p),void 0===Game.modSaveData.cookieMonsterFramework&&k("{}"),window.cookieMonsterFrameworkData.isInitializing=!1},load:k,save:function(){return JSON.stringify(Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework)},listeners:{infoMenu:[],optionsMenu:[]},saveData:{cookieMonsterFramework:{headers:{},settings:{}}}},M=function(){"undefined"==typeof cookieMonsterFrameworkData&&Game.registerMod("cookieMonsterFramework",C)},y=function(e){Game.mods.cookieMonsterFramework.saveData[e]={favouriteSettings:[],headers:{},settings:{}}},b={createInfoListing:function(e){const t=document.createElement("div");return t.className="listing",t.innerHTML=e,t},createOptionsListing:function(e,o,i,m,p){const u=document.createElement("div");if(u.className="listing",1===Game.mods.cookieMonsterFramework.saveData[e].settings.FavouriteSettings&&u.appendChild(function(e,t,o){const a=document.createElement("a");return o.includes(t)?(a.innerText="★",a.style.color="yellow"):a.innerText="☆",a.className="option",a.onclick=function(){!function(e,t){Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings.includes(t)?Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings=Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings.filter((e=>e!==t)):Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings.push(t),n()}(e,t),n(),Game.UpdateMenu()},a.onmouseover=function(){Game.tooltip.draw(this,escape('<div style="min-width: 250px; margin-bottom: 4px;"><div style="text-align: left;">Click to set this setting as favourite and show it in \'favourite\' settings at the top of the Cookie Monster Settings</div></div>'))},a.onmouseout=function(){Game.tooltip.hide()},a.appendChild(document.createTextNode(" ")),a}(e,o,Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings)),"bool"===i[o].type){const t=document.createElement("a");i[o].toggle&&0===Game.mods.cookieMonsterFramework.saveData[e].settings[o]?t.className="option off":t.className="option",t.id=`${e}Options${o}`,t.onclick=function(){!function(e,t,o){Game.mods.cookieMonsterFramework.saveData[e].settings[t]+=1,Game.mods.cookieMonsterFramework.saveData[e].settings[t]===o[t].label.length?(Game.mods.cookieMonsterFramework.saveData[e].settings[t]=0,o[t].toggle&&(l(`${e}Options${t}`).className="option off")):l(`${e}Options${t}`).className="option",void 0!==o[t].func&&o[t].func(),n()}(e,o,i),Game.UpdateMenu()},t.textContent=i[o].label[Game.mods.cookieMonsterFramework.saveData[e].settings[o]],u.appendChild(t);const a=document.createElement("label");return a.textContent=i[o].desc,a.style.lineHeight="1.6",u.appendChild(a),u}if("vol"===i[o].type){const t=document.createElement("div");t.className="sliderBox";const a=document.createElement("div");a.style.float="left",a.innerHTML=i[o].desc,t.appendChild(a);const n=document.createElement("div");n.id=`slider${e}${o}right`,n.style.float="right",n.innerHTML=`${Game.mods.cookieMonsterFramework.saveData[e].settings[o]}%`,t.appendChild(n);const r=document.createElement("input");r.className="slider",r.id=`slider${e}${o}`,r.style.clear="both",r.type="range",r.min="0",r.max="100",r.step="1",r.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o],r.oninput=function(){d(e,o),Game.UpdateMenu()},r.onchange=function(){d(e,o),Game.UpdateMenu()},t.appendChild(r),u.appendChild(t);const s=document.createElement("a");return s.className="option",s.onclick=function(){c(e,Game.mods.cookieMonsterFramework.saveData[e].settings[o.replace("Volume","SoundURL")],o.replace("Volume","Sound"),o,!0)},s.textContent="Test sound",u.appendChild(s),u}if("url"===i[o].type){const a=document.createElement("span");a.className="option",a.textContent=`${i[o].label} `,a.style.lineHeight="1.6",u.appendChild(a);const r=document.createElement("input");r.id=`${e}Options${o}`,r.className="option",r.type="text",r.readOnly=!0,r.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o],r.style.width="300px",u.appendChild(r),u.appendChild(document.createTextNode(" "));const s=document.createElement("input");s.id=`${e}Options${o}Prompt`,s.className="option",s.type="text",s.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o];const c=document.createElement("a");c.className="option",c.onclick=function(){t(s.outerHTML,[["Save",function(){Game.mods.cookieMonsterFramework.saveData[e].settings[o]=l(`${e}Options${o}Prompt`).value,n(),Game.ClosePrompt(),Game.UpdateMenu()}],["Cancel",function(){Game.ClosePrompt()}]])},c.textContent="Edit",u.appendChild(c);const d=document.createElement("label");return d.textContent=i[o].desc,d.style.lineHeight="1.6",u.appendChild(d),u}if("colour"===i[o].type){const t=document.createElement("span");t.className="option";const l=document.createElement("input");l.id=o,l.style.width="65px",l.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o],t.appendChild(l),new r(l,{hash:!0,position:"right",onInput:function(){Game.mods.cookieMonsterFramework.saveData[e].settings[this.targetElement.id]=this.toHEXString(),m(),n(),Game.UpdateMenu()}});const c=document.createElement("label");if(c.textContent=i[o].desc,c.style.lineHeight="1.6",t.appendChild(c),o.includes("Flash")){const n=document.createElement("a");n.className="option",n.onclick=function(){a(e,3,o.replace("Colour",""),!0)},n.textContent="Test flash",t.appendChild(n)}return u.appendChild(t),s().init(),u}if("numscale"===i[o].type){const t=document.createElement("span");t.className="option",t.textContent=`${i[o].label} `,t.style.lineHeight="1.6",u.appendChild(t);const a=document.createElement("input");a.id=`${e}Options${o}`,a.className="option",a.type="number",a.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o],a.min=i[o].min,a.max=i[o].max,a.oninput=function(){Game.mods.cookieMonsterFramework.saveData[e].settings[o]=this.value,n(),p(),Game.UpdateMenu()},u.appendChild(a),u.appendChild(document.createTextNode(" "));const r=document.createElement("label");return r.textContent=i[o].desc,r.style.lineHeight="1.6",u.appendChild(r),u}if("keycode"===i[o].type){const a=document.createElement("input");a.id=`${e}Options${o}Prompt`,a.className="option",a.type="text",a.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o].displayName;const r=document.createElement("a");r.className="option",r.id=`${e}Options${o}`,r.onclick=function(){t(a.outerHTML,[]),l(`${e}Options${o}Prompt`).addEventListener("keyup",(t=>{!function(e,t,o){const a={key:o.key,altKey:o.altKey,ctrlKey:o.ctrlKey,shiftKey:o.shiftKey,displayName:`${o.shiftKey?"Shift + ":""}${o.altKey?"Alt + ":""}${o.ctrlKey?"Ctrl + ":""}${o.key}`};Game.mods.cookieMonsterFramework.saveData[e].settings[t]=a,n()}(e,o,t),Game.ClosePrompt(),Game.UpdateMenu()}))},r.textContent=Game.mods.cookieMonsterFramework.saveData[e].settings[o].displayName,u.appendChild(r);const s=document.createElement("label");return s.textContent=i[o].desc,s.style.lineHeight="1.6",u.appendChild(s),u}return u},createOptionsSubHeader:function(e,t,o){const a=document.createElement("div");a.className="title",a.style.opacity="0.7",a.style.fontSize="17px",a.appendChild(document.createTextNode(`${o} `));const n=document.createElement("span");return n.style.cursor="pointer",n.style.display="inline-block",n.style.height="14px",n.style.width="14px",n.style.borderRadius="7px",n.style.textAlign="center",n.style.backgroundColor="#C0C0C0",n.style.color="black",n.style.fontSize="13px",n.style.verticalAlign="middle",n.textContent=Game.mods.cookieMonsterFramework.saveData[e].headers[t]?"-":"+",n.onclick=function(){i(e,t),Game.UpdateMenu()},a.appendChild(n),a}},G=function(e,t,o){const a=document.createElement("div");a.className="subsection",a.id=`${e}MenuSection`;const n=document.createElement("div");n.className="title",n.style.fontSize="18px",n.innerHTML=t;const r=document.createElement("span");return r.style.cursor="pointer",r.style.display="inline-block",r.style.height="14px",r.style.width="14px",r.style.borderRadius="7px",r.style.textAlign="center",r.style.backgroundColor="#C0C0C0",r.style.color="black",r.style.fontSize="13px",r.style.verticalAlign="middle",r.textContent=Game.mods.cookieMonsterFramework.saveData[e].headers[o]?"-":"+",r.onclick=function(){i(e,o),Game.UpdateMenu()},n.appendChild(r),a.appendChild(n),a},v={createFlash:a,createNotification:function(e,t,o,a){1===Game.mods.cookieMonsterFramework.saveData[e].settings[t]&&"hidden"===document.visibilityState&&!1===window.cookieMonsterFrameworkData.isInitializing&&new Notification(o,{body:a,badge:"https://orteil.dashnet.org/cookieclicker/favicon.ico"})},cookieMonsterPrompt:t,playCMSound:c},w={loadMod:h,saveFramework:n},x=class extends e{constructor(e,t,o,a){super(e,t,o),this.desc=a}},T=class extends e{constructor(e,t,o,a,n,i,r){super(e,t,o),this.label=a,this.desc=n,this.min=i,this.max=r}},S=class extends e{constructor(e,t,o,a,n,i){super(e,t,o),this.label=a,this.desc=n,this.toggle=i}},F=class extends e{constructor(e,t,o,a,n,i,r){super(e,t,o),this.label=a,this.desc=n,this.toggle=i,void 0!==r&&(this.func=r)}},E=class extends e{constructor(e,t,o,a,n){super(e,t,o),this.label=a,this.desc=n;for(let e=0;e<101;e++)this.label[e]=`${e}%`}};function B(){Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerButtons&&Game.elderWrath?(l("PopAllNormalWrinklerButton").style.display="",l("PopFattestWrinklerButton").style.display=""):(l("PopAllNormalWrinklerButton").style.display="none",l("PopFattestWrinklerButton").style.display="none")}let P,N,O,D,L,A,W,j,$,U,H,R,I,z,V,_,X,Q,q,Y,K,J,Z,ee,te,oe,ae,ne,ie,re,se,le,ce,de,me,pe,ue=0,he=0,ge=0,fe=0,ke=0,Ce=0,Me=0,ye=0,be=0,Ge=0,ve=0,we=0,xe=0,Te=0,Se=0,Fe=1,Ee=1,Be=1,Pe=0,Ne=0,Oe=0,De=0,Le={},Ae={},We={},je={},$e=0,Ue=0,He=[0,null],Re=0,Ie=0,ze={},Ve={},_e={},Xe={},Qe={},qe=0,Ye=0,Ke=[],Je=0,Ze=0,et=[],tt=0,ot=0,at=[],nt=0,it=0,rt=[],st=0,lt=0,ct={},dt={},mt=0,pt=0,ut=0,ht=[],gt={},ft=0,kt={0:[0,0,0],1:[0,0,0],2:[0,0,0],3:[0,0,0],4:[0,0,0],5:[0,0,0],6:[0,0,0],7:[0,0,0],8:[0,0,0],9:[0,0,0],10:[0,0,0]},Ct=[],Mt=[],yt=[];function bt(e){let t=0;return Game.dragonAuras[ne].name!==e&&Game.dragonAuras[ie].name!==e||(t=1),("Reality Bending"===Game.dragonAuras[ne].name||"Reality Bending"===Game.dragonAuras[ie].name&&Game.dragonLevel>=Game.dragonAurasBN[e].id+4)&&(t+=.1),t}function Gt(){let e=.25;return e*=1+bt("Earth Shatterer"),e}function vt(e,t){return void 0===de[e]?void 0===t?1:t:de[e]}function wt(e){const t=Mt[e];return(!t||1!==Game.ascensionMode||"prestige"!==t.pool&&"fortune"!==t.tier)&&t?t.bought:0}function xt(e){return Game.dragonAuras[ne].name===e||Game.dragonAuras[ie].name===e}function Tt(e){if(Game.hasGod){void 0===Ct.Temple.minigame&&(Ct.Temple.minigame=Game.Objects.Temple.minigame);const t=Ct.Temple.minigame.gods[e];if(re===t.id)return 1;if(se===t.id)return xt("Supreme Intellect")?1:2;if(le===t.id)return xt("Supreme Intellect")?2:3}return!1}function St(e,t){let o=t;if(wt("Season savings")&&(o*=.99),wt("Santa's dominion")&&(o*=.99),wt("Faberge egg")&&(o*=.99),wt("Divine discount")&&(o*=.99),wt("Fortune #100")&&(o*=.99),o*=1-.02*bt("Fierce Hoarder"),Game.hasBuff("Everything must go")&&(o*=.95),Game.hasBuff("Crafty pixies")&&(o*=.98),Game.hasBuff("Nasty goblins")&&(o*=1.02),e.fortune&&wt(e.fortune.name)&&(o*=.93),o*=vt("buildingCost"),Ct.Temple.minigameLoaded){const e=Tt("creation");1===e?o*=.93:2===e?o*=.95:3===e&&(o*=.98)}return o}function Ft(e,t,o,a,n,i){const r=void 0===i?0:i;let s=n,l=o,c=0;-1===n&&(s=l),n||(s=Game.buyBulk);for(let o=0;o<s;o++){let o=t*Game.priceIncrease**Math.max(0,l-a);o=r?Game.modifyBuildingPrice(e,o):St(e,o),o=Math.ceil(o);const n=r?e.getSellMultiplier():Gt();o=Math.floor(o*n),l>0&&(c+=o,l-=1)}return c}const Et=["","","M","G","T","P","E","Z","Y"],Bt=["","","M","B","Tr","Quadr","Quint","Sext","Sept","Oct","Non","Dec","Undec","Duodec","Tredec","Quattuordec","Quindec","Sexdec","Septendec","Octodec","Novemdec","Vigint","Unvigint","Duovigint","Trevigint","Quattuorvigint"],Pt=["","K","M","B","T","Qa","Qi","Sx","Sp","Oc","No","De","UDe","DDe","TDe","QaDe","QiDe","SxDe","SpDe","ODe","NDe","Vi","UVi","DVi","TVi","QaVi","QiVi","SxVi","SpVi","OVi","NVi","Tr","UTr","DTr","TTr","QaTr","QiTr","SxTr","SpTr","OTr","NTr","Qaa","UQa","DQa","TQa","QaQa","QiQa","SxQa","SpQa","OQa","NQa","Qia","UQi","DQi","TQi","QaQi","QiQi","SxQi","SpQi","OQi","NQi","Sxa","USx","DSx","TSx","QaSx","QiSx","SxSx","SpSx","OSx","NSx","Spa","USp","DSp","TSp","QaSp","QiSp","SxSp","SpSp","OSp","NSp","Oco","UOc","DOc","TOc","QaOc","QiOc","SxOc","SpOc","OOc","NOc","Noa","UNo","DNo","TNo","QaNo","QiNo","SxNo","SpNo","ONo","NNo","Ct","UCt"];let Nt,Ot,Dt,Lt,At,Wt,jt,$t,Ut,Ht,Rt,It,zt,Vt,_t,Xt,Qt,qt=[],Yt=[],Kt=[],Jt={},Zt=Date.now(),eo=Date.now();function to(e,t,o){const a=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleDecimals+1;if(e===1/0)return"Infinity";if(void 0===e)return"0";if(0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale)return Jt.Beautify(e,t);if(Number.isFinite(e)){if(e<0)return`-${to(Math.abs(e))}`;let n="";if(0===e)return e.toString();if(e>.001&&e<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleCutoff)return n=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?e.toLocaleString("nl"):e.toLocaleString("en"),n;if(4===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||4===o)n=e.toExponential(a).toString().replace("e","E");else{const t=e.toExponential().toString(),i=Math.floor(t.slice(t.indexOf("e")+1)/3);n=(e/Number("1e"+3*i)).toFixed(a),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||1===o?e>=.01&&e<Number("1e"+3*Et.length)?n+=` ${Et[i]}`:n=to(e,0,4):2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||2===o?e>=.01&&e<Number("1e"+3*Bt.length)?n+=` ${Bt[i]}`:n=to(e,0,4):3===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||3===o?e>=.01&&e<Number("1e"+3*Pt.length)?n+=` ${Pt[i]}`:n=to(e,0,4):(5===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||5===o)&&(n+="E"+3*i)}return""===n&&(console.log(`Could not beautify number with Cookie Monster Beautify: ${e}`),n=Jt.Beautify(e,t)),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator&&(n=n.replace(".",",")),n}return console.log(`Could not beautify number with Cookie Monster Beautify: ${e}`),Jt.Beautify(e,t)}const oo="CMText",ao="CMBack",no="Blue",io="Green",ro="Yellow",so="Orange",lo="Red",co="Purple",mo="Gray",po="Pink",uo="Brown",ho=[no,io,ro,so,lo,co,po,uo,mo],go=[["GoldCookTooltipPlaceholder","Calculated with Golden Switch off","200px"],["GoldCookDragonsFortuneTooltipPlaceholder","Calculated with Golden Switch off and at least one golden cookie on-screen","240px"],["PrestMaxTooltipPlaceholder","The MAX prestige is calculated with the cookies gained from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and buying Chocolate egg","320px"],["NextPrestTooltipPlaceholder","Calculated with cookies gained from wrinklers and Chocolate egg","200px"],["HeavenChipMaxTooltipPlaceholder","The MAX heavenly chips is calculated with the cookies gained from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and buying Chocolate egg","330px"],["ResetTooltipPlaceholder","The bonus income you would get from new prestige levels unlocked at 100% of its potential and from ascension achievements if you have the same buildings/upgrades after reset","370px"],["ChoEggTooltipPlaceholder","The amount of cookies you would get from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and then buying Chocolate egg","300px"],["ChainNextLevelPlaceholder","Cheated cookies might break this formula","250px"],["FavouriteSettingPlaceholder","Click to set this setting as favourite and show it in 'favourite' settings at the top of the Cookie Monster Settings","250px"]],fo={};let ko,Co=0,Mo=-1,yo=[],bo=function(){},Go=1,vo=1,wo=1;const xo=[10,15,30,60,300,600,900,1800],To=[1,5,10,15,30],So={Frenzy:ro,"Dragon Harvest":uo,"Elder frenzy":io,Clot:lo,"Click frenzy":no,Dragonflight:po};let Fo,Eo,Bo,Po,No,Oo,Do,Lo={},Ao="";function Wo(){let e,t=Game.buyBulk;1===Game.buyMode?vo=t:t=vo,1===t?t=Le:10===t?t=Ae:100===t&&(t=We),l("storeBulk1").style.removeProperty("color"),l("storeBulk10").style.removeProperty("color"),l("storeBulk100").style.removeProperty("color"),1===Game.buyMode?1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BuildColour?(Object.keys(t).forEach((e=>{l(`productPrice${Game.Objects[e].id}`).style.color=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[`Colour${t[e].colour}`]})),l(`storeBulk${ut}`).style.color=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ColourGreen):Object.keys(Game.Objects).forEach((e=>{l(`productPrice${Game.Objects[e].id}`).style.removeProperty("color")})):-1===Game.buyMode&&Object.keys(Le).forEach((e=>{const t=Game.Objects[e];l(`productPrice${t.id}`).style.color="",l(`productPrice${t.id}`).innerHTML=to(Ft(t,t.basePrice,t.amount,t.free,Game.buyBulk,1))})),1===Game.buyMode&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings?1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings?(e=Object.keys(Le).map((e=>{const t={};return t.name=e,t.pp=Le[e].pp,t.colour=Le[e].colour,t})),e.sort(((e,t)=>ho.indexOf(e.colour)===ho.indexOf(t.colour)?e.pp-t.pp:ho.indexOf(e.colour)-ho.indexOf(t.colour)))):2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings?(e=Object.keys(t).map((e=>{const o={};return o.name=e,o.pp=t[e].pp,o.colour=t[e].colour,o})),e.sort(((e,t)=>ho.indexOf(e.colour)===ho.indexOf(t.colour)?e.pp-t.pp:ho.indexOf(e.colour)-ho.indexOf(t.colour)))):3===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings&&(e=Object.keys(je).map((e=>{const t={};return t.name=e,t.id=Game.Objects[e].id,t.amountUntilNext=je[e].AmountNeeded,t.priceUntilNext=je[e].price,t})),e.sort(((e,t)=>e.id-t.id)),e.sort(((e,t)=>(101!==e.amountUntilNext?e.priceUntilNext:1/0)-(101!==t.amountUntilNext?t.priceUntilNext:1/0)))):(e=Object.keys(Le).map((e=>{const t={};return t.name=e,t.id=Game.Objects[e].id,t})),e.sort(((e,t)=>e.id-t.id)));for(let t=0;t<e.length;t++)Game.Objects[e[t].name].l.style.gridRow=`${t+2}/${t+2}`}function jo(){Object.values(document.getElementsByClassName("storeSection")).forEach((e=>{Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpgradesNeverCollapse||"products"===e.id?e.style.height="auto":"vaultUpgrades"===e.id?(e.style.height="",e.style.minHeight="0px"):"upgrades"===e.id?(e.style.height="",e.className.includes("hasMenu")?e.style.minHeight="82px":e.style.minHeight="60px"):(e.style.height="",e.style.minHeight="60px")}))}function $o(){if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour>0){let e=0,t=0,o=0,a=0,n=0,i=0,r=0;Object.keys(Game.UpgradesInStore).forEach((s=>{const c=Game.UpgradesInStore[s];let d=!1;for(let e=0;e<l(`upgrade${s}`).childNodes.length;e+=1)if(-1!==l(`upgrade${s}`).childNodes[e].className.indexOf(ao)){l(`upgrade${s}`).childNodes[e].className=ao+ze[c.name].colour,d=!0;break}if(!d){const e=document.createElement("div");e.style.width="10px",e.style.height="10px",e.className=ao+ze[c.name].colour,l(`upgrade${s}`).appendChild(e)}ze[c.name].colour===no?e+=1:ze[c.name].colour===io?t+=1:ze[c.name].colour===ro?o+=1:ze[c.name].colour===so?a+=1:ze[c.name].colour===lo?n+=1:ze[c.name].colour===co?i+=1:ze[c.name].colour===mo&&(r+=1)})),l("CMUpgradeBarBlue").textContent=e,l("CMUpgradeBarGreen").textContent=t,l("CMUpgradeBarYellow").textContent=o,l("CMUpgradeBarOrange").textContent=a,l("CMUpgradeBarRed").textContent=n,l("CMUpgradeBarPurple").textContent=i,l("CMUpgradeBarGray").textContent=r}const e=[];for(let t=0;t<Game.UpgradesInStore.length;t+=1){const o={};o.name=Game.UpgradesInStore[t].name,o.price=Game.UpgradesInStore[t].basePrice,o.pp=ze[o.name].pp,o.colour=ze[o.name].colour,e.push(o)}Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortUpgrades?e.sort(((e,t)=>ho.indexOf(e.colour)===ho.indexOf(t.colour)?e.pp-t.pp:ho.indexOf(e.colour)-ho.indexOf(t.colour))):e.sort(((e,t)=>e.price-t.price));const t=function(e,t){return e.findIndex((e=>e.name===t.name))};for(let o=0;o<Game.UpgradesInStore.length;o+=1)l(`upgrade${o}`).style.order=t(e,Game.UpgradesInStore[o])+1}function Uo(e,t){let o=e;if(e===1/0)return e;if(e<0)return"Negative time period";o=Math.ceil(e);const a=Math.floor(o/31536e3),n=Math.floor(o%31536e3/86400),i=Math.floor(o%31536e3%86400/3600),r=Math.floor(o%31536e3%86400%3600/60),s=Math.floor(o%31536e3%86400%3600%60);let l="";if(0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat){if(o>7776e5)return t?"Over 9000 days!":">9000d";l+=a>0?a+(t?1===a?" year":" years":"y")+", ":"",(l.length>0||n>0)&&(l+=n+(t?1===n?" day":" days":"d")+", "),(l.length>0||i>0)&&(l+=i+(t?1===i?" hour":" hours":"h")+", "),(l.length>0||r>0)&&(l+=r+(t?1===r?" minute":" minutes":"m")+", "),l+=s+(t?1===s?" second":" seconds":"s")}else if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat){if(o>315576e4)return"XX:XX:XX:XX:XX";l+=(a<10?"0":"")+a+":",l+=(n<10?"0":"")+n+":",l+=(i<10?"0":"")+i+":",l+=(r<10?"0":"")+r+":",l+=(s<10?"0":"")+s}else{if(o>7776e5)return t?"Over 9000 days!":">9000d";a>0?(l+=a+(t?1===a?" year":" years":"y")+", ",l+=n+(t?1===n?" day":" days":"d")):n>0?(l+=n+(t?1===n?" day":" days":"d")+", ",l+=i+(t?1===i?" hour":" hours":"h")):i>0?(l+=i+(t?1===i?" hour":" hours":"h")+", ",l+=r+(t?1===r?" minute":" minutes":"m")):r>0?(l+=r+(t?1===r?" minute":" minutes":"m")+", ",l+=s+(t?1===s?" second":" seconds":"s")):l+=s+(t?1===s?" second":" seconds":"s")}return l}function Ho(e){let t,o;return e<=0?(o=1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat?"00:00:00:00:00":"Done!",t=io):(o=Uo(e),t=e>300?lo:e>60?so:ro),{text:o,colour:t}}function Ro(){return Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CPSMode?X:0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?Game.cookiesPs*(1-Game.cpsSucked):1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?Game.cookiesPs*(Re+(1-.05*Ie)):null!==He[1]&&2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink&&1===Game.wrinklers[He[1]].type?Game.cookiesPs*(3*Re/Ie+(1-.05*Ie)):Game.cookiesPs*(Re/Ie+(1-.05*Ie))}function Io(){return 1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?$e:2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?He[0]:0}function zo(e,t,o){const a=document.createElement("div");a.id=e,a.style.height="12px",a.style.margin="0px 10px",a.style.position="relative";const n=document.createElement("div");n.style.width="100%",n.style.height="10px",n.style.margin="auto",n.style.position="absolute",n.style.left="0px",n.style.top="0px",n.style.right="0px",n.style.bottom="0px";const i=document.createElement("span");i.style.display="inline-block",i.style.textAlign="right",i.style.fontSize="10px",i.style.width="108px",i.style.marginRight="5px",i.style.verticalAlign="text-top",i.textContent=t,n.appendChild(i);for(let e=0;e<o.length;e++){const t=document.createElement("span");t.id=o[e].id,t.style.display="inline-block",t.style.height="10px",t.style.verticalAlign="text-top",t.style.textAlign="center",o.length-1===e&&(t.style.borderTopRightRadius="10px",t.style.borderBottomRightRadius="10px"),void 0!==o[e].colour&&(t.className=ao+o[e].colour),n.appendChild(t)}const r=document.createElement("span");return r.id=`${e}Time`,r.style.marginLeft="5px",r.style.verticalAlign="text-top",n.appendChild(r),a.appendChild(n),a}function Vo(e){if(null!==l("CMBotBar")){const t=l("CMBotBar").firstChild.firstChild.childNodes[0],o=l("CMBotBar").firstChild.firstChild.childNodes[1],a=l("CMBotBar").firstChild.firstChild.childNodes[2],n=l("CMBotBar").firstChild.firstChild.childNodes[3],i=e,r=t.appendChild(document.createElement("td"));r.appendChild(document.createTextNode(`${-1!==i.indexOf(" ")?i.substring(0,i.indexOf(" ")):i} (`)),r.appendChild(document.createElement("span")).className="CMTextBlue",r.appendChild(document.createTextNode(")")),t.lastChild.style.paddingLeft="8px",o.appendChild(document.createElement("td")),o.lastChild.style.paddingLeft="8px",a.appendChild(document.createElement("td")),a.lastChild.style.paddingLeft="8px",n.appendChild(document.createElement("td")),n.lastChild.style.paddingLeft="2px"}}function _o(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar&&Le&&1===Game.buyMode){let e=0;Object.keys(Le).forEach((t=>{let o,a=Game.buyBulk;1===Game.buyMode?Go=a:a=Go,1===a&&(a=Le),10===a&&(a=Ae),100===a&&(a=We),e+=1,l("CMBotBar").firstChild.firstChild.childNodes[0].childNodes[e].childNodes[1].textContent=Game.Objects[t].amount,l("CMBotBar").firstChild.firstChild.childNodes[1].childNodes[e].textContent=to(a[t].bonus,2),l("CMBotBar").firstChild.firstChild.childNodes[2].childNodes[e].className=oo+a[t].colour,o=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime?Uo(Math.round(a[t].pp)):to(Math.round(a[t].pp),2),l("CMBotBar").firstChild.firstChild.childNodes[2].childNodes[e].textContent=o;const n=Ho((Game.Objects[t].bulkPrice-(Game.cookies+Io()))/Ro());l("CMBotBar").firstChild.firstChild.childNodes[3].childNodes[e].className=oo+n.colour,"Done!"===n.text&&Game.cookies<Game.Objects[t].bulkPrice?l("CMBotBar").firstChild.firstChild.childNodes[3].childNodes[e].textContent=`${n.text} (with Wrink)`:l("CMBotBar").firstChild.firstChild.childNodes[3].childNodes[e].textContent=n.text}))}}function Xo(){Game.Background.canvas.width=Game.Background.canvas.parentNode.offsetWidth,Game.Background.canvas.height=Game.Background.canvas.parentNode.offsetHeight,Game.LeftBackground.canvas.width=Game.LeftBackground.canvas.parentNode.offsetWidth,Game.LeftBackground.canvas.height=Game.LeftBackground.canvas.parentNode.offsetHeight,Game.DrawBackground()}function Qo(){1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos?(l("CMBotBar").style.bottom=l("CMTimerBar").style.height,l("game").style.bottom=`${Number(l("CMTimerBar").style.height.replace("px",""))+70}px`):1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar?(l("CMBotBar").style.bottom="0px",l("game").style.bottom="70px"):1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos?l("game").style.bottom=l("CMTimerBar").style.height:l("game").style.bottom="0px",1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos?l("sectionLeft").style.top=l("CMTimerBar").style.height:l("sectionLeft").style.top="",Xo()}function qo(){1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar?l("CMTimerBar").style.display="":l("CMTimerBar").style.display="none",Qo()}function Yo(){ue=Game.dragonAura,he=Game.dragonAura2}function Ko(e){const t=Game.Achievements[e],o={};return o.name=t.name,o}function Jo(e){let t=1;if(Object.keys(e.tieredUpgrades).forEach((o=>{if(!Game.Tiers[e.tieredUpgrades[o].tier].special&&wt(e.tieredUpgrades[o].name)){let a=2;1!==Game.ascensionMode&&wt(e.unshackleUpgrade)&&wt(Game.Tiers[e.tieredUpgrades[o].tier].unshackleUpgrade)&&(a+=1===e.id?.5:.1*(20-e.id)),t*=a}})),Object.keys(e.synergies).forEach((o=>{if(wt(e.synergies[o].name)){const a=e.synergies[o];a.buildingTie1.name===e.name?t*=1+.05*a.buildingTie2.amount:a.buildingTie2.name===e.name&&(t*=1+.001*a.buildingTie1.amount)}})),e.fortune&&wt(e.fortune.name)&&(t*=1.07),e.grandma&&wt(e.grandma.name)&&(t*=1+.01*Ct.Grandma.amount*(1/(e.id-1))),"object"==typeof e.tieredUpgrades.misfortune&&1===e.vanilla&&wt(e.tieredUpgrades.misfortune.name))switch(Game.elderWrath){default:t*=1;break;case 1:t*=1.02;break;case 2:t*=1.04;break;case 3:t*=1.06}return t}function Zo(e){const t=Game.Objects[e],o={};return"Cursor"===t.name?o.cps=function(e){let t=0;wt("Thousand fingers")&&(t+=.1),wt("Million fingers")&&(t*=5),wt("Billion fingers")&&(t*=10),wt("Trillion fingers")&&(t*=20),wt("Quadrillion fingers")&&(t*=20),wt("Quintillion fingers")&&(t*=20),wt("Sextillion fingers")&&(t*=20),wt("Septillion fingers")&&(t*=20),wt("Octillion fingers")&&(t*=20),wt("Nonillion fingers")&&(t*=20),wt("Decillion fingers")&&(t*=20),wt("Undecillion fingers")&&(t*=20),wt("Unshackled cursors")&&(t*=25);let o=1,a=0;return Object.keys(Ct).forEach((e=>{"Cursor"!==Ct[e].name&&(a+=Ct[e].amount)})),t*=a,o*=Jo(e),o*=Game.magicCpS("Cursor"),o*=vt("cursorCps"),Game.ComputeCps(.1,wt("Reinforced index finger")+wt("Carpal tunnel prevention cream")+wt("Ambidextrous"),t)*o}:"Grandma"===t.name?o.cps=function(e){let o=1;if(Object.keys(Game.GrandmaSynergies).forEach((e=>{wt(Game.GrandmaSynergies[e])&&(o*=2)})),wt("Bingo center/Research facility")&&(o*=4),wt("Ritual rolling pins")&&(o*=2),wt("Naughty list")&&(o*=2),wt("Elderwort biscuits")&&(o*=1.02),o*=vt("grandmaCps"),wt("Cat ladies"))for(let e=0;e<Game.UpgradesByPool.kitten.length;e++)wt(Game.UpgradesByPool.kitten[e].name)&&(o*=1.29);o*=Jo(e);let a=0;wt("One mind")&&(a+=.02*Ct.Grandma.amount),wt("Communal brainsweep")&&(a+=.02*Ct.Grandma.amount),wt("Elder Pact")&&(a+=.05*Ct.Portal.amount);let n=0;return Object.keys(Ct).forEach((e=>{"Grandma"!==Ct[e].name&&(n+=Ct[e].amount)})),o*=1+.01*bt("Elder Battalion")*n,o*=Game.magicCpS(t.name),(t.baseCps+a)*o}:o.cps=function(e){let t=1;return t*=Jo(e),t*=Game.magicCpS(e.name),e.baseCPS*t},o.baseCps=t.baseCps,o.name=t.name,o.tieredUpgrades=t.tieredUpgrades,o.synergies=t.synergies,o.fortune=t.fortune,o.grandma=t.grandma,o.baseCPS=t.baseCps,o.id=t.id,o.vanilla=t.vanilla,o.unshackleUpgrade=t.unshackleUpgrade,o}function ea(e){const t=Game.Upgrades[e],o={};return o.power=t.power,"function"==typeof o.power&&("Sugar crystal cookies"===t.name?o.power=function(){let e=5;return Object.keys(Ct).forEach((t=>{Ct[t].level>=10&&(e+=1)})),e}:o.power=function(){let e=2;if(wt("Starlove")&&(e=3),Game.hasGod){const t=Tt("seasons");1===t?e*=1.3:2===t?e*=1.2:3===t&&(e*=1.1)}return e}),o.pool=t.pool,o.name=t.name,o}function ta(){Z=Game.UpgradesOwned,ee=Game.pledges,te=Game.AchievementsOwned,oe=Game.heavenlyPower,ae=Game.prestige,Object.keys(Game.Objects).forEach((e=>{const t=Game.Objects[e];let o=Ct[e];void 0===o&&(Ct[e]=Zo(e),o=Ct[e],Vo(e)),o.amount=t.amount,o.level=t.level,o.totalCookies=t.totalCookies,o.basePrice=t.basePrice,o.free=t.free,t.minigameLoaded&&("Temple"===t.name&&(re=t.minigame.slot[0],se=t.minigame.slot[1],le=t.minigame.slot[2]),o.minigameLoaded=t.minigameLoaded,o.minigame=t.minigame),Ct[e]=o})),Object.keys(Game.Upgrades).forEach((e=>{const t=Game.Upgrades[e];let o=Mt[e];void 0===o&&(Mt[e]=ea(e),o=Mt[e]),o.bought=t.bought,Mt[e]=o})),Object.keys(Game.Achievements).forEach((e=>{const t=Game.Achievements[e];let o=yt[e];void 0===o&&(yt[e]=Ko(e),o=yt[e]),o.won=t.won,yt[e]=o})),Yo(),ne=ue,ie=he}function oa(e){const t=document.createElement("div");return t.style.fontWeight="bold",t.id=`${e}Title`,t.className="CMTextBlue",t.textContent=e,t}function aa(e){e.appendChild(oa("Bonus Income"));const t=document.createElement("div");t.style.marginBottom="4px",t.style.color="white",t.id="CMTooltipIncome",e.appendChild(t),e.appendChild(oa("Bonus Cookies per Click")),e.lastChild.style.display="none";const o=document.createElement("div");o.style.marginBottom="4px",o.style.color="white",o.style.display="none",o.id="CMTooltipCookiePerClick",e.appendChild(o),e.appendChild(oa("Payback Period"));const a=document.createElement("div");a.style.marginBottom="4px",a.id="CMTooltipPP",e.appendChild(a),e.appendChild(oa("Time Left"));const n=document.createElement("div");if(n.id="CMTooltipTime",e.appendChild(n),"b"===Bo){e.appendChild(oa("Production left till next achievement")),e.lastChild.id="CMTooltipProductionLeftHeader";const t=document.createElement("div");t.id="CMTooltipProductionLeft",e.appendChild(t)}if("b"===Bo){e.appendChild(oa("Buildings (price / PP) left till next achievement")),e.lastChild.id="CMTooltipNextAchievementHeader";const t=document.createElement("div");t.id="CMTooltipNextAchievement",e.appendChild(t)}}function na(e,t){let o="";return o=e.pp<=0||e.pp===1/0?mo:e.pp<pt?no:e.pp===pt?io:e.pp<ht[10][0]?ro:e.pp<ht[20][0]?so:e.pp<ht[30][0]?lo:co,0!==Number(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPSecondsLowerLimit)&&t/Ro()<Number(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPSecondsLowerLimit)&&(o=no),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPOnlyConsiderBuyable&&t-Game.cookies>0&&(o=lo),o}function ia(){let e=1;return Object.keys(Game.buffs).forEach((t=>{void 0!==Game.buffs[t].multCpS&&(e*=Game.buffs[t].multCpS)})),e}function ra(e){yt[e]&&0===yt[e].won&&(yt[e].won=1,"shadow"!==Game.Achievements[e].pool&&(te+=1))}function sa(){me=0;let e=1;const t={};Object.keys(Game.Objects).forEach((e=>{if(Game.Objects[e].minigameLoaded&&Game.Objects[e].minigame.effs){const o=Game.Objects[e].minigame.effs;Object.keys(o).forEach((e=>{t[e]?t[e]*=o[e]:t[e]=o[e]}))}})),de=t,1!==Game.ascensionMode&&(e+=.01*parseFloat(ae)*oe*function(){let e=0;if(wt("Heavenly chip secret")&&(e+=.05),wt("Heavenly cookie stand")&&(e+=.2),wt("Heavenly bakery")&&(e+=.25),wt("Heavenly confectionery")&&(e+=.25),wt("Heavenly key")&&(e+=.25),e*=1+.05*bt("Dragon God"),wt("Lucky digit")&&(e*=1.01),wt("Lucky number")&&(e*=1.01),wt("Lucky payout")&&(e*=1.01),Game.hasGod){const t=Tt("creation");1===t?e*=.7:2===t?e*=.8:3===t&&(e*=.9)}return e}()),e*=vt("cps"),wt("Heralds")&&1!==Game.ascensionMode&&(e*=1+.01*Game.heralds),Object.keys(Game.cookieUpgrades).forEach((t=>{const o=Game.cookieUpgrades[t];wt(o.name)&&("function"==typeof o.power?e*=1+.01*Mt[o.name].power(Mt[o.name]):e*=1+.01*o.power)})),wt("Specialized chocolate chips")&&(e*=1.01),wt("Designer cocoa beans")&&(e*=1.02),wt("Underworld ovens")&&(e*=1.03),wt("Exotic nuts")&&(e*=1.04),wt("Arcane sugar")&&(e*=1.05),wt("Increased merriness")&&(e*=1.15),wt("Improved jolliness")&&(e*=1.15),wt("A lump of coal")&&(e*=1.01),wt("An itchy sweater")&&(e*=1.01),wt("Santa's dominion")&&(e*=1.2),wt("Fortune #100")&&(e*=1.01),wt("Fortune #101")&&(e*=1.07),wt("Dragon scale")&&(e*=1.03);let o=1;if(Tt){let t=Tt("asceticism");1===t?e*=1.15:2===t?e*=1.1:3===t&&(e*=1.05),t=Tt("ages"),1===t?e*=1+.15*Math.sin(Zt/1e3/10800*Math.PI*2):2===t?e*=1+.15*Math.sin(Zt/1e3/43200*Math.PI*2):3===t&&(e*=1+.15*Math.sin(Zt/1e3/86400*Math.PI*2)),t=Tt("decadence"),1===t?o*=.93:2===t?o*=.95:3===t&&(o*=.98),t=Tt("industry"),1===t?o*=1.1:2===t?o*=1.06:3===t&&(o*=1.03),t=Tt("labor"),1===t?o*=.97:2===t?o*=.98:3===t&&(o*=.99)}wt("Santa's legacy")&&(e*=1+.03*(Game.santaLevel+1));const a=te/25;let n=1;if(wt("Santa's milk and cookies")&&(n*=1.05),n*=1+.05*bt("Breath of Milk"),Tt){const e=Tt("mother");1===e?n*=1.1:2===e?n*=1.05:3===e&&(n*=1.03)}n*=vt("milk");let i=1;wt("Kitten helpers")&&(i*=1+.1*a*n),wt("Kitten workers")&&(i*=1+.125*a*n),wt("Kitten engineers")&&(i*=1+.15*a*n),wt("Kitten overseers")&&(i*=1+.175*a*n),wt("Kitten managers")&&(i*=1+.2*a*n),wt("Kitten accountants")&&(i*=1+.2*a*n),wt("Kitten specialists")&&(i*=1+.2*a*n),wt("Kitten experts")&&(i*=1+.2*a*n),wt("Kitten consultants")&&(i*=1+.2*a*n),wt("Kitten assistants to the regional manager")&&(i*=1+.175*a*n),wt("Kitten marketeers")&&(i*=1+.15*a*n),wt("Kitten analysts")&&(i*=1+.125*a*n),wt("Kitten executives")&&(i*=1+.115*a*n),wt("Kitten admins")&&(i*=1+.11*a*n),wt("Kitten strategists")&&(i*=1+.105*a*n),wt("Kitten angels")&&(i*=1+.1*a*n),wt("Fortune #103")&&(i*=1+.05*a*n),Object.keys(Ct).forEach((e=>{const t=Ct[e];let i=t.cps(t);1!==Game.ascensionMode&&(i*=(1+.01*t.level)*o),"Grandma"===t.name&&wt("Milkhelp® lactose intolerance relief tablets")&&(i*=1+.05*a*n),me+=t.amount*i})),wt('"egg"')&&(me+=9),e*=i;let r=1;if(wt("Chicken egg")&&(r*=1.01),wt("Duck egg")&&(r*=1.01),wt("Turkey egg")&&(r*=1.01),wt("Quail egg")&&(r*=1.01),wt("Robin egg")&&(r*=1.01),wt("Ostrich egg")&&(r*=1.01),wt("Cassowary egg")&&(r*=1.01),wt("Salmon roe")&&(r*=1.01),wt("Frogspawn")&&(r*=1.01),wt("Shark egg")&&(r*=1.01),wt("Turtle egg")&&(r*=1.01),wt("Ant larva")&&(r*=1.01),wt("Century egg")){let e=10*Math.floor((eo-Game.startDate)/1e3/10)/60/60/24;e=Math.min(e,100),Ne=1+.1*(1-(1-e/100)**3),r*=Ne}e*=r,wt("Sugar baking")&&(e*=1+.01*Math.min(100,Game.lumps)),e*=1+bt("Radiant Appetite");const s=me*e;Object.keys(Game.CpsAchievements).forEach((e=>{s>=Game.CpsAchievements[e].threshold&&ra(Game.CpsAchievements[e].name)})),pe=s;const{n:l}=Game.shimmerTypes.golden,c=bt("Dragon's Fortune");for(let t=0;t<l;t++)e*=1+1.23*c;const d=Game.bakeryName.toLowerCase();if("orteil"===d?e*=.99:"ortiel"===d&&(e*=.98),wt("Elder Covenant")&&(e*=.95),wt("Golden switch [off]")){let t=1.5;if(wt("Residual luck")){const e=Game.goldenCookieUpgrades;Object.keys(e).forEach((o=>{wt(e[o])&&(t+=.1)}))}e*=t}if(wt("Shimmering veil [off]")){let t=.5;wt("Reinforced membrane")&&(t+=.1),wt("Delicate touch")&&(t+=.05),wt("Steadfast murmur")&&(t+=.05),wt("Glittering edge")&&(t+=.05),e*=1+t}wt("Magic shenanigans")&&(e*=1e3),wt("Occult obstruction")&&(e*=0),me=Game.runModHookOnValue("cps",me),e*=ia(),me*=e}const la=["Fortune #001","Fortune #002","Fortune #003","Fortune #004","Fortune #005","Fortune #006","Fortune #007","Fortune #008","Fortune #009","Fortune #010","Fortune #011","Fortune #012","Fortune #013","Fortune #014","Fortune #015","Fortune #016","Fortune #017","Fortune #018","Fortune #019","Fortune #020","Fortune #100","Fortune #101","Fortune #102","Fortune #103","Fortune #104"],ca=["Skull cookies","Ghost cookies","Bat cookies","Slime cookies","Pumpkin cookies","Eyeball cookies","Spider cookies"],da=["Christmas tree biscuits","Snowflake biscuits","Snowman biscuits","Holly biscuits","Candy cane biscuits","Bell biscuits","Present biscuits"],ma=["Pure heart biscuits","Ardent heart biscuits","Sour heart biscuits","Weeping heart biscuits","Golden heart biscuits","Eternal heart biscuits","Prism heart biscuits"],pa=["Elderwort biscuits","Bakeberry cookies","Duketater cookies","Green yeast digestives","Wheat slims","Fern tea","Ichor syrup"];function ua(e){return yt[e]?yt[e].won:0}function ha(){let e=0;Object.keys(Game.GrandmaSynergies).forEach((t=>{wt(Game.GrandmaSynergies[t])&&(e+=1)})),!ua("Elder")&&e>=7&&ra("Elder"),!ua("Veteran")&&e>=14&&ra("Veteran");let t=0,o=1,a=1,n=1e5;Object.keys(Ct).forEach((e=>{t+=Ct[e].amount,n=Math.min(Ct[e].amount,n),ua("Mathematician")||Ct[e].amount<Math.min(128,2**(Game.ObjectsById.length-Game.Objects[e].id-1))&&(o=0),ua("Base 10")||Ct[e].amount<10*(Game.ObjectsById.length-Game.Objects[e].id)&&(a=0)})),n>=1&&ra("One with everything"),1===o&&ra("Mathematician"),1===a&&ra("Base 10"),n>=100&&ra("Centennial"),n>=150&&ra("Centennial and a half"),n>=200&&ra("Bicentennial"),n>=250&&ra("Bicentennial and a half"),n>=300&&ra("Tricentennial"),n>=350&&ra("Tricentennial and a half"),n>=400&&ra("Quadricentennial"),n>=450&&ra("Quadricentennial and a half"),n>=500&&ra("Quincentennial"),n>=550&&ra("Quincentennial and a half"),n>=600&&ra("Sexcentennial"),n>=650&&ra("Sexcentennial and a half"),n>=700&&ra("Septcentennial"),t>=100&&ra("Builder"),t>=500&&ra("Architect"),t>=1e3&&ra("Engineer"),t>=2500&&ra("Lord of Constructs"),t>=5e3&&ra("Grand design"),t>=7500&&ra("Ecumenopolis"),t>=1e4&&ra("Myriad"),Z>=20&&ra("Enhancer"),Z>=50&&ra("Augmenter"),Z>=100&&ra("Upgrader"),Z>=200&&ra("Lord of Progress"),Z>=300&&ra("The full picture"),Z>=400&&ra("When there's nothing left to add"),Z>=500&&ra("Kaizen"),Z>=600&&ra("Beyond quality"),Z>=700&&ra("Oft we mar what's well"),t>=4e3&&Z>=300&&ra("Polymath"),t>=8e3&&Z>=400&&ra("Renaissance baker"),Ct.Cursor.amount+Ct.Grandma.amount>=777&&ra("The elder scrolls");let i=!0;Object.keys(ca).forEach((e=>{wt(ca[e])||(i=!1)})),i&&ra("Spooky cookies");let r=!0;if(Object.keys(da).forEach((e=>{wt(da[e])||(r=!1)})),r&&ra("Let it snow"),wt("Fortune cookies")){const e=Game.Tiers.fortune.upgrades;let t=0;Object.keys(e).forEach((o=>{wt(e[o].name)&&(t+=1)})),t>=e.length&&ra("O Fortuna")}}function ga(e,t){ta(),Ct[e].amount+=t;const o=Ct[e];"Cursor"===e?(o.amount>=1&&ra("Click"),o.amount>=2&&ra("Double-click"),o.amount>=50&&ra("Mouse wheel"),o.amount>=100&&ra("Of Mice and Men"),o.amount>=200&&ra("The Digital"),o.amount>=300&&ra("Extreme polydactyly"),o.amount>=400&&ra("Dr. T"),o.amount>=500&&ra("Thumbs, phalanges, metacarpals"),o.amount>=600&&ra("With her finger and her thumb"),o.amount>=700&&ra("Gotta hand it to you"),o.amount>=800&&ra("The devil's workshop"),o.amount>=900&&ra("All on deck"),o.amount>=1e3&&ra("A round of applause")):Object.keys(Game.Objects[o.name].tieredAchievs).forEach((e=>{o.amount>=Game.Tiers[Game.Objects[o.name].tieredAchievs[e].tier].achievUnlock&&ra(Game.Objects[o.name].tieredAchievs[e].name)}));const a=te;return sa(),ha(),a!==te&&sa(),me-Game.cookiesPs}function fa(e,t,o){let a=e,n=0;for(;a<o;)a+=.002*Math.max(.002,(a/Math.max(t,100))**.5),n+=1;return n/Game.fps}function ka(){null!==l("CMDispTooltipWarningParent")&&(0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos?(l("CMDispTooltipWarningParent").style.top="auto",l("CMDispTooltipWarningParent").style.margin="4px -4px",l("CMDispTooltipWarningParent").style.padding="3px 4px"):(l("CMDispTooltipWarningParent").style.right="auto",l("CMDispTooltipWarningParent").style.margin="4px",l("CMDispTooltipWarningParent").style.padding="4px 3px"))}function Ca(){if(ta(),"none"!==l("tooltipAnchor").style.display&&l("CMTooltipArea")){l("CMTooltipArea").innerHTML="";const e=function(){l("tooltip").firstChild.style.paddingBottom="4px";const e=document.createElement("div");return e.style.border="1px solid",e.style.padding="4px",e.style.margin="0px -4px",e.id="CMTooltipBorder",e.className="CMTextGray",e}();l("CMTooltipArea").appendChild(e),"b"===Bo?function(){let e;if(1===Game.buyMode?wo=e:e=wo,1===Game.buyBulk?e=Le:10===Game.buyBulk?e=Ae:100===Game.buyBulk&&(e=We),Fo=Game.Objects[Po].bulkPrice,Eo=e[Po].bonus,1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade&&1===Game.buyMode){if(aa(l("CMTooltipBorder")),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade&&1===Game.buyMode){l("CMTooltipIncome").textContent=to(Eo,2);const t=Math.round(Eo/Game.cookiesPs*1e4);Number.isFinite(t)&&0!==t?l("CMTooltipIncome").textContent+=` (${t/100}% of income)`:l("CMTooltipIncome").textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`,l("CMTooltipBorder").className=oo+e[Po].colour,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime?l("CMTooltipPP").textContent=Uo(e[Po].pp):l("CMTooltipPP").textContent=to(e[Po].pp,2),l("CMTooltipPP").className=oo+e[Po].colour;const o=Ho((Fo-(Game.cookies+Io()))/Ro());l("CMTooltipTime").textContent=o.text,"Done!"===o.text&&Game.cookies<e[Po].price?l("CMTooltipTime").textContent=`${o.text} (with Wrink)`:l("CMTooltipTime").textContent=o.text,l("CMTooltipTime").className=oo+o.colour}l("CMTooltipProductionLeftHeader").style.display="none",l("CMTooltipTime").style.marginBottom="0px";for(const e of Object.keys(Game.Objects[Po].productionAchievs))if(!Game.HasAchiev(Game.Objects[Po].productionAchievs[e].achiev.name)){const t=Game.Objects[Po].productionAchievs[e];l("CMTooltipTime").style.marginBottom="4px",l("CMTooltipProductionLeftHeader").style.display="",l("CMTooltipProductionLeft").className=`ProdAchievement${Po}`,l("CMTooltipProductionLeft").textContent=to(t.pow-Ct[Po].totalCookies,15),l("CMTooltipProductionLeft").style.color="white";break}const t=je[Po];if(t.AmountNeeded<101){let e;l("CMTooltipProductionLeft").style.marginBottom="4px",l("CMTooltipNextAchievementHeader").style.display="",e=Game.cookiesPs?Math.max(t.price-(Game.cookies+Io()),0)/Game.cookiesPs+t.price/ga(Po,t.AmountNeeded):t.price/ga(Po,t.AmountNeeded),l("CMTooltipNextAchievement").textContent=`${to(t.AmountNeeded)} / ${to(t.price)} / `,l("CMTooltipNextAchievement").style.color="white";const o=document.createElement("span");Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime?o.textContent=Uo(e):o.textContent=to(e),o.className=oo+na({pp:e},t.price),l("CMTooltipNextAchievement").appendChild(o)}else l("CMTooltipNextAchievementHeader").style.display="none",l("CMTooltipProductionLeft").style.marginBottom="0px"}else l("CMTooltipArea").style.display="none"}():"u"===Bo?function(){if(aa(l("CMTooltipBorder")),Eo=ze[Game.UpgradesInStore[Po].name].bonus,Fo=Game.Upgrades[Game.UpgradesInStore[Po].name].getPrice(),No=ze[Game.UpgradesInStore[Po].name].bonusMouse,1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade){l("CMTooltipIncome").textContent=to(Eo,2);const e=Math.round(Eo/Game.cookiesPs*1e4);"0"===l("CMTooltipIncome").textContent?(l("Bonus IncomeTitle").style.display="none",l("CMTooltipIncome").style.display="none",l("Payback PeriodTitle").style.display="none",l("CMTooltipPP").style.display="none"):(Number.isFinite(e)&&0!==e?l("CMTooltipIncome").textContent+=` (${e/100}% of income)`:l("CMTooltipIncome").textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`,l("CMTooltipBorder").className=oo+ze[Game.UpgradesInStore[Po].name].colour),No&&(l("CMTooltipCookiePerClick").textContent=to(No),l("CMTooltipCookiePerClick").style.display="block",l("CMTooltipCookiePerClick").previousSibling.style.display="block"),!Eo&&No?(l("CMTooltipPP").textContent=`${to(Fo/No)} Clicks`,l("CMTooltipPP").style.color="white",l("Payback PeriodTitle").style.display="block",l("CMTooltipPP").style.display="block"):(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime?l("CMTooltipPP").textContent=Uo(ze[Game.UpgradesInStore[Po].name].pp):l("CMTooltipPP").textContent=to(ze[Game.UpgradesInStore[Po].name].pp,2),l("CMTooltipPP").className=oo+ze[Game.UpgradesInStore[Po].name].colour);const t=Ho((Fo-(Game.cookies+Io()))/Ro());if(l("CMTooltipTime").textContent=t.text,"Done!"===t.text&&Game.cookies<Game.UpgradesInStore[Po].getPrice()?l("CMTooltipTime").textContent=`${t.text} (with Wrink)`:l("CMTooltipTime").textContent=t.text,l("CMTooltipTime").className=oo+t.colour,"Chocolate egg"===Game.UpgradesInStore[Po].name){l("CMTooltipBorder").lastChild.style.marginBottom="4px",l("CMTooltipBorder").appendChild(oa("Cookies to be gained (Currently/Max)"));const e=document.createElement("div");e.style.color="white",e.textContent=`${to(.05*Game.cookies)} / ${to(De)}`,l("CMTooltipBorder").appendChild(e)}}else l("CMTooltipArea").style.display="none"}():"s"===Bo?function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipLump){const t=l("CMTooltipBorder");t.appendChild(oa("Current Sugar Lump"));const o=document.createElement("div");o.id="CMTooltipTime",t.appendChild(o);const a=0===(e=Game.lumpCurrentType)?{text:"Normal",colour:mo}:1===e?{text:"Bifurcated",colour:io}:2===e?{text:"Golden",colour:ro}:3===e?{text:"Meaty",colour:so}:4===e?{text:"Caramelized",colour:co}:{text:"Unknown Sugar Lump",colour:lo};o.textContent=a.text,o.className=oo+a.colour}else l("CMTooltipArea").style.display="none";var e}():"g"===Bo?function(){const{minigame:e}=Game.Objects["Wizard tower"],t=e.getSpellCost(e.spellsById[Po]);if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipGrim&&t<=e.magicM){const o=l("CMTooltipBorder");o.appendChild(oa("Time Left"));const a=document.createElement("div");a.id="CMTooltipTime",o.appendChild(a);const n=Ho(fa(e.magic,e.magicM,t));if(a.textContent=n.text,a.className=oo+n.colour,t<=e.magic){o.appendChild(oa("Recover Time"));const a=document.createElement("div");a.id="CMTooltipRecover",o.appendChild(a);const n=Ho(fa(Math.max(0,e.magic-t),e.magicM,e.magic));a.textContent=n.text,a.className=oo+n.colour}if("0"===Po){o.appendChild(oa("Cookies to be gained/lost"));const e=document.createElement("div");e.id="x",o.appendChild(e);const t=document.createElement("span");t.style.color="#33FF00",t.textContent=to(Math.max(Math.min(.15*Game.cookies,60*Game.cookiesPs*30),7),2),e.appendChild(t);const a=document.createElement("span");a.textContent=" / ",e.appendChild(a);const n=document.createElement("span");n.style.color="red",n.textContent=to(Math.min(Game.cookies,Math.min(.15*Game.cookies,60*Game.cookiesPs*15)+13),2),e.appendChild(n)}l("CMTooltipArea").appendChild(o)}else l("CMTooltipArea").style.display="none"}():"p"===Bo?function(){const{minigame:e}=Game.Objects.Farm;if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipPlots&&0!==e.plot[Po[1]][Po[0]][0]){const t=e.plot[Po[1]][Po[0]][1]>e.plantsById[e.plot[Po[1]][Po[0]][0]-1].mature,o=e.plantsById[e.plot[Po[1]][Po[0]][0]-1].name;l("CMTooltipBorder").appendChild(oa("Reward (Current / Maximum)"));const a=document.createElement("div");a.id="CMTooltipPlantReward",l("CMTooltipBorder").appendChild(a),"Chocoroot"===o||"White chocoroot"===o?l("CMTooltipPlantReward").textContent=`${t?to(Math.min(.03*Game.cookies,60*Game.cookiesPs*3)):"0"} / ${to(60*Game.cookiesPs*3)}`:"Bakeberry"===o?l("CMTooltipPlantReward").textContent=`${t?to(Math.min(.03*Game.cookies,60*Game.cookiesPs*30)):"0"} / ${to(60*Game.cookiesPs*30)}`:"Queenbeet"===o?l("CMTooltipPlantReward").textContent=`${t?to(Math.min(.04*Game.cookies,60*Game.cookiesPs*60)):"0"} / ${to(60*Game.cookiesPs*60)}`:"Duketater"===o?l("CMTooltipPlantReward").textContent=`${t?to(Math.min(.08*Game.cookies,60*Game.cookiesPs*120)):"0"} / ${to(60*Game.cookiesPs*120)}`:l("CMTooltipArea").style.display="none"}else l("CMTooltipArea").style.display="none"}():"ha"===Bo?function(){const{minigame:e}=Game.Objects.Farm;if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipLump){l("CMTooltipBorder").appendChild(oa("Cookies gained from harvesting:"));let t=0,o=0;Game.keys[16]&&Game.keys[17]&&(o=1);for(let a=0;a<6;a++)for(let n=0;n<6;n++)if(e.plot[a][n][0]>=1){const i=e.plot[a][n],r=e.plantsById[i[0]-1],s=r.name;let l=!0;o&&r.immortal&&(l=!1),i[1]<r.matureBase&&(l=!1),l&&"Bakeberry"===s?t+=Math.min(.03*Game.cookies,60*Game.cookiesPs*30):l&&"Chocoroot"===s||"White chocoroot"===s?t+=Math.min(.03*Game.cookies,60*Game.cookiesPs*3):l&&"Queenbeet"===s?t+=Math.min(.04*Game.cookies,60*Game.cookiesPs*60):l&&"Duketater"===s&&(t+=Math.min(.08*Game.cookies,60*Game.cookiesPs*120))}l("CMTooltipBorder").appendChild(document.createTextNode(to(t)))}else l("CMTooltipArea").style.display="none"}():"wb"===Bo?function(){l("tooltip").innerHTML="",l("tooltip").appendChild(oa("Reward:"));const e=document.createElement("div");e.id="CMWrinklerReward","PopAllNormal"===Po?e.textContent=to(Ue):"PopFattest"===Po&&(e.textContent=to(He[0])),l("tooltip").appendChild(e)}():("pag"===Bo||"pas"===Bo&&-1!==Po[1])&&function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipPantheon){const e=l("CMTooltipBorder");let t;t="pas"===Bo?Po[1]:Po,e.appendChild(oa("Effect in position 1:"));const o=document.createElement("div");if(o.id="CMPantheonTooltipPosition1",0!==kt[t][0]){o.textContent=to(kt[t][0]);const e=Math.round(kt[t][0]/Game.cookiesPs*1e4);Number.isFinite(e)&&0!==e?o.textContent+=` (${e/100}% of income)`:o.textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`}else o.textContent="No effect to CPS";e.appendChild(o),e.appendChild(oa("Effect in position 2:"));const a=document.createElement("div");if(a.id="CMPantheonTooltipPosition2",0!==kt[t][1]){a.textContent=to(kt[t][1]);const e=Math.round(kt[t][1]/Game.cookiesPs*1e4);Number.isFinite(e)&&0!==e?a.textContent+=` (${e/100}% of income)`:a.textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`}else a.textContent="No effect to CPS";e.appendChild(a),e.appendChild(oa("Effect in position 3:"));const n=document.createElement("div");if(n.id="CMPantheonTooltipPosition2",0!==kt[t][2]){n.textContent=to(kt[t][2]);const e=Math.round(kt[t][2]/Game.cookiesPs*1e4);Number.isFinite(e)&&0!==e?n.textContent+=` (${e/100}% of income)`:n.textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`}else n.textContent="No effect to CPS";e.appendChild(n),l("CMTooltipArea").appendChild(e)}else l("CMTooltipArea").style.display="none"}(),function(){if("b"===Bo||"u"===Bo){null===document.getElementById("CMDispTooltipWarningParent")&&(l("tooltipAnchor").appendChild(function(){const e=document.createElement("div");e.style.position="absolute",e.style.display="block",e.style.left="auto",e.style.bottom="auto",e.id="CMDispTooltipWarningParent";const t=function(e,t,o,a,n){const i=document.createElement("div");i.id=e,i.style.display="none",i.style.transition="opacity 0.1s ease-out",i.className="CMBorder"+t,i.style.padding="2px",i.style.background="#000 url(img/darkNoise.png)";const r=document.createElement("div");i.appendChild(r);const s=document.createElement("span");s.className=oo+t,s.style.fontWeight="bold",s.textContent=o,r.appendChild(s),r.appendChild(document.createTextNode(a));const l=document.createElement("div");i.appendChild(l);const c=document.createElement("span");return c.id=n,l.appendChild(document.createTextNode("Deficit: ")),l.appendChild(c),i};return e.appendChild(t("CMDispTooltipWarnLucky",lo,"Warning: ",'Purchase of this item will put you under the number of Cookies required for "Lucky!"',"CMDispTooltipWarnLuckyText")),e.firstChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnLuckyFrenzy",ro,"Warning: ",'Purchase of this item will put you under the number of Cookies required for "Lucky!" (Frenzy)',"CMDispTooltipWarnLuckyFrenzyText")),e.lastChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnConjure",co,"Warning: ",'Purchase of this item will put you under the number of Cookies required for "Conjure Baked Goods"',"CMDispTooltipWarnConjureText")),e.lastChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnConjureFrenzy",co,"Warning: ",'Purchase of this item will put you under the number of Cookies required for "Conjure Baked Goods" (Frenzy)',"CMDispTooltipWarnConjureFrenzyText")),e.lastChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnEdifice",co,"Warning: ",'Purchase of this item will put you under the number of Cookies needed for "Spontaneous Edifice" to possibly give you your most expensive building"',"CMDispTooltipWarnEdificeText")),e.lastChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnUser",lo,"Warning: ",`Purchase of this item will put you under the number of Cookies equal to ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser} seconds of CPS`,"CMDispTooltipWarnUserText")),e}()),ka()),0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos?l("CMDispTooltipWarningParent").style.right="0px":l("CMDispTooltipWarningParent").style.top=`${l("tooltip").offsetHeight}px`,l("CMDispTooltipWarningParent").style.width=l("tooltip").offsetWidth-6+"px";const e=Game.cookies+Io()-Fo,t=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnBon?Eo:0;let o=ke;if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnBon){let e=Eo;e/=ia(),o+=60*e*15/.15}if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLucky&&e<o&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnLucky").style.display="",l("CMDispTooltipWarnLuckyText").textContent=`${to(o-e)} (${Uo((o-e)/(Ro()+t))})`):l("CMDispTooltipWarnLucky").style.display="none",1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLuckyFrenzy){const a=7*o;e<a&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnLuckyFrenzy").style.display="",l("CMDispTooltipWarnLuckyFrenzyText").textContent=`${to(a-e)} (${Uo((a-e)/(Ro()+t))})`):l("CMDispTooltipWarnLuckyFrenzy").style.display="none"}else l("CMDispTooltipWarnLuckyFrenzy").style.display="none";if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnConjure){const a=2*o;e<a&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnConjure").style.display="",l("CMDispTooltipWarnConjureText").textContent=`${to(a-e)} (${Uo((a-e)/(Ro()+t))})`):l("CMDispTooltipWarnConjure").style.display="none"}else l("CMDispTooltipWarnConjure").style.display="none";if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnConjureFrenzy){const a=2*o*7;e<a&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnConjureFrenzy").style.display="",l("CMDispTooltipWarnConjureFrenzyText").textContent=`${to(a-e)} (${Uo((a-e)/(Ro()+t))})`):l("CMDispTooltipWarnConjureFrenzy").style.display="none"}else l("CMDispTooltipWarnConjureFrenzy").style.display="none";1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnEdifice&&Game.Objects["Wizard tower"].minigameLoaded&&xe&&e<xe&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnEdifice").style.display="",l("CMDispTooltipWarnEdificeText").textContent=`${to(xe-e)} (${Uo((xe-e)/(Ro()+t))})`):l("CMDispTooltipWarnEdifice").style.display="none",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser>0&&e<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser*Ro()&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnUser").style.display="",l("CMDispTooltipWarnUser").children[0].textContent=`Purchase of this item will put you under the number of Cookies equal to ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser} seconds of CPS`,l("CMDispTooltipWarnUserText").textContent=`${to(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser*Ro()-e)} (${Uo((Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser*Ro()-e)/(Ro()+t))})`):l("CMDispTooltipWarnUser").style.display="none"}else null!==l("CMDispTooltipWarningParent")&&l("CMDispTooltipWarningParent").remove()}()}else null===l("CMTooltipArea")&&null!==l("CMDispTooltipWarningParent")&&l("CMDispTooltipWarningParent").remove()}function Ma(){if(Game.prefs.autosave&&Game.drawT%10==0&&"stats"===Game.onMenu&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Stats){const e=document.getElementById("CMStatsAutosaveTimer");e&&(e.innerText=Game.sayTime(60*Game.fps-Game.T%(60*Game.fps),4))}Wo(),$o(),jo(),function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar){const e=l("CMTimerBar").offsetWidth-163,t=l("CMTimerBar").offsetWidth-133;let o=0;if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AutosaveTimerBar&&Game.prefs.autosave){const e=(60*Game.fps-(Game.OnAscend?0:Game.T%(60*Game.fps)))/Game.fps;l("CMTimerBarAutosave").style.display="",l("CMTimerBarAutosaveBar").style.width=`${Math.round(e*(t-8*Math.ceil(e).toString().length)/60)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarAutosaveBar").textContent=Math.ceil(e):l("CMTimerBarAutosaveBar").textContent="",l("CMTimerBarAutosaveTime").textContent=Math.ceil(e),o+=1}else l("CMTimerBarAutosave").style.display="none";if(0!==Game.shimmerTypes.golden.spawned||Game.Has("Golden switch [off]"))l("CMTimerBarGC").style.display="none";else{l("CMTimerBarGC").style.display="",l("CMTimerBarGCMinBar").style.width=`${Math.round(Math.max(0,Game.shimmerTypes.golden.minTime-Game.shimmerTypes.golden.time)*e/Game.shimmerTypes.golden.maxTime)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarGCMinBar").textContent=Math.ceil((Game.shimmerTypes.golden.minTime-Game.shimmerTypes.golden.time)/Game.fps):l("CMTimerBarGCMinBar").textContent="",Game.shimmerTypes.golden.minTime===Game.shimmerTypes.golden.maxTime?(l("CMTimerBarGCMinBar").style.borderTopRightRadius="10px",l("CMTimerBarGCMinBar").style.borderBottomRightRadius="10px"):(l("CMTimerBarGCMinBar").style.borderTopRightRadius="",l("CMTimerBarGCMinBar").style.borderBottomRightRadius=""),l("CMTimerBarGCBar").style.width=`${Math.round(Math.min(Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.minTime,Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.time)*e/Game.shimmerTypes.golden.maxTime)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarGCBar").textContent=Math.ceil(Math.min(Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.minTime,Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.time)/Game.fps):l("CMTimerBarGCBar").textContent="";const t=Math.max(0,(Game.shimmerTypes.golden.time-Game.shimmerTypes.golden.minTime)/(Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.minTime))**5;l("CMTimerBarGCTime").textContent=`${Math.ceil((Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.time)/Game.fps)} ${t<.01?"<":""}${t.toLocaleString("en",{style:"percent"})}`,o+=1}if("christmas"===Game.season&&0===Game.shimmerTypes.reindeer.spawned){l("CMTimerBarRen").style.display="",l("CMTimerBarRenMinBar").style.width=`${Math.round(Math.max(0,Game.shimmerTypes.reindeer.minTime-Game.shimmerTypes.reindeer.time)*e/Game.shimmerTypes.reindeer.maxTime)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarRenMinBar").textContent=Math.ceil((Game.shimmerTypes.reindeer.minTime-Game.shimmerTypes.reindeer.time)/Game.fps):l("CMTimerBarRenMinBar").textContent="",l("CMTimerBarRenBar").style.width=`${Math.round(Math.min(Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.minTime,Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.time)*e/Game.shimmerTypes.reindeer.maxTime)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarRenBar").textContent=Math.ceil(Math.min(Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.minTime,Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.time)/Game.fps):l("CMTimerBarRenBar").textContent="";const t=Math.max(0,(Game.shimmerTypes.reindeer.time-Game.shimmerTypes.reindeer.minTime)/(Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.minTime))**5;l("CMTimerBarRenTime").textContent=`${Math.ceil((Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.time)/Game.fps)} ${t<.01?"<":""}${t.toLocaleString("en",{style:"percent"})}`,o+=1}else l("CMTimerBarRen").style.display="none";const a={};l("CMTimerBarBuffTimers").innerHTML="",Object.keys(Game.buffs).forEach((e=>{if(Game.buffs[e]){const n=zo(Game.buffs[e].name,Game.buffs[e].name,[{id:`${Game.buffs[e].name}Bar`}]);n.style.display="";let i="";i=void 0!==So[Game.buffs[e].name]?So[Game.buffs[e].name]:co,n.lastChild.children[1].className=ao+i,n.lastChild.children[1].style.color="black",2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay?n.lastChild.children[1].textContent=`${Math.round(Game.buffs[e].time/Game.buffs[e].maxTime*100)}%`:n.lastChild.children[1].textContent="",n.lastChild.children[1].style.width=`${Math.round(Game.buffs[e].time*(t-8*Math.ceil(Game.buffs[e].time/Game.fps).toString().length)/Game.buffs[e].maxTime)}px`,n.lastChild.children[2].textContent=Math.ceil(Game.buffs[e].time/Game.fps),o+=1,a[Game.buffs[e].name]=n}})),Object.keys(a).forEach((e=>{l("CMTimerBarBuffTimers").appendChild(a[e])})),0!==o&&(l("CMTimerBar").style.height=12*o+2+"px"),Do!==o&&(Do=o,Qo())}}(),_o(),Ca(),function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipWrink&&1===Co){let e=!1;Object.keys(Game.wrinklers).forEach((t=>{const o=Game.wrinklers[t];if(o.phase>0&&o.selected){if(e=!0,0===yo[t]||void 0===yo[t]){const e=document.createElement("div"),o=document.createElement("div");o.style.minWidth="120px",o.style.marginBottom="4px";const a=document.createElement("div");a.style.textAlign="center",a.id="CMTooltipWrinkler",o.appendChild(a),e.appendChild(o),Game.tooltip.draw(this,escape(e.innerHTML)),Mo=t,yo[t]=1}}else yo[t]=0})),e||Game.tooltip.hide()}}(),function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipWrink&&null!==l("CMTooltipWrinkler")){let{sucked:e}=Game.wrinklers[Mo],t=1.1;if(Game.Has("Sacrilegious corruption")&&(t*=1.05),1===Game.wrinklers[Mo].type&&(t*=3),e*=t,Game.Has("Wrinklerspawn")&&(e*=1.05),Ct.Temple.minigameLoaded){const t=Game.hasGod("scorn");1===t?e*=1.15:2===t?e*=1.1:3===t&&(e*=1.05)}l("CMTooltipWrinkler").textContent=to(e)}}(),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpStats&&"stats"===Game.onMenu&&(Game.drawT-1)%(5*Game.fps)!=0&&(Game.drawT-1)%Game.fps==0&&Game.UpdateMenu(),B()}function ya(){P.addLatest(Game.computedMouseCps)}class ba{constructor(e){this.maxLength=e,this.queue=[]}addLatest(e){this.queue.push(e)>this.maxLength&&this.queue.shift()}calcAverage(e){let t=e;t>this.maxLength&&(t=this.maxLength),t>this.queue.length&&(t=this.queue.length);let o=0;for(let e=this.queue.length-1;e>=0&&e>this.queue.length-1-t;e--)o+=this.queue[e];return 0===o?0:o/t}calcSum(e){let t=e;return t>this.maxLength&&(t=this.maxLength),t>this.queue.length&&(t=this.queue.length),0===t?0:this.queue.slice(-t).reduce(((e,t)=>e+t),0)}}function Ga(e){"Cache"in window.CookieMonsterData||(window.CookieMonsterData.Cache={}),Object.keys(e).forEach((t=>{const o=t.replace(/^Cache/,"");void 0===e[t]?window.CookieMonsterData.Cache[o]=void 0:window.CookieMonsterData.Cache[o]=JSON.parse(JSON.stringify(e[t]))}))}function va(){const e=Math.floor(Date.now()/1e3);if(Game.T/Game.fps%1==0){let t=Game.cookies+ft;Game.cpsSucked>0&&(t+=$e),st=Math.max(Game.cookiesEarned,t),t*=.05;const o=e-j,a=Math.max(0,Game.cookies-$)/o,n=Math.max(0,$e-U)/o,i=Math.max(0,He[0]-H)/o,r=Math.max(0,t-De)/o,s=(Game.cookieClicks-R)/o;for(let e=0;e<o;e++)N.addLatest(a),O.addLatest(n),D.addLatest(i),L.addLatest(r),A.addLatest(s);j=e,$=Game.cookies,U=$e,H=He[0],De=t,R=Game.cookieClicks;const l=xo[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist];I=N.calcAverage(l),z=O.calcAverage(l),V=D.calcAverage(l),_=L.calcAverage(l),X=I,1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink&&(X+=z),2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink&&(X+=V);const c=Game.HasUnlocked("Chocolate egg")&&!Game.Has("Chocolate egg");lt=c||0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?I+z+(c?_:0):X,Ve=A.calcAverage(To[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist])}Ga({CacheRealCookiesEarned:st,CacheLastCPSCheck:j,CacheLastCookies:$,CacheLastWrinkCookies:U,CacheLastWrinkFattestCookies:H,CacheLastChoEgg:De,CacheLastClicks:R,CacheAverageGainBank:I,CacheAverageGainWrink:z,CacheAverageGainWrinkFattest:V,CacheAverageGainChoEgg:_,CacheAverageCPS:X,CacheAvgCPSWithChoEgg:lt,CacheAverageClicks:Ve})}function wa(e,t,o,a,n){let i=0;for(let e=Math.max(0,o);e<Math.max(0,o+n);e++)i+=Game.priceIncrease**Math.max(0,e-a);let r=t*i;return r=Game.modifyBuildingPrice(Game.Objects[e],r),Math.ceil(r)}function xa(e,t){Object.keys(e).forEach((o=>{if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPRigidelMode&&1===t)e[o].colour=mo;else{e[o].colour=na(e[o],wa(o,Game.Objects[o].basePrice,Game.Objects[o].amount,Game.Objects[o].free,t));for(let t=0;t<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop;t++)e[o].pp===ht[t][0]&&(e[o].colour=mo)}}))}function Ta(e,t){Object.keys(e).forEach((o=>{const a=wa(o,Game.Objects[o].basePrice,Game.Objects[o].amount,Game.Objects[o].free,t);Game.cookiesPs?e[o].pp=Math.max(a-(Game.cookies+Io()),0)/Game.cookiesPs+a/e[o].bonus:e[o].pp=a/e[o].bonus,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPRigidelMode&&1===t||ht.push([e[o].pp,t,a])}))}function Sa(){!function(){pt=1/0,ht=[],void 0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop&&(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop=0),Ta(Le,1),Ta(Ae,10),Ta(We,100),ht.sort(((e,t)=>e[0]-t[0]));let e=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop;if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPOnlyConsiderBuyable)for(;ht[e][2]>Game.cookies&&(e+=1,ht.length!==e+1););pt=ht[e][0],ut=ht[e][1],xa(Le,1),xa(Ae,10),xa(We,100),Ga({CacheMinPP:pt,CacheMinPPBulk:ut,CachePPArray:ht})}(),Object.keys(ze).forEach((e=>{Game.cookiesPs?ze[e].pp=Math.max(Game.Upgrades[e].getPrice()-(Game.cookies+Io()),0)/Game.cookiesPs+Game.Upgrades[e].getPrice()/ze[e].bonus:ze[e].pp=Game.Upgrades[e].getPrice()/ze[e].bonus,Number.isNaN(ze[e].pp)&&(ze[e].pp=1/0),ze[e].colour=na(ze[e],Game.Upgrades[e].getPrice())})),window.CookieMonsterData.Objects1=JSON.parse(JSON.stringify(Le)),window.CookieMonsterData.Objects10=JSON.parse(JSON.stringify(Ae)),window.CookieMonsterData.Objects100=JSON.parse(JSON.stringify(We)),window.CookieMonsterData.Upgrades=[],Object.entries(ze).forEach((e=>{window.CookieMonsterData.Upgrades[e[0]]=JSON.parse(JSON.stringify(e[1]))}))}function Fa(e){if("toggle"===Game.Upgrades[e].pool||0===Game.Upgrades[e].bought&&Game.Upgrades[e].unlocked&&"prestige"!==Game.Upgrades[e].pool){ta(),"Shimmering veil [on]"===Mt[e].name?Mt["Shimmering veil [off]"].bought=0:"Golden switch [on]"===Mt[e].name?Mt["Golden switch [off]"].bought=0:Mt[e].bought=(Mt[e].bought+1)%2,Game.CountsAsUpgradeOwned(Game.Upgrades[e].pool)&&(Z+=1),"Elder Pledge"===e?(ee+=1,ee>0&&ra("Elder nap"),ee>=5&&ra("Elder slumber")):"Elder Covenant"===e?ra("Elder calm"):"Prism heart biscuits"===e?ra("Lovely cookies"):"Heavenly key"===e&&ra("Wholesome");const t=te;sa(),ha(),t!==te&&sa();const o=function(){let e=0;wt("Thousand fingers")&&(e+=.1),wt("Million fingers")&&(e*=5),wt("Billion fingers")&&(e*=10),wt("Trillion fingers")&&(e*=20),wt("Quadrillion fingers")&&(e*=20),wt("Quintillion fingers")&&(e*=20),wt("Sextillion fingers")&&(e*=20),wt("Septillion fingers")&&(e*=20),wt("Octillion fingers")&&(e*=20),wt("Nonillion fingers")&&(e*=20),wt("Decillion fingers")&&(e*=20),wt("Undecillion fingers")&&(e*=20),wt("Unshackled cursors")&&(e*=25);let t=0;Object.keys(Ct).forEach((e=>{t+=Ct[e].amount})),t-=Ct.Cursor.amount,e*=t,wt("Plastic mouse")&&(e+=.01*me),wt("Iron mouse")&&(e+=.01*me),wt("Titanium mouse")&&(e+=.01*me),wt("Adamantium mouse")&&(e+=.01*me),wt("Unobtainium mouse")&&(e+=.01*me),wt("Eludium mouse")&&(e+=.01*me),wt("Wishalloy mouse")&&(e+=.01*me),wt("Fantasteel mouse")&&(e+=.01*me),wt("Nevercrack mouse")&&(e+=.01*me),wt("Armythril mouse")&&(e+=.01*me),wt("Technobsidian mouse")&&(e+=.01*me),wt("Plasmarble mouse")&&(e+=.01*me),wt("Miraculite mouse")&&(e+=.01*me),wt("Aetherice mouse")&&(e+=.01*me),wt("Omniplast mouse")&&(e+=.01*me),wt("Fortune #104")&&(e+=.01*me);let o=1;if(wt("Santa's helpers")&&(o*=1.1),wt("Cookie egg")&&(o*=1.1),wt("Halo gloves")&&(o*=1.1),wt("Dragon claw")&&(o*=1.03),wt("Aura gloves")&&(o*=1+.05*Math.min(Game.Objects.Cursor.level,wt("Luminous gloves")?20:10)),o*=vt("click"),Ct.Temple.minigameLoaded&&Tt){const e=Tt("labor");1===e?o*=1.15:2===e?o*=1.1:3===e&&(o*=1.05)}Object.keys(Game.buffs).forEach((e=>{void 0!==Game.buffs[e].multClick&&(o*=Game.buffs[e].multClick)})),o*=1+.05*bt("Dragon Cursor");let a=o*Game.ComputeCps(1,wt("Reinforced index finger")+wt("Carpal tunnel prevention cream")+wt("Ambidextrous"),e);return a=Game.runModHookOnValue("cookiesPerClick",a),Game.hasBuff("Cursed finger")&&(a=Game.buffs["Cursed finger"].power),a}()-Game.computedMouseCps;return o?[me-Game.cookiesPs,o]:[me-Game.cookiesPs]}return[]}function Ea(e){const t={};return Object.keys(Game.Objects).forEach((o=>{t[o]={},t[o].bonus=ga(o,e),1!==e&&(Y=1)})),t}function Ba(){Object.keys(Game.Objects).forEach((e=>{Le[e].price=wa(e,Game.Objects[e].basePrice,Game.Objects[e].amount,Game.Objects[e].free,1),Ae[e].price=wa(e,Game.Objects[e].basePrice,Game.Objects[e].amount,Game.Objects[e].free,10),We[e].price=wa(e,Game.Objects[e].basePrice,Game.Objects[e].amount,Game.Objects[e].free,100),je[e].price=wa(e,Game.Objects[e].basePrice,Game.Objects[e].amount,Game.Objects[e].free,je[e].AmountNeeded)})),Ga({CacheObjectsNextAchievement:je})}function Pa(){Le=Ea(1),Ae=Ea(10),We=Ea(100),function(){ze={};for(let e=0;e<Game.UpgradesInStore.length;e++){const t=Game.UpgradesInStore[e].name,o=Fa(t);"Elder Pledge"===t?(ze[t]={bonus:Game.cookiesPs-I},1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?ze[t].bonus-=z:2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink&&(ze[t].bonus-=V),Number.isFinite(ze[t].bonus)||(ze[t].bonus=0)):(ze[t]={},o[0]&&(ze[t].bonus=o[0]),o[1]&&(ze[t].bonusMouse=o[1]))}}()}function Na(e,t,o){let a=0,n=0,i=0,r=0,s=1+Math.max(0,Math.ceil(Math.log(Game.cookies)/Math.LN10)-10);for(;i<t*o;)n=Math.max(e,Math.min(Math.floor(1/9*10**s*e*o),t*o)),i=Math.max(e,Math.min(Math.floor(1/9*10**(s+1)*e*o),t*o)),r=Math.floor(1/9*10**(s+1)*e*o),a+=n,s+=1;return[a,n,r]}function Oa(){let e=60*Se*60*6*Fe;const t=ia();t>0?e/=t:e=0,Ke=Na(7,e,Ee),qe=2*Ke[1]/Ee,Ye=Ke[2]/60/60/6/Fe,et=Na(6,e,Be),Je=2*et[1]/Be,Ze=et[2]/60/60/6/Fe,at=Na(7,7*e,Ee),tt=2*at[1]/Ee,ot=at[2]/60/60/6/Fe,rt=Na(6,7*e,Be),nt=2*rt[1]/Be,it=rt[2]/60/60/6/Fe,Ga({CacheChainMaxReward:Ke,CacheChainRequired:qe,CacheChainRequiredNext:Ye,CacheChainWrathMaxReward:et,CacheChainWrathRequired:Je,CacheChainWrathRequiredNext:Ze,CacheChainFrenzyMaxReward:at,CacheChainFrenzyRequired:tt,CacheChainFrenzyRequiredNext:ot,CacheChainFrenzyWrathMaxReward:rt,CacheChainFrenzyWrathRequired:nt,CacheChainFrenzyWrathRequiredNext:it})}function Da(){const e=Math.floor(Date.now()/1e3);if(Game.T/Game.fps%1==0){const t=Game.HowMuchPrestige(Game.cookiesReset),o=Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned))-Math.floor(t),a=e-Q,n=Math.max(0,o-q)/a;for(let e=0;e<a;e++)W.addLatest(n);Q=e,q=o,Pe=W.calcAverage(5)}Ga({CacheLastHeavenlyCheck:Q,CacheLastHeavenlyChips:q,CacheHCPerSecond:Pe})}function La(){_e="",Qe="",Xe="";const e=[];Object.keys(Game.Upgrades).forEach((t=>{e.push(Game.Upgrades[t])})),e.sort((function(e,t){return e.order>t.order?1:e.order<t.order?-1:0})),Object.keys(e).forEach((t=>{const o=e[t];if(0===o.bought){let e="";e+=function(e){let t="crate upgrade missing";"prestige"===e.pool&&(t+=" heavenly");let o=0;Game.prefs.crates||(o=1),o&&(t+=" noFrame");let{icon:a}=e;e.iconFunction&&(a=e.iconFunction());const n=`function() {return Game.crateTooltip(Game.UpgradesById[${e.id}], 'stats');}`;return`<div class="${t}"\n\t${Game.getDynamicTooltip(n,"top",!0)}\n\tstyle = "${a[2]?`background-image: url(${a[2]});`:""}background-position:${48*-a[0]}px ${48*-a[1]}px;">\n\t</div>`}(o),"prestige"===o.pool?Xe+=e:"cookie"===o.pool?Qe+=e:"toggle"!==o.pool&&"unused"!==o.pool&&"debug"!==o.pool&&(_e+=e)}}))}function Aa(){if("christmas"===Game.season){let e=60*Game.cookiesPs;Game.hasBuff("Elder frenzy")&&(e*=.5),Game.hasBuff("Frenzy")&&(e*=.75),Oe=Math.max(25,e),Game.Has("Ho ho ho-flavored frosting")&&(Oe*=2)}Ga({CacheSeaSpec:Oe})}function Wa(){ke=900*Se/.15,ke*=Fe;const e=ia();e>0?ke/=e:ke=0,Ce=Ee*(.15*ke)+13,Me=Be*(.15*ke)+13,ye=7*ke,be=Ee*(.15*ye)+13,Ge=Be*(.15*ye)+13,ve=2*ke,we=.15*ve,xe=0;let t=0,o=0;Object.keys(Game.Objects).forEach((e=>{Game.Objects[e].amount>t&&(t=Game.Objects[e].amount),Game.Objects[e].amount>0&&(o+=1)})),Object.keys(Game.Objects).forEach((e=>{(Game.Objects[e].amount<t||1===o)&&Game.Objects[e].amount<400&&2*Game.Objects[e].price>xe&&(xe=2*Game.Objects[e].price,Te=e)})),Ga({CacheLucky:ke,CacheLuckyReward:Ce,CacheLuckyWrathReward:Me,CacheLuckyFrenzy:ye,CacheLuckyRewardFrenzy:be,CacheLuckyWrathRewardFrenzy:Ge,CacheConjure:ve,CacheConjureReward:we,CacheEdifice:xe,CacheEdificeBuilding:Te})}function ja(){let e=1,t=1,o=1;wt("Green yeast digestives")&&(o*=1.01),wt("Dragon fang")&&(o*=1.03),e*=1+.1*Game.auraMult("Ancestral Metamorphosis"),e*=Game.eff("goldenCookieGain"),t*=1+.1*Game.auraMult("Unholy Dominion"),t*=Game.eff("wrathCookieGain"),Ee=o*e,Be=o*t,Fe=1,0===Game.shimmerTypes.golden.n&&(Fe*=1+1.23*Game.auraMult("Dragon's Fortune")),Ga({CacheGoldenCookiesMult:Ee,CacheWrathCookiesMult:Be,CacheDragonsFortuneMultAdjustment:Fe})}function $a(e){const t={};Object.keys(Game.Objects).forEach((o=>{if(0!==Object.keys(je).length&&je[o].TotalNeeded>Game.Objects[o].amount&&!e)t[o]={AmountNeeded:je[o].TotalNeeded-Game.Objects[o].amount,TotalNeeded:je[o].TotalNeeded,price:wa(o,Game.Objects[o].basePrice,Game.Objects[o].amount,Game.Objects[o].free,je[o].TotalNeeded-Game.Objects[o].amount)};else{const e=function(e){const t=Game.AchievementsOwned;let o=100,a=100;for(;o>-1;)if(ga(e,o),te>t)a=o,o-=10;else{if(100===o)return 101;for(o+=1;o<=a;){if(ga(e,o),te>t)return o;o+=1}}return 101}(o);t[o]={AmountNeeded:e,TotalNeeded:Game.Objects[o].amount+e,price:wa(o,Game.Objects[o].basePrice,Game.Objects[o].amount,Game.Objects[o].free,e)}}})),je=t,Ga({CacheObjectsNextAchievement:je})}function Ua(){$e=0,Ue=0,He=[0,null];for(let e=0;e<Game.wrinklers.length;e++){let{sucked:t}=Game.wrinklers[e],o=1.1;if(Game.Has("Sacrilegious corruption")&&(o*=1.05),1===Game.wrinklers[e].type&&(o*=3),t*=o,Game.Has("Wrinklerspawn")&&(t*=1.05),Ct.Temple.minigameLoaded){const e=Game.hasGod("scorn");1===e?t*=1.15:2===e?t*=1.1:3===e&&(t*=1.05)}$e+=t,0===Game.wrinklers[e].type&&(Ue+=t,t>He[0]&&(He=[t,e]))}Ga({CacheWrinklersTotal:$e,CacheWrinklersNormal:Ue,CacheWrinklersFattest:He})}function Ha(){Yo(),Ua(),Wa(),ja(),Oa(),La(),Aa(),N=new ba(xo[xo.length-1]),O=new ba(xo[xo.length-1]),D=new ba(xo[xo.length-1]),L=new ba(xo[xo.length-1]),A=new ba(To[To.length-1]),W=new ba(5),P=new ba(20*To[To.length-1]),Da(),$a(),va(),Pa(),Ba(),Sa()}function Ra(){Object.keys(Game.wrinklers).forEach((e=>{Game.wrinklers[e].sucked>0&&0===Game.wrinklers[e].type&&(Game.wrinklers[e].hp=0)}))}function Ia(e,t){if("b"===e){if(l("tooltip").innerHTML=Game.Objects[t].tooltip(),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipAmor){const e=wa(t,Game.Objects[t].basePrice,0,Game.Objects[t].free,Game.Objects[t].amount),o=e-Game.Objects[t].totalCookies;o>0&&(l("tooltip").innerHTML=l("tooltip").innerHTML.split("so far</div>").join(`so far<br/>• <b>${to(o)}</b> ${1===Math.floor(o)?"cookie":"cookies"} left to amortize (${Ho((e-Game.Objects[t].totalCookies)/(Game.Objects[t].storedTotalCps*Game.globalCpsMult)).text})</div>`))}-1===Game.buyMode&&(l("tooltip").innerHTML=l("tooltip").innerHTML.split(to(Game.Objects[t].bulkPrice)).join(to((Game.Objects[t],Game.Objects[t].basePrice,Game.Objects[t].amount,Game.Objects[t].free,Game.buyBulk,1))))}else if("u"===e){if(!Game.UpgradesInStore[t])return"";l("tooltip").innerHTML=Game.crateTooltip(Game.UpgradesInStore[t],"store")}else"s"===e?l("tooltip").innerHTML=Game.lumpTooltip():"g"===e?l("tooltip").innerHTML=Game.Objects["Wizard tower"].minigame.spellTooltip(t)():"p"===e?l("tooltip").innerHTML=Game.ObjectsById[2].minigame.tileTooltip(t[0],t[1])():"ha"===e?l("tooltip").innerHTML=Game.ObjectsById[2].minigame.toolTooltip(1)():"wb"===e?l("tooltip").innerHTML="":"pag"===e?l("tooltip").innerHTML=Game.Objects.Temple.minigame.godTooltip(t)():"pas"===e&&(l("tooltip").innerHTML=Game.Objects.Temple.minigame.slotTooltip(t[0])());if("b"===e&&1===Game.buyMode||"u"===e||"s"===e||"g"===e||"p"===e&&!Game.keys[16]||"ha"===e||"wb"===e||"pag"===e||"pas"===e&&-1!==t[1]){const e=document.createElement("div");e.id="CMTooltipArea",l("tooltip").appendChild(e)}return Bo=e,Po=t,Ca(),l("tooltip").innerHTML}function za(){1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Favicon&&It>0?ct.wrath?l("CMFavicon").href="https://CookieMonsterTeam.github.io/CookieMonster/favicon/wrathCookie.ico":l("CMFavicon").href="https://CookieMonsterTeam.github.io/CookieMonster/favicon/goldenCookie.ico":l("CMFavicon").href="https://orteil.dashnet.org/cookieclicker/favicon.ico"}function Va(){Ct=[],Object.keys(Game.Objects).forEach((e=>{Ct[e]=Zo(e)})),Mt=[],Object.keys(Game.Upgrades).forEach((e=>{Mt[e]=ea(e)})),yt=[],Object.keys(Game.Achievements).forEach((e=>{yt[e]=Ko(e)})),ta()}function _a(){Game.Objects["Wizard tower"].minigameLoaded&&Object.keys(Game.Objects["Wizard tower"].minigame.spellsById).forEach((e=>{null!==l(`grimoireSpell${e}`).onmouseover&&(Yt[e]=l(`grimoireSpell${e}`).onmouseover,l(`grimoireSpell${e}`).onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("g",`${e}`)),"this"),Game.tooltip.wobble()})}))}function Xa(){if(!jt&&Game.Objects["Wizard tower"].minigameLoaded){const{minigame:e}=Game.Objects["Wizard tower"];At=e.draw,Game.Objects["Wizard tower"].minigame.draw=function(){At(),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GrimoireBar&&e.magic<e.magicM&&Game.drawT%5==0&&(e.magicBarTextL.innerHTML+=` (${Uo(fa(e.magic,e.magicM,e.magicM))})`,e.magicBarL.style.width="75%")},jt=!0}}function Qa(){!function(){if(!Wt&&Game.Objects["Wizard tower"].minigameLoaded){const{minigame:e}=Game.Objects["Wizard tower"];Dt=e.launch,Lt=new Function(`return ${e.launch.toString().split("=this").join("= Game.Objects['Wizard tower'].minigame")}`),Game.Objects["Wizard tower"].minigame.launch=function(){Lt(),_a(),jt=!1,Xa(),Wt=!0}}}(),Xa()}function qa(){if(ge!==Game.dragonLevel||ce){if(Game.dragonLevel<25&&Game.dragonLevels[Game.dragonLevel].buy.toString().includes("sacrifice")){const e=Game.dragonLevels[Game.dragonLevel].buy.toString().match(/Objects\[(.*)\]/);let t=null!==e?e[1]:Game.ObjectsById[Game.dragonLevel-5].name;const o=Game.dragonLevels[Game.dragonLevel].buy.toString().match(/sacrifice\((.*?)\)/)[1];if("i"!==t)if(t=t.replaceAll("'",""),Game.Objects[t].amount<o)fe="Not enough buildings to sell";else{let e=0;ta();for(let a=0;a<o;a++){let o=Ct[t].basePrice*Game.priceIncrease**Math.max(0,Ct[t].amount-1-Ct[t].free);o=Game.modifyBuildingPrice(Ct[t],o),o=Math.ceil(o),e+=o,Ct[t].amount-=1}fe=`Cost to rebuy: ${to(e)}`}else{let e=0;ta(),Object.keys(Game.Objects).forEach((a=>{if(t=a,Game.Objects[t].amount<o)fe="Not enough buildings to sell";else{for(let a=0;a<o;a++){let o=Ct[t].basePrice*Game.priceIncrease**Math.max(0,Ct[t].amount-1-Ct[t].free);o=Game.modifyBuildingPrice(Ct[t],o),o=Math.ceil(o),e+=o,Ct[t].amount-=1}fe=`Cost to rebuy: ${to(e)}`}}))}}ge=Game.dragonLevel}Ga({CacheLastDragonLevel:ge})}const Ya={Favourite:"Favourite Settings",Calculation:"Calculation",Notation:"Notation",Colours:"Colours and colour coding",BarsDisplay:"Infobars and visual settings",Tooltip:"Tooltips",Statistics:"Statistics",Notification:"Notifications",Miscellaneous:"Miscellaneous"},Ka={NotificationGeneral:"General Notifications",NotificationGC:"Golden Cookie",NotificationFC:"Fortune Cookie",NotificationSea:"Season Special",NotificationGard:"Garden Tick",NotificationMagi:"Full Magic Bar",NotificationWrink:"Wrinkler",NotificationWrinkMax:"Maximum Wrinklers"},Ja=function(e){if(1===e){const e=function(){try{Notification.requestPermission().then()}catch(e){return!1}return!0};"Notification"in window?e()?Notification.requestPermission().then():Notification.requestPermission():console.log("This browser does not support notifications.")}};function Za(){BeautifyAll(),Game.RefreshStore(),Game.RebuildUpgrades(),_o(),Wo(),$o()}function en(){1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar?(l("CMBotBar").style.display="",_o()):l("CMBotBar").style.display="none",Qo()}const tn={CPSMode:new S(1,"bool","Calculation",["Current cookies per second","Average cookies per second"],"Calculate times using current cookies per second or average cookies per second",!1),AvgCPSHist:new S(3,"bool","Calculation",["Average CPS in past 10s","Average CPS in past 15s","Average CPS in past 30s","Average CPS in past 1m","Average CPS in past 5m","Average CPS in past 10m","Average CPS in past 15m","Average CPS in past 30m"],"How much time average Cookies Per Second should consider",!1),AvgClicksHist:new S(0,"bool","Calculation",["Average clicks in past 1s","Average clicks in past 5s","Average clicks in past 10s","Average clicks in past 15s","Average clicks in past 30s"],"How much time average Cookie Clicks should consider",!1),CalcWrink:new F(0,"bool","Calculation",["Calculate with wrinklers OFF","Calculate with wrinklers ON","Calculate with single fattest wrinkler ON"],"Calculate times and average Cookies Per Second with (only the single non-shiny fattest) wrinklers",!0,(()=>{ce=!0})),Scale:new F(2,"bool","Notation",["Game's setting scale","Metric","Short scale","Short scale (Abbreviated)","Scientific notation","Engineering notation"],"Change how long numbers are formatted",!1,(()=>{Za()})),ScaleDecimals:new F(2,"bool","Notation",["1 decimals","2 decimals","3 decimals"],'Set the number of decimals used when applicable. This only works with Cookie Monster scales and not with "Game\'s Setting Scale"',!1,(()=>{Za()})),ScaleSeparator:new F(0,"bool","Notation",[". for decimals (standard)",". for thousands"],"Set the separator used for decimals and thousands",!1,(()=>{Za()})),ScaleCutoff:new T(999999,"numscale","Notation","Notation cut-off point: ","The number from which Cookie Monster will start formatting numbers based on chosen scale. Standard is 999,999. Setting this above 999,999,999 might break certain notations",1,999999999),TimeFormat:new S(0,"bool","Notation",["Time XXd, XXh, XXm, XXs","Time XX:XX:XX:XX:XX","Time XXx, XXx"],"Change the time format",!1),DetailedTime:new F(1,"bool","Notation",["Detailed time OFF","Detailed time ON"],"Change how time is displayed in certain statistics and tooltips",!0,(()=>{1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.DetailedTime?Game.sayTime=bo:Game.sayTime=Jt.sayTime})),PPDisplayTime:new S(0,"bool","Notation",["PP as value (standard)","PP as time unit"],"Display PP as calculated value or as approximate time unit. Note that PP does not translate directly into a time unit and this is therefore only an approximation.",!1),BuildColour:new F(1,"bool","Colours",["Building colours OFF","Building colours ON"],"Colour code buildings",!0,(()=>{Wo()})),PPOnlyConsiderBuyable:new S(0,"bool","Colours",["Don't ignore non-buyable","Ignore non-buyable"],"Makes Cookie Monster label buildings and upgrades you can't buy right now red, useful in those situations where you just want to spend your full bank 'most optimally'",!0),PPExcludeTop:new S(0,"bool","Colours",["Don't ignore any","Ignore 1st best","Ignore 1st and 2nd best","Ignore 1st, 2nd and 3rd best"],"Makes Cookie Monster ignore the 1st, 2nd or 3rd best buildings in labeling and colouring PP values",!0),PPRigidelMode:new S(0,"bool","Colours",["Rigidel mode OFF","Rigidel mode ON"],'Makes Cookie Monster ignore all "buy 1" options when colouring PP in order to stay at a total building count ending in 10 for pantheon god Rigidel',!0),PPSecondsLowerLimit:new T(0,"numscale","Colours","Lower limit for PP (in seconds): ",'If a building or upgrade costs less than the specified seconds of CPS it will also be considered optimal and label it as such ("PP is less than xx seconds of CPS"); setting to 0 ignores this option',0,1/0),ColourBlue:new x("#4bb8f0","colour","Colours","Standard colour is blue. Used to show upgrades better than best PP building, for Click Frenzy bar, and for various labels"),ColourGreen:new x("#00ff00","colour","Colours","Standard colour is green. Used to show best PP building, for Blood Frenzy bar, and for various labels"),ColourYellow:new x("#ffff00","colour","Colours","Standard colour is yellow. Used to show buildings within the top 10 of PP, for Frenzy bar, and for various labels"),ColourOrange:new x("#ff7f00","colour","Colours","Standard colour is orange. Used to show buildings within the top 20 of PP, for Next Reindeer bar, and for various labels"),ColourRed:new x("#ff0000","colour","Colours","Standard colour is Red. Used to show buildings within the top 30 of PP, for Clot bar, and for various labels"),ColourPurple:new x("#ff00ff","colour","Colours","Standard colour is purple. Used to show buildings outside of the top 30 of PP, for Next Cookie bar, and for various labels"),ColourGray:new x("#b3b3b3","colour","Colours","Standard colour is gray. Used to show negative or infinity PP, and for Next Cookie/Next Reindeer bar"),ColourPink:new x("#ff1493","colour","Colours","Standard colour is pink. Used for Dragonflight bar"),ColourBrown:new x("#8b4513","colour","Colours","Standard colour is brown. Used for Dragon Harvest bar"),BotBar:new F(1,"bool","BarsDisplay",["Bottom bar OFF","Bottom bar ON"],"Building information",!0,(()=>{en()})),TimerBar:new F(1,"bool","BarsDisplay",["Timer bar OFF","Timer bar ON"],"Bar with timers for golden cookie, season popup, Frenzy (Normal, Clot, Elder), Click Frenzy",!0,(()=>{qo()})),TimerBarPos:new F(0,"bool","BarsDisplay",["Timer bar position (top left)","Timer bar position (bottom)"],"Placement of the timer bar",!1,(()=>{0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos?(l("CMTimerBar").style.width="30%",l("CMTimerBar").style.bottom="",l("game").insertBefore(l("CMTimerBar"),l("sectionLeft"))):(l("CMTimerBar").style.width="100%",l("CMTimerBar").style.bottom="0px",l("wrapper").appendChild(l("CMTimerBar"))),Qo()})),TimerBarOverlay:new S(2,"bool","BarsDisplay",["Timer bar overlay OFF","Timer bar overlay only seconds","Timer bar overlay full"],"Overlay on timers displaying seconds and/or percentage left",!0),AutosaveTimerBar:new S(0,"bool","BarsDisplay",["Autosave timer bar OFF","Autosave timer bar ON"],"Show a timer counting down till next autosave in the timer bar",!0),UpBarColour:new F(1,"bool","BarsDisplay",["Upgrade colours/bar OFF","Upgrade colours with bar ON","Upgrade colours without bar ON"],"Colour code upgrades and optionally add a counter bar",!1,(()=>{1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour?(l("CMUpgradeBar").style.display="",$o()):2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour?(l("CMUpgradeBar").style.display="none",$o()):(l("CMUpgradeBar").style.display="none",Game.RebuildUpgrades())})),UpgradeBarFixedPos:new F(1,"bool","BarsDisplay",["Upgrade bar fixed position OFF","Upgrade bar fixed position ON"],"Lock the upgrade bar at top of the screen to prevent it from moving ofscreen when scrolling",!0,(()=>{1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpgradeBarFixedPos?(l("CMUpgradeBar").style.position="sticky",l("CMUpgradeBar").style.top="0px"):l("CMUpgradeBar").style.position=""})),SortBuildings:new F(0,"bool","BarsDisplay",["Sort buildings: default","Sort buildings: PP of x1 purchase","Sort buildings: PP of selected bulk mode","Sort buildings: price until next achievement"],"Sort the display of buildings in default order, by PP, or until next achievement",!1,(()=>{Wo()})),SortUpgrades:new F(0,"bool","BarsDisplay",["Sort upgrades: default","Sort upgrades: PP"],"Sort the display of upgrades in either default order or by PP",!1,(()=>{$o()})),UpgradesNeverCollapse:new F(0,"bool","BarsDisplay",["Upgrades always expanded OFF","Upgrades always expanded ON"],"Toggle to make the upgrades sections always expanded to the size needed to display all upgrades",!0,(()=>{jo()})),DragonAuraInfo:new S(1,"bool","BarsDisplay",["Extra dragon aura info OFF","Extra dragon aura info ON"],"Shows information about changes in CPS and costs in the dragon aura interface.",!0),GrimoireBar:new S(1,"bool","BarsDisplay",["Grimoire magic meter timer OFF","Grimoire magic meter timer ON"],"A timer overlay showing how long till the Grimoire magic meter is full",!0),GCTimer:new F(1,"bool","BarsDisplay",["Golden cookie timer OFF","Golden cookie timer ON"],"A timer on the golden cookie when it has been spawned",!0,(()=>{1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer?Object.keys(Lo).forEach((e=>{Lo[e].style.display="block",Lo[e].style.left=gt[e].l.style.left,Lo[e].style.top=gt[e].l.style.top})):Object.keys(Lo).forEach((e=>Lo[e].style.display="none"))})),Favicon:new F(1,"bool","BarsDisplay",["Favicon OFF","Favicon ON"],"Update favicon with golden/wrath cookie",!0,(()=>{za()})),WrinklerButtons:new F(1,"bool","BarsDisplay",["Extra wrinkler buttons OFF","Extra wrinkler buttons ON"],"Show buttons for popping wrinklers at bottom of cookie section",!0,(()=>{B()})),HideSectionsButtons:new F(0,"bool","BarsDisplay",["Hide buildings/upgrades button OFF","Hide buildings/upgrades button ON"],"Show buttons for hiding and showing the buildings and upgrades sections in the right column",!0,(()=>{Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.HideSectionsButtons?l("CMSectionHidButtons").style.display="":l("CMSectionHidButtons").style.display="none"})),TooltipBuildUpgrade:new S(1,"bool","Tooltip",["Building/upgrade tooltip information OFF","Building/upgrade tooltip information ON"],"Extra information in building/upgrade tooltips",!0),TooltipAmor:new S(0,"bool","Tooltip",["Buildings tooltip amortization information OFF","Buildings tooltip amortization information ON"],"Add amortization information to buildings tooltip",!0),ToolWarnLucky:new S(1,"bool","Tooltip",["Tooltip lucky warning OFF","Tooltip lucky warning ON"],'A warning when buying if it will put the bank under the amount needed for max "Lucky!" rewards',!0),ToolWarnLuckyFrenzy:new S(1,"bool","Tooltip",["Tooltip lucky frenzy warning OFF","Tooltip lucky frenzy warning ON"],'A warning when buying if it will put the bank under the amount needed for max "Lucky!" (Frenzy) rewards',!0),ToolWarnConjure:new S(1,"bool","Tooltip",["Tooltip conjure warning OFF","Tooltip conjure warning ON"],'A warning when buying if it will put the bank under the amount needed for max "Conjure Baked Goods" rewards',!0),ToolWarnConjureFrenzy:new S(1,"bool","Tooltip",["Tooltip conjure frenzy warning OFF","Tooltip conjure frenzy warning ON"],'A warning when buying if it will put the bank under the amount needed for max "Conjure Baked Goods" rewards with Frenzy active',!0),ToolWarnEdifice:new S(1,"bool","Tooltip",["Tooltip edifice warning OFF","Tooltip edifice warning ON"],'A warning when buying if it will put the bank under the amount needed for "Spontaneous Edifice" to possibly give you your most expensive building',!0),ToolWarnUser:new T(0,"numscale","Tooltip","Tooltip warning at x times CPS: ","Use this to show a customized warning if buying it will put the bank under the amount equal to value times cps; setting to 0 disables the function altogether",0,1/0),ToolWarnBon:new S(1,"bool","Tooltip",["Calculate tooltip warning with bonus CPS OFF","Calculate tooltip warning with bonus CPS ON"],"Calculate the warning with or without the bonus CPS you get from buying",!0),ToolWarnPos:new F(1,"bool","Tooltip",["Tooltip warning position (left)","Tooltip warning position (bottom)"],"Placement of the warning boxes",!1,(()=>{ka()})),TooltipGrim:new S(1,"bool","Tooltip",["Grimoire tooltip information OFF","Grimoire tooltip information ON"],"Extra information in tooltip for grimoire",!0),TooltipWrink:new S(1,"bool","Tooltip",["Wrinkler tooltip OFF","Wrinkler tooltip ON"],"Shows the amount of cookies a wrinkler will give when popping it",!0),TooltipLump:new S(1,"bool","Tooltip",["Sugar lump tooltip OFF","Sugar lump tooltip ON"],"Shows the current Sugar Lump type in Sugar lump tooltip.",!0),TooltipPlots:new S(1,"bool","Tooltip",["Garden plots tooltip OFF","Garden plots tooltip ON"],"Shows a tooltip for plants that have a cookie reward.",!0),TooltipPantheon:new S(1,"bool","Tooltip",["Pantheon tooltip OFF","Pantheon tooltip ON"],"Shows additional info in the pantheon tooltip",!0),TooltipAscendButton:new S(1,"bool","Tooltip",["Show Extra Info Ascend Tooltip OFF","Show Extra Info Ascend Tooltip ON"],"Shows additional info in the ascend tooltip",!0),Stats:new S(1,"bool","Statistics",["Statistics OFF","Statistics ON"],"Extra Cookie Monster statistics!",!0),MissingUpgrades:new S(1,"bool","Statistics",["Missing upgrades OFF","Missing upgrades ON"],"Shows missing upgrades in statistics menu",!0),MissingAchievements:new S(0,"bool","Statistics",["Missing Achievements OFF","Missing Normal Achievements ON"],"Shows missing normal achievements in statistics menu.",!0),UpStats:new S(1,"bool","Statistics",["Statistics update rate (default)","Statistics update rate (1s)"],"Default rate is once every 5 seconds",!1),HeavenlyChipsTarget:new T(1,"numscale","Statistics","Heavenly chips target: ",'Use this to set a heavenly chips target that will be counted towards in the "prestige" statsistics sections',1,1/0),ShowMissedGC:new S(1,"bool","Statistics",["Missed GC OFF","Missed GC ON"],"Show a stat in the statistics screen that counts how many golden cookies you have missed",!0),Title:new S(1,"bool","NotificationGeneral",["Title OFF","Title ON","Title pinned tab highlight"],'Update title with colden cookie/season popup timers; pinned tab highlight only changes the title when a golden cookie/season popup spawns; "!" means that golden cookie/reindeer can spawn',!0),GeneralSound:new S(1,"bool","NotificationGeneral",["Consider game volume setting OFF","Consider game volume setting ON"],'Turning this toggle to "off" makes Cookie Monster no longer consider the volume setting of the base game, allowing mod notifications to play with base game volume turned down',!0),GCNotification:new F(0,"bool","NotificationGC",["Notification OFF","Notification ON"],"Create a notification when golden cookie spawns",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCNotification)})),GCFlash:new S(1,"bool","NotificationGC",["Flash OFF","Flash ON"],"Flash screen on golden cookie",!0),ColourGCFlash:new x("#ffffff","colour","NotificationGC","The colour of the GC flash, standard colour is white"),GCSound:new S(1,"bool","NotificationGC",["Sound OFF","Sound ON"],"Play a sound on golden cookie",!0),GCVolume:new E(100,"vol","NotificationGC",[],"Volume"),GCSoundURL:new S("https://freesound.org/data/previews/66/66717_931655-lq.mp3","url","NotificationGC","Sound URL:","URL of the sound to be played when a golden cookie spawns"),FortuneNotification:new F(0,"bool","NotificationFC",["Notification OFF","Notification ON"],"Create a notification when fortune cookie is on the ticker",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FortuneNotification)})),FortuneFlash:new S(1,"bool","NotificationFC",["Flash OFF","Flash ON"],"Flash screen on fortune cookie spawn",!0),ColourFortuneFlash:new x("#ffffff","colour","NotificationFC","The colour of the fortune flash, standard colour is white"),FortuneSound:new S(1,"bool","NotificationFC",["Sound OFF","Sound ON"],"Play a sound on fortune cookie spawn",!0),FortuneVolume:new E(100,"vol","NotificationFC",[],"Volume"),FortuneSoundURL:new S("https://freesound.org/data/previews/174/174027_3242494-lq.mp3","url","NotificationFC","Sound URL:","URL of the sound to be played when the ticker has a fortune cookie"),SeaNotification:new F(0,"bool","NotificationSea",["Notification OFF","Notification ON"],"Create a notification on season popup",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SeaNotification)})),SeaFlash:new S(1,"bool","NotificationSea",["Flash OFF","Flash ON"],"Flash screen on season popup",!0),ColourSeaFlash:new x("#ffffff","colour","NotificationSea","The colour of the season popup flash, standard colour is white"),SeaSound:new S(1,"bool","NotificationSea",["Sound OFF","Sound ON"],"Play a sound on season popup",!0),SeaVolume:new E(100,"vol","NotificationSea",[],"Volume"),SeaSoundURL:new S("https://www.freesound.org/data/previews/121/121099_2193266-lq.mp3","url","NotificationSea","Sound URL:","URL of the sound to be played when on season popup spawns"),GardFlash:new S(1,"bool","NotificationGard",["Garden Tick Flash OFF","Flash ON"],"Flash screen on garden tick",!0),ColourGardFlash:new x("#ffffff","colour","NotificationGard","The colour of the garden flash, standard colour is white"),GardSound:new S(1,"bool","NotificationGard",["Sound OFF","Sound ON"],"Play a sound on garden tick",!0),GardVolume:new E(100,"vol","NotificationGard",[],"Volume"),GardSoundURL:new S("https://freesound.org/data/previews/103/103046_861714-lq.mp3","url","NotificationGard","Garden Tick Sound URL:","URL of the sound to be played when the garden ticks"),MagicNotification:new F(0,"bool","NotificationMagi",["Notification OFF","Notification ON"],"Create a notification when magic reaches maximum",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MagicNotification)})),MagicFlash:new S(1,"bool","NotificationMagi",["Flash OFF","Flash ON"],"Flash screen when magic reaches maximum",!0),ColourMagicFlash:new x("#ffffff","colour","NotificationMagi","The colour of the magic flash, standard colour is white"),MagicSound:new S(1,"bool","NotificationMagi",["Sound OFF","Sound ON"],"Play a sound when magic reaches maximum",!0),MagicVolume:new E(100,"vol","NotificationMagi",[],"Volume"),MagicSoundURL:new S("https://freesound.org/data/previews/221/221683_1015240-lq.mp3","url","NotificationMagi","Sound URL:","URL of the sound to be played when magic reaches maxium"),WrinklerNotification:new F(0,"bool","NotificationWrink",["Notification OFF","Notification ON"],"Create a notification when a wrinkler appears",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerNotification)})),WrinklerFlash:new S(1,"bool","NotificationWrink",["Flash OFF","Flash ON"],"Flash screen when a wrinkler appears",!0),ColourWrinklerFlash:new x("#ffffff","colour","NotificationWrink","The colour of the wrinkler flash, standard colour is white"),WrinklerSound:new S(1,"bool","NotificationWrink",["Sound OFF","Sound ON"],"Play a sound when a wrinkler appears",!0),WrinklerVolume:new E(100,"vol","NotificationWrink",[],"Volume"),WrinklerSoundURL:new S("https://freesound.org/data/previews/124/124186_8043-lq.mp3","url","NotificationWrink","Sound URL:","URL of the sound to be played when a wrinkler appears"),WrinklerMaxNotification:new F(0,"bool","NotificationWrinkMax",["Notification OFF","Notification ON"],"Create a notification when the maximum amount of wrinklers has appeared",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxNotification)})),WrinklerMaxFlash:new S(1,"bool","NotificationWrinkMax",["Flash OFF","Flash ON"],"Flash screen when the maximum amount of Wrinklers has appeared",!0),ColourWrinklerMaxFlash:new x("#ffffff","colour","NotificationWrinkMax","The colour of the maximum wrinkler flash, standard colour is white"),WrinklerMaxSound:new S(1,"bool","NotificationWrinkMax",["Sound OFF","Sound ON"],"Play a sound when the maximum amount of wrinklers has appeared",!0),WrinklerMaxVolume:new E(100,"vol","NotificationWrinkMax",[],"Volume"),WrinklerMaxSoundURL:new S("https://freesound.org/data/previews/152/152743_15663-lq.mp3","url","NotificationWrinkMax","Sound URL:","URL of the sound to be played when the maximum amount of wrinklers has appeared"),BulkBuyBlock:new S(1,"bool","Miscellaneous",["Block bulk buying OFF","Block bulk buying ON"],"Block clicking bulk buying when you can't buy all. This prevents buying 7 of a building when you are in buy-10 or buy-100 mode.",!0),FavouriteSettings:new F(1,"bool","Miscellaneous",["Favourite settings section OFF","Favourite settings section ON","Favourite settings section ON (Locked)"],"Show stars before each setting which allows selecting it for a 'favourites' section at the top of the Cookie Monster settings. Setting this to Locked removes the stars but shows the 'favourites' section",!0,(()=>{Game.UpdateMenu()}))};function on(){let e="";for(let t=0;t<ho.length;t++)e+=`.CMText${ho[t]} { color: ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[`Colour${ho[t]}`]}; }\n`;for(let t=0;t<ho.length;t++)e+=`.CMBack${ho[t]} { background-color: ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[`Colour${ho[t]}`]}; }\n`;for(let t=0;t<ho.length;t++)e+=`.CMBorder${ho[t]} { border: 1px solid ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[`Colour${ho[t]}`]}; }\n`;l("CMCSS").textContent=e,Wo()}function an(){const e=G("cookieMonsterMod","Cookie Monster","optionsMenu");return Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.optionsMenu&&Object.keys(Ya).forEach((t=>{if("Favourite"===t){if(0!==Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings.length&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FavouriteSettings>0&&(e.appendChild(b.createOptionsSubHeader("cookieMonsterMod",t,Ya[t])),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[t]))for(let t=0;t<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings.length;t++)e.appendChild(b.createOptionsListing("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings[t],tn,on,Za))}else e.appendChild(b.createOptionsSubHeader("cookieMonsterMod",t,Ya[t])),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[t]&&("Notification"===t?Object.keys(Ka).forEach((t=>{const o=b.createOptionsSubHeader("cookieMonsterMod",t,Ka[t]);o.style.fontSize="15px",o.style.opacity="0.5",e.appendChild(o),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[t]&&Object.keys(tn).forEach((o=>{tn[o].group===t&&e.appendChild(b.createOptionsListing("cookieMonsterMod",o,tn,on,Za))}))})):Object.keys(tn).forEach((o=>{tn[o].group===t&&e.appendChild(b.createOptionsListing("cookieMonsterMod",o,tn,on,Za))})))})),e}function nn(e){return String(e).split(String(7)).length-1}function rn(e,t){const o=10*t;let a=7*t-e%o+e%t;return a<0&&(a+=o),a}function sn(e,t){const o=document.createElement("div");o.className="title",o.style.padding="0px 16px",o.style.opacity="0.7",o.style.fontSize="17px",o.style.fontFamily='"Kavoon", Georgia, serif',o.appendChild(document.createTextNode(`${e} `));const a=document.createElement("span");return a.style.cursor="pointer",a.style.display="inline-block",a.style.height="14px",a.style.width="14px",a.style.borderRadius="7px",a.style.textAlign="center",a.style.backgroundColor="#C0C0C0",a.style.color="black",a.style.fontSize="13px",a.style.verticalAlign="middle",a.textContent=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[t]?"-":"+",a.onclick=function(){!function(e){Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[e]+=1,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[e]>1&&(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[e]=0),w.saveFramework()}(t),Game.UpdateMenu()},o.appendChild(a),o}function ln(e,t,o,a){const n=document.createElement("div");n.className="listing";const i=document.createElement("b");if(i.textContent=t,n.appendChild(i),"withTooltip"===e){n.className="listing",n.appendChild(document.createTextNode(" "));const e=document.createElement("span");e.onmouseout=function(){Game.tooltip.hide()},e.onmouseover=function(){Game.tooltip.draw(this,escape(fo[a].innerHTML))},e.style.cursor="default",e.style.display="inline-block",e.style.height="10px",e.style.width="10px",e.style.borderRadius="5px",e.style.textAlign="center",e.style.backgroundColor="#C0C0C0",e.style.color="black",e.style.fontSize="9px",e.style.verticalAlign="bottom",e.textContent="?",n.appendChild(e)}return n.appendChild(document.createTextNode(": ")),n.appendChild(o),n}function cn(e,t,o,a){const n=document.createElement("div");n.className="listing";const i=document.createElement("b");return i.textContent=t,!0===a&&(i.style.color=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ColourGreen),n.appendChild(i),n.appendChild(document.createTextNode(": ")),n.appendChild(o),n}function dn(e){const t=document.createDocumentFragment();t.appendChild(document.createTextNode(`${e.length} `));const o=document.createElement("span");o.onmouseout=function(){Game.tooltip.hide()};const a=document.createElement("div"),n=document.createElement("div");n.style.minWidth="140px",n.style.marginBottom="4px";const i=document.createElement("div");return i.className="name",i.style.marginBottom="4px",i.style.textAlign="center",i.textContent="Missing",n.appendChild(i),Object.keys(e).forEach((t=>{const o=document.createElement("div");o.style.textAlign="center",o.appendChild(document.createTextNode(e[t])),n.appendChild(o)})),a.appendChild(n),o.onmouseover=function(){Game.tooltip.draw(this,escape(a.innerHTML))},o.style.cursor="default",o.style.display="inline-block",o.style.height="10px",o.style.width="10px",o.style.borderRadius="5px",o.style.textAlign="center",o.style.backgroundColor="#C0C0C0",o.style.color="black",o.style.fontSize="9px",o.style.verticalAlign="bottom",o.textContent="?",t.appendChild(o),t}function mn(e){const t=document.createElement("div");if(t.className="subsection",t.appendChild(e),t.appendChild(sn("Lucky Cookies","Lucky")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Lucky&&t.appendChild(function(){const e=Game.auraMult("Dragon's Fortune")?"GoldCookDragonsFortuneTooltipPlaceholder":"GoldCookTooltipPlaceholder",t=document.createElement("div");t.className="CMStatsLuckySection";const o=Game.cookies+Io()<ke?lo:io,a=Game.cookies+Io()<ke?Uo((ke-(Game.cookies+Io()))/Ro()):"",n=document.createDocumentFragment(),i=document.createElement("span");if(i.style.fontWeight="bold",i.className=oo+o,i.textContent=to(ke),n.appendChild(i),""!==a){const e=document.createElement("small");e.textContent=` (${a})`,n.appendChild(e)}t.appendChild(ln("withTooltip",'"Lucky!" cookies required',n,e));const r=Game.cookies+Io()<ye?lo:io,s=Game.cookies+Io()<ye?Uo((ye-(Game.cookies+Io()))/Ro()):"",l=document.createDocumentFragment(),c=document.createElement("span");if(c.style.fontWeight="bold",c.className=oo+r,c.textContent=to(ye),l.appendChild(c),""!==s){const e=document.createElement("small");e.textContent=` (${s})`,l.appendChild(e)}t.appendChild(ln("withTooltip",'"Lucky!" cookies required (frenzy)',l,e));const d=Ce!==Me,m=document.createElement("span");m.style.fontWeight="bold",m.className=oo+Ce,m.textContent=to(Ce)+(d?` / ${to(Me)}`:""),t.appendChild(ln("withTooltip",'"Lucky!" reward (max)'+(d?" (golden / wrath)":""),m,e));const p=document.createElement("span");p.style.fontWeight="bold",p.className=oo+p,p.textContent=to(be)+(d?` / ${to(Ge)}`:""),t.appendChild(ln("withTooltip",'"Lucky!" reward (max) (frenzy)'+(d?" (golden / wrath)":""),p,e));const u=Math.min(.15*(Game.cookies+Io()),Se*Fe*60*15)+13,h=document.createElement("span");return h.style.fontWeight="bold",h.className=oo+h,h.textContent=to(Ee*u)+(d?` / ${to(Be*u)}`:""),t.appendChild(ln("withTooltip",'"Lucky!" reward (cur)'+(d?" (golden / wrath)":""),h,e)),t}()),t.appendChild(sn("Chain Cookies","Chain")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Chain&&t.appendChild(function(){const e=Game.auraMult("Dragon's Fortune")?"GoldCookDragonsFortuneTooltipPlaceholder":"GoldCookTooltipPlaceholder",t=document.createElement("div");t.className="CMStatsChainSection";const o=Game.cookies+Io()<qe?lo:io,a=Game.cookies+Io()<qe?Uo((qe-(Game.cookies+Io()))/Ro()):"",n=document.createDocumentFragment(),i=document.createElement("span");if(i.style.fontWeight="bold",i.className=oo+o,i.textContent=to(qe),n.appendChild(i),""!==a){const e=document.createElement("small");e.textContent=` (${a})`,n.appendChild(e)}t.appendChild(ln("withTooltip",'"Chain" cookies required',n,e));const r=Game.cookies+Io()<Je?lo:io,s=Game.cookies+Io()<Je?Uo((Je-(Game.cookies+Io()))/Ro()):"",l=document.createDocumentFragment(),c=document.createElement("span");if(c.style.fontWeight="bold",c.className=oo+r,c.textContent=to(Je),l.appendChild(c),""!==s){const e=document.createElement("small");e.textContent=` (${s})`,l.appendChild(e)}t.appendChild(ln("withTooltip",'"Chain" cookies required (Wrath)',l,e));const d=Game.cookies+Io()<tt?lo:io,m=Game.cookies+Io()<tt?Uo((tt-(Game.cookies+Io()))/Ro()):"",p=document.createDocumentFragment(),u=document.createElement("span");if(u.style.fontWeight="bold",u.className=oo+d,u.textContent=to(tt),p.appendChild(u),""!==m){const e=document.createElement("small");e.textContent=` (${m})`,p.appendChild(e)}t.appendChild(ln("withTooltip",'"Chain" cookies required (Frenzy)',p,e));const h=Game.cookies+Io()<nt?lo:io,g=Game.cookies+Io()<nt?Uo((nt-(Game.cookies+Io()))/Ro()):"",f=document.createDocumentFragment(),k=document.createElement("span");if(k.style.fontWeight="bold",k.className=oo+h,k.textContent=to(nt),f.appendChild(k),""!==g){const e=document.createElement("small");e.textContent=` (${g})`,f.appendChild(e)}t.appendChild(ln("withTooltip",'"Chain" cookies required (frenzy) (Wrath)',f,e)),t.appendChild(ln("withTooltip",'"Chain" reward (max) (golden / wrath)',document.createTextNode(`${to(Ke[0])} / ${to(et[0])}`),e)),t.appendChild(ln("withTooltip",'"Chain" reward (max) (frenzy) (golden / wrath)',document.createTextNode(`${to(at[0])} / ${to(at[0])}`),e));const C=Math.min(60*Game.cookiesPs*60*6*Fe,.5*Game.cookies),M=Na(7,C,Ee)[0],y=Na(6,C,Be)[0];return t.appendChild(ln("withTooltip",'"Chain" reward (cur) (golden / wrath)',document.createTextNode(`${to(M)} / ${to(y)}`),e)),t.appendChild(ln("withTooltip","CPS needed for next level (g / w)",document.createTextNode(`${to(Ye)} / ${to(Ze)}`),"ChainNextLevelPlaceholder")),t.appendChild(ln("withTooltip","CPS needed for next level (frenzy) (g / w)",document.createTextNode(`${to(ot)} / ${to(it)}`),"ChainNextLevelPlaceholder")),t}()),Game.Objects["Wizard tower"].minigameLoaded&&(t.appendChild(sn("Spells","Spells")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Spells&&t.appendChild(function(){const e=document.createElement("div");e.className="CMStatsSpellsSection";const t=Game.cookies+Io()<ve?lo:io,o=Game.cookies+Io()<ve?Uo((ve-(Game.cookies+Io()))/Ro()):"",a=document.createDocumentFragment(),n=document.createElement("span");if(n.style.fontWeight="bold",n.className=oo+t,n.textContent=to(ve),a.appendChild(n),""!==o){const e=document.createElement("small");e.textContent=` (${o})`,a.appendChild(e)}e.appendChild(ln("withTooltip",'"Conjure Baked Goods" cookies required',a,"GoldCookTooltipPlaceholder")),e.appendChild(ln("withTooltip",'"Conjure Baked Goods" reward (max)',document.createTextNode(to(we)),"GoldCookTooltipPlaceholder"));const i=Game.cookies+Io()<7*ve?lo:io,r=Math.min(.15*(Game.cookies+Io()),60*Se*30),s=Game.cookies+Io()<7*ve?Uo((7*ve-(Game.cookies+Io()))/Ro()):"",l=document.createDocumentFragment(),c=document.createElement("span");if(c.style.fontWeight="bold",c.className=oo+i,c.textContent=to(7*ve),l.appendChild(c),""!==s){const e=document.createElement("small");e.textContent=` (${s})`,l.appendChild(e)}return e.appendChild(ln("withTooltip",'"Conjure Baked Goods" cookies required (frenzy)',l,"GoldCookTooltipPlaceholder")),e.appendChild(ln("withTooltip",'"Conjure Baked Goods" reward (max) (frenzy)',document.createTextNode(to(7*we)),"GoldCookTooltipPlaceholder")),e.appendChild(ln("withTooltip",'"Conjure Baked Goods" reward (cur)',document.createTextNode(to(r)),"GoldCookTooltipPlaceholder")),xe&&e.appendChild(ln("withTooltip",'"Spontaneous Edifice" cookies required (most expensive building)',document.createTextNode(`${to(xe)} (${Te})`),"GoldCookTooltipPlaceholder")),e}())),Game.Objects.Farm.minigameLoaded&&(t.appendChild(sn("Garden","Garden")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Garden&&t.appendChild(function(){const e=document.createElement("div");e.className="CMStatsGardenSection";const t=Game.cookies<60*Game.cookiesPs*10*100?lo:io,o=document.createElement("span");o.style.fontWeight="bold",o.className=oo+t,o.textContent=to(60*Game.cookiesPs*10*100),e.appendChild(ln("basic","Cookies required for max reward of Bakeberry: ",o));const a=Game.cookies<60*Game.cookiesPs*100?lo:io,n=document.createElement("span");n.style.fontWeight="bold",n.className=oo+a,n.textContent=to(60*Game.cookiesPs*100),e.appendChild(ln("basic","Cookies required for max reward of Chocoroot: ",n));const i=Game.cookies<60*Game.cookiesPs*60*25?lo:io,r=document.createElement("span");r.style.fontWeight="bold",r.className=oo+i,r.textContent=to(60*Game.cookiesPs*60*25),e.appendChild(ln("basic","Cookies required for max reward of Queenbeet: ",r));const s=Game.cookies<60*Game.cookiesPs*15*100?lo:io,l=document.createElement("span");l.style.fontWeight="bold",l.className=oo+s,l.textContent=to(60*Game.cookiesPs*15*100),e.appendChild(ln("basic","Cookies required for max reward of Duketater: ",l));const c=[];return Object.keys(pa).forEach((e=>{Game.HasUnlocked(pa[e])||c.push(pa[e])})),0!==c.length&&e.appendChild(ln("basic","Rare plant drops left to unlock",dn(c))),e}())),t.appendChild(sn("Prestige","Prestige")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Prestige&&t.appendChild(function(){const e=document.createElement("div");e.className="CMStatsPrestigeSection";const t=Math.floor(Game.HowMuchPrestige(st+Game.cookiesReset+$e+(Game.HasUnlocked("Chocolate egg")&&!Game.Has("Chocolate egg")?De:0)));e.appendChild(ln("withTooltip","Prestige level (cur / max)",document.createTextNode(`${to(Game.prestige)} / ${to(t)}`),"PrestMaxTooltipPlaceholder"));const o=Math.max(0,Game.HowManyCookiesReset(t+1)-(st+Game.cookiesReset+$e+(Game.HasUnlocked("Chocolate egg")&&!Game.Has("Chocolate egg")&&De?De:0))),a=document.createDocumentFragment();a.appendChild(document.createTextNode(to(o)));const n=document.createElement("small");n.textContent=` (${Uo(o/lt,1)})`,a.appendChild(n),e.appendChild(ln("withTooltip","Cookies to next level",a,"NextPrestTooltipPlaceholder")),e.appendChild(ln("withTooltip","Heavenly chips (cur / max)",document.createTextNode(`${to(Game.heavenlyChips)} / ${to(t-Game.prestige+Game.heavenlyChips)}`),"HeavenChipMaxTooltipPlaceholder")),e.appendChild(ln("basic","Heavenly chips per second (last 5 seconds)",document.createTextNode(to(Pe,2))));const i=Number(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.HeavenlyChipsTarget);if(!Number.isNaN(i)){const t=i-Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned));t>0&&(e.appendChild(ln("basic","Heavenly chips to target set in settings (cur)",document.createTextNode(to(t)))),e.appendChild(ln("basic","Time till target (cur, current 5 second average)",document.createTextNode(Uo(t/Pe)))))}const r=function(e){let t=Game.cookiesPs;ta(),0===Mt["Heavenly key"].bought&&(Mt["Heavenly chip secret"].bought=1,Mt["Heavenly cookie stand"].bought=1,Mt["Heavenly bakery"].bought=1,Mt["Heavenly confectionery"].bought=1,Mt["Heavenly key"].bought=1,sa(),t=me,ta()),st>=1e6&&ra("Sacrifice"),st>=1e9&&ra("Oblivion"),st>=1e12&&ra("From scratch"),st>=1e15&&ra("Nihilism"),st>=1e18&&ra("Dematerialize"),st>=1e21&&ra("Nil zero zilch"),st>=1e24&&ra("Transcendence"),st>=1e27&&ra("Obliterate"),st>=1e30&&ra("Negative void"),st>=1e33&&ra("To crumbs, you say?"),st>=1e36&&ra("You get nothing"),st>=1e39&&ra("Humble rebeginnings"),st>=1e42&&ra("The end of the world"),st>=1e45&&ra("Oh, you're back"),st>=1e48&&ra("Lazarus"),st>=1e51&&ra("Smurf account"),st>=1e54&&ra("If at first you don't succeed"),Mt["Heavenly chip secret"].bought=1,Mt["Heavenly cookie stand"].bought=1,Mt["Heavenly bakery"].bought=1,Mt["Heavenly confectionery"].bought=1,Mt["Heavenly key"].bought=1,ae=e;const o=te;sa(),ha(),o!==te&&sa();const a=me-t;return ae=Game.prestige,a}(t),s=document.createDocumentFragment();s.appendChild(document.createTextNode(to(r)));const l=Math.round(r/Game.cookiesPs*1e4);if(Number.isFinite(l)&&0!==l){const e=document.createElement("small");e.textContent=` (${l/100}% of income)`,s.appendChild(e)}e.appendChild(ln("withTooltip","Reset bonus income",s,"ResetTooltipPlaceholder"));const c=Math.floor(Game.HowMuchPrestige(Game.cookiesReset)),d=Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned)),m=d-c,{luckyDigit:p,luckyNumber:u,luckyPayout:h}=function(e){const t={};let o=nn(e);const a=String(e).length;if(o>=1&&(t.luckyDigit=e,o>=2&&(t.luckyNumber=e,o>=4)))return t.luckyPayout=e,t;let n;if(n=a>=16?Math.ceil(e/10**(a-15)):e,o=nn(n),void 0===t.luckyDigit&&(o<1&&(n+=rn(n,1),o=nn(n)),t.luckyDigit=n,a>=16&&(t.luckyDigit*=10**Number(a-15))),void 0===t.luckyNumber){for(;o<2;){let e=rn(n,1);0===e&&(e=rn(n,10)),n+=e,o=nn(n)}t.luckyNumber=n,a>=16&&(t.luckyNumber*=10**Number(a-15))}let i=1;for(;o<4;){const e=rn(n,i);0===e?i*=10:(n+=e,o=nn(n))}return t.luckyPayout=n,a>=16&&(t.luckyPayout*=10**Number(a-15)),t}(d);if(!Game.Has("Lucky digit")){const t=p-d,o=m+t,a=document.createDocumentFragment();a.appendChild(document.createTextNode(`${p.toLocaleString()} / ${o.toLocaleString()} (+${t})`)),e.appendChild(ln("basic",'Next "Lucky Digit" (total / reset)',a))}if(!Game.Has("Lucky number")){const t=u-d,o=m+t,a=document.createDocumentFragment();a.appendChild(document.createTextNode(`${u.toLocaleString()} / ${o.toLocaleString()} (+${t})`)),e.appendChild(ln("basic",'Next "Lucky Number" (total / reset)',a))}if(!Game.Has("Lucky payout")){const t=h-d,o=m+t,a=document.createDocumentFragment();a.appendChild(document.createTextNode(`${h.toLocaleString()} / ${o.toLocaleString()} (+${t})`)),e.appendChild(ln("basic",'Next "Lucky Payout" (total / reset)',a))}return e}()),Game.cpsSucked>0&&(t.appendChild(sn("Wrinklers","Wrink")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Wrink)){const e=document.createDocumentFragment();e.appendChild(document.createTextNode(`${to($e)} / ${to(Ue)} `));const o=document.createElement("a");o.textContent="Pop All Normal",o.className="option",o.onclick=function(){Ra()},e.appendChild(o),t.appendChild(ln("basic","Rewards of Popping (All/Normal)",e));const a=document.createDocumentFragment();a.appendChild(document.createTextNode(`${to(He[0])} `));const n=document.createElement("a");n.textContent="Pop Single Fattest",n.className="option",n.onclick=function(){null!==He[1]&&(Game.wrinklers[He[1]].hp=0)},a.appendChild(n),t.appendChild(ln("basic",`Rewards of Popping Single Fattest Non-Shiny Wrinkler (id: ${null!==He[1]?He[1]:"None"})`,a))}if(t.appendChild(function(){const e=document.createElement("div");e.className="CMStatsSeasonSection";let t=!1;const o=[];Object.keys(ca).forEach((e=>{Game.Has(ca[e])||(o.push(ca[e]),t=!0)}));const a=[];Object.keys(da).forEach((e=>{Game.Has(da[e])||(a.push(da[e]),t=!0)}));const n=[];Object.keys(ma).forEach((e=>{Game.Has(ma[e])||(n.push(ma[e]),t=!0)}));const i=[];Object.keys(Game.eggDrops).forEach((e=>{Game.HasUnlocked(Game.eggDrops[e])||(i.push(Game.eggDrops[e]),t=!0)}));const r=[];Object.keys(Game.rareEggDrops).forEach((e=>{Game.HasUnlocked(Game.rareEggDrops[e])||(r.push(Game.rareEggDrops[e]),t=!0)}));const s=Game.HasUnlocked("Chocolate egg")&&!Game.Has("Chocolate egg"),l=Game.Has("Century egg");if(("christmas"===Game.season||t||s||l)&&(e.appendChild(sn("Season Specials","Sea")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Sea)){if(0!==o.length){e.appendChild(cn(0,"Halloween cookies left to buy",dn(o),"halloween"===Game.season));let t=.95;if(Game.HasAchiev("Spooky cookies")&&(t=.8),Game.Has("Starterror")&&(t*=.9),t*=1/Game.dropRateMult(),Game.hasGod){const e=Game.hasGod("seasons");1===e?t*=.9:2===e?t*=.95:3===e&&(t*=.97)}const a=o.length/7;e.appendChild(cn(0,"Chance of receiving a cookie from wrinkler/shiny wrinkler",document.createTextNode(`${to((1-t)*a*100)}% / ${to((1-.9*t)*a*100)}%`),"halloween"===Game.season))}if(0!==a.length){e.appendChild(cn(0,"Christmas cookies left to buy",dn(a),"christmas"===Game.season));let t=.8;if(Game.HasAchiev("Let it snow")&&(t=.6),t*=1/Game.dropRateMult(),Game.Has("Starsnow")&&(t*=.95),Game.hasGod){const e=Game.hasGod("seasons");1===e?t*=.9:2===e?t*=.95:3===e&&(t*=.97)}const o=a.length/7;e.appendChild(cn(0,"Chance of receiving a cookie from reindeer",document.createTextNode(`${to((1-t)*o*100)}%`),"christmas"===Game.season))}0!==n.length&&e.appendChild(cn(0,"Valentine cookies left to buy",dn(n),"valentines"===Game.season));const t=function(e){let t=e*(1/Game.dropRateMult());if(Game.HasAchiev("Hide & seek champion")&&(t*=.7),Game.Has("Omelette")&&(t*=.9),Game.Has("Starspawn")&&(t*=.9),Game.hasGod){const e=Game.hasGod("seasons");1===e?t*=.9:2===e?t*=.95:3===e&&(t*=.97)}const o=1-t,a=Game.eggDrops.length-i.length,n=Game.rareEggDrops.length-r.length,s=.9*o*(1-a/Game.eggDrops.length),l=.1*o*(1-n/Game.rareEggDrops.length),c=.9*o*(a/Game.eggDrops.length)+.1*o*(n/Game.rareEggDrops.length);return[s+.9*c*(1-a/Game.eggDrops.length),l+.1*c*(1-n/Game.rareEggDrops.length)]};0!==i.length&&(e.appendChild(cn(0,"Normal easter eggs left to unlock",dn(i),"easter"===Game.season)),e.appendChild(cn(0,"Chance of receiving an egg from wrinkler/golden cookie",document.createTextNode(`${to(100*t(.98)[0])}% / ${to(100*t(.9)[0])}%`),"easter"===Game.season))),0!==r.length&&(e.appendChild(cn(0,"Rare easter eggs left to unlock",dn(r),"easter"===Game.season)),e.appendChild(cn(0,"Chance of receiving a rare egg from wrinkler/golden cookie",document.createTextNode(`${to(100*t(.98)[1])}% / ${to(100*t(.9)[1])}%`),"easter"===Game.season))),"christmas"===Game.season&&e.appendChild(cn(0,"Reindeer reward",document.createTextNode(to(Oe)),!0)),s&&e.appendChild(ln("withTooltip","Chocolate egg cookies",document.createTextNode(to(De)),"ChoEggTooltipPlaceholder")),l&&e.appendChild(ln("basic","Century egg multiplier",document.createTextNode(Math.round(1e4*(Ne-1))/100+"%")))}return e}()),t.appendChild(sn("Achievements","Achievs")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Achievs&&Object.keys(Game.Objects).forEach((e=>{const o=je[e];t.appendChild(ln("basic",e,o.AmountNeeded<101?document.createTextNode(`Next achievement in ${o.AmountNeeded}, price: ${to(o.price)}`):document.createTextNode("No new achievement for next 100 buildings")))})),t.appendChild(sn("Miscellaneous","Misc")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Misc){if(t.appendChild(ln("basic",`Average cookies per second (past ${xo[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist]<60?`${xo[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist]} seconds`:xo[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist]/60+(3===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist?" minute":" minutes")})`,document.createTextNode(to(Ro(),3)))),t.appendChild(ln("basic",`Average cookie clicks per second (past ${To[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist]}${0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist?" second":" seconds"})`,document.createTextNode(to(Ve,1)))),t.appendChild(ln("basic",`Cookies from clicking (past ${To[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist]}${0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist?" second":" seconds"})`,document.createTextNode(to(P.calcSum(Ve*To[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist]))))),Game.Has("Fortune cookies")){const e=[];Object.keys(la).forEach((t=>{Game.Has(la[t])||e.push(la[t])})),0!==e.length&&t.appendChild(ln("basic","Fortune Upgrades Left to Buy",dn(e)))}if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ShowMissedGC&&t.appendChild(ln("basic","Missed golden cookies",document.createTextNode(to(Game.missedGoldenClicks)))),Game.prefs.autosave){const e=document.createElement("span");e.id="CMStatsAutosaveTimer",e.innerText=Game.sayTime(60*Game.fps-(Game.OnAscend?0:Game.T%(60*Game.fps)),4),t.appendChild(ln("basic","Time till autosave",e))}}l("menu").insertBefore(t,l("menu").childNodes[2]),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingUpgrades&&l("menu").childNodes.forEach((e=>{if(e.children[0])if("Prestige"===e.children[0].innerHTML&&Xe){const t=Xe.match(new RegExp("div","g")||0).length/2,o=document.createElement("div");o.id="CMMissingUpgradesPrestigeTitle",o.className="listing";const a=document.createElement("div");a.innerHTML=`<b>Missing Prestige upgrades:</b> ${t}/${Game.PrestigeUpgrades.length} (${Math.floor(t/Game.PrestigeUpgrades.length*100)}%)`,o.appendChild(a),e.appendChild(o);const n=document.createElement("div");n.className="listing crateBox",n.innerHTML=Xe,e.appendChild(n)}else if("Upgrades"===e.children[0].innerHTML){if(_e){const t=_e.match(new RegExp("div","g")||0).length/2,o=document.createElement("div");o.id="CMMissingUpgradesTitle",o.className="listing";const a=document.createElement("div");a.innerHTML=`<b>Missing normal upgrades:</b> ${t}/${Game.UpgradesByPool[""].length+Game.UpgradesByPool.tech.length} (${Math.floor(t/(Game.UpgradesByPool[""].length+Game.UpgradesByPool.tech.length)*100)}%)`,o.appendChild(a),e.insertBefore(o,e.childNodes[3]);const n=document.createElement("div");n.className="listing crateBox",n.innerHTML=_e,e.insertBefore(n,document.getElementById("CMMissingUpgradesTitle").nextSibling)}if(Qe){const t=Qe.match(new RegExp("div","g")||0).length/2,o=document.createElement("div");o.id="CMMissingUpgradesCookiesTitle",o.className="listing";const a=document.createElement("div");a.innerHTML=`<b>Missing Cookie upgrades:</b> ${t}/${Game.UpgradesByPool.cookie.length} (${Math.floor(t/Game.UpgradesByPool.cookie.length*100)}%)`,o.appendChild(a),e.appendChild(o);const n=document.createElement("div");n.className="listing crateBox",n.innerHTML=Qe,e.appendChild(n)}}})),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingAchievements&&function(){let e;Object.values(document.querySelectorAll("div.title")).forEach((t=>{t.textContent.includes("Achievements")&&(e=t.parentElement.querySelectorAll("div.listing.crateBox")[0])})),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingAchievements&&Object.values(e.children).forEach((e=>{if(!e.className.includes("enabled")){const t=e.onclick.toString().split(/\[(.*)\]/gi)[1],{icon:o}=Game.AchievementsById[t];e.style.backgroundPosition=`${48*-o[0]}px ${48*-o[1]}px`,e.onmouseover=function(){Game.mouseDown||(Game.setOnCrate(this),Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>function(e){const t=[];"shadow"===e.pool?t.push("Shadow Achievement","#9700cf"):t.push("Achievement",0),t.push("Locked",0);let o=0;(Game.Has("Neuromancy")||Game.sesame&&"debug"===e.pool)&&(o=1),o&&0===e.won?t.push("Click to win!","#00c462"):o&&e.won>0&&t.push("Click to lose!","#00c462");let{icon:a}=e;e.iconFunction&&(a=e.iconFunction());let{desc:n}=e;e.descFunc&&(n=e.descFunc("stats"));let i="";for(let e=0;e<t.length;e+=2)e%2==0&&(i+=` <div class="tag" style="color:${0===t[e+1]?"#fff":t[e+1]};">[${t[e]}]</div>`);return i=i.substring(1),`<div style="padding:8px 4px;min-width:350px;opacity:0.5">\n <div class="icon" style="float:left;margin-left:-8px;margin-top:-8px;background-position:${48*-a[0]}px ${48*-a[1]}px;"></div>\n <div class="name">${e.name}</div>\n ${i}<div class="line"></div><div class="description">${n}</div></div>\n ${Game.sesame?`<div style="font-size:9px;">Id : ${e.id} | Order : ${Math.floor(e.order)}${e.tier?` | Tier : ${e.tier}`:""}</div>`:""}`}(Game.AchievementsById[t])),"top"),Game.tooltip.wobble())}}}))}()}function pn(e){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos){const t=parseInt(l("CMTimerBar").style.height,10);Game.mouseY-=t,e(),Game.mouseY+=t}else e()}function un(){Jt.Beautify=Beautify,Beautify=to,Jt.CalculateGains=Game.CalculateGains,Game.CalculateGains=function(){Jt.CalculateGains(),ce=1,Zt=Date.now(),eo=Date.now()},Jt.tooltip={},Jt.tooltip.draw=Game.tooltip.draw,Jt.tooltip.drawMod=new Function(`return ${Game.tooltip.draw.toString().split("this").join("Game.tooltip")}`)(),Game.tooltip.draw=function(e,t,o){Jt.tooltip.drawMod(e,t,o)},Jt.tooltip.update=Game.tooltip.update,Jt.tooltip.updateMod=new Function(`return ${Game.tooltip.update.toString().split("this.").join("Game.tooltip.")}`)(),Game.tooltip.update=function(){Jt.tooltip.updateMod(),function(){if("store"===Game.tooltip.origin){let e=0;1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLucky&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos&&null!==l("CMDispTooltipWarningParent")&&(e=l("CMDispTooltipWarningParent").clientHeight-4),Game.tooltip.tta.style.top=`${Math.min(parseInt(Game.tooltip.tta.style.top,10),l("game").clientHeight+l("topBar").clientHeight-Game.tooltip.tt.clientHeight-e-46)}px`}}()},Jt.UpdateWrinklers=Game.UpdateWrinklers,Game.UpdateWrinklers=function(){pn(Jt.UpdateWrinklers)},Jt.UpdateSpecial=Game.UpdateSpecial,Game.UpdateSpecial=function(){pn(Jt.UpdateSpecial)},l("bigCookie").removeEventListener("click",Game.ClickCookie,!1),l("bigCookie").addEventListener("click",(e=>{pn((()=>Game.ClickCookie(e,0)))}),!1),Jt.RebuildUpgrades=Game.RebuildUpgrades,Game.RebuildUpgrades=function(){Jt.RebuildUpgrades(),Kt=[],Object.keys(Game.UpgradesInStore).forEach((e=>{null!==l(`upgrade${e}`).onmouseover&&(Kt[e]=l(`upgrade${e}`).onmouseover,l(`upgrade${e}`).onmouseover=function(){Game.mouseDown||(Game.setOnCrate(this),Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("u",`${e}`)),"store"),Game.tooltip.wobble())})})),Game.CalculateGains()},Jt.ClickProduct=Game.ClickProduct,Game.ClickProduct=function(e){(!Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BulkBuyBlock||Game.ObjectsById[e].bulkPrice<=Game.cookies||-1===Game.buyMode)&&Jt.ClickProduct(e)},Jt.DescribeDragonAura=Game.DescribeDragonAura,Game.DescribeDragonAura=function(e){Jt.DescribeDragonAura(e),function(e){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.DragonAuraInfo){const[t,o]=function(e){ta(),l("promptContent").children[0].innerHTML.includes("secondary")?ie=e:ne=e;let t=0;if(ne!==ue||ie!==he)for(let e=Game.ObjectsById.length-1;e>-1;--e)if(Game.ObjectsById[e].amount>0){const o=Ct[Game.ObjectsById[e].name].name;Ct[o].amount-=1,J-=1,t=Ct[o].basePrice*Game.priceIncrease**Math.max(0,Ct[o].amount-1-Ct[o].free),t=Game.modifyBuildingPrice(Ct[o],t),t=Math.ceil(t);break}const o=te;return sa(),ha(),o!==te&&sa(),[me-Game.cookiesPs,t]}(e),a=Uo(o/(t+Game.cookiesPs));let n;n=0===Game.cookiesPs?to(1/0):to(t/Game.cookiesPs*100),l("dragonAuraInfo").style.minHeight="60px",l("dragonAuraInfo").style.margin="8px",l("dragonAuraInfo").appendChild(document.createElement("div")).className="line";const i=document.createElement("div");i.style.minWidth="200px",i.style.textAlign="center",i.textContent=`Picking this aura will change CPS by ${to(t)} (${n}% of current CPS).`,l("dragonAuraInfo").appendChild(i);const r=document.createElement("div");r.style.minWidth="200px",r.style.textAlign="center",r.textContent=`It will take ${a} to recover the cost.`,l("dragonAuraInfo").appendChild(r)}}(e)},Jt.ToggleSpecialMenu=Game.ToggleSpecialMenu,Game.ToggleSpecialMenu=function(e){Jt.ToggleSpecialMenu(e),function(){if(null!==(l("specialPopup").className.match(/onScreen/)&&l("specialPopup").children[0].style.background.match(/dragon/)))for(let e=0;e<l("specialPopup").childNodes.length;e++)"optionBox"===l("specialPopup").childNodes[e].className&&(l("specialPopup").children[e].onmouseover=function(){qa(),Game.tooltip.dynamic=1,Game.tooltip.draw(l("specialPopup"),`<div style="min-width:200px;text-align:center;">${fe}</div>`,"this"),Game.tooltip.wobble()},l("specialPopup").children[e].onmouseout=function(){Game.tooltip.shouldHide=1})}()},Jt.UpdateMenu=Game.UpdateMenu,Game.UpdateMenu=function(){void 0!==s().picker&&void 0!==s().picker.owner||(Jt.UpdateMenu(),function(){const e=document.createElement("div");e.className="title","stats"===Game.onMenu?Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Stats&&(e.textContent="Cookie Monster Statistics",mn(e)):"prefs"===Game.onMenu&&l("menu").childNodes[2].insertBefore(an(),l("menu").childNodes[2].childNodes[l("menu").childNodes[2].childNodes.length-1])}())},Jt.sayTime=Game.sayTime,bo=function(e,t){return Number.isNaN(e)||e<=0?Jt.sayTime(e,t):Uo(e/Game.fps,1)},Jt.Logic=Game.Logic,Game.Logic=function(){Jt.Logic();let e="Cookie Clicker";"fools"===Game.season&&(e="Cookie Baker"),Ao=`${Game.OnAscend?"Ascending! ":""}${to(Game.cookies)} ${1===Game.cookies?"cookie":"cookies"} - ${e}`,function(){if(Game.OnAscend||0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title)document.title=Ao;else if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title){let e,t,o,a=!1,n=!1;e=ct?ct.wrath?`[W${Math.ceil(ct.life/Game.fps)}]`:`[G${Math.ceil(ct.life/Game.fps)}]`:Game.Has("Golden switch [off]")?"[GS]":`[${Number(l("CMTimerBarGCMinBar").textContent)<0?"!":""}${Math.ceil((Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.time)/Game.fps)}]`,Ht&&(a=!0,t="[F]"),"christmas"===Game.season&&(n=!0,o=Ut?`[R${Math.ceil(dt.life/Game.fps)}]`:`[${Number(l("CMTimerBarRenMinBar").textContent)<0?"!":""}${Math.ceil((Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.time)/Game.fps)}]`);let i=Ao;"["===i.charAt(0)&&(i=i.substring(i.lastIndexOf("]")+1)),document.title=`${e+(a?t:"")+(n?o:"")} ${i}`}else if(2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title){let e="",t=!1;ct&&(t=!0,ct.wrath?e+=`[W${Math.ceil(ct.life/Game.fps)}]`:e+=`[G${Math.ceil(ct.life/Game.fps)}]`),Ht&&(t=!0,e+="[F]"),"christmas"===Game.season&&Ut&&(e+=`[R${Math.ceil(dt.life/Game.fps)}]`,t=!0),t&&(e+=" - ");let o="Cookie Clicker";"fools"===Game.season&&(o="Cookie Baker"),e+=o,document.title=e}}(),function(){const e=Math.max(0,Game.HowManyCookiesReset(Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned))+1)-(Game.cookiesEarned+Game.cookiesReset)),t=Game.sayTime((Date.now()-Game.startDate)/1e3*Game.fps,-1);let o=`You've been on this run for <b>${""===t?"not very long":t}</b>.<br>\n <div class="line"></div>`;Game.prestige>0&&(o+=`Your prestige level is currently <b>${to(Game.prestige)}</b>.<br>(CpS +${to(Game.prestige)}%)\n <div class="line"></div>`),o+=q<1?"Ascending now would grant you no prestige.":q<2?"Ascending now would grant you<br><b>1 prestige level</b> (+1% CpS)<br>and <b>1 heavenly chip</b> to spend.":`Ascending now would grant you<br><b>${to(q)} prestige levels</b> (+${to(q)}% CpS)<br>and <b>${to(q)} heavenly chips</b> to spend.`,o+=`<div class="line"></div>\n You need <b>${to(e)} more cookies</b> for the next level.<br>\n ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipAscendButton?`<div class='line'></div>It takes ${mt} to reach the next level and you were making ${to(Pe,2)} chips on average in the last 5 seconds.<br>`:""}`,l("ascendTooltip").innerHTML=o}()}}function hn(){window.CookieMonsterData={},Game.mods.cookieMonsterFramework.listeners.optionsMenu.push(an),Va(),Wa(),Ha(),Nt=Object.keys(Game.mods).length,Qt=document.createElement("style"),Qt.type="text/css",Qt.id="CMCSS",document.head.appendChild(Qt),function(){const e=document.createElement("div");e.id="CMBotBar",e.style.height="69px",e.style.width="100%",e.style.position="absolute",e.style.display="none",e.style.backgroundColor="#262224",e.style.backgroundImage="linear-gradient(to bottom, #4d4548, #000000)",e.style.borderTop="1px solid black",e.style.overflow="auto",e.style.textShadow="-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black";const t=e.appendChild(document.createElement("table"));t.style.width="100%",t.style.textAlign="center",t.style.whiteSpace="nowrap";const o=t.appendChild(document.createElement("tbody")),a=function(e,t){const o=document.createElement("td");return o.style.textAlign="right",o.className=oo+t,o.textContent=e,o},n=o.appendChild(document.createElement("tr"));n.style.fontWeight="bold",n.appendChild(a("CM 2.052.10",ro)),o.appendChild(document.createElement("tr")).appendChild(a("Bonus Income",no)),o.appendChild(document.createElement("tr")).appendChild(a("Payback Period",no)),o.appendChild(document.createElement("tr")).appendChild(a("Time Left",no)),l("wrapper").appendChild(e),Object.keys(Game.Objects).forEach((e=>{Vo(e)}))}(),function(){const e=document.createElement("div");e.id="CMTimerBar",e.style.position="absolute",e.style.display="none",e.style.height="0px",e.style.fontSize="10px",e.style.fontWeight="bold",e.style.backgroundColor="black";const t=zo("CMTimerBarAutosave","Autosave",[{id:"CMTimerBarAutosaveBar",colour:co}]);e.appendChild(t);const o=zo("CMTimerBarGC","Next Cookie",[{id:"CMTimerBarGCMinBar",colour:mo},{id:"CMTimerBarGCBar",colour:co}]);e.appendChild(o);const a=zo("CMTimerBarRen","Next Reindeer",[{id:"CMTimerBarRenMinBar",colour:mo},{id:"CMTimerBarRenBar",colour:so}]);e.appendChild(a);const n=document.createElement("div");n.id="CMTimerBarBuffTimers",e.appendChild(n),l("wrapper").appendChild(e)}(),function(){const e=document.createElement("div");e.id="CMUpgradeBar",e.style.width="100%",e.style.backgroundColor="black",e.style.textAlign="center",e.style.fontWeight="bold",e.style.display="none",e.style.zIndex="21",e.onmouseout=function(){Game.tooltip.hide()};const t=document.createElement("div");t.appendChild(function(){const e=document.createElement("div");e.style.minWidth="330px",e.style.marginBottom="4px";const t=document.createElement("div");t.className="name",t.style.marginBottom="4px",t.textContent="Legend",e.appendChild(t);const o=function(e,t){const o=document.createElement("div");o.style.verticalAlign="middle";const a=document.createElement("span");return a.className=ao+e,a.style.display="inline-block",a.style.height="10px",a.style.width="10px",a.style.marginRight="4px",o.appendChild(a),o.appendChild(document.createTextNode(t)),o};return e.appendChild(o(no,"Better than the best PP of a building option")),e.appendChild(o(io,"Same as the best PP building option")),e.appendChild(o(ro,"Within the top 10 of PP for buildings")),e.appendChild(o(so,"Within the top 20 of PP for buildings")),e.appendChild(o(lo,"Within the top 30 of PP for buildings")),e.appendChild(o(co,"Outside of the top 30 of PP for buildings")),e.appendChild(o(mo,"Negative or infinity PP")),e}()),e.onmouseover=function(){Game.tooltip.draw(this,escape(t.innerHTML),"store")};const o=function(e,t){const o=document.createElement("span");return o.id=e,o.className=oo+t,o.style.width="14.28571428571429%",o.style.display="inline-block",o.textContent="0",o};e.appendChild(o("CMUpgradeBarBlue",no)),e.appendChild(o("CMUpgradeBarGreen",io)),e.appendChild(o("CMUpgradeBarYellow",ro)),e.appendChild(o("CMUpgradeBarOrange",so)),e.appendChild(o("CMUpgradeBarRed",lo)),e.appendChild(o("CMUpgradeBarPurple",co)),e.appendChild(o("CMUpgradeBarGray",mo)),l("upgrades").parentNode.insertBefore(e,l("upgrades").parentNode.childNodes[3])}(),function(){const e=document.createElement("div");e.id="CMSectionHidButtons",e.style.textAlign="center";const t=document.createElement("a");t.className="option",t.onclick=function(){"flex"===l("upgrades").style.display?(l("upgrades").style.display="none",l("toggleUpgrades").style.display="none",l("techUpgrades").style.display="none",l("vaultUpgrades").style.display="none"):(l("upgrades").style.display="flex",0!==l("toggleUpgrades").children.length&&(l("toggleUpgrades").style.display="block"),0!==l("techUpgrades").children.length&&(l("techUpgrades").style.display="block"),0!==l("vaultUpgrades").children.length&&(l("vaultUpgrades").style.display="block"))},t.textContent="Hide/Show Upgrades",e.appendChild(t);const o=document.createElement("a");o.className="option",o.onclick=function(){"grid"===l("products").style.display?l("products").style.display="none":l("products").style.display="grid"},o.textContent="Hide/Show Buildings",e.appendChild(o),l("store").insertBefore(e,l("store").childNodes[2])}(),function(){const e=document.createElement("link");e.id="CMFavicon",e.rel="shortcut icon",e.href="https://orteil.dashnet.org/cookieclicker/favicon.ico",document.getElementsByTagName("head")[0].appendChild(e)}(),Object.keys(go).forEach((e=>{!function(e,t,o){const a=document.createElement("div");a.id=e;const n=document.createElement("div");n.style.minWidth=o,n.style.marginBottom="4px";const i=document.createElement("div");i.style.textAlign="left",i.textContent=t,n.appendChild(i),a.appendChild(n),fo[e]=a}(go[e][0],go[e][1],go[e][2])})),function(){const e=document.createElement("a");e.id="PopAllNormalWrinklerButton",e.textContent="Pop All Normal",e.className="option",e.onclick=function(){Ra()},e.onmouseout=function(){Game.tooltip.shouldHide=1},e.onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("wb","PopAllNormal")),"this"),Game.tooltip.wobble()},l("sectionLeftExtra").children[0].append(e);const t=document.createElement("a");t.id="PopFattestWrinklerButton",t.textContent="Pop Single Fattest",t.className="option",t.onclick=function(){null!==He[1]&&(Game.wrinklers[He[1]].hp=0)},t.onmouseout=function(){Game.tooltip.shouldHide=1},t.onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("wb","PopFattest")),"this"),Game.tooltip.wobble()},l("sectionLeftExtra").children[0].append(t)}(),l("products").style.display="grid",l("storeBulk").style.gridRow="1/1",l("upgrades").style.display="flex",l("upgrades").style["flex-wrap"]="wrap",Object.keys(l("rows").children).forEach((e=>{const t=l("rows").children[e].children[1],o=document.createElement("div");o.id=`productLock${Number(e)+1}`,o.className="productButton",o.innerHTML="Lock",o.onclick=function(){!function(e){"Lock"===l(`productLock${e}`).innerHTML?(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.push(e.toString()),l(`row${e}`).style.pointerEvents="none",l(`row${e}`).style.opacity="0.4",l(`productLock${e}`).innerHTML="Unlock",l(`productLock${e}`).style.pointerEvents="auto"):(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.includes(e.toString())&&(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.filter((t=>t!==e.toString()))),l(`productLock${e}`).innerHTML="Lock",l(`row${e}`).style.pointerEvents="auto",l(`row${e}`).style.opacity="1")}(Number(e)+1)},t.appendChild(o)})),Object.keys(Game.Objects).forEach((e=>{const t=Game.Objects[e];null!==l(`product${t.id}`).onmouseover&&(qt[e]=l(`product${t.id}`).onmouseover,l(`product${t.id}`).onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("b",`${e}`)),"store"),Game.tooltip.wobble()})})),Game.canLumps()&&(Ot=l("lumps").onmouseover,l("lumps").onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("s","Lump")),"this"),Game.tooltip.wobble()}),$t=Game.LoadMinigames,Game.LoadMinigames=function(){$t(),Game.Objects.Farm.minigameLoaded&&(l("gardenTool-1").onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("ha","HarvestAllButton")),"this"),Game.tooltip.wobble()},Array.from(l("gardenPlot").children).forEach((e=>{const t=e.id.slice(-3);e.onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("p",[`${t[0]}`,`${t[2]}`])),"this"),Game.tooltip.wobble()}}))),_a(),function(){if(Game.Objects.Temple.minigameLoaded){for(let e=0;e<11;e+=1)l(`templeGod${e}`).onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("pag",e)),"this"),Game.tooltip.wobble()};for(let e=0;e<3;e+=1)l(`templeSlot${e}`).onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("pas",[e,Game.Objects.Temple.minigame.slot[e]])),"this"),Game.tooltip.wobble()}}}(),Qa()},Game.LoadMinigames(),l("backgroundLeftCanvas").onmouseover=function(){Co=1},l("backgroundLeftCanvas").onmouseout=function(){Co=0,Game.tooltip.hide(),Object.keys(Game.wrinklers).forEach((e=>{yo[e]=0}))},un(),Qa(),Game.CalculateGains(),ko=Game.OnAscend,Game.prefs.popups?Game.Popup("Cookie Monster version 2.052.10 loaded!"):Game.Notify("Cookie Monster version 2.052.10 loaded!","","",1,1),Game.Win("Third-party")}function gn(e,t){if(!Game.Objects.Temple.minigameLoaded)return 0;ta();const{minigame:o}=Game.Objects.Temple,a=o.godsById[e].slot;"0"===a?re=o.slot[t]:"1"===a?se=o.slot[t]:"2"===a&&(le=o.slot[t]),0===t?re=e:1===t?se=e:2===t&&(le=e);const n=te;return sa(),ha(),n!==te&&sa(),me-Game.cookiesPs}function fn(){if(Oo!==Game.OnAscend&&(Oo=Game.OnAscend,Game.OnAscend?(l("game").style.bottom="0px",1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar&&(l("CMBotBar").style.display="none"),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&(l("CMTimerBar").style.display="none")):(en(),qo()),Xo()),!Game.OnAscend&&0===Game.AscendTimer){Nt!==Object.keys(Game.mods).length&&(Va(),Ha(),Nt=Object.keys(Game.mods).length),ce&&($a(!0),Pa(),Game.Has("Golden switch [off]")?(ta(),Mt["Golden switch [off]"].bought=0,sa(),Se=me):Se=Game.cookiesPs,Ga({CacheNoGoldSwitchCookiesPS:Se}),ja(),Wa(),La(),Oa(),qa(),function(){for(let e=0;e<11;e+=1)for(let t=0;t<3;t+=1)kt[e][t]=gn(e,t);Ga({CacheGods:kt})}(),Aa(),function(){let e=0;if(Game.Objects.Bank.minigameLoaded){const t=Game.Objects.Bank.minigame.goods;let o=0;Object.keys(t).forEach((e=>{const a=t[e];o+=a.stock*a.val})),e+=o*Game.cookiesPsRawHighest}e+=function(){let e=0;ta();let t=2;5!==ne&&18!==ne||(t-=1),5!==ie&&18!==ie||(t-=1),ne=5,ie=18;for(let e=0;e<t;++e){let e="Cursor";Object.keys(Ct).forEach((t=>{Ct[t].amount>0&&(e=t)})),Ct[e].amount-=1,J-=1}return Object.keys(Ct).forEach((t=>{const o=Ct[t];e+=Ft(Game.Objects[o.name],Game.Objects[t].basePrice,o.amount,Game.Objects[t].free,o.amount)})),e}(),ft=e,Ga({CacheSellForChoEgg:ft})}(),ce=0);const e=Game.auraMult("Fierce Hoarder")>0;!K&&e?(K=!0,Y=1):K&&!e&&(K=!1,Y=1),Y&&(Ba(),Y=0),function(){Ua(),Sa(),$a(!1),function(){Re=0;let e=0;Object.keys(Game.wrinklers).forEach((t=>{2===Game.wrinklers[t].phase&&(e+=1)}));let t=1;if(Ct.Temple.minigameLoaded){const e=Game.hasGod("scorn");1===e?t*=1.15:2===e?t*=1.1:3===e&&(t*=1.05)}Ie=e,Re=e*(.05*e*1.1)*(.05*Game.Has("Sacrilegious corruption")+1)*(.05*Game.Has("Wrinklerspawn")+1)*t,Ga({CacheCurrWrinklerCount:Ie,CacheCurrWrinklerCPSMult:Re})}(),va(),Da();const e=Game.HowManyCookiesReset(Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned))+1)-(Game.cookiesEarned+Game.cookiesReset);mt=Uo(e/Ro())}(),Ht!==(Game.TickerEffect&&"fortune"===Game.TickerEffect.type)&&(Ht=Game.TickerEffect&&"fortune"===Game.TickerEffect.type,Ht&&(v.createFlash("cookieMonsterMod",3,"FortuneFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FortuneSoundURL,"FortuneSound","FortuneVolume",!1),v.createNotification("cookieMonsterMod","FortuneNotification","Fortune Cookie found","A Fortune Cookie has appeared on the Ticker."))),Ut!==Game.shimmerTypes.reindeer.spawned&&(Ut=Game.shimmerTypes.reindeer.spawned,Object.keys(Game.shimmers).forEach((e=>{Game.shimmers[e].spawnLead&&"reindeer"===Game.shimmers[e].type&&(dt=Game.shimmers[e])})),v.createFlash("cookieMonsterMod",3,"SeaFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SeaSoundURL,"SeaSound","SeaVolume",!1),v.createNotification("cookieMonsterMod","SeaNotification","Reindeer sighted!","A Reindeer has spawned. Click it now!")),Game.Objects.Farm.minigameLoaded&&Rt!==Game.Objects.Farm.minigame.nextStep&&(0!==Rt&&Rt<Date.now()&&(v.createFlash("cookieMonsterMod",3,"GardFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GardSoundURL,"GardSound","GardVolume",!1)),Rt=Game.Objects.Farm.minigame.nextStep),function(){if(Game.Objects["Wizard tower"].minigameLoaded&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GrimoireBar){const{minigame:e}=Game.Objects["Wizard tower"];e.magic<e.magicM?Vt=!1:Vt||(Vt=!0,v.createFlash("cookieMonsterMod",3,"MagicFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MagicSoundURL,"MagicSound","MagicVolume",!1),v.createNotification("cookieMonsterMod","MagicNotification","Magic Meter full","Your Magic Meter is full. Cast a spell!"))}}(),function(){if(Game.elderWrath>0){let e=0;Object.keys(Game.wrinklers).forEach((t=>{2===Game.wrinklers[t].phase&&(e+=1)})),e>Xt?(Xt=e,e===Game.getWrinklersMax()&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxFlash?v.createFlash("cookieMonsterMod",3,"WrinklerMaxFlash",!1):v.createFlash("cookieMonsterMod",3,"WrinklerFlash",!1),e===Game.getWrinklersMax()&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxSound?v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxSoundURL,"WrinklerMaxSound","WrinklerMaxVolume",!1):v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerSoundURL,"WrinklerSound","WrinklerVolume",!1),e===Game.getWrinklersMax()&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxNotification?v.createNotification("cookieMonsterMod","WrinklerMaxNotification","Maximum Wrinklers Reached","You have reached your maximum ammount of wrinklers"):v.createNotification("cookieMonsterMod","WrinklerNotification","A Wrinkler appeared","A new wrinkler has appeared")):Xt=e}}()}_t=0,gt={},Object.keys(Game.shimmers).forEach((e=>{gt[Game.shimmers[e].id]=Game.shimmers[e],Game.shimmers[e].spawnLead&&"golden"===Game.shimmers[e].type&&(ct=Game.shimmers[e],_t+=1)})),Object.keys(Lo).forEach((e=>{void 0===gt[e]&&(Lo[e].parentNode.removeChild(Lo[e]),delete Lo[e])})),It!==Game.shimmerTypes.golden.n?(It=Game.shimmerTypes.golden.n,It&&(zt<_t&&(v.createFlash("cookieMonsterMod",3,"GCFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCSoundURL,"GCSound","GCVolume",!1),v.createNotification("cookieMonsterMod","GCNotification","Golden Cookie Spawned","A Golden Cookie has spawned. Click it now!")),Object.keys(Game.shimmers).forEach((e=>{void 0===Lo[Game.shimmers[e].id]&&function(e){const t=document.createElement("div");t.id=`GCTimer${e.id}`,t.style.width="96px",t.style.height="96px",t.style.position="absolute",t.style.zIndex="10000000001",t.style.textAlign="center",t.style.lineHeight="96px",t.style.fontFamily='"Kavoon", Georgia, serif',t.style.fontSize="35px",t.style.cursor="pointer",t.style.display="block",t.style.pointerEvents="none",0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer&&(t.style.display="none"),t.style.left=e.l.style.left,t.style.top=e.l.style.top,t.onclick=function(){e.pop()},t.onmouseover=function(){e.l.style.filter="brightness(125%) drop-shadow(0px 0px 3px rgba(255,255,255,1))",e.l.style.webkitFilter="brightness(125%) drop-shadow(0px 0px 3px rgba(255,255,255,1))"},t.onmouseout=function(){e.l.style.filter="",e.l.style.webkitFilter=""},Lo[e.id]=t,l("shimmers").appendChild(t)}(Game.shimmers[e])}))),za(),zt=_t,0===_t&&(ct=0)):1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer&&It&&Object.keys(Lo).forEach((e=>{Lo[e].style.opacity=gt[e].l.style.opacity,Lo[e].style.transform=gt[e].l.style.transform,Lo[e].textContent=Math.ceil(gt[e].life/Game.fps)}))}const kn={Favourite:1,Calculation:1,Notation:1,Colours:1,BarsDisplay:1,Tooltip:1,Statistics:1,Notification:1,NotificationGeneral:1,NotificationGC:1,NotificationFC:1,NotificationSea:1,NotificationGard:1,NotificationMagi:1,NotificationWrink:1,NotificationWrinkMax:1,Miscellaneous:1,Lucky:1,Chain:1,Spells:1,Garden:1,Prestige:1,Wrink:1,Sea:1,Achievs:1,Misc:1,infoMenu:1,optionsMenu:1};function Cn(e){Va(),w.loadMod("cookieMonsterMod",e,tn,kn,fn),void 0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames&&(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames=[]),on();for(let e=0;e<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.length;e++){const t=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames[e];l(`row${t}`).style.pointerEvents="none",l(`row${t}`).style.opacity="0.4",l(`productLock${t}`).innerHTML="Unlock",l(`productLock${t}`).style.pointerEvents="auto"}void 0!==Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.version&&"2.052.10"!==Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.version&&(Game.prefs.popups?Game.Popup("A new version of Cookie Monster has been loaded, check out the release notes in the info tab!"):Game.Notify("A new version of Cookie Monster has been loaded, check out the release notes in the info tab!","","",0,1))}const Mn={init:function(){let e=!0;M(),window.cookieMonsterFrameworkData.isInitializing=!0,y("cookieMonsterMod"),Game.version!==Number("2.052")&&(e=confirm("Cookie Monster version 2.052.10 is meant for Game version 2.052. Loading a different version may cause errors. Do you still want to load Cookie Monster?")),e&&(hn(),Game.registerHook("click",ya),Game.registerHook("draw",Ma),Game.registerHook("logic",fn),void 0===Game.modSaveData.cookieMonsterMod&&Cn("{}"))},load:Cn,save:function(){const e=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod;return e.version="2.052.10",JSON.stringify(e)}};"undefined"!=typeof Steam?setTimeout((function(){Game.registerMod("CookieMonster",Mn),window.cookieMonsterFrameworkData.isInitializing=!1}),2e3):(Game.registerMod("CookieMonster",Mn),window.cookieMonsterFrameworkData.isInitializing=!1)})()})(); +(()=>{var e={877:function(e){!function(t,o){"use strict";"object"!=typeof e.exports?o(t):e.exports=t.document?o(t):function(e){if(!e.document)throw new Error("jscolor needs a window with document");return o(e)}}("undefined"!=typeof window?window:this,(function(e){"use strict";var t,o,a,n,i=(n={initialized:!1,instances:[],readyQueue:[],register:function(){void 0!==e&&e.document&&e.document.addEventListener("DOMContentLoaded",n.pub.init,!1)},installBySelector:function(t,o){if(!(o=o?n.node(o):e.document))throw new Error("Missing root node");for(var a=o.querySelectorAll(t),i=new RegExp("(^|\\s)("+n.pub.lookupClass+")(\\s*(\\{[^}]*\\})|\\s|$)","i"),r=0;r<a.length;r+=1){var s,l;if(!(a[r].jscolor&&a[r].jscolor instanceof n.pub)&&(void 0===a[r].type||"color"!=a[r].type.toLowerCase()||!n.isColorAttrSupported)&&(null!==(s=n.getDataAttr(a[r],"jscolor"))||a[r].className&&(l=a[r].className.match(i)))){var c=a[r],d="";null!==s?d=s:l&&(console.warn('Installation using class name is DEPRECATED. Use data-jscolor="" attribute instead.'+n.docsRef),l[4]&&(d=l[4]));var m=null;if(d.trim())try{m=n.parseOptionsStr(d)}catch(e){console.warn(e+"\n"+d)}try{new n.pub(c,m)}catch(e){console.warn(e)}}}},parseOptionsStr:function(e){var t=null;try{t=JSON.parse(e)}catch(o){if(!n.pub.looseJSON)throw new Error("Could not parse jscolor options as JSON: "+o);try{t=new Function("var opts = ("+e+'); return typeof opts === "object" ? opts : {};')()}catch(e){throw new Error("Could not evaluate jscolor options: "+e)}}return t},getInstances:function(){for(var e=[],t=0;t<n.instances.length;t+=1)n.instances[t]&&n.instances[t].targetElement&&e.push(n.instances[t]);return e},createEl:function(t){var o=e.document.createElement(t);return n.setData(o,"gui",!0),o},node:function(t){if(!t)return null;if("string"==typeof t){var o=t,a=null;try{a=e.document.querySelector(o)}catch(e){return console.warn(e),null}return a||console.warn("No element matches the selector: %s",o),a}return n.isNode(t)?t:(console.warn("Invalid node of type %s: %s",typeof t,t),null)},isNode:function(e){return"object"==typeof Node?e instanceof Node:e&&"object"==typeof e&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},nodeName:function(e){return!(!e||!e.nodeName)&&e.nodeName.toLowerCase()},removeChildren:function(e){for(;e.firstChild;)e.removeChild(e.firstChild)},isTextInput:function(e){return e&&"input"===n.nodeName(e)&&"text"===e.type.toLowerCase()},isButton:function(e){if(!e)return!1;var t=n.nodeName(e);return"button"===t||"input"===t&&["button","submit","reset"].indexOf(e.type.toLowerCase())>-1},isButtonEmpty:function(e){switch(n.nodeName(e)){case"input":return!e.value||""===e.value.trim();case"button":return""===e.textContent.trim()}return null},isPassiveEventSupported:function(){var t=!1;try{var o=Object.defineProperty({},"passive",{get:function(){t=!0}});e.addEventListener("testPassive",null,o),e.removeEventListener("testPassive",null,o)}catch(e){}return t}(),isColorAttrSupported:(a=e.document.createElement("input"),!(!a.setAttribute||(a.setAttribute("type","color"),"color"!=a.type.toLowerCase()))),dataProp:"_data_jscolor",setData:function(){var e=arguments[0];if(3===arguments.length){var t=e.hasOwnProperty(n.dataProp)?e[n.dataProp]:e[n.dataProp]={},o=arguments[2];return t[i=arguments[1]]=o,!0}if(2===arguments.length&&"object"==typeof arguments[1]){t=e.hasOwnProperty(n.dataProp)?e[n.dataProp]:e[n.dataProp]={};var a=arguments[1];for(var i in a)a.hasOwnProperty(i)&&(t[i]=a[i]);return!0}throw new Error("Invalid arguments")},removeData:function(){var e=arguments[0];if(!e.hasOwnProperty(n.dataProp))return!0;for(var t=1;t<arguments.length;t+=1){var o=arguments[t];delete e[n.dataProp][o]}return!0},getData:function(e,t,o){if(!e.hasOwnProperty(n.dataProp)){if(void 0===o)return;e[n.dataProp]={}}var a=e[n.dataProp];return a.hasOwnProperty(t)||void 0===o||(a[t]=o),a[t]},getDataAttr:function(e,t){var o="data-"+t;return e.getAttribute(o)},setDataAttr:function(e,t,o){var a="data-"+t;e.setAttribute(a,o)},_attachedGroupEvents:{},attachGroupEvent:function(e,t,o,a){n._attachedGroupEvents.hasOwnProperty(e)||(n._attachedGroupEvents[e]=[]),n._attachedGroupEvents[e].push([t,o,a]),t.addEventListener(o,a,!1)},detachGroupEvents:function(e){if(n._attachedGroupEvents.hasOwnProperty(e)){for(var t=0;t<n._attachedGroupEvents[e].length;t+=1){var o=n._attachedGroupEvents[e][t];o[0].removeEventListener(o[1],o[2],!1)}delete n._attachedGroupEvents[e]}},preventDefault:function(e){e.preventDefault&&e.preventDefault(),e.returnValue=!1},captureTarget:function(e){e.setCapture&&(n._capturedTarget=e,n._capturedTarget.setCapture())},releaseTarget:function(){n._capturedTarget&&(n._capturedTarget.releaseCapture(),n._capturedTarget=null)},triggerEvent:function(t,o,a,i){if(t){var r=null;return"function"==typeof Event?r=new Event(o,{bubbles:a,cancelable:i}):(r=e.document.createEvent("Event")).initEvent(o,a,i),!!r&&(n.setData(r,"internal",!0),t.dispatchEvent(r),!0)}},triggerInputEvent:function(e,t,o,a){e&&n.isTextInput(e)&&n.triggerEvent(e,t,o,a)},eventKey:function(e){var t={9:"Tab",13:"Enter",27:"Escape"};return"string"==typeof e.code?e.code:void 0!==e.keyCode&&t.hasOwnProperty(e.keyCode)?t[e.keyCode]:null},strList:function(e){return e?e.replace(/^\s+|\s+$/g,"").split(/\s+/):[]},hasClass:function(e,t){return!!t&&(void 0!==e.classList?e.classList.contains(t):-1!=(" "+e.className.replace(/\s+/g," ")+" ").indexOf(" "+t+" "))},addClass:function(e,t){var o=n.strList(t);if(void 0===e.classList)for(a=0;a<o.length;a+=1)n.hasClass(e,o[a])||(e.className+=(e.className?" ":"")+o[a]);else for(var a=0;a<o.length;a+=1)e.classList.add(o[a])},removeClass:function(e,t){var o=n.strList(t);if(void 0===e.classList)for(i=0;i<o.length;i+=1){var a=new RegExp("^\\s*"+o[i]+"\\s*|\\s*"+o[i]+"\\s*$|\\s+"+o[i]+"(\\s+)","g");e.className=e.className.replace(a,"$1")}else for(var i=0;i<o.length;i+=1)e.classList.remove(o[i])},getCompStyle:function(t){return(e.getComputedStyle?e.getComputedStyle(t):t.currentStyle)||{}},setStyle:function(e,t,o,a){var i=o?"important":"",r=null;for(var s in t)if(t.hasOwnProperty(s)){var l=null;null===t[s]?(r||(r=n.getData(e,"origStyle")),r&&r.hasOwnProperty(s)&&(l=r[s])):(a&&(r||(r=n.getData(e,"origStyle",{})),r.hasOwnProperty(s)||(r[s]=e.style[s])),l=t[s]),null!==l&&e.style.setProperty(s,l,i)}},hexColor:function(e,t,o){return"#"+(("0"+Math.round(e).toString(16)).substr(-2)+("0"+Math.round(t).toString(16)).substr(-2)+("0"+Math.round(o).toString(16)).substr(-2)).toUpperCase()},hexaColor:function(e,t,o,a){return"#"+(("0"+Math.round(e).toString(16)).substr(-2)+("0"+Math.round(t).toString(16)).substr(-2)+("0"+Math.round(o).toString(16)).substr(-2)+("0"+Math.round(255*a).toString(16)).substr(-2)).toUpperCase()},rgbColor:function(e,t,o){return"rgb("+Math.round(e)+","+Math.round(t)+","+Math.round(o)+")"},rgbaColor:function(e,t,o,a){return"rgba("+Math.round(e)+","+Math.round(t)+","+Math.round(o)+","+Math.round(100*(null==a?1:a))/100+")"},linearGradient:(o=function(){for(var t="linear-gradient",o=["","-webkit-","-moz-","-o-","-ms-"],a=e.document.createElement("div"),n=0;n<o.length;n+=1){var i=o[n]+t,r=i+"(to right, rgba(0,0,0,0), rgba(0,0,0,0))";if(a.style.background=r,a.style.background)return i}return t}(),function(){return o+"("+Array.prototype.join.call(arguments,", ")+")"}),setBorderRadius:function(e,t){n.setStyle(e,{"border-radius":t||"0"})},setBoxShadow:function(e,t){n.setStyle(e,{"box-shadow":t||"none"})},getElementPos:function(e,t){var o=0,a=0,i=e.getBoundingClientRect();if(o=i.left,a=i.top,!t){var r=n.getViewPos();o+=r[0],a+=r[1]}return[o,a]},getElementSize:function(e){return[e.offsetWidth,e.offsetHeight]},getAbsPointerPos:function(e){var t=0,o=0;return void 0!==e.changedTouches&&e.changedTouches.length?(t=e.changedTouches[0].clientX,o=e.changedTouches[0].clientY):"number"==typeof e.clientX&&(t=e.clientX,o=e.clientY),{x:t,y:o}},getRelPointerPos:function(e){var t=(e.target||e.srcElement).getBoundingClientRect(),o=0,a=0;return void 0!==e.changedTouches&&e.changedTouches.length?(o=e.changedTouches[0].clientX,a=e.changedTouches[0].clientY):"number"==typeof e.clientX&&(o=e.clientX,a=e.clientY),{x:o-t.left,y:a-t.top}},getViewPos:function(){var t=e.document.documentElement;return[(e.pageXOffset||t.scrollLeft)-(t.clientLeft||0),(e.pageYOffset||t.scrollTop)-(t.clientTop||0)]},getViewSize:function(){var t=e.document.documentElement;return[e.innerWidth||t.clientWidth,e.innerHeight||t.clientHeight]},RGB_HSV:function(e,t,o){e/=255,t/=255,o/=255;var a=Math.min(Math.min(e,t),o),n=Math.max(Math.max(e,t),o),i=n-a;if(0===i)return[null,0,100*n];var r=e===a?3+(o-t)/i:t===a?5+(e-o)/i:1+(t-e)/i;return[60*(6===r?0:r),i/n*100,100*n]},HSV_RGB:function(e,t,o){var a=o/100*255;if(null===e)return[a,a,a];e/=60,t/=100;var n=Math.floor(e),i=a*(1-t),r=a*(1-t*(n%2?e-n:1-(e-n)));switch(n){case 6:case 0:return[a,r,i];case 1:return[r,a,i];case 2:return[i,a,r];case 3:return[i,r,a];case 4:return[r,i,a];case 5:return[a,i,r]}},parseColorString:function(e){var t,o={rgba:null,format:null};if(t=e.match(/^\W*([0-9A-F]{3,8})\W*$/i)){if(8===t[1].length)o.format="hexa",o.rgba=[parseInt(t[1].substr(0,2),16),parseInt(t[1].substr(2,2),16),parseInt(t[1].substr(4,2),16),parseInt(t[1].substr(6,2),16)/255];else if(6===t[1].length)o.format="hex",o.rgba=[parseInt(t[1].substr(0,2),16),parseInt(t[1].substr(2,2),16),parseInt(t[1].substr(4,2),16),null];else{if(3!==t[1].length)return!1;o.format="hex",o.rgba=[parseInt(t[1].charAt(0)+t[1].charAt(0),16),parseInt(t[1].charAt(1)+t[1].charAt(1),16),parseInt(t[1].charAt(2)+t[1].charAt(2),16),null]}return o}if(t=e.match(/^\W*rgba?\(([^)]*)\)\W*$/i)){var a,n,i,r,s=t[1].split(","),l=/^\s*(\d+|\d*\.\d+|\d+\.\d*)\s*$/;if(s.length>=3&&(a=s[0].match(l))&&(n=s[1].match(l))&&(i=s[2].match(l)))return o.format="rgb",o.rgba=[parseFloat(a[1])||0,parseFloat(n[1])||0,parseFloat(i[1])||0,null],s.length>=4&&(r=s[3].match(l))&&(o.format="rgba",o.rgba[3]=parseFloat(r[1])||0),o}return!1},parsePaletteValue:function(e){var t=[];"string"==typeof e?e.replace(/#[0-9A-F]{3}([0-9A-F]{3})?|rgba?\(([^)]*)\)/gi,(function(e){t.push(e)})):Array.isArray(e)&&(t=e);for(var o=[],a=0;a<t.length;a++){var i=n.parseColorString(t[a]);i&&o.push(i)}return o},containsTranparentColor:function(e){for(var t=0;t<e.length;t++){var o=e[t].rgba[3];if(null!==o&&o<1)return!0}return!1},isAlphaFormat:function(e){switch(e.toLowerCase()){case"hexa":case"rgba":return!0}return!1},scaleCanvasForHighDPR:function(t){var o=e.devicePixelRatio||1;t.width*=o,t.height*=o,t.getContext("2d").scale(o,o)},genColorPreviewCanvas:function(e,t,o,a){var i=Math.round(n.pub.previewSeparator.length),r=n.pub.chessboardSize,s=n.pub.chessboardColor1,l=n.pub.chessboardColor2,c=o||2*r,d=2*r,m=n.createEl("canvas"),p=m.getContext("2d");m.width=c,m.height=d,a&&n.scaleCanvasForHighDPR(m),p.fillStyle=s,p.fillRect(0,0,c,d),p.fillStyle=l;for(var u=0;u<c;u+=2*r)p.fillRect(u,0,r,r),p.fillRect(u+r,r,r,r);e&&(p.fillStyle=e,p.fillRect(0,0,c,d));var h=null;switch(t){case"left":h=0,p.clearRect(0,0,i/2,d);break;case"right":h=c-i,p.clearRect(c-i/2,0,i/2,d)}if(null!==h){p.lineWidth=1;for(var g=0;g<n.pub.previewSeparator.length;g+=1)p.beginPath(),p.strokeStyle=n.pub.previewSeparator[g],p.moveTo(.5+h+g,0),p.lineTo(.5+h+g,d),p.stroke()}return{canvas:m,width:c,height:d}},genColorPreviewGradient:function(e,t,o){var a;return a=t&&o?["to "+{left:"right",right:"left"}[t],e+" 0%",e+" "+o+"px","rgba(0,0,0,0) "+(o+1)+"px","rgba(0,0,0,0) 100%"]:["to right",e+" 0%",e+" 100%"],n.linearGradient.apply(this,a)},redrawPosition:function(){if(n.picker&&n.picker.owner){var e,t,o=n.picker.owner;o.fixed?(e=n.getElementPos(o.targetElement,!0),t=[0,0]):(e=n.getElementPos(o.targetElement),t=n.getViewPos());var a,i,r,s=n.getElementSize(o.targetElement),l=n.getViewSize(),c=n.getPickerDims(o),d=[c.borderW,c.borderH];switch(o.position.toLowerCase()){case"left":a=1,i=0,r=-1;break;case"right":a=1,i=0,r=1;break;case"top":a=0,i=1,r=-1;break;default:a=0,i=1,r=1}var m=(s[i]+d[i])/2;if(o.smartPosition)p=[-t[a]+e[a]+d[a]>l[a]&&-t[a]+e[a]+s[a]/2>l[a]/2&&e[a]+s[a]-d[a]>=0?e[a]+s[a]-d[a]:e[a],-t[i]+e[i]+s[i]+d[i]-m+m*r>l[i]?-t[i]+e[i]+s[i]/2>l[i]/2&&e[i]+s[i]-m-m*r>=0?e[i]+s[i]-m-m*r:e[i]+s[i]-m+m*r:e[i]+s[i]-m+m*r>=0?e[i]+s[i]-m+m*r:e[i]+s[i]-m-m*r];else var p=[e[a],e[i]+s[i]-m+m*r];var u=p[a],h=p[i],g=o.fixed?"fixed":"absolute",f=(p[0]+d[0]>e[0]||p[0]<e[0]+s[0])&&p[1]+d[1]<e[1]+s[1];n._drawPosition(o,u,h,g,f)}},_drawPosition:function(e,t,o,a,i){var r=i?0:e.shadowBlur;n.picker.wrap.style.position=a,n.picker.wrap.style.left=t+"px",n.picker.wrap.style.top=o+"px",n.setBoxShadow(n.picker.boxS,e.shadow?new n.BoxShadow(0,r,e.shadowBlur,0,e.shadowColor):null)},getPickerDims:function(e){var t=2*e.controlBorderWidth+e.width,o=2*e.controlBorderWidth+e.height,a=2*e.controlBorderWidth+2*n.getControlPadding(e)+e.sliderSize;n.getSliderChannel(e)&&(t+=a),e.hasAlphaChannel()&&(t+=a);var i=n.getPaletteDims(e,t);i.height&&(o+=i.height+e.padding),e.closeButton&&(o+=2*e.controlBorderWidth+e.padding+e.buttonHeight);var r=t+2*e.padding,s=o+2*e.padding;return{contentW:t,contentH:o,paddedW:r,paddedH:s,borderW:r+2*e.borderWidth,borderH:s+2*e.borderWidth,palette:i}},getPaletteDims:function(e,t){var o=0,a=0,n=0,i=0,r=0,s=e._palette?e._palette.length:0;return s&&(a=(o=e.paletteCols)>0?Math.ceil(s/o):0,n=Math.max(1,Math.floor((t-(o-1)*e.paletteSpacing)/o)),i=e.paletteHeight?Math.min(e.paletteHeight,n):n),a&&(r=a*i+(a-1)*e.paletteSpacing),{cols:o,rows:a,cellW:n,cellH:i,width:t,height:r}},getControlPadding:function(e){return Math.max(e.padding/2,2*e.pointerBorderWidth+e.pointerThickness-e.controlBorderWidth)},getPadYChannel:function(e){return"v"===e.mode.charAt(1).toLowerCase()?"v":"s"},getSliderChannel:function(e){if(e.mode.length>2)switch(e.mode.charAt(2).toLowerCase()){case"s":return"s";case"v":return"v"}return null},triggerCallback:function(e,t){if(e[t]){var o=null;if("string"==typeof e[t])try{o=new Function(e[t])}catch(e){console.error(e)}else o=e[t];o&&o.call(e)}},triggerGlobal:function(e){for(var t=n.getInstances(),o=0;o<t.length;o+=1)t[o].trigger(e)},_pointerMoveEvent:{mouse:"mousemove",touch:"touchmove"},_pointerEndEvent:{mouse:"mouseup",touch:"touchend"},_pointerOrigin:null,_capturedTarget:null,onDocumentKeyUp:function(e){-1!==["Tab","Escape"].indexOf(n.eventKey(e))&&n.picker&&n.picker.owner&&n.picker.owner.tryHide()},onWindowResize:function(e){n.redrawPosition()},onWindowScroll:function(e){n.redrawPosition()},onParentScroll:function(e){n.picker&&n.picker.owner&&n.picker.owner.tryHide()},onDocumentMouseDown:function(e){var t=e.target||e.srcElement;t.jscolor&&t.jscolor instanceof n.pub?t.jscolor.showOnClick&&!t.disabled&&t.jscolor.show():n.getData(t,"gui")?n.getData(t,"control")&&n.onControlPointerStart(e,t,n.getData(t,"control"),"mouse"):n.picker&&n.picker.owner&&n.picker.owner.tryHide()},onPickerTouchStart:function(e){var t=e.target||e.srcElement;n.getData(t,"control")&&n.onControlPointerStart(e,t,n.getData(t,"control"),"touch")},onControlPointerStart:function(t,o,a,i){var r=n.getData(o,"instance");n.preventDefault(t),n.captureTarget(o);var s=function(e,r){n.attachGroupEvent("drag",e,n._pointerMoveEvent[i],n.onDocumentPointerMove(t,o,a,i,r)),n.attachGroupEvent("drag",e,n._pointerEndEvent[i],n.onDocumentPointerEnd(t,o,a,i))};if(s(e.document,[0,0]),e.parent&&e.frameElement){var l=e.frameElement.getBoundingClientRect(),c=[-l.left,-l.top];s(e.parent.window.document,c)}var d=n.getAbsPointerPos(t),m=n.getRelPointerPos(t);switch(n._pointerOrigin={x:d.x-m.x,y:d.y-m.y},a){case"pad":"v"===n.getSliderChannel(r)&&0===r.channels.v&&r.fromHSVA(null,null,100,null),n.setPad(r,t,0,0);break;case"sld":n.setSld(r,t,0);break;case"asld":n.setASld(r,t,0)}r.trigger("input")},onDocumentPointerMove:function(e,t,o,a,i){return function(e){var a=n.getData(t,"instance");switch(o){case"pad":n.setPad(a,e,i[0],i[1]);break;case"sld":n.setSld(a,e,i[1]);break;case"asld":n.setASld(a,e,i[1])}a.trigger("input")}},onDocumentPointerEnd:function(e,t,o,a){return function(e){var o=n.getData(t,"instance");n.detachGroupEvents("drag"),n.releaseTarget(),o.trigger("input"),o.trigger("change")}},onPaletteSampleClick:function(e){var t=e.currentTarget,o=n.getData(t,"instance"),a=n.getData(t,"color");"any"===o.format.toLowerCase()&&(o._setFormat(a.format),n.isAlphaFormat(o.getFormat())||(a.rgba[3]=1)),null===a.rgba[3]&&(!0===o.paletteSetsAlpha||"auto"===o.paletteSetsAlpha&&o._paletteHasTransparency)&&(a.rgba[3]=1),o.fromRGBA.apply(o,a.rgba),o.trigger("input"),o.trigger("change"),o.hideOnPaletteClick&&o.hide()},setPad:function(e,t,o,a){var i=n.getAbsPointerPos(t),r=o+i.x-n._pointerOrigin.x-e.padding-e.controlBorderWidth,s=a+i.y-n._pointerOrigin.y-e.padding-e.controlBorderWidth,l=r*(360/(e.width-1)),c=100-s*(100/(e.height-1));switch(n.getPadYChannel(e)){case"s":e.fromHSVA(l,c,null,null);break;case"v":e.fromHSVA(l,null,c,null)}},setSld:function(e,t,o){var a=100-(o+n.getAbsPointerPos(t).y-n._pointerOrigin.y-e.padding-e.controlBorderWidth)*(100/(e.height-1));switch(n.getSliderChannel(e)){case"s":e.fromHSVA(null,a,null,null);break;case"v":e.fromHSVA(null,null,a,null)}},setASld:function(e,t,o){var a=1-(o+n.getAbsPointerPos(t).y-n._pointerOrigin.y-e.padding-e.controlBorderWidth)*(1/(e.height-1));if(a<1){var i=e.getFormat();"any"!==e.format.toLowerCase()||n.isAlphaFormat(i)||e._setFormat("hex"===i?"hexa":"rgba")}e.fromHSVA(null,null,null,a)},createPadCanvas:function(){var e={elm:null,draw:null},t=n.createEl("canvas"),o=t.getContext("2d");return e.elm=t,e.draw=function(e,a,n){t.width=e,t.height=a,o.clearRect(0,0,t.width,t.height);var i=o.createLinearGradient(0,0,t.width,0);i.addColorStop(0,"#F00"),i.addColorStop(1/6,"#FF0"),i.addColorStop(2/6,"#0F0"),i.addColorStop(.5,"#0FF"),i.addColorStop(4/6,"#00F"),i.addColorStop(5/6,"#F0F"),i.addColorStop(1,"#F00"),o.fillStyle=i,o.fillRect(0,0,t.width,t.height);var r=o.createLinearGradient(0,0,0,t.height);switch(n.toLowerCase()){case"s":r.addColorStop(0,"rgba(255,255,255,0)"),r.addColorStop(1,"rgba(255,255,255,1)");break;case"v":r.addColorStop(0,"rgba(0,0,0,0)"),r.addColorStop(1,"rgba(0,0,0,1)")}o.fillStyle=r,o.fillRect(0,0,t.width,t.height)},e},createSliderGradient:function(){var e={elm:null,draw:null},t=n.createEl("canvas"),o=t.getContext("2d");return e.elm=t,e.draw=function(e,a,n,i){t.width=e,t.height=a,o.clearRect(0,0,t.width,t.height);var r=o.createLinearGradient(0,0,0,t.height);r.addColorStop(0,n),r.addColorStop(1,i),o.fillStyle=r,o.fillRect(0,0,t.width,t.height)},e},createASliderGradient:function(){var e={elm:null,draw:null},t=n.createEl("canvas"),o=t.getContext("2d");return e.elm=t,e.draw=function(e,a,i){t.width=e,t.height=a,o.clearRect(0,0,t.width,t.height);var r=t.width/2,s=n.pub.chessboardColor1,l=n.pub.chessboardColor2;if(o.fillStyle=s,o.fillRect(0,0,t.width,t.height),r>0)for(var c=0;c<t.height;c+=2*r)o.fillStyle=l,o.fillRect(0,c,r,r),o.fillRect(r,c+r,r,r);var d=o.createLinearGradient(0,0,0,t.height);d.addColorStop(0,i),d.addColorStop(1,"rgba(0,0,0,0)"),o.fillStyle=d,o.fillRect(0,0,t.width,t.height)},e},BoxShadow:(t=function(e,t,o,a,n,i){this.hShadow=e,this.vShadow=t,this.blur=o,this.spread=a,this.color=n,this.inset=!!i},t.prototype.toString=function(){var e=[Math.round(this.hShadow)+"px",Math.round(this.vShadow)+"px",Math.round(this.blur)+"px",Math.round(this.spread)+"px",this.color];return this.inset&&e.push("inset"),e.join(" ")},t),flags:{leaveValue:1,leaveAlpha:2,leavePreview:4},enumOpts:{format:["auto","any","hex","hexa","rgb","rgba"],previewPosition:["left","right"],mode:["hsv","hvs","hs","hv"],position:["left","right","top","bottom"],alphaChannel:["auto",!0,!1],paletteSetsAlpha:["auto",!0,!1]},deprecatedOpts:{styleElement:"previewElement",onFineChange:"onInput",overwriteImportant:"forceStyle",closable:"closeButton",insetWidth:"controlBorderWidth",insetColor:"controlBorderColor",refine:null},docsRef:" See https://jscolor.com/docs/",pub:function(t,o){var a=this;function i(e,t){if("string"!=typeof e)throw new Error("Invalid value for option name: "+e);if(n.enumOpts.hasOwnProperty(e)&&("string"==typeof t&&(t=t.toLowerCase()),-1===n.enumOpts[e].indexOf(t)))throw new Error("Option '"+e+"' has invalid value: "+t);if(n.deprecatedOpts.hasOwnProperty(e)){var o=e,i=n.deprecatedOpts[e];if(!i)throw new Error("Option '"+e+"' is DEPRECATED");console.warn("Option '%s' is DEPRECATED, using '%s' instead."+n.docsRef,o,i),e=i}var r="set__"+e;if("function"==typeof a[r])return a[r](t),!0;if(e in a)return a[e]=t,!0;throw new Error("Unrecognized configuration option: "+e)}function r(e){if("string"!=typeof e)throw new Error("Invalid value for option name: "+e);if(n.deprecatedOpts.hasOwnProperty(e)){var t=e,o=n.deprecatedOpts[e];if(!o)throw new Error("Option '"+e+"' is DEPRECATED");console.warn("Option '%s' is DEPRECATED, using '%s' instead."+n.docsRef,t,o),e=o}var i="get__"+e;if("function"==typeof a[i])return a[i](value);if(e in a)return a[e];throw new Error("Unrecognized configuration option: "+e)}function s(){a._processParentElementsInDOM(),n.picker||(n.picker={owner:null,wrap:n.createEl("div"),box:n.createEl("div"),boxS:n.createEl("div"),boxB:n.createEl("div"),pad:n.createEl("div"),padB:n.createEl("div"),padM:n.createEl("div"),padCanvas:n.createPadCanvas(),cross:n.createEl("div"),crossBY:n.createEl("div"),crossBX:n.createEl("div"),crossLY:n.createEl("div"),crossLX:n.createEl("div"),sld:n.createEl("div"),sldB:n.createEl("div"),sldM:n.createEl("div"),sldGrad:n.createSliderGradient(),sldPtrS:n.createEl("div"),sldPtrIB:n.createEl("div"),sldPtrMB:n.createEl("div"),sldPtrOB:n.createEl("div"),asld:n.createEl("div"),asldB:n.createEl("div"),asldM:n.createEl("div"),asldGrad:n.createASliderGradient(),asldPtrS:n.createEl("div"),asldPtrIB:n.createEl("div"),asldPtrMB:n.createEl("div"),asldPtrOB:n.createEl("div"),pal:n.createEl("div"),btn:n.createEl("div"),btnT:n.createEl("span")},n.picker.pad.appendChild(n.picker.padCanvas.elm),n.picker.padB.appendChild(n.picker.pad),n.picker.cross.appendChild(n.picker.crossBY),n.picker.cross.appendChild(n.picker.crossBX),n.picker.cross.appendChild(n.picker.crossLY),n.picker.cross.appendChild(n.picker.crossLX),n.picker.padB.appendChild(n.picker.cross),n.picker.box.appendChild(n.picker.padB),n.picker.box.appendChild(n.picker.padM),n.picker.sld.appendChild(n.picker.sldGrad.elm),n.picker.sldB.appendChild(n.picker.sld),n.picker.sldB.appendChild(n.picker.sldPtrOB),n.picker.sldPtrOB.appendChild(n.picker.sldPtrMB),n.picker.sldPtrMB.appendChild(n.picker.sldPtrIB),n.picker.sldPtrIB.appendChild(n.picker.sldPtrS),n.picker.box.appendChild(n.picker.sldB),n.picker.box.appendChild(n.picker.sldM),n.picker.asld.appendChild(n.picker.asldGrad.elm),n.picker.asldB.appendChild(n.picker.asld),n.picker.asldB.appendChild(n.picker.asldPtrOB),n.picker.asldPtrOB.appendChild(n.picker.asldPtrMB),n.picker.asldPtrMB.appendChild(n.picker.asldPtrIB),n.picker.asldPtrIB.appendChild(n.picker.asldPtrS),n.picker.box.appendChild(n.picker.asldB),n.picker.box.appendChild(n.picker.asldM),n.picker.box.appendChild(n.picker.pal),n.picker.btn.appendChild(n.picker.btnT),n.picker.box.appendChild(n.picker.btn),n.picker.boxB.appendChild(n.picker.box),n.picker.wrap.appendChild(n.picker.boxS),n.picker.wrap.appendChild(n.picker.boxB),n.picker.wrap.addEventListener("touchstart",n.onPickerTouchStart,!!n.isPassiveEventSupported&&{passive:!1}));var t,o,i=n.picker,r=!!n.getSliderChannel(a),s=a.hasAlphaChannel(),m=n.getPickerDims(a),p=2*a.pointerBorderWidth+a.pointerThickness+2*a.crossSize,u=n.getControlPadding(a),h=Math.min(a.borderRadius,Math.round(a.padding*Math.PI));i.wrap.className="jscolor-picker-wrap",i.wrap.style.clear="both",i.wrap.style.width=m.borderW+"px",i.wrap.style.height=m.borderH+"px",i.wrap.style.zIndex=a.zIndex,i.box.className="jscolor-picker",i.box.style.width=m.paddedW+"px",i.box.style.height=m.paddedH+"px",i.box.style.position="relative",i.boxS.className="jscolor-picker-shadow",i.boxS.style.position="absolute",i.boxS.style.left="0",i.boxS.style.top="0",i.boxS.style.width="100%",i.boxS.style.height="100%",n.setBorderRadius(i.boxS,h+"px"),i.boxB.className="jscolor-picker-border",i.boxB.style.position="relative",i.boxB.style.border=a.borderWidth+"px solid",i.boxB.style.borderColor=a.borderColor,i.boxB.style.background=a.backgroundColor,n.setBorderRadius(i.boxB,h+"px"),i.padM.style.background="rgba(255,0,0,.2)",i.sldM.style.background="rgba(0,255,0,.2)",i.asldM.style.background="rgba(0,0,255,.2)",i.padM.style.opacity=i.sldM.style.opacity=i.asldM.style.opacity="0",i.pad.style.position="relative",i.pad.style.width=a.width+"px",i.pad.style.height=a.height+"px",i.padCanvas.draw(a.width,a.height,n.getPadYChannel(a)),i.padB.style.position="absolute",i.padB.style.left=a.padding+"px",i.padB.style.top=a.padding+"px",i.padB.style.border=a.controlBorderWidth+"px solid",i.padB.style.borderColor=a.controlBorderColor,i.padM.style.position="absolute",i.padM.style.left="0px",i.padM.style.top="0px",i.padM.style.width=a.padding+2*a.controlBorderWidth+a.width+u+"px",i.padM.style.height=2*a.controlBorderWidth+2*a.padding+a.height+"px",i.padM.style.cursor="crosshair",n.setData(i.padM,{instance:a,control:"pad"}),i.cross.style.position="absolute",i.cross.style.left=i.cross.style.top="0",i.cross.style.width=i.cross.style.height=p+"px",i.crossBY.style.position=i.crossBX.style.position="absolute",i.crossBY.style.background=i.crossBX.style.background=a.pointerBorderColor,i.crossBY.style.width=i.crossBX.style.height=2*a.pointerBorderWidth+a.pointerThickness+"px",i.crossBY.style.height=i.crossBX.style.width=p+"px",i.crossBY.style.left=i.crossBX.style.top=Math.floor(p/2)-Math.floor(a.pointerThickness/2)-a.pointerBorderWidth+"px",i.crossBY.style.top=i.crossBX.style.left="0",i.crossLY.style.position=i.crossLX.style.position="absolute",i.crossLY.style.background=i.crossLX.style.background=a.pointerColor,i.crossLY.style.height=i.crossLX.style.width=p-2*a.pointerBorderWidth+"px",i.crossLY.style.width=i.crossLX.style.height=a.pointerThickness+"px",i.crossLY.style.left=i.crossLX.style.top=Math.floor(p/2)-Math.floor(a.pointerThickness/2)+"px",i.crossLY.style.top=i.crossLX.style.left=a.pointerBorderWidth+"px",i.sld.style.overflow="hidden",i.sld.style.width=a.sliderSize+"px",i.sld.style.height=a.height+"px",i.sldGrad.draw(a.sliderSize,a.height,"#000","#000"),i.sldB.style.display=r?"block":"none",i.sldB.style.position="absolute",i.sldB.style.left=a.padding+a.width+2*a.controlBorderWidth+2*u+"px",i.sldB.style.top=a.padding+"px",i.sldB.style.border=a.controlBorderWidth+"px solid",i.sldB.style.borderColor=a.controlBorderColor,i.sldM.style.display=r?"block":"none",i.sldM.style.position="absolute",i.sldM.style.left=a.padding+a.width+2*a.controlBorderWidth+u+"px",i.sldM.style.top="0px",i.sldM.style.width=a.sliderSize+2*u+2*a.controlBorderWidth+(s?0:Math.max(0,a.padding-u))+"px",i.sldM.style.height=2*a.controlBorderWidth+2*a.padding+a.height+"px",i.sldM.style.cursor="default",n.setData(i.sldM,{instance:a,control:"sld"}),i.sldPtrIB.style.border=i.sldPtrOB.style.border=a.pointerBorderWidth+"px solid "+a.pointerBorderColor,i.sldPtrOB.style.position="absolute",i.sldPtrOB.style.left=-(2*a.pointerBorderWidth+a.pointerThickness)+"px",i.sldPtrOB.style.top="0",i.sldPtrMB.style.border=a.pointerThickness+"px solid "+a.pointerColor,i.sldPtrS.style.width=a.sliderSize+"px",i.sldPtrS.style.height=n.pub.sliderInnerSpace+"px",i.asld.style.overflow="hidden",i.asld.style.width=a.sliderSize+"px",i.asld.style.height=a.height+"px",i.asldGrad.draw(a.sliderSize,a.height,"#000"),i.asldB.style.display=s?"block":"none",i.asldB.style.position="absolute",i.asldB.style.left=a.padding+a.width+2*a.controlBorderWidth+u+(r?a.sliderSize+3*u+2*a.controlBorderWidth:0)+"px",i.asldB.style.top=a.padding+"px",i.asldB.style.border=a.controlBorderWidth+"px solid",i.asldB.style.borderColor=a.controlBorderColor,i.asldM.style.display=s?"block":"none",i.asldM.style.position="absolute",i.asldM.style.left=a.padding+a.width+2*a.controlBorderWidth+u+(r?a.sliderSize+2*u+2*a.controlBorderWidth:0)+"px",i.asldM.style.top="0px",i.asldM.style.width=a.sliderSize+2*u+2*a.controlBorderWidth+Math.max(0,a.padding-u)+"px",i.asldM.style.height=2*a.controlBorderWidth+2*a.padding+a.height+"px",i.asldM.style.cursor="default",n.setData(i.asldM,{instance:a,control:"asld"}),i.asldPtrIB.style.border=i.asldPtrOB.style.border=a.pointerBorderWidth+"px solid "+a.pointerBorderColor,i.asldPtrOB.style.position="absolute",i.asldPtrOB.style.left=-(2*a.pointerBorderWidth+a.pointerThickness)+"px",i.asldPtrOB.style.top="0",i.asldPtrMB.style.border=a.pointerThickness+"px solid "+a.pointerColor,i.asldPtrS.style.width=a.sliderSize+"px",i.asldPtrS.style.height=n.pub.sliderInnerSpace+"px",i.pal.className="jscolor-palette",i.pal.style.display=m.palette.rows?"block":"none",i.pal.style.position="absolute",i.pal.style.left=a.padding+"px",i.pal.style.top=2*a.controlBorderWidth+2*a.padding+a.height+"px",i.pal.innerHTML="";for(var g=n.genColorPreviewCanvas("rgba(0,0,0,0)"),f=0,k=0;k<m.palette.rows;k++)for(var C=0;C<m.palette.cols&&f<a._palette.length;C++,f++){var M=a._palette[f],y=n.rgbaColor.apply(null,M.rgba),b=n.createEl("div");b.style.width=m.palette.cellW-2*a.controlBorderWidth+"px",b.style.height=m.palette.cellH-2*a.controlBorderWidth+"px",b.style.backgroundColor=y;var G=n.createEl("div");G.className="jscolor-palette-sample",G.style.display="block",G.style.position="absolute",G.style.left=(m.palette.cols<=1?0:Math.round(C*((m.contentW-m.palette.cellW)/(m.palette.cols-1))*10)/10)+"px",G.style.top=k*(m.palette.cellH+a.paletteSpacing)+"px",G.style.border=a.controlBorderWidth+"px solid",G.style.borderColor=a.controlBorderColor,G.style.cursor="pointer",null!==M.rgba[3]&&M.rgba[3]<1&&(G.style.backgroundImage="url('"+g.canvas.toDataURL()+"')",G.style.backgroundRepeat="repeat",G.style.backgroundPosition="center center"),n.setData(G,{instance:a,control:"palette-sample",color:M}),G.addEventListener("click",n.onPaletteSampleClick,!1),G.appendChild(b),i.pal.appendChild(G)}i.btn.className="jscolor-btn-close",i.btn.style.display=a.closeButton?"block":"none",i.btn.style.position="absolute",i.btn.style.left=a.padding+"px",i.btn.style.bottom=a.padding+"px",i.btn.style.padding="0 15px",i.btn.style.maxWidth=m.contentW-2*a.controlBorderWidth-30+"px",i.btn.style.overflow="hidden",i.btn.style.height=a.buttonHeight+"px",i.btn.style.whiteSpace="nowrap",i.btn.style.border=a.controlBorderWidth+"px solid",o=(t=a.controlBorderColor.split(/\s+/)).length<2?t[0]:t[1]+" "+t[0]+" "+t[0]+" "+t[1],i.btn.style.borderColor=o,i.btn.style.color=a.buttonColor,i.btn.style.font="12px sans-serif",i.btn.style.textAlign="center",i.btn.style.cursor="pointer",i.btn.onmousedown=function(){a.hide()},i.btnT.style.lineHeight=a.buttonHeight+"px",i.btnT.innerHTML="",i.btnT.appendChild(e.document.createTextNode(a.closeText)),l(),c(),d(),n.picker.owner&&n.picker.owner!==a&&n.removeClass(n.picker.owner.targetElement,n.pub.activeClassName),n.picker.owner=a,a.container===e.document.body?n.redrawPosition():n._drawPosition(a,0,0,"relative",!1),i.wrap.parentNode!==a.container&&a.container.appendChild(i.wrap),n.addClass(a.targetElement,n.pub.activeClassName)}function l(){var e=n.getPadYChannel(a),t=Math.round(a.channels.h/360*(a.width-1)),o=Math.round((1-a.channels[e]/100)*(a.height-1)),i=2*a.pointerBorderWidth+a.pointerThickness+2*a.crossSize,r=-Math.floor(i/2);switch(n.picker.cross.style.left=t+r+"px",n.picker.cross.style.top=o+r+"px",n.getSliderChannel(a)){case"s":var s=n.HSV_RGB(a.channels.h,100,a.channels.v),l=n.HSV_RGB(a.channels.h,0,a.channels.v),c="rgb("+Math.round(s[0])+","+Math.round(s[1])+","+Math.round(s[2])+")",d="rgb("+Math.round(l[0])+","+Math.round(l[1])+","+Math.round(l[2])+")";n.picker.sldGrad.draw(a.sliderSize,a.height,c,d);break;case"v":var m=n.HSV_RGB(a.channels.h,a.channels.s,100);c="rgb("+Math.round(m[0])+","+Math.round(m[1])+","+Math.round(m[2])+")",d="#000",n.picker.sldGrad.draw(a.sliderSize,a.height,c,d)}n.picker.asldGrad.draw(a.sliderSize,a.height,a.toHEXString())}function c(){var e=n.getSliderChannel(a);if(e){var t=Math.round((1-a.channels[e]/100)*(a.height-1));n.picker.sldPtrOB.style.top=t-(2*a.pointerBorderWidth+a.pointerThickness)-Math.floor(n.pub.sliderInnerSpace/2)+"px"}n.picker.asldGrad.draw(a.sliderSize,a.height,a.toHEXString())}function d(){var e=Math.round((1-a.channels.a)*(a.height-1));n.picker.asldPtrOB.style.top=e-(2*a.pointerBorderWidth+a.pointerThickness)-Math.floor(n.pub.sliderInnerSpace/2)+"px"}function m(){return n.picker&&n.picker.owner===a}if(o||(o={}),this.channels={r:255,g:255,b:255,h:0,s:0,v:100,a:1},this.format="auto",this.value=void 0,this.alpha=void 0,this.random=!1,this.onChange=void 0,this.onInput=void 0,this.valueElement=void 0,this.alphaElement=void 0,this.previewElement=void 0,this.previewPosition="left",this.previewSize=32,this.previewPadding=8,this.required=!0,this.hash=!0,this.uppercase=!0,this.forceStyle=!0,this.width=181,this.height=101,this.mode="HSV",this.alphaChannel="auto",this.position="bottom",this.smartPosition=!0,this.showOnClick=!0,this.hideOnLeave=!0,this.palette=[],this.paletteCols=10,this.paletteSetsAlpha="auto",this.paletteHeight=16,this.paletteSpacing=4,this.hideOnPaletteClick=!1,this.sliderSize=16,this.crossSize=8,this.closeButton=!1,this.closeText="Close",this.buttonColor="rgba(0,0,0,1)",this.buttonHeight=18,this.padding=12,this.backgroundColor="rgba(255,255,255,1)",this.borderWidth=1,this.borderColor="rgba(187,187,187,1)",this.borderRadius=8,this.controlBorderWidth=1,this.controlBorderColor="rgba(187,187,187,1)",this.shadow=!0,this.shadowBlur=15,this.shadowColor="rgba(0,0,0,0.2)",this.pointerColor="rgba(76,76,76,1)",this.pointerBorderWidth=1,this.pointerBorderColor="rgba(255,255,255,1)",this.pointerThickness=2,this.zIndex=5e3,this.container=void 0,this.minS=0,this.maxS=100,this.minV=0,this.maxV=100,this.minA=0,this.maxA=1,this.option=function(){if(!arguments.length)throw new Error("No option specified");if(1===arguments.length&&"string"==typeof arguments[0]){try{return r(arguments[0])}catch(e){console.warn(e)}return!1}if(arguments.length>=2&&"string"==typeof arguments[0]){try{if(!i(arguments[0],arguments[1]))return!1}catch(e){return console.warn(e),!1}return this.redraw(),this.exposeColor(),!0}if(1===arguments.length&&"object"==typeof arguments[0]){var e=arguments[0],t=!0;for(var o in e)if(e.hasOwnProperty(o))try{i(o,e[o])||(t=!1)}catch(e){console.warn(e),t=!1}return this.redraw(),this.exposeColor(),t}throw new Error("Invalid arguments")},this.channel=function(e,t){if("string"!=typeof e)throw new Error("Invalid value for channel name: "+e);if(void 0===t)return this.channels.hasOwnProperty(e.toLowerCase())?this.channels[e.toLowerCase()]:(console.warn("Getting unknown channel: "+e),!1);var o=!1;switch(e.toLowerCase()){case"r":o=this.fromRGBA(t,null,null,null);break;case"g":o=this.fromRGBA(null,t,null,null);break;case"b":o=this.fromRGBA(null,null,t,null);break;case"h":o=this.fromHSVA(t,null,null,null);break;case"s":o=this.fromHSVA(null,t,null,null);break;case"v":o=this.fromHSVA(null,null,t,null);break;case"a":o=this.fromHSVA(null,null,null,t);break;default:return console.warn("Setting unknown channel: "+e),!1}return!!o&&(this.redraw(),!0)},this.trigger=function(e){for(var t=n.strList(e),o=0;o<t.length;o+=1){var a=t[o].toLowerCase(),i=null;switch(a){case"input":i="onInput";break;case"change":i="onChange"}i&&n.triggerCallback(this,i),n.triggerInputEvent(this.valueElement,a,!0,!0)}},this.fromHSVA=function(e,t,o,a,i){if(void 0===e&&(e=null),void 0===t&&(t=null),void 0===o&&(o=null),void 0===a&&(a=null),null!==e){if(isNaN(e))return!1;this.channels.h=Math.max(0,Math.min(360,e))}if(null!==t){if(isNaN(t))return!1;this.channels.s=Math.max(0,Math.min(100,this.maxS,t),this.minS)}if(null!==o){if(isNaN(o))return!1;this.channels.v=Math.max(0,Math.min(100,this.maxV,o),this.minV)}if(null!==a){if(isNaN(a))return!1;this.channels.a=this.hasAlphaChannel()?Math.max(0,Math.min(1,this.maxA,a),this.minA):1}var r=n.HSV_RGB(this.channels.h,this.channels.s,this.channels.v);return this.channels.r=r[0],this.channels.g=r[1],this.channels.b=r[2],this.exposeColor(i),!0},this.fromRGBA=function(e,t,o,a,i){if(void 0===e&&(e=null),void 0===t&&(t=null),void 0===o&&(o=null),void 0===a&&(a=null),null!==e){if(isNaN(e))return!1;e=Math.max(0,Math.min(255,e))}if(null!==t){if(isNaN(t))return!1;t=Math.max(0,Math.min(255,t))}if(null!==o){if(isNaN(o))return!1;o=Math.max(0,Math.min(255,o))}if(null!==a){if(isNaN(a))return!1;this.channels.a=this.hasAlphaChannel()?Math.max(0,Math.min(1,this.maxA,a),this.minA):1}var r=n.RGB_HSV(null===e?this.channels.r:e,null===t?this.channels.g:t,null===o?this.channels.b:o);null!==r[0]&&(this.channels.h=Math.max(0,Math.min(360,r[0]))),0!==r[2]&&(this.channels.s=Math.max(0,this.minS,Math.min(100,this.maxS,r[1]))),this.channels.v=Math.max(0,this.minV,Math.min(100,this.maxV,r[2]));var s=n.HSV_RGB(this.channels.h,this.channels.s,this.channels.v);return this.channels.r=s[0],this.channels.g=s[1],this.channels.b=s[2],this.exposeColor(i),!0},this.fromHSV=function(e,t,o,a){return console.warn("fromHSV() method is DEPRECATED. Using fromHSVA() instead."+n.docsRef),this.fromHSVA(e,t,o,null,a)},this.fromRGB=function(e,t,o,a){return console.warn("fromRGB() method is DEPRECATED. Using fromRGBA() instead."+n.docsRef),this.fromRGBA(e,t,o,null,a)},this.fromString=function(e,t){if(!this.required&&""===e.trim())return this.setPreviewElementBg(null),this.setValueElementValue(""),!0;var o=n.parseColorString(e);return!!o&&("any"===this.format.toLowerCase()&&(this._setFormat(o.format),n.isAlphaFormat(this.getFormat())||(o.rgba[3]=1)),this.fromRGBA(o.rgba[0],o.rgba[1],o.rgba[2],o.rgba[3],t),!0)},this.randomize=function(e,t,o,a,n,i,r,s){void 0===e&&(e=0),void 0===t&&(t=100),void 0===o&&(o=0),void 0===a&&(a=100),void 0===n&&(n=0),void 0===i&&(i=359),void 0===r&&(r=1),void 0===s&&(s=1),this.fromHSVA(n+Math.floor(Math.random()*(i-n+1)),o+Math.floor(Math.random()*(a-o+1)),e+Math.floor(Math.random()*(t-e+1)),(100*r+Math.floor(Math.random()*(100*(s-r)+1)))/100)},this.toString=function(e){switch(void 0===e&&(e=this.getFormat()),e.toLowerCase()){case"hex":return this.toHEXString();case"hexa":return this.toHEXAString();case"rgb":return this.toRGBString();case"rgba":return this.toRGBAString()}return!1},this.toHEXString=function(){return n.hexColor(this.channels.r,this.channels.g,this.channels.b)},this.toHEXAString=function(){return n.hexaColor(this.channels.r,this.channels.g,this.channels.b,this.channels.a)},this.toRGBString=function(){return n.rgbColor(this.channels.r,this.channels.g,this.channels.b)},this.toRGBAString=function(){return n.rgbaColor(this.channels.r,this.channels.g,this.channels.b,this.channels.a)},this.toGrayscale=function(){return.213*this.channels.r+.715*this.channels.g+.072*this.channels.b},this.toCanvas=function(){return n.genColorPreviewCanvas(this.toRGBAString()).canvas},this.toDataURL=function(){return this.toCanvas().toDataURL()},this.toBackground=function(){return n.pub.background(this.toRGBAString())},this.isLight=function(){return this.toGrayscale()>127.5},this.hide=function(){m()&&(n.removeClass(a.targetElement,n.pub.activeClassName),n.picker.wrap.parentNode.removeChild(n.picker.wrap),delete n.picker.owner)},this.show=function(){s()},this.redraw=function(){m()&&s()},this.getFormat=function(){return this._currentFormat},this._setFormat=function(e){this._currentFormat=e.toLowerCase()},this.hasAlphaChannel=function(){return"auto"===this.alphaChannel?"any"===this.format.toLowerCase()||n.isAlphaFormat(this.getFormat())||void 0!==this.alpha||void 0!==this.alphaElement:this.alphaChannel},this.processValueInput=function(e){this.fromString(e)||this.exposeColor()},this.processAlphaInput=function(e){this.fromHSVA(null,null,null,parseFloat(e))||this.exposeColor()},this.exposeColor=function(e){var t=this.toString(),o=this.getFormat();if(n.setDataAttr(this.targetElement,"current-color",t),e&n.flags.leaveValue||!this.valueElement||("hex"!==o&&"hexa"!==o||(this.uppercase||(t=t.toLowerCase()),this.hash||(t=t.replace(/^#/,""))),this.setValueElementValue(t)),!(e&n.flags.leaveAlpha)&&this.alphaElement){var a=Math.round(100*this.channels.a)/100;this.setAlphaElementValue(a)}e&n.flags.leavePreview||!this.previewElement||((n.isTextInput(this.previewElement)||n.isButton(this.previewElement)&&!n.isButtonEmpty(this.previewElement))&&this.previewPosition,this.setPreviewElementBg(this.toRGBAString())),m()&&(l(),c(),d())},this.setPreviewElementBg=function(e){if(this.previewElement){var t=null,o=null;(n.isTextInput(this.previewElement)||n.isButton(this.previewElement)&&!n.isButtonEmpty(this.previewElement))&&(t=this.previewPosition,o=this.previewSize);var a=[];if(e){a.push({image:n.genColorPreviewGradient(e,t,o?o-n.pub.previewSeparator.length:null),position:"left top",size:"auto",repeat:t?"repeat-y":"repeat",origin:"padding-box"});var i=n.genColorPreviewCanvas("rgba(0,0,0,0)",t?{left:"right",right:"left"}[t]:null,o,!0);a.push({image:"url('"+i.canvas.toDataURL()+"')",position:(t||"left")+" top",size:i.width+"px "+i.height+"px",repeat:t?"repeat-y":"repeat",origin:"padding-box"})}else a.push({image:"none",position:"left top",size:"auto",repeat:"no-repeat",origin:"padding-box"});for(var r={image:[],position:[],size:[],repeat:[],origin:[]},s=0;s<a.length;s+=1)r.image.push(a[s].image),r.position.push(a[s].position),r.size.push(a[s].size),r.repeat.push(a[s].repeat),r.origin.push(a[s].origin);var l={"background-image":r.image.join(", "),"background-position":r.position.join(", "),"background-size":r.size.join(", "),"background-repeat":r.repeat.join(", "),"background-origin":r.origin.join(", ")};n.setStyle(this.previewElement,l,this.forceStyle);var c={left:null,right:null};t&&(c[t]=this.previewSize+this.previewPadding+"px"),l={"padding-left":c.left,"padding-right":c.right},n.setStyle(this.previewElement,l,this.forceStyle,!0)}},this.setValueElementValue=function(e){this.valueElement&&("input"===n.nodeName(this.valueElement)?this.valueElement.value=e:this.valueElement.innerHTML=e)},this.setAlphaElementValue=function(e){this.alphaElement&&("input"===n.nodeName(this.alphaElement)?this.alphaElement.value=e:this.alphaElement.innerHTML=e)},this._processParentElementsInDOM=function(){if(!this._parentElementsProcessed){this._parentElementsProcessed=!0;var e=this.targetElement;do{var t=n.getCompStyle(e);t.position&&"fixed"===t.position.toLowerCase()&&(this.fixed=!0),e!==this.targetElement&&(n.getData(e,"hasScrollListener")||(e.addEventListener("scroll",n.onParentScroll,!1),n.setData(e,"hasScrollListener",!0)))}while((e=e.parentNode)&&"body"!==n.nodeName(e))}},this.tryHide=function(){this.hideOnLeave&&this.hide()},this.set__palette=function(e){this.palette=e,this._palette=n.parsePaletteValue(e),this._paletteHasTransparency=n.containsTranparentColor(this._palette)},n.pub.options)for(var p in n.pub.options)if(n.pub.options.hasOwnProperty(p))try{i(p,n.pub.options[p])}catch(e){console.warn(e)}var u=[];o.preset&&("string"==typeof o.preset?u=o.preset.split(/\s+/):Array.isArray(o.preset)?u=o.preset.slice():console.warn("Unrecognized preset value")),-1===u.indexOf("default")&&u.push("default");for(var h=u.length-1;h>=0;h-=1){var g=u[h];if(g)if(n.pub.presets.hasOwnProperty(g)){for(var p in n.pub.presets[g])if(n.pub.presets[g].hasOwnProperty(p))try{i(p,n.pub.presets[g][p])}catch(e){console.warn(e)}}else console.warn("Unknown preset: %s",g)}var f=["preset"];for(var p in o)if(o.hasOwnProperty(p)&&-1===f.indexOf(p))try{i(p,o[p])}catch(e){console.warn(e)}if(void 0===this.container?this.container=e.document.body:this.container=n.node(this.container),!this.container)throw new Error("Cannot instantiate color picker without a container element");if(this.targetElement=n.node(t),!this.targetElement){if("string"==typeof t&&/^[a-zA-Z][\w:.-]*$/.test(t))throw new Error("If '"+t+"' is supposed to be an ID, please use '#"+t+"' or any valid CSS selector.");throw new Error("Cannot instantiate color picker without a target element")}if(this.targetElement.jscolor&&this.targetElement.jscolor instanceof n.pub)throw new Error("Color picker already installed on this element");if(this.targetElement.jscolor=this,n.addClass(this.targetElement,n.pub.className),n.instances.push(this),n.isButton(this.targetElement)&&("button"!==this.targetElement.type.toLowerCase()&&(this.targetElement.type="button"),n.isButtonEmpty(this.targetElement))){n.removeChildren(this.targetElement),this.targetElement.appendChild(e.document.createTextNode(" "));var k=n.getCompStyle(this.targetElement);(parseFloat(k["min-width"])||0)<this.previewSize&&n.setStyle(this.targetElement,{"min-width":this.previewSize+"px"},this.forceStyle)}if(void 0===this.valueElement?n.isTextInput(this.targetElement)&&(this.valueElement=this.targetElement):null===this.valueElement||(this.valueElement=n.node(this.valueElement)),this.alphaElement&&(this.alphaElement=n.node(this.alphaElement)),void 0===this.previewElement?this.previewElement=this.targetElement:null===this.previewElement||(this.previewElement=n.node(this.previewElement)),this.valueElement&&n.isTextInput(this.valueElement)){var C={onInput:this.valueElement.oninput};this.valueElement.oninput=null,this.valueElement.addEventListener("keydown",(function(e){"Enter"===n.eventKey(e)&&(a.valueElement&&a.processValueInput(a.valueElement.value),a.tryHide())}),!1),this.valueElement.addEventListener("change",(function(e){if(!n.getData(e,"internal")){var t=a.valueElement.value;a.processValueInput(a.valueElement.value),n.triggerCallback(a,"onChange"),a.valueElement.value!==t&&n.triggerInputEvent(a.valueElement,"change",!0,!0)}}),!1),this.valueElement.addEventListener("input",(function(e){n.getData(e,"internal")||(a.valueElement&&a.fromString(a.valueElement.value,n.flags.leaveValue),n.triggerCallback(a,"onInput"))}),!1),C.onInput&&this.valueElement.addEventListener("input",C.onInput,!1),this.valueElement.setAttribute("autocomplete","off"),this.valueElement.setAttribute("autocorrect","off"),this.valueElement.setAttribute("autocapitalize","off"),this.valueElement.setAttribute("spellcheck",!1)}this.alphaElement&&n.isTextInput(this.alphaElement)&&(this.alphaElement.addEventListener("keydown",(function(e){"Enter"===n.eventKey(e)&&(a.alphaElement&&a.processAlphaInput(a.alphaElement.value),a.tryHide())}),!1),this.alphaElement.addEventListener("change",(function(e){if(!n.getData(e,"internal")){var t=a.alphaElement.value;a.processAlphaInput(a.alphaElement.value),n.triggerCallback(a,"onChange"),n.triggerInputEvent(a.valueElement,"change",!0,!0),a.alphaElement.value!==t&&n.triggerInputEvent(a.alphaElement,"change",!0,!0)}}),!1),this.alphaElement.addEventListener("input",(function(e){n.getData(e,"internal")||(a.alphaElement&&a.fromHSVA(null,null,null,parseFloat(a.alphaElement.value),n.flags.leaveAlpha),n.triggerCallback(a,"onInput"),n.triggerInputEvent(a.valueElement,"input",!0,!0))}),!1),this.alphaElement.setAttribute("autocomplete","off"),this.alphaElement.setAttribute("autocorrect","off"),this.alphaElement.setAttribute("autocapitalize","off"),this.alphaElement.setAttribute("spellcheck",!1));var M="FFFFFF";void 0!==this.value?M=this.value:this.valueElement&&void 0!==this.valueElement.value&&(M=this.valueElement.value);var y=void 0;if(void 0!==this.alpha?y=""+this.alpha:this.alphaElement&&void 0!==this.alphaElement.value&&(y=this.alphaElement.value),this._currentFormat=null,["auto","any"].indexOf(this.format.toLowerCase())>-1){var b=n.parseColorString(M);this._currentFormat=b?b.format:"hex"}else this._currentFormat=this.format.toLowerCase();this.processValueInput(M),void 0!==y&&this.processAlphaInput(y),this.random&&this.randomize.apply(this,Array.isArray(this.random)?this.random:[])}},n.pub.className="jscolor",n.pub.activeClassName="jscolor-active",n.pub.looseJSON=!0,n.pub.presets={},n.pub.presets.default={},n.pub.presets.light={backgroundColor:"rgba(255,255,255,1)",controlBorderColor:"rgba(187,187,187,1)",buttonColor:"rgba(0,0,0,1)"},n.pub.presets.dark={backgroundColor:"rgba(51,51,51,1)",controlBorderColor:"rgba(153,153,153,1)",buttonColor:"rgba(240,240,240,1)"},n.pub.presets.small={width:101,height:101,padding:10,sliderSize:14,paletteCols:8},n.pub.presets.medium={width:181,height:101,padding:12,sliderSize:16,paletteCols:10},n.pub.presets.large={width:271,height:151,padding:12,sliderSize:24,paletteCols:15},n.pub.presets.thin={borderWidth:1,controlBorderWidth:1,pointerBorderWidth:1},n.pub.presets.thick={borderWidth:2,controlBorderWidth:2,pointerBorderWidth:2},n.pub.sliderInnerSpace=3,n.pub.chessboardSize=8,n.pub.chessboardColor1="#666666",n.pub.chessboardColor2="#999999",n.pub.previewSeparator=["rgba(255,255,255,.65)","rgba(128,128,128,.65)"],n.pub.init=function(){if(!n.initialized)for(e.document.addEventListener("mousedown",n.onDocumentMouseDown,!1),e.document.addEventListener("keyup",n.onDocumentKeyUp,!1),e.addEventListener("resize",n.onWindowResize,!1),e.addEventListener("scroll",n.onWindowScroll,!1),n.pub.install(),n.initialized=!0;n.readyQueue.length;)n.readyQueue.shift()()},n.pub.install=function(e){var t=!0;try{n.installBySelector("[data-jscolor]",e)}catch(e){t=!1,console.warn(e)}if(n.pub.lookupClass)try{n.installBySelector("input."+n.pub.lookupClass+", button."+n.pub.lookupClass,e)}catch(e){}return t},n.pub.ready=function(e){return"function"!=typeof e?(console.warn("Passed value is not a function"),!1):(n.initialized?e():n.readyQueue.push(e),!0)},n.pub.trigger=function(e){var t=function(){n.triggerGlobal(e)};n.initialized?t():n.pub.ready(t)},n.pub.hide=function(){n.picker&&n.picker.owner&&n.picker.owner.hide()},n.pub.chessboard=function(e){return e||(e="rgba(0,0,0,0)"),n.genColorPreviewCanvas(e).canvas.toDataURL()},n.pub.background=function(e){var t=[];t.push(n.genColorPreviewGradient(e));var o=n.genColorPreviewCanvas();return t.push(["url('"+o.canvas.toDataURL()+"')","left top","repeat"].join(" ")),t.join(", ")},n.pub.options={},n.pub.lookupClass="jscolor",n.pub.installByClassName=function(){return console.error('jscolor.installByClassName() is DEPRECATED. Use data-jscolor="" attribute instead of a class name.'+n.docsRef),!1},n.register(),n.pub);return void 0===e.jscolor&&(e.jscolor=e.JSColor=i),i}))}},t={};function o(a){var n=t[a];if(void 0!==n)return n.exports;var i=t[a]={exports:{}};return e[a].call(i.exports,i,i.exports,o),i.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var a in t)o.o(t,a)&&!o.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";class e{constructor(e,t,o){this.defaultValue=e,this.type=t,this.group=o}}function t(e,t){Game.promptWrapL.className="framed",Game.promptL.innerHTML=`${e}<div class="optionBox"></div>`,Object.keys(t).forEach((e=>{const o=document.createElement("a");o.id=`promptOption${e}`,o.className="option",o.onclick=function(){PlaySound("snd/tick.mp3"),t[e][1]()},o.textContent=t[e][0],Game.promptL.children[1].appendChild(o)})),Game.promptAnchorL.style.display="block",Game.darkenL.style.display="block",Game.promptL.focus(),Game.promptOn=1,Game.UpdatePrompt()}function a(e,t,o,n){(1===Game.mods.cookieMonsterFramework.saveData[e].settings[o]||n)&&3===t&&!1===window.cookieMonsterFrameworkData.isInitializing||1===t?(l("CMFlashScreen").style.backgroundColor=Game.mods.cookieMonsterFramework.saveData[e].settings[`Colour${o}`],l("CMFlashScreen").style.opacity="0.5",3===t?(l("CMFlashScreen").style.display="inline",setTimeout((()=>{a(e,2,o,!0)}),1e3/Game.fps)):setTimeout((()=>{a(e,0,o,!0)}),1e3/Game.fps)):2===t?(l("CMFlashScreen").style.opacity="1",setTimeout((()=>{a(e,1,o,!0)}),1e3/Game.fps)):0===t&&(l("CMFlashScreen").style.display="none")}function n(){Object.keys(Game.mods.cookieMonsterFramework.saveData).forEach((e=>{const t=JSON.stringify(Game.mods.cookieMonsterFramework.saveData[e]),o=b64_to_utf8(unescape(localStorage.getItem("CookieClickerGame")).split("!END!")[0]),a=new RegExp(`${e}.*(;|$)`),n=o.match(a);if(null!==n){const a=o.replace(n[0],`${e}:${t}`);localStorage.setItem("CookieClickerGame",escape(`${utf8_to_b64(a)}!END!`))}}))}function i(e,t){void 0===Game.mods.cookieMonsterFramework.saveData[e].headers[t]&&(Game.mods.cookieMonsterFramework.saveData[e].headers[t]=1),0===Game.mods.cookieMonsterFramework.saveData[e].headers[t]?Game.mods.cookieMonsterFramework.saveData[e].headers[t]=1:Game.mods.cookieMonsterFramework.saveData[e].headers[t]=0,n()}var r=o(877),s=o.n(r);function c(e,t,o,a,n){if((1===Game.mods.cookieMonsterFramework.saveData[e].settings[o]||n)&&!1===window.cookieMonsterFrameworkData.isInitializing){const o=new Audio(t);Game.mods.cookieMonsterFramework.saveData[e].settings.GeneralSound?o.volume=Game.mods.cookieMonsterFramework.saveData[e].settings[a]/100*(Game.volume/100):o.volume=Game.mods.cookieMonsterFramework.saveData[e].settings[a]/100,o.play()}}function d(e,t){null!==l(`slider${e}${t}`)&&(l(`slider${e}${t}right`).innerHTML=`${l(`slider${e}${t}`).value}%`,Game.mods.cookieMonsterFramework.saveData[e].settings[t]=Math.round(l(`slider${e}${t}`).value)),n()}function m(e,t){t.disconnect(),"log"===Game.onMenu?function(){const e=l("menu").children[1];if(e.insertBefore(function(){const e=document.createElement("div");e.className="subsection",e.id="cookieMonsterFrameworkMenuSection";const t=document.createElement("div");t.className="title",t.innerHTML="Cookie Monster Mod Family";const o=document.createElement("span");if(o.style.cursor="pointer",o.style.display="inline-block",o.style.height="14px",o.style.width="14px",o.style.borderRadius="7px",o.style.textAlign="center",o.style.backgroundColor="#C0C0C0",o.style.color="black",o.style.fontSize="13px",o.style.verticalAlign="middle",o.textContent=Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu?"-":"+",o.onclick=function(){i("cookieMonsterFramework","infoMenu"),Game.UpdateMenu()},t.appendChild(o),e.appendChild(t),Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu){const t=document.createElement("div");t.className="listing",t.innerHTML='<a href="https://github.com/CookieMonsterTeam" target="blank">Cookie Monster Team</a>\noffers a suite of tools to enhance your game experience.</br>\nOriginally known from our work on the Cookie Monster add-on we are now expanding and working on new tools within the Cookie Monster Mod Family.</br>\nKeep an eye on our GitHub to see future work or use it to report bugs or feature requests!</br>\n',e.appendChild(t)}return e}(),e.children[1]),Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu){const e=Game.mods.cookieMonsterFramework.listeners.infoMenu;for(let t=0;t<e.length;t++)l("cookieMonsterFrameworkMenuSection").appendChild(e[t]())}}():Game.onMenu,t.observe(document.getElementById("menu"),{attributes:!0,childList:!0,subtree:!0})}function p(){}const u={infoMenu:1,optionsMenu:1};function h(e,t,o,a,i){const r=JSON.parse(t);Game.mods.cookieMonsterFramework.saveData[e]=function(e,t,o){const a={},n={};Object.keys(t).forEach((o=>{void 0===e.settings||void 0===e.settings[o]?n[o]=t[o].defaultValue:n[o]=e.settings[o]})),a.settings=n;const i={};return Object.keys(o).forEach((t=>{void 0===e.headers||void 0===e.headers[t]?i[t]=o[t]:i[t]=e.headers[t]})),a.headers=i,Object.keys(e).forEach((t=>{"settings"!==t&&"headers"!==t&&(a[t]=e[t])})),void 0===a.favouriteSettings&&(a.favouriteSettings=[]),a}(r,o,a),n(),i(),Object.keys(Game.mods.cookieMonsterFramework.saveData[e].settings).forEach((e=>{void 0!==o[e].func&&o[e].func()})),Game.UpdateMenu()}function g(){}const f={};function k(e){h("cookieMonsterFramework",e,f,u,g)}const C={init:function(){window.cookieMonsterFrameworkData={isInitializing:!0},new MutationObserver(m).observe(document.getElementById("menu"),{attributes:!0,childList:!0,subtree:!0}),function(){const e=document.createElement("div");e.id="CMFlashScreen",e.style.width="100%",e.style.height="100%",e.style.backgroundColor="white",e.style.display="none",e.style.zIndex="9999999999",e.style.position="absolute",e.style.pointerEvents="none",l("wrapper").appendChild(e)}(),Game.registerHook("draw",p),void 0===Game.modSaveData.cookieMonsterFramework&&k("{}"),window.cookieMonsterFrameworkData.isInitializing=!1},load:k,save:function(){return JSON.stringify(Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework)},listeners:{infoMenu:[],optionsMenu:[]},saveData:{cookieMonsterFramework:{headers:{},settings:{}}}},M=function(){"undefined"==typeof cookieMonsterFrameworkData&&Game.registerMod("cookieMonsterFramework",C)},y=function(e){Game.mods.cookieMonsterFramework.saveData[e]={favouriteSettings:[],headers:{},settings:{}}},b={createInfoListing:function(e){const t=document.createElement("div");return t.className="listing",t.innerHTML=e,t},createOptionsListing:function(e,o,i,m,p){const u=document.createElement("div");if(u.className="listing",1===Game.mods.cookieMonsterFramework.saveData[e].settings.FavouriteSettings&&u.appendChild(function(e,t,o){const a=document.createElement("a");return o.includes(t)?(a.innerText="★",a.style.color="yellow"):a.innerText="☆",a.className="option",a.onclick=function(){!function(e,t){Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings.includes(t)?Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings=Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings.filter((e=>e!==t)):Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings.push(t),n()}(e,t),n(),Game.UpdateMenu()},a.onmouseover=function(){Game.tooltip.draw(this,escape('<div style="min-width: 250px; margin-bottom: 4px;"><div style="text-align: left;">Click to set this setting as favourite and show it in \'favourite\' settings at the top of the Cookie Monster Settings</div></div>'))},a.onmouseout=function(){Game.tooltip.hide()},a.appendChild(document.createTextNode(" ")),a}(e,o,Game.mods.cookieMonsterFramework.saveData[e].favouriteSettings)),"bool"===i[o].type){const t=document.createElement("a");i[o].toggle&&0===Game.mods.cookieMonsterFramework.saveData[e].settings[o]?t.className="option off":t.className="option",t.id=`${e}Options${o}`,t.onclick=function(){!function(e,t,o){Game.mods.cookieMonsterFramework.saveData[e].settings[t]+=1,Game.mods.cookieMonsterFramework.saveData[e].settings[t]===o[t].label.length?(Game.mods.cookieMonsterFramework.saveData[e].settings[t]=0,o[t].toggle&&(l(`${e}Options${t}`).className="option off")):l(`${e}Options${t}`).className="option",void 0!==o[t].func&&o[t].func(),n()}(e,o,i),Game.UpdateMenu()},t.textContent=i[o].label[Game.mods.cookieMonsterFramework.saveData[e].settings[o]],u.appendChild(t);const a=document.createElement("label");return a.textContent=i[o].desc,a.style.lineHeight="1.6",u.appendChild(a),u}if("vol"===i[o].type){const t=document.createElement("div");t.className="sliderBox";const a=document.createElement("div");a.style.float="left",a.innerHTML=i[o].desc,t.appendChild(a);const n=document.createElement("div");n.id=`slider${e}${o}right`,n.style.float="right",n.innerHTML=`${Game.mods.cookieMonsterFramework.saveData[e].settings[o]}%`,t.appendChild(n);const r=document.createElement("input");r.className="slider",r.id=`slider${e}${o}`,r.style.clear="both",r.type="range",r.min="0",r.max="100",r.step="1",r.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o],r.oninput=function(){d(e,o),Game.UpdateMenu()},r.onchange=function(){d(e,o),Game.UpdateMenu()},t.appendChild(r),u.appendChild(t);const s=document.createElement("a");return s.className="option",s.onclick=function(){c(e,Game.mods.cookieMonsterFramework.saveData[e].settings[o.replace("Volume","SoundURL")],o.replace("Volume","Sound"),o,!0)},s.textContent="Test sound",u.appendChild(s),u}if("url"===i[o].type){const a=document.createElement("span");a.className="option",a.textContent=`${i[o].label} `,a.style.lineHeight="1.6",u.appendChild(a);const r=document.createElement("input");r.id=`${e}Options${o}`,r.className="option",r.type="text",r.readOnly=!0,r.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o],r.style.width="300px",u.appendChild(r),u.appendChild(document.createTextNode(" "));const s=document.createElement("input");s.id=`${e}Options${o}Prompt`,s.className="option",s.type="text",s.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o];const c=document.createElement("a");c.className="option",c.onclick=function(){t(s.outerHTML,[["Save",function(){Game.mods.cookieMonsterFramework.saveData[e].settings[o]=l(`${e}Options${o}Prompt`).value,n(),Game.ClosePrompt(),Game.UpdateMenu()}],["Cancel",function(){Game.ClosePrompt()}]])},c.textContent="Edit",u.appendChild(c);const d=document.createElement("label");return d.textContent=i[o].desc,d.style.lineHeight="1.6",u.appendChild(d),u}if("colour"===i[o].type){const t=document.createElement("span");t.className="option";const l=document.createElement("input");l.id=o,l.style.width="65px",l.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o],t.appendChild(l),new r(l,{hash:!0,position:"right",onInput:function(){Game.mods.cookieMonsterFramework.saveData[e].settings[this.targetElement.id]=this.toHEXString(),m(),n(),Game.UpdateMenu()}});const c=document.createElement("label");if(c.textContent=i[o].desc,c.style.lineHeight="1.6",t.appendChild(c),o.includes("Flash")){const n=document.createElement("a");n.className="option",n.onclick=function(){a(e,3,o.replace("Colour",""),!0)},n.textContent="Test flash",t.appendChild(n)}return u.appendChild(t),s().init(),u}if("numscale"===i[o].type){const t=document.createElement("span");t.className="option",t.textContent=`${i[o].label} `,t.style.lineHeight="1.6",u.appendChild(t);const a=document.createElement("input");a.id=`${e}Options${o}`,a.className="option",a.type="number",a.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o],a.min=i[o].min,a.max=i[o].max,a.oninput=function(){Game.mods.cookieMonsterFramework.saveData[e].settings[o]=this.value,n(),p(),Game.UpdateMenu()},u.appendChild(a),u.appendChild(document.createTextNode(" "));const r=document.createElement("label");return r.textContent=i[o].desc,r.style.lineHeight="1.6",u.appendChild(r),u}if("keycode"===i[o].type){const a=document.createElement("input");a.id=`${e}Options${o}Prompt`,a.className="option",a.type="text",a.value=Game.mods.cookieMonsterFramework.saveData[e].settings[o].displayName;const r=document.createElement("a");r.className="option",r.id=`${e}Options${o}`,r.onclick=function(){t(a.outerHTML,[]),l(`${e}Options${o}Prompt`).addEventListener("keyup",(t=>{!function(e,t,o){const a={key:o.key,altKey:o.altKey,ctrlKey:o.ctrlKey,shiftKey:o.shiftKey,displayName:`${o.shiftKey?"Shift + ":""}${o.altKey?"Alt + ":""}${o.ctrlKey?"Ctrl + ":""}${o.key}`};Game.mods.cookieMonsterFramework.saveData[e].settings[t]=a,n()}(e,o,t),Game.ClosePrompt(),Game.UpdateMenu()}))},r.textContent=Game.mods.cookieMonsterFramework.saveData[e].settings[o].displayName,u.appendChild(r);const s=document.createElement("label");return s.textContent=i[o].desc,s.style.lineHeight="1.6",u.appendChild(s),u}return u},createOptionsSubHeader:function(e,t,o){const a=document.createElement("div");a.className="title",a.style.opacity="0.7",a.style.fontSize="17px",a.appendChild(document.createTextNode(`${o} `));const n=document.createElement("span");return n.style.cursor="pointer",n.style.display="inline-block",n.style.height="14px",n.style.width="14px",n.style.borderRadius="7px",n.style.textAlign="center",n.style.backgroundColor="#C0C0C0",n.style.color="black",n.style.fontSize="13px",n.style.verticalAlign="middle",n.textContent=Game.mods.cookieMonsterFramework.saveData[e].headers[t]?"-":"+",n.onclick=function(){i(e,t),Game.UpdateMenu()},a.appendChild(n),a}},G=function(e,t,o){const a=document.createElement("div");a.className="subsection",a.id=`${e}MenuSection`;const n=document.createElement("div");n.className="title",n.style.fontSize="18px",n.innerHTML=t;const r=document.createElement("span");return r.style.cursor="pointer",r.style.display="inline-block",r.style.height="14px",r.style.width="14px",r.style.borderRadius="7px",r.style.textAlign="center",r.style.backgroundColor="#C0C0C0",r.style.color="black",r.style.fontSize="13px",r.style.verticalAlign="middle",r.textContent=Game.mods.cookieMonsterFramework.saveData[e].headers[o]?"-":"+",r.onclick=function(){i(e,o),Game.UpdateMenu()},n.appendChild(r),a.appendChild(n),a},v={createFlash:a,createNotification:function(e,t,o,a){1===Game.mods.cookieMonsterFramework.saveData[e].settings[t]&&"hidden"===document.visibilityState&&!1===window.cookieMonsterFrameworkData.isInitializing&&new Notification(o,{body:a,badge:"https://orteil.dashnet.org/cookieclicker/favicon.ico"})},cookieMonsterPrompt:t,playCMSound:c},w={loadMod:h,saveFramework:n},x=class extends e{constructor(e,t,o,a){super(e,t,o),this.desc=a}},T=class extends e{constructor(e,t,o,a,n,i,r){super(e,t,o),this.label=a,this.desc=n,this.min=i,this.max=r}},S=class extends e{constructor(e,t,o,a,n,i){super(e,t,o),this.label=a,this.desc=n,this.toggle=i}},F=class extends e{constructor(e,t,o,a,n,i,r){super(e,t,o),this.label=a,this.desc=n,this.toggle=i,void 0!==r&&(this.func=r)}},E=class extends e{constructor(e,t,o,a,n){super(e,t,o),this.label=a,this.desc=n;for(let e=0;e<101;e++)this.label[e]=`${e}%`}};function B(){Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerButtons&&Game.elderWrath?(l("PopAllNormalWrinklerButton").style.display="",l("PopFattestWrinklerButton").style.display=""):(l("PopAllNormalWrinklerButton").style.display="none",l("PopFattestWrinklerButton").style.display="none")}let P,N,O,D,L,A,W,j,$,U,H,R,I,z,V,_,X,Q,q,Y,K,J,Z,ee,te,oe,ae,ne,ie,re,se,le,ce,de,me,pe,ue=0,he=0,ge=0,fe=0,ke=0,Ce=0,Me=0,ye=0,be=0,Ge=0,ve=0,we=0,xe=0,Te=0,Se=0,Fe=1,Ee=1,Be=1,Pe=0,Ne=0,Oe=0,De=0,Le={},Ae={},We={},je={},$e=0,Ue=0,He=[0,null],Re=0,Ie=0,ze={},Ve={},_e={},Xe={},Qe={},qe=0,Ye=0,Ke=[],Je=0,Ze=0,et=[],tt=0,ot=0,at=[],nt=0,it=0,rt=[],st=0,lt=0,ct={},dt={},mt=0,pt=0,ut=0,ht=[],gt={},ft=0,kt={0:[0,0,0],1:[0,0,0],2:[0,0,0],3:[0,0,0],4:[0,0,0],5:[0,0,0],6:[0,0,0],7:[0,0,0],8:[0,0,0],9:[0,0,0],10:[0,0,0]},Ct=[],Mt=[],yt=[];function bt(e){let t=0;return Game.dragonAuras[ne].name!==e&&Game.dragonAuras[ie].name!==e||(t=1),("Reality Bending"===Game.dragonAuras[ne].name||"Reality Bending"===Game.dragonAuras[ie].name&&Game.dragonLevel>=Game.dragonAurasBN[e].id+4)&&(t+=.1),t}function Gt(){let e=.25;return e*=1+bt("Earth Shatterer"),e}function vt(e,t){return void 0===de[e]?void 0===t?1:t:de[e]}function wt(e){const t=Mt[e];return(!t||1!==Game.ascensionMode||"prestige"!==t.pool&&"fortune"!==t.tier)&&t?t.bought:0}function xt(e){return Game.dragonAuras[ne].name===e||Game.dragonAuras[ie].name===e}function Tt(e){if(Game.hasGod){void 0===Ct.Temple.minigame&&(Ct.Temple.minigame=Game.Objects.Temple.minigame);const t=Ct.Temple.minigame.gods[e];if(re===t.id)return 1;if(se===t.id)return xt("Supreme Intellect")?1:2;if(le===t.id)return xt("Supreme Intellect")?2:3}return!1}function St(e,t){let o=t;if(wt("Season savings")&&(o*=.99),wt("Santa's dominion")&&(o*=.99),wt("Faberge egg")&&(o*=.99),wt("Divine discount")&&(o*=.99),wt("Fortune #100")&&(o*=.99),o*=1-.02*bt("Fierce Hoarder"),Game.hasBuff("Everything must go")&&(o*=.95),Game.hasBuff("Crafty pixies")&&(o*=.98),Game.hasBuff("Nasty goblins")&&(o*=1.02),e.fortune&&wt(e.fortune.name)&&(o*=.93),o*=vt("buildingCost"),Ct.Temple.minigameLoaded){const e=Tt("creation");1===e?o*=.93:2===e?o*=.95:3===e&&(o*=.98)}return o}function Ft(e,t,o,a,n,i){const r=void 0===i?0:i;let s=n,l=o,c=0;-1===n&&(s=l),n||(s=Game.buyBulk);for(let o=0;o<s;o++){let o=t*Game.priceIncrease**Math.max(0,l-a);o=r?Game.modifyBuildingPrice(e,o):St(e,o),o=Math.ceil(o);const n=r?e.getSellMultiplier():Gt();o=Math.floor(o*n),l>0&&(c+=o,l-=1)}return c}const Et=["","","M","G","T","P","E","Z","Y"],Bt=["","","M","B","Tr","Quadr","Quint","Sext","Sept","Oct","Non","Dec","Undec","Duodec","Tredec","Quattuordec","Quindec","Sexdec","Septendec","Octodec","Novemdec","Vigint","Unvigint","Duovigint","Trevigint","Quattuorvigint"],Pt=["","K","M","B","T","Qa","Qi","Sx","Sp","Oc","No","De","UDe","DDe","TDe","QaDe","QiDe","SxDe","SpDe","ODe","NDe","Vi","UVi","DVi","TVi","QaVi","QiVi","SxVi","SpVi","OVi","NVi","Tr","UTr","DTr","TTr","QaTr","QiTr","SxTr","SpTr","OTr","NTr","Qaa","UQa","DQa","TQa","QaQa","QiQa","SxQa","SpQa","OQa","NQa","Qia","UQi","DQi","TQi","QaQi","QiQi","SxQi","SpQi","OQi","NQi","Sxa","USx","DSx","TSx","QaSx","QiSx","SxSx","SpSx","OSx","NSx","Spa","USp","DSp","TSp","QaSp","QiSp","SxSp","SpSp","OSp","NSp","Oco","UOc","DOc","TOc","QaOc","QiOc","SxOc","SpOc","OOc","NOc","Noa","UNo","DNo","TNo","QaNo","QiNo","SxNo","SpNo","ONo","NNo","Ct","UCt"];let Nt,Ot,Dt,Lt,At,Wt,jt,$t,Ut,Ht,Rt,It,zt,Vt,_t,Xt,Qt,qt=[],Yt=[],Kt=[],Jt={},Zt=Date.now(),eo=Date.now();function to(e,t,o){const a=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleDecimals+1;if(e===1/0)return"Infinity";if(void 0===e)return"0";if(0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale)return Jt.Beautify(e,t);if(Number.isFinite(e)){if(e<0)return`-${to(Math.abs(e))}`;let n="";if(0===e)return e.toString();if(e>.001&&e<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleCutoff)return n=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?e.toLocaleString("nl"):e.toLocaleString("en"),n;if(4===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||4===o)n=e.toExponential(a).toString().replace("e","E");else{const t=e.toExponential().toString(),i=Math.floor(t.slice(t.indexOf("e")+1)/3);n=(e/Number("1e"+3*i)).toFixed(a),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||1===o?e>=.01&&e<Number("1e"+3*Et.length)?n+=` ${Et[i]}`:n=to(e,0,4):2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||2===o?e>=.01&&e<Number("1e"+3*Bt.length)?n+=` ${Bt[i]}`:n=to(e,0,4):3===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||3===o?e>=.01&&e<Number("1e"+3*Pt.length)?n+=` ${Pt[i]}`:n=to(e,0,4):(5===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale&&!o||5===o)&&(n+="E"+3*i)}return""===n&&(console.log(`Could not beautify number with Cookie Monster Beautify: ${e}`),n=Jt.Beautify(e,t)),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator&&(n=n.replace(".",",")),n}return console.log(`Could not beautify number with Cookie Monster Beautify: ${e}`),Jt.Beautify(e,t)}const oo="CMText",ao="CMBack",no="Blue",io="Green",ro="Yellow",so="Orange",lo="Red",co="Purple",mo="Gray",po="Pink",uo="Brown",ho=[no,io,ro,so,lo,co,po,uo,mo],go=[["GoldCookTooltipPlaceholder","Calculated with Golden Switch off","200px"],["GoldCookDragonsFortuneTooltipPlaceholder","Calculated with Golden Switch off and at least one golden cookie on-screen","240px"],["PrestMaxTooltipPlaceholder","The MAX prestige is calculated with the cookies gained from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and buying Chocolate egg","320px"],["NextPrestTooltipPlaceholder","Calculated with cookies gained from wrinklers and Chocolate egg","200px"],["HeavenChipMaxTooltipPlaceholder","The MAX heavenly chips is calculated with the cookies gained from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and buying Chocolate egg","330px"],["ResetTooltipPlaceholder","The bonus income you would get from new prestige levels unlocked at 100% of its potential and from ascension achievements if you have the same buildings/upgrades after reset","370px"],["ChoEggTooltipPlaceholder","The amount of cookies you would get from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and then buying Chocolate egg","300px"],["ChainNextLevelPlaceholder","Cheated cookies might break this formula","250px"],["FavouriteSettingPlaceholder","Click to set this setting as favourite and show it in 'favourite' settings at the top of the Cookie Monster Settings","250px"]],fo={};let ko,Co=0,Mo=-1,yo=[],bo=function(){},Go=1,vo=1,wo=1;const xo=[10,15,30,60,300,600,900,1800],To=[1,5,10,15,30],So={Frenzy:ro,"Dragon Harvest":uo,"Elder frenzy":io,Clot:lo,"Click frenzy":no,Dragonflight:po};let Fo,Eo,Bo,Po,No,Oo,Do,Lo={},Ao="";function Wo(){let e,t=Game.buyBulk;1===Game.buyMode?vo=t:t=vo,1===t?t=Le:10===t?t=Ae:100===t&&(t=We),l("storeBulk1").style.removeProperty("color"),l("storeBulk10").style.removeProperty("color"),l("storeBulk100").style.removeProperty("color"),1===Game.buyMode?1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BuildColour?(Object.keys(t).forEach((e=>{l(`productPrice${Game.Objects[e].id}`).style.color=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[`Colour${t[e].colour}`]})),l(`storeBulk${ut}`).style.color=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ColourGreen):Object.keys(Game.Objects).forEach((e=>{l(`productPrice${Game.Objects[e].id}`).style.removeProperty("color")})):-1===Game.buyMode&&Object.keys(Le).forEach((e=>{const t=Game.Objects[e];l(`productPrice${t.id}`).style.color="",l(`productPrice${t.id}`).innerHTML=to(Ft(t,t.basePrice,t.amount,t.free,Game.buyBulk,1))})),1===Game.buyMode&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings?1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings?(e=Object.keys(Le).map((e=>{const t={};return t.name=e,t.pp=Le[e].pp,t.colour=Le[e].colour,t})),e.sort(((e,t)=>ho.indexOf(e.colour)===ho.indexOf(t.colour)?e.pp-t.pp:ho.indexOf(e.colour)-ho.indexOf(t.colour)))):2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings?(e=Object.keys(t).map((e=>{const o={};return o.name=e,o.pp=t[e].pp,o.colour=t[e].colour,o})),e.sort(((e,t)=>ho.indexOf(e.colour)===ho.indexOf(t.colour)?e.pp-t.pp:ho.indexOf(e.colour)-ho.indexOf(t.colour)))):3===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings&&(e=Object.keys(je).map((e=>{const t={};return t.name=e,t.id=Game.Objects[e].id,t.amountUntilNext=je[e].AmountNeeded,t.priceUntilNext=je[e].price,t})),e.sort(((e,t)=>e.id-t.id)),e.sort(((e,t)=>(101!==e.amountUntilNext?e.priceUntilNext:1/0)-(101!==t.amountUntilNext?t.priceUntilNext:1/0)))):(e=Object.keys(Le).map((e=>{const t={};return t.name=e,t.id=Game.Objects[e].id,t})),e.sort(((e,t)=>e.id-t.id)));for(let t=0;t<e.length;t++)Game.Objects[e[t].name].l.style.gridRow=`${t+2}/${t+2}`}function jo(){Object.values(document.getElementsByClassName("storeSection")).forEach((e=>{Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpgradesNeverCollapse||"products"===e.id?e.style.height="auto":"vaultUpgrades"===e.id?(e.style.height="",e.style.minHeight="0px"):"upgrades"===e.id?(e.style.height="",e.className.includes("hasMenu")?e.style.minHeight="82px":e.style.minHeight="60px"):(e.style.height="",e.style.minHeight="60px")}))}function $o(){if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour>0){let e=0,t=0,o=0,a=0,n=0,i=0,r=0;Object.keys(Game.UpgradesInStore).forEach((s=>{const c=Game.UpgradesInStore[s];let d=!1;for(let e=0;e<l(`upgrade${s}`).childNodes.length;e+=1)if(-1!==l(`upgrade${s}`).childNodes[e].className.indexOf(ao)){l(`upgrade${s}`).childNodes[e].className=ao+ze[c.name].colour,d=!0;break}if(!d){const e=document.createElement("div");e.style.width="10px",e.style.height="10px",e.className=ao+ze[c.name].colour,l(`upgrade${s}`).appendChild(e)}ze[c.name].colour===no?e+=1:ze[c.name].colour===io?t+=1:ze[c.name].colour===ro?o+=1:ze[c.name].colour===so?a+=1:ze[c.name].colour===lo?n+=1:ze[c.name].colour===co?i+=1:ze[c.name].colour===mo&&(r+=1)})),l("CMUpgradeBarBlue").textContent=e,l("CMUpgradeBarGreen").textContent=t,l("CMUpgradeBarYellow").textContent=o,l("CMUpgradeBarOrange").textContent=a,l("CMUpgradeBarRed").textContent=n,l("CMUpgradeBarPurple").textContent=i,l("CMUpgradeBarGray").textContent=r}const e=[];for(let t=0;t<Game.UpgradesInStore.length;t+=1){const o={};o.name=Game.UpgradesInStore[t].name,o.price=Game.UpgradesInStore[t].basePrice,o.pp=ze[o.name].pp,o.colour=ze[o.name].colour,e.push(o)}Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortUpgrades?e.sort(((e,t)=>ho.indexOf(e.colour)===ho.indexOf(t.colour)?e.pp-t.pp:ho.indexOf(e.colour)-ho.indexOf(t.colour))):e.sort(((e,t)=>e.price-t.price));const t=function(e,t){return e.findIndex((e=>e.name===t.name))};for(let o=0;o<Game.UpgradesInStore.length;o+=1)l(`upgrade${o}`).style.order=t(e,Game.UpgradesInStore[o])+1}function Uo(e,t){let o=e;if(e===1/0)return e;if(e<0)return"Negative time period";o=Math.ceil(e);const a=Math.floor(o/31536e3),n=Math.floor(o%31536e3/86400),i=Math.floor(o%31536e3%86400/3600),r=Math.floor(o%31536e3%86400%3600/60),s=Math.floor(o%31536e3%86400%3600%60);let l="";if(0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat){if(o>7776e5)return t?"Over 9000 days!":">9000d";l+=a>0?a+(t?1===a?" year":" years":"y")+", ":"",(l.length>0||n>0)&&(l+=n+(t?1===n?" day":" days":"d")+", "),(l.length>0||i>0)&&(l+=i+(t?1===i?" hour":" hours":"h")+", "),(l.length>0||r>0)&&(l+=r+(t?1===r?" minute":" minutes":"m")+", "),l+=s+(t?1===s?" second":" seconds":"s")}else if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat){if(o>315576e4)return"XX:XX:XX:XX:XX";l+=(a<10?"0":"")+a+":",l+=(n<10?"0":"")+n+":",l+=(i<10?"0":"")+i+":",l+=(r<10?"0":"")+r+":",l+=(s<10?"0":"")+s}else{if(o>7776e5)return t?"Over 9000 days!":">9000d";a>0?(l+=a+(t?1===a?" year":" years":"y")+", ",l+=n+(t?1===n?" day":" days":"d")):n>0?(l+=n+(t?1===n?" day":" days":"d")+", ",l+=i+(t?1===i?" hour":" hours":"h")):i>0?(l+=i+(t?1===i?" hour":" hours":"h")+", ",l+=r+(t?1===r?" minute":" minutes":"m")):r>0?(l+=r+(t?1===r?" minute":" minutes":"m")+", ",l+=s+(t?1===s?" second":" seconds":"s")):l+=s+(t?1===s?" second":" seconds":"s")}return l}function Ho(e){let t,o;return e<=0?(o=1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat?"00:00:00:00:00":"Done!",t=io):(o=Uo(e),t=e>300?lo:e>60?so:ro),{text:o,colour:t}}function Ro(){return Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CPSMode?X:0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?Game.cookiesPs*(1-Game.cpsSucked):1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?Game.cookiesPs*(Re+(1-.05*Ie)):null!==He[1]&&2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink&&1===Game.wrinklers[He[1]].type?Game.cookiesPs*(3*Re/Ie+(1-.05*Ie)):Game.cookiesPs*(Re/Ie+(1-.05*Ie))}function Io(){return 1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?$e:2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?He[0]:0}function zo(e,t,o){const a=document.createElement("div");a.id=e,a.style.height="12px",a.style.margin="0px 10px",a.style.position="relative";const n=document.createElement("div");n.style.width="100%",n.style.height="10px",n.style.margin="auto",n.style.position="absolute",n.style.left="0px",n.style.top="0px",n.style.right="0px",n.style.bottom="0px";const i=document.createElement("span");i.style.display="inline-block",i.style.textAlign="right",i.style.fontSize="10px",i.style.width="108px",i.style.marginRight="5px",i.style.verticalAlign="text-top",i.textContent=t,n.appendChild(i);for(let e=0;e<o.length;e++){const t=document.createElement("span");t.id=o[e].id,t.style.display="inline-block",t.style.height="10px",t.style.verticalAlign="text-top",t.style.textAlign="center",o.length-1===e&&(t.style.borderTopRightRadius="10px",t.style.borderBottomRightRadius="10px"),void 0!==o[e].colour&&(t.className=ao+o[e].colour),n.appendChild(t)}const r=document.createElement("span");return r.id=`${e}Time`,r.style.marginLeft="5px",r.style.verticalAlign="text-top",n.appendChild(r),a.appendChild(n),a}function Vo(e){if(null!==l("CMBotBar")){const t=l("CMBotBar").firstChild.firstChild.childNodes[0],o=l("CMBotBar").firstChild.firstChild.childNodes[1],a=l("CMBotBar").firstChild.firstChild.childNodes[2],n=l("CMBotBar").firstChild.firstChild.childNodes[3],i=e,r=t.appendChild(document.createElement("td"));r.appendChild(document.createTextNode(`${-1!==i.indexOf(" ")?i.substring(0,i.indexOf(" ")):i} (`)),r.appendChild(document.createElement("span")).className="CMTextBlue",r.appendChild(document.createTextNode(")")),t.lastChild.style.paddingLeft="8px",o.appendChild(document.createElement("td")),o.lastChild.style.paddingLeft="8px",a.appendChild(document.createElement("td")),a.lastChild.style.paddingLeft="8px",n.appendChild(document.createElement("td")),n.lastChild.style.paddingLeft="2px"}}function _o(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar&&Le&&1===Game.buyMode){let e=0;Object.keys(Le).forEach((t=>{let o,a=Game.buyBulk;1===Game.buyMode?Go=a:a=Go,1===a&&(a=Le),10===a&&(a=Ae),100===a&&(a=We),e+=1,l("CMBotBar").firstChild.firstChild.childNodes[0].childNodes[e].childNodes[1].textContent=Game.Objects[t].amount,l("CMBotBar").firstChild.firstChild.childNodes[1].childNodes[e].textContent=to(a[t].bonus,2),l("CMBotBar").firstChild.firstChild.childNodes[2].childNodes[e].className=oo+a[t].colour,o=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime?Uo(Math.round(a[t].pp)):to(Math.round(a[t].pp),2),l("CMBotBar").firstChild.firstChild.childNodes[2].childNodes[e].textContent=o;const n=Ho((Game.Objects[t].bulkPrice-(Game.cookies+Io()))/Ro());l("CMBotBar").firstChild.firstChild.childNodes[3].childNodes[e].className=oo+n.colour,"Done!"===n.text&&Game.cookies<Game.Objects[t].bulkPrice?l("CMBotBar").firstChild.firstChild.childNodes[3].childNodes[e].textContent=`${n.text} (with Wrink)`:l("CMBotBar").firstChild.firstChild.childNodes[3].childNodes[e].textContent=n.text}))}}function Xo(){Game.Background.canvas.width=Game.Background.canvas.parentNode.offsetWidth,Game.Background.canvas.height=Game.Background.canvas.parentNode.offsetHeight,Game.LeftBackground.canvas.width=Game.LeftBackground.canvas.parentNode.offsetWidth,Game.LeftBackground.canvas.height=Game.LeftBackground.canvas.parentNode.offsetHeight,Game.DrawBackground()}function Qo(){1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos?(l("CMBotBar").style.bottom=l("CMTimerBar").style.height,l("game").style.bottom=`${Number(l("CMTimerBar").style.height.replace("px",""))+70}px`):1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar?(l("CMBotBar").style.bottom="0px",l("game").style.bottom="70px"):1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos?l("game").style.bottom=l("CMTimerBar").style.height:l("game").style.bottom="0px",1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos?l("sectionLeft").style.top=l("CMTimerBar").style.height:l("sectionLeft").style.top="",Xo()}function qo(){1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar?l("CMTimerBar").style.display="":l("CMTimerBar").style.display="none",Qo()}function Yo(){ue=Game.dragonAura,he=Game.dragonAura2}function Ko(e){const t=Game.Achievements[e],o={};return o.name=t.name,o}function Jo(e){let t=1;if(Object.keys(e.tieredUpgrades).forEach((o=>{if(!Game.Tiers[e.tieredUpgrades[o].tier].special&&wt(e.tieredUpgrades[o].name)){let a=2;1!==Game.ascensionMode&&wt(e.unshackleUpgrade)&&wt(Game.Tiers[e.tieredUpgrades[o].tier].unshackleUpgrade)&&(a+=1===e.id?.5:.1*(20-e.id)),t*=a}})),Object.keys(e.synergies).forEach((o=>{if(wt(e.synergies[o].name)){const a=e.synergies[o];a.buildingTie1.name===e.name?t*=1+.05*a.buildingTie2.amount:a.buildingTie2.name===e.name&&(t*=1+.001*a.buildingTie1.amount)}})),e.fortune&&wt(e.fortune.name)&&(t*=1.07),e.grandma&&wt(e.grandma.name)&&(t*=1+.01*Ct.Grandma.amount*(1/(e.id-1))),"object"==typeof e.tieredUpgrades.misfortune&&1===e.vanilla&&wt(e.tieredUpgrades.misfortune.name))switch(Game.elderWrath){default:t*=1;break;case 1:t*=1.02;break;case 2:t*=1.04;break;case 3:t*=1.06}return t}function Zo(e){const t=Game.Objects[e],o={};return"Cursor"===t.name?o.cps=function(e){let t=0;wt("Thousand fingers")&&(t+=.1),wt("Million fingers")&&(t*=5),wt("Billion fingers")&&(t*=10),wt("Trillion fingers")&&(t*=20),wt("Quadrillion fingers")&&(t*=20),wt("Quintillion fingers")&&(t*=20),wt("Sextillion fingers")&&(t*=20),wt("Septillion fingers")&&(t*=20),wt("Octillion fingers")&&(t*=20),wt("Nonillion fingers")&&(t*=20),wt("Decillion fingers")&&(t*=20),wt("Undecillion fingers")&&(t*=20),wt("Unshackled cursors")&&(t*=25);let o=1,a=0;return Object.keys(Ct).forEach((e=>{"Cursor"!==Ct[e].name&&(a+=Ct[e].amount)})),t*=a,o*=Jo(e),o*=Game.magicCpS("Cursor"),o*=vt("cursorCps"),Game.ComputeCps(.1,wt("Reinforced index finger")+wt("Carpal tunnel prevention cream")+wt("Ambidextrous"),t)*o}:"Grandma"===t.name?o.cps=function(e){let o=1;if(Object.keys(Game.GrandmaSynergies).forEach((e=>{wt(Game.GrandmaSynergies[e])&&(o*=2)})),wt("Bingo center/Research facility")&&(o*=4),wt("Ritual rolling pins")&&(o*=2),wt("Naughty list")&&(o*=2),wt("Elderwort biscuits")&&(o*=1.02),o*=vt("grandmaCps"),wt("Cat ladies"))for(let e=0;e<Game.UpgradesByPool.kitten.length;e++)wt(Game.UpgradesByPool.kitten[e].name)&&(o*=1.29);o*=Jo(e);let a=0;wt("One mind")&&(a+=.02*Ct.Grandma.amount),wt("Communal brainsweep")&&(a+=.02*Ct.Grandma.amount),wt("Elder Pact")&&(a+=.05*Ct.Portal.amount);let n=0;return Object.keys(Ct).forEach((e=>{"Grandma"!==Ct[e].name&&(n+=Ct[e].amount)})),o*=1+.01*bt("Elder Battalion")*n,o*=Game.magicCpS(t.name),(t.baseCps+a)*o}:o.cps=function(e){let t=1;return t*=Jo(e),t*=Game.magicCpS(e.name),e.baseCPS*t},o.baseCps=t.baseCps,o.name=t.name,o.tieredUpgrades=t.tieredUpgrades,o.synergies=t.synergies,o.fortune=t.fortune,o.grandma=t.grandma,o.baseCPS=t.baseCps,o.id=t.id,o.vanilla=t.vanilla,o.unshackleUpgrade=t.unshackleUpgrade,o}function ea(e){const t=Game.Upgrades[e],o={};return o.power=t.power,"function"==typeof o.power&&("Sugar crystal cookies"===t.name?o.power=function(){let e=5;return Object.keys(Ct).forEach((t=>{Ct[t].level>=10&&(e+=1)})),e}:o.power=function(){let e=2;if(wt("Starlove")&&(e=3),Game.hasGod){const t=Tt("seasons");1===t?e*=1.3:2===t?e*=1.2:3===t&&(e*=1.1)}return e}),o.pool=t.pool,o.name=t.name,o}function ta(){Z=Game.UpgradesOwned,ee=Game.pledges,te=Game.AchievementsOwned,oe=Game.heavenlyPower,ae=Game.prestige,Object.keys(Game.Objects).forEach((e=>{const t=Game.Objects[e];let o=Ct[e];void 0===o&&(Ct[e]=Zo(e),o=Ct[e],Vo(e)),o.amount=t.amount,o.level=t.level,o.totalCookies=t.totalCookies,o.basePrice=t.basePrice,o.free=t.free,t.minigameLoaded&&("Temple"===t.name&&(re=t.minigame.slot[0],se=t.minigame.slot[1],le=t.minigame.slot[2]),o.minigameLoaded=t.minigameLoaded,o.minigame=t.minigame),Ct[e]=o})),Object.keys(Game.Upgrades).forEach((e=>{const t=Game.Upgrades[e];let o=Mt[e];void 0===o&&(Mt[e]=ea(e),o=Mt[e]),o.bought=t.bought,Mt[e]=o})),Object.keys(Game.Achievements).forEach((e=>{const t=Game.Achievements[e];let o=yt[e];void 0===o&&(yt[e]=Ko(e),o=yt[e]),o.won=t.won,yt[e]=o})),Yo(),ne=ue,ie=he}function oa(e){const t=document.createElement("div");return t.style.fontWeight="bold",t.id=`${e}Title`,t.className="CMTextBlue",t.textContent=e,t}function aa(e){e.appendChild(oa("Bonus Income"));const t=document.createElement("div");t.style.marginBottom="4px",t.style.color="white",t.id="CMTooltipIncome",e.appendChild(t),e.appendChild(oa("Bonus Cookies per Click")),e.lastChild.style.display="none";const o=document.createElement("div");o.style.marginBottom="4px",o.style.color="white",o.style.display="none",o.id="CMTooltipCookiePerClick",e.appendChild(o),e.appendChild(oa("Payback Period"));const a=document.createElement("div");a.style.marginBottom="4px",a.id="CMTooltipPP",e.appendChild(a),e.appendChild(oa("Time Left"));const n=document.createElement("div");if(n.id="CMTooltipTime",e.appendChild(n),"b"===Bo){e.appendChild(oa("Production left till next achievement")),e.lastChild.id="CMTooltipProductionLeftHeader";const t=document.createElement("div");t.id="CMTooltipProductionLeft",e.appendChild(t)}if("b"===Bo){e.appendChild(oa("Buildings (price / PP) left till next achievement")),e.lastChild.id="CMTooltipNextAchievementHeader";const t=document.createElement("div");t.id="CMTooltipNextAchievement",e.appendChild(t)}}function na(e,t){let o="";return o=e.pp<=0||e.pp===1/0?mo:e.pp<pt?no:e.pp===pt?io:e.pp<ht[10][0]?ro:e.pp<ht[20][0]?so:e.pp<ht[30][0]?lo:co,0!==Number(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPSecondsLowerLimit)&&t/Ro()<Number(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPSecondsLowerLimit)&&(o=no),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPOnlyConsiderBuyable&&t-Game.cookies>0&&(o=lo),o}function ia(){let e=1;return Object.keys(Game.buffs).forEach((t=>{void 0!==Game.buffs[t].multCpS&&(e*=Game.buffs[t].multCpS)})),e}function ra(e){yt[e]&&0===yt[e].won&&(yt[e].won=1,"shadow"!==Game.Achievements[e].pool&&(te+=1))}function sa(){me=0;let e=1;const t={};Object.keys(Game.Objects).forEach((e=>{if(Game.Objects[e].minigameLoaded&&Game.Objects[e].minigame.effs){const o=Game.Objects[e].minigame.effs;Object.keys(o).forEach((e=>{t[e]?t[e]*=o[e]:t[e]=o[e]}))}})),de=t,1!==Game.ascensionMode&&(e+=.01*parseFloat(ae)*oe*function(){let e=0;if(wt("Heavenly chip secret")&&(e+=.05),wt("Heavenly cookie stand")&&(e+=.2),wt("Heavenly bakery")&&(e+=.25),wt("Heavenly confectionery")&&(e+=.25),wt("Heavenly key")&&(e+=.25),e*=1+.05*bt("Dragon God"),wt("Lucky digit")&&(e*=1.01),wt("Lucky number")&&(e*=1.01),wt("Lucky payout")&&(e*=1.01),Game.hasGod){const t=Tt("creation");1===t?e*=.7:2===t?e*=.8:3===t&&(e*=.9)}return e}()),e*=vt("cps"),wt("Heralds")&&1!==Game.ascensionMode&&(e*=1+.01*Game.heralds),Object.keys(Game.cookieUpgrades).forEach((t=>{const o=Game.cookieUpgrades[t];wt(o.name)&&("function"==typeof o.power?e*=1+.01*Mt[o.name].power(Mt[o.name]):e*=1+.01*o.power)})),wt("Specialized chocolate chips")&&(e*=1.01),wt("Designer cocoa beans")&&(e*=1.02),wt("Underworld ovens")&&(e*=1.03),wt("Exotic nuts")&&(e*=1.04),wt("Arcane sugar")&&(e*=1.05),wt("Increased merriness")&&(e*=1.15),wt("Improved jolliness")&&(e*=1.15),wt("A lump of coal")&&(e*=1.01),wt("An itchy sweater")&&(e*=1.01),wt("Santa's dominion")&&(e*=1.2),wt("Fortune #100")&&(e*=1.01),wt("Fortune #101")&&(e*=1.07),wt("Dragon scale")&&(e*=1.03);let o=1;if(Tt){let t=Tt("asceticism");1===t?e*=1.15:2===t?e*=1.1:3===t&&(e*=1.05),t=Tt("ages"),1===t?e*=1+.15*Math.sin(Zt/1e3/10800*Math.PI*2):2===t?e*=1+.15*Math.sin(Zt/1e3/43200*Math.PI*2):3===t&&(e*=1+.15*Math.sin(Zt/1e3/86400*Math.PI*2)),t=Tt("decadence"),1===t?o*=.93:2===t?o*=.95:3===t&&(o*=.98),t=Tt("industry"),1===t?o*=1.1:2===t?o*=1.06:3===t&&(o*=1.03),t=Tt("labor"),1===t?o*=.97:2===t?o*=.98:3===t&&(o*=.99)}wt("Santa's legacy")&&(e*=1+.03*(Game.santaLevel+1));const a=te/25;let n=1;if(wt("Santa's milk and cookies")&&(n*=1.05),n*=1+.05*bt("Breath of Milk"),Tt){const e=Tt("mother");1===e?n*=1.1:2===e?n*=1.05:3===e&&(n*=1.03)}n*=vt("milk");let i=1;wt("Kitten helpers")&&(i*=1+.1*a*n),wt("Kitten workers")&&(i*=1+.125*a*n),wt("Kitten engineers")&&(i*=1+.15*a*n),wt("Kitten overseers")&&(i*=1+.175*a*n),wt("Kitten managers")&&(i*=1+.2*a*n),wt("Kitten accountants")&&(i*=1+.2*a*n),wt("Kitten specialists")&&(i*=1+.2*a*n),wt("Kitten experts")&&(i*=1+.2*a*n),wt("Kitten consultants")&&(i*=1+.2*a*n),wt("Kitten assistants to the regional manager")&&(i*=1+.175*a*n),wt("Kitten marketeers")&&(i*=1+.15*a*n),wt("Kitten analysts")&&(i*=1+.125*a*n),wt("Kitten executives")&&(i*=1+.115*a*n),wt("Kitten admins")&&(i*=1+.11*a*n),wt("Kitten strategists")&&(i*=1+.105*a*n),wt("Kitten angels")&&(i*=1+.1*a*n),wt("Fortune #103")&&(i*=1+.05*a*n),Object.keys(Ct).forEach((e=>{const t=Ct[e];let i=t.cps(t);1!==Game.ascensionMode&&(i*=(1+.01*t.level)*o),"Grandma"===t.name&&wt("Milkhelp® lactose intolerance relief tablets")&&(i*=1+.05*a*n),me+=t.amount*i})),wt('"egg"')&&(me+=9),e*=i;let r=1;if(wt("Chicken egg")&&(r*=1.01),wt("Duck egg")&&(r*=1.01),wt("Turkey egg")&&(r*=1.01),wt("Quail egg")&&(r*=1.01),wt("Robin egg")&&(r*=1.01),wt("Ostrich egg")&&(r*=1.01),wt("Cassowary egg")&&(r*=1.01),wt("Salmon roe")&&(r*=1.01),wt("Frogspawn")&&(r*=1.01),wt("Shark egg")&&(r*=1.01),wt("Turtle egg")&&(r*=1.01),wt("Ant larva")&&(r*=1.01),wt("Century egg")){let e=10*Math.floor((eo-Game.startDate)/1e3/10)/60/60/24;e=Math.min(e,100),Ne=1+.1*(1-(1-e/100)**3),r*=Ne}e*=r,wt("Sugar baking")&&(e*=1+.01*Math.min(100,Game.lumps)),e*=1+bt("Radiant Appetite");const s=me*e;Object.keys(Game.CpsAchievements).forEach((e=>{s>=Game.CpsAchievements[e].threshold&&ra(Game.CpsAchievements[e].name)})),pe=s;const{n:l}=Game.shimmerTypes.golden,c=bt("Dragon's Fortune");for(let t=0;t<l;t++)e*=1+1.23*c;const d=Game.bakeryName.toLowerCase();if("orteil"===d?e*=.99:"ortiel"===d&&(e*=.98),wt("Elder Covenant")&&(e*=.95),wt("Golden switch [off]")){let t=1.5;if(wt("Residual luck")){const e=Game.goldenCookieUpgrades;Object.keys(e).forEach((o=>{wt(e[o])&&(t+=.1)}))}e*=t}if(wt("Shimmering veil [off]")){let t=.5;wt("Reinforced membrane")&&(t+=.1),wt("Delicate touch")&&(t+=.05),wt("Steadfast murmur")&&(t+=.05),wt("Glittering edge")&&(t+=.05),e*=1+t}wt("Magic shenanigans")&&(e*=1e3),wt("Occult obstruction")&&(e*=0),me=Game.runModHookOnValue("cps",me),e*=ia(),me*=e}const la=["Fortune #001","Fortune #002","Fortune #003","Fortune #004","Fortune #005","Fortune #006","Fortune #007","Fortune #008","Fortune #009","Fortune #010","Fortune #011","Fortune #012","Fortune #013","Fortune #014","Fortune #015","Fortune #016","Fortune #017","Fortune #018","Fortune #019","Fortune #020","Fortune #100","Fortune #101","Fortune #102","Fortune #103","Fortune #104"],ca=["Skull cookies","Ghost cookies","Bat cookies","Slime cookies","Pumpkin cookies","Eyeball cookies","Spider cookies"],da=["Christmas tree biscuits","Snowflake biscuits","Snowman biscuits","Holly biscuits","Candy cane biscuits","Bell biscuits","Present biscuits"],ma=["Pure heart biscuits","Ardent heart biscuits","Sour heart biscuits","Weeping heart biscuits","Golden heart biscuits","Eternal heart biscuits","Prism heart biscuits"],pa=["Elderwort biscuits","Bakeberry cookies","Duketater cookies","Green yeast digestives","Wheat slims","Fern tea","Ichor syrup"];function ua(e){return yt[e]?yt[e].won:0}function ha(){let e=0;Object.keys(Game.GrandmaSynergies).forEach((t=>{wt(Game.GrandmaSynergies[t])&&(e+=1)})),!ua("Elder")&&e>=7&&ra("Elder"),!ua("Veteran")&&e>=14&&ra("Veteran");let t=0,o=1,a=1,n=1e5;Object.keys(Ct).forEach((e=>{t+=Ct[e].amount,n=Math.min(Ct[e].amount,n),ua("Mathematician")||Ct[e].amount<Math.min(128,2**(Game.ObjectsById.length-Game.Objects[e].id-1))&&(o=0),ua("Base 10")||Ct[e].amount<10*(Game.ObjectsById.length-Game.Objects[e].id)&&(a=0)})),n>=1&&ra("One with everything"),1===o&&ra("Mathematician"),1===a&&ra("Base 10"),n>=100&&ra("Centennial"),n>=150&&ra("Centennial and a half"),n>=200&&ra("Bicentennial"),n>=250&&ra("Bicentennial and a half"),n>=300&&ra("Tricentennial"),n>=350&&ra("Tricentennial and a half"),n>=400&&ra("Quadricentennial"),n>=450&&ra("Quadricentennial and a half"),n>=500&&ra("Quincentennial"),n>=550&&ra("Quincentennial and a half"),n>=600&&ra("Sexcentennial"),n>=650&&ra("Sexcentennial and a half"),n>=700&&ra("Septcentennial"),t>=100&&ra("Builder"),t>=500&&ra("Architect"),t>=1e3&&ra("Engineer"),t>=2500&&ra("Lord of Constructs"),t>=5e3&&ra("Grand design"),t>=7500&&ra("Ecumenopolis"),t>=1e4&&ra("Myriad"),Z>=20&&ra("Enhancer"),Z>=50&&ra("Augmenter"),Z>=100&&ra("Upgrader"),Z>=200&&ra("Lord of Progress"),Z>=300&&ra("The full picture"),Z>=400&&ra("When there's nothing left to add"),Z>=500&&ra("Kaizen"),Z>=600&&ra("Beyond quality"),Z>=700&&ra("Oft we mar what's well"),t>=4e3&&Z>=300&&ra("Polymath"),t>=8e3&&Z>=400&&ra("Renaissance baker"),Ct.Cursor.amount+Ct.Grandma.amount>=777&&ra("The elder scrolls");let i=!0;Object.keys(ca).forEach((e=>{wt(ca[e])||(i=!1)})),i&&ra("Spooky cookies");let r=!0;if(Object.keys(da).forEach((e=>{wt(da[e])||(r=!1)})),r&&ra("Let it snow"),wt("Fortune cookies")){const e=Game.Tiers.fortune.upgrades;let t=0;Object.keys(e).forEach((o=>{wt(e[o].name)&&(t+=1)})),t>=e.length&&ra("O Fortuna")}}function ga(e,t){ta(),Ct[e].amount+=t;const o=Ct[e];"Cursor"===e?(o.amount>=1&&ra("Click"),o.amount>=2&&ra("Double-click"),o.amount>=50&&ra("Mouse wheel"),o.amount>=100&&ra("Of Mice and Men"),o.amount>=200&&ra("The Digital"),o.amount>=300&&ra("Extreme polydactyly"),o.amount>=400&&ra("Dr. T"),o.amount>=500&&ra("Thumbs, phalanges, metacarpals"),o.amount>=600&&ra("With her finger and her thumb"),o.amount>=700&&ra("Gotta hand it to you"),o.amount>=800&&ra("The devil's workshop"),o.amount>=900&&ra("All on deck"),o.amount>=1e3&&ra("A round of applause")):Object.keys(Game.Objects[o.name].tieredAchievs).forEach((e=>{o.amount>=Game.Tiers[Game.Objects[o.name].tieredAchievs[e].tier].achievUnlock&&ra(Game.Objects[o.name].tieredAchievs[e].name)}));const a=te;return sa(),ha(),a!==te&&sa(),me-Game.cookiesPs}function fa(e,t,o){let a=e,n=0;for(;a<o;)a+=.002*Math.max(.002,(a/Math.max(t,100))**.5),n+=1;return n/Game.fps}function ka(){null!==l("CMDispTooltipWarningParent")&&(0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos?(l("CMDispTooltipWarningParent").style.top="auto",l("CMDispTooltipWarningParent").style.margin="4px -4px",l("CMDispTooltipWarningParent").style.padding="3px 4px"):(l("CMDispTooltipWarningParent").style.right="auto",l("CMDispTooltipWarningParent").style.margin="4px",l("CMDispTooltipWarningParent").style.padding="4px 3px"))}function Ca(){if(ta(),"none"!==l("tooltipAnchor").style.display&&l("CMTooltipArea")){l("CMTooltipArea").innerHTML="";const e=function(){l("tooltip").firstChild.style.paddingBottom="4px";const e=document.createElement("div");return e.style.border="1px solid",e.style.padding="4px",e.style.margin="0px -4px",e.id="CMTooltipBorder",e.className="CMTextGray",e}();l("CMTooltipArea").appendChild(e),"b"===Bo?function(){let e;if(1===Game.buyMode?wo=e:e=wo,1===Game.buyBulk?e=Le:10===Game.buyBulk?e=Ae:100===Game.buyBulk&&(e=We),Fo=Game.Objects[Po].bulkPrice,Eo=e[Po].bonus,1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade&&1===Game.buyMode){if(aa(l("CMTooltipBorder")),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade&&1===Game.buyMode){l("CMTooltipIncome").textContent=to(Eo,2);const t=Math.round(Eo/Game.cookiesPs*1e4);Number.isFinite(t)&&0!==t?l("CMTooltipIncome").textContent+=` (${t/100}% of income)`:l("CMTooltipIncome").textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`,l("CMTooltipBorder").className=oo+e[Po].colour,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime?l("CMTooltipPP").textContent=Uo(e[Po].pp):l("CMTooltipPP").textContent=to(e[Po].pp,2),l("CMTooltipPP").className=oo+e[Po].colour;const o=Ho((Fo-(Game.cookies+Io()))/Ro());l("CMTooltipTime").textContent=o.text,"Done!"===o.text&&Game.cookies<e[Po].price?l("CMTooltipTime").textContent=`${o.text} (with Wrink)`:l("CMTooltipTime").textContent=o.text,l("CMTooltipTime").className=oo+o.colour}l("CMTooltipProductionLeftHeader").style.display="none",l("CMTooltipTime").style.marginBottom="0px";for(const e of Object.keys(Game.Objects[Po].productionAchievs))if(!Game.HasAchiev(Game.Objects[Po].productionAchievs[e].achiev.name)){const t=Game.Objects[Po].productionAchievs[e];l("CMTooltipTime").style.marginBottom="4px",l("CMTooltipProductionLeftHeader").style.display="",l("CMTooltipProductionLeft").className=`ProdAchievement${Po}`,l("CMTooltipProductionLeft").textContent=to(t.pow-Ct[Po].totalCookies,15),l("CMTooltipProductionLeft").style.color="white";break}const t=je[Po];if(t.AmountNeeded<101){let e;l("CMTooltipProductionLeft").style.marginBottom="4px",l("CMTooltipNextAchievementHeader").style.display="",e=Game.cookiesPs?Math.max(t.price-(Game.cookies+Io()),0)/Game.cookiesPs+t.price/ga(Po,t.AmountNeeded):t.price/ga(Po,t.AmountNeeded),l("CMTooltipNextAchievement").textContent=`${to(t.AmountNeeded)} / ${to(t.price)} / `,l("CMTooltipNextAchievement").style.color="white";const o=document.createElement("span");Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime?o.textContent=Uo(e):o.textContent=to(e),o.className=oo+na({pp:e},t.price),l("CMTooltipNextAchievement").appendChild(o)}else l("CMTooltipNextAchievementHeader").style.display="none",l("CMTooltipProductionLeft").style.marginBottom="0px"}else l("CMTooltipArea").style.display="none"}():"u"===Bo?function(){if(aa(l("CMTooltipBorder")),Eo=ze[Game.UpgradesInStore[Po].name].bonus,Fo=Game.Upgrades[Game.UpgradesInStore[Po].name].getPrice(),No=ze[Game.UpgradesInStore[Po].name].bonusMouse,1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade){l("CMTooltipIncome").textContent=to(Eo,2);const e=Math.round(Eo/Game.cookiesPs*1e4);"0"===l("CMTooltipIncome").textContent?(l("Bonus IncomeTitle").style.display="none",l("CMTooltipIncome").style.display="none",l("Payback PeriodTitle").style.display="none",l("CMTooltipPP").style.display="none"):(Number.isFinite(e)&&0!==e?l("CMTooltipIncome").textContent+=` (${e/100}% of income)`:l("CMTooltipIncome").textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`,l("CMTooltipBorder").className=oo+ze[Game.UpgradesInStore[Po].name].colour),No&&(l("CMTooltipCookiePerClick").textContent=to(No),l("CMTooltipCookiePerClick").style.display="block",l("CMTooltipCookiePerClick").previousSibling.style.display="block"),!Eo&&No?(l("CMTooltipPP").textContent=`${to(Fo/No)} Clicks`,l("CMTooltipPP").style.color="white",l("Payback PeriodTitle").style.display="block",l("CMTooltipPP").style.display="block"):(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime?l("CMTooltipPP").textContent=Uo(ze[Game.UpgradesInStore[Po].name].pp):l("CMTooltipPP").textContent=to(ze[Game.UpgradesInStore[Po].name].pp,2),l("CMTooltipPP").className=oo+ze[Game.UpgradesInStore[Po].name].colour);const t=Ho((Fo-(Game.cookies+Io()))/Ro());if(l("CMTooltipTime").textContent=t.text,"Done!"===t.text&&Game.cookies<Game.UpgradesInStore[Po].getPrice()?l("CMTooltipTime").textContent=`${t.text} (with Wrink)`:l("CMTooltipTime").textContent=t.text,l("CMTooltipTime").className=oo+t.colour,"Chocolate egg"===Game.UpgradesInStore[Po].name){l("CMTooltipBorder").lastChild.style.marginBottom="4px",l("CMTooltipBorder").appendChild(oa("Cookies to be gained (Currently/Max)"));const e=document.createElement("div");e.style.color="white",e.textContent=`${to(.05*Game.cookies)} / ${to(De)}`,l("CMTooltipBorder").appendChild(e)}}else l("CMTooltipArea").style.display="none"}():"s"===Bo?function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipLump){const t=l("CMTooltipBorder");t.appendChild(oa("Current Sugar Lump"));const o=document.createElement("div");o.id="CMTooltipTime",t.appendChild(o);const a=0===(e=Game.lumpCurrentType)?{text:"Normal",colour:mo}:1===e?{text:"Bifurcated",colour:io}:2===e?{text:"Golden",colour:ro}:3===e?{text:"Meaty",colour:so}:4===e?{text:"Caramelized",colour:co}:{text:"Unknown Sugar Lump",colour:lo};o.textContent=a.text,o.className=oo+a.colour}else l("CMTooltipArea").style.display="none";var e}():"g"===Bo?function(){const{minigame:e}=Game.Objects["Wizard tower"],t=e.getSpellCost(e.spellsById[Po]);if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipGrim&&t<=e.magicM){const o=l("CMTooltipBorder");o.appendChild(oa("Time Left"));const a=document.createElement("div");a.id="CMTooltipTime",o.appendChild(a);const n=Ho(fa(e.magic,e.magicM,t));if(a.textContent=n.text,a.className=oo+n.colour,t<=e.magic){o.appendChild(oa("Recover Time"));const a=document.createElement("div");a.id="CMTooltipRecover",o.appendChild(a);const n=Ho(fa(Math.max(0,e.magic-t),e.magicM,e.magic));a.textContent=n.text,a.className=oo+n.colour}if("0"===Po){o.appendChild(oa("Cookies to be gained/lost"));const e=document.createElement("div");e.id="x",o.appendChild(e);const t=document.createElement("span");t.style.color="#33FF00",t.textContent=to(Math.max(Math.min(.15*Game.cookies,60*Game.cookiesPs*30),7),2),e.appendChild(t);const a=document.createElement("span");a.textContent=" / ",e.appendChild(a);const n=document.createElement("span");n.style.color="red",n.textContent=to(Math.min(Game.cookies,Math.min(.15*Game.cookies,60*Game.cookiesPs*15)+13),2),e.appendChild(n)}l("CMTooltipArea").appendChild(o)}else l("CMTooltipArea").style.display="none"}():"p"===Bo?function(){const{minigame:e}=Game.Objects.Farm;if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipPlots&&0!==e.plot[Po[1]][Po[0]][0]){const t=e.plot[Po[1]][Po[0]][1]>e.plantsById[e.plot[Po[1]][Po[0]][0]-1].mature,o=e.plantsById[e.plot[Po[1]][Po[0]][0]-1].name;l("CMTooltipBorder").appendChild(oa("Reward (Current / Maximum)"));const a=document.createElement("div");a.id="CMTooltipPlantReward",l("CMTooltipBorder").appendChild(a),"Chocoroot"===o||"White chocoroot"===o?l("CMTooltipPlantReward").textContent=`${t?to(Math.min(.03*Game.cookies,60*Game.cookiesPs*3)):"0"} / ${to(60*Game.cookiesPs*3)}`:"Bakeberry"===o?l("CMTooltipPlantReward").textContent=`${t?to(Math.min(.03*Game.cookies,60*Game.cookiesPs*30)):"0"} / ${to(60*Game.cookiesPs*30)}`:"Queenbeet"===o?l("CMTooltipPlantReward").textContent=`${t?to(Math.min(.04*Game.cookies,60*Game.cookiesPs*60)):"0"} / ${to(60*Game.cookiesPs*60)}`:"Duketater"===o?l("CMTooltipPlantReward").textContent=`${t?to(Math.min(.08*Game.cookies,60*Game.cookiesPs*120)):"0"} / ${to(60*Game.cookiesPs*120)}`:l("CMTooltipArea").style.display="none"}else l("CMTooltipArea").style.display="none"}():"ha"===Bo?function(){const{minigame:e}=Game.Objects.Farm;if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipLump){l("CMTooltipBorder").appendChild(oa("Cookies gained from harvesting:"));let t=0,o=0;Game.keys[16]&&Game.keys[17]&&(o=1);for(let a=0;a<6;a++)for(let n=0;n<6;n++)if(e.plot[a][n][0]>=1){const i=e.plot[a][n],r=e.plantsById[i[0]-1],s=r.name;let l=!0;o&&r.immortal&&(l=!1),i[1]<r.matureBase&&(l=!1),l&&"Bakeberry"===s?t+=Math.min(.03*Game.cookies,60*Game.cookiesPs*30):l&&"Chocoroot"===s||"White chocoroot"===s?t+=Math.min(.03*Game.cookies,60*Game.cookiesPs*3):l&&"Queenbeet"===s?t+=Math.min(.04*Game.cookies,60*Game.cookiesPs*60):l&&"Duketater"===s&&(t+=Math.min(.08*Game.cookies,60*Game.cookiesPs*120))}l("CMTooltipBorder").appendChild(document.createTextNode(to(t)))}else l("CMTooltipArea").style.display="none"}():"sm"===Bo?function(){const{minigame:e}=Game.Objects.Bank;if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipStocks){const t=l("CMTooltipBorder"),o=e.goodsById[Po];t.appendChild(oa("Current Mode"));const a=document.createElement("div");a.id="CMTooltipMode",t.appendChild(a);const n=o.mode,i=["Stable","Slow Rise","Slow Fall","Fast Rise","Fast Fall","Chaotic"];a.textContent=i[n];const r=[mo,ro,so,io,lo,co];a.className=oo+r[n],t.appendChild(oa("Delta"));const s=document.createElement("div");s.id="CMTooltipDelta",t.appendChild(s),s.textContent=to(o.d);const c=o.d<0?lo:io;s.className=oo+c,t.appendChild(oa("Resting Value"));const d=document.createElement("div");d.id="CMTooltipRestingValue",t.appendChild(d),d.textContent=`$${to(e.getRestingVal(o.id))}`,d.style.color="white",t.appendChild(oa("Expected Next Value"));const m=document.createElement("div");m.id="CMTooltipExpectedValue",t.appendChild(m);const p=function(e,t,o,a,n,i){let r=e,s=t;switch(s*=.97+.01*Game.auraMult("Supreme Intellect"),a){case 0:s*=.95;break;case 1:s*=.99,s+=.02;break;case 2:s*=.99,s-=.02;break;case 3:s+=.06,r+=2.5;break;case 4:s-=.06,r-=2.5}return r+=.01*(o-r),3===a&&(r-=.582),4===a&&(r+=.6),r>100+3*(n-1)&&s>0&&(s*=.9),r<5&&(r+=.5*(5-r)),r<5&&s<0&&(s*=.95),Math.max(r+s,1)}(o.val,o.d,e.getRestingVal(o.id),o.mode,Game.Objects.Bank.level);m.textContent="$"+to(p)+(p<o.val?"▼":"▲");const u=p<o.val?lo:io;m.className=oo+u,l("CMTooltipArea").appendChild(t)}else l("CMTooltipArea").style.display="none"}():"wb"===Bo?function(){l("tooltip").innerHTML="",l("tooltip").appendChild(oa("Reward:"));const e=document.createElement("div");e.id="CMWrinklerReward","PopAllNormal"===Po?e.textContent=to(Ue):"PopFattest"===Po&&(e.textContent=to(He[0])),l("tooltip").appendChild(e)}():("pag"===Bo||"pas"===Bo&&-1!==Po[1])&&function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipPantheon){const e=l("CMTooltipBorder");let t;t="pas"===Bo?Po[1]:Po,e.appendChild(oa("Effect in position 1:"));const o=document.createElement("div");if(o.id="CMPantheonTooltipPosition1",0!==kt[t][0]){o.textContent=to(kt[t][0]);const e=Math.round(kt[t][0]/Game.cookiesPs*1e4);Number.isFinite(e)&&0!==e?o.textContent+=` (${e/100}% of income)`:o.textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`}else o.textContent="No effect to CPS";e.appendChild(o),e.appendChild(oa("Effect in position 2:"));const a=document.createElement("div");if(a.id="CMPantheonTooltipPosition2",0!==kt[t][1]){a.textContent=to(kt[t][1]);const e=Math.round(kt[t][1]/Game.cookiesPs*1e4);Number.isFinite(e)&&0!==e?a.textContent+=` (${e/100}% of income)`:a.textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`}else a.textContent="No effect to CPS";e.appendChild(a),e.appendChild(oa("Effect in position 3:"));const n=document.createElement("div");if(n.id="CMPantheonTooltipPosition2",0!==kt[t][2]){n.textContent=to(kt[t][2]);const e=Math.round(kt[t][2]/Game.cookiesPs*1e4);Number.isFinite(e)&&0!==e?n.textContent+=` (${e/100}% of income)`:n.textContent+=` (<0${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator?",":"."}01% of income)`}else n.textContent="No effect to CPS";e.appendChild(n),l("CMTooltipArea").appendChild(e)}else l("CMTooltipArea").style.display="none"}(),function(){if("b"===Bo||"u"===Bo){null===document.getElementById("CMDispTooltipWarningParent")&&(l("tooltipAnchor").appendChild(function(){const e=document.createElement("div");e.style.position="absolute",e.style.display="block",e.style.left="auto",e.style.bottom="auto",e.id="CMDispTooltipWarningParent";const t=function(e,t,o,a,n){const i=document.createElement("div");i.id=e,i.style.display="none",i.style.transition="opacity 0.1s ease-out",i.className="CMBorder"+t,i.style.padding="2px",i.style.background="#000 url(img/darkNoise.png)";const r=document.createElement("div");i.appendChild(r);const s=document.createElement("span");s.className=oo+t,s.style.fontWeight="bold",s.textContent=o,r.appendChild(s),r.appendChild(document.createTextNode(a));const l=document.createElement("div");i.appendChild(l);const c=document.createElement("span");return c.id=n,l.appendChild(document.createTextNode("Deficit: ")),l.appendChild(c),i};return e.appendChild(t("CMDispTooltipWarnLucky",lo,"Warning: ",'Purchase of this item will put you under the number of Cookies required for "Lucky!"',"CMDispTooltipWarnLuckyText")),e.firstChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnLuckyFrenzy",ro,"Warning: ",'Purchase of this item will put you under the number of Cookies required for "Lucky!" (Frenzy)',"CMDispTooltipWarnLuckyFrenzyText")),e.lastChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnConjure",co,"Warning: ",'Purchase of this item will put you under the number of Cookies required for "Conjure Baked Goods"',"CMDispTooltipWarnConjureText")),e.lastChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnConjureFrenzy",co,"Warning: ",'Purchase of this item will put you under the number of Cookies required for "Conjure Baked Goods" (Frenzy)',"CMDispTooltipWarnConjureFrenzyText")),e.lastChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnEdifice",co,"Warning: ",'Purchase of this item will put you under the number of Cookies needed for "Spontaneous Edifice" to possibly give you your most expensive building"',"CMDispTooltipWarnEdificeText")),e.lastChild.style.marginBottom="4px",e.appendChild(t("CMDispTooltipWarnUser",lo,"Warning: ",`Purchase of this item will put you under the number of Cookies equal to ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser} seconds of CPS`,"CMDispTooltipWarnUserText")),e}()),ka()),0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos?l("CMDispTooltipWarningParent").style.right="0px":l("CMDispTooltipWarningParent").style.top=`${l("tooltip").offsetHeight}px`,l("CMDispTooltipWarningParent").style.width=l("tooltip").offsetWidth-6+"px";const e=Game.cookies+Io()-Fo,t=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnBon?Eo:0;let o=ke;if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnBon){let e=Eo;e/=ia(),o+=60*e*15/.15}if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLucky&&e<o&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnLucky").style.display="",l("CMDispTooltipWarnLuckyText").textContent=`${to(o-e)} (${Uo((o-e)/(Ro()+t))})`):l("CMDispTooltipWarnLucky").style.display="none",1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLuckyFrenzy){const a=7*o;e<a&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnLuckyFrenzy").style.display="",l("CMDispTooltipWarnLuckyFrenzyText").textContent=`${to(a-e)} (${Uo((a-e)/(Ro()+t))})`):l("CMDispTooltipWarnLuckyFrenzy").style.display="none"}else l("CMDispTooltipWarnLuckyFrenzy").style.display="none";if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnConjure){const a=2*o;e<a&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnConjure").style.display="",l("CMDispTooltipWarnConjureText").textContent=`${to(a-e)} (${Uo((a-e)/(Ro()+t))})`):l("CMDispTooltipWarnConjure").style.display="none"}else l("CMDispTooltipWarnConjure").style.display="none";if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnConjureFrenzy){const a=2*o*7;e<a&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnConjureFrenzy").style.display="",l("CMDispTooltipWarnConjureFrenzyText").textContent=`${to(a-e)} (${Uo((a-e)/(Ro()+t))})`):l("CMDispTooltipWarnConjureFrenzy").style.display="none"}else l("CMDispTooltipWarnConjureFrenzy").style.display="none";1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnEdifice&&Game.Objects["Wizard tower"].minigameLoaded&&xe&&e<xe&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnEdifice").style.display="",l("CMDispTooltipWarnEdificeText").textContent=`${to(xe-e)} (${Uo((xe-e)/(Ro()+t))})`):l("CMDispTooltipWarnEdifice").style.display="none",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser>0&&e<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser*Ro()&&("b"!==Bo||1===Game.buyMode)?(l("CMDispTooltipWarnUser").style.display="",l("CMDispTooltipWarnUser").children[0].textContent=`Purchase of this item will put you under the number of Cookies equal to ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser} seconds of CPS`,l("CMDispTooltipWarnUserText").textContent=`${to(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser*Ro()-e)} (${Uo((Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser*Ro()-e)/(Ro()+t))})`):l("CMDispTooltipWarnUser").style.display="none"}else null!==l("CMDispTooltipWarningParent")&&l("CMDispTooltipWarningParent").remove()}()}else null===l("CMTooltipArea")&&null!==l("CMDispTooltipWarningParent")&&l("CMDispTooltipWarningParent").remove()}function Ma(){if(Game.prefs.autosave&&Game.drawT%10==0&&"stats"===Game.onMenu&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Stats){const e=document.getElementById("CMStatsAutosaveTimer");e&&(e.innerText=Game.sayTime(60*Game.fps-Game.T%(60*Game.fps),4))}Wo(),$o(),jo(),function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar){const e=l("CMTimerBar").offsetWidth-163,t=l("CMTimerBar").offsetWidth-133;let o=0;if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AutosaveTimerBar&&Game.prefs.autosave){const e=(60*Game.fps-(Game.OnAscend?0:Game.T%(60*Game.fps)))/Game.fps;l("CMTimerBarAutosave").style.display="",l("CMTimerBarAutosaveBar").style.width=`${Math.round(e*(t-8*Math.ceil(e).toString().length)/60)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarAutosaveBar").textContent=Math.ceil(e):l("CMTimerBarAutosaveBar").textContent="",l("CMTimerBarAutosaveTime").textContent=Math.ceil(e),o+=1}else l("CMTimerBarAutosave").style.display="none";if(0!==Game.shimmerTypes.golden.spawned||Game.Has("Golden switch [off]"))l("CMTimerBarGC").style.display="none";else{l("CMTimerBarGC").style.display="",l("CMTimerBarGCMinBar").style.width=`${Math.round(Math.max(0,Game.shimmerTypes.golden.minTime-Game.shimmerTypes.golden.time)*e/Game.shimmerTypes.golden.maxTime)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarGCMinBar").textContent=Math.ceil((Game.shimmerTypes.golden.minTime-Game.shimmerTypes.golden.time)/Game.fps):l("CMTimerBarGCMinBar").textContent="",Game.shimmerTypes.golden.minTime===Game.shimmerTypes.golden.maxTime?(l("CMTimerBarGCMinBar").style.borderTopRightRadius="10px",l("CMTimerBarGCMinBar").style.borderBottomRightRadius="10px"):(l("CMTimerBarGCMinBar").style.borderTopRightRadius="",l("CMTimerBarGCMinBar").style.borderBottomRightRadius=""),l("CMTimerBarGCBar").style.width=`${Math.round(Math.min(Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.minTime,Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.time)*e/Game.shimmerTypes.golden.maxTime)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarGCBar").textContent=Math.ceil(Math.min(Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.minTime,Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.time)/Game.fps):l("CMTimerBarGCBar").textContent="";const t=Math.max(0,(Game.shimmerTypes.golden.time-Game.shimmerTypes.golden.minTime)/(Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.minTime))**5;l("CMTimerBarGCTime").textContent=`${Math.ceil((Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.time)/Game.fps)} ${t<.01?"<":""}${t.toLocaleString("en",{style:"percent"})}`,o+=1}if("christmas"===Game.season&&0===Game.shimmerTypes.reindeer.spawned){l("CMTimerBarRen").style.display="",l("CMTimerBarRenMinBar").style.width=`${Math.round(Math.max(0,Game.shimmerTypes.reindeer.minTime-Game.shimmerTypes.reindeer.time)*e/Game.shimmerTypes.reindeer.maxTime)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarRenMinBar").textContent=Math.ceil((Game.shimmerTypes.reindeer.minTime-Game.shimmerTypes.reindeer.time)/Game.fps):l("CMTimerBarRenMinBar").textContent="",l("CMTimerBarRenBar").style.width=`${Math.round(Math.min(Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.minTime,Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.time)*e/Game.shimmerTypes.reindeer.maxTime)}px`,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay>=1?l("CMTimerBarRenBar").textContent=Math.ceil(Math.min(Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.minTime,Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.time)/Game.fps):l("CMTimerBarRenBar").textContent="";const t=Math.max(0,(Game.shimmerTypes.reindeer.time-Game.shimmerTypes.reindeer.minTime)/(Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.minTime))**5;l("CMTimerBarRenTime").textContent=`${Math.ceil((Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.time)/Game.fps)} ${t<.01?"<":""}${t.toLocaleString("en",{style:"percent"})}`,o+=1}else l("CMTimerBarRen").style.display="none";const a={};l("CMTimerBarBuffTimers").innerHTML="",Object.keys(Game.buffs).forEach((e=>{if(Game.buffs[e]){const n=zo(Game.buffs[e].name,Game.buffs[e].name,[{id:`${Game.buffs[e].name}Bar`}]);n.style.display="";let i="";i=void 0!==So[Game.buffs[e].name]?So[Game.buffs[e].name]:co,n.lastChild.children[1].className=ao+i,n.lastChild.children[1].style.color="black",2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay?n.lastChild.children[1].textContent=`${Math.round(Game.buffs[e].time/Game.buffs[e].maxTime*100)}%`:n.lastChild.children[1].textContent="",n.lastChild.children[1].style.width=`${Math.round(Game.buffs[e].time*(t-8*Math.ceil(Game.buffs[e].time/Game.fps).toString().length)/Game.buffs[e].maxTime)}px`,n.lastChild.children[2].textContent=Math.ceil(Game.buffs[e].time/Game.fps),o+=1,a[Game.buffs[e].name]=n}})),Object.keys(a).forEach((e=>{l("CMTimerBarBuffTimers").appendChild(a[e])})),0!==o&&(l("CMTimerBar").style.height=12*o+2+"px"),Do!==o&&(Do=o,Qo())}}(),_o(),Ca(),function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipWrink&&1===Co){let e=!1;Object.keys(Game.wrinklers).forEach((t=>{const o=Game.wrinklers[t];if(o.phase>0&&o.selected){if(e=!0,0===yo[t]||void 0===yo[t]){const e=document.createElement("div"),o=document.createElement("div");o.style.minWidth="120px",o.style.marginBottom="4px";const a=document.createElement("div");a.style.textAlign="center",a.id="CMTooltipWrinkler",o.appendChild(a),e.appendChild(o),Game.tooltip.draw(this,escape(e.innerHTML)),Mo=t,yo[t]=1}}else yo[t]=0})),e||Game.tooltip.hide()}}(),function(){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipWrink&&null!==l("CMTooltipWrinkler")){let{sucked:e}=Game.wrinklers[Mo],t=1.1;if(Game.Has("Sacrilegious corruption")&&(t*=1.05),1===Game.wrinklers[Mo].type&&(t*=3),e*=t,Game.Has("Wrinklerspawn")&&(e*=1.05),Ct.Temple.minigameLoaded){const t=Game.hasGod("scorn");1===t?e*=1.15:2===t?e*=1.1:3===t&&(e*=1.05)}l("CMTooltipWrinkler").textContent=to(e)}}(),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpStats&&"stats"===Game.onMenu&&(Game.drawT-1)%(5*Game.fps)!=0&&(Game.drawT-1)%Game.fps==0&&Game.UpdateMenu(),B()}function ya(){P.addLatest(Game.computedMouseCps)}class ba{constructor(e){this.maxLength=e,this.queue=[]}addLatest(e){this.queue.push(e)>this.maxLength&&this.queue.shift()}calcAverage(e){let t=e;t>this.maxLength&&(t=this.maxLength),t>this.queue.length&&(t=this.queue.length);let o=0;for(let e=this.queue.length-1;e>=0&&e>this.queue.length-1-t;e--)o+=this.queue[e];return 0===o?0:o/t}calcSum(e){let t=e;return t>this.maxLength&&(t=this.maxLength),t>this.queue.length&&(t=this.queue.length),0===t?0:this.queue.slice(-t).reduce(((e,t)=>e+t),0)}}function Ga(e){"Cache"in window.CookieMonsterData||(window.CookieMonsterData.Cache={}),Object.keys(e).forEach((t=>{const o=t.replace(/^Cache/,"");void 0===e[t]?window.CookieMonsterData.Cache[o]=void 0:window.CookieMonsterData.Cache[o]=JSON.parse(JSON.stringify(e[t]))}))}function va(){const e=Math.floor(Date.now()/1e3);if(Game.T/Game.fps%1==0){let t=Game.cookies+ft;Game.cpsSucked>0&&(t+=$e),st=Math.max(Game.cookiesEarned,t),t*=.05;const o=e-j,a=Math.max(0,Game.cookies-$)/o,n=Math.max(0,$e-U)/o,i=Math.max(0,He[0]-H)/o,r=Math.max(0,t-De)/o,s=(Game.cookieClicks-R)/o;for(let e=0;e<o;e++)N.addLatest(a),O.addLatest(n),D.addLatest(i),L.addLatest(r),A.addLatest(s);j=e,$=Game.cookies,U=$e,H=He[0],De=t,R=Game.cookieClicks;const l=xo[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist];I=N.calcAverage(l),z=O.calcAverage(l),V=D.calcAverage(l),_=L.calcAverage(l),X=I,1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink&&(X+=z),2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink&&(X+=V);const c=Game.HasUnlocked("Chocolate egg")&&!Game.Has("Chocolate egg");lt=c||0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?I+z+(c?_:0):X,Ve=A.calcAverage(To[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist])}Ga({CacheRealCookiesEarned:st,CacheLastCPSCheck:j,CacheLastCookies:$,CacheLastWrinkCookies:U,CacheLastWrinkFattestCookies:H,CacheLastChoEgg:De,CacheLastClicks:R,CacheAverageGainBank:I,CacheAverageGainWrink:z,CacheAverageGainWrinkFattest:V,CacheAverageGainChoEgg:_,CacheAverageCPS:X,CacheAvgCPSWithChoEgg:lt,CacheAverageClicks:Ve})}function wa(e,t,o,a,n){let i=0;for(let e=Math.max(0,o);e<Math.max(0,o+n);e++)i+=Game.priceIncrease**Math.max(0,e-a);let r=t*i;return r=Game.modifyBuildingPrice(Game.Objects[e],r),Math.ceil(r)}function xa(e,t){Object.keys(e).forEach((o=>{if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPRigidelMode&&1===t)e[o].colour=mo;else{e[o].colour=na(e[o],wa(o,Game.Objects[o].basePrice,Game.Objects[o].amount,Game.Objects[o].free,t));for(let t=0;t<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop;t++)e[o].pp===ht[t][0]&&(e[o].colour=mo)}}))}function Ta(e,t){Object.keys(e).forEach((o=>{const a=wa(o,Game.Objects[o].basePrice,Game.Objects[o].amount,Game.Objects[o].free,t);Game.cookiesPs?e[o].pp=Math.max(a-(Game.cookies+Io()),0)/Game.cookiesPs+a/e[o].bonus:e[o].pp=a/e[o].bonus,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPRigidelMode&&1===t||ht.push([e[o].pp,t,a])}))}function Sa(){!function(){pt=1/0,ht=[],void 0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop&&(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop=0),Ta(Le,1),Ta(Ae,10),Ta(We,100),ht.sort(((e,t)=>e[0]-t[0]));let e=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop;if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPOnlyConsiderBuyable)for(;ht[e][2]>Game.cookies&&(e+=1,ht.length!==e+1););pt=ht[e][0],ut=ht[e][1],xa(Le,1),xa(Ae,10),xa(We,100),Ga({CacheMinPP:pt,CacheMinPPBulk:ut,CachePPArray:ht})}(),Object.keys(ze).forEach((e=>{Game.cookiesPs?ze[e].pp=Math.max(Game.Upgrades[e].getPrice()-(Game.cookies+Io()),0)/Game.cookiesPs+Game.Upgrades[e].getPrice()/ze[e].bonus:ze[e].pp=Game.Upgrades[e].getPrice()/ze[e].bonus,Number.isNaN(ze[e].pp)&&(ze[e].pp=1/0),ze[e].colour=na(ze[e],Game.Upgrades[e].getPrice())})),window.CookieMonsterData.Objects1=JSON.parse(JSON.stringify(Le)),window.CookieMonsterData.Objects10=JSON.parse(JSON.stringify(Ae)),window.CookieMonsterData.Objects100=JSON.parse(JSON.stringify(We)),window.CookieMonsterData.Upgrades=[],Object.entries(ze).forEach((e=>{window.CookieMonsterData.Upgrades[e[0]]=JSON.parse(JSON.stringify(e[1]))}))}function Fa(e){if("toggle"===Game.Upgrades[e].pool||0===Game.Upgrades[e].bought&&Game.Upgrades[e].unlocked&&"prestige"!==Game.Upgrades[e].pool){ta(),"Shimmering veil [on]"===Mt[e].name?Mt["Shimmering veil [off]"].bought=0:"Golden switch [on]"===Mt[e].name?Mt["Golden switch [off]"].bought=0:Mt[e].bought=(Mt[e].bought+1)%2,Game.CountsAsUpgradeOwned(Game.Upgrades[e].pool)&&(Z+=1),"Elder Pledge"===e?(ee+=1,ee>0&&ra("Elder nap"),ee>=5&&ra("Elder slumber")):"Elder Covenant"===e?ra("Elder calm"):"Prism heart biscuits"===e?ra("Lovely cookies"):"Heavenly key"===e&&ra("Wholesome");const t=te;sa(),ha(),t!==te&&sa();const o=function(){let e=0;wt("Thousand fingers")&&(e+=.1),wt("Million fingers")&&(e*=5),wt("Billion fingers")&&(e*=10),wt("Trillion fingers")&&(e*=20),wt("Quadrillion fingers")&&(e*=20),wt("Quintillion fingers")&&(e*=20),wt("Sextillion fingers")&&(e*=20),wt("Septillion fingers")&&(e*=20),wt("Octillion fingers")&&(e*=20),wt("Nonillion fingers")&&(e*=20),wt("Decillion fingers")&&(e*=20),wt("Undecillion fingers")&&(e*=20),wt("Unshackled cursors")&&(e*=25);let t=0;Object.keys(Ct).forEach((e=>{t+=Ct[e].amount})),t-=Ct.Cursor.amount,e*=t,wt("Plastic mouse")&&(e+=.01*me),wt("Iron mouse")&&(e+=.01*me),wt("Titanium mouse")&&(e+=.01*me),wt("Adamantium mouse")&&(e+=.01*me),wt("Unobtainium mouse")&&(e+=.01*me),wt("Eludium mouse")&&(e+=.01*me),wt("Wishalloy mouse")&&(e+=.01*me),wt("Fantasteel mouse")&&(e+=.01*me),wt("Nevercrack mouse")&&(e+=.01*me),wt("Armythril mouse")&&(e+=.01*me),wt("Technobsidian mouse")&&(e+=.01*me),wt("Plasmarble mouse")&&(e+=.01*me),wt("Miraculite mouse")&&(e+=.01*me),wt("Aetherice mouse")&&(e+=.01*me),wt("Omniplast mouse")&&(e+=.01*me),wt("Fortune #104")&&(e+=.01*me);let o=1;if(wt("Santa's helpers")&&(o*=1.1),wt("Cookie egg")&&(o*=1.1),wt("Halo gloves")&&(o*=1.1),wt("Dragon claw")&&(o*=1.03),wt("Aura gloves")&&(o*=1+.05*Math.min(Game.Objects.Cursor.level,wt("Luminous gloves")?20:10)),o*=vt("click"),Ct.Temple.minigameLoaded&&Tt){const e=Tt("labor");1===e?o*=1.15:2===e?o*=1.1:3===e&&(o*=1.05)}Object.keys(Game.buffs).forEach((e=>{void 0!==Game.buffs[e].multClick&&(o*=Game.buffs[e].multClick)})),o*=1+.05*bt("Dragon Cursor");let a=o*Game.ComputeCps(1,wt("Reinforced index finger")+wt("Carpal tunnel prevention cream")+wt("Ambidextrous"),e);return a=Game.runModHookOnValue("cookiesPerClick",a),Game.hasBuff("Cursed finger")&&(a=Game.buffs["Cursed finger"].power),a}()-Game.computedMouseCps;return o?[me-Game.cookiesPs,o]:[me-Game.cookiesPs]}return[]}function Ea(e){const t={};return Object.keys(Game.Objects).forEach((o=>{t[o]={},t[o].bonus=ga(o,e),1!==e&&(Y=1)})),t}function Ba(){Object.keys(Game.Objects).forEach((e=>{Le[e].price=wa(e,Game.Objects[e].basePrice,Game.Objects[e].amount,Game.Objects[e].free,1),Ae[e].price=wa(e,Game.Objects[e].basePrice,Game.Objects[e].amount,Game.Objects[e].free,10),We[e].price=wa(e,Game.Objects[e].basePrice,Game.Objects[e].amount,Game.Objects[e].free,100),je[e].price=wa(e,Game.Objects[e].basePrice,Game.Objects[e].amount,Game.Objects[e].free,je[e].AmountNeeded)})),Ga({CacheObjectsNextAchievement:je})}function Pa(){Le=Ea(1),Ae=Ea(10),We=Ea(100),function(){ze={};for(let e=0;e<Game.UpgradesInStore.length;e++){const t=Game.UpgradesInStore[e].name,o=Fa(t);"Elder Pledge"===t?(ze[t]={bonus:Game.cookiesPs-I},1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink?ze[t].bonus-=z:2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink&&(ze[t].bonus-=V),Number.isFinite(ze[t].bonus)||(ze[t].bonus=0)):(ze[t]={},o[0]&&(ze[t].bonus=o[0]),o[1]&&(ze[t].bonusMouse=o[1]))}}()}function Na(e,t,o){let a=0,n=0,i=0,r=0,s=1+Math.max(0,Math.ceil(Math.log(Game.cookies)/Math.LN10)-10);for(;i<t*o;)n=Math.max(e,Math.min(Math.floor(1/9*10**s*e*o),t*o)),i=Math.max(e,Math.min(Math.floor(1/9*10**(s+1)*e*o),t*o)),r=Math.floor(1/9*10**(s+1)*e*o),a+=n,s+=1;return[a,n,r]}function Oa(){let e=60*Se*60*6*Fe;const t=ia();t>0?e/=t:e=0,Ke=Na(7,e,Ee),qe=2*Ke[1]/Ee,Ye=Ke[2]/60/60/6/Fe,et=Na(6,e,Be),Je=2*et[1]/Be,Ze=et[2]/60/60/6/Fe,at=Na(7,7*e,Ee),tt=2*at[1]/Ee,ot=at[2]/60/60/6/Fe,rt=Na(6,7*e,Be),nt=2*rt[1]/Be,it=rt[2]/60/60/6/Fe,Ga({CacheChainMaxReward:Ke,CacheChainRequired:qe,CacheChainRequiredNext:Ye,CacheChainWrathMaxReward:et,CacheChainWrathRequired:Je,CacheChainWrathRequiredNext:Ze,CacheChainFrenzyMaxReward:at,CacheChainFrenzyRequired:tt,CacheChainFrenzyRequiredNext:ot,CacheChainFrenzyWrathMaxReward:rt,CacheChainFrenzyWrathRequired:nt,CacheChainFrenzyWrathRequiredNext:it})}function Da(){const e=Math.floor(Date.now()/1e3);if(Game.T/Game.fps%1==0){const t=Game.HowMuchPrestige(Game.cookiesReset),o=Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned))-Math.floor(t),a=e-Q,n=Math.max(0,o-q)/a;for(let e=0;e<a;e++)W.addLatest(n);Q=e,q=o,Pe=W.calcAverage(5)}Ga({CacheLastHeavenlyCheck:Q,CacheLastHeavenlyChips:q,CacheHCPerSecond:Pe})}function La(){_e="",Qe="",Xe="";const e=[];Object.keys(Game.Upgrades).forEach((t=>{e.push(Game.Upgrades[t])})),e.sort((function(e,t){return e.order>t.order?1:e.order<t.order?-1:0})),Object.keys(e).forEach((t=>{const o=e[t];if(0===o.bought){let e="";e+=function(e){let t="crate upgrade missing";"prestige"===e.pool&&(t+=" heavenly");let o=0;Game.prefs.crates||(o=1),o&&(t+=" noFrame");let{icon:a}=e;e.iconFunction&&(a=e.iconFunction());const n=`function() {return Game.crateTooltip(Game.UpgradesById[${e.id}], 'stats');}`;return`<div class="${t}"\n\t${Game.getDynamicTooltip(n,"top",!0)}\n\tstyle = "${a[2]?`background-image: url(${a[2]});`:""}background-position:${48*-a[0]}px ${48*-a[1]}px;">\n\t</div>`}(o),"prestige"===o.pool?Xe+=e:"cookie"===o.pool?Qe+=e:"toggle"!==o.pool&&"unused"!==o.pool&&"debug"!==o.pool&&(_e+=e)}}))}function Aa(){if("christmas"===Game.season){let e=60*Game.cookiesPs;Game.hasBuff("Elder frenzy")&&(e*=.5),Game.hasBuff("Frenzy")&&(e*=.75),Oe=Math.max(25,e),Game.Has("Ho ho ho-flavored frosting")&&(Oe*=2)}Ga({CacheSeaSpec:Oe})}function Wa(){ke=900*Se/.15,ke*=Fe;const e=ia();e>0?ke/=e:ke=0,Ce=Ee*(.15*ke)+13,Me=Be*(.15*ke)+13,ye=7*ke,be=Ee*(.15*ye)+13,Ge=Be*(.15*ye)+13,ve=2*ke,we=.15*ve,xe=0;let t=0,o=0;Object.keys(Game.Objects).forEach((e=>{Game.Objects[e].amount>t&&(t=Game.Objects[e].amount),Game.Objects[e].amount>0&&(o+=1)})),Object.keys(Game.Objects).forEach((e=>{(Game.Objects[e].amount<t||1===o)&&Game.Objects[e].amount<400&&2*Game.Objects[e].price>xe&&(xe=2*Game.Objects[e].price,Te=e)})),Ga({CacheLucky:ke,CacheLuckyReward:Ce,CacheLuckyWrathReward:Me,CacheLuckyFrenzy:ye,CacheLuckyRewardFrenzy:be,CacheLuckyWrathRewardFrenzy:Ge,CacheConjure:ve,CacheConjureReward:we,CacheEdifice:xe,CacheEdificeBuilding:Te})}function ja(){let e=1,t=1,o=1;wt("Green yeast digestives")&&(o*=1.01),wt("Dragon fang")&&(o*=1.03),e*=1+.1*Game.auraMult("Ancestral Metamorphosis"),e*=Game.eff("goldenCookieGain"),t*=1+.1*Game.auraMult("Unholy Dominion"),t*=Game.eff("wrathCookieGain"),Ee=o*e,Be=o*t,Fe=1,0===Game.shimmerTypes.golden.n&&(Fe*=1+1.23*Game.auraMult("Dragon's Fortune")),Ga({CacheGoldenCookiesMult:Ee,CacheWrathCookiesMult:Be,CacheDragonsFortuneMultAdjustment:Fe})}function $a(e){const t={};Object.keys(Game.Objects).forEach((o=>{if(0!==Object.keys(je).length&&je[o].TotalNeeded>Game.Objects[o].amount&&!e)t[o]={AmountNeeded:je[o].TotalNeeded-Game.Objects[o].amount,TotalNeeded:je[o].TotalNeeded,price:wa(o,Game.Objects[o].basePrice,Game.Objects[o].amount,Game.Objects[o].free,je[o].TotalNeeded-Game.Objects[o].amount)};else{const e=function(e){const t=Game.AchievementsOwned;let o=100,a=100;for(;o>-1;)if(ga(e,o),te>t)a=o,o-=10;else{if(100===o)return 101;for(o+=1;o<=a;){if(ga(e,o),te>t)return o;o+=1}}return 101}(o);t[o]={AmountNeeded:e,TotalNeeded:Game.Objects[o].amount+e,price:wa(o,Game.Objects[o].basePrice,Game.Objects[o].amount,Game.Objects[o].free,e)}}})),je=t,Ga({CacheObjectsNextAchievement:je})}function Ua(){$e=0,Ue=0,He=[0,null];for(let e=0;e<Game.wrinklers.length;e++){let{sucked:t}=Game.wrinklers[e],o=1.1;if(Game.Has("Sacrilegious corruption")&&(o*=1.05),1===Game.wrinklers[e].type&&(o*=3),t*=o,Game.Has("Wrinklerspawn")&&(t*=1.05),Ct.Temple.minigameLoaded){const e=Game.hasGod("scorn");1===e?t*=1.15:2===e?t*=1.1:3===e&&(t*=1.05)}$e+=t,0===Game.wrinklers[e].type&&(Ue+=t,t>He[0]&&(He=[t,e]))}Ga({CacheWrinklersTotal:$e,CacheWrinklersNormal:Ue,CacheWrinklersFattest:He})}function Ha(){Yo(),Ua(),Wa(),ja(),Oa(),La(),Aa(),N=new ba(xo[xo.length-1]),O=new ba(xo[xo.length-1]),D=new ba(xo[xo.length-1]),L=new ba(xo[xo.length-1]),A=new ba(To[To.length-1]),W=new ba(5),P=new ba(20*To[To.length-1]),Da(),$a(),va(),Pa(),Ba(),Sa()}function Ra(){Object.keys(Game.wrinklers).forEach((e=>{Game.wrinklers[e].sucked>0&&0===Game.wrinklers[e].type&&(Game.wrinklers[e].hp=0)}))}function Ia(e,t){if("b"===e){if(l("tooltip").innerHTML=Game.Objects[t].tooltip(),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipAmor){const e=wa(t,Game.Objects[t].basePrice,0,Game.Objects[t].free,Game.Objects[t].amount),o=e-Game.Objects[t].totalCookies;o>0&&(l("tooltip").innerHTML=l("tooltip").innerHTML.split("so far</div>").join(`so far<br/>• <b>${to(o)}</b> ${1===Math.floor(o)?"cookie":"cookies"} left to amortize (${Ho((e-Game.Objects[t].totalCookies)/(Game.Objects[t].storedTotalCps*Game.globalCpsMult)).text})</div>`))}-1===Game.buyMode&&(l("tooltip").innerHTML=l("tooltip").innerHTML.split(to(Game.Objects[t].bulkPrice)).join(to((Game.Objects[t],Game.Objects[t].basePrice,Game.Objects[t].amount,Game.Objects[t].free,Game.buyBulk,1))))}else if("u"===e){if(!Game.UpgradesInStore[t])return"";l("tooltip").innerHTML=Game.crateTooltip(Game.UpgradesInStore[t],"store")}else"s"===e?l("tooltip").innerHTML=Game.lumpTooltip():"g"===e?l("tooltip").innerHTML=Game.Objects["Wizard tower"].minigame.spellTooltip(t)():"p"===e?l("tooltip").innerHTML=Game.ObjectsById[2].minigame.tileTooltip(t[0],t[1])():"ha"===e?l("tooltip").innerHTML=Game.ObjectsById[2].minigame.toolTooltip(1)():"sm"===e?l("tooltip").innerHTML=Game.Objects.Bank.minigame.goodTooltip(t)():"wb"===e?l("tooltip").innerHTML="":"pag"===e?l("tooltip").innerHTML=Game.Objects.Temple.minigame.godTooltip(t)():"pas"===e&&(l("tooltip").innerHTML=Game.Objects.Temple.minigame.slotTooltip(t[0])());if("b"===e&&1===Game.buyMode||"u"===e||"s"===e||"g"===e||"p"===e&&!Game.keys[16]||"ha"===e||"sm"===e||"wb"===e||"pag"===e||"pas"===e&&-1!==t[1]){const e=document.createElement("div");e.id="CMTooltipArea",l("tooltip").appendChild(e)}return Bo=e,Po=t,Ca(),l("tooltip").innerHTML}function za(){1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Favicon&&It>0?ct.wrath?l("CMFavicon").href="https://CookieMonsterTeam.github.io/CookieMonster/favicon/wrathCookie.ico":l("CMFavicon").href="https://CookieMonsterTeam.github.io/CookieMonster/favicon/goldenCookie.ico":l("CMFavicon").href="https://orteil.dashnet.org/cookieclicker/favicon.ico"}function Va(){Ct=[],Object.keys(Game.Objects).forEach((e=>{Ct[e]=Zo(e)})),Mt=[],Object.keys(Game.Upgrades).forEach((e=>{Mt[e]=ea(e)})),yt=[],Object.keys(Game.Achievements).forEach((e=>{yt[e]=Ko(e)})),ta()}function _a(){Game.Objects["Wizard tower"].minigameLoaded&&Object.keys(Game.Objects["Wizard tower"].minigame.spellsById).forEach((e=>{null!==l(`grimoireSpell${e}`).onmouseover&&(Yt[e]=l(`grimoireSpell${e}`).onmouseover,l(`grimoireSpell${e}`).onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("g",`${e}`)),"this"),Game.tooltip.wobble()})}))}function Xa(){if(!jt&&Game.Objects["Wizard tower"].minigameLoaded){const{minigame:e}=Game.Objects["Wizard tower"];At=e.draw,Game.Objects["Wizard tower"].minigame.draw=function(){At(),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GrimoireBar&&e.magic<e.magicM&&Game.drawT%5==0&&(e.magicBarTextL.innerHTML+=` (${Uo(fa(e.magic,e.magicM,e.magicM))})`,e.magicBarL.style.width="75%")},jt=!0}}function Qa(){!function(){if(!Wt&&Game.Objects["Wizard tower"].minigameLoaded){const{minigame:e}=Game.Objects["Wizard tower"];Dt=e.launch,Lt=new Function(`return ${e.launch.toString().split("=this").join("= Game.Objects['Wizard tower'].minigame")}`),Game.Objects["Wizard tower"].minigame.launch=function(){Lt(),_a(),jt=!1,Xa(),Wt=!0}}}(),Xa()}function qa(){if(ge!==Game.dragonLevel||ce){if(Game.dragonLevel<25&&Game.dragonLevels[Game.dragonLevel].buy.toString().includes("sacrifice")){const e=Game.dragonLevels[Game.dragonLevel].buy.toString().match(/Objects\[(.*)\]/);let t=null!==e?e[1]:Game.ObjectsById[Game.dragonLevel-5].name;const o=Game.dragonLevels[Game.dragonLevel].buy.toString().match(/sacrifice\((.*?)\)/)[1];if("i"!==t)if(t=t.replaceAll("'",""),Game.Objects[t].amount<o)fe="Not enough buildings to sell";else{let e=0;ta();for(let a=0;a<o;a++){let o=Ct[t].basePrice*Game.priceIncrease**Math.max(0,Ct[t].amount-1-Ct[t].free);o=Game.modifyBuildingPrice(Ct[t],o),o=Math.ceil(o),e+=o,Ct[t].amount-=1}fe=`Cost to rebuy: ${to(e)}`}else{let e=0;ta(),Object.keys(Game.Objects).forEach((a=>{if(t=a,Game.Objects[t].amount<o)fe="Not enough buildings to sell";else{for(let a=0;a<o;a++){let o=Ct[t].basePrice*Game.priceIncrease**Math.max(0,Ct[t].amount-1-Ct[t].free);o=Game.modifyBuildingPrice(Ct[t],o),o=Math.ceil(o),e+=o,Ct[t].amount-=1}fe=`Cost to rebuy: ${to(e)}`}}))}}ge=Game.dragonLevel}Ga({CacheLastDragonLevel:ge})}const Ya={Favourite:"Favourite Settings",Calculation:"Calculation",Notation:"Notation",Colours:"Colours and colour coding",BarsDisplay:"Infobars and visual settings",Tooltip:"Tooltips",Statistics:"Statistics",Notification:"Notifications",Miscellaneous:"Miscellaneous"},Ka={NotificationGeneral:"General Notifications",NotificationGC:"Golden Cookie",NotificationFC:"Fortune Cookie",NotificationSea:"Season Special",NotificationGard:"Garden Tick",NotificationMagi:"Full Magic Bar",NotificationWrink:"Wrinkler",NotificationWrinkMax:"Maximum Wrinklers"},Ja=function(e){if(1===e){const e=function(){try{Notification.requestPermission().then()}catch(e){return!1}return!0};"Notification"in window?e()?Notification.requestPermission().then():Notification.requestPermission():console.log("This browser does not support notifications.")}};function Za(){BeautifyAll(),Game.RefreshStore(),Game.RebuildUpgrades(),_o(),Wo(),$o()}function en(){1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar?(l("CMBotBar").style.display="",_o()):l("CMBotBar").style.display="none",Qo()}const tn={CPSMode:new S(1,"bool","Calculation",["Current cookies per second","Average cookies per second"],"Calculate times using current cookies per second or average cookies per second",!1),AvgCPSHist:new S(3,"bool","Calculation",["Average CPS in past 10s","Average CPS in past 15s","Average CPS in past 30s","Average CPS in past 1m","Average CPS in past 5m","Average CPS in past 10m","Average CPS in past 15m","Average CPS in past 30m"],"How much time average Cookies Per Second should consider",!1),AvgClicksHist:new S(0,"bool","Calculation",["Average clicks in past 1s","Average clicks in past 5s","Average clicks in past 10s","Average clicks in past 15s","Average clicks in past 30s"],"How much time average Cookie Clicks should consider",!1),CalcWrink:new F(0,"bool","Calculation",["Calculate with wrinklers OFF","Calculate with wrinklers ON","Calculate with single fattest wrinkler ON"],"Calculate times and average Cookies Per Second with (only the single non-shiny fattest) wrinklers",!0,(()=>{ce=!0})),Scale:new F(2,"bool","Notation",["Game's setting scale","Metric","Short scale","Short scale (Abbreviated)","Scientific notation","Engineering notation"],"Change how long numbers are formatted",!1,(()=>{Za()})),ScaleDecimals:new F(2,"bool","Notation",["1 decimals","2 decimals","3 decimals"],'Set the number of decimals used when applicable. This only works with Cookie Monster scales and not with "Game\'s Setting Scale"',!1,(()=>{Za()})),ScaleSeparator:new F(0,"bool","Notation",[". for decimals (standard)",". for thousands"],"Set the separator used for decimals and thousands",!1,(()=>{Za()})),ScaleCutoff:new T(999999,"numscale","Notation","Notation cut-off point: ","The number from which Cookie Monster will start formatting numbers based on chosen scale. Standard is 999,999. Setting this above 999,999,999 might break certain notations",1,999999999),TimeFormat:new S(0,"bool","Notation",["Time XXd, XXh, XXm, XXs","Time XX:XX:XX:XX:XX","Time XXx, XXx"],"Change the time format",!1),DetailedTime:new F(1,"bool","Notation",["Detailed time OFF","Detailed time ON"],"Change how time is displayed in certain statistics and tooltips",!0,(()=>{1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.DetailedTime?Game.sayTime=bo:Game.sayTime=Jt.sayTime})),PPDisplayTime:new S(0,"bool","Notation",["PP as value (standard)","PP as time unit"],"Display PP as calculated value or as approximate time unit. Note that PP does not translate directly into a time unit and this is therefore only an approximation.",!1),BuildColour:new F(1,"bool","Colours",["Building colours OFF","Building colours ON"],"Colour code buildings",!0,(()=>{Wo()})),PPOnlyConsiderBuyable:new S(0,"bool","Colours",["Don't ignore non-buyable","Ignore non-buyable"],"Makes Cookie Monster label buildings and upgrades you can't buy right now red, useful in those situations where you just want to spend your full bank 'most optimally'",!0),PPExcludeTop:new S(0,"bool","Colours",["Don't ignore any","Ignore 1st best","Ignore 1st and 2nd best","Ignore 1st, 2nd and 3rd best"],"Makes Cookie Monster ignore the 1st, 2nd or 3rd best buildings in labeling and colouring PP values",!0),PPRigidelMode:new S(0,"bool","Colours",["Rigidel mode OFF","Rigidel mode ON"],'Makes Cookie Monster ignore all "buy 1" options when colouring PP in order to stay at a total building count ending in 10 for pantheon god Rigidel',!0),PPSecondsLowerLimit:new T(0,"numscale","Colours","Lower limit for PP (in seconds): ",'If a building or upgrade costs less than the specified seconds of CPS it will also be considered optimal and label it as such ("PP is less than xx seconds of CPS"); setting to 0 ignores this option',0,1/0),ColourBlue:new x("#4bb8f0","colour","Colours","Standard colour is blue. Used to show upgrades better than best PP building, for Click Frenzy bar, and for various labels"),ColourGreen:new x("#00ff00","colour","Colours","Standard colour is green. Used to show best PP building, for Blood Frenzy bar, and for various labels"),ColourYellow:new x("#ffff00","colour","Colours","Standard colour is yellow. Used to show buildings within the top 10 of PP, for Frenzy bar, and for various labels"),ColourOrange:new x("#ff7f00","colour","Colours","Standard colour is orange. Used to show buildings within the top 20 of PP, for Next Reindeer bar, and for various labels"),ColourRed:new x("#ff0000","colour","Colours","Standard colour is Red. Used to show buildings within the top 30 of PP, for Clot bar, and for various labels"),ColourPurple:new x("#ff00ff","colour","Colours","Standard colour is purple. Used to show buildings outside of the top 30 of PP, for Next Cookie bar, and for various labels"),ColourGray:new x("#b3b3b3","colour","Colours","Standard colour is gray. Used to show negative or infinity PP, and for Next Cookie/Next Reindeer bar"),ColourPink:new x("#ff1493","colour","Colours","Standard colour is pink. Used for Dragonflight bar"),ColourBrown:new x("#8b4513","colour","Colours","Standard colour is brown. Used for Dragon Harvest bar"),BotBar:new F(1,"bool","BarsDisplay",["Bottom bar OFF","Bottom bar ON"],"Building information",!0,(()=>{en()})),TimerBar:new F(1,"bool","BarsDisplay",["Timer bar OFF","Timer bar ON"],"Bar with timers for golden cookie, season popup, Frenzy (Normal, Clot, Elder), Click Frenzy",!0,(()=>{qo()})),TimerBarPos:new F(0,"bool","BarsDisplay",["Timer bar position (top left)","Timer bar position (bottom)"],"Placement of the timer bar",!1,(()=>{0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos?(l("CMTimerBar").style.width="30%",l("CMTimerBar").style.bottom="",l("game").insertBefore(l("CMTimerBar"),l("sectionLeft"))):(l("CMTimerBar").style.width="100%",l("CMTimerBar").style.bottom="0px",l("wrapper").appendChild(l("CMTimerBar"))),Qo()})),TimerBarOverlay:new S(2,"bool","BarsDisplay",["Timer bar overlay OFF","Timer bar overlay only seconds","Timer bar overlay full"],"Overlay on timers displaying seconds and/or percentage left",!0),AutosaveTimerBar:new S(0,"bool","BarsDisplay",["Autosave timer bar OFF","Autosave timer bar ON"],"Show a timer counting down till next autosave in the timer bar",!0),UpBarColour:new F(1,"bool","BarsDisplay",["Upgrade colours/bar OFF","Upgrade colours with bar ON","Upgrade colours without bar ON"],"Colour code upgrades and optionally add a counter bar",!1,(()=>{1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour?(l("CMUpgradeBar").style.display="",$o()):2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour?(l("CMUpgradeBar").style.display="none",$o()):(l("CMUpgradeBar").style.display="none",Game.RebuildUpgrades())})),UpgradeBarFixedPos:new F(1,"bool","BarsDisplay",["Upgrade bar fixed position OFF","Upgrade bar fixed position ON"],"Lock the upgrade bar at top of the screen to prevent it from moving ofscreen when scrolling",!0,(()=>{1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpgradeBarFixedPos?(l("CMUpgradeBar").style.position="sticky",l("CMUpgradeBar").style.top="0px"):l("CMUpgradeBar").style.position=""})),SortBuildings:new F(0,"bool","BarsDisplay",["Sort buildings: default","Sort buildings: PP of x1 purchase","Sort buildings: PP of selected bulk mode","Sort buildings: price until next achievement"],"Sort the display of buildings in default order, by PP, or until next achievement",!1,(()=>{Wo()})),SortUpgrades:new F(0,"bool","BarsDisplay",["Sort upgrades: default","Sort upgrades: PP"],"Sort the display of upgrades in either default order or by PP",!1,(()=>{$o()})),UpgradesNeverCollapse:new F(0,"bool","BarsDisplay",["Upgrades always expanded OFF","Upgrades always expanded ON"],"Toggle to make the upgrades sections always expanded to the size needed to display all upgrades",!0,(()=>{jo()})),DragonAuraInfo:new S(1,"bool","BarsDisplay",["Extra dragon aura info OFF","Extra dragon aura info ON"],"Shows information about changes in CPS and costs in the dragon aura interface.",!0),GrimoireBar:new S(1,"bool","BarsDisplay",["Grimoire magic meter timer OFF","Grimoire magic meter timer ON"],"A timer overlay showing how long till the Grimoire magic meter is full",!0),GCTimer:new F(1,"bool","BarsDisplay",["Golden cookie timer OFF","Golden cookie timer ON"],"A timer on the golden cookie when it has been spawned",!0,(()=>{1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer?Object.keys(Lo).forEach((e=>{Lo[e].style.display="block",Lo[e].style.left=gt[e].l.style.left,Lo[e].style.top=gt[e].l.style.top})):Object.keys(Lo).forEach((e=>Lo[e].style.display="none"))})),Favicon:new F(1,"bool","BarsDisplay",["Favicon OFF","Favicon ON"],"Update favicon with golden/wrath cookie",!0,(()=>{za()})),WrinklerButtons:new F(1,"bool","BarsDisplay",["Extra wrinkler buttons OFF","Extra wrinkler buttons ON"],"Show buttons for popping wrinklers at bottom of cookie section",!0,(()=>{B()})),HideSectionsButtons:new F(0,"bool","BarsDisplay",["Hide buildings/upgrades button OFF","Hide buildings/upgrades button ON"],"Show buttons for hiding and showing the buildings and upgrades sections in the right column",!0,(()=>{Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.HideSectionsButtons?l("CMSectionHidButtons").style.display="":l("CMSectionHidButtons").style.display="none"})),TooltipBuildUpgrade:new S(1,"bool","Tooltip",["Building/upgrade tooltip information OFF","Building/upgrade tooltip information ON"],"Extra information in building/upgrade tooltips",!0),TooltipAmor:new S(0,"bool","Tooltip",["Buildings tooltip amortization information OFF","Buildings tooltip amortization information ON"],"Add amortization information to buildings tooltip",!0),ToolWarnLucky:new S(1,"bool","Tooltip",["Tooltip lucky warning OFF","Tooltip lucky warning ON"],'A warning when buying if it will put the bank under the amount needed for max "Lucky!" rewards',!0),ToolWarnLuckyFrenzy:new S(1,"bool","Tooltip",["Tooltip lucky frenzy warning OFF","Tooltip lucky frenzy warning ON"],'A warning when buying if it will put the bank under the amount needed for max "Lucky!" (Frenzy) rewards',!0),ToolWarnConjure:new S(1,"bool","Tooltip",["Tooltip conjure warning OFF","Tooltip conjure warning ON"],'A warning when buying if it will put the bank under the amount needed for max "Conjure Baked Goods" rewards',!0),ToolWarnConjureFrenzy:new S(1,"bool","Tooltip",["Tooltip conjure frenzy warning OFF","Tooltip conjure frenzy warning ON"],'A warning when buying if it will put the bank under the amount needed for max "Conjure Baked Goods" rewards with Frenzy active',!0),ToolWarnEdifice:new S(1,"bool","Tooltip",["Tooltip edifice warning OFF","Tooltip edifice warning ON"],'A warning when buying if it will put the bank under the amount needed for "Spontaneous Edifice" to possibly give you your most expensive building',!0),ToolWarnUser:new T(0,"numscale","Tooltip","Tooltip warning at x times CPS: ","Use this to show a customized warning if buying it will put the bank under the amount equal to value times cps; setting to 0 disables the function altogether",0,1/0),ToolWarnBon:new S(1,"bool","Tooltip",["Calculate tooltip warning with bonus CPS OFF","Calculate tooltip warning with bonus CPS ON"],"Calculate the warning with or without the bonus CPS you get from buying",!0),ToolWarnPos:new F(1,"bool","Tooltip",["Tooltip warning position (left)","Tooltip warning position (bottom)"],"Placement of the warning boxes",!1,(()=>{ka()})),TooltipGrim:new S(1,"bool","Tooltip",["Grimoire tooltip information OFF","Grimoire tooltip information ON"],"Extra information in tooltip for grimoire",!0),TooltipWrink:new S(1,"bool","Tooltip",["Wrinkler tooltip OFF","Wrinkler tooltip ON"],"Shows the amount of cookies a wrinkler will give when popping it",!0),TooltipLump:new S(1,"bool","Tooltip",["Sugar lump tooltip OFF","Sugar lump tooltip ON"],"Shows the current Sugar Lump type in Sugar lump tooltip.",!0),TooltipPlots:new S(1,"bool","Tooltip",["Garden plots tooltip OFF","Garden plots tooltip ON"],"Shows a tooltip for plants that have a cookie reward.",!0),TooltipStocks:new S(1,"bool","Tooltip",["Stock market tooltips OFF","Stock market tooltips ON"],"Shows additional info in the stock market tooltips.",!0),TooltipPantheon:new S(1,"bool","Tooltip",["Pantheon tooltip OFF","Pantheon tooltip ON"],"Shows additional info in the pantheon tooltip",!0),TooltipAscendButton:new S(1,"bool","Tooltip",["Show Extra Info Ascend Tooltip OFF","Show Extra Info Ascend Tooltip ON"],"Shows additional info in the ascend tooltip",!0),Stats:new S(1,"bool","Statistics",["Statistics OFF","Statistics ON"],"Extra Cookie Monster statistics!",!0),MissingUpgrades:new S(1,"bool","Statistics",["Missing upgrades OFF","Missing upgrades ON"],"Shows missing upgrades in statistics menu",!0),MissingAchievements:new S(0,"bool","Statistics",["Missing Achievements OFF","Missing Normal Achievements ON"],"Shows missing normal achievements in statistics menu.",!0),UpStats:new S(1,"bool","Statistics",["Statistics update rate (default)","Statistics update rate (1s)"],"Default rate is once every 5 seconds",!1),HeavenlyChipsTarget:new T(1,"numscale","Statistics","Heavenly chips target: ",'Use this to set a heavenly chips target that will be counted towards in the "prestige" statsistics sections',1,1/0),ShowMissedGC:new S(1,"bool","Statistics",["Missed GC OFF","Missed GC ON"],"Show a stat in the statistics screen that counts how many golden cookies you have missed",!0),Title:new S(1,"bool","NotificationGeneral",["Title OFF","Title ON","Title pinned tab highlight"],'Update title with colden cookie/season popup timers; pinned tab highlight only changes the title when a golden cookie/season popup spawns; "!" means that golden cookie/reindeer can spawn',!0),GeneralSound:new S(1,"bool","NotificationGeneral",["Consider game volume setting OFF","Consider game volume setting ON"],'Turning this toggle to "off" makes Cookie Monster no longer consider the volume setting of the base game, allowing mod notifications to play with base game volume turned down',!0),GCNotification:new F(0,"bool","NotificationGC",["Notification OFF","Notification ON"],"Create a notification when golden cookie spawns",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCNotification)})),GCFlash:new S(1,"bool","NotificationGC",["Flash OFF","Flash ON"],"Flash screen on golden cookie",!0),ColourGCFlash:new x("#ffffff","colour","NotificationGC","The colour of the GC flash, standard colour is white"),GCSound:new S(1,"bool","NotificationGC",["Sound OFF","Sound ON"],"Play a sound on golden cookie",!0),GCVolume:new E(100,"vol","NotificationGC",[],"Volume"),GCSoundURL:new S("https://freesound.org/data/previews/66/66717_931655-lq.mp3","url","NotificationGC","Sound URL:","URL of the sound to be played when a golden cookie spawns"),FortuneNotification:new F(0,"bool","NotificationFC",["Notification OFF","Notification ON"],"Create a notification when fortune cookie is on the ticker",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FortuneNotification)})),FortuneFlash:new S(1,"bool","NotificationFC",["Flash OFF","Flash ON"],"Flash screen on fortune cookie spawn",!0),ColourFortuneFlash:new x("#ffffff","colour","NotificationFC","The colour of the fortune flash, standard colour is white"),FortuneSound:new S(1,"bool","NotificationFC",["Sound OFF","Sound ON"],"Play a sound on fortune cookie spawn",!0),FortuneVolume:new E(100,"vol","NotificationFC",[],"Volume"),FortuneSoundURL:new S("https://freesound.org/data/previews/174/174027_3242494-lq.mp3","url","NotificationFC","Sound URL:","URL of the sound to be played when the ticker has a fortune cookie"),SeaNotification:new F(0,"bool","NotificationSea",["Notification OFF","Notification ON"],"Create a notification on season popup",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SeaNotification)})),SeaFlash:new S(1,"bool","NotificationSea",["Flash OFF","Flash ON"],"Flash screen on season popup",!0),ColourSeaFlash:new x("#ffffff","colour","NotificationSea","The colour of the season popup flash, standard colour is white"),SeaSound:new S(1,"bool","NotificationSea",["Sound OFF","Sound ON"],"Play a sound on season popup",!0),SeaVolume:new E(100,"vol","NotificationSea",[],"Volume"),SeaSoundURL:new S("https://www.freesound.org/data/previews/121/121099_2193266-lq.mp3","url","NotificationSea","Sound URL:","URL of the sound to be played when on season popup spawns"),GardFlash:new S(1,"bool","NotificationGard",["Garden Tick Flash OFF","Flash ON"],"Flash screen on garden tick",!0),ColourGardFlash:new x("#ffffff","colour","NotificationGard","The colour of the garden flash, standard colour is white"),GardSound:new S(1,"bool","NotificationGard",["Sound OFF","Sound ON"],"Play a sound on garden tick",!0),GardVolume:new E(100,"vol","NotificationGard",[],"Volume"),GardSoundURL:new S("https://freesound.org/data/previews/103/103046_861714-lq.mp3","url","NotificationGard","Garden Tick Sound URL:","URL of the sound to be played when the garden ticks"),MagicNotification:new F(0,"bool","NotificationMagi",["Notification OFF","Notification ON"],"Create a notification when magic reaches maximum",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MagicNotification)})),MagicFlash:new S(1,"bool","NotificationMagi",["Flash OFF","Flash ON"],"Flash screen when magic reaches maximum",!0),ColourMagicFlash:new x("#ffffff","colour","NotificationMagi","The colour of the magic flash, standard colour is white"),MagicSound:new S(1,"bool","NotificationMagi",["Sound OFF","Sound ON"],"Play a sound when magic reaches maximum",!0),MagicVolume:new E(100,"vol","NotificationMagi",[],"Volume"),MagicSoundURL:new S("https://freesound.org/data/previews/221/221683_1015240-lq.mp3","url","NotificationMagi","Sound URL:","URL of the sound to be played when magic reaches maxium"),WrinklerNotification:new F(0,"bool","NotificationWrink",["Notification OFF","Notification ON"],"Create a notification when a wrinkler appears",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerNotification)})),WrinklerFlash:new S(1,"bool","NotificationWrink",["Flash OFF","Flash ON"],"Flash screen when a wrinkler appears",!0),ColourWrinklerFlash:new x("#ffffff","colour","NotificationWrink","The colour of the wrinkler flash, standard colour is white"),WrinklerSound:new S(1,"bool","NotificationWrink",["Sound OFF","Sound ON"],"Play a sound when a wrinkler appears",!0),WrinklerVolume:new E(100,"vol","NotificationWrink",[],"Volume"),WrinklerSoundURL:new S("https://freesound.org/data/previews/124/124186_8043-lq.mp3","url","NotificationWrink","Sound URL:","URL of the sound to be played when a wrinkler appears"),WrinklerMaxNotification:new F(0,"bool","NotificationWrinkMax",["Notification OFF","Notification ON"],"Create a notification when the maximum amount of wrinklers has appeared",!0,(()=>{Ja(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxNotification)})),WrinklerMaxFlash:new S(1,"bool","NotificationWrinkMax",["Flash OFF","Flash ON"],"Flash screen when the maximum amount of Wrinklers has appeared",!0),ColourWrinklerMaxFlash:new x("#ffffff","colour","NotificationWrinkMax","The colour of the maximum wrinkler flash, standard colour is white"),WrinklerMaxSound:new S(1,"bool","NotificationWrinkMax",["Sound OFF","Sound ON"],"Play a sound when the maximum amount of wrinklers has appeared",!0),WrinklerMaxVolume:new E(100,"vol","NotificationWrinkMax",[],"Volume"),WrinklerMaxSoundURL:new S("https://freesound.org/data/previews/152/152743_15663-lq.mp3","url","NotificationWrinkMax","Sound URL:","URL of the sound to be played when the maximum amount of wrinklers has appeared"),BulkBuyBlock:new S(1,"bool","Miscellaneous",["Block bulk buying OFF","Block bulk buying ON"],"Block clicking bulk buying when you can't buy all. This prevents buying 7 of a building when you are in buy-10 or buy-100 mode.",!0),FavouriteSettings:new F(1,"bool","Miscellaneous",["Favourite settings section OFF","Favourite settings section ON","Favourite settings section ON (Locked)"],"Show stars before each setting which allows selecting it for a 'favourites' section at the top of the Cookie Monster settings. Setting this to Locked removes the stars but shows the 'favourites' section",!0,(()=>{Game.UpdateMenu()}))};function on(){let e="";for(let t=0;t<ho.length;t++)e+=`.CMText${ho[t]} { color: ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[`Colour${ho[t]}`]}; }\n`;for(let t=0;t<ho.length;t++)e+=`.CMBack${ho[t]} { background-color: ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[`Colour${ho[t]}`]}; }\n`;for(let t=0;t<ho.length;t++)e+=`.CMBorder${ho[t]} { border: 1px solid ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[`Colour${ho[t]}`]}; }\n`;l("CMCSS").textContent=e,Wo()}function an(){const e=G("cookieMonsterMod","Cookie Monster","optionsMenu");return Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.optionsMenu&&Object.keys(Ya).forEach((t=>{if("Favourite"===t){if(0!==Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings.length&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FavouriteSettings>0&&(e.appendChild(b.createOptionsSubHeader("cookieMonsterMod",t,Ya[t])),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[t]))for(let t=0;t<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings.length;t++)e.appendChild(b.createOptionsListing("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings[t],tn,on,Za))}else e.appendChild(b.createOptionsSubHeader("cookieMonsterMod",t,Ya[t])),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[t]&&("Notification"===t?Object.keys(Ka).forEach((t=>{const o=b.createOptionsSubHeader("cookieMonsterMod",t,Ka[t]);o.style.fontSize="15px",o.style.opacity="0.5",e.appendChild(o),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[t]&&Object.keys(tn).forEach((o=>{tn[o].group===t&&e.appendChild(b.createOptionsListing("cookieMonsterMod",o,tn,on,Za))}))})):Object.keys(tn).forEach((o=>{tn[o].group===t&&e.appendChild(b.createOptionsListing("cookieMonsterMod",o,tn,on,Za))})))})),e}function nn(e){return String(e).split(String(7)).length-1}function rn(e,t){const o=10*t;let a=7*t-e%o+e%t;return a<0&&(a+=o),a}function sn(e,t){const o=document.createElement("div");o.className="title",o.style.padding="0px 16px",o.style.opacity="0.7",o.style.fontSize="17px",o.style.fontFamily='"Kavoon", Georgia, serif',o.appendChild(document.createTextNode(`${e} `));const a=document.createElement("span");return a.style.cursor="pointer",a.style.display="inline-block",a.style.height="14px",a.style.width="14px",a.style.borderRadius="7px",a.style.textAlign="center",a.style.backgroundColor="#C0C0C0",a.style.color="black",a.style.fontSize="13px",a.style.verticalAlign="middle",a.textContent=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[t]?"-":"+",a.onclick=function(){!function(e){Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[e]+=1,Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[e]>1&&(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[e]=0),w.saveFramework()}(t),Game.UpdateMenu()},o.appendChild(a),o}function ln(e,t,o,a){const n=document.createElement("div");n.className="listing";const i=document.createElement("b");if(i.textContent=t,n.appendChild(i),"withTooltip"===e){n.className="listing",n.appendChild(document.createTextNode(" "));const e=document.createElement("span");e.onmouseout=function(){Game.tooltip.hide()},e.onmouseover=function(){Game.tooltip.draw(this,escape(fo[a].innerHTML))},e.style.cursor="default",e.style.display="inline-block",e.style.height="10px",e.style.width="10px",e.style.borderRadius="5px",e.style.textAlign="center",e.style.backgroundColor="#C0C0C0",e.style.color="black",e.style.fontSize="9px",e.style.verticalAlign="bottom",e.textContent="?",n.appendChild(e)}return n.appendChild(document.createTextNode(": ")),n.appendChild(o),n}function cn(e,t,o,a){const n=document.createElement("div");n.className="listing";const i=document.createElement("b");return i.textContent=t,!0===a&&(i.style.color=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ColourGreen),n.appendChild(i),n.appendChild(document.createTextNode(": ")),n.appendChild(o),n}function dn(e){const t=document.createDocumentFragment();t.appendChild(document.createTextNode(`${e.length} `));const o=document.createElement("span");o.onmouseout=function(){Game.tooltip.hide()};const a=document.createElement("div"),n=document.createElement("div");n.style.minWidth="140px",n.style.marginBottom="4px";const i=document.createElement("div");return i.className="name",i.style.marginBottom="4px",i.style.textAlign="center",i.textContent="Missing",n.appendChild(i),Object.keys(e).forEach((t=>{const o=document.createElement("div");o.style.textAlign="center",o.appendChild(document.createTextNode(e[t])),n.appendChild(o)})),a.appendChild(n),o.onmouseover=function(){Game.tooltip.draw(this,escape(a.innerHTML))},o.style.cursor="default",o.style.display="inline-block",o.style.height="10px",o.style.width="10px",o.style.borderRadius="5px",o.style.textAlign="center",o.style.backgroundColor="#C0C0C0",o.style.color="black",o.style.fontSize="9px",o.style.verticalAlign="bottom",o.textContent="?",t.appendChild(o),t}function mn(e){const t=document.createElement("div");if(t.className="subsection",t.appendChild(e),t.appendChild(sn("Lucky Cookies","Lucky")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Lucky&&t.appendChild(function(){const e=Game.auraMult("Dragon's Fortune")?"GoldCookDragonsFortuneTooltipPlaceholder":"GoldCookTooltipPlaceholder",t=document.createElement("div");t.className="CMStatsLuckySection";const o=Game.cookies+Io()<ke?lo:io,a=Game.cookies+Io()<ke?Uo((ke-(Game.cookies+Io()))/Ro()):"",n=document.createDocumentFragment(),i=document.createElement("span");if(i.style.fontWeight="bold",i.className=oo+o,i.textContent=to(ke),n.appendChild(i),""!==a){const e=document.createElement("small");e.textContent=` (${a})`,n.appendChild(e)}t.appendChild(ln("withTooltip",'"Lucky!" cookies required',n,e));const r=Game.cookies+Io()<ye?lo:io,s=Game.cookies+Io()<ye?Uo((ye-(Game.cookies+Io()))/Ro()):"",l=document.createDocumentFragment(),c=document.createElement("span");if(c.style.fontWeight="bold",c.className=oo+r,c.textContent=to(ye),l.appendChild(c),""!==s){const e=document.createElement("small");e.textContent=` (${s})`,l.appendChild(e)}t.appendChild(ln("withTooltip",'"Lucky!" cookies required (frenzy)',l,e));const d=Ce!==Me,m=document.createElement("span");m.style.fontWeight="bold",m.className=oo+Ce,m.textContent=to(Ce)+(d?` / ${to(Me)}`:""),t.appendChild(ln("withTooltip",'"Lucky!" reward (max)'+(d?" (golden / wrath)":""),m,e));const p=document.createElement("span");p.style.fontWeight="bold",p.className=oo+p,p.textContent=to(be)+(d?` / ${to(Ge)}`:""),t.appendChild(ln("withTooltip",'"Lucky!" reward (max) (frenzy)'+(d?" (golden / wrath)":""),p,e));const u=Math.min(.15*(Game.cookies+Io()),Se*Fe*60*15)+13,h=document.createElement("span");return h.style.fontWeight="bold",h.className=oo+h,h.textContent=to(Ee*u)+(d?` / ${to(Be*u)}`:""),t.appendChild(ln("withTooltip",'"Lucky!" reward (cur)'+(d?" (golden / wrath)":""),h,e)),t}()),t.appendChild(sn("Chain Cookies","Chain")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Chain&&t.appendChild(function(){const e=Game.auraMult("Dragon's Fortune")?"GoldCookDragonsFortuneTooltipPlaceholder":"GoldCookTooltipPlaceholder",t=document.createElement("div");t.className="CMStatsChainSection";const o=Game.cookies+Io()<qe?lo:io,a=Game.cookies+Io()<qe?Uo((qe-(Game.cookies+Io()))/Ro()):"",n=document.createDocumentFragment(),i=document.createElement("span");if(i.style.fontWeight="bold",i.className=oo+o,i.textContent=to(qe),n.appendChild(i),""!==a){const e=document.createElement("small");e.textContent=` (${a})`,n.appendChild(e)}t.appendChild(ln("withTooltip",'"Chain" cookies required',n,e));const r=Game.cookies+Io()<Je?lo:io,s=Game.cookies+Io()<Je?Uo((Je-(Game.cookies+Io()))/Ro()):"",l=document.createDocumentFragment(),c=document.createElement("span");if(c.style.fontWeight="bold",c.className=oo+r,c.textContent=to(Je),l.appendChild(c),""!==s){const e=document.createElement("small");e.textContent=` (${s})`,l.appendChild(e)}t.appendChild(ln("withTooltip",'"Chain" cookies required (Wrath)',l,e));const d=Game.cookies+Io()<tt?lo:io,m=Game.cookies+Io()<tt?Uo((tt-(Game.cookies+Io()))/Ro()):"",p=document.createDocumentFragment(),u=document.createElement("span");if(u.style.fontWeight="bold",u.className=oo+d,u.textContent=to(tt),p.appendChild(u),""!==m){const e=document.createElement("small");e.textContent=` (${m})`,p.appendChild(e)}t.appendChild(ln("withTooltip",'"Chain" cookies required (Frenzy)',p,e));const h=Game.cookies+Io()<nt?lo:io,g=Game.cookies+Io()<nt?Uo((nt-(Game.cookies+Io()))/Ro()):"",f=document.createDocumentFragment(),k=document.createElement("span");if(k.style.fontWeight="bold",k.className=oo+h,k.textContent=to(nt),f.appendChild(k),""!==g){const e=document.createElement("small");e.textContent=` (${g})`,f.appendChild(e)}t.appendChild(ln("withTooltip",'"Chain" cookies required (frenzy) (Wrath)',f,e)),t.appendChild(ln("withTooltip",'"Chain" reward (max) (golden / wrath)',document.createTextNode(`${to(Ke[0])} / ${to(et[0])}`),e)),t.appendChild(ln("withTooltip",'"Chain" reward (max) (frenzy) (golden / wrath)',document.createTextNode(`${to(at[0])} / ${to(at[0])}`),e));const C=Math.min(60*Game.cookiesPs*60*6*Fe,.5*Game.cookies),M=Na(7,C,Ee)[0],y=Na(6,C,Be)[0];return t.appendChild(ln("withTooltip",'"Chain" reward (cur) (golden / wrath)',document.createTextNode(`${to(M)} / ${to(y)}`),e)),t.appendChild(ln("withTooltip","CPS needed for next level (g / w)",document.createTextNode(`${to(Ye)} / ${to(Ze)}`),"ChainNextLevelPlaceholder")),t.appendChild(ln("withTooltip","CPS needed for next level (frenzy) (g / w)",document.createTextNode(`${to(ot)} / ${to(it)}`),"ChainNextLevelPlaceholder")),t}()),Game.Objects["Wizard tower"].minigameLoaded&&(t.appendChild(sn("Spells","Spells")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Spells&&t.appendChild(function(){const e=document.createElement("div");e.className="CMStatsSpellsSection";const t=Game.cookies+Io()<ve?lo:io,o=Game.cookies+Io()<ve?Uo((ve-(Game.cookies+Io()))/Ro()):"",a=document.createDocumentFragment(),n=document.createElement("span");if(n.style.fontWeight="bold",n.className=oo+t,n.textContent=to(ve),a.appendChild(n),""!==o){const e=document.createElement("small");e.textContent=` (${o})`,a.appendChild(e)}e.appendChild(ln("withTooltip",'"Conjure Baked Goods" cookies required',a,"GoldCookTooltipPlaceholder")),e.appendChild(ln("withTooltip",'"Conjure Baked Goods" reward (max)',document.createTextNode(to(we)),"GoldCookTooltipPlaceholder"));const i=Game.cookies+Io()<7*ve?lo:io,r=Math.min(.15*(Game.cookies+Io()),60*Se*30),s=Game.cookies+Io()<7*ve?Uo((7*ve-(Game.cookies+Io()))/Ro()):"",l=document.createDocumentFragment(),c=document.createElement("span");if(c.style.fontWeight="bold",c.className=oo+i,c.textContent=to(7*ve),l.appendChild(c),""!==s){const e=document.createElement("small");e.textContent=` (${s})`,l.appendChild(e)}return e.appendChild(ln("withTooltip",'"Conjure Baked Goods" cookies required (frenzy)',l,"GoldCookTooltipPlaceholder")),e.appendChild(ln("withTooltip",'"Conjure Baked Goods" reward (max) (frenzy)',document.createTextNode(to(7*we)),"GoldCookTooltipPlaceholder")),e.appendChild(ln("withTooltip",'"Conjure Baked Goods" reward (cur)',document.createTextNode(to(r)),"GoldCookTooltipPlaceholder")),xe&&e.appendChild(ln("withTooltip",'"Spontaneous Edifice" cookies required (most expensive building)',document.createTextNode(`${to(xe)} (${Te})`),"GoldCookTooltipPlaceholder")),e}())),Game.Objects.Farm.minigameLoaded&&(t.appendChild(sn("Garden","Garden")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Garden&&t.appendChild(function(){const e=document.createElement("div");e.className="CMStatsGardenSection";const t=Game.cookies<60*Game.cookiesPs*10*100?lo:io,o=document.createElement("span");o.style.fontWeight="bold",o.className=oo+t,o.textContent=to(60*Game.cookiesPs*10*100),e.appendChild(ln("basic","Cookies required for max reward of Bakeberry: ",o));const a=Game.cookies<60*Game.cookiesPs*100?lo:io,n=document.createElement("span");n.style.fontWeight="bold",n.className=oo+a,n.textContent=to(60*Game.cookiesPs*100),e.appendChild(ln("basic","Cookies required for max reward of Chocoroot: ",n));const i=Game.cookies<60*Game.cookiesPs*60*25?lo:io,r=document.createElement("span");r.style.fontWeight="bold",r.className=oo+i,r.textContent=to(60*Game.cookiesPs*60*25),e.appendChild(ln("basic","Cookies required for max reward of Queenbeet: ",r));const s=Game.cookies<60*Game.cookiesPs*15*100?lo:io,l=document.createElement("span");l.style.fontWeight="bold",l.className=oo+s,l.textContent=to(60*Game.cookiesPs*15*100),e.appendChild(ln("basic","Cookies required for max reward of Duketater: ",l));const c=[];return Object.keys(pa).forEach((e=>{Game.HasUnlocked(pa[e])||c.push(pa[e])})),0!==c.length&&e.appendChild(ln("basic","Rare plant drops left to unlock",dn(c))),e}())),t.appendChild(sn("Prestige","Prestige")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Prestige&&t.appendChild(function(){const e=document.createElement("div");e.className="CMStatsPrestigeSection";const t=Math.floor(Game.HowMuchPrestige(st+Game.cookiesReset+$e+(Game.HasUnlocked("Chocolate egg")&&!Game.Has("Chocolate egg")?De:0)));e.appendChild(ln("withTooltip","Prestige level (cur / max)",document.createTextNode(`${to(Game.prestige)} / ${to(t)}`),"PrestMaxTooltipPlaceholder"));const o=Math.max(0,Game.HowManyCookiesReset(t+1)-(st+Game.cookiesReset+$e+(Game.HasUnlocked("Chocolate egg")&&!Game.Has("Chocolate egg")&&De?De:0))),a=document.createDocumentFragment();a.appendChild(document.createTextNode(to(o)));const n=document.createElement("small");n.textContent=` (${Uo(o/lt,1)})`,a.appendChild(n),e.appendChild(ln("withTooltip","Cookies to next level",a,"NextPrestTooltipPlaceholder")),e.appendChild(ln("withTooltip","Heavenly chips (cur / max)",document.createTextNode(`${to(Game.heavenlyChips)} / ${to(t-Game.prestige+Game.heavenlyChips)}`),"HeavenChipMaxTooltipPlaceholder")),e.appendChild(ln("basic","Heavenly chips per second (last 5 seconds)",document.createTextNode(to(Pe,2))));const i=Number(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.HeavenlyChipsTarget);if(!Number.isNaN(i)){const t=i-Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned));t>0&&(e.appendChild(ln("basic","Heavenly chips to target set in settings (cur)",document.createTextNode(to(t)))),e.appendChild(ln("basic","Time till target (cur, current 5 second average)",document.createTextNode(Uo(t/Pe)))))}const r=function(e){let t=Game.cookiesPs;ta(),0===Mt["Heavenly key"].bought&&(Mt["Heavenly chip secret"].bought=1,Mt["Heavenly cookie stand"].bought=1,Mt["Heavenly bakery"].bought=1,Mt["Heavenly confectionery"].bought=1,Mt["Heavenly key"].bought=1,sa(),t=me,ta()),st>=1e6&&ra("Sacrifice"),st>=1e9&&ra("Oblivion"),st>=1e12&&ra("From scratch"),st>=1e15&&ra("Nihilism"),st>=1e18&&ra("Dematerialize"),st>=1e21&&ra("Nil zero zilch"),st>=1e24&&ra("Transcendence"),st>=1e27&&ra("Obliterate"),st>=1e30&&ra("Negative void"),st>=1e33&&ra("To crumbs, you say?"),st>=1e36&&ra("You get nothing"),st>=1e39&&ra("Humble rebeginnings"),st>=1e42&&ra("The end of the world"),st>=1e45&&ra("Oh, you're back"),st>=1e48&&ra("Lazarus"),st>=1e51&&ra("Smurf account"),st>=1e54&&ra("If at first you don't succeed"),Mt["Heavenly chip secret"].bought=1,Mt["Heavenly cookie stand"].bought=1,Mt["Heavenly bakery"].bought=1,Mt["Heavenly confectionery"].bought=1,Mt["Heavenly key"].bought=1,ae=e;const o=te;sa(),ha(),o!==te&&sa();const a=me-t;return ae=Game.prestige,a}(t),s=document.createDocumentFragment();s.appendChild(document.createTextNode(to(r)));const l=Math.round(r/Game.cookiesPs*1e4);if(Number.isFinite(l)&&0!==l){const e=document.createElement("small");e.textContent=` (${l/100}% of income)`,s.appendChild(e)}e.appendChild(ln("withTooltip","Reset bonus income",s,"ResetTooltipPlaceholder"));const c=Math.floor(Game.HowMuchPrestige(Game.cookiesReset)),d=Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned)),m=d-c,{luckyDigit:p,luckyNumber:u,luckyPayout:h}=function(e){const t={};let o=nn(e);const a=String(e).length;if(o>=1&&(t.luckyDigit=e,o>=2&&(t.luckyNumber=e,o>=4)))return t.luckyPayout=e,t;let n;if(n=a>=16?Math.ceil(e/10**(a-15)):e,o=nn(n),void 0===t.luckyDigit&&(o<1&&(n+=rn(n,1),o=nn(n)),t.luckyDigit=n,a>=16&&(t.luckyDigit*=10**Number(a-15))),void 0===t.luckyNumber){for(;o<2;){let e=rn(n,1);0===e&&(e=rn(n,10)),n+=e,o=nn(n)}t.luckyNumber=n,a>=16&&(t.luckyNumber*=10**Number(a-15))}let i=1;for(;o<4;){const e=rn(n,i);0===e?i*=10:(n+=e,o=nn(n))}return t.luckyPayout=n,a>=16&&(t.luckyPayout*=10**Number(a-15)),t}(d);if(!Game.Has("Lucky digit")){const t=p-d,o=m+t,a=document.createDocumentFragment();a.appendChild(document.createTextNode(`${p.toLocaleString()} / ${o.toLocaleString()} (+${t})`)),e.appendChild(ln("basic",'Next "Lucky Digit" (total / reset)',a))}if(!Game.Has("Lucky number")){const t=u-d,o=m+t,a=document.createDocumentFragment();a.appendChild(document.createTextNode(`${u.toLocaleString()} / ${o.toLocaleString()} (+${t})`)),e.appendChild(ln("basic",'Next "Lucky Number" (total / reset)',a))}if(!Game.Has("Lucky payout")){const t=h-d,o=m+t,a=document.createDocumentFragment();a.appendChild(document.createTextNode(`${h.toLocaleString()} / ${o.toLocaleString()} (+${t})`)),e.appendChild(ln("basic",'Next "Lucky Payout" (total / reset)',a))}return e}()),Game.cpsSucked>0&&(t.appendChild(sn("Wrinklers","Wrink")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Wrink)){const e=document.createDocumentFragment();e.appendChild(document.createTextNode(`${to($e)} / ${to(Ue)} `));const o=document.createElement("a");o.textContent="Pop All Normal",o.className="option",o.onclick=function(){Ra()},e.appendChild(o),t.appendChild(ln("basic","Rewards of Popping (All/Normal)",e));const a=document.createDocumentFragment();a.appendChild(document.createTextNode(`${to(He[0])} `));const n=document.createElement("a");n.textContent="Pop Single Fattest",n.className="option",n.onclick=function(){null!==He[1]&&(Game.wrinklers[He[1]].hp=0)},a.appendChild(n),t.appendChild(ln("basic",`Rewards of Popping Single Fattest Non-Shiny Wrinkler (id: ${null!==He[1]?He[1]:"None"})`,a))}if(t.appendChild(function(){const e=document.createElement("div");e.className="CMStatsSeasonSection";let t=!1;const o=[];Object.keys(ca).forEach((e=>{Game.Has(ca[e])||(o.push(ca[e]),t=!0)}));const a=[];Object.keys(da).forEach((e=>{Game.Has(da[e])||(a.push(da[e]),t=!0)}));const n=[];Object.keys(ma).forEach((e=>{Game.Has(ma[e])||(n.push(ma[e]),t=!0)}));const i=[];Object.keys(Game.eggDrops).forEach((e=>{Game.HasUnlocked(Game.eggDrops[e])||(i.push(Game.eggDrops[e]),t=!0)}));const r=[];Object.keys(Game.rareEggDrops).forEach((e=>{Game.HasUnlocked(Game.rareEggDrops[e])||(r.push(Game.rareEggDrops[e]),t=!0)}));const s=Game.HasUnlocked("Chocolate egg")&&!Game.Has("Chocolate egg"),l=Game.Has("Century egg");if(("christmas"===Game.season||t||s||l)&&(e.appendChild(sn("Season Specials","Sea")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Sea)){if(0!==o.length){e.appendChild(cn(0,"Halloween cookies left to buy",dn(o),"halloween"===Game.season));let t=.95;if(Game.HasAchiev("Spooky cookies")&&(t=.8),Game.Has("Starterror")&&(t*=.9),t*=1/Game.dropRateMult(),Game.hasGod){const e=Game.hasGod("seasons");1===e?t*=.9:2===e?t*=.95:3===e&&(t*=.97)}const a=o.length/7;e.appendChild(cn(0,"Chance of receiving a cookie from wrinkler/shiny wrinkler",document.createTextNode(`${to((1-t)*a*100)}% / ${to((1-.9*t)*a*100)}%`),"halloween"===Game.season))}if(0!==a.length){e.appendChild(cn(0,"Christmas cookies left to buy",dn(a),"christmas"===Game.season));let t=.8;if(Game.HasAchiev("Let it snow")&&(t=.6),t*=1/Game.dropRateMult(),Game.Has("Starsnow")&&(t*=.95),Game.hasGod){const e=Game.hasGod("seasons");1===e?t*=.9:2===e?t*=.95:3===e&&(t*=.97)}const o=a.length/7;e.appendChild(cn(0,"Chance of receiving a cookie from reindeer",document.createTextNode(`${to((1-t)*o*100)}%`),"christmas"===Game.season))}0!==n.length&&e.appendChild(cn(0,"Valentine cookies left to buy",dn(n),"valentines"===Game.season));const t=function(e){let t=e*(1/Game.dropRateMult());if(Game.HasAchiev("Hide & seek champion")&&(t*=.7),Game.Has("Omelette")&&(t*=.9),Game.Has("Starspawn")&&(t*=.9),Game.hasGod){const e=Game.hasGod("seasons");1===e?t*=.9:2===e?t*=.95:3===e&&(t*=.97)}const o=1-t,a=Game.eggDrops.length-i.length,n=Game.rareEggDrops.length-r.length,s=.9*o*(1-a/Game.eggDrops.length),l=.1*o*(1-n/Game.rareEggDrops.length),c=.9*o*(a/Game.eggDrops.length)+.1*o*(n/Game.rareEggDrops.length);return[s+.9*c*(1-a/Game.eggDrops.length),l+.1*c*(1-n/Game.rareEggDrops.length)]};0!==i.length&&(e.appendChild(cn(0,"Normal easter eggs left to unlock",dn(i),"easter"===Game.season)),e.appendChild(cn(0,"Chance of receiving an egg from wrinkler/golden cookie",document.createTextNode(`${to(100*t(.98)[0])}% / ${to(100*t(.9)[0])}%`),"easter"===Game.season))),0!==r.length&&(e.appendChild(cn(0,"Rare easter eggs left to unlock",dn(r),"easter"===Game.season)),e.appendChild(cn(0,"Chance of receiving a rare egg from wrinkler/golden cookie",document.createTextNode(`${to(100*t(.98)[1])}% / ${to(100*t(.9)[1])}%`),"easter"===Game.season))),"christmas"===Game.season&&e.appendChild(cn(0,"Reindeer reward",document.createTextNode(to(Oe)),!0)),s&&e.appendChild(ln("withTooltip","Chocolate egg cookies",document.createTextNode(to(De)),"ChoEggTooltipPlaceholder")),l&&e.appendChild(ln("basic","Century egg multiplier",document.createTextNode(Math.round(1e4*(Ne-1))/100+"%")))}return e}()),t.appendChild(sn("Achievements","Achievs")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Achievs&&Object.keys(Game.Objects).forEach((e=>{const o=je[e];t.appendChild(ln("basic",e,o.AmountNeeded<101?document.createTextNode(`Next achievement in ${o.AmountNeeded}, price: ${to(o.price)}`):document.createTextNode("No new achievement for next 100 buildings")))})),t.appendChild(sn("Miscellaneous","Misc")),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Misc){if(t.appendChild(ln("basic",`Average cookies per second (past ${xo[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist]<60?`${xo[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist]} seconds`:xo[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist]/60+(3===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist?" minute":" minutes")})`,document.createTextNode(to(Ro(),3)))),t.appendChild(ln("basic",`Average cookie clicks per second (past ${To[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist]}${0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist?" second":" seconds"})`,document.createTextNode(to(Ve,1)))),t.appendChild(ln("basic",`Cookies from clicking (past ${To[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist]}${0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist?" second":" seconds"})`,document.createTextNode(to(P.calcSum(Ve*To[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist]))))),Game.Has("Fortune cookies")){const e=[];Object.keys(la).forEach((t=>{Game.Has(la[t])||e.push(la[t])})),0!==e.length&&t.appendChild(ln("basic","Fortune Upgrades Left to Buy",dn(e)))}if(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ShowMissedGC&&t.appendChild(ln("basic","Missed golden cookies",document.createTextNode(to(Game.missedGoldenClicks)))),Game.prefs.autosave){const e=document.createElement("span");e.id="CMStatsAutosaveTimer",e.innerText=Game.sayTime(60*Game.fps-(Game.OnAscend?0:Game.T%(60*Game.fps)),4),t.appendChild(ln("basic","Time till autosave",e))}}l("menu").insertBefore(t,l("menu").childNodes[2]),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingUpgrades&&l("menu").childNodes.forEach((e=>{if(e.children[0])if("Prestige"===e.children[0].innerHTML&&Xe){const t=Xe.match(new RegExp("div","g")||0).length/2,o=document.createElement("div");o.id="CMMissingUpgradesPrestigeTitle",o.className="listing";const a=document.createElement("div");a.innerHTML=`<b>Missing Prestige upgrades:</b> ${t}/${Game.PrestigeUpgrades.length} (${Math.floor(t/Game.PrestigeUpgrades.length*100)}%)`,o.appendChild(a),e.appendChild(o);const n=document.createElement("div");n.className="listing crateBox",n.innerHTML=Xe,e.appendChild(n)}else if("Upgrades"===e.children[0].innerHTML){if(_e){const t=_e.match(new RegExp("div","g")||0).length/2,o=document.createElement("div");o.id="CMMissingUpgradesTitle",o.className="listing";const a=document.createElement("div");a.innerHTML=`<b>Missing normal upgrades:</b> ${t}/${Game.UpgradesByPool[""].length+Game.UpgradesByPool.tech.length} (${Math.floor(t/(Game.UpgradesByPool[""].length+Game.UpgradesByPool.tech.length)*100)}%)`,o.appendChild(a),e.insertBefore(o,e.childNodes[3]);const n=document.createElement("div");n.className="listing crateBox",n.innerHTML=_e,e.insertBefore(n,document.getElementById("CMMissingUpgradesTitle").nextSibling)}if(Qe){const t=Qe.match(new RegExp("div","g")||0).length/2,o=document.createElement("div");o.id="CMMissingUpgradesCookiesTitle",o.className="listing";const a=document.createElement("div");a.innerHTML=`<b>Missing Cookie upgrades:</b> ${t}/${Game.UpgradesByPool.cookie.length} (${Math.floor(t/Game.UpgradesByPool.cookie.length*100)}%)`,o.appendChild(a),e.appendChild(o);const n=document.createElement("div");n.className="listing crateBox",n.innerHTML=Qe,e.appendChild(n)}}})),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingAchievements&&function(){let e;Object.values(document.querySelectorAll("div.title")).forEach((t=>{t.textContent.includes("Achievements")&&(e=t.parentElement.querySelectorAll("div.listing.crateBox")[0])})),Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingAchievements&&Object.values(e.children).forEach((e=>{if(!e.className.includes("enabled")){const t=e.onclick.toString().split(/\[(.*)\]/gi)[1],{icon:o}=Game.AchievementsById[t];e.style.backgroundPosition=`${48*-o[0]}px ${48*-o[1]}px`,e.onmouseover=function(){Game.mouseDown||(Game.setOnCrate(this),Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>function(e){const t=[];"shadow"===e.pool?t.push("Shadow Achievement","#9700cf"):t.push("Achievement",0),t.push("Locked",0);let o=0;(Game.Has("Neuromancy")||Game.sesame&&"debug"===e.pool)&&(o=1),o&&0===e.won?t.push("Click to win!","#00c462"):o&&e.won>0&&t.push("Click to lose!","#00c462");let{icon:a}=e;e.iconFunction&&(a=e.iconFunction());let{desc:n}=e;e.descFunc&&(n=e.descFunc("stats"));let i="";for(let e=0;e<t.length;e+=2)e%2==0&&(i+=` <div class="tag" style="color:${0===t[e+1]?"#fff":t[e+1]};">[${t[e]}]</div>`);return i=i.substring(1),`<div style="padding:8px 4px;min-width:350px;opacity:0.5">\n <div class="icon" style="float:left;margin-left:-8px;margin-top:-8px;background-position:${48*-a[0]}px ${48*-a[1]}px;"></div>\n <div class="name">${e.name}</div>\n ${i}<div class="line"></div><div class="description">${n}</div></div>\n ${Game.sesame?`<div style="font-size:9px;">Id : ${e.id} | Order : ${Math.floor(e.order)}${e.tier?` | Tier : ${e.tier}`:""}</div>`:""}`}(Game.AchievementsById[t])),"top"),Game.tooltip.wobble())}}}))}()}function pn(e){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos){const t=parseInt(l("CMTimerBar").style.height,10);Game.mouseY-=t,e(),Game.mouseY+=t}else e()}function un(){Jt.Beautify=Beautify,Beautify=to,Jt.CalculateGains=Game.CalculateGains,Game.CalculateGains=function(){Jt.CalculateGains(),ce=1,Zt=Date.now(),eo=Date.now()},Jt.tooltip={},Jt.tooltip.draw=Game.tooltip.draw,Jt.tooltip.drawMod=new Function(`return ${Game.tooltip.draw.toString().split("this").join("Game.tooltip")}`)(),Game.tooltip.draw=function(e,t,o){Jt.tooltip.drawMod(e,t,o)},Jt.tooltip.update=Game.tooltip.update,Jt.tooltip.updateMod=new Function(`return ${Game.tooltip.update.toString().split("this.").join("Game.tooltip.")}`)(),Game.tooltip.update=function(){Jt.tooltip.updateMod(),function(){if("store"===Game.tooltip.origin){let e=0;1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLucky&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos&&null!==l("CMDispTooltipWarningParent")&&(e=l("CMDispTooltipWarningParent").clientHeight-4),Game.tooltip.tta.style.top=`${Math.min(parseInt(Game.tooltip.tta.style.top,10),l("game").clientHeight+l("topBar").clientHeight-Game.tooltip.tt.clientHeight-e-46)}px`}}()},Jt.UpdateWrinklers=Game.UpdateWrinklers,Game.UpdateWrinklers=function(){pn(Jt.UpdateWrinklers)},Jt.UpdateSpecial=Game.UpdateSpecial,Game.UpdateSpecial=function(){pn(Jt.UpdateSpecial)},l("bigCookie").removeEventListener("click",Game.ClickCookie,!1),l("bigCookie").addEventListener("click",(e=>{pn((()=>Game.ClickCookie(e,0)))}),!1),Jt.RebuildUpgrades=Game.RebuildUpgrades,Game.RebuildUpgrades=function(){Jt.RebuildUpgrades(),Kt=[],Object.keys(Game.UpgradesInStore).forEach((e=>{null!==l(`upgrade${e}`).onmouseover&&(Kt[e]=l(`upgrade${e}`).onmouseover,l(`upgrade${e}`).onmouseover=function(){Game.mouseDown||(Game.setOnCrate(this),Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("u",`${e}`)),"store"),Game.tooltip.wobble())})})),Game.CalculateGains()},Jt.ClickProduct=Game.ClickProduct,Game.ClickProduct=function(e){(!Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BulkBuyBlock||Game.ObjectsById[e].bulkPrice<=Game.cookies||-1===Game.buyMode)&&Jt.ClickProduct(e)},Jt.DescribeDragonAura=Game.DescribeDragonAura,Game.DescribeDragonAura=function(e){Jt.DescribeDragonAura(e),function(e){if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.DragonAuraInfo){const[t,o]=function(e){ta(),l("promptContent").children[0].innerHTML.includes("secondary")?ie=e:ne=e;let t=0;if(ne!==ue||ie!==he)for(let e=Game.ObjectsById.length-1;e>-1;--e)if(Game.ObjectsById[e].amount>0){const o=Ct[Game.ObjectsById[e].name].name;Ct[o].amount-=1,J-=1,t=Ct[o].basePrice*Game.priceIncrease**Math.max(0,Ct[o].amount-1-Ct[o].free),t=Game.modifyBuildingPrice(Ct[o],t),t=Math.ceil(t);break}const o=te;return sa(),ha(),o!==te&&sa(),[me-Game.cookiesPs,t]}(e),a=Uo(o/(t+Game.cookiesPs));let n;n=0===Game.cookiesPs?to(1/0):to(t/Game.cookiesPs*100),l("dragonAuraInfo").style.minHeight="60px",l("dragonAuraInfo").style.margin="8px",l("dragonAuraInfo").appendChild(document.createElement("div")).className="line";const i=document.createElement("div");i.style.minWidth="200px",i.style.textAlign="center",i.textContent=`Picking this aura will change CPS by ${to(t)} (${n}% of current CPS).`,l("dragonAuraInfo").appendChild(i);const r=document.createElement("div");r.style.minWidth="200px",r.style.textAlign="center",r.textContent=`It will take ${a} to recover the cost.`,l("dragonAuraInfo").appendChild(r)}}(e)},Jt.ToggleSpecialMenu=Game.ToggleSpecialMenu,Game.ToggleSpecialMenu=function(e){Jt.ToggleSpecialMenu(e),function(){if(null!==(l("specialPopup").className.match(/onScreen/)&&l("specialPopup").children[0].style.background.match(/dragon/)))for(let e=0;e<l("specialPopup").childNodes.length;e++)"optionBox"===l("specialPopup").childNodes[e].className&&(l("specialPopup").children[e].onmouseover=function(){qa(),Game.tooltip.dynamic=1,Game.tooltip.draw(l("specialPopup"),`<div style="min-width:200px;text-align:center;">${fe}</div>`,"this"),Game.tooltip.wobble()},l("specialPopup").children[e].onmouseout=function(){Game.tooltip.shouldHide=1})}()},Jt.UpdateMenu=Game.UpdateMenu,Game.UpdateMenu=function(){void 0!==s().picker&&void 0!==s().picker.owner||(Jt.UpdateMenu(),function(){const e=document.createElement("div");e.className="title","stats"===Game.onMenu?Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Stats&&(e.textContent="Cookie Monster Statistics",mn(e)):"prefs"===Game.onMenu&&l("menu").childNodes[2].insertBefore(an(),l("menu").childNodes[2].childNodes[l("menu").childNodes[2].childNodes.length-1])}())},Jt.sayTime=Game.sayTime,bo=function(e,t){return Number.isNaN(e)||e<=0?Jt.sayTime(e,t):Uo(e/Game.fps,1)},Jt.Logic=Game.Logic,Game.Logic=function(){Jt.Logic();let e="Cookie Clicker";"fools"===Game.season&&(e="Cookie Baker"),Ao=`${Game.OnAscend?"Ascending! ":""}${to(Game.cookies)} ${1===Game.cookies?"cookie":"cookies"} - ${e}`,function(){if(Game.OnAscend||0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title)document.title=Ao;else if(1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title){let e,t,o,a=!1,n=!1;e=ct?ct.wrath?`[W${Math.ceil(ct.life/Game.fps)}]`:`[G${Math.ceil(ct.life/Game.fps)}]`:Game.Has("Golden switch [off]")?"[GS]":`[${Number(l("CMTimerBarGCMinBar").textContent)<0?"!":""}${Math.ceil((Game.shimmerTypes.golden.maxTime-Game.shimmerTypes.golden.time)/Game.fps)}]`,Ht&&(a=!0,t="[F]"),"christmas"===Game.season&&(n=!0,o=Ut?`[R${Math.ceil(dt.life/Game.fps)}]`:`[${Number(l("CMTimerBarRenMinBar").textContent)<0?"!":""}${Math.ceil((Game.shimmerTypes.reindeer.maxTime-Game.shimmerTypes.reindeer.time)/Game.fps)}]`);let i=Ao;"["===i.charAt(0)&&(i=i.substring(i.lastIndexOf("]")+1)),document.title=`${e+(a?t:"")+(n?o:"")} ${i}`}else if(2===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title){let e="",t=!1;ct&&(t=!0,ct.wrath?e+=`[W${Math.ceil(ct.life/Game.fps)}]`:e+=`[G${Math.ceil(ct.life/Game.fps)}]`),Ht&&(t=!0,e+="[F]"),"christmas"===Game.season&&Ut&&(e+=`[R${Math.ceil(dt.life/Game.fps)}]`,t=!0),t&&(e+=" - ");let o="Cookie Clicker";"fools"===Game.season&&(o="Cookie Baker"),e+=o,document.title=e}}(),function(){const e=Math.max(0,Game.HowManyCookiesReset(Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned))+1)-(Game.cookiesEarned+Game.cookiesReset)),t=Game.sayTime((Date.now()-Game.startDate)/1e3*Game.fps,-1);let o=`You've been on this run for <b>${""===t?"not very long":t}</b>.<br>\n <div class="line"></div>`;Game.prestige>0&&(o+=`Your prestige level is currently <b>${to(Game.prestige)}</b>.<br>(CpS +${to(Game.prestige)}%)\n <div class="line"></div>`),o+=q<1?"Ascending now would grant you no prestige.":q<2?"Ascending now would grant you<br><b>1 prestige level</b> (+1% CpS)<br>and <b>1 heavenly chip</b> to spend.":`Ascending now would grant you<br><b>${to(q)} prestige levels</b> (+${to(q)}% CpS)<br>and <b>${to(q)} heavenly chips</b> to spend.`,o+=`<div class="line"></div>\n You need <b>${to(e)} more cookies</b> for the next level.<br>\n ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipAscendButton?`<div class='line'></div>It takes ${mt} to reach the next level and you were making ${to(Pe,2)} chips on average in the last 5 seconds.<br>`:""}`,l("ascendTooltip").innerHTML=o}()}}function hn(){window.CookieMonsterData={},Game.mods.cookieMonsterFramework.listeners.optionsMenu.push(an),Va(),Wa(),Ha(),Nt=Object.keys(Game.mods).length,Qt=document.createElement("style"),Qt.type="text/css",Qt.id="CMCSS",document.head.appendChild(Qt),function(){const e=document.createElement("div");e.id="CMBotBar",e.style.height="69px",e.style.width="100%",e.style.position="absolute",e.style.display="none",e.style.backgroundColor="#262224",e.style.backgroundImage="linear-gradient(to bottom, #4d4548, #000000)",e.style.borderTop="1px solid black",e.style.overflow="auto",e.style.textShadow="-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black";const t=e.appendChild(document.createElement("table"));t.style.width="100%",t.style.textAlign="center",t.style.whiteSpace="nowrap";const o=t.appendChild(document.createElement("tbody")),a=function(e,t){const o=document.createElement("td");return o.style.textAlign="right",o.className=oo+t,o.textContent=e,o},n=o.appendChild(document.createElement("tr"));n.style.fontWeight="bold",n.appendChild(a("CM 2.052.10",ro)),o.appendChild(document.createElement("tr")).appendChild(a("Bonus Income",no)),o.appendChild(document.createElement("tr")).appendChild(a("Payback Period",no)),o.appendChild(document.createElement("tr")).appendChild(a("Time Left",no)),l("wrapper").appendChild(e),Object.keys(Game.Objects).forEach((e=>{Vo(e)}))}(),function(){const e=document.createElement("div");e.id="CMTimerBar",e.style.position="absolute",e.style.display="none",e.style.height="0px",e.style.fontSize="10px",e.style.fontWeight="bold",e.style.backgroundColor="black";const t=zo("CMTimerBarAutosave","Autosave",[{id:"CMTimerBarAutosaveBar",colour:co}]);e.appendChild(t);const o=zo("CMTimerBarGC","Next Cookie",[{id:"CMTimerBarGCMinBar",colour:mo},{id:"CMTimerBarGCBar",colour:co}]);e.appendChild(o);const a=zo("CMTimerBarRen","Next Reindeer",[{id:"CMTimerBarRenMinBar",colour:mo},{id:"CMTimerBarRenBar",colour:so}]);e.appendChild(a);const n=document.createElement("div");n.id="CMTimerBarBuffTimers",e.appendChild(n),l("wrapper").appendChild(e)}(),function(){const e=document.createElement("div");e.id="CMUpgradeBar",e.style.width="100%",e.style.backgroundColor="black",e.style.textAlign="center",e.style.fontWeight="bold",e.style.display="none",e.style.zIndex="21",e.onmouseout=function(){Game.tooltip.hide()};const t=document.createElement("div");t.appendChild(function(){const e=document.createElement("div");e.style.minWidth="330px",e.style.marginBottom="4px";const t=document.createElement("div");t.className="name",t.style.marginBottom="4px",t.textContent="Legend",e.appendChild(t);const o=function(e,t){const o=document.createElement("div");o.style.verticalAlign="middle";const a=document.createElement("span");return a.className=ao+e,a.style.display="inline-block",a.style.height="10px",a.style.width="10px",a.style.marginRight="4px",o.appendChild(a),o.appendChild(document.createTextNode(t)),o};return e.appendChild(o(no,"Better than the best PP of a building option")),e.appendChild(o(io,"Same as the best PP building option")),e.appendChild(o(ro,"Within the top 10 of PP for buildings")),e.appendChild(o(so,"Within the top 20 of PP for buildings")),e.appendChild(o(lo,"Within the top 30 of PP for buildings")),e.appendChild(o(co,"Outside of the top 30 of PP for buildings")),e.appendChild(o(mo,"Negative or infinity PP")),e}()),e.onmouseover=function(){Game.tooltip.draw(this,escape(t.innerHTML),"store")};const o=function(e,t){const o=document.createElement("span");return o.id=e,o.className=oo+t,o.style.width="14.28571428571429%",o.style.display="inline-block",o.textContent="0",o};e.appendChild(o("CMUpgradeBarBlue",no)),e.appendChild(o("CMUpgradeBarGreen",io)),e.appendChild(o("CMUpgradeBarYellow",ro)),e.appendChild(o("CMUpgradeBarOrange",so)),e.appendChild(o("CMUpgradeBarRed",lo)),e.appendChild(o("CMUpgradeBarPurple",co)),e.appendChild(o("CMUpgradeBarGray",mo)),l("upgrades").parentNode.insertBefore(e,l("upgrades").parentNode.childNodes[3])}(),function(){const e=document.createElement("div");e.id="CMSectionHidButtons",e.style.textAlign="center";const t=document.createElement("a");t.className="option",t.onclick=function(){"flex"===l("upgrades").style.display?(l("upgrades").style.display="none",l("toggleUpgrades").style.display="none",l("techUpgrades").style.display="none",l("vaultUpgrades").style.display="none"):(l("upgrades").style.display="flex",0!==l("toggleUpgrades").children.length&&(l("toggleUpgrades").style.display="block"),0!==l("techUpgrades").children.length&&(l("techUpgrades").style.display="block"),0!==l("vaultUpgrades").children.length&&(l("vaultUpgrades").style.display="block"))},t.textContent="Hide/Show Upgrades",e.appendChild(t);const o=document.createElement("a");o.className="option",o.onclick=function(){"grid"===l("products").style.display?l("products").style.display="none":l("products").style.display="grid"},o.textContent="Hide/Show Buildings",e.appendChild(o),l("store").insertBefore(e,l("store").childNodes[2])}(),function(){const e=document.createElement("link");e.id="CMFavicon",e.rel="shortcut icon",e.href="https://orteil.dashnet.org/cookieclicker/favicon.ico",document.getElementsByTagName("head")[0].appendChild(e)}(),Object.keys(go).forEach((e=>{!function(e,t,o){const a=document.createElement("div");a.id=e;const n=document.createElement("div");n.style.minWidth=o,n.style.marginBottom="4px";const i=document.createElement("div");i.style.textAlign="left",i.textContent=t,n.appendChild(i),a.appendChild(n),fo[e]=a}(go[e][0],go[e][1],go[e][2])})),function(){const e=document.createElement("a");e.id="PopAllNormalWrinklerButton",e.textContent="Pop All Normal",e.className="option",e.onclick=function(){Ra()},e.onmouseout=function(){Game.tooltip.shouldHide=1},e.onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("wb","PopAllNormal")),"this"),Game.tooltip.wobble()},l("sectionLeftExtra").children[0].append(e);const t=document.createElement("a");t.id="PopFattestWrinklerButton",t.textContent="Pop Single Fattest",t.className="option",t.onclick=function(){null!==He[1]&&(Game.wrinklers[He[1]].hp=0)},t.onmouseout=function(){Game.tooltip.shouldHide=1},t.onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("wb","PopFattest")),"this"),Game.tooltip.wobble()},l("sectionLeftExtra").children[0].append(t)}(),l("products").style.display="grid",l("storeBulk").style.gridRow="1/1",l("upgrades").style.display="flex",l("upgrades").style["flex-wrap"]="wrap",Object.keys(l("rows").children).forEach((e=>{const t=l("rows").children[e].children[1],o=document.createElement("div");o.id=`productLock${Number(e)+1}`,o.className="productButton",o.innerHTML="Lock",o.onclick=function(){!function(e){"Lock"===l(`productLock${e}`).innerHTML?(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.push(e.toString()),l(`row${e}`).style.pointerEvents="none",l(`row${e}`).style.opacity="0.4",l(`productLock${e}`).innerHTML="Unlock",l(`productLock${e}`).style.pointerEvents="auto"):(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.includes(e.toString())&&(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.filter((t=>t!==e.toString()))),l(`productLock${e}`).innerHTML="Lock",l(`row${e}`).style.pointerEvents="auto",l(`row${e}`).style.opacity="1")}(Number(e)+1)},t.appendChild(o)})),Object.keys(Game.Objects).forEach((e=>{const t=Game.Objects[e];null!==l(`product${t.id}`).onmouseover&&(qt[e]=l(`product${t.id}`).onmouseover,l(`product${t.id}`).onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("b",`${e}`)),"store"),Game.tooltip.wobble()})})),Game.canLumps()&&(Ot=l("lumps").onmouseover,l("lumps").onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("s","Lump")),"this"),Game.tooltip.wobble()}),$t=Game.LoadMinigames,Game.LoadMinigames=function(){$t(),Game.Objects.Farm.minigameLoaded&&(l("gardenTool-1").onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("ha","HarvestAllButton")),"this"),Game.tooltip.wobble()},Array.from(l("gardenPlot").children).forEach((e=>{const t=e.id.slice(-3);e.onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("p",[`${t[0]}`,`${t[2]}`])),"this"),Game.tooltip.wobble()}}))),_a(),function(){if(Game.Objects.Bank.minigameLoaded)for(let e=0;e<Game.Objects.Bank.minigame.goodsById.length;e++)l(`bankGood-${e}`).firstChild.onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("sm",e)),"this"),Game.tooltip.wobble()}}(),function(){if(Game.Objects.Temple.minigameLoaded){for(let e=0;e<11;e+=1)l(`templeGod${e}`).onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("pag",e)),"this"),Game.tooltip.wobble()};for(let e=0;e<3;e+=1)l(`templeSlot${e}`).onmouseover=function(){Game.tooltip.dynamic=1,Game.tooltip.draw(this,(()=>Ia("pas",[e,Game.Objects.Temple.minigame.slot[e]])),"this"),Game.tooltip.wobble()}}}(),Qa()},Game.LoadMinigames(),l("backgroundLeftCanvas").onmouseover=function(){Co=1},l("backgroundLeftCanvas").onmouseout=function(){Co=0,Game.tooltip.hide(),Object.keys(Game.wrinklers).forEach((e=>{yo[e]=0}))},un(),Qa(),Game.CalculateGains(),ko=Game.OnAscend,Game.prefs.popups?Game.Popup("Cookie Monster version 2.052.10 loaded!"):Game.Notify("Cookie Monster version 2.052.10 loaded!","","",1,1),Game.Win("Third-party")}function gn(e,t){if(!Game.Objects.Temple.minigameLoaded)return 0;ta();const{minigame:o}=Game.Objects.Temple,a=o.godsById[e].slot;"0"===a?re=o.slot[t]:"1"===a?se=o.slot[t]:"2"===a&&(le=o.slot[t]),0===t?re=e:1===t?se=e:2===t&&(le=e);const n=te;return sa(),ha(),n!==te&&sa(),me-Game.cookiesPs}function fn(){if(Oo!==Game.OnAscend&&(Oo=Game.OnAscend,Game.OnAscend?(l("game").style.bottom="0px",1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar&&(l("CMBotBar").style.display="none"),1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar&&(l("CMTimerBar").style.display="none")):(en(),qo()),Xo()),!Game.OnAscend&&0===Game.AscendTimer){Nt!==Object.keys(Game.mods).length&&(Va(),Ha(),Nt=Object.keys(Game.mods).length),ce&&($a(!0),Pa(),Game.Has("Golden switch [off]")?(ta(),Mt["Golden switch [off]"].bought=0,sa(),Se=me):Se=Game.cookiesPs,Ga({CacheNoGoldSwitchCookiesPS:Se}),ja(),Wa(),La(),Oa(),qa(),function(){for(let e=0;e<11;e+=1)for(let t=0;t<3;t+=1)kt[e][t]=gn(e,t);Ga({CacheGods:kt})}(),Aa(),function(){let e=0;if(Game.Objects.Bank.minigameLoaded){const t=Game.Objects.Bank.minigame.goods;let o=0;Object.keys(t).forEach((e=>{const a=t[e];o+=a.stock*a.val})),e+=o*Game.cookiesPsRawHighest}e+=function(){let e=0;ta();let t=2;5!==ne&&18!==ne||(t-=1),5!==ie&&18!==ie||(t-=1),ne=5,ie=18;for(let e=0;e<t;++e){let e="Cursor";Object.keys(Ct).forEach((t=>{Ct[t].amount>0&&(e=t)})),Ct[e].amount-=1,J-=1}return Object.keys(Ct).forEach((t=>{const o=Ct[t];e+=Ft(Game.Objects[o.name],Game.Objects[t].basePrice,o.amount,Game.Objects[t].free,o.amount)})),e}(),ft=e,Ga({CacheSellForChoEgg:ft})}(),ce=0);const e=Game.auraMult("Fierce Hoarder")>0;!K&&e?(K=!0,Y=1):K&&!e&&(K=!1,Y=1),Y&&(Ba(),Y=0),function(){Ua(),Sa(),$a(!1),function(){Re=0;let e=0;Object.keys(Game.wrinklers).forEach((t=>{2===Game.wrinklers[t].phase&&(e+=1)}));let t=1;if(Ct.Temple.minigameLoaded){const e=Game.hasGod("scorn");1===e?t*=1.15:2===e?t*=1.1:3===e&&(t*=1.05)}Ie=e,Re=e*(.05*e*1.1)*(.05*Game.Has("Sacrilegious corruption")+1)*(.05*Game.Has("Wrinklerspawn")+1)*t,Ga({CacheCurrWrinklerCount:Ie,CacheCurrWrinklerCPSMult:Re})}(),va(),Da();const e=Game.HowManyCookiesReset(Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned))+1)-(Game.cookiesEarned+Game.cookiesReset);mt=Uo(e/Ro())}(),Ht!==(Game.TickerEffect&&"fortune"===Game.TickerEffect.type)&&(Ht=Game.TickerEffect&&"fortune"===Game.TickerEffect.type,Ht&&(v.createFlash("cookieMonsterMod",3,"FortuneFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FortuneSoundURL,"FortuneSound","FortuneVolume",!1),v.createNotification("cookieMonsterMod","FortuneNotification","Fortune Cookie found","A Fortune Cookie has appeared on the Ticker."))),Ut!==Game.shimmerTypes.reindeer.spawned&&(Ut=Game.shimmerTypes.reindeer.spawned,Object.keys(Game.shimmers).forEach((e=>{Game.shimmers[e].spawnLead&&"reindeer"===Game.shimmers[e].type&&(dt=Game.shimmers[e])})),v.createFlash("cookieMonsterMod",3,"SeaFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SeaSoundURL,"SeaSound","SeaVolume",!1),v.createNotification("cookieMonsterMod","SeaNotification","Reindeer sighted!","A Reindeer has spawned. Click it now!")),Game.Objects.Farm.minigameLoaded&&Rt!==Game.Objects.Farm.minigame.nextStep&&(0!==Rt&&Rt<Date.now()&&(v.createFlash("cookieMonsterMod",3,"GardFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GardSoundURL,"GardSound","GardVolume",!1)),Rt=Game.Objects.Farm.minigame.nextStep),function(){if(Game.Objects["Wizard tower"].minigameLoaded&&1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GrimoireBar){const{minigame:e}=Game.Objects["Wizard tower"];e.magic<e.magicM?Vt=!1:Vt||(Vt=!0,v.createFlash("cookieMonsterMod",3,"MagicFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MagicSoundURL,"MagicSound","MagicVolume",!1),v.createNotification("cookieMonsterMod","MagicNotification","Magic Meter full","Your Magic Meter is full. Cast a spell!"))}}(),function(){if(Game.elderWrath>0){let e=0;Object.keys(Game.wrinklers).forEach((t=>{2===Game.wrinklers[t].phase&&(e+=1)})),e>Xt?(Xt=e,e===Game.getWrinklersMax()&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxFlash?v.createFlash("cookieMonsterMod",3,"WrinklerMaxFlash",!1):v.createFlash("cookieMonsterMod",3,"WrinklerFlash",!1),e===Game.getWrinklersMax()&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxSound?v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxSoundURL,"WrinklerMaxSound","WrinklerMaxVolume",!1):v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerSoundURL,"WrinklerSound","WrinklerVolume",!1),e===Game.getWrinklersMax()&&Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxNotification?v.createNotification("cookieMonsterMod","WrinklerMaxNotification","Maximum Wrinklers Reached","You have reached your maximum ammount of wrinklers"):v.createNotification("cookieMonsterMod","WrinklerNotification","A Wrinkler appeared","A new wrinkler has appeared")):Xt=e}}()}_t=0,gt={},Object.keys(Game.shimmers).forEach((e=>{gt[Game.shimmers[e].id]=Game.shimmers[e],Game.shimmers[e].spawnLead&&"golden"===Game.shimmers[e].type&&(ct=Game.shimmers[e],_t+=1)})),Object.keys(Lo).forEach((e=>{void 0===gt[e]&&(Lo[e].parentNode.removeChild(Lo[e]),delete Lo[e])})),It!==Game.shimmerTypes.golden.n?(It=Game.shimmerTypes.golden.n,It&&(zt<_t&&(v.createFlash("cookieMonsterMod",3,"GCFlash",!1),v.playCMSound("cookieMonsterMod",Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCSoundURL,"GCSound","GCVolume",!1),v.createNotification("cookieMonsterMod","GCNotification","Golden Cookie Spawned","A Golden Cookie has spawned. Click it now!")),Object.keys(Game.shimmers).forEach((e=>{void 0===Lo[Game.shimmers[e].id]&&function(e){const t=document.createElement("div");t.id=`GCTimer${e.id}`,t.style.width="96px",t.style.height="96px",t.style.position="absolute",t.style.zIndex="10000000001",t.style.textAlign="center",t.style.lineHeight="96px",t.style.fontFamily='"Kavoon", Georgia, serif',t.style.fontSize="35px",t.style.cursor="pointer",t.style.display="block",t.style.pointerEvents="none",0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer&&(t.style.display="none"),t.style.left=e.l.style.left,t.style.top=e.l.style.top,t.onclick=function(){e.pop()},t.onmouseover=function(){e.l.style.filter="brightness(125%) drop-shadow(0px 0px 3px rgba(255,255,255,1))",e.l.style.webkitFilter="brightness(125%) drop-shadow(0px 0px 3px rgba(255,255,255,1))"},t.onmouseout=function(){e.l.style.filter="",e.l.style.webkitFilter=""},Lo[e.id]=t,l("shimmers").appendChild(t)}(Game.shimmers[e])}))),za(),zt=_t,0===_t&&(ct=0)):1===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer&&It&&Object.keys(Lo).forEach((e=>{Lo[e].style.opacity=gt[e].l.style.opacity,Lo[e].style.transform=gt[e].l.style.transform,Lo[e].textContent=Math.ceil(gt[e].life/Game.fps)}))}const kn={Favourite:1,Calculation:1,Notation:1,Colours:1,BarsDisplay:1,Tooltip:1,Statistics:1,Notification:1,NotificationGeneral:1,NotificationGC:1,NotificationFC:1,NotificationSea:1,NotificationGard:1,NotificationMagi:1,NotificationWrink:1,NotificationWrinkMax:1,Miscellaneous:1,Lucky:1,Chain:1,Spells:1,Garden:1,Prestige:1,Wrink:1,Sea:1,Achievs:1,Misc:1,infoMenu:1,optionsMenu:1};function Cn(e){Va(),w.loadMod("cookieMonsterMod",e,tn,kn,fn),void 0===Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames&&(Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames=[]),on();for(let e=0;e<Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.length;e++){const t=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames[e];l(`row${t}`).style.pointerEvents="none",l(`row${t}`).style.opacity="0.4",l(`productLock${t}`).innerHTML="Unlock",l(`productLock${t}`).style.pointerEvents="auto"}void 0!==Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.version&&"2.052.10"!==Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.version&&(Game.prefs.popups?Game.Popup("A new version of Cookie Monster has been loaded, check out the release notes in the info tab!"):Game.Notify("A new version of Cookie Monster has been loaded, check out the release notes in the info tab!","","",0,1))}const Mn={init:function(){let e=!0;M(),window.cookieMonsterFrameworkData.isInitializing=!0,y("cookieMonsterMod"),Game.version!==Number("2.052")&&(e=confirm("Cookie Monster version 2.052.10 is meant for Game version 2.052. Loading a different version may cause errors. Do you still want to load Cookie Monster?")),e&&(hn(),Game.registerHook("click",ya),Game.registerHook("draw",Ma),Game.registerHook("logic",fn),void 0===Game.modSaveData.cookieMonsterMod&&Cn("{}"))},load:Cn,save:function(){const e=Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod;return e.version="2.052.10",JSON.stringify(e)}};"undefined"!=typeof Steam?setTimeout((function(){Game.registerMod("CookieMonster",Mn),window.cookieMonsterFrameworkData.isInitializing=!1}),2e3):(Game.registerMod("CookieMonster",Mn),window.cookieMonsterFrameworkData.isInitializing=!1)})()})(); //# sourceMappingURL=https://cookiemonsterteam.github.io/CookieMonster/dist/CookieMonsterDev.js.map \ No newline at end of file diff --git a/dist/CookieMonsterDev.js.map b/dist/CookieMonsterDev.js.map index ece1b1a7..d5a5c7fc 100644 --- a/dist/CookieMonsterDev.js.map +++ b/dist/CookieMonsterDev.js.map @@ -1 +1 @@ -{"version":3,"file":"CookieMonsterDev.js","mappings":"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AQtuB,KAAKgE,MAAMsqB,EAAQnB,GACvBiC,EAAiB,IACnBC,GAAQf,EACRc,GAAkB,EAEtB,CACA,OAAOC,CACT,CClCO,MAAMK,GAAS,CAAC,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAGhDC,GAAa,CACxB,GACA,GACA,IACA,IACA,KACA,QACA,QACA,OACA,OACA,MACA,MACA,MACA,QACA,SACA,SACA,cACA,UACA,SACA,YACA,UACA,WACA,SACA,WACA,YACA,YACA,kBAIWC,GAAwB,CACnC,GACA,IACA,IACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,KACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,KACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,KACA,OC3IK,IAAIC,GAEAC,GAGAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAGAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GCjBAC,GDFAC,GAAqB,GAErBC,GAAwB,GACxBC,GAAuB,GAOvBC,GAAkB,CAAC,EAanBC,GAAyBC,KAAKC,MAI9BC,GAAyBF,KAAKC,MEhB1B,SAAS,GAASE,EAAKC,EAAQ1T,GAC5C,MAAM2T,EACJ3U,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwT,cAAgB,EACtF,GAAIH,IAAQI,IACV,MAAO,WAET,QAAmB,IAARJ,EACT,MAAO,IAET,GAAkF,IAA9EzU,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS0T,MACtE,OAAOV,GAAgBW,SAASN,EAAKC,GAEvC,GAAIM,OAAOC,SAASR,GAAM,CACxB,GAAIA,EAAM,EACR,MAAO,IAAI,GAAStxB,KAAKuN,IAAI+jB,MAE/B,IAAIS,EAAS,GACb,GAAY,IAART,EACF,OAAOA,EAAIpxB,WAEb,GACEoxB,EAAM,MACNA,EAAMzU,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS+T,YAK1E,OAFED,EADElV,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgU,eAC7DX,EAAIY,eAAe,MAChBZ,EAAIY,eAAe,MAC1BH,EAET,GACiF,IAA9ElV,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS0T,QAClE9T,GACQ,IAAXA,EAGAkU,EAAST,EAAIa,cAAcX,GAAUtxB,WAAW7B,QAAQ,IAAK,SACxD,CACL,MAAM+zB,EAAcd,EAAIa,gBAAgBjyB,WAClCmyB,EAAwBryB,KAAKgE,MAAMouB,EAAYxX,MAAMwX,EAAYt3B,QAAQ,KAAO,GAAK,GAC3Fi3B,GAAUT,EAAMO,OAAO,KAA6B,EAAxBQ,IAA8BC,QAAQd,GAGe,IAA9E3U,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS0T,QAClE9T,GACQ,IAAXA,EAGIyT,GAAO,KAAQA,EAAMO,OAAO,KAAqB,EAAhBnC,GAAO73B,QAC1Ck6B,GAAU,IAAIrC,GAAO2C,KAChBN,EAAS,GAAST,EAAK,EAAG,GAE8C,IAA9EzU,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS0T,QAClE9T,GACQ,IAAXA,EAGIyT,GAAO,KAAQA,EAAMO,OAAO,KAAyB,EAApBlC,GAAW93B,QAC9Ck6B,GAAU,IAAIpC,GAAW0C,KACpBN,EAAS,GAAST,EAAK,EAAG,GAE8C,IAA9EzU,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS0T,QAClE9T,GACQ,IAAXA,EAGIyT,GAAO,KAAQA,EAAMO,OAAO,KAAoC,EAA/BjC,GAAsB/3B,QACzDk6B,GAAU,IAAInC,GAAsByC,KAC/BN,EAAS,GAAST,EAAK,EAAG,IAE8C,IAA9EzU,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS0T,QAClE9T,GACQ,IAAXA,KAGAkU,GAAU,IAA4B,EAAxBM,EAElB,CAQA,MAPe,KAAXN,IAEFt5B,QAAQ85B,IAAI,2DAA2DjB,KACvES,EAASd,GAAgBW,SAASN,EAAKC,IAErC1U,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgU,iBACtEF,EAASA,EAAO1zB,QAAQ,IAAK,MACxB0zB,CACT,CAEA,OADAt5B,QAAQ85B,IAAI,2DAA2DjB,KAChEL,GAAgBW,SAASN,EAAKC,EACvC,CD5FO,MAAMiB,GAAgB,SAChBC,GAAgB,SAMhBC,GAAa,OACbC,GAAc,QACdC,GAAe,SACfC,GAAe,SACfC,GAAY,MACZC,GAAe,SACfC,GAAa,OACbC,GAAa,OACbC,GAAc,QACdC,GAAkB,CAC7BT,GACAC,GACAC,GACAC,GACAC,GACAC,GACAE,GACAC,GACAF,IAUWI,GAAc,CACzB,CAAC,6BAA8B,oCAAqC,SACpE,CACE,2CACA,6EACA,SAEF,CACE,6BACA,qPACA,SAEF,CACE,8BACA,kEACA,SAEF,CACE,kCACA,2PACA,SAEF,CACE,0BACA,gLACA,SAEF,CACE,2BACA,uOACA,SAEF,CAAC,4BAA6B,2CAA4C,SAC1E,CACE,8BACA,uHACA,UAGSC,GAAwB,CAAC,EAM/B,IAUIC,GAVAC,GAAsB,EACtBC,IAAmB,EAOnBC,GAA4B,GAG5BC,GAAY,WAAa,EAKzBC,GAAmB,EACnBC,GAAsB,EACtBC,GAA4B,EAMhC,MAAMC,GAAc,CAAC,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,MAC9CC,GAAa,CAAC,EAAG,EAAG,GAAI,GAAI,IAK5BC,GAAc,CACzBC,OAAQrB,GACR,iBAAkBM,GAClB,eAAgBP,GAChBuB,KAAMpB,GACN,eAAgBJ,GAChByB,aAAclB,IAMT,IAOImB,GACAC,GACAC,GACAC,GACAC,GAEAC,GACAC,GAdAC,GAAW,CAAC,EAKZC,GAAQ,GEnHJ,SAASC,KACtB,IAkDIC,EAlDA73B,EAAS4f,KAAKyS,QACG,IAAjBzS,KAAKkY,QACPnB,GAAsB32B,EAEtBA,EAAS22B,GAEI,IAAX32B,EAAcA,EAASotB,GACP,KAAXptB,EAAeA,EAASqtB,GACb,MAAXrtB,IAAgBA,EAASstB,IAGlC7hB,EAAE,cAAchJ,MAAMs1B,eAAe,SACrCtsB,EAAE,eAAehJ,MAAMs1B,eAAe,SACtCtsB,EAAE,gBAAgBhJ,MAAMs1B,eAAe,SAElB,IAAjBnY,KAAKkY,QACiF,IAApFlY,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgX,aACtE75B,OAAO6C,KAAKhB,GAAQ+f,SAASplB,IAC3B8Q,EAAE,eAAemU,KAAKoR,QAAQr2B,GAAGqlB,MAAMvd,MAAMyF,MAC3C0X,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SACzD,SAAShhB,EAAOrF,GAAGs9B,SACpB,IAELxsB,EAAE,YAAY2jB,MAAkB3sB,MAAMyF,MACpC0X,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS0U,aAEtEv3B,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IACjC8Q,EAAE,eAAemU,KAAKoR,QAAQr2B,GAAGqlB,MAAMvd,MAAMs1B,eAAe,QAAQ,KAG7C,IAAlBnY,KAAKkY,SACd35B,OAAO6C,KAAKosB,IAAerN,SAASplB,IAClC,MAAMykB,EAAIQ,KAAKoR,QAAQr2B,GACvB8Q,EAAE,eAAe2T,EAAEY,MAAMvd,MAAMyF,MAAQ,GASvCuD,EAAE,eAAe2T,EAAEY,MAAM1I,UAAY,GACnCqa,GAAavS,EAAGA,EAAEyS,UAAWzS,EAAE2S,OAAQ3S,EAAE0S,KAAMlS,KAAKyS,QAAS,GAC9D,IAQc,IAAjBzS,KAAKkY,SACJlY,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkX,cAWiB,IAAtFtY,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkX,eAEpEL,EAAM15B,OAAO6C,KAAKosB,IAAetuB,KAAKq5B,IACpC,MAAM/Y,EAAI,CAAC,EAIX,OAHAA,EAAElgB,KAAOi5B,EACT/Y,EAAEzT,GAAKyhB,GAAc+K,GAAGxsB,GACxByT,EAAE6Y,OAAS7K,GAAc+K,GAAGF,OACrB7Y,CAAC,IAGVyY,EAAIO,MAAK,CAAC/0B,EAAGP,IACXozB,GAAgBr4B,QAAQwF,EAAE40B,UAAY/B,GAAgBr4B,QAAQiF,EAAEm1B,QAC5D50B,EAAEsI,GAAK7I,EAAE6I,GACTuqB,GAAgBr4B,QAAQwF,EAAE40B,QAAU/B,GAAgBr4B,QAAQiF,EAAEm1B,WAGkB,IAAtFrY,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkX,eAEpEL,EAAM15B,OAAO6C,KAAKhB,GAAQlB,KAAKq5B,IAC7B,MAAM/Y,EAAI,CAAC,EAIX,OAHAA,EAAElgB,KAAOi5B,EACT/Y,EAAEzT,GAAK3L,EAAOm4B,GAAGxsB,GACjByT,EAAE6Y,OAASj4B,EAAOm4B,GAAGF,OACd7Y,CAAC,IAGVyY,EAAIO,MAAK,CAAC/0B,EAAGP,IACXozB,GAAgBr4B,QAAQwF,EAAE40B,UAAY/B,GAAgBr4B,QAAQiF,EAAEm1B,QAC5D50B,EAAEsI,GAAK7I,EAAE6I,GACTuqB,GAAgBr4B,QAAQwF,EAAE40B,QAAU/B,GAAgBr4B,QAAQiF,EAAEm1B,WAGkB,IAAtFrY,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkX,gBAEpEL,EAAM15B,OAAO6C,KAAKusB,IAA6BzuB,KAAKq5B,IAClD,MAAM/Y,EAAI,CAAC,EAKX,OAJAA,EAAElgB,KAAOi5B,EACT/Y,EAAEY,GAAKJ,KAAKoR,QAAQmH,GAAGnY,GACvBZ,EAAEiZ,gBAAkB9K,GAA4B4K,GAAGG,aACnDlZ,EAAEmZ,eAAiBhL,GAA4B4K,GAAG9G,MAC3CjS,CAAC,IAGVyY,EAAIO,MAAK,CAAC/0B,EAAGP,IAAMO,EAAE2c,GAAKld,EAAEkd,KAI5B6X,EAAIO,MACF,CAAC/0B,EAAGP,KACqB,MAAtBO,EAAEg1B,gBAA0Bh1B,EAAEk1B,eAAiB9D,MACzB,MAAtB3xB,EAAEu1B,gBAA0Bv1B,EAAEy1B,eAAiB9D,SA3DpDoD,EAAM15B,OAAO6C,KAAKosB,IAAetuB,KAAKq5B,IACpC,MAAM/Y,EAAI,CAAC,EAGX,OAFAA,EAAElgB,KAAOi5B,EACT/Y,EAAEY,GAAKJ,KAAKoR,QAAQmH,GAAGnY,GAChBZ,CAAC,IAGVyY,EAAIO,MAAK,CAAC/0B,EAAGP,IAAMO,EAAE2c,GAAKld,EAAEkd,MA0D9B,IAAK,IAAIxb,EAAI,EAAGA,EAAIqzB,EAAIj9B,OAAQ4J,IAC9Bob,KAAKoR,QAAQ6G,EAAIrzB,GAAGtF,MAAMuM,EAAEhJ,MAAM+1B,QAAU,GAAGh0B,EAAI,KAAKA,EAAI,GAEhE,CC3Ie,SAASi0B,KACtBt6B,OAAOu6B,OAAOz/B,SAAS0/B,uBAAuB,iBAAiB5Y,SAAS6Y,IAEpEhZ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6X,uBACrD,aAAfD,EAAQ5Y,GAER4Y,EAAQn2B,MAAMiG,OAAS,OACC,kBAAfkwB,EAAQ5Y,IACjB4Y,EAAQn2B,MAAMiG,OAAS,GACvBkwB,EAAQn2B,MAAMq2B,UAAY,OACF,aAAfF,EAAQ5Y,IACjB4Y,EAAQn2B,MAAMiG,OAAS,GACnBkwB,EAAQx9B,UAAUmrB,SAAS,WAC7BqS,EAAQn2B,MAAMq2B,UAAY,OAE1BF,EAAQn2B,MAAMq2B,UAAY,SAG5BF,EAAQn2B,MAAMiG,OAAS,GACvBkwB,EAAQn2B,MAAMq2B,UAAY,OAC5B,GAEJ,CCRe,SAASC,KAEtB,GAAInZ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgY,YAAc,EAAG,CACvF,IAAIC,EAAO,EACPC,EAAQ,EACRC,EAAS,EACTC,EAAS,EACTC,EAAM,EACNC,EAAS,EACTC,EAAO,EAEXp7B,OAAO6C,KAAK4e,KAAK4Z,iBAAiBzZ,SAASplB,IACzC,MAAM8+B,EAAK7Z,KAAK4Z,gBAAgB7+B,GAChC,IAAI++B,GAAc,EAClB,IAAK,IAAIC,EAAI,EAAGA,EAAIluB,EAAE,UAAU9Q,KAAKi/B,WAAWh/B,OAAQ++B,GAAK,EAC3D,IAAyE,IAArEluB,EAAE,UAAU9Q,KAAKi/B,WAAWD,GAAGv+B,UAAUyC,QAAQ23B,IAAuB,CAC1E/pB,EAAE,UAAU9Q,KAAKi/B,WAAWD,GAAGv+B,UAAYo6B,GAAgB3H,GAAc4L,EAAGv6B,MAAM+4B,OAClFyB,GAAc,EACd,KACF,CAEF,IAAKA,EAAa,CAChB,MAAMvT,EAAMltB,SAAS4D,cAAc,OACnCspB,EAAI1jB,MAAMgG,MAAQ,OAClB0d,EAAI1jB,MAAMiG,OAAS,OACnByd,EAAI/qB,UAAYo6B,GAAgB3H,GAAc4L,EAAGv6B,MAAM+4B,OACvDxsB,EAAE,UAAU9Q,KAAK+a,YAAYyQ,EAC/B,CACI0H,GAAc4L,EAAGv6B,MAAM+4B,SAAWxC,GAAYwD,GAAQ,EACjDpL,GAAc4L,EAAGv6B,MAAM+4B,SAAWvC,GAAawD,GAAS,EACxDrL,GAAc4L,EAAGv6B,MAAM+4B,SAAWtC,GAAcwD,GAAU,EAC1DtL,GAAc4L,EAAGv6B,MAAM+4B,SAAWrC,GAAcwD,GAAU,EAC1DvL,GAAc4L,EAAGv6B,MAAM+4B,SAAWpC,GAAWwD,GAAO,EACpDxL,GAAc4L,EAAGv6B,MAAM+4B,SAAWnC,GAAcwD,GAAU,EAC1DzL,GAAc4L,EAAGv6B,MAAM+4B,SAAWlC,KAAYwD,GAAQ,EAAC,IAGlE9tB,EAAE,oBAAoBzN,YAAci7B,EACpCxtB,EAAE,qBAAqBzN,YAAck7B,EACrCztB,EAAE,sBAAsBzN,YAAcm7B,EACtC1tB,EAAE,sBAAsBzN,YAAco7B,EACtC3tB,EAAE,mBAAmBzN,YAAcq7B,EACnC5tB,EAAE,sBAAsBzN,YAAcs7B,EACtC7tB,EAAE,oBAAoBzN,YAAcu7B,CACtC,CAEA,MAAM1B,EAAM,GAGZ,IAAK,IAAIrzB,EAAI,EAAGA,EAAIob,KAAK4Z,gBAAgB5+B,OAAQ4J,GAAK,EAAG,CACvD,MAAM4a,EAAI,CAAC,EACXA,EAAElgB,KAAO0gB,KAAK4Z,gBAAgBh1B,GAAGtF,KACjCkgB,EAAEiS,MAAQzR,KAAK4Z,gBAAgBh1B,GAAGqtB,UAClCzS,EAAEzT,GAAKkiB,GAAczO,EAAElgB,MAAMyM,GAC7ByT,EAAE6Y,OAASpK,GAAczO,EAAElgB,MAAM+4B,OACjCJ,EAAIp7B,KAAK2iB,EACX,CAEIQ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6Y,aAEtEhC,EAAIO,MAAK,CAAC/0B,EAAGP,IACXozB,GAAgBr4B,QAAQwF,EAAE40B,UAAY/B,GAAgBr4B,QAAQiF,EAAEm1B,QAC5D50B,EAAEsI,GAAK7I,EAAE6I,GACTuqB,GAAgBr4B,QAAQwF,EAAE40B,QAAU/B,GAAgBr4B,QAAQiF,EAAEm1B,UAGpEJ,EAAIO,MAAK,CAAC/0B,EAAGP,IAAMO,EAAEguB,MAAQvuB,EAAEuuB,QAGjC,MAAMyI,EAAc,SAAUC,EAAMC,GAClC,OAAOD,EAAKE,WAAWn+B,GAAMA,EAAEoD,OAAS86B,EAAQ96B,MAClD,EACA,IAAK,IAAIsF,EAAI,EAAGA,EAAIob,KAAK4Z,gBAAgB5+B,OAAQ4J,GAAK,EACpDiH,EAAE,UAAUjH,KAAK/B,MAAMy3B,MAAQJ,EAAYjC,EAAKjY,KAAK4Z,gBAAgBh1B,IAAM,CAE/E,CCxFe,SAAS21B,GAAWC,EAAMC,GAEvC,IAAIC,EAAgBF,EACpB,GAAIA,IAAS3F,IAAU,OAAO2F,EAC9B,GAAIA,EAAO,EAAG,MAAO,uBACrBE,EAAgBv3B,KAAKiL,KAAKosB,GAC1B,MAAM31B,EAAI1B,KAAKgE,MAAMuzB,EAAgB,SAC/Brb,EAAIlc,KAAKgE,MAAOuzB,EAAgB,QAAY,OAC5C3zB,EAAI5D,KAAKgE,MAAQuzB,EAAgB,QAAY,MAAS,MACtDx/B,EAAIiI,KAAKgE,MAASuzB,EAAgB,QAAY,MAAS,KAAQ,IAC/DzzB,EAAI9D,KAAKgE,MAASuzB,EAAgB,QAAY,MAAS,KAAQ,IACrE,IAAIv+B,EAAM,GAEV,GAAuF,IAAnF6jB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASuZ,WAAkB,CACxF,GAAID,EAAgB,OAAW,OAAOD,EAAa,kBAAoB,SACvEt+B,GAAO0I,EAAI,EAAOA,GAAK41B,EAAoB,IAAN51B,EAAU,QAAU,SAAY,KAAtD,KAAiE,IAC5E1I,EAAInB,OAAS,GAAKqkB,EAAI,KACxBljB,GAAUkjB,GAAKob,EAAoB,IAANpb,EAAU,OAAS,QAAW,KAApD,OACLljB,EAAInB,OAAS,GAAK+L,EAAI,KACxB5K,GAAU4K,GAAK0zB,EAAoB,IAAN1zB,EAAU,QAAU,SAAY,KAAtD,OACL5K,EAAInB,OAAS,GAAKE,EAAI,KACxBiB,GAAUjB,GAAKu/B,EAAoB,IAANv/B,EAAU,UAAY,WAAc,KAA1D,MACTiB,GAAO8K,GAAKwzB,EAAoB,IAANxzB,EAAU,UAAY,WAAc,IAChE,MAAO,GAAuF,IAAnF+Y,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASuZ,WAAkB,CAC/F,GAAID,EAAgB,SAAY,MAAO,iBACvCv+B,IAAW0I,EAAI,GAAK,IAAM,IAAMA,EAAzB,IACP1I,IAAWkjB,EAAI,GAAK,IAAM,IAAMA,EAAzB,IACPljB,IAAW4K,EAAI,GAAK,IAAM,IAAMA,EAAzB,IACP5K,IAAWjB,EAAI,GAAK,IAAM,IAAMA,EAAzB,IACPiB,IAAQ8K,EAAI,GAAK,IAAM,IAAMA,CAC/B,KAAO,CAEL,GAAIyzB,EAAgB,OAAW,OAAOD,EAAa,kBAAoB,SACnE51B,EAAI,GACN1I,GAAU0I,GAAK41B,EAAoB,IAAN51B,EAAU,QAAU,SAAY,KAAtD,KACP1I,GAAUkjB,GAAKob,EAAoB,IAANpb,EAAU,OAAS,QAAW,MAClDA,EAAI,GACbljB,GAAUkjB,GAAKob,EAAoB,IAANpb,EAAU,OAAS,QAAW,KAApD,KACPljB,GAAU4K,GAAK0zB,EAAoB,IAAN1zB,EAAU,QAAU,SAAY,MACpDA,EAAI,GACb5K,GAAU4K,GAAK0zB,EAAoB,IAAN1zB,EAAU,QAAU,SAAY,KAAtD,KACP5K,GAAUjB,GAAKu/B,EAAoB,IAANv/B,EAAU,UAAY,WAAc,MACxDA,EAAI,GACbiB,GAAUjB,GAAKu/B,EAAoB,IAANv/B,EAAU,UAAY,WAAc,KAA1D,KACPiB,GAAO8K,GAAKwzB,EAAoB,IAANxzB,EAAU,UAAY,WAAc,MAE9D9K,GAAO8K,GAAKwzB,EAAoB,IAANxzB,EAAU,UAAY,WAAc,IAElE,CACA,OAAO9K,CACT,CChDe,SAASy+B,GAAcJ,GACpC,IAAInC,EACAxP,EAYJ,OAXI2R,GAAQ,GAER3R,EADqF,IAAnF7I,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASuZ,WAC/D,iBACG,QACZtC,EAASvC,KAETjN,EAAO0R,GAAWC,GACFnC,EAAZmC,EAAO,IAAcvE,GAChBuE,EAAO,GAAaxE,GACfD,IAET,CAAElN,OAAMwP,SACjB,CCZe,SAASwC,KACtB,OAAI7a,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS0Z,QAC/DhQ,EAE6E,IAAlF9K,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,UAC/D/a,KAAKgb,WAAa,EAAIhb,KAAKib,WAEkD,IAAlFjb,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,UAC/D/a,KAAKgb,WAAajN,IAA4B,EAA6B,IAAzBC,KAE1B,OAA7BF,GAAsB,IAE4D,IAAlF9N,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,WAClB,IAAlD/a,KAAKkb,UAAUpN,GAAsB,IAAI1yB,KAGvC4kB,KAAKgb,WACwB,EAA3BjN,GAAgCC,IAC/B,EAA6B,IAAzBA,KAIXhO,KAAKgb,WACJjN,GAA2BC,IAA0B,EAA6B,IAAzBA,IAE9D,CC7Be,SAASmN,KACtB,OAAsF,IAAlFnb,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,UAC/DnN,GAE6E,IAAlF5N,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,UAC/DjN,GAAsB,GAExB,CACT,CCLO,SAASsN,GAAYhb,EAAI9gB,EAAM+7B,GACpC,MAAMC,EAAWjiC,SAAS4D,cAAc,OACxCq+B,EAASlb,GAAKA,EACdkb,EAASz4B,MAAMiG,OAAS,OACxBwyB,EAASz4B,MAAM04B,OAAS,WACxBD,EAASz4B,MAAM8H,SAAW,WAE1B,MAAM4b,EAAMltB,SAAS4D,cAAc,OACnCspB,EAAI1jB,MAAMgG,MAAQ,OAClB0d,EAAI1jB,MAAMiG,OAAS,OACnByd,EAAI1jB,MAAM04B,OAAS,OACnBhV,EAAI1jB,MAAM8H,SAAW,WACrB4b,EAAI1jB,MAAMmC,KAAO,MACjBuhB,EAAI1jB,MAAMoC,IAAM,MAChBshB,EAAI1jB,MAAM2a,MAAQ,MAClB+I,EAAI1jB,MAAMwV,OAAS,MAEnB,MAAMjd,EAAO/B,SAAS4D,cAAc,QACpC7B,EAAKyH,MAAM2U,QAAU,eACrBpc,EAAKyH,MAAM6V,UAAY,QACvBtd,EAAKyH,MAAMihB,SAAW,OACtB1oB,EAAKyH,MAAMgG,MAAQ,QACnBzN,EAAKyH,MAAM24B,YAAc,MACzBpgC,EAAKyH,MAAMkhB,cAAgB,WAC3B3oB,EAAKgD,YAAckB,EACnBinB,EAAIzQ,YAAY1a,GAEhB,IAAK,IAAIL,EAAI,EAAGA,EAAIsgC,EAAKrgC,OAAQD,IAAK,CACpC,MAAM0gC,EAAYpiC,SAAS4D,cAAc,QACzCw+B,EAAUrb,GAAKib,EAAKtgC,GAAGqlB,GACvBqb,EAAU54B,MAAM2U,QAAU,eAC1BikB,EAAU54B,MAAMiG,OAAS,OACzB2yB,EAAU54B,MAAMkhB,cAAgB,WAChC0X,EAAU54B,MAAM6V,UAAY,SACxB2iB,EAAKrgC,OAAS,IAAMD,IACtB0gC,EAAU54B,MAAM64B,qBAAuB,OACvCD,EAAU54B,MAAM84B,wBAA0B,aAEd,IAAnBN,EAAKtgC,GAAGs9B,SACjBoD,EAAUjgC,UAAYo6B,GAAgByF,EAAKtgC,GAAGs9B,QAEhD9R,EAAIzQ,YAAY2lB,EAClB,CAEA,MAAMG,EAAQviC,SAAS4D,cAAc,QAQrC,OAPA2+B,EAAMxb,GAAK,GAAGA,QACdwb,EAAM/4B,MAAMg5B,WAAa,MACzBD,EAAM/4B,MAAMkhB,cAAgB,WAC5BwC,EAAIzQ,YAAY8lB,GAEhBN,EAASxlB,YAAYyQ,GAEd+U,CACT,CAMO,SAASQ,GAA2BC,GACzC,GAAsB,OAAlBlwB,EAAE,YAAsB,CAC1B,MAAMzQ,EAAOyQ,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GACtDgC,EAAQnwB,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GACvDjuB,EAAKF,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GACpDQ,EAAO3uB,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GAEtDj/B,EAAIghC,EACJE,EAAS7gC,EAAK0a,YAAYzc,SAAS4D,cAAc,OACvDg/B,EAAOnmB,YACLzc,SAASwf,eAAe,IAAuB,IAApB9d,EAAEkD,QAAQ,KAAclD,EAAEmhC,UAAU,EAAGnhC,EAAEkD,QAAQ,MAAQlD,QAGzEkhC,EAAOnmB,YAAYzc,SAAS4D,cAAc,SAClDzB,UAAYm6B,aAEjBsG,EAAOnmB,YAAYzc,SAASwf,eAAe,MAC3Czd,EAAK+gC,UAAUt5B,MAAMu5B,YAAc,MACnCJ,EAAMlmB,YAAYzc,SAAS4D,cAAc,OACzC++B,EAAMG,UAAUt5B,MAAMu5B,YAAc,MACpCrwB,EAAG+J,YAAYzc,SAAS4D,cAAc,OACtC8O,EAAGowB,UAAUt5B,MAAMu5B,YAAc,MACjC5B,EAAK1kB,YAAYzc,SAAS4D,cAAc,OACxCu9B,EAAK2B,UAAUt5B,MAAMu5B,YAAc,KACrC,CACF,CChCO,SAASC,KACd,GACiF,IAA/Erc,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkb,QACpE9O,IACiB,IAAjBxN,KAAKkY,QACL,CACA,IAAIqE,EAAQ,EACZh+B,OAAO6C,KAAKosB,IAAerN,SAASplB,IAClC,IAmBIyhC,EAnBAp8B,EAAS4f,KAAKyS,QACG,IAAjBzS,KAAKkY,QACPpB,GAAmB12B,EAEnBA,EAAS02B,GAEI,IAAX12B,IAAcA,EAASotB,IACZ,KAAXptB,IAAeA,EAASqtB,IACb,MAAXrtB,IAAgBA,EAASstB,IAC7B6O,GAAS,EACT1wB,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GAAGA,WAChDuC,GACAvC,WAAW,GAAG57B,YAAc4hB,KAAKoR,QAAQr2B,GAAGo3B,OAC9CtmB,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GAAGA,WAAWuC,GAAOn+B,YAAc,GAChFgC,EAAOrF,GAAGihC,MACV,GAEFnwB,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GAAGA,WAAWuC,GAAO/gC,UAClEm6B,GAAgBv1B,EAAOrF,GAAGs9B,OAG1BmE,EADExc,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASqb,cAC3DlC,GAAWp3B,KAAKC,MAAMhD,EAAOrF,GAAGgR,KAC7B,GAAS5I,KAAKC,MAAMhD,EAAOrF,GAAGgR,IAAK,GACnDF,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GAAGA,WAAWuC,GAAOn+B,YAAco+B,EAClF,MAAME,EAAa9B,IAChB5a,KAAKoR,QAAQr2B,GAAG4hC,WAAa3c,KAAK4c,QAAUzB,OAAyBN,MAExEhvB,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GAAGA,WAAWuC,GAAO/gC,UAClEm6B,GAAgB+G,EAAWrE,OACL,UAApBqE,EAAW7T,MAAoB7I,KAAK4c,QAAU5c,KAAKoR,QAAQr2B,GAAG4hC,UAChE9wB,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GAAGA,WAChDuC,GACAn+B,YAAc,GAAGs+B,EAAW7T,oBAE9Bhd,EAAE,YAAYjO,WAAWA,WAAWo8B,WAAW,GAAGA,WAAWuC,GAAOn+B,YAClEs+B,EAAW7T,IAAI,GAEvB,CACF,CCvGe,SAASgU,KACtB7c,KAAK8c,WAAWp0B,OAAOG,MAAQmX,KAAK8c,WAAWp0B,OAAO2Q,WAAWhU,YACjE2a,KAAK8c,WAAWp0B,OAAOI,OAASkX,KAAK8c,WAAWp0B,OAAO2Q,WAAW/T,aAClE0a,KAAK+c,eAAer0B,OAAOG,MAAQmX,KAAK+c,eAAer0B,OAAO2Q,WAAWhU,YACzE2a,KAAK+c,eAAer0B,OAAOI,OAASkX,KAAK+c,eAAer0B,OAAO2Q,WAAW/T,aAC1E0a,KAAKgd,gBACP,CCJO,SAASC,KAEmE,IAA/Ejd,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkb,QACa,IAAjFtc,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS8b,UACgB,IAApFld,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS+b,aAEpEtxB,EAAE,YAAYhJ,MAAMwV,OAASxM,EAAE,cAAchJ,MAAMiG,OACnD+C,EAAE,QAAQhJ,MAAMwV,OAAS,GAAG2c,OAAOnpB,EAAE,cAAchJ,MAAMiG,OAAOtH,QAAQ,KAAM,KAAO,QACG,IAA/Ewe,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkb,QAC7EzwB,EAAE,YAAYhJ,MAAMwV,OAAS,MAC7BxM,EAAE,QAAQhJ,MAAMwV,OAAS,QAEwD,IAAjF2H,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS8b,UACgB,IAApFld,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS+b,YAEpEtxB,EAAE,QAAQhJ,MAAMwV,OAASxM,EAAE,cAAchJ,MAAMiG,OAG/C+C,EAAE,QAAQhJ,MAAMwV,OAAS,MAIwD,IAAjF2H,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS8b,UACgB,IAApFld,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS+b,YAEpEtxB,EAAE,eAAehJ,MAAMoC,IAAM4G,EAAE,cAAchJ,MAAMiG,OAEnD+C,EAAE,eAAehJ,MAAMoC,IAAM,GAG/B43B,IACF,CAKO,SAASO,KACuE,IAAjFpd,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS8b,SACtErxB,EAAE,cAAchJ,MAAM2U,QAAU,GAC7B3L,EAAE,cAAchJ,MAAM2U,QAAU,OACrCylB,IACF,CC3Ce,SAASI,KACtBnR,GAAkBlM,KAAKsd,WACvBnR,GAAmBnM,KAAKud,WAC1B,CCHe,SAASC,GAAgBC,GACtC,MAAM5D,EAAK7Z,KAAK0d,aAAaD,GACvBE,EAAM,CAAC,EAEb,OADAA,EAAIr+B,KAAOu6B,EAAGv6B,KACPq+B,CACT,CCJe,SAASC,GAAoB/D,GAC1C,IAAIgE,EAAO,EAwBX,GAvBAt/B,OAAO6C,KAAKy4B,EAAGiE,gBAAgB3d,SAASplB,IACtC,IAAKilB,KAAK+d,MAAMlE,EAAGiE,eAAe/iC,GAAG81B,MAAMmN,SAAWvN,GAAOoJ,EAAGiE,eAAe/iC,GAAGuE,MAAO,CACvF,IAAI2+B,EAAW,EAGU,IAAvBje,KAAK2Q,eACLF,GAAOoJ,EAAGqE,mBACVzN,GAAOzQ,KAAK+d,MAAMlE,EAAGiE,eAAe/iC,GAAG81B,MAAMqN,oBAE7CD,GAAsB,IAAVpE,EAAGzZ,GAAW,GAAqB,IAAd,GAAKyZ,EAAGzZ,KAC3Cyd,GAAQI,CACV,KAEF1/B,OAAO6C,KAAKy4B,EAAGsE,WAAWhe,SAASplB,IACjC,GAAI01B,GAAOoJ,EAAGsE,UAAUpjC,GAAGuE,MAAO,CAChC,MAAM8+B,EAAMvE,EAAGsE,UAAUpjC,GACrBqjC,EAAIC,aAAa/+B,OAASu6B,EAAGv6B,KAAMu+B,GAAQ,EAAI,IAAOO,EAAIE,aAAanM,OAClEiM,EAAIE,aAAah/B,OAASu6B,EAAGv6B,OAAMu+B,GAAQ,EAAI,KAAQO,EAAIC,aAAalM,OACnF,KAEE0H,EAAGjI,SAAWnB,GAAOoJ,EAAGjI,QAAQtyB,QAAOu+B,GAAQ,MAC/ChE,EAAG0E,SAAW9N,GAAOoJ,EAAG0E,QAAQj/B,QAClCu+B,GAAQ,EAAgC,IAA5BhO,GAAW2O,QAAQrM,QAAiB,GAAK0H,EAAGzZ,GAAK,KACnB,iBAAjCyZ,EAAGiE,eAAeW,YACR,IAAf5E,EAAG6E,SAAiBjO,GAAOoJ,EAAGiE,eAAeW,WAAWn/B,MAC1D,OAAQ0gB,KAAK6J,YACX,QACEgU,GAAQ,EACR,MACF,KAAK,EACHA,GAAQ,KACR,MACF,KAAK,EACHA,GAAQ,KACR,MACF,KAAK,EACHA,GAAQ,KAKhB,OAAOA,CACT,CCrCe,SAASc,GAAoB5C,GAC1C,MAAMlC,EAAK7Z,KAAKoR,QAAQ2K,GAClB4B,EAAM,CAAC,EA8Fb,MA7FgB,WAAZ9D,EAAGv6B,KACLq+B,EAAIiB,IAAM,SAAUlO,GAClB,IAAI3uB,EAAM,EACN0uB,GAAO,sBAAqB1uB,GAAO,IACnC0uB,GAAO,qBAAoB1uB,GAAO,GAClC0uB,GAAO,qBAAoB1uB,GAAO,IAClC0uB,GAAO,sBAAqB1uB,GAAO,IACnC0uB,GAAO,yBAAwB1uB,GAAO,IACtC0uB,GAAO,yBAAwB1uB,GAAO,IACtC0uB,GAAO,wBAAuB1uB,GAAO,IACrC0uB,GAAO,wBAAuB1uB,GAAO,IACrC0uB,GAAO,uBAAsB1uB,GAAO,IACpC0uB,GAAO,uBAAsB1uB,GAAO,IACpC0uB,GAAO,uBAAsB1uB,GAAO,IACpC0uB,GAAO,yBAAwB1uB,GAAO,IACtC0uB,GAAO,wBAAuB1uB,GAAO,IACzC,IAAI87B,EAAO,EACPpJ,EAAM,EAQV,OAPAl2B,OAAO6C,KAAKyuB,IAAY1P,SAASplB,IACJ,WAAvB80B,GAAW90B,GAAGuE,OAAmBm1B,GAAO5E,GAAW90B,GAAGo3B,OAAM,IAElEpwB,GAAO0yB,EACPoJ,GAAQD,GAAoBlN,GAC5BmN,GAAQ7d,KAAK6e,SAAS,UACtBhB,GAAQtN,GAAO,aAEbvQ,KAAK8e,WACH,GACArO,GAAO,2BACLA,GAAO,kCACPA,GAAO,gBACT1uB,GACE87B,CAER,EACqB,YAAZhE,EAAGv6B,KACZq+B,EAAIiB,IAAM,SAAUlO,GAClB,IAAImN,EAAO,EAYX,GAXAt/B,OAAO6C,KAAK4e,KAAK+e,kBAAkB5e,SAASplB,IACtC01B,GAAOzQ,KAAK+e,iBAAiBhkC,MAAK8iC,GAAQ,EAAC,IAE7CpN,GAAO,oCAAmCoN,GAAQ,GAClDpN,GAAO,yBAAwBoN,GAAQ,GACvCpN,GAAO,kBAAiBoN,GAAQ,GAEhCpN,GAAO,wBAAuBoN,GAAQ,MAE1CA,GAAQtN,GAAO,cAEXE,GAAO,cACT,IAAK,IAAI11B,EAAI,EAAGA,EAAIilB,KAAKgf,eAAeC,OAAOjkC,OAAQD,IACjD01B,GAAOzQ,KAAKgf,eAAeC,OAAOlkC,GAAGuE,QAAOu+B,GAAQ,MAI5DA,GAAQD,GAAoBlN,GAE5B,IAAI3uB,EAAM,EACN0uB,GAAO,cAAa1uB,GAAmC,IAA5B8tB,GAAW2O,QAAQrM,QAC9C1B,GAAO,yBAAwB1uB,GAAmC,IAA5B8tB,GAAW2O,QAAQrM,QACzD1B,GAAO,gBAAe1uB,GAAkC,IAA3B8tB,GAAWqP,OAAO/M,QAEnD,IAAIsC,EAAM,EASV,OARAl2B,OAAO6C,KAAKyuB,IAAY1P,SAASplB,IACJ,YAAvB80B,GAAW90B,GAAGuE,OAAoBm1B,GAAO5E,GAAW90B,GAAGo3B,OAAM,IAGnE0L,GAAQ,EAAqC,IAAjC7N,GAAY,mBAA4ByE,EAEpDoJ,GAAQ7d,KAAK6e,SAAShF,EAAGv6B,OAEjBu6B,EAAGsF,QAAUp9B,GAAO87B,CAC9B,EAEAF,EAAIiB,IAAM,SAAUlO,GAClB,IAAImN,EAAO,EAGX,OAFAA,GAAQD,GAAoBlN,GAC5BmN,GAAQ7d,KAAK6e,SAASnO,EAAGpxB,MAClBoxB,EAAG0O,QAAUvB,CACtB,EAIFF,EAAIwB,QAAUtF,EAAGsF,QACjBxB,EAAIr+B,KAAOu6B,EAAGv6B,KACdq+B,EAAIG,eAAiBjE,EAAGiE,eACxBH,EAAIQ,UAAYtE,EAAGsE,UACnBR,EAAI/L,QAAUiI,EAAGjI,QACjB+L,EAAIY,QAAU1E,EAAG0E,QACjBZ,EAAIyB,QAAUvF,EAAGsF,QACjBxB,EAAIvd,GAAKyZ,EAAGzZ,GACZud,EAAIe,QAAU7E,EAAG6E,QACjBf,EAAIO,iBAAmBrE,EAAGqE,iBACnBP,CACT,CCrGe,SAAS0B,GAAYC,GAClC,MAAMzF,EAAK7Z,KAAKuf,SAASD,GACnB3B,EAAM,CAAC,EA4Bb,OA1BAA,EAAI6B,MAAQ3F,EAAG2F,MACU,mBAAd7B,EAAI6B,QACG,0BAAZ3F,EAAGv6B,KACLq+B,EAAI6B,MAAQ,WACV,IAAIxhC,EAAI,EAIR,OAHAO,OAAO6C,KAAKyuB,IAAY1P,SAASplB,IAC3B80B,GAAW90B,GAAG0kC,OAAS,KAAIzhC,GAAK,EAAC,IAEhCA,CACT,EAEA2/B,EAAI6B,MAAQ,WACV,IAAIE,EAAM,EAEV,GADIjP,GAAO,cAAaiP,EAAM,GAC1B1f,KAAKiR,OAAQ,CACf,MAAMa,EAASd,GAAU,WACV,IAAXc,EAAc4N,GAAO,IACL,IAAX5N,EAAc4N,GAAO,IACV,IAAX5N,IAAc4N,GAAO,IAChC,CACA,OAAOA,CACT,GAGJ/B,EAAI/M,KAAOiJ,EAAGjJ,KACd+M,EAAIr+B,KAAOu6B,EAAGv6B,KACPq+B,CACT,CCde,SAASgC,KAEtBvU,EAAmBpL,KAAK4f,cACxBvU,GAAarL,KAAK6f,QAClBvU,GAAuBtL,KAAK8f,kBAC5BvU,GAAmBvL,KAAK+f,cACxBvU,GAAcxL,KAAKggB,SAGnBzhC,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IACjC,MAAM8+B,EAAK7Z,KAAKoR,QAAQr2B,GACxB,IAAI4iC,EAAM9N,GAAW90B,QACTI,IAARwiC,IAEF9N,GAAW90B,GAAK4jC,GAAoB5jC,GACpC4iC,EAAM9N,GAAW90B,GACjB+gC,GAA2B/gC,IAE7B4iC,EAAIxL,OAAS0H,EAAG1H,OAChBwL,EAAI8B,MAAQ5F,EAAG4F,MACf9B,EAAIsC,aAAepG,EAAGoG,aACtBtC,EAAI1L,UAAY4H,EAAG5H,UACnB0L,EAAIzL,KAAO2H,EAAG3H,KACV2H,EAAGhI,iBACW,WAAZgI,EAAGv6B,OACLqsB,GAAUkO,EAAG1I,SAAS+O,KAAK,GAC3BtU,GAAUiO,EAAG1I,SAAS+O,KAAK,GAC3BrU,GAAUgO,EAAG1I,SAAS+O,KAAK,IAE7BvC,EAAI9L,eAAiBgI,EAAGhI,eACxB8L,EAAIxM,SAAW0I,EAAG1I,UAEpBtB,GAAW90B,GAAK4iC,CAAG,IAIrBp/B,OAAO6C,KAAK4e,KAAKuf,UAAUpf,SAASplB,IAClC,MAAM8+B,EAAK7Z,KAAKuf,SAASxkC,GACzB,IAAI4iC,EAAM7N,GAAY/0B,QACVI,IAARwiC,IACF7N,GAAY/0B,GAAKskC,GAAYtkC,GAC7B4iC,EAAM7N,GAAY/0B,IAEpB4iC,EAAI7M,OAAS+I,EAAG/I,OAChBhB,GAAY/0B,GAAK4iC,CAAG,IAItBp/B,OAAO6C,KAAK4e,KAAK0d,cAAcvd,SAASplB,IACtC,MAAM8+B,EAAK7Z,KAAK0d,aAAa3iC,GAC7B,IAAI4iC,EAAM5N,GAAgBh1B,QACdI,IAARwiC,IACF5N,GAAgBh1B,GAAKyiC,GAAgBziC,GACrC4iC,EAAM5N,GAAgBh1B,IAExB4iC,EAAIwC,IAAMtG,EAAGsG,IACbpQ,GAAgBh1B,GAAK4iC,CAAG,IAI1BN,KACA5R,GAAgBS,GAChBR,GAAiBS,EACnB,CCxDO,SAASiU,GAAoBvX,GAClC,MAAMtC,EAAMltB,SAAS4D,cAAc,OAKnC,OAJAspB,EAAI1jB,MAAMw9B,WAAa,OACvB9Z,EAAInG,GAAK,GAAGyI,SACZtC,EAAI/qB,UAAYm6B,aAChBpP,EAAInoB,YAAcyqB,EACXtC,CACT,CA4GO,SAAS+Z,GAAgCrZ,GAC9CA,EAAQnR,YAAYsqB,GAAoB,iBACxC,MAAMG,EAASlnC,SAAS4D,cAAc,OACtCsjC,EAAO19B,MAAM29B,aAAe,MAC5BD,EAAO19B,MAAMyF,MAAQ,QACrBi4B,EAAOngB,GAAK,kBACZ6G,EAAQnR,YAAYyqB,GAEpBtZ,EAAQnR,YAAYsqB,GAAoB,4BACxCnZ,EAAQkV,UAAUt5B,MAAM2U,QAAU,OAClC,MAAMipB,EAAQpnC,SAAS4D,cAAc,OACrCwjC,EAAM59B,MAAM29B,aAAe,MAC3BC,EAAM59B,MAAMyF,MAAQ,QACpBm4B,EAAM59B,MAAM2U,QAAU,OACtBipB,EAAMrgB,GAAK,0BACX6G,EAAQnR,YAAY2qB,GAEpBxZ,EAAQnR,YAAYsqB,GAAoB,mBACxC,MAAMr0B,EAAK1S,SAAS4D,cAAc,OAClC8O,EAAGlJ,MAAM29B,aAAe,MACxBz0B,EAAGqU,GAAK,cACR6G,EAAQnR,YAAY/J,GAEpBkb,EAAQnR,YAAYsqB,GAAoB,cACxC,MAAM5F,EAAOnhC,SAAS4D,cAAc,OAIpC,GAHAu9B,EAAKpa,GAAK,gBACV6G,EAAQnR,YAAY0kB,GAEA,MAAhB/C,GAAqB,CACvBxQ,EAAQnR,YAAYsqB,GAAoB,0CACxCnZ,EAAQkV,UAAU/b,GAAK,gCACvB,MAAMsgB,EAAarnC,SAAS4D,cAAc,OAC1CyjC,EAAWtgB,GAAK,0BAChB6G,EAAQnR,YAAY4qB,EACtB,CACA,GAAoB,MAAhBjJ,GAAqB,CACvBxQ,EAAQnR,YAAYsqB,GAAoB,sDACxCnZ,EAAQkV,UAAU/b,GAAK,iCACvB,MAAMsgB,EAAarnC,SAAS4D,cAAc,OAC1CyjC,EAAWtgB,GAAK,2BAChB6G,EAAQnR,YAAY4qB,EACtB,CACF,CC3Ke,SAASC,GAAW9G,EAAIpI,GACrC,IAAI4G,EAAS,GA4Bb,OA1BsCA,EAAlCwB,EAAG9tB,IAAM,GAAK8tB,EAAG9tB,KAAO8oB,IAAmBsB,GACtC0D,EAAG9tB,GAAKwjB,GAAqBsG,GAC7BgE,EAAG9tB,KAAOwjB,GAAqBuG,GAC/B+D,EAAG9tB,GAAK0jB,GAAa,IAAI,GAAasG,GACtC8D,EAAG9tB,GAAK0jB,GAAa,IAAI,GAAauG,GACtC6D,EAAG9tB,GAAK0jB,GAAa,IAAI,GAAawG,GACjCC,GAMN,IAFNlB,OACEhV,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwf,sBAIpEnP,EAAQoJ,KACR7F,OACEhV,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwf,uBAGtEvI,EAASxC,IAGT7V,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASyf,uBAClEpP,EAAQzR,KAAK4c,QAAU,IAAGvE,EAASpC,IAElCoC,CACT,CC7Ce,SAASyI,KACtB,IAAIjD,EAAO,EAIX,OAHAt/B,OAAO6C,KAAK4e,KAAK+gB,OAAO5gB,SAASplB,SACM,IAA1BilB,KAAK+gB,MAAMhmC,GAAGimC,UAAyBnD,GAAQ7d,KAAK+gB,MAAMhmC,GAAGimC,QAAO,IAE1EnD,CACT,CCFe,SAASoD,GAAOhR,GACzBF,GAAgBE,IACgB,IAA9BF,GAAgBE,GAAMkQ,MACxBpQ,GAAgBE,GAAMkQ,IAAM,EACS,WAAjCngB,KAAK0d,aAAazN,GAAMW,OAAmBtF,IAAwB,GAG7E,CCWe,SAAS4V,KACtBlV,GAAe,EACf,IAAI6R,EAAO,EAEX,MAAMsD,EAAO,CAAC,EACd5iC,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IACjC,GAAIilB,KAAKoR,QAAQr2B,GAAG82B,gBAAkB7R,KAAKoR,QAAQr2B,GAAGo2B,SAASgQ,KAAM,CACnE,MAAMC,EAASphB,KAAKoR,QAAQr2B,GAAGo2B,SAASgQ,KACxC5iC,OAAO6C,KAAKggC,GAAQjhB,SAASkhB,IACvBF,EAAKE,GAAKF,EAAKE,IAAOD,EAAOC,GAC5BF,EAAKE,GAAMD,EAAOC,EAAG,GAE9B,KAEFtV,GAAUoV,EAEiB,IAAvBnhB,KAAK2Q,gBACPkN,GAAkC,IAA1B71B,WAAWwjB,IAAsBD,GCpC9B,WACb,IAAI+V,EAAe,EAWnB,GAVI7Q,GAAO,0BAAyB6Q,GAAgB,KAChD7Q,GAAO,2BAA0B6Q,GAAgB,IACjD7Q,GAAO,qBAAoB6Q,GAAgB,KAC3C7Q,GAAO,4BAA2B6Q,GAAgB,KAClD7Q,GAAO,kBAAiB6Q,GAAgB,KAE5CA,GAAgB,EAAgC,IAA5BtR,GAAY,cAC5BS,GAAO,iBAAgB6Q,GAAgB,MACvC7Q,GAAO,kBAAiB6Q,GAAgB,MACxC7Q,GAAO,kBAAiB6Q,GAAgB,MACxCthB,KAAKiR,OAAQ,CACf,MAAMa,EAASd,GAAU,YACV,IAAXc,EAAcwP,GAAgB,GACd,IAAXxP,EAAcwP,GAAgB,GACnB,IAAXxP,IAAcwP,GAAgB,GACzC,CACA,OAAOA,CACT,CDiBgEC,IAE9D1D,GAAQtN,GAAO,OAEXE,GAAO,YAAqC,IAAvBzQ,KAAK2Q,gBAAqBkN,GAAQ,EAAI,IAAO7d,KAAKwhB,SAE3EjjC,OAAO6C,KAAK4e,KAAKyhB,gBAAgBthB,SAASplB,IACxC,MAAM8+B,EAAK7Z,KAAKyhB,eAAe1mC,GAC3B01B,GAAOoJ,EAAGv6B,QAIY,mBAAbu6B,EAAG2F,MACZ3B,GAAQ,EAAuD,IAAnD/N,GAAY+J,EAAGv6B,MAAMkgC,MAAM1P,GAAY+J,EAAGv6B,OACjDu+B,GAAQ,EAAe,IAAXhE,EAAG2F,MACxB,IAGE/O,GAAO,iCAAgCoN,GAAQ,MAC/CpN,GAAO,0BAAyBoN,GAAQ,MACxCpN,GAAO,sBAAqBoN,GAAQ,MACpCpN,GAAO,iBAAgBoN,GAAQ,MAC/BpN,GAAO,kBAAiBoN,GAAQ,MAEhCpN,GAAO,yBAAwBoN,GAAQ,MACvCpN,GAAO,wBAAuBoN,GAAQ,MACtCpN,GAAO,oBAAmBoN,GAAQ,MAClCpN,GAAO,sBAAqBoN,GAAQ,MACpCpN,GAAO,sBAAqBoN,GAAQ,KAEpCpN,GAAO,kBAAiBoN,GAAQ,MAChCpN,GAAO,kBAAiBoN,GAAQ,MAEhCpN,GAAO,kBAAiBoN,GAAQ,MAGpC,IAAI6D,EAAY,EAChB,GAAI1Q,GAAW,CACb,IAAIc,EAASd,GAAU,cACR,IAAXc,EAAc+L,GAAQ,KACN,IAAX/L,EAAc+L,GAAQ,IACX,IAAX/L,IAAc+L,GAAQ,MAE/B/L,EAASd,GAAU,QACJ,IAAXc,EACF+L,GAAQ,EAAI,IAAO16B,KAAKw+B,IAAKtN,GAAyB,IAAO,MAAiBlxB,KAAKuT,GAAK,GACtE,IAAXob,EACP+L,GAAQ,EAAI,IAAO16B,KAAKw+B,IAAKtN,GAAyB,IAAO,MAAkBlxB,KAAKuT,GAAK,GACvE,IAAXob,IACP+L,GAAQ,EAAI,IAAO16B,KAAKw+B,IAAKtN,GAAyB,IAAO,MAAkBlxB,KAAKuT,GAAK,IAE3Fob,EAASd,GAAU,aACJ,IAAXc,EAAc4P,GAAa,IACX,IAAX5P,EAAc4P,GAAa,IAChB,IAAX5P,IAAc4P,GAAa,KAEpC5P,EAASd,GAAU,YACJ,IAAXc,EAAc4P,GAAa,IACX,IAAX5P,EAAc4P,GAAa,KAChB,IAAX5P,IAAc4P,GAAa,MAEpC5P,EAASd,GAAU,SACJ,IAAXc,EAAc4P,GAAa,IACX,IAAX5P,EAAc4P,GAAa,IAChB,IAAX5P,IAAc4P,GAAa,IACtC,CAEIjR,GAAO,oBAAmBoN,GAAQ,EAA4B,KAAvB7d,KAAK4hB,WAAa,IAE7D,MAAMC,EAAevW,GAAuB,GAC5C,IAAIwW,EAAW,EAIf,GAHIrR,GAAO,8BAA6BqR,GAAY,MAEpDA,GAAY,EAAoC,IAAhC9R,GAAY,kBACxBgB,GAAW,CACb,MAAMc,EAASd,GAAU,UACV,IAAXc,EAAcgQ,GAAY,IACV,IAAXhQ,EAAcgQ,GAAY,KACf,IAAXhQ,IAAcgQ,GAAY,KACrC,CACAA,GAAYvR,GAAO,QAEnB,IAAIwR,EAAU,EAEVtR,GAAO,oBAAmBsR,GAAW,EAAmB,GAAfF,EAAqBC,GAC9DrR,GAAO,oBAAmBsR,GAAW,EAAmB,KAAfF,EAAuBC,GAChErR,GAAO,sBAAqBsR,GAAW,EAAmB,IAAfF,EAAsBC,GACjErR,GAAO,sBAAqBsR,GAAW,EAAmB,KAAfF,EAAuBC,GAClErR,GAAO,qBAAoBsR,GAAW,EAAmB,GAAfF,EAAqBC,GAC/DrR,GAAO,wBAAuBsR,GAAW,EAAmB,GAAfF,EAAqBC,GAClErR,GAAO,wBAAuBsR,GAAW,EAAmB,GAAfF,EAAqBC,GAClErR,GAAO,oBAAmBsR,GAAW,EAAmB,GAAfF,EAAqBC,GAC9DrR,GAAO,wBAAuBsR,GAAW,EAAmB,GAAfF,EAAqBC,GAClErR,GAAO,+CACTsR,GAAW,EAAmB,KAAfF,EAAuBC,GACpCrR,GAAO,uBAAsBsR,GAAW,EAAmB,IAAfF,EAAsBC,GAClErR,GAAO,qBAAoBsR,GAAW,EAAmB,KAAfF,EAAuBC,GACjErR,GAAO,uBAAsBsR,GAAW,EAAmB,KAAfF,EAAuBC,GACnErR,GAAO,mBAAkBsR,GAAW,EAAmB,IAAfF,EAAsBC,GAC9DrR,GAAO,wBAAuBsR,GAAW,EAAmB,KAAfF,EAAuBC,GACpErR,GAAO,mBAAkBsR,GAAW,EAAmB,GAAfF,EAAqBC,GAC7DrR,GAAO,kBAAiBsR,GAAW,EAAmB,IAAfF,EAAsBC,GAEjEvjC,OAAO6C,KAAKyuB,IAAY1P,SAASplB,IAC/B,MAAM8+B,EAAKhK,GAAW90B,GACtB,IAAIinC,EAAYnI,EAAG+E,IAAI/E,GACI,IAAvB7Z,KAAK2Q,gBAAqBqR,IAAc,EAAe,IAAXnI,EAAG4F,OAAgBiC,GACnD,YAAZ7H,EAAGv6B,MAAsBmxB,GAAO,sDAClCuR,GAAa,EAAI,IAAOH,EAAeC,GACzC9V,IAAgB6N,EAAG1H,OAAS6P,CAAS,IAGnCvR,GAAO,WAAUzE,IAAgB,GAErC6R,GAAQkE,EAER,IAAIE,EAAU,EAad,GAZIxR,GAAO,iBAAgBwR,GAAW,MAClCxR,GAAO,cAAawR,GAAW,MAC/BxR,GAAO,gBAAewR,GAAW,MACjCxR,GAAO,eAAcwR,GAAW,MAChCxR,GAAO,eAAcwR,GAAW,MAChCxR,GAAO,iBAAgBwR,GAAW,MAClCxR,GAAO,mBAAkBwR,GAAW,MACpCxR,GAAO,gBAAewR,GAAW,MACjCxR,GAAO,eAAcwR,GAAW,MAChCxR,GAAO,eAAcwR,GAAW,MAChCxR,GAAO,gBAAewR,GAAW,MACjCxR,GAAO,eAAcwR,GAAW,MAChCxR,GAAO,eAAgB,CAEzB,IAAIyR,EACmE,GAApE/+B,KAAKgE,OAAOqtB,GAAyBxU,KAAKmiB,WAAa,IAAO,IAAY,GAAK,GAAK,GACvFD,EAAM/+B,KAAKyD,IAAIs7B,EAAK,KAEpB7U,GAAe,EAAiC,IAA5B,GAAK,EAAI6U,EAAM,MAAQ,GAC3CD,GAAW5U,EACb,CACAwQ,GAAQoE,EAEJxR,GAAO,kBAAiBoN,GAAQ,EAAgC,IAA5B16B,KAAKyD,IAAI,IAAKoZ,KAAKoiB,QAG3DvE,GAAQ,EAAI7N,GAAY,oBAExB,MAAMqS,EAAerW,GAAe6R,EACpCt/B,OAAO6C,KAAK4e,KAAKsiB,iBAAiBniB,SAASplB,IACrCsnC,GAAgBriB,KAAKsiB,gBAAgBvnC,GAAGwnC,WAAWtB,GAAOjhB,KAAKsiB,gBAAgBvnC,GAAGuE,KAAK,IAG7F2sB,GAAkBoW,EAElB,MAAM,EAAErkC,GAAMgiB,KAAKwiB,aAAaC,OAC1BC,EAAW1S,GAAY,oBAC7B,IAAK,IAAIj1B,EAAI,EAAGA,EAAIiD,EAAGjD,IACrB8iC,GAAQ,EAAe,KAAX6E,EAGd,MAAMpjC,EAAO0gB,KAAK2iB,WAAWtnC,cAM7B,GALa,WAATiE,EAAmBu+B,GAAQ,IACb,WAATv+B,IAAmBu+B,GAAQ,KAEhCpN,GAAO,oBAAmBoN,GAAQ,KAElCpN,GAAO,uBAAwB,CACjC,IAAImS,EAAmB,IACvB,GAAInS,GAAO,iBAAkB,CAC3B,MAAMoS,EAAW7iB,KAAK8iB,qBACtBvkC,OAAO6C,KAAKyhC,GAAU1iB,SAASplB,IACzB01B,GAAOoS,EAAS9nC,MAAK6nC,GAAoB,GAAG,GAEpD,CACA/E,GAAQ+E,CACV,CACA,GAAInS,GAAO,yBAA0B,CACnC,IAAIsS,EAAW,GACXtS,GAAO,yBAAwBsS,GAAY,IAC3CtS,GAAO,oBAAmBsS,GAAY,KACtCtS,GAAO,sBAAqBsS,GAAY,KACxCtS,GAAO,qBAAoBsS,GAAY,KAC3ClF,GAAQ,EAAIkF,CACd,CAEItS,GAAO,uBAAsBoN,GAAQ,KACrCpN,GAAO,wBAAuBoN,GAAQ,GAE1C7R,GAAehM,KAAKgjB,kBAAkB,MAAOhX,IAE7C6R,GAAQiD,KAER9U,IAAgB6R,CAGlB,CEzOO,MAAMoF,GAAW,CACtB,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,gBAIWC,GAAe,CAC1B,gBACA,gBACA,cACA,gBACA,kBACA,kBACA,kBAIWC,GAAgB,CAC3B,0BACA,qBACA,mBACA,iBACA,sBACA,gBACA,oBAIWC,GAAa,CACxB,sBACA,wBACA,sBACA,yBACA,wBACA,yBACA,wBAIWC,GAAa,CACxB,qBACA,oBACA,oBACA,yBACA,cACA,WACA,eCnEa,SAASC,GAAarT,GACnC,OAAOF,GAAgBE,GAAQF,GAAgBE,GAAMkQ,IAAM,CAC7D,CCIe,SAASoD,KACtB,IAAIC,EAAW,EACfjlC,OAAO6C,KAAK4e,KAAK+e,kBAAkB5e,SAASplB,IACtC01B,GAAOzQ,KAAK+e,iBAAiBhkC,MAAKyoC,GAAY,EAAC,KAEhDF,GAAa,UAAYE,GAAY,GAAGvC,GAAO,UAC/CqC,GAAa,YAAcE,GAAY,IAAIvC,GAAO,WAEvD,IAAIwC,EAAiB,EACjBC,EAAgB,EAChBC,EAAS,EACTC,EAAY,IAChBrlC,OAAO6C,KAAKyuB,IAAY1P,SAASplB,IAC/B0oC,GAAkB5T,GAAW90B,GAAGo3B,OAChCyR,EAAYzgC,KAAKyD,IAAIipB,GAAW90B,GAAGo3B,OAAQyR,GACtCN,GAAa,kBAEdzT,GAAW90B,GAAGo3B,OACdhvB,KAAKyD,IAAI,IAAK,IAAMoZ,KAAK6jB,YAAY7oC,OAASglB,KAAKoR,QAAQr2B,GAAGqlB,GAAK,MAEnEsjB,EAAgB,GAEfJ,GAAa,YACZzT,GAAW90B,GAAGo3B,OAA0D,IAAhDnS,KAAK6jB,YAAY7oC,OAASglB,KAAKoR,QAAQr2B,GAAGqlB,MAAUujB,EAAS,EAC3F,IAEEC,GAAa,GAAG3C,GAAO,uBACL,IAAlByC,GAAqBzC,GAAO,iBACjB,IAAX0C,GAAc1C,GAAO,WACrB2C,GAAa,KAAK3C,GAAO,cACzB2C,GAAa,KAAK3C,GAAO,yBACzB2C,GAAa,KAAK3C,GAAO,gBACzB2C,GAAa,KAAK3C,GAAO,2BACzB2C,GAAa,KAAK3C,GAAO,iBACzB2C,GAAa,KAAK3C,GAAO,4BACzB2C,GAAa,KAAK3C,GAAO,oBACzB2C,GAAa,KAAK3C,GAAO,+BACzB2C,GAAa,KAAK3C,GAAO,kBACzB2C,GAAa,KAAK3C,GAAO,6BACzB2C,GAAa,KAAK3C,GAAO,iBACzB2C,GAAa,KAAK3C,GAAO,4BACzB2C,GAAa,KAAK3C,GAAO,kBAEzBwC,GAAkB,KAAKxC,GAAO,WAC9BwC,GAAkB,KAAKxC,GAAO,aAC9BwC,GAAkB,KAAMxC,GAAO,YAC/BwC,GAAkB,MAAMxC,GAAO,sBAC/BwC,GAAkB,KAAMxC,GAAO,gBAC/BwC,GAAkB,MAAMxC,GAAO,gBAC/BwC,GAAkB,KAAOxC,GAAO,UAEhC7V,GAAoB,IAAI6V,GAAO,YAC/B7V,GAAoB,IAAI6V,GAAO,aAC/B7V,GAAoB,KAAK6V,GAAO,YAChC7V,GAAoB,KAAK6V,GAAO,oBAChC7V,GAAoB,KAAK6V,GAAO,oBAChC7V,GAAoB,KAAK6V,GAAO,oCAChC7V,GAAoB,KAAK6V,GAAO,UAChC7V,GAAoB,KAAK6V,GAAO,kBAChC7V,GAAoB,KAAK6V,GAAO,0BAEhCwC,GAAkB,KAAQrY,GAAoB,KAAK6V,GAAO,YAC1DwC,GAAkB,KAAQrY,GAAoB,KAAK6V,GAAO,qBAE1DpR,GAAWiU,OAAO3R,OAAStC,GAAW2O,QAAQrM,QAAU,KAAK8O,GAAO,qBAExE,IAAI8C,GAAkB,EACtBxlC,OAAO6C,KAAK8hC,IAAc/iB,SAASplB,IAC5B01B,GAAOyS,GAAanoC,MAAKgpC,GAAkB,EAAK,IAEnDA,GAAiB9C,GAAO,kBAE5B,IAAI+C,GAAmB,EAMvB,GALAzlC,OAAO6C,KAAK+hC,IAAehjB,SAASplB,IAC7B01B,GAAO0S,GAAcpoC,MAAKipC,GAAmB,EAAK,IAErDA,GAAkB/C,GAAO,eAEzBxQ,GAAO,mBAAoB,CAC7B,MAAMwT,EAAOjkB,KAAK+d,MAAMnM,QAAQiR,SAChC,IAAIqB,EAAW,EACf3lC,OAAO6C,KAAK6iC,GAAM9jB,SAASplB,IACrB01B,GAAOwT,EAAKlpC,GAAGuE,QAAO4kC,GAAY,EAAC,IAErCA,GAAYD,EAAKjpC,QAAQimC,GAAO,YACtC,CACF,CCpFe,SAASkD,GAAwB3S,EAAUW,GACxDwN,KACA9P,GAAW2B,GAAUW,QAAUA,EAC/B,MAAM0H,EAAKhK,GAAW2B,GAEL,WAAbA,GACEqI,EAAG1H,QAAU,GAAG8O,GAAO,SACvBpH,EAAG1H,QAAU,GAAG8O,GAAO,gBACvBpH,EAAG1H,QAAU,IAAI8O,GAAO,eACxBpH,EAAG1H,QAAU,KAAK8O,GAAO,mBACzBpH,EAAG1H,QAAU,KAAK8O,GAAO,eACzBpH,EAAG1H,QAAU,KAAK8O,GAAO,uBACzBpH,EAAG1H,QAAU,KAAK8O,GAAO,SACzBpH,EAAG1H,QAAU,KAAK8O,GAAO,kCACzBpH,EAAG1H,QAAU,KAAK8O,GAAO,iCACzBpH,EAAG1H,QAAU,KAAK8O,GAAO,wBACzBpH,EAAG1H,QAAU,KAAK8O,GAAO,wBACzBpH,EAAG1H,QAAU,KAAK8O,GAAO,eACzBpH,EAAG1H,QAAU,KAAM8O,GAAO,wBAE9B1iC,OAAO6C,KAAK4e,KAAKoR,QAAQyI,EAAGv6B,MAAM8kC,eAAejkB,SAAS4Z,IACpDF,EAAG1H,QAAUnS,KAAK+d,MAAM/d,KAAKoR,QAAQyI,EAAGv6B,MAAM8kC,cAAcrK,GAAGlJ,MAAMwT,cACvEpD,GAAOjhB,KAAKoR,QAAQyI,EAAGv6B,MAAM8kC,cAAcrK,GAAGz6B,KAChD,IAIJ,MAAMglC,EAAwBhZ,GAU9B,OARA4V,KAEAqC,KAEIe,IAA0BhZ,IAC5B4V,KAGKlV,GAAehM,KAAKgb,SAC7B,CC5Ce,SAASuJ,GAA4BC,EAAcC,EAAUC,GAC1E,IAAIC,EAAQH,EACRjI,EAAQ,EACZ,KAAOoI,EAAQD,GACbC,GAAqE,KAA5DxhC,KAAK2D,IAAI,MAAQ69B,EAAQxhC,KAAK2D,IAAI29B,EAAU,OAAS,IAC9DlI,GAAS,EAEX,OAAOA,EAAQvc,KAAKwB,GACtB,CCVe,SAASojB,KACkB,OAApC/4B,EAAE,gCACoF,IAApFmU,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASyjB,aACtEh5B,EAAE,8BAA8BhJ,MAAMoC,IAAM,OAC5C4G,EAAE,8BAA8BhJ,MAAM04B,OAAS,WAC/C1vB,EAAE,8BAA8BhJ,MAAMqK,QAAU,YAEhDrB,EAAE,8BAA8BhJ,MAAM2a,MAAQ,OAC9C3R,EAAE,8BAA8BhJ,MAAM04B,OAAS,MAC/C1vB,EAAE,8BAA8BhJ,MAAMqK,QAAU,WAGtD,CCDe,SAAS43B,KAEtB,GADAnF,KACyC,SAArC9zB,EAAE,iBAAiBhJ,MAAM2U,SAAsB3L,EAAE,iBAAkB,CACrEA,EAAE,iBAAiB6L,UAAY,GAC/B,MAAMqtB,EZHH,WACLl5B,EAAE,WAAWjO,WAAWiF,MAAMmiC,cAAgB,MAC9C,MAAMD,EAAa1rC,SAAS4D,cAAc,OAM1C,OALA8nC,EAAWliC,MAAMgU,OAAS,YAC1BkuB,EAAWliC,MAAMqK,QAAU,MAC3B63B,EAAWliC,MAAM04B,OAAS,WAC1BwJ,EAAW3kB,GAAK,kBAChB2kB,EAAWvpC,UAAYm6B,aAChBoP,CACT,CYNuB,GACnBl5B,EAAE,iBAAiBiK,YAAYivB,GAEX,MAAhBtN,GCIO,WACb,IAAIr3B,EAaJ,GAZqB,IAAjB4f,KAAKkY,QACPlB,GAA4B52B,EAE5BA,EAAS42B,GAEU,IAAjBhX,KAAKyS,QAAeryB,EAASotB,GACP,KAAjBxN,KAAKyS,QAAgBryB,EAASqtB,GACb,MAAjBzN,KAAKyS,UAAiBryB,EAASstB,IAExC6J,GAAevX,KAAKoR,QAAQsG,IAAaiF,UACzCnF,GAAqBp3B,EAAOs3B,IAAasE,MAGqD,IAA5Fhc,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6jB,qBACnD,IAAjBjlB,KAAKkY,QACL,CAIA,GAFA,GADmBrsB,EAAE,oBAKjB,IADFmU,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6jB,qBAEnD,IAAjBjlB,KAAKkY,QACL,CACArsB,EAAE,mBAAmBzN,YAAc,GAASo5B,GAAoB,GAChE,MAAM0N,EAAW/hC,KAAKC,MAAOo0B,GAAqBxX,KAAKgb,UAAa,KAChEhG,OAAOC,SAASiQ,IAA0B,IAAbA,EAC/Br5B,EAAE,mBAAmBzN,aAAe,KAAK8mC,EAAW,kBAEpDr5B,EAAE,mBAAmBzN,aAAe,OAClC4hB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgU,eAChE,IACA,oBAGRvpB,EAAE,mBAAmBrQ,UAAYm6B,GAAgBv1B,EAAOs3B,IAAaW,OACjErY,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASqb,cACtE5wB,EAAE,eAAezN,YAAcm8B,GAAWn6B,EAAOs3B,IAAa3rB,IAC3DF,EAAE,eAAezN,YAAc,GAASgC,EAAOs3B,IAAa3rB,GAAI,GACrEF,EAAE,eAAerQ,UAAYm6B,GAAgBv1B,EAAOs3B,IAAaW,OACjE,MAAMqE,EAAa9B,IAChBrD,IAAgBvX,KAAK4c,QAAUzB,OAAyBN,MAE3DhvB,EAAE,iBAAiBzN,YAAcs+B,EAAW7T,KACpB,UAApB6T,EAAW7T,MAAoB7I,KAAK4c,QAAUx8B,EAAOs3B,IAAajG,MACpE5lB,EAAE,iBAAiBzN,YAAc,GAAGs+B,EAAW7T,oBAC1Chd,EAAE,iBAAiBzN,YAAcs+B,EAAW7T,KACnDhd,EAAE,iBAAiBrQ,UAAYm6B,GAAgB+G,EAAWrE,MAC5D,CAGAxsB,EAAE,iCAAiChJ,MAAM2U,QAAU,OACnD3L,EAAE,iBAAiBhJ,MAAM29B,aAAe,MAGxC,IAAK,MAAMzlC,KAAKwD,OAAO6C,KAAK4e,KAAKoR,QAAQsG,IAAayN,mBACpD,IAAKnlB,KAAKolB,UAAUplB,KAAKoR,QAAQsG,IAAayN,kBAAkBpqC,GAAGsqC,OAAO/lC,MAAO,CAC/E,MAAMgmC,EAAuBtlB,KAAKoR,QAAQsG,IAAayN,kBAAkBpqC,GACzE8Q,EAAE,iBAAiBhJ,MAAM29B,aAAe,MACxC30B,EAAE,iCAAiChJ,MAAM2U,QAAU,GACnD3L,EAAE,2BAA2BrQ,UAAY,kBAAkBk8B,KAC3D7rB,EAAE,2BAA2BzN,YAAc,GACzCknC,EAAqB5F,IAAM7P,GAAW6H,IAAauI,aACnD,IAEFp0B,EAAE,2BAA2BhJ,MAAMyF,MAAQ,QAC3C,KACF,CAGF,MAAMi9B,EAAkB5X,GAA4B+J,IACpD,GAAI6N,EAAgB7M,aAAe,IAAK,CAItC,IAAI8M,EAHJ35B,EAAE,2BAA2BhJ,MAAM29B,aAAe,MAClD30B,EAAE,kCAAkChJ,MAAM2U,QAAU,GAIlDguB,EADExlB,KAAKgb,UAEL73B,KAAK2D,IAAIy+B,EAAgB9T,OAASzR,KAAK4c,QAAUzB,MAAuB,GACtEnb,KAAKgb,UACPuK,EAAgB9T,MACd0S,GAAwBzM,GAAa6N,EAAgB7M,cAGvD6M,EAAgB9T,MAChB0S,GAAwBzM,GAAa6N,EAAgB7M,cAEzD7sB,EAAE,4BAA4BzN,YAAc,GAAG,GAC7CmnC,EAAgB7M,mBACX,GAAS6M,EAAgB9T,YAChC5lB,EAAE,4BAA4BhJ,MAAMyF,MAAQ,QAC5C,MAAMm9B,EAASpsC,SAAS4D,cAAc,QAClC+iB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASqb,cACtEgJ,EAAOrnC,YAAcm8B,GAAWiL,GAC7BC,EAAOrnC,YAAc,GAASonC,GACnCC,EAAOjqC,UAAYm6B,GAAgBgL,GAAW,CAAE50B,GAAIy5B,GAAcD,EAAgB9T,OAClF5lB,EAAE,4BAA4BiK,YAAY2vB,EAC5C,MACE55B,EAAE,kCAAkChJ,MAAM2U,QAAU,OACpD3L,EAAE,2BAA2BhJ,MAAM29B,aAAe,KAEtD,MAAO30B,EAAE,iBAAiBhJ,MAAM2U,QAAU,MAC5C,CD3GMkuB,GACyB,MAAhBjO,GENA,WAQb,GANA,GADmB5rB,EAAE,oBAGrB2rB,GAAqBvJ,GAAcjO,KAAK4Z,gBAAgBlC,IAAap4B,MAAM08B,MAC3EzE,GAAevX,KAAKuf,SAASvf,KAAK4Z,gBAAgBlC,IAAap4B,MAAMqmC,WACrEhO,GAAoB1J,GAAcjO,KAAK4Z,gBAAgBlC,IAAap4B,MAAMsmC,WAGoB,IAA5F5lB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6jB,oBACpE,CACAp5B,EAAE,mBAAmBzN,YAAc,GAASo5B,GAAoB,GAChE,MAAM0N,EAAW/hC,KAAKC,MAAOo0B,GAAqBxX,KAAKgb,UAAa,KAE3B,MAArCnvB,EAAE,mBAAmBzN,aACvByN,EAAE,qBAAqBhJ,MAAM2U,QAAU,OACvC3L,EAAE,mBAAmBhJ,MAAM2U,QAAU,OACrC3L,EAAE,uBAAuBhJ,MAAM2U,QAAU,OACzC3L,EAAE,eAAehJ,MAAM2U,QAAU,SAE7Bwd,OAAOC,SAASiQ,IAA0B,IAAbA,EAC/Br5B,EAAE,mBAAmBzN,aAAe,KAAK8mC,EAAW,kBAEpDr5B,EAAE,mBAAmBzN,aAAe,OAClC4hB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgU,eAChE,IACA,oBAGRvpB,EAAE,mBAAmBrQ,UACnBm6B,GAAgB1H,GAAcjO,KAAK4Z,gBAAgBlC,IAAap4B,MAAM+4B,QAItEV,KACF9rB,EAAE,2BAA2BzN,YAAc,GAASu5B,IACpD9rB,EAAE,2BAA2BhJ,MAAM2U,QAAU,QAC7C3L,EAAE,2BAA2Bg6B,gBAAgBhjC,MAAM2U,QAAU,UAG1DggB,IAAsBG,IACzB9rB,EAAE,eAAezN,YAAc,GAAG,GAASm5B,GAAeI,aAC1D9rB,EAAE,eAAehJ,MAAMyF,MAAQ,QAC/BuD,EAAE,uBAAuBhJ,MAAM2U,QAAU,QACzC3L,EAAE,eAAehJ,MAAM2U,QAAU,UAE7BwI,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASqb,cACtE5wB,EAAE,eAAezN,YAAcm8B,GAC7BtM,GAAcjO,KAAK4Z,gBAAgBlC,IAAap4B,MAAMyM,IAGxDF,EAAE,eAAezN,YAAc,GAC7B6vB,GAAcjO,KAAK4Z,gBAAgBlC,IAAap4B,MAAMyM,GACtD,GAEJF,EAAE,eAAerQ,UACfm6B,GAAgB1H,GAAcjO,KAAK4Z,gBAAgBlC,IAAap4B,MAAM+4B,QAE1E,MAAMqE,EAAa9B,IAChBrD,IAAgBvX,KAAK4c,QAAUzB,OAAyBN,MAY3D,GAVAhvB,EAAE,iBAAiBzN,YAAcs+B,EAAW7T,KAEtB,UAApB6T,EAAW7T,MACX7I,KAAK4c,QAAU5c,KAAK4Z,gBAAgBlC,IAAaiO,WAEjD95B,EAAE,iBAAiBzN,YAAc,GAAGs+B,EAAW7T,oBAC1Chd,EAAE,iBAAiBzN,YAAcs+B,EAAW7T,KACnDhd,EAAE,iBAAiBrQ,UAAYm6B,GAAgB+G,EAAWrE,OAGX,kBAA3CrY,KAAK4Z,gBAAgBlC,IAAap4B,KAA0B,CAC9DuM,EAAE,mBAAmBswB,UAAUt5B,MAAM29B,aAAe,MACpD30B,EAAE,mBAAmBiK,YACnB,GAA2B,yCAE7B,MAAMgwB,EAAYzsC,SAAS4D,cAAc,OACzC6oC,EAAUjjC,MAAMyF,MAAQ,QACxBw9B,EAAU1nC,YAAc,GAAG,GAAwB,IAAf4hB,KAAK4c,cAAqB,GAASrP,MACvE1hB,EAAE,mBAAmBiK,YAAYgwB,EACnC,CACF,MAAOj6B,EAAE,iBAAiBhJ,MAAM2U,QAAU,MAC5C,CF3EMuuB,GACyB,MAAhBtO,GGpBA,WACb,GAAwF,IAApFzX,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS4kB,YAAmB,CACzF,MAAMjB,EAAal5B,EAAE,mBAErBk5B,EAAWjvB,YAAY,GAA2B,uBAElD,MAAMmwB,EAAW5sC,SAAS4D,cAAc,OACxCgpC,EAAS7lB,GAAK,gBACd2kB,EAAWjvB,YAAYmwB,GACvB,MAAMC,ECAK,KADuB9qC,EDCD4kB,KAAKmmB,iBCC/B,CAAEtd,KAAM,SAAUwP,OAAQlC,IAEtB,IAAT/6B,EACK,CAAEytB,KAAM,aAAcwP,OAAQvC,IAE1B,IAAT16B,EACK,CAAEytB,KAAM,SAAUwP,OAAQtC,IAEtB,IAAT36B,EACK,CAAEytB,KAAM,QAASwP,OAAQrC,IAErB,IAAT56B,EACK,CAAEytB,KAAM,cAAewP,OAAQnC,IAEjC,CAAErN,KAAM,qBAAsBwP,OAAQpC,IDd3CgQ,EAAS7nC,YAAc8nC,EAAWrd,KAClCod,EAASzqC,UAAYm6B,GAAgBuQ,EAAW7N,MAClD,MAAOxsB,EAAE,iBAAiBhJ,MAAM2U,QAAU,OCJ7B,IAAuBpc,CDKtC,CHQMgrC,GACyB,MAAhB3O,GKnBA,WACb,MAAM,SAAEtG,GAAanR,KAAKoR,QAAQ,gBAC5BiV,EAAYlV,EAASmV,aAAanV,EAASoV,WAAW7O,KAE5D,GACsF,IAApF1X,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASolB,aACpEH,GAAalV,EAASsV,OACtB,CACA,MAAM1B,EAAal5B,EAAE,mBAGrBk5B,EAAWjvB,YAAY,GAA2B,cAClD,MAAM0kB,EAAOnhC,SAAS4D,cAAc,OACpCu9B,EAAKpa,GAAK,gBACV2kB,EAAWjvB,YAAY0kB,GACvB,MAAMkC,EAAa9B,GACjB2J,GAA4BpT,EAASwT,MAAOxT,EAASsV,OAAQJ,IAM/D,GAJA7L,EAAKp8B,YAAcs+B,EAAW7T,KAC9B2R,EAAKh/B,UAAYm6B,GAAgB+G,EAAWrE,OAGxCgO,GAAalV,EAASwT,MAAO,CAC/BI,EAAWjvB,YAAY,GAA2B,iBAClD,MAAM4wB,EAAUrtC,SAAS4D,cAAc,OACvCypC,EAAQtmB,GAAK,mBACb2kB,EAAWjvB,YAAY4wB,GACvB,MAAMC,EAAgB/L,GACpB2J,GACEphC,KAAK2D,IAAI,EAAGqqB,EAASwT,MAAQ0B,GAC7BlV,EAASsV,OACTtV,EAASwT,QAGb+B,EAAQtoC,YAAcuoC,EAAc9d,KACpC6d,EAAQlrC,UAAYm6B,GAAgBgR,EAActO,MACpD,CAGA,GAAoB,MAAhBX,GAAqB,CACvBqN,EAAWjvB,YAAY,GAA2B,8BAClD,MAAM8wB,EAAUvtC,SAAS4D,cAAc,OACvC2pC,EAAQxmB,GAAK,IACb2kB,EAAWjvB,YAAY8wB,GACvB,MAAMC,EAASxtC,SAAS4D,cAAc,QACtC4pC,EAAOhkC,MAAMyF,MAAQ,UACrBu+B,EAAOzoC,YAAc,GACnB+E,KAAK2D,IAAI3D,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,IAAK,GAClE,GAEF4L,EAAQ9wB,YAAY+wB,GACpB,MAAMC,EAAYztC,SAAS4D,cAAc,QACzC6pC,EAAU1oC,YAAc,MACxBwoC,EAAQ9wB,YAAYgxB,GACpB,MAAMC,EAAO1tC,SAAS4D,cAAc,QACpC8pC,EAAKlkC,MAAMyF,MAAQ,MACnBy+B,EAAK3oC,YAAc,GACjB+E,KAAKyD,IAAIoZ,KAAK4c,QAASz5B,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,IAAM,IACjF,GAEF4L,EAAQ9wB,YAAYixB,EACtB,CAEAl7B,EAAE,iBAAiBiK,YAAYivB,EACjC,MAAOl5B,EAAE,iBAAiBhJ,MAAM2U,QAAU,MAC5C,CL7CMwvB,GACyB,MAAhBvP,GMvBA,WACb,MAAM,SAAEtG,GAAanR,KAAKoR,QAAQ6V,KAClC,GACEjnB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS8lB,cACf,IAArD/V,EAASgW,KAAKzP,GAAY,IAAIA,GAAY,IAAI,GAC9C,CACA,MAAM0P,EACJjW,EAASgW,KAAKzP,GAAY,IAAIA,GAAY,IAAI,GAC9CvG,EAASkW,WAAWlW,EAASgW,KAAKzP,GAAY,IAAIA,GAAY,IAAI,GAAK,GAAG0P,OACtEE,EACJnW,EAASkW,WAAWlW,EAASgW,KAAKzP,GAAY,IAAIA,GAAY,IAAI,GAAK,GAAGp4B,KAC5EuM,EAAE,mBAAmBiK,YAAY,GAA2B,+BAC5D,MAAM+wB,EAASxtC,SAAS4D,cAAc,OACtC4pC,EAAOzmB,GAAK,uBACZvU,EAAE,mBAAmBiK,YAAY+wB,GACf,cAAdS,GAA2C,oBAAdA,EAC/Bz7B,EAAE,wBAAwBzN,YAAc,GACtCgpC,EAAS,GAASjkC,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,IAAM,SACxE,GAA0B,GAAjBhb,KAAKgb,UAAiB,KACd,cAAdsM,EACTz7B,EAAE,wBAAwBzN,YAAc,GACtCgpC,EAAS,GAASjkC,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,KAAO,SACzE,GAA0B,GAAjBhb,KAAKgb,UAAiB,MACd,cAAdsM,EACTz7B,EAAE,wBAAwBzN,YAAc,GACtCgpC,EAAS,GAASjkC,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,KAAO,SACzE,GAA0B,GAAjBhb,KAAKgb,UAAiB,MACd,cAAdsM,EACTz7B,EAAE,wBAAwBzN,YAAc,GACtCgpC,EAAS,GAASjkC,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,MAAQ,SAC1E,GAA0B,GAAjBhb,KAAKgb,UAAiB,OAChCnvB,EAAE,iBAAiBhJ,MAAM2U,QAAU,MAC5C,MAAO3L,EAAE,iBAAiBhJ,MAAM2U,QAAU,MAC5C,CNTM+vB,GACyB,OAAhB9P,GOzBA,WACb,MAAM,SAAEtG,GAAanR,KAAKoR,QAAQ6V,KAClC,GAAIjnB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS4kB,YAAa,CACnFn6B,EAAE,mBAAmBiK,YAAY,GAA2B,oCAC5D,IAAI0xB,EAAY,EACZC,EAAS,EACTznB,KAAK5e,KAAK,KAAO4e,KAAK5e,KAAK,MAAKqmC,EAAS,GAC7C,IAAK,IAAI5iC,EAAI,EAAGA,EAAI,EAAGA,IACrB,IAAK,IAAID,EAAI,EAAGA,EAAI,EAAGA,IACrB,GAAIusB,EAASgW,KAAKtiC,GAAGD,GAAG,IAAM,EAAG,CAC/B,MAAM8iC,EAAOvW,EAASgW,KAAKtiC,GAAGD,GACxBi1B,EAAK1I,EAASkW,WAAWK,EAAK,GAAK,GACnCJ,EAAYzN,EAAGv6B,KAErB,IAAIi9B,GAAQ,EACRkL,GAAU5N,EAAG8N,WAAUpL,GAAQ,GAC/BmL,EAAK,GAAK7N,EAAG+N,aAAYrL,GAAQ,GACjCA,GAAuB,cAAd+K,EACXE,GAAarkC,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,IACvDuB,GAAuB,cAAd+K,GAA4C,oBAAdA,EACjDE,GAAarkC,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,GACxDuB,GAAuB,cAAd+K,EAClBE,GAAarkC,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,IACxDuB,GAAuB,cAAd+K,IAClBE,GAAarkC,KAAKyD,IAAmB,IAAfoZ,KAAK4c,QAAiC,GAAjB5c,KAAKgb,UAAiB,KAErE,CAGJnvB,EAAE,mBAAmBiK,YAAYzc,SAASwf,eAAe,GAAS2uB,IACpE,MAAO37B,EAAE,iBAAiBhJ,MAAM2U,QAAU,MAC5C,CPLMqwB,GACyB,OAAhBpQ,GQ1BA,WACb5rB,EAAE,WAAW6L,UAAY,GACzB7L,EAAE,WAAWiK,YAAY,GAA2B,YAEpD,MAAMgyB,EAAiBzuC,SAAS4D,cAAc,OAC9C6qC,EAAe1nB,GAAK,mBACA,iBAAhBsX,GACFoQ,EAAe1pC,YAAc,GAASyvB,IACb,eAAhB6J,KACToQ,EAAe1pC,YAAc,GAAS0vB,GAAsB,KAG9DjiB,EAAE,WAAWiK,YAAYgyB,EAC3B,CRcMC,IACyB,QAAhBtQ,IAA0C,QAAhBA,KAA6C,IAApBC,GAAY,KS3B/D,WACb,GAA4F,IAAxF1X,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS4mB,gBAAuB,CAC7F,MAAMjD,EAAal5B,EAAE,mBACrB,IAAIo8B,EACuBA,EAAP,QAAhBxQ,GAA+BC,GAAY,GAClCA,GAGbqN,EAAWjvB,YAAY,GAA2B,0BAClD,MAAMoyB,EAAO7uC,SAAS4D,cAAc,OAEpC,GADAirC,EAAK9nB,GAAK,6BACkB,IAAxBwP,GAAUqY,GAAO,GAAU,CAC7BC,EAAK9pC,YAAc,GAASwxB,GAAUqY,GAAO,IAC7C,MAAM/C,EAAW/hC,KAAKC,MAAOwsB,GAAUqY,GAAO,GAAKjoB,KAAKgb,UAAa,KACjEhG,OAAOC,SAASiQ,IAA0B,IAAbA,EAC/BgD,EAAK9pC,aAAe,KAAK8mC,EAAW,kBAEpCgD,EAAK9pC,aAAe,OAClB4hB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgU,eAChE,IACA,mBAGV,MAAO8S,EAAK9pC,YAAc,mBAC1B2mC,EAAWjvB,YAAYoyB,GAEvBnD,EAAWjvB,YAAY,GAA2B,0BAClD,MAAMqyB,EAAO9uC,SAAS4D,cAAc,OAEpC,GADAkrC,EAAK/nB,GAAK,6BACkB,IAAxBwP,GAAUqY,GAAO,GAAU,CAC7BE,EAAK/pC,YAAc,GAASwxB,GAAUqY,GAAO,IAC7C,MAAM/C,EAAW/hC,KAAKC,MAAOwsB,GAAUqY,GAAO,GAAKjoB,KAAKgb,UAAa,KACjEhG,OAAOC,SAASiQ,IAA0B,IAAbA,EAC/BiD,EAAK/pC,aAAe,KAAK8mC,EAAW,kBAEpCiD,EAAK/pC,aAAe,OAClB4hB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgU,eAChE,IACA,mBAGV,MAAO+S,EAAK/pC,YAAc,mBAC1B2mC,EAAWjvB,YAAYqyB,GAEvBpD,EAAWjvB,YAAY,GAA2B,0BAClD,MAAMsyB,EAAO/uC,SAAS4D,cAAc,OAEpC,GADAmrC,EAAKhoB,GAAK,6BACkB,IAAxBwP,GAAUqY,GAAO,GAAU,CAC7BG,EAAKhqC,YAAc,GAASwxB,GAAUqY,GAAO,IAC7C,MAAM/C,EAAW/hC,KAAKC,MAAOwsB,GAAUqY,GAAO,GAAKjoB,KAAKgb,UAAa,KACjEhG,OAAOC,SAASiQ,IAA0B,IAAbA,EAC/BkD,EAAKhqC,aAAe,KAAK8mC,EAAW,kBAEpCkD,EAAKhqC,aAAe,OAClB4hB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASgU,eAChE,IACA,mBAGV,MAAOgT,EAAKhqC,YAAc,mBAC1B2mC,EAAWjvB,YAAYsyB,GAEvBv8B,EAAE,iBAAiBiK,YAAYivB,EACjC,MAAOl5B,EAAE,iBAAiBhJ,MAAM2U,QAAU,MAC5C,CTpCM6wB,GUzBS,WACb,GAAoB,MAAhB5Q,IAAuC,MAAhBA,GAAqB,CACgB,OAA1Dp+B,SAASkrB,eAAe,gCAC1B1Y,EAAE,iBAAiBiK,YtB+BlB,WACL,MAAMwyB,EAAcjvC,SAAS4D,cAAc,OAC3CqrC,EAAYzlC,MAAM8H,SAAW,WAC7B29B,EAAYzlC,MAAM2U,QAAU,QAC5B8wB,EAAYzlC,MAAMmC,KAAO,OACzBsjC,EAAYzlC,MAAMwV,OAAS,OAC3BiwB,EAAYloB,GAAK,6BAEjB,MAAMmoB,EAAS,SAAUC,EAAOnQ,EAAQoQ,EAAgBC,EAAeC,GACrE,MAAM10B,EAAM5a,SAAS4D,cAAc,OACnCgX,EAAImM,GAAKooB,EACTv0B,EAAIpR,MAAM2U,QAAU,OACpBvD,EAAIpR,MAAM+lC,WAAa,wBACvB30B,EAAIzY,UnBlDuB,WmBkDO68B,EAClCpkB,EAAIpR,MAAMqK,QAAU,MACpB+G,EAAIpR,MAAMqB,WAAa,8BACvB,MAAM2kC,EAAWxvC,SAAS4D,cAAc,OACxCgX,EAAI6B,YAAY+yB,GAChB,MAAMC,EAAYzvC,SAAS4D,cAAc,QACzC6rC,EAAUttC,UAAYm6B,GAAgB0C,EACtCyQ,EAAUjmC,MAAMw9B,WAAa,OAC7ByI,EAAU1qC,YAAcqqC,EACxBI,EAAS/yB,YAAYgzB,GACrBD,EAAS/yB,YAAYzc,SAASwf,eAAe6vB,IAC7C,MAAMK,EAAa1vC,SAAS4D,cAAc,OAC1CgX,EAAI6B,YAAYizB,GAChB,MAAMC,EAAc3vC,SAAS4D,cAAc,QAI3C,OAHA+rC,EAAY5oB,GAAKuoB,EACjBI,EAAWjzB,YAAYzc,SAASwf,eAAe,cAC/CkwB,EAAWjzB,YAAYkzB,GAChB/0B,CACT,EA8DA,OA5DAq0B,EAAYxyB,YACVyyB,EACE,yBACAtS,GACA,YACA,uFACA,+BAGJqS,EAAY1qC,WAAWiF,MAAM29B,aAAe,MAC5C8H,EAAYxyB,YACVyyB,EACE,+BACAxS,GACA,YACA,gGACA,qCAGJuS,EAAYnM,UAAUt5B,MAAM29B,aAAe,MAC3C8H,EAAYxyB,YACVyyB,EACE,2BACArS,GACA,YACA,oGACA,iCAGJoS,EAAYnM,UAAUt5B,MAAM29B,aAAe,MAC3C8H,EAAYxyB,YACVyyB,EACE,iCACArS,GACA,YACA,6GACA,uCAGJoS,EAAYnM,UAAUt5B,MAAM29B,aAAe,MAC3C8H,EAAYxyB,YACVyyB,EACE,2BACArS,GACA,YACA,qJACA,iCAGJoS,EAAYnM,UAAUt5B,MAAM29B,aAAe,MAC3C8H,EAAYxyB,YACVyyB,EACE,wBACAtS,GACA,YACA,2EAA2EjW,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6nB,8BAC/I,8BAIGX,CACT,CsB7HqC,IAC/B1D,MAGsF,IAApF5kB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASyjB,YACtEh5B,EAAE,8BAA8BhJ,MAAM2a,MAAQ,MAC3C3R,EAAE,8BAA8BhJ,MAAMoC,IAAM,GAAG4G,EAAE,WAAWvG,iBAEjEuG,EAAE,8BAA8BhJ,MAAMgG,MAAWgD,EAAE,WAAWxG,YAAc,EAA9B,KAE9C,MAAM8sB,EAASnS,KAAK4c,QAAUzB,KAAuB5D,GAC/C2R,EAAkBlpB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAChF+nB,YACC3R,GACA,EACJ,IAAI4R,EAAa9c,GACjB,GAAwF,IAApFtM,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS+nB,YAAmB,CACzF,IAAIE,EAAc7R,GAClB6R,GAAevI,KACfsI,GAA6B,GAAdC,EAAmB,GAAM,GAC1C,CAWA,GAT0F,IAAtFrpB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkoB,eAClEnX,EAASiX,IAA+B,MAAhB3R,IAAwC,IAAjBzX,KAAKkY,UACtDrsB,EAAE,0BAA0BhJ,MAAM2U,QAAU,GAC5C3L,EAAE,8BAA8BzN,YAAc,GAAG,GAC/CgrC,EAAajX,OACToI,IAAY6O,EAAajX,IAAW0I,KAAWqO,QAElDr9B,EAAE,0BAA0BhJ,MAAM2U,QAAU,OAG2C,IAA5FwI,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmoB,oBACpE,CACA,MAAMC,EAAgC,EAAbJ,EACrBjX,EAASqX,IAAqC,MAAhB/R,IAAwC,IAAjBzX,KAAKkY,UAC5DrsB,EAAE,gCAAgChJ,MAAM2U,QAAU,GAClD3L,EAAE,oCAAoCzN,YAAc,GAAG,GACrDorC,EAAmBrX,OACfoI,IAAYiP,EAAmBrX,IAAW0I,KAAWqO,QACtDr9B,EAAE,gCAAgChJ,MAAM2U,QAAU,MAC3D,MAAO3L,EAAE,gCAAgChJ,MAAM2U,QAAU,OAEzD,GAA4F,IAAxFwI,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASqoB,gBAAuB,CAC7F,MAAMC,EAA4B,EAAbN,EACjBjX,EAASuX,IAAiC,MAAhBjS,IAAwC,IAAjBzX,KAAKkY,UACxDrsB,EAAE,4BAA4BhJ,MAAM2U,QAAU,GAC9C3L,EAAE,gCAAgCzN,YAAc,GAAG,GACjDsrC,EAAevX,OACXoI,IAAYmP,EAAevX,IAAW0I,KAAWqO,QAClDr9B,EAAE,4BAA4BhJ,MAAM2U,QAAU,MACvD,MAAO3L,EAAE,4BAA4BhJ,MAAM2U,QAAU,OAErD,GAEE,IADAwI,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASuoB,sBAEpE,CACA,MAAMC,EAAkC,EAAbR,EAAiB,EACxCjX,EAASyX,IAAuC,MAAhBnS,IAAwC,IAAjBzX,KAAKkY,UAC9DrsB,EAAE,kCAAkChJ,MAAM2U,QAAU,GACpD3L,EAAE,sCAAsCzN,YAAc,GAAG,GACvDwrC,EAAqBzX,OACjBoI,IAAYqP,EAAqBzX,IAAW0I,KAAWqO,QACxDr9B,EAAE,kCAAkChJ,MAAM2U,QAAU,MAC7D,MAAO3L,EAAE,kCAAkChJ,MAAM2U,QAAU,OAG+B,IAAxFwI,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASyoB,iBACpE7pB,KAAKoR,QAAQ,gBAAgBS,gBAEzB/E,IAAgBqF,EAASrF,KAAiC,MAAhB2K,IAAwC,IAAjBzX,KAAKkY,UACxErsB,EAAE,4BAA4BhJ,MAAM2U,QAAU,GAC9C3L,EAAE,gCAAgCzN,YAAc,GAAG,GACjD0uB,GAAeqF,OACXoI,IAAYzN,GAAeqF,IAAW0I,KAAWqO,QAEpDr9B,EAAE,4BAA4BhJ,MAAM2U,QAAU,OAEjDwI,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6nB,aAAe,GAEnF9W,EACEnS,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6nB,aAClEpO,OACa,MAAhBpD,IAAwC,IAAjBzX,KAAKkY,UAE7BrsB,EAAE,yBAAyBhJ,MAAM2U,QAAU,GAE3C3L,EACE,yBACA0U,SAAS,GAAGniB,YAAc,2EAA2E4hB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6nB,8BAC3Kp9B,EAAE,6BAA6BzN,YAAc,GAAG,GAC9C4hB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6nB,aAClEpO,KACA1I,OACEoI,IACHva,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS6nB,aACnEpO,KACA1I,IACC0I,KAAWqO,QAGbr9B,EAAE,yBAAyBhJ,MAAM2U,QAAU,MACpD,MAA+C,OAApC3L,EAAE,+BACXA,EAAE,8BAA8B3J,QAEpC,CVjFI4nC,EACF,MAAkC,OAAvBj+B,EAAE,kBAE6B,OAApCA,EAAE,+BACJA,EAAE,8BAA8B3J,QAGtC,CWjCe,SAAS6nC,KAEtB,GACE/pB,KAAKgqB,MAAMC,UACXjqB,KAAKkqB,MAAQ,IAAO,GACJ,UAAhBlqB,KAAKwD,QACLxD,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS+oB,MACpE,CACA,MAAMvO,EAAQviC,SAASkrB,eAAe,wBAClCqX,IACFA,EAAMhV,UAAY5G,KAAKoqB,QAAmB,GAAXpqB,KAAKwB,IAAYxB,KAAKqqB,GAAgB,GAAXrqB,KAAKwB,KAAY,GAE/E,CAGAwW,KACAmB,KACAN,KCwBK,WACL,GAAqF,IAAjF7Y,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS8b,SAAgB,CAEtF,MAAMoN,EAAiBz+B,EAAE,cAAcxG,YAAc,IAE/CklC,EAAiB1+B,EAAE,cAAcxG,YAAc,IACrD,IAAImlC,EAAiB,EAErB,GACExqB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASqpB,kBACpEzqB,KAAKgqB,MAAMC,SACX,CACA,MAAMS,GACQ,GAAX1qB,KAAKwB,KAAYxB,KAAK2qB,SAAW,EAAI3qB,KAAKqqB,GAAgB,GAAXrqB,KAAKwB,OAAcxB,KAAKwB,IAC1E3V,EAAE,sBAAsBhJ,MAAM2U,QAAU,GACxC3L,EAAE,yBAAyBhJ,MAAMgG,MAAQ,GAAG1F,KAAKC,MAC9CsnC,GACEH,EAAqE,EAApDpnC,KAAKiL,KAAKs8B,GAAsBrnC,WAAWrI,QAC7D,QAGFglB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwpB,iBAAmB,EAEvF/+B,EAAE,yBAAyBzN,YAAc+E,KAAKiL,KAAKs8B,GAC9C7+B,EAAE,yBAAyBzN,YAAc,GAChDyN,EAAE,0BAA0BzN,YAAc+E,KAAKiL,KAAKs8B,GACpDF,GAAkB,CACpB,MAAO3+B,EAAE,sBAAsBhJ,MAAM2U,QAAU,OAG/C,GAAyC,IAArCwI,KAAKwiB,aAAaC,OAAOoI,SAAkB7qB,KAAK8qB,IAAI,uBA+CjDj/B,EAAE,gBAAgBhJ,MAAM2U,QAAU,WA/CuC,CAC9E3L,EAAE,gBAAgBhJ,MAAM2U,QAAU,GAClC3L,EAAE,sBAAsBhJ,MAAMgG,MAAQ,GAAG1F,KAAKC,MAC3CD,KAAK2D,IAAI,EAAGkZ,KAAKwiB,aAAaC,OAAOsI,QAAU/qB,KAAKwiB,aAAaC,OAAOjI,MACvE8P,EACAtqB,KAAKwiB,aAAaC,OAAOuI,aAEzBhrB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwpB,iBAAmB,EACzF/+B,EAAE,sBAAsBzN,YAAc+E,KAAKiL,MACxC4R,KAAKwiB,aAAaC,OAAOsI,QAAU/qB,KAAKwiB,aAAaC,OAAOjI,MAAQxa,KAAKwB,KAEzE3V,EAAE,sBAAsBzN,YAAc,GACvC4hB,KAAKwiB,aAAaC,OAAOsI,UAAY/qB,KAAKwiB,aAAaC,OAAOuI,SAChEn/B,EAAE,sBAAsBhJ,MAAM64B,qBAAuB,OACrD7vB,EAAE,sBAAsBhJ,MAAM84B,wBAA0B,SAExD9vB,EAAE,sBAAsBhJ,MAAM64B,qBAAuB,GACrD7vB,EAAE,sBAAsBhJ,MAAM84B,wBAA0B,IAE1D9vB,EAAE,mBAAmBhJ,MAAMgG,MAAQ,GAAG1F,KAAKC,MACxCD,KAAKyD,IACJoZ,KAAKwiB,aAAaC,OAAOuI,QAAUhrB,KAAKwiB,aAAaC,OAAOsI,QAC5D/qB,KAAKwiB,aAAaC,OAAOuI,QAAUhrB,KAAKwiB,aAAaC,OAAOjI,MAE5D8P,EACAtqB,KAAKwiB,aAAaC,OAAOuI,aAEzBhrB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwpB,iBAAmB,EACzF/+B,EAAE,mBAAmBzN,YAAc+E,KAAKiL,KACtCjL,KAAKyD,IACHoZ,KAAKwiB,aAAaC,OAAOuI,QAAUhrB,KAAKwiB,aAAaC,OAAOsI,QAC5D/qB,KAAKwiB,aAAaC,OAAOuI,QAAUhrB,KAAKwiB,aAAaC,OAAOjI,MAC1Dxa,KAAKwB,KAER3V,EAAE,mBAAmBzN,YAAc,GACxC,MAAM6sC,EACJ9nC,KAAK2D,IACH,GACCkZ,KAAKwiB,aAAaC,OAAOjI,KAAOxa,KAAKwiB,aAAaC,OAAOsI,UACvD/qB,KAAKwiB,aAAaC,OAAOuI,QAAUhrB,KAAKwiB,aAAaC,OAAOsI,WAC5D,EACPl/B,EAAE,oBAAoBzN,YAAc,GAAG+E,KAAKiL,MACzC4R,KAAKwiB,aAAaC,OAAOuI,QAAUhrB,KAAKwiB,aAAaC,OAAOjI,MAAQxa,KAAKwB,QACvEypB,EAAgB,IAAO,IAAM,KAAKA,EAAc5V,eAAe,KAAM,CACxExyB,MAAO,cAET2nC,GAAkB,CACpB,CAGA,GAAoB,cAAhBxqB,KAAKkrB,QAAiE,IAAvClrB,KAAKwiB,aAAa2I,SAASN,QAAe,CAC3Eh/B,EAAE,iBAAiBhJ,MAAM2U,QAAU,GACnC3L,EAAE,uBAAuBhJ,MAAMgG,MAAQ,GAAG1F,KAAKC,MAC5CD,KAAK2D,IAAI,EAAGkZ,KAAKwiB,aAAa2I,SAASJ,QAAU/qB,KAAKwiB,aAAa2I,SAAS3Q,MAC3E8P,EACAtqB,KAAKwiB,aAAa2I,SAASH,aAE3BhrB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwpB,iBAAmB,EACzF/+B,EAAE,uBAAuBzN,YAAc+E,KAAKiL,MACzC4R,KAAKwiB,aAAa2I,SAASJ,QAAU/qB,KAAKwiB,aAAa2I,SAAS3Q,MAAQxa,KAAKwB,KAE7E3V,EAAE,uBAAuBzN,YAAc,GAC5CyN,EAAE,oBAAoBhJ,MAAMgG,MAAQ,GAAG1F,KAAKC,MACzCD,KAAKyD,IACJoZ,KAAKwiB,aAAa2I,SAASH,QAAUhrB,KAAKwiB,aAAa2I,SAASJ,QAChE/qB,KAAKwiB,aAAa2I,SAASH,QAAUhrB,KAAKwiB,aAAa2I,SAAS3Q,MAEhE8P,EACAtqB,KAAKwiB,aAAa2I,SAASH,aAE3BhrB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwpB,iBAAmB,EACzF/+B,EAAE,oBAAoBzN,YAAc+E,KAAKiL,KACvCjL,KAAKyD,IACHoZ,KAAKwiB,aAAa2I,SAASH,QAAUhrB,KAAKwiB,aAAa2I,SAASJ,QAChE/qB,KAAKwiB,aAAa2I,SAASH,QAAUhrB,KAAKwiB,aAAa2I,SAAS3Q,MAC9Dxa,KAAKwB,KAER3V,EAAE,oBAAoBzN,YAAc,GACzC,MAAM6sC,EACJ9nC,KAAK2D,IACH,GACCkZ,KAAKwiB,aAAa2I,SAAS3Q,KAAOxa,KAAKwiB,aAAa2I,SAASJ,UAC3D/qB,KAAKwiB,aAAa2I,SAASH,QAAUhrB,KAAKwiB,aAAa2I,SAASJ,WAChE,EACPl/B,EAAE,qBAAqBzN,YAAc,GAAG+E,KAAKiL,MAC1C4R,KAAKwiB,aAAa2I,SAASH,QAAUhrB,KAAKwiB,aAAa2I,SAAS3Q,MAAQxa,KAAKwB,QAC3EypB,EAAgB,IAAO,IAAM,KAAKA,EAAc5V,eAAe,KAAM,CACxExyB,MAAO,cAET2nC,GAAkB,CACpB,MACE3+B,EAAE,iBAAiBhJ,MAAM2U,QAAU,OAIrC,MAAM4zB,EAAgB,CAAC,EACvBv/B,EAAE,wBAAwB6L,UAAY,GACtCnZ,OAAO6C,KAAK4e,KAAK+gB,OAAO5gB,SAASplB,IAC/B,GAAIilB,KAAK+gB,MAAMhmC,GAAI,CACjB,MAAM6gC,EAAQR,GAAYpb,KAAK+gB,MAAMhmC,GAAGuE,KAAM0gB,KAAK+gB,MAAMhmC,GAAGuE,KAAM,CAChE,CAAE8gB,GAAI,GAAGJ,KAAK+gB,MAAMhmC,GAAGuE,aAEzBs8B,EAAM/4B,MAAM2U,QAAU,GACtB,IAAI6zB,EAAc,GAGhBA,OAD6C,IAApClU,GAAYnX,KAAK+gB,MAAMhmC,GAAGuE,MACrB63B,GAAYnX,KAAK+gB,MAAMhmC,GAAGuE,MACrB42B,GACrB0F,EAAMO,UAAU5b,SAAS,GAAG/kB,UAAYo6B,GAAgByV,EACxDzP,EAAMO,UAAU5b,SAAS,GAAG1d,MAAMyF,MAAQ,QAEgD,IAAxF0X,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwpB,gBAEpEhP,EAAMO,UAAU5b,SAAS,GAAGniB,YAAc,GAAG+E,KAAKC,MACzC4c,KAAK+gB,MAAMhmC,GAAGy/B,KAAOxa,KAAK+gB,MAAMhmC,GAAGiwC,QAA1C,QAECpP,EAAMO,UAAU5b,SAAS,GAAGniB,YAAc,GAC/Cw9B,EAAMO,UAAU5b,SAAS,GAAG1d,MAAMgG,MAAQ,GAAG1F,KAAKC,MAC/C4c,KAAK+gB,MAAMhmC,GAAGy/B,MACZ+P,EAA8E,EAA7DpnC,KAAKiL,KAAK4R,KAAK+gB,MAAMhmC,GAAGy/B,KAAOxa,KAAKwB,KAAKne,WAAWrI,QACtEglB,KAAK+gB,MAAMhmC,GAAGiwC,aAElBpP,EAAMO,UAAU5b,SAAS,GAAGniB,YAAc+E,KAAKiL,KAAK4R,KAAK+gB,MAAMhmC,GAAGy/B,KAAOxa,KAAKwB,KAC9EgpB,GAAkB,EAClBY,EAAcprB,KAAK+gB,MAAMhmC,GAAGuE,MAAQs8B,CACtC,KAEFr9B,OAAO6C,KAAKgqC,GAAejrB,SAASplB,IAClC8Q,EAAE,wBAAwBiK,YAAYs1B,EAAcrwC,GAAG,IAGlC,IAAnByvC,IACF3+B,EAAE,cAAchJ,MAAMiG,OAA6B,GAAjB0hC,EAAsB,EAAzB,MAE7B3S,KAAuB2S,IACzB3S,GAAqB2S,EACrBvN,KAEJ,CACF,CD9LEqO,GAGAjP,KAGAyI,KE3BK,WACL,GACuF,IAArF9kB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmqB,cAC5C,IAAxB7U,GACA,CAEA,IAAI8U,GAAiB,EACrBjtC,OAAO6C,KAAK4e,KAAKkb,WAAW/a,SAASplB,IACnC,MAAM8+B,EAAK7Z,KAAKkb,UAAUngC,GAC1B,GAAI8+B,EAAG4R,MAAQ,GAAK5R,EAAG6R,UAErB,GADAF,GAAiB,EACoB,IAAjC5U,GAA0B77B,SAA6CI,IAAjCy7B,GAA0B77B,GAAkB,CACpF,MAAM4wC,EAActyC,SAAS4D,cAAc,OACrC2uC,EAAWvyC,SAAS4D,cAAc,OACxC2uC,EAAS/oC,MAAMgpC,SAAW,QAC1BD,EAAS/oC,MAAM29B,aAAe,MAC9B,MAAMja,EAAMltB,SAAS4D,cAAc,OACnCspB,EAAI1jB,MAAM6V,UAAY,SACtB6N,EAAInG,GAAK,oBACTwrB,EAAS91B,YAAYyQ,GACrBolB,EAAY71B,YAAY81B,GACxB5rB,KAAKiH,QAAQhV,KAAKxY,KAAM4oB,OAAOspB,EAAYj0B,YAC3Cif,GAAkB57B,EAClB67B,GAA0B77B,GAAK,CACjC,OAEA67B,GAA0B77B,GAAK,CACjC,IAEGywC,GACHxrB,KAAKiH,QAAQxV,MAEjB,CACF,CFHEq6B,GEUK,WACL,GACuF,IAArF9rB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmqB,cACzC,OAA3B1/B,EAAE,qBACF,CACA,IAAI,OAAEkgC,GAAW/rB,KAAKkb,UAAUvE,IAC5BqV,EAAS,IAKb,GAJIhsB,KAAK8qB,IAAI,6BAA4BkB,GAAU,MACN,IAAzChsB,KAAKkb,UAAUvE,IAAiBv7B,OAAY4wC,GAAU,GAC1DD,GAAUC,EACNhsB,KAAK8qB,IAAI,mBAAkBiB,GAAU,MACrClc,GAAWqB,OAAOW,eAAgB,CACpC,MAAMC,EAAS9R,KAAKiR,OAAO,SACZ,IAAXa,EAAcia,GAAU,KACR,IAAXja,EAAcia,GAAU,IACb,IAAXja,IAAcia,GAAU,KACnC,CACAlgC,EAAE,qBAAqBzN,YAAc,GAAS2tC,EAChD,CACF,CF5BEE,GGtCEjsB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS8qB,SACpD,UAAhBlsB,KAAKwD,SACJxD,KAAKkqB,MAAQ,IAAiB,EAAXlqB,KAAKwB,MAAa,IACrCxB,KAAKkqB,MAAQ,GAAKlqB,KAAKwB,KAAQ,GAEhCxB,KAAKiE,aHuCPyF,GACF,CIjDe,SAASyiB,KAEtBriB,EAA8BsiB,UAAUpsB,KAAKqsB,iBAC/C,CCYO,MAAMC,GACX3sB,YAAY4sB,GACV9yC,KAAK8yC,UAAYA,EACjB9yC,KAAK+yC,MAAQ,EACf,CAEAJ,UAAUK,GACJhzC,KAAK+yC,MAAM3vC,KAAK4vC,GAAYhzC,KAAK8yC,WACnC9yC,KAAK+yC,MAAM9tB,OAEf,CAOAguB,YAAYC,GACV,IAAInS,EAAOmS,EACPnS,EAAO/gC,KAAK8yC,YAAW/R,EAAO/gC,KAAK8yC,WACnC/R,EAAO/gC,KAAK+yC,MAAMxxC,SAAQw/B,EAAO/gC,KAAK+yC,MAAMxxC,QAChD,IAAIqM,EAAM,EACV,IAAK,IAAItM,EAAItB,KAAK+yC,MAAMxxC,OAAS,EAAGD,GAAK,GAAKA,EAAItB,KAAK+yC,MAAMxxC,OAAS,EAAIw/B,EAAMz/B,IAC9EsM,GAAO5N,KAAK+yC,MAAMzxC,GAEpB,OAAY,IAARsM,EACK,EAEFA,EAAMmzB,CACf,CAEAoS,QAAQD,GACN,IAAInS,EAAOmS,EAGX,OAFInS,EAAO/gC,KAAK8yC,YAAW/R,EAAO/gC,KAAK8yC,WACnC/R,EAAO/gC,KAAK+yC,MAAMxxC,SAAQw/B,EAAO/gC,KAAK+yC,MAAMxxC,QACnC,IAATw/B,EAAmB,EAChB/gC,KAAK+yC,MAAMzuB,OAAOyc,GAAMqS,QAAO,CAACppC,EAAGP,IAAMO,EAAIP,GAAG,EACzD,EChDa,SAAS4pC,GAAaC,GAC7B,UAAWvzC,OAAOwzC,oBACtBxzC,OAAOwzC,kBAAkBC,MAAQ,CAAC,GAGpC1uC,OAAO6C,KAAK2rC,GAAQ5sB,SAAS7gB,IAC3B,MAAM4tC,EAAa5tC,EAAKkC,QAAQ,SAAU,SAEd,IAAjBurC,EAAOztC,GAChB9F,OAAOwzC,kBAAkBC,MAAMC,QAAc/xC,EAG7C3B,OAAOwzC,kBAAkBC,MAAMC,GAAc9wC,KAAKC,MAAMD,KAAKulB,UAAUorB,EAAOztC,IAChF,GAEJ,CCce,SAAS6tC,KACtB,MAAMC,EAAWjqC,KAAKgE,MAAMmtB,KAAKC,MAAQ,KAEzC,GAAKvU,KAAKqqB,EAAIrqB,KAAKwB,IAAO,GAAM,EAAG,CACjC,IAAI6rB,EAAcrtB,KAAK4c,QAAUjN,GAC7B3P,KAAKib,UAAY,IAAGoS,GAAezf,IACvCsB,GAAyB/rB,KAAK2D,IAAIkZ,KAAKstB,cAAeD,GACtDA,GAAe,IAGf,MAAME,EAAWH,EAAW/iB,EACtBmjB,EAAcrqC,KAAK2D,IAAI,EAAGkZ,KAAK4c,QAAUtS,GAAoBijB,EAC7DE,EAAetqC,KAAK2D,IAAI,EAAG8mB,GAAsBrD,GAAyBgjB,EAC1EG,EACJvqC,KAAK2D,IAAI,EAAGgnB,GAAsB,GAAKtD,GAAgC+iB,EACnEI,EAAgBxqC,KAAK2D,IAAI,EAAGumC,EAAc9f,IAAmBggB,EAC7DK,GAAiB5tB,KAAK6tB,aAAepjB,GAAmB8iB,EAC9D,IAAK,IAAIxyC,EAAI,EAAGA,EAAIwyC,EAAUxyC,IAC5BgvB,EAAYqiB,UAAUoB,GACtBxjB,EAAUoiB,UAAUqB,GACpBxjB,EAAiBmiB,UAAUsB,GAC3BxjB,EAAWkiB,UAAUuB,GACrBxjB,EAAWiiB,UAAUwB,GAIvBvjB,EAAoB+iB,EACpB9iB,EAAmBtK,KAAK4c,QACxBrS,EAAwBqD,GACxBpD,EAA+BsD,GAAsB,GACrDP,GAAkB8f,EAClB5iB,EAAkBzK,KAAK6tB,aAGvB,MAAMC,EACJ7W,GAAYjX,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2sB,YAClFrjB,EAAuBX,EAAY2iB,YAAYoB,GAC/CnjB,EAAwBX,EAAU0iB,YAAYoB,GAC9CljB,EAA+BX,EAAiByiB,YAAYoB,GAC5DjjB,EAAyBX,EAAWwiB,YAAYoB,GAChDhjB,EAAkBJ,EACoE,IAAlF1K,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,YACtEjQ,GAAmBH,GACiE,IAAlF3K,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,YACtEjQ,GAAmBF,GAErB,MAAMojB,EAAShuB,KAAKiuB,YAAY,mBAAqBjuB,KAAK8qB,IAAI,iBAM5D3b,GAHA6e,GACkF,IAAlFhuB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,UAGlErQ,EAAuBC,GAAyBqjB,EAASnjB,EAAyB,GACvDC,EAG/BoD,GAAqB/D,EAAWuiB,YAC9BxV,GAAWlX,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS8sB,eAEnF,CAEApB,GAAa,CACX5d,uBAAsB,GACtB7E,kBAAiB,EACjBC,iBAAgB,EAChBC,sBAAqB,EACrBC,6BAA4B,EAC5B+C,gBAAe,GACf9C,gBAAe,EACfC,qBAAoB,EACpBC,sBAAqB,EACrBC,6BAA4B,EAC5BC,uBAAsB,EACtBC,gBAAe,EACfqE,sBAAqB,GACrBjB,mBAAkB,IAEtB,CCxGe,SAASigB,GAAiBnc,EAAOC,EAAW/nB,EAAOgoB,EAAMgT,GACtE,IAAIkJ,EAAe,EACnB,IAAK,IAAIrzC,EAAIoI,KAAK2D,IAAI,EAAGoD,GAAQnP,EAAIoI,KAAK2D,IAAI,EAAGoD,EAAQg7B,GAAWnqC,IAClEqzC,GAAgBpuB,KAAK0S,eAAiBvvB,KAAK2D,IAAI,EAAG/L,EAAIm3B,GAExD,IAAIT,EAAQQ,EAAYmc,EAExB,OADA3c,EAAQzR,KAAK2S,oBAAoB3S,KAAKoR,QAAQY,GAAQP,GAC/CtuB,KAAKiL,KAAKqjB,EACnB,CCEA,SAAS4c,GAAYjuC,EAAQ+xB,GAC3B5zB,OAAO6C,KAAKhB,GAAQ+f,SAASplB,IAC3B,GACEilB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASktB,eACzD,IAAXnc,EAEA/xB,EAAOrF,GAAGs9B,OAASlC,OAJrB,CAQA/1B,EAAOrF,GAAGs9B,OAASsI,GACjBvgC,EAAOrF,GACPozC,GACEpzC,EACAilB,KAAKoR,QAAQr2B,GAAGk3B,UAChBjS,KAAKoR,QAAQr2B,GAAGo3B,OAChBnS,KAAKoR,QAAQr2B,GAAGm3B,KAChBC,IAIJ,IACE,IAAI4H,EAAI,EACRA,EAAI/Z,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmtB,aACxExU,IAEI35B,EAAOrF,GAAGgR,KAAO0jB,GAAasK,GAAG,KAAI35B,EAAOrF,GAAGs9B,OAASlC,GAlB9D,CAmBA,GAEJ,CAEA,SAASqY,GAAQpuC,EAAQ+xB,GACvB5zB,OAAO6C,KAAKhB,GAAQ+f,SAASplB,IAC3B,MAAM02B,EAAQ0c,GACZpzC,EACAilB,KAAKoR,QAAQr2B,GAAGk3B,UAChBjS,KAAKoR,QAAQr2B,GAAGo3B,OAChBnS,KAAKoR,QAAQr2B,GAAGm3B,KAChBC,GAEEnS,KAAKgb,UACP56B,EAAOrF,GAAGgR,GACR5I,KAAK2D,IAAI2qB,GAASzR,KAAK4c,QAAUzB,MAAuB,GAAKnb,KAAKgb,UAClEvJ,EAAQrxB,EAAOrF,GAAGihC,MACf57B,EAAOrF,GAAGgR,GAAK0lB,EAAQrxB,EAAOrF,GAAGihC,MAGpChc,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASktB,eACzD,IAAXnc,GAGF1C,GAAa5yB,KAAK,CAACuD,EAAOrF,GAAGgR,GAAIomB,EAAQV,GAAO,GAEtD,CC7De,SAAS,MDmET,WACblC,GAAasF,IACbpF,GAAe,QAGb,IADOzP,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmtB,eAG3EvuB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmtB,aAAe,GAGrFC,GAAQhhB,GAAe,GACvBghB,GAAQ/gB,GAAgB,IACxB+gB,GAAQ9gB,GAAiB,KAGzB+B,GAAa+I,MAAK,CAAC/0B,EAAGP,IAAMO,EAAE,GAAKP,EAAE,KACrC,IAAIurC,EAAazuB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmtB,aACrF,GAAIvuB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASyf,sBACtE,KAAOpR,GAAagf,GAAY,GAAKzuB,KAAK4c,UACxC6R,GAAc,EACVhf,GAAaz0B,SAAWyzC,EAAa,KAK7Clf,GAAaE,GAAagf,GAAY,GACtCjf,GAAiBC,GAAagf,GAAY,GAE1CJ,GAAY7gB,GAAe,GAC3B6gB,GAAY5gB,GAAgB,IAC5B4gB,GAAY3gB,GAAiB,KAE7Bof,GAAa,CAAEvd,WAAU,kBAAgB,gBAAc,IACzD,CCnGEmf,GCHAnwC,OAAO6C,KAAK6sB,IAAe9N,SAASplB,IAC9BilB,KAAKgb,UACP/M,GAAclzB,GAAGgR,GACf5I,KAAK2D,IAAIkZ,KAAKuf,SAASxkC,GAAG4qC,YAAc3lB,KAAK4c,QAAUzB,MAAuB,GAC5Enb,KAAKgb,UACPhb,KAAKuf,SAASxkC,GAAG4qC,WAAa1X,GAAclzB,GAAGihC,MAC5C/N,GAAclzB,GAAGgR,GAAKiU,KAAKuf,SAASxkC,GAAG4qC,WAAa1X,GAAclzB,GAAGihC,MACxEhH,OAAOvZ,MAAMwS,GAAclzB,GAAGgR,MAAKkiB,GAAclzB,GAAGgR,GAAK8oB,KAE7D5G,GAAclzB,GAAGs9B,OAASsI,GAAW1S,GAAclzB,GAAIilB,KAAKuf,SAASxkC,GAAG4qC,WAAW,IDJrFnsC,OAAOwzC,kBAAkB2B,SAAWvyC,KAAKC,MAAMD,KAAKulB,UAAU6L,KAC9Dh0B,OAAOwzC,kBAAkB4B,UAAYxyC,KAAKC,MAAMD,KAAKulB,UAAU8L,KAC/Dj0B,OAAOwzC,kBAAkB6B,WAAazyC,KAAKC,MAAMD,KAAKulB,UAAU+L,KAChEl0B,OAAOwzC,kBAAkBzN,SAAW,GACpChhC,OAAOuwC,QAAQ7gB,IAAe9N,SAASplB,IACrCvB,OAAOwzC,kBAAkBzN,SAASxkC,EAAE,IAAMqB,KAAKC,MAAMD,KAAKulB,UAAU5mB,EAAE,IAAI,GAE9E,CE6Fe,SAASg0C,GAAuB3U,GAC7C,GACkC,WAAhCpa,KAAKuf,SAASnF,GAASxJ,MACY,IAAlC5Q,KAAKuf,SAASnF,GAAStJ,QACtB9Q,KAAKuf,SAASnF,GAAS4U,UACS,aAAhChvB,KAAKuf,SAASnF,GAASxJ,KACzB,CACA+O,KACkC,yBAA9B7P,GAAYsK,GAAS96B,KACvBwwB,GAAY,yBAAZ,OAA8C,EACP,uBAA9BA,GAAYsK,GAAS96B,KAC9BwwB,GAAY,uBAAZ,OAA4C,EAE5CA,GAAYsK,GAAStJ,QAAUhB,GAAYsK,GAAStJ,OAAS,GAAK,EAEhE9Q,KAAKivB,qBAAqBjvB,KAAKuf,SAASnF,GAASxJ,QAAOxF,GAAoB,GAEhE,iBAAZgP,GACF/O,IAAc,EACVA,GAAa,GAAG4V,GAAO,aACvB5V,IAAc,GAAG4V,GAAO,kBACP,mBAAZ7G,EACT6G,GAAO,cACc,yBAAZ7G,EACT6G,GAAO,kBACc,iBAAZ7G,GACT6G,GAAO,aAGT,MAAMqD,EAAwBhZ,GAE9B4V,KAEAqC,KAEIe,IAA0BhZ,IAC5B4V,KAGF,MAAMgO,EAnIV,WACE,IAAIntC,EAAM,EACN0uB,GAAO,sBAAqB1uB,GAAO,IACnC0uB,GAAO,qBAAoB1uB,GAAO,GAClC0uB,GAAO,qBAAoB1uB,GAAO,IAClC0uB,GAAO,sBAAqB1uB,GAAO,IACnC0uB,GAAO,yBAAwB1uB,GAAO,IACtC0uB,GAAO,yBAAwB1uB,GAAO,IACtC0uB,GAAO,wBAAuB1uB,GAAO,IACrC0uB,GAAO,wBAAuB1uB,GAAO,IACrC0uB,GAAO,uBAAsB1uB,GAAO,IACpC0uB,GAAO,uBAAsB1uB,GAAO,IACpC0uB,GAAO,uBAAsB1uB,GAAO,IACpC0uB,GAAO,yBAAwB1uB,GAAO,IACtC0uB,GAAO,wBAAuB1uB,GAAO,IACzC,IAAI0yB,EAAM,EACVl2B,OAAO6C,KAAKyuB,IAAY1P,SAASplB,IAC/B05B,GAAO5E,GAAW90B,GAAGo3B,MAAM,IAE7BsC,GAAO5E,GAAWiU,OAAO3R,OACzBpwB,GAAO0yB,EAGHhE,GAAO,mBAAkB1uB,GAAsB,IAAfiqB,IAChCyE,GAAO,gBAAe1uB,GAAsB,IAAfiqB,IAC7ByE,GAAO,oBAAmB1uB,GAAsB,IAAfiqB,IACjCyE,GAAO,sBAAqB1uB,GAAsB,IAAfiqB,IACnCyE,GAAO,uBAAsB1uB,GAAsB,IAAfiqB,IACpCyE,GAAO,mBAAkB1uB,GAAsB,IAAfiqB,IAChCyE,GAAO,qBAAoB1uB,GAAsB,IAAfiqB,IAClCyE,GAAO,sBAAqB1uB,GAAsB,IAAfiqB,IACnCyE,GAAO,sBAAqB1uB,GAAsB,IAAfiqB,IACnCyE,GAAO,qBAAoB1uB,GAAsB,IAAfiqB,IAClCyE,GAAO,yBAAwB1uB,GAAsB,IAAfiqB,IACtCyE,GAAO,sBAAqB1uB,GAAsB,IAAfiqB,IACnCyE,GAAO,sBAAqB1uB,GAAsB,IAAfiqB,IACnCyE,GAAO,qBAAoB1uB,GAAsB,IAAfiqB,IAClCyE,GAAO,qBAAoB1uB,GAAsB,IAAfiqB,IAElCyE,GAAO,kBAAiB1uB,GAAsB,IAAfiqB,IAEnC,IAAI6R,EAAO,EAWX,GAVIpN,GAAO,qBAAoBoN,GAAQ,KACnCpN,GAAO,gBAAeoN,GAAQ,KAC9BpN,GAAO,iBAAgBoN,GAAQ,KAC/BpN,GAAO,iBAAgBoN,GAAQ,MAE/BpN,GAAO,iBACToN,GAAQ,EAAI,IAAO16B,KAAKyD,IAAIoZ,KAAKoR,QAAQ0S,OAAOrE,MAAOhP,GAAO,mBAAqB,GAAK,KAG1FoN,GAAQtN,GAAO,SACXV,GAAWqB,OAAOW,gBAChBb,GAAW,CACb,MAAMc,EAASd,GAAU,SACV,IAAXc,EAAc+L,GAAQ,KACN,IAAX/L,EAAc+L,GAAQ,IACX,IAAX/L,IAAc+L,GAAQ,KACjC,CAGFt/B,OAAO6C,KAAK4e,KAAK+gB,OAAO5gB,SAASplB,SACQ,IAA5BilB,KAAK+gB,MAAMhmC,GAAGo0C,YAA2BtR,GAAQ7d,KAAK+gB,MAAMhmC,GAAGo0C,UAAS,IAIrFtR,GAAQ,EAAmC,IAA/B7N,GAAY,iBAGxB,IAAIof,EACFvR,EACA7d,KAAK8e,WACH,EACArO,GAAO,2BACLA,GAAO,kCACPA,GAAO,gBACT1uB,GAOJ,OAJAqtC,EAAMpvB,KAAKgjB,kBAAkB,kBAAmBoM,GAE5CpvB,KAAK2R,QAAQ,mBAAkByd,EAAMpvB,KAAK+gB,MAAM,iBAAiBvB,OAE9D4P,CACT,CA+CyBC,GAAarvB,KAAKqsB,iBACvC,OAAI6C,EACK,CAACljB,GAAehM,KAAKgb,UAAWkU,GAElC,CAACljB,GAAehM,KAAKgb,UAC9B,CACA,MAAO,EACT,CCxIA,SAASsU,GAAoBnd,GAC3B,MAAMod,EAAS,CAAC,EAQhB,OAPAhxC,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IACjCw0C,EAAOx0C,GAAK,CAAC,EACbw0C,EAAOx0C,GAAGihC,MAAQmI,GAAwBppC,EAAGo3B,GAC9B,IAAXA,IACFlH,EAA2B,EAC7B,IAEKskB,CACT,CA+BO,SAASC,KACdjxC,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IACjCyyB,GAAczyB,GAAG02B,MAAQ0c,GACvBpzC,EACAilB,KAAKoR,QAAQr2B,GAAGk3B,UAChBjS,KAAKoR,QAAQr2B,GAAGo3B,OAChBnS,KAAKoR,QAAQr2B,GAAGm3B,KAChB,GAEFzE,GAAe1yB,GAAG02B,MAAQ0c,GACxBpzC,EACAilB,KAAKoR,QAAQr2B,GAAGk3B,UAChBjS,KAAKoR,QAAQr2B,GAAGo3B,OAChBnS,KAAKoR,QAAQr2B,GAAGm3B,KAChB,IAEFxE,GAAgB3yB,GAAG02B,MAAQ0c,GACzBpzC,EACAilB,KAAKoR,QAAQr2B,GAAGk3B,UAChBjS,KAAKoR,QAAQr2B,GAAGo3B,OAChBnS,KAAKoR,QAAQr2B,GAAGm3B,KAChB,KAEFvE,GAA4B5yB,GAAG02B,MAAQ0c,GACrCpzC,EACAilB,KAAKoR,QAAQr2B,GAAGk3B,UAChBjS,KAAKoR,QAAQr2B,GAAGo3B,OAChBnS,KAAKoR,QAAQr2B,GAAGm3B,KAChBvE,GAA4B5yB,GAAG29B,aAChC,IAGHoU,GAAa,CAAEnf,4BAA2B,IAC5C,CAMO,SAAS8hB,KAEdjiB,GAAgB8hB,GAAoB,GACpC7hB,GAAiB6hB,GAAoB,IACrC5hB,GAAkB4hB,GAAoB,KApExC,WACErhB,GAAgB,CAAC,EACjB,IAAK,IAAIlzB,EAAI,EAAGA,EAAIilB,KAAK4Z,gBAAgB5+B,OAAQD,IAAK,CACpD,MAAMukC,EAActf,KAAK4Z,gBAAgB7+B,GAAGuE,KACtCowC,EAAcX,GAAuBzP,GACvB,iBAAhBA,GACFrR,GAAcqR,GAAe,CAC3BtD,MAAOhc,KAAKgb,UAAYtQ,GAE4D,IAAlF1K,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,UACtE9M,GAAcqR,GAAatD,OAASrR,EACqD,IAAlF3K,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS2Z,YAC3E9M,GAAcqR,GAAatD,OAASpR,GACjCoK,OAAOC,SAAShH,GAAcqR,GAAatD,SAAQ/N,GAAcqR,GAAatD,MAAQ,KAE3F/N,GAAcqR,GAAe,CAAC,EAC1BoQ,EAAY,KAAIzhB,GAAcqR,GAAatD,MAAQ0T,EAAY,IAC/DA,EAAY,KAAIzhB,GAAcqR,GAAasG,WAAa8J,EAAY,IAE5E,CACF,CAmDEC,EACF,CCnFO,SAASC,GAAqBC,EAAOC,EAAWjS,GACrD,IAAIkS,EAAiB,EACjBvd,EAAO,EACPwd,EAAW,EACXC,EAAe,EACfC,EAAQ,EAAI/sC,KAAK2D,IAAI,EAAG3D,KAAKiL,KAAKjL,KAAKuyB,IAAI1V,KAAK4c,SAAWz5B,KAAKgtC,MAAQ,IAC5E,KAAOH,EAAWF,EAAYjS,GAC5BrL,EAAOrvB,KAAK2D,IACV+oC,EACA1sC,KAAKyD,IAAIzD,KAAKgE,MAAO,EAAI,EAAK,IAAM+oC,EAAQL,EAAQhS,GAAOiS,EAAYjS,IAEzEmS,EAAW7sC,KAAK2D,IACd+oC,EACA1sC,KAAKyD,IAAIzD,KAAKgE,MAAO,EAAI,EAAK,KAAO+oC,EAAQ,GAAKL,EAAQhS,GAAOiS,EAAYjS,IAE/EoS,EAAe9sC,KAAKgE,MAAO,EAAI,EAAK,KAAO+oC,EAAQ,GAAKL,EAAQhS,GAChEkS,GAAkBvd,EAClB0d,GAAS,EAEX,MAAO,CAACH,EAAgBvd,EAAMyd,EAChC,CAkBO,SAASG,KACd,IAAIN,EAAyC,GAA7B9iB,GAAkC,GAAK,EAAIC,GAE3D,MAAMojB,EAAcvP,KAChBuP,EAAc,EAAGP,GAAaO,EAC7BP,EAAY,EAEjBthB,GAAsBohB,GAAqB,EAAGE,EAAW5iB,IACzDoB,GAA+C,EAAzBE,GAAoB,GAAUtB,GACpDqB,GAAyBC,GAAoB,GAAK,GAAK,GAAK,EAAIvB,GAEhE0B,GAA2BihB,GAAqB,EAAGE,EAAW3iB,IAC9DsB,GAAyD,EAA9BE,GAAyB,GAAUxB,GAC9DuB,GACEC,GAAyB,GAAK,GAAK,GAAK,EAAI1B,GAE9C6B,GAA4B8gB,GAAqB,EAAe,EAAZE,EAAe5iB,IACnE0B,GAA2D,EAA/BE,GAA0B,GAAU5B,GAChE2B,GACEC,GAA0B,GAAK,GAAK,GAAK,EAAI7B,GAE/CgC,GAAiC2gB,GAAqB,EAAe,EAAZE,EAAe3iB,IACxE4B,GAAqE,EAApCE,GAA+B,GAAU9B,GAC1E6B,GACEC,GAA+B,GAAK,GAAK,GAAK,EAAIhC,GAEpD6f,GAAa,CACXte,oBAAmB,GACnBF,mBAAkB,GAClBC,uBAAsB,GACtBI,yBAAwB,GACxBF,wBAAuB,GACvBC,4BAA2B,GAC3BI,0BAAyB,GACzBF,yBAAwB,GACxBC,6BAA4B,GAC5BI,+BAA8B,GAC9BF,8BAA6B,GAC7BC,kCAAiC,IAErC,CC9Fe,SAASshB,KACtB,MAAMlD,EAAWjqC,KAAKgE,MAAMmtB,KAAKC,MAAQ,KAEzC,GAAKvU,KAAKqqB,EAAIrqB,KAAKwB,IAAO,GAAM,EAAG,CACjC,MAAM+uB,EAAavwB,KAAKwwB,gBAAgBxwB,KAAKywB,cAEvCC,EADiBvtC,KAAKgE,MAAM6Y,KAAKwwB,gBAAgBxwB,KAAKywB,aAAezwB,KAAKstB,gBACxCnqC,KAAKgE,MAAMopC,GAG7ChD,EAAWH,EAAWriB,EACtB4lB,EAAuBxtC,KAAK2D,IAAI,EAAG4pC,EAAiB1lB,GAA0BuiB,EACpF,IAAK,IAAIxyC,EAAI,EAAGA,EAAIwyC,EAAUxyC,IAC5BqvB,EAAkBgiB,UAAUuE,GAI9B5lB,EAAyBqiB,EACzBpiB,EAAyB0lB,EAGzBtjB,GAAmBhD,EAAkBsiB,YAAY,EACnD,CAEAI,GAAa,CAAE/hB,uBAAsB,yBAAwB,mBAAkB,IACjF,CCvBe,SAAS6lB,KACtBziB,GAAuB,GACvBE,GAA8B,GAC9BD,GAA+B,GAC/B,MAAM6V,EAAO,GAEb1lC,OAAO6C,KAAK4e,KAAKuf,UAAUpf,SAASplB,IAClCkpC,EAAKpnC,KAAKmjB,KAAKuf,SAASxkC,GAAG,IAO7BkpC,EAAKzL,MALW,SAAU/0B,EAAGP,GAC3B,OAAIO,EAAE62B,MAAQp3B,EAAEo3B,MAAc,EAC1B72B,EAAE62B,MAAQp3B,EAAEo3B,OAAe,EACxB,CACT,IAGA/7B,OAAO6C,KAAK6iC,GAAM9jB,SAASplB,IACzB,MAAM8+B,EAAKoK,EAAKlpC,GAEhB,GAAkB,IAAd8+B,EAAG/I,OAAc,CACnB,IAAI30B,EAAM,GAEVA,GC+CC,SAAsB09B,GAC3B,IAAIgX,EAAU,wBACE,aAAZhX,EAAGjJ,OAAqBigB,GAAW,aAEvC,IAAIC,EAAU,EACT9wB,KAAKgqB,MAAM+G,SAAQD,EAAU,GAC9BA,IAASD,GAAW,YAExB,IAAI,KAAEG,GAASnX,EACXA,EAAGoX,eAAcD,EAAOnX,EAAGoX,gBAC/B,MAAMhqB,EAAU,0DAA0D4S,EAAGzZ,kBAC7E,MAAO,eAAeywB,SACrB7wB,KAAKkxB,kBAAkBjqB,EAAS,OAAO,kBAC3B+pB,EAAK,GAAK,yBAAyBA,EAAK,OAAS,yBACjD,IAAVA,EAAK,QACS,IAAVA,EAAK,mBAEd,CDhEaG,CAAatX,GAEJ,aAAZA,EAAGjJ,KAAqBxC,IAAgCjyB,EACvC,WAAZ09B,EAAGjJ,KAAmBvC,IAA+BlyB,EACzC,WAAZ09B,EAAGjJ,MAAiC,WAAZiJ,EAAGjJ,MAAiC,UAAZiJ,EAAGjJ,OAC1DzC,IAAwBhyB,EAE5B,IAEJ,CErCe,SAASi1C,KACtB,GAAoB,cAAhBpxB,KAAKkrB,OAAwB,CAC/B,IAAI3tC,EAAuB,GAAjByiB,KAAKgb,UACXhb,KAAK2R,QAAQ,kBAAiBp0B,GAAO,IACrCyiB,KAAK2R,QAAQ,YAAWp0B,GAAO,KACnC+vB,GAAenqB,KAAK2D,IAAI,GAAIvJ,GACxByiB,KAAK8qB,IAAI,gCAA+Bxd,IAAgB,EAC9D,CAEAwf,GAAa,CAAExf,aAAY,IAC7B,CCOO,SAAS+jB,KACd/kB,GAA2C,IAA7BU,GAAoC,IAClDV,IAAcW,GACd,MAAMojB,EAAcvP,KAChBuP,EAAc,EAAG/jB,IAAc+jB,EAC9B/jB,GAAa,EAClBC,GAAmBW,IAAuC,IAAbZ,IAAqB,GAClEE,GAAwBW,IAAsC,IAAbb,IAAqB,GACtEG,GAAgC,EAAbH,GACnBI,GAAyBQ,IAA6C,IAAnBT,IAA2B,GAC9EE,GAA8BQ,IAA4C,IAAnBV,IAA2B,GAClFG,GAA4B,EAAbN,GACfO,GAAoC,IAAfD,GAErBE,GAAe,EACf,IAAIhmB,EAAM,EACN9I,EAAI,EACRO,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IAC7BilB,KAAKoR,QAAQr2B,GAAGo3B,OAASrrB,IAAKA,EAAMkZ,KAAKoR,QAAQr2B,GAAGo3B,QACpDnS,KAAKoR,QAAQr2B,GAAGo3B,OAAS,IAAGn0B,GAAK,EAAC,IAExCO,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,KAE9BilB,KAAKoR,QAAQr2B,GAAGo3B,OAASrrB,GAAa,IAAN9I,IACjCgiB,KAAKoR,QAAQr2B,GAAGo3B,OAAS,KACD,EAAxBnS,KAAKoR,QAAQr2B,GAAG02B,MAAY3E,KAE5BA,GAAuC,EAAxB9M,KAAKoR,QAAQr2B,GAAG02B,MAC/B1E,GAAuBhyB,EACzB,IAGF+xC,GAAa,CACXxgB,WAAU,GACVC,iBAAgB,GAChBC,sBAAqB,GACrBC,iBAAgB,GAChBC,uBAAsB,GACtBC,4BAA2B,GAC3BC,aAAY,GACZC,mBAAkB,GAClBC,aAAY,GACZC,qBAAoB,IAExB,CAKO,SAASukB,KACd,IAAIC,EAAa,EACbC,EAAY,EACZ3T,EAAO,EAGPpN,GAAO,4BAA2BoN,GAAQ,MAC1CpN,GAAO,iBAAgBoN,GAAQ,MAEnC0T,GAAc,EAA+C,GAA3CvxB,KAAK0iB,SAAS,2BAChC6O,GAAcvxB,KAAKyxB,IAAI,oBACvBD,GAAa,EAAuC,GAAnCxxB,KAAK0iB,SAAS,mBAC/B8O,GAAaxxB,KAAKyxB,IAAI,mBAGtBvkB,GAAyB2Q,EAAO0T,EAChCpkB,GAAwB0Q,EAAO2T,EAM/BvkB,GAAoC,EACD,IAA/BjN,KAAKwiB,aAAaC,OAAOzkC,IAC3BivB,IAAqC,EAAwC,KAApCjN,KAAK0iB,SAAS,qBAGzDoK,GAAa,CACX5f,uBAAsB,GACtBC,sBAAqB,GACrBF,kCAAiC,IAErC,CCjGe,SAASykB,GAA6BC,GACnD,MAAMpC,EAAS,CAAC,EAEhBhxC,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IACjC,GACsD,IAApDwD,OAAO6C,KAAKusB,IAA6B3yB,QACzC2yB,GAA4B5yB,GAAG62C,YAAc5xB,KAAKoR,QAAQr2B,GAAGo3B,SAC5Dwf,EAEDpC,EAAOx0C,GAAK,CACV29B,aAAc/K,GAA4B5yB,GAAG62C,YAAc5xB,KAAKoR,QAAQr2B,GAAGo3B,OAC3Eyf,YAAajkB,GAA4B5yB,GAAG62C,YAC5CngB,MAAO0c,GACLpzC,EACAilB,KAAKoR,QAAQr2B,GAAGk3B,UAChBjS,KAAKoR,QAAQr2B,GAAGo3B,OAChBnS,KAAKoR,QAAQr2B,GAAGm3B,KAChBvE,GAA4B5yB,GAAG62C,YAAc5xB,KAAKoR,QAAQr2B,GAAGo3B,aAG5D,CACL,MAAM0f,EC3BG,SAA6CrgB,GAC1D,MAAMsgB,EAAsB9xB,KAAK8f,kBACjC,IAAIiS,EAAQ,IACRC,EAAsB,IAC1B,KAAOD,GAAS,GAEd,GADA5N,GAAwB3S,EAAUugB,GAC9BzmB,GAAuBwmB,EACzBE,EAAsBD,EACtBA,GAAS,OACJ,IAAc,MAAVA,EACT,OAAO,IAGP,IADAA,GAAS,EACFA,GAASC,GAAqB,CAEnC,GADA7N,GAAwB3S,EAAUugB,GAC9BzmB,GAAuBwmB,EACzB,OAAOC,EAETA,GAAS,CACX,CACF,CAEF,OAAO,GACT,CDIuBE,CAAoCl3C,GACrDw0C,EAAOx0C,GAAK,CACV29B,aAAcmZ,EACdD,YAAa5xB,KAAKoR,QAAQr2B,GAAGo3B,OAAS0f,EACtCpgB,MAAO0c,GACLpzC,EACAilB,KAAKoR,QAAQr2B,GAAGk3B,UAChBjS,KAAKoR,QAAQr2B,GAAGo3B,OAChBnS,KAAKoR,QAAQr2B,GAAGm3B,KAChB2f,GAGN,KAEFlkB,GAA8B4hB,EAE9BzC,GAAa,CAAEnf,4BAA2B,IAC5C,CE9Be,SAASukB,KACtBtkB,GAAsB,EACtBC,GAAuB,EACvBC,GAAwB,CAAC,EAAG,MAC5B,IAAK,IAAI/yB,EAAI,EAAGA,EAAIilB,KAAKkb,UAAUlgC,OAAQD,IAAK,CAC9C,IAAI,OAAEgxC,GAAW/rB,KAAKkb,UAAUngC,GAC5BixC,EAAS,IAKb,GAJIhsB,KAAK8qB,IAAI,6BAA4BkB,GAAU,MACpB,IAA3BhsB,KAAKkb,UAAUngC,GAAGK,OAAY4wC,GAAU,GAC5CD,GAAUC,EACNhsB,KAAK8qB,IAAI,mBAAkBiB,GAAU,MACrClc,GAAWqB,OAAOW,eAAgB,CACpC,MAAMC,EAAS9R,KAAKiR,OAAO,SACZ,IAAXa,EAAcia,GAAU,KACR,IAAXja,EAAcia,GAAU,IACb,IAAXja,IAAcia,GAAU,KACnC,CACAne,IAAuBme,EACQ,IAA3B/rB,KAAKkb,UAAUngC,GAAGK,OACpByyB,IAAwBke,EACpBA,EAASje,GAAsB,KAAIA,GAAwB,CAACie,EAAQhxC,IAE5E,CAEA+xC,GAAa,CAAElf,oBAAmB,wBAAsB,yBAAuB,IACjF,CCxBe,SAASukB,KACtB9U,KACA6U,KACAb,KACAC,KACAlB,KACAQ,KACAQ,KlBqCArnB,EAAc,IAAIuiB,GAAWrV,GAAYA,GAAYj8B,OAAS,IAC9DgvB,EAAY,IAAIsiB,GAAWrV,GAAYA,GAAYj8B,OAAS,IAC5DivB,EAAmB,IAAIqiB,GAAWrV,GAAYA,GAAYj8B,OAAS,IACnEkvB,EAAa,IAAIoiB,GAAWrV,GAAYA,GAAYj8B,OAAS,IAC7DmvB,EAAa,IAAImiB,GAAWpV,GAAWA,GAAWl8B,OAAS,IkBtC3DovB,EAAoB,IAAIkiB,GAAW,GACnCxiB,EAAgC,IAAIwiB,GAA+C,GAApCpV,GAAWA,GAAWl8B,OAAS,IAC9Es1C,KACAoB,KACAvE,KACAsC,KACAD,KACA,IACF,CChCe,SAAS4C,KACtB7zC,OAAO6C,KAAK4e,KAAKkb,WAAW/a,SAASplB,IAC/BilB,KAAKkb,UAAUngC,GAAGgxC,OAAS,GAAgC,IAA3B/rB,KAAKkb,UAAUngC,GAAGK,OACpD4kB,KAAKkb,UAAUngC,GAAGs3C,GAAK,EACzB,GAEJ,CC0BO,SAASC,GAAcl3C,EAAMkE,GAClC,GAAa,MAATlE,EAAc,CAIhB,GAFAyQ,EAAE,WAAW6L,UAAYsI,KAAKoR,QAAQ9xB,GAAM2nB,UAE4C,IAApFjH,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASmxB,YAAmB,CACzF,MAAMC,EAAarE,GACjB7uC,EACA0gB,KAAKoR,QAAQ9xB,GAAM2yB,UACnB,EACAjS,KAAKoR,QAAQ9xB,GAAM4yB,KACnBlS,KAAKoR,QAAQ9xB,GAAM6yB,QAEfsgB,EAAiBD,EAAaxyB,KAAKoR,QAAQ9xB,GAAM2gC,aACnDwS,EAAiB,IACnB5mC,EAAE,WAAW6L,UAAY7L,EAAE,WACxB6L,UAAUjW,MAAM,gBAChB6C,KACC,wBAAwB,GAASmuC,UACA,IAA/BtvC,KAAKgE,MAAMsrC,GAAwB,SAAW,+BAE9C7X,IACG4X,EAAaxyB,KAAKoR,QAAQ9xB,GAAM2gC,eAC9BjgB,KAAKoR,QAAQ9xB,GAAMozC,eAAiB1yB,KAAK2yB,gBAC5C9pB,eAIZ,EACsB,IAAlB7I,KAAKkY,UASPrsB,EAAE,WAAW6L,UAAY7L,EAAE,WACxB6L,UAAUjW,MAAM,GAASue,KAAKoR,QAAQ9xB,GAAMq9B,YAC5Cr4B,KACC,IACG0b,KAAKoR,QAAQ9xB,GACd0gB,KAAKoR,QAAQ9xB,GAAM2yB,UACnBjS,KAAKoR,QAAQ9xB,GAAM6yB,OACnBnS,KAAKoR,QAAQ9xB,GAAM4yB,KACnBlS,KAAKyS,QACL,KAIV,MAAO,GAAa,MAATr3B,EAAc,CAEvB,IAAK4kB,KAAK4Z,gBAAgBt6B,GAAO,MAAO,GACxCuM,EAAE,WAAW6L,UAAYsI,KAAK4yB,aAAa5yB,KAAK4Z,gBAAgBt6B,GAAO,QACzE,KAAoB,MAATlE,EAAcyQ,EAAE,WAAW6L,UAAYsI,KAAK6yB,cAErC,MAATz3C,EACPyQ,EAAE,WAAW6L,UAAYsI,KAAKoR,QAAQ,gBAAgBD,SAAS2hB,aAAaxzC,EAAnD0gB,GAET,MAAT5kB,EACPyQ,EAAE,WAAW6L,UAAYsI,KAAK6jB,YAAY,GAAG1S,SAAS4hB,YAAYzzC,EAAK,GAAIA,EAAK,GAAvD0gB,GAET,OAAT5kB,EAAeyQ,EAAE,WAAW6L,UAAYsI,KAAK6jB,YAAY,GAAG1S,SAAS6hB,YAAY,EAAzChzB,GAC/B,OAAT5kB,EAAeyQ,EAAE,WAAW6L,UAAY,GAC/B,QAATtc,EAAgByQ,EAAE,WAAW6L,UAAYsI,KAAKoR,QAAQF,OAAOC,SAAS8hB,WAAW3zC,EAAxC0gB,GAChC,QAAT5kB,IACPyQ,EAAE,WAAW6L,UAAYsI,KAAKoR,QAAQF,OAAOC,SAAS+hB,YAAY5zC,EAAK,GAA9C0gB,IAG3B,GACY,MAAT5kB,GAAiC,IAAjB4kB,KAAKkY,SACb,MAAT98B,GACS,MAATA,GACS,MAATA,GACU,MAATA,IAAiB4kB,KAAK5e,KAAK,KACnB,OAAThG,GACS,OAATA,GACS,QAATA,GACU,QAATA,IAA+B,IAAbkE,EAAK,GACxB,CACA,MAAM6zC,EAAO95C,SAAS4D,cAAc,OACpCk2C,EAAK/yB,GAAK,gBACVvU,EAAE,WAAWiK,YAAYq9B,EAC3B,CAQA,OALA1b,GAAcr8B,EACds8B,GAAcp4B,EAEdwlC,KAEOj5B,EAAE,WAAW6L,SACtB,CC/GO,SAAS07B,KAEoE,IAAhFpzB,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASiyB,SACpE1f,GAAwB,EAEpBvE,GAA0BkkB,MAC5BznC,EAAE,aAAa0nC,KACb,4EAEF1nC,EAAE,aAAa0nC,KACb,6EACC1nC,EAAE,aAAa0nC,KAAO,sDAC/B,CCnBe,SAASC,KAEtB3jB,GAAa,GACbtxB,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAASplB,IACjC80B,GAAW90B,GAAK4jC,GAAoB5jC,EAAE,IAIxC+0B,GAAc,GACdvxB,OAAO6C,KAAK4e,KAAKuf,UAAUpf,SAASplB,IAClC+0B,GAAY/0B,GAAKskC,GAAYtkC,EAAE,IAIjCg1B,GAAkB,GAClBxxB,OAAO6C,KAAK4e,KAAK0d,cAAcvd,SAASplB,IACtCg1B,GAAgBh1B,GAAKyiC,GAAgBziC,EAAE,IAEzC4kC,IACF,CCxBe,SAAS8T,KAClBzzB,KAAKoR,QAAQ,gBAAgBS,gBAC/BtzB,OAAO6C,KAAK4e,KAAKoR,QAAQ,gBAAgBD,SAASoV,YAAYpmB,SAASplB,IAC1B,OAAvC8Q,EAAE,gBAAgB9Q,KAAKisB,cACzBkN,GAAsBn5B,GAAK8Q,EAAE,gBAAgB9Q,KAAKisB,YAClDnb,EAAE,gBAAgB9Q,KAAKisB,YAAc,WACnChH,KAAKiH,QAAQysB,QAAU,EACvB1zB,KAAKiH,QAAQhV,KAAKxY,MAAM,IAAM64C,GAAc,IAAK,GAAGv3C,MAAM,QAC1DilB,KAAKiH,QAAQ0sB,QACf,EACF,GAGN,CCLA,SAASC,KACP,IAAKtgB,IAAgCtT,KAAKoR,QAAQ,gBAAgBS,eAAgB,CAChF,MAAM,SAAEV,GAAanR,KAAKoR,QAAQ,gBAClCgC,GAAqBjC,EAASlf,KAC9B+N,KAAKoR,QAAQ,gBAAgBD,SAASlf,KAAO,WAC3CmhB,KAEsF,IAApFpT,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASyyB,aACpE1iB,EAASwT,MAAQxT,EAASsV,QAC1BzmB,KAAKkqB,MAAQ,GAAM,IAEnB/Y,EAAS2iB,cAAcp8B,WAAa,KAAK6iB,GACvCgK,GAA4BpT,EAASwT,MAAOxT,EAASsV,OAAQtV,EAASsV,YAExEtV,EAAS4iB,UAAUlxC,MAAMgG,MAAQ,MAErC,EACAyqB,IAA+B,CACjC,CACF,CA6Be,SAAS0gB,MAxBxB,WACE,IAAK3gB,IAAkCrT,KAAKoR,QAAQ,gBAAgBS,eAAgB,CAClF,MAAM,SAAEV,GAAanR,KAAKoR,QAAQ,gBAClC8B,GAAuB/B,EAAS8iB,OAChC9gB,GAA0B,IAAI32B,SAC5B,UAAU20B,EAAS8iB,OAChB5wC,WACA5B,MAAM,SACN6C,KAAK,8CAEV0b,KAAKoR,QAAQ,gBAAgBD,SAAS8iB,OAAS,WAC7C9gB,KACAsgB,KACAngB,IAA+B,EAC/BsgB,KAEAvgB,IAAiC,CACnC,CACF,CACF,CAME6gB,GACAN,IACF,CCtDe,SAASO,KACtB,GAAI/nB,KAAyBpM,KAAKmQ,aAAerE,GAAW,CAC1D,GACE9L,KAAKmQ,YAAc,IACnBnQ,KAAKo0B,aAAap0B,KAAKmQ,aAAakkB,IAAIhxC,WAAWsjB,SAAS,aAC5D,CACA,MAAM2tB,EAAct0B,KAAKo0B,aAAap0B,KAAKmQ,aAAakkB,IACrDhxC,WACA5H,MAAM,mBACT,IAAI2E,EACc,OAAhBk0C,EAAuBA,EAAY,GAAKt0B,KAAK6jB,YAAY7jB,KAAKmQ,YAAc,GAAG7wB,KACjF,MAAM6yB,EAASnS,KAAKo0B,aAAap0B,KAAKmQ,aAAakkB,IAChDhxC,WACA5H,MAAM,sBAAsB,GAC/B,GAAe,MAAX2E,EAEF,GADAA,EAASA,EAAOm0C,WAAW,IAAK,IAC5Bv0B,KAAKoR,QAAQhxB,GAAQ+xB,OAASA,EAChC9F,GAAyB,mCACpB,CACL,IAAImoB,EAAO,EACX7U,KACA,IAAK,IAAI5kC,EAAI,EAAGA,EAAIo3B,EAAQp3B,IAAK,CAC/B,IAAI02B,EACF5B,GAAWzvB,GAAQ6xB,UACnBjS,KAAK0S,eACHvvB,KAAK2D,IAAI,EAAG+oB,GAAWzvB,GAAQ+xB,OAAS,EAAItC,GAAWzvB,GAAQ8xB,MACnET,EAAQzR,KAAK2S,oBAAoB9C,GAAWzvB,GAASqxB,GACrDA,EAAQtuB,KAAKiL,KAAKqjB,GAClB+iB,GAAQ/iB,EACR5B,GAAWzvB,GAAQ+xB,QAAU,CAC/B,CACA9F,GAAyB,kBAAkB,GAASmoB,IACtD,KACK,CACL,IAAIA,EAAO,EACX7U,KACAphC,OAAO6C,KAAK4e,KAAKoR,SAASjR,SAAS4Z,IAEjC,GADA35B,EAAS25B,EACL/Z,KAAKoR,QAAQhxB,GAAQ+xB,OAASA,EAChC9F,GAAyB,mCAD3B,CAIA,IAAK,IAAItxB,EAAI,EAAGA,EAAIo3B,EAAQp3B,IAAK,CAC/B,IAAI02B,EACF5B,GAAWzvB,GAAQ6xB,UACnBjS,KAAK0S,eACHvvB,KAAK2D,IAAI,EAAG+oB,GAAWzvB,GAAQ+xB,OAAS,EAAItC,GAAWzvB,GAAQ8xB,MACnET,EAAQzR,KAAK2S,oBAAoB9C,GAAWzvB,GAASqxB,GACrDA,EAAQtuB,KAAKiL,KAAKqjB,GAClB+iB,GAAQ/iB,EACR5B,GAAWzvB,GAAQ+xB,QAAU,CAC/B,CACA9F,GAAyB,kBAAkB,GAASmoB,IAXpD,CAW2D,GAE/D,CACF,CACApoB,GAAuBpM,KAAKmQ,WAC9B,CAEA2c,GAAa,CAAE1gB,qBAAoB,IACrC,CCpEO,MAAMqoB,GAAe,CAC1BC,UAAW,qBACXC,YAAa,cACbC,SAAU,WACVC,QAAS,4BACTC,YAAa,+BACbC,QAAS,WACTC,WAAY,aACZ3rB,aAAc,gBACd4rB,cAAe,iBAIJC,GAA2B,CACtCC,oBAAqB,wBACrBC,eAAgB,gBAChBC,eAAgB,iBAChBC,gBAAiB,iBACjBC,iBAAkB,cAClBC,iBAAkB,iBAClBC,kBAAmB,WACnBC,qBAAsB,qBCKxB,GAvBA,SAAsCC,GACpC,GAAoB,IAAhBA,EAAmB,CAErB,MAAMC,EAA2B,WAC/B,IACEvsB,aAAawsB,oBAAoBC,MAGnC,CAFE,MAAO55C,GACP,OAAO,CACT,CACA,OAAO,CACT,EAGM,iBAAkB1C,OAEbo8C,IACTvsB,aAAawsB,oBAAoBC,OAEjCzsB,aAAawsB,oBAJbj6C,QAAQ85B,IAAI,+CAMhB,CACF,ECnBe,SAASqgB,KACtBC,cACAh2B,KAAKi2B,eACLj2B,KAAKk2B,kBAEL7Z,KACArE,KACAmB,IACF,CCTe,SAASgd,KAC6D,IAA/En2B,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASkb,QACtEzwB,EAAE,YAAYhJ,MAAM2U,QAAU,GAC9B6kB,MAEAxwB,EAAE,YAAYhJ,MAAM2U,QAAU,OAEhCylB,IACF,CCKA,MAy6BA,GAz6BiB,CAEfnC,QAAS,IAAItR,EACX,EACA,OACA,cACA,CAAC,6BAA8B,8BAC/B,kFACA,GAEFukB,WAAY,IAAIvkB,EACd,EACA,OACA,cACA,CACE,0BACA,0BACA,0BACA,yBACA,yBACA,0BACA,0BACA,2BAEF,4DACA,GAEF0kB,cAAe,IAAI1kB,EACjB,EACA,OACA,cACA,CACE,4BACA,4BACA,6BACA,6BACA,8BAEF,uDACA,GAEFuR,UAAW,IAAIvR,EACb,EACA,OACA,cACA,CACE,+BACA,8BACA,6CAEF,qGACA,GACA,KACEsC,IAAY,CAAI,IAKpBgJ,MAAO,IAAItL,EACT,EACA,OACA,WACA,CACE,uBACA,SACA,cACA,4BACA,sBACA,wBAEF,yCACA,GACA,KACEusB,IAAc,IAGlBnhB,cAAe,IAAIpL,EACjB,EACA,OACA,WACA,CAAC,aAAc,aAAc,cAC7B,oIACA,GACA,KACEusB,IAAc,IAGlB3gB,eAAgB,IAAI5L,EAClB,EACA,OACA,WACA,CAAC,4BAA6B,mBAC9B,qDACA,GACA,KACEusB,IAAc,IAGlB5gB,YAAa,IAAI3L,EACf,OACA,WACA,WACA,2BACA,8KACA,EACA,WAEFmR,WAAY,IAAInR,EACd,EACA,OACA,WACA,CAAC,0BAA2B,sBAAuB,iBACnD,0BACA,GAEF4sB,aAAc,IAAI5sB,EAChB,EACA,OACA,WACA,CAAC,oBAAqB,oBACtB,mEACA,GACA,KCtIuF,IAArFxJ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASg1B,aACtEp2B,KAAKoqB,QAAUvT,GACZ7W,KAAKoqB,QAAUhW,GAAgBgW,ODqIZ,IAGxB3N,cAAe,IAAIjT,EACjB,EACA,OACA,WACA,CAAC,yBAA0B,mBAC3B,sKACA,GAIF4O,YAAa,IAAI5O,EACf,EACA,OACA,UACA,CAAC,uBAAwB,uBACzB,yBACA,GACA,KACEwO,IAAiB,IAGrB6I,sBAAuB,IAAIrX,EACzB,EACA,OACA,UACA,CAAC,2BAA4B,sBAC7B,0KACA,GAEF+kB,aAAc,IAAI/kB,EAChB,EACA,OACA,UACA,CACE,mBACA,kBACA,0BACA,gCAEF,sGACA,GAEF8kB,cAAe,IAAI9kB,EACjB,EACA,OACA,UACA,CAAC,mBAAoB,mBA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AoC,mCACrC,6CACA,GAEF+hB,aAAc,IAAI/hB,EAChB,EACA,OACA,UACA,CAAC,uBAAwB,uBACzB,oEACA,GAEFwc,YAAa,IAAIxc,EACf,EACA,OACA,UACA,CAAC,yBAA0B,yBAC3B,4DACA,GAEF0d,aAAc,IAAI1d,EAChB,EACA,OACA,UACA,CAAC,2BAA4B,2BAC7B,yDACA,GAEFwe,gBAAiB,IAAIxe,EACnB,EACA,OACA,UACA,CAAC,uBAAwB,uBACzB,iDACA,GAEFitB,oBAAqB,IAAIjtB,EACvB,EACA,OACA,UACA,CAAC,qCAAsC,qCACvC,+CACA,GAIF2gB,MAAO,IAAI3gB,EACT,EACA,OACA,aACA,CAAC,iBAAkB,iBACnB,oCACA,GAEFktB,gBAAiB,IAAIltB,EACnB,EACA,OACA,aACA,CAAC,uBAAwB,uBACzB,6CACA,GAEFmtB,oBAAqB,IAAIntB,EACvB,EACA,OACA,aACA,CAAC,2BAA4B,kCAC7B,yDACA,GAEF0iB,QAAS,IAAI1iB,EACX,EACA,OACA,aACA,CAAC,mCAAoC,+BACrC,wCACA,GAEFotB,oBAAqB,IAAIptB,EACvB,EACA,WACA,aACA,0BACA,8GACA,EACAqL,KAEFgiB,aAAc,IAAIrtB,EAChB,EACA,OACA,aACA,CAAC,gBAAiB,gBAClB,4FACA,GAIFuO,MAAO,IAAIvO,EACT,EACA,OACA,sBACA,CAAC,YAAa,WAAY,8BAC1B,8LACA,GAEFxG,aAAc,IAAIwG,EAChB,EACA,OACA,sBACA,CAAC,mCAAoC,mCACrC,kLACA,GAEFstB,eAAgB,IAAIttB,EAClB,EACA,OACA,iBACA,CAAC,mBAAoB,mBACrB,mDACA,GACA,KACE,GACExJ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAAS01B,eACrE,IAGLC,QAAS,IAAIvtB,EACX,EACA,OACA,iBACA,CAAC,YAAa,YACd,iCACA,GAEFwtB,cAAe,IAAIxtB,EACjB,UACA,SACA,iBACA,wDAEFytB,QAAS,IAAIztB,EACX,EACA,OACA,iBACA,CAAC,YAAa,YACd,iCACA,GAEF0tB,SAAU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","sources":["webpack:///./node_modules/@eastdesire/jscolor/jscolor.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/baseSetting.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/notifications/prompt.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/notifications/flash.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/savingAndLoading/saveFramework.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/toggles/toggleHeader.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/notifications/sound.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/toggleConfigVolume.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/menuSections/addMenu.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/menuSections/info/addInfoMenuSection.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/menuSections/info/createFrameworkInfoMenuSection.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/data/modInfo.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/draw/drawLoop.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/data/headers.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/savingAndLoading/loadMod.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/savingAndLoading/createSaveDataObject.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/logic/logicLoop.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/data/settings.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/load.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/cookieMonsterFramework.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/init.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/init/createFlashScreen.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/save.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/index.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/init/initModFramework.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/init/registerMod.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/listings/createInfoListing.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/listings/createOptionListing.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/listings/createOptionsFavouriteStar.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/toggles/toggleFavourite.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/toggleConfig.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/toggleConfigKeycode.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/listings/createOptionsSubHeader.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/createModMenuSection.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/notifications/notification.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingColours.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingInputNumber.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingStandard.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingStandardWithFunc.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingVolume.js","webpack:///./src/Config/Toggles/ToggleWrinklerButtons.js","webpack:///./src/Cache/VariablesAndData.js","webpack:///./src/Sim/VariablesAndData.js","webpack:///./src/Sim/ReplacedGameFunctions/SimAuraMult.js","webpack:///./src/Sim/ReplacedGameFunctions/SimGetSellMultiplier.js","webpack:///./src/Sim/ReplacedGameFunctions/SimEff.js","webpack:///./src/Sim/ReplacedGameFunctions/SimHas.js","webpack:///./src/Sim/ReplacedGameFunctions/SimHasAura.js","webpack:///./src/Sim/ReplacedGameFunctions/SimHasGod.js","webpack:///./src/Sim/ReplacedGameFunctions/SimModifyBuidlingPrice.js","webpack:///./src/Sim/SimulationEvents/SellBuilding.js","webpack:///./src/Data/Scales.js","webpack:///./src/Main/VariablesAndData.js","webpack:///./src/Disp/VariablesAndData.js","webpack:///./src/Disp/BeautifyAndFormatting/Beautify.js","webpack:///./src/Disp/BuildingsUpgrades/Buildings.js","webpack:///./src/Disp/BuildingsUpgrades/UpdateUpgradeSectionsHeight.js","webpack:///./src/Disp/BuildingsUpgrades/Upgrades.js","webpack:///./src/Disp/BeautifyAndFormatting/FormatTime.js","webpack:///./src/Disp/BeautifyAndFormatting/GetTimeColour.js","webpack:///./src/Disp/HelperFunctions/GetCPS.js","webpack:///./src/Disp/HelperFunctions/GetWrinkConfigBank.js","webpack:///./src/Disp/InfoBars/CreateDOMElements.js","webpack:///./src/Disp/InfoBars/BottomBar.js","webpack:///./src/Disp/HelperFunctions/UpdateBackground.js","webpack:///./src/Config/SpecificToggles.js","webpack:///./src/Cache/Dragon/CacheDragonAuras.js","webpack:///./src/Sim/InitializeData/InitAchievement.js","webpack:///./src/Sim/ReplacedGameFunctions/SimGetTieredCpsMult.js","webpack:///./src/Sim/InitializeData/InitialBuildingData.js","webpack:///./src/Sim/InitializeData/InitUpgrade.js","webpack:///./src/Sim/SimulationData/CopyData.js","webpack:///./src/Disp/Tooltips/CreateTooltip.js","webpack:///./src/Cache/PP/ColourOfPP.js","webpack:///./src/Cache/CPS/GetCPSBuffMult.js","webpack:///./src/Sim/SimulationData/SimWin.js","webpack:///./src/Sim/Calculations/CalculateGains.js","webpack:///./src/Sim/ReplacedGameFunctions/SimGetHeavenlyMultiplier.js","webpack:///./src/Data/Gamedata.js","webpack:///./src/Sim/ReplacedGameFunctions/SimHasAchiev.js","webpack:///./src/Sim/Calculations/CheckOtherAchiev.js","webpack:///./src/Sim/SimulationEvents/BuyBuildingBonusIncome.js","webpack:///./src/Disp/HelperFunctions/CalculateGrimoireRefillTime.js","webpack:///./src/Config/Toggles/ToggleToolWarnPos.js","webpack:///./src/Disp/Tooltips/UpdateTooltips.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/Building.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/Upgrade.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/SugarLump.js","webpack:///./src/Disp/HelperFunctions/GetLumpColour.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/Grimoire.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/GardenPlots.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/HarvestAll.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/WrinklerButton.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/PantheonGods.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/Warnings.js","webpack:///./src/Disp/DrawHook.js","webpack:///./src/Disp/InfoBars/TimerBar.js","webpack:///./src/Disp/Tooltips/WrinklerTooltips.js","webpack:///./src/Disp/MenuSections/Refreshmenu.js","webpack:///./src/Main/ClickHook.js","webpack:///./src/Cache/CPS/AverageQueue.js","webpack:///./src/Cache/FillCMDCache.js","webpack:///./src/Cache/CPS/CPS.js","webpack:///./src/Sim/SimulationEvents/BuyBuilding.js","webpack:///./src/Cache/PP/Building.js","webpack:///./src/Cache/PP/PP.js","webpack:///./src/Cache/PP/Upgrade.js","webpack:///./src/Sim/SimulationEvents/BuyUpgrades.js","webpack:///./src/Cache/PriceAndIncome/PriceAndIncome.js","webpack:///./src/Cache/Stats/ChainCookies.js","webpack:///./src/Cache/Stats/HeavenlyChips.js","webpack:///./src/Cache/Stats/MissingUpgrades.js","webpack:///./src/Disp/MenuSections/Statistics/CreateMissingUpgrades.js","webpack:///./src/Cache/Stats/Reindeer.js","webpack:///./src/Cache/Stats/Stats.js","webpack:///./src/Cache/TillNextAchievement/AllAmountTillNextAchievement.js","webpack:///./src/Cache/TillNextAchievement/IndividualAmountTillNextAchievement.js","webpack:///./src/Cache/Wrinklers/Wrinklers.js","webpack:///./src/Cache/CacheInit.js","webpack:///./src/Disp/HelperFunctions/PopWrinklers.js","webpack:///./src/Disp/Tooltips/Tooltip.js","webpack:///./src/Disp/TabTitle/FavIcon.js","webpack:///./src/Sim/InitializeData/InitData.js","webpack:///./src/Main/ReplaceGameElements/TooltipGrimoire.js","webpack:///./src/Main/ReplaceGameElements/NativeGrimoire.js","webpack:///./src/Cache/Dragon/Dragon.js","webpack:///./src/Data/Sectionheaders.js","webpack:///./src/Config/CheckNotificationPermissions.js","webpack:///./src/Disp/HelperFunctions/RefreshScale.js","webpack:///./src/Config/Toggles/ToggleBotBar.js","webpack:///./src/Data/settings.js","webpack:///./src/Config/Toggles/ToggleDetailedTime.js","webpack:///./src/Config/Toggles/ToggleUpgradeBarAndColour.js","webpack:///./src/Config/Toggles/ToggleUpgradeBarFixedPos.js","webpack:///./src/Config/Toggles/ToggleGCTimer.js","webpack:///./src/Config/Toggles/ToggleSectionHideButtons.js","webpack:///./src/Disp/HelperFunctions/UpdateColours.js","webpack:///./src/Disp/MenuSections/createMenuOptions.js","webpack:///./src/Disp/HelperFunctions/CalculateLuckyLevels.js","webpack:///./src/Disp/MenuSections/Statistics/CreateDOMElements.js","webpack:///./src/Config/ToggleSetting.js","webpack:///./src/Disp/MenuSections/Statistics/AddStatsPage.js","webpack:///./src/Disp/MenuSections/Statistics/CreateStatsSections.js","webpack:///./src/Sim/SimulationEvents/ResetAscension.js","webpack:///./src/Disp/MenuSections/Statistics/CreateMissingAchievements.js","webpack:///./src/Main/ReplaceGameFunctions/FixMouse.js","webpack:///./src/Main/ReplaceGameFunctions/ReplaceNative.js","webpack:///./src/Disp/Tooltips/PositionLocation.js","webpack:///./src/Main/ReplaceGameElements/TooltipUpgrades.js","webpack:///./src/Disp/Dragon/Dragon.js","webpack:///./src/Sim/SimulationEvents/AuraChange.js","webpack:///./src/Disp/MenuSections/AddMenus.js","webpack:///./src/Disp/TabTitle/TabTitle.js","webpack:///./src/Disp/Tooltips/AscendButton.js","webpack:///./src/Main/Initialization.js","webpack:///./src/Disp/Initialization/CssArea.js","webpack:///./src/Disp/BuildingsUpgrades/UpgradeBar.js","webpack:///./src/Disp/Initialization/CreateSectionHideButtons.js","webpack:///./src/Disp/Initialization/CreateWrinklerButton.js","webpack:///./src/Disp/Initialization/UpdateBuildingUpgradeStyle.js","webpack:///./src/Disp/buildingTiles/createBuildingLockButtons.js","webpack:///./src/Disp/buildingTiles/toggleBuildingLock.js","webpack:///./src/Main/ReplaceGameElements/Tooltips.js","webpack:///./src/Main/WrinklerArea/AddDetectArea.js","webpack:///./src/Sim/SimulationEvents/GodChange.js","webpack:///./src/Main/LoopHook.js","webpack:///./src/Disp/HelperFunctions/UpdateAscendState.js","webpack:///./src/Cache/CPS/NoGoldSwitchCPS.js","webpack:///./src/Sim/Calculations/NoGoldenSwitchCalc.js","webpack:///./src/Cache/PantheonGods/CacheGods.js","webpack:///./src/Cache/CPS/SellChoEgg.js","webpack:///./src/Sim/SimulationEvents/SellBuildingForChoEgg.js","webpack:///./src/Cache/CacheLoop.js","webpack:///./src/Cache/CPS/CurrWrinklerCPS.js","webpack:///./src/Main/CheckStates/Ticker.js","webpack:///./src/Main/CheckStates/Season.js","webpack:///./src/Main/CheckStates/Garden.js","webpack:///./src/Main/CheckStates/Grimoire.js","webpack:///./src/Main/CheckStates/Wrinkler.js","webpack:///./src/Main/CheckStates/GoldenCookie.js","webpack:///./src/Disp/GoldenCookieTimers/GoldenCookieTimers.js","webpack:///./src/Data/headers.js","webpack:///./src/InitSaveLoad/load.js","webpack:///./src/CookieMonster.js","webpack:///./src/InitSaveLoad/init.js","webpack:///./src/Data/Moddata.js","webpack:///./src/InitSaveLoad/save.js"],"sourcesContent":["/**\r\n * jscolor - JavaScript Color Picker\r\n *\r\n * @link http://jscolor.com\r\n * @license For open source use: GPLv3\r\n * For commercial use: JSColor Commercial License\r\n * @author Jan Odvarko - East Desire\r\n *\r\n * See usage examples at http://jscolor.com/examples/\r\n */\r\n\r\n\r\n(function (global, factory) {\r\n\r\n\t'use strict';\r\n\r\n\tif (typeof module === 'object' && typeof module.exports === 'object') {\r\n\t\t// Export jscolor as a module\r\n\t\tmodule.exports = global.document ?\r\n\t\t\tfactory (global) :\r\n\t\t\tfunction (win) {\r\n\t\t\t\tif (!win.document) {\r\n\t\t\t\t\tthrow new Error('jscolor needs a window with document');\r\n\t\t\t\t}\r\n\t\t\t\treturn factory(win);\r\n\t\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\t// Default use (no module export)\r\n\tfactory(global);\r\n\r\n})(typeof window !== 'undefined' ? window : this, function (window) { // BEGIN factory\r\n\r\n// BEGIN jscolor code\r\n\r\n\r\n'use strict';\r\n\r\n\r\nvar jscolor = (function () { // BEGIN jscolor\r\n\r\nvar jsc = {\r\n\r\n\r\n\tinitialized : false,\r\n\r\n\tinstances : [], // created instances of jscolor\r\n\r\n\treadyQueue : [], // functions waiting to be called after init\r\n\r\n\r\n\tregister : function () {\r\n\t\tif (typeof window !== 'undefined' && window.document) {\r\n\t\t\twindow.document.addEventListener('DOMContentLoaded', jsc.pub.init, false);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tinstallBySelector : function (selector, rootNode) {\r\n\t\trootNode = rootNode ? jsc.node(rootNode) : window.document;\r\n\t\tif (!rootNode) {\r\n\t\t\tthrow new Error('Missing root node');\r\n\t\t}\r\n\r\n\t\tvar elms = rootNode.querySelectorAll(selector);\r\n\r\n\t\t// for backward compatibility with DEPRECATED installation/configuration using className\r\n\t\tvar matchClass = new RegExp('(^|\\\\s)(' + jsc.pub.lookupClass + ')(\\\\s*(\\\\{[^}]*\\\\})|\\\\s|$)', 'i');\r\n\r\n\t\tfor (var i = 0; i < elms.length; i += 1) {\r\n\r\n\t\t\tif (elms[i].jscolor && elms[i].jscolor instanceof jsc.pub) {\r\n\t\t\t\tcontinue; // jscolor already installed on this element\r\n\t\t\t}\r\n\r\n\t\t\tif (elms[i].type !== undefined && elms[i].type.toLowerCase() == 'color' && jsc.isColorAttrSupported) {\r\n\t\t\t\tcontinue; // skips inputs of type 'color' if supported by the browser\r\n\t\t\t}\r\n\r\n\t\t\tvar dataOpts, m;\r\n\r\n\t\t\tif (\r\n\t\t\t\t(dataOpts = jsc.getDataAttr(elms[i], 'jscolor')) !== null ||\r\n\t\t\t\t(elms[i].className && (m = elms[i].className.match(matchClass))) // installation using className (DEPRECATED)\r\n\t\t\t) {\r\n\t\t\t\tvar targetElm = elms[i];\r\n\r\n\t\t\t\tvar optsStr = '';\r\n\t\t\t\tif (dataOpts !== null) {\r\n\t\t\t\t\toptsStr = dataOpts;\r\n\r\n\t\t\t\t} else if (m) { // installation using className (DEPRECATED)\r\n\t\t\t\t\tconsole.warn('Installation using class name is DEPRECATED. Use data-jscolor=\"\" attribute instead.' + jsc.docsRef);\r\n\t\t\t\t\tif (m[4]) {\r\n\t\t\t\t\t\toptsStr = m[4];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar opts = null;\r\n\t\t\t\tif (optsStr.trim()) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\topts = jsc.parseOptionsStr(optsStr);\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tconsole.warn(e + '\\n' + optsStr);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tnew jsc.pub(targetElm, opts);\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tparseOptionsStr : function (str) {\r\n\t\tvar opts = null;\r\n\r\n\t\ttry {\r\n\t\t\topts = JSON.parse(str);\r\n\r\n\t\t} catch (eParse) {\r\n\t\t\tif (!jsc.pub.looseJSON) {\r\n\t\t\t\tthrow new Error('Could not parse jscolor options as JSON: ' + eParse);\r\n\t\t\t} else {\r\n\t\t\t\t// loose JSON syntax is enabled -> try to evaluate the options string as JavaScript object\r\n\t\t\t\ttry {\r\n\t\t\t\t\topts = (new Function ('var opts = (' + str + '); return typeof opts === \"object\" ? opts : {};'))();\r\n\t\t\t\t} catch (eEval) {\r\n\t\t\t\t\tthrow new Error('Could not evaluate jscolor options: ' + eEval);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn opts;\r\n\t},\r\n\r\n\r\n\tgetInstances : function () {\r\n\t\tvar inst = [];\r\n\t\tfor (var i = 0; i < jsc.instances.length; i += 1) {\r\n\t\t\t// if the targetElement still exists, the instance is considered \"alive\"\r\n\t\t\tif (jsc.instances[i] && jsc.instances[i].targetElement) {\r\n\t\t\t\tinst.push(jsc.instances[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn inst;\r\n\t},\r\n\r\n\r\n\tcreateEl : function (tagName) {\r\n\t\tvar el = window.document.createElement(tagName);\r\n\t\tjsc.setData(el, 'gui', true);\r\n\t\treturn el;\r\n\t},\r\n\r\n\r\n\tnode : function (nodeOrSelector) {\r\n\t\tif (!nodeOrSelector) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif (typeof nodeOrSelector === 'string') {\r\n\t\t\t// query selector\r\n\t\t\tvar sel = nodeOrSelector;\r\n\t\t\tvar el = null;\r\n\t\t\ttry {\r\n\t\t\t\tel = window.document.querySelector(sel);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tconsole.warn(e);\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tif (!el) {\r\n\t\t\t\tconsole.warn('No element matches the selector: %s', sel);\r\n\t\t\t}\r\n\t\t\treturn el;\r\n\t\t}\r\n\r\n\t\tif (jsc.isNode(nodeOrSelector)) {\r\n\t\t\t// DOM node\r\n\t\t\treturn nodeOrSelector;\r\n\t\t}\r\n\r\n\t\tconsole.warn('Invalid node of type %s: %s', typeof nodeOrSelector, nodeOrSelector);\r\n\t\treturn null;\r\n\t},\r\n\r\n\r\n\t// See https://stackoverflow.com/questions/384286/\r\n\tisNode : function (val) {\r\n\t\tif (typeof Node === 'object') {\r\n\t\t\treturn val instanceof Node;\r\n\t\t}\r\n\t\treturn val && typeof val === 'object' && typeof val.nodeType === 'number' && typeof val.nodeName === 'string';\r\n\t},\r\n\r\n\r\n\tnodeName : function (node) {\r\n\t\tif (node && node.nodeName) {\r\n\t\t\treturn node.nodeName.toLowerCase();\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\r\n\tremoveChildren : function (node) {\r\n\t\twhile (node.firstChild) {\r\n\t\t\tnode.removeChild(node.firstChild);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tisTextInput : function (el) {\r\n\t\treturn el && jsc.nodeName(el) === 'input' && el.type.toLowerCase() === 'text';\r\n\t},\r\n\r\n\r\n\tisButton : function (el) {\r\n\t\tif (!el) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tvar n = jsc.nodeName(el);\r\n\t\treturn (\r\n\t\t\t(n === 'button') ||\r\n\t\t\t(n === 'input' && ['button', 'submit', 'reset'].indexOf(el.type.toLowerCase()) > -1)\r\n\t\t);\r\n\t},\r\n\r\n\r\n\tisButtonEmpty : function (el) {\r\n\t\tswitch (jsc.nodeName(el)) {\r\n\t\t\tcase 'input': return (!el.value || el.value.trim() === '');\r\n\t\t\tcase 'button': return (el.textContent.trim() === '');\r\n\t\t}\r\n\t\treturn null; // could not determine element's text\r\n\t},\r\n\r\n\r\n\t// See https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\r\n\tisPassiveEventSupported : (function () {\r\n\t\tvar supported = false;\r\n\r\n\t\ttry {\r\n\t\t\tvar opts = Object.defineProperty({}, 'passive', {\r\n\t\t\t\tget: function () { supported = true; }\r\n\t\t\t});\r\n\t\t\twindow.addEventListener('testPassive', null, opts);\r\n\t\t\twindow.removeEventListener('testPassive', null, opts);\r\n\t\t} catch (e) {}\r\n\r\n\t\treturn supported;\r\n\t})(),\r\n\r\n\r\n\tisColorAttrSupported : (function () {\r\n\t\tvar elm = window.document.createElement('input');\r\n\t\tif (elm.setAttribute) {\r\n\t\t\telm.setAttribute('type', 'color');\r\n\t\t\tif (elm.type.toLowerCase() == 'color') {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t})(),\r\n\r\n\r\n\tdataProp : '_data_jscolor',\r\n\r\n\r\n\t// usage:\r\n\t// setData(obj, prop, value)\r\n\t// setData(obj, {prop:value, ...})\r\n\t//\r\n\tsetData : function () {\r\n\t\tvar obj = arguments[0];\r\n\r\n\t\tif (arguments.length === 3) {\r\n\t\t\t// setting a single property\r\n\t\t\tvar data = obj.hasOwnProperty(jsc.dataProp) ? obj[jsc.dataProp] : (obj[jsc.dataProp] = {});\r\n\t\t\tvar prop = arguments[1];\r\n\t\t\tvar value = arguments[2];\r\n\r\n\t\t\tdata[prop] = value;\r\n\t\t\treturn true;\r\n\r\n\t\t} else if (arguments.length === 2 && typeof arguments[1] === 'object') {\r\n\t\t\t// setting multiple properties\r\n\t\t\tvar data = obj.hasOwnProperty(jsc.dataProp) ? obj[jsc.dataProp] : (obj[jsc.dataProp] = {});\r\n\t\t\tvar map = arguments[1];\r\n\r\n\t\t\tfor (var prop in map) {\r\n\t\t\t\tif (map.hasOwnProperty(prop)) {\r\n\t\t\t\t\tdata[prop] = map[prop];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tthrow new Error('Invalid arguments');\r\n\t},\r\n\r\n\r\n\t// usage:\r\n\t// removeData(obj, prop, [prop...])\r\n\t//\r\n\tremoveData : function () {\r\n\t\tvar obj = arguments[0];\r\n\t\tif (!obj.hasOwnProperty(jsc.dataProp)) {\r\n\t\t\treturn true; // data object does not exist\r\n\t\t}\r\n\t\tfor (var i = 1; i < arguments.length; i += 1) {\r\n\t\t\tvar prop = arguments[i];\r\n\t\t\tdelete obj[jsc.dataProp][prop];\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n\r\n\r\n\tgetData : function (obj, prop, setDefault) {\r\n\t\tif (!obj.hasOwnProperty(jsc.dataProp)) {\r\n\t\t\t// data object does not exist\r\n\t\t\tif (setDefault !== undefined) {\r\n\t\t\t\tobj[jsc.dataProp] = {}; // create data object\r\n\t\t\t} else {\r\n\t\t\t\treturn undefined; // no value to return\r\n\t\t\t}\r\n\t\t}\r\n\t\tvar data = obj[jsc.dataProp];\r\n\r\n\t\tif (!data.hasOwnProperty(prop) && setDefault !== undefined) {\r\n\t\t\tdata[prop] = setDefault;\r\n\t\t}\r\n\t\treturn data[prop];\r\n\t},\r\n\r\n\r\n\tgetDataAttr : function (el, name) {\r\n\t\tvar attrName = 'data-' + name;\r\n\t\tvar attrValue = el.getAttribute(attrName);\r\n\t\treturn attrValue;\r\n\t},\r\n\r\n\r\n\tsetDataAttr : function (el, name, value) {\r\n\t\tvar attrName = 'data-' + name;\r\n\t\tel.setAttribute(attrName, value);\r\n\t},\r\n\r\n\r\n\t_attachedGroupEvents : {},\r\n\r\n\r\n\tattachGroupEvent : function (groupName, el, evnt, func) {\r\n\t\tif (!jsc._attachedGroupEvents.hasOwnProperty(groupName)) {\r\n\t\t\tjsc._attachedGroupEvents[groupName] = [];\r\n\t\t}\r\n\t\tjsc._attachedGroupEvents[groupName].push([el, evnt, func]);\r\n\t\tel.addEventListener(evnt, func, false);\r\n\t},\r\n\r\n\r\n\tdetachGroupEvents : function (groupName) {\r\n\t\tif (jsc._attachedGroupEvents.hasOwnProperty(groupName)) {\r\n\t\t\tfor (var i = 0; i < jsc._attachedGroupEvents[groupName].length; i += 1) {\r\n\t\t\t\tvar evt = jsc._attachedGroupEvents[groupName][i];\r\n\t\t\t\tevt[0].removeEventListener(evt[1], evt[2], false);\r\n\t\t\t}\r\n\t\t\tdelete jsc._attachedGroupEvents[groupName];\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tpreventDefault : function (e) {\r\n\t\tif (e.preventDefault) { e.preventDefault(); }\r\n\t\te.returnValue = false;\r\n\t},\r\n\r\n\r\n\tcaptureTarget : function (target) {\r\n\t\t// IE\r\n\t\tif (target.setCapture) {\r\n\t\t\tjsc._capturedTarget = target;\r\n\t\t\tjsc._capturedTarget.setCapture();\r\n\t\t}\r\n\t},\r\n\r\n\r\n\treleaseTarget : function () {\r\n\t\t// IE\r\n\t\tif (jsc._capturedTarget) {\r\n\t\t\tjsc._capturedTarget.releaseCapture();\r\n\t\t\tjsc._capturedTarget = null;\r\n\t\t}\r\n\t},\r\n\r\n\r\n\ttriggerEvent : function (el, eventName, bubbles, cancelable) {\r\n\t\tif (!el) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar ev = null;\r\n\r\n\t\tif (typeof Event === 'function') {\r\n\t\t\tev = new Event(eventName, {\r\n\t\t\t\tbubbles: bubbles,\r\n\t\t\t\tcancelable: cancelable\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\t// IE\r\n\t\t\tev = window.document.createEvent('Event');\r\n\t\t\tev.initEvent(eventName, bubbles, cancelable);\r\n\t\t}\r\n\r\n\t\tif (!ev) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// so that we know that the event was triggered internally\r\n\t\tjsc.setData(ev, 'internal', true);\r\n\r\n\t\tel.dispatchEvent(ev);\r\n\t\treturn true;\r\n\t},\r\n\r\n\r\n\ttriggerInputEvent : function (el, eventName, bubbles, cancelable) {\r\n\t\tif (!el) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (jsc.isTextInput(el)) {\r\n\t\t\tjsc.triggerEvent(el, eventName, bubbles, cancelable);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\teventKey : function (ev) {\r\n\t\tvar keys = {\r\n\t\t\t9: 'Tab',\r\n\t\t\t13: 'Enter',\r\n\t\t\t27: 'Escape',\r\n\t\t};\r\n\t\tif (typeof ev.code === 'string') {\r\n\t\t\treturn ev.code;\r\n\t\t} else if (ev.keyCode !== undefined && keys.hasOwnProperty(ev.keyCode)) {\r\n\t\t\treturn keys[ev.keyCode];\r\n\t\t}\r\n\t\treturn null;\r\n\t},\r\n\r\n\r\n\tstrList : function (str) {\r\n\t\tif (!str) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t\treturn str.replace(/^\\s+|\\s+$/g, '').split(/\\s+/);\r\n\t},\r\n\r\n\r\n\t// The className parameter (str) can only contain a single class name\r\n\thasClass : function (elm, className) {\r\n\t\tif (!className) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (elm.classList !== undefined) {\r\n\t\t\treturn elm.classList.contains(className);\r\n\t\t}\r\n\t\t// polyfill\r\n\t\treturn -1 != (' ' + elm.className.replace(/\\s+/g, ' ') + ' ').indexOf(' ' + className + ' ');\r\n\t},\r\n\r\n\r\n\t// The className parameter (str) can contain multiple class names separated by whitespace\r\n\taddClass : function (elm, className) {\r\n\t\tvar classNames = jsc.strList(className);\r\n\r\n\t\tif (elm.classList !== undefined) {\r\n\t\t\tfor (var i = 0; i < classNames.length; i += 1) {\r\n\t\t\t\telm.classList.add(classNames[i]);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// polyfill\r\n\t\tfor (var i = 0; i < classNames.length; i += 1) {\r\n\t\t\tif (!jsc.hasClass(elm, classNames[i])) {\r\n\t\t\t\telm.className += (elm.className ? ' ' : '') + classNames[i];\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t// The className parameter (str) can contain multiple class names separated by whitespace\r\n\tremoveClass : function (elm, className) {\r\n\t\tvar classNames = jsc.strList(className);\r\n\r\n\t\tif (elm.classList !== undefined) {\r\n\t\t\tfor (var i = 0; i < classNames.length; i += 1) {\r\n\t\t\t\telm.classList.remove(classNames[i]);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// polyfill\r\n\t\tfor (var i = 0; i < classNames.length; i += 1) {\r\n\t\t\tvar repl = new RegExp(\r\n\t\t\t\t'^\\\\s*' + classNames[i] + '\\\\s*|' +\r\n\t\t\t\t'\\\\s*' + classNames[i] + '\\\\s*$|' +\r\n\t\t\t\t'\\\\s+' + classNames[i] + '(\\\\s+)',\r\n\t\t\t\t'g'\r\n\t\t\t);\r\n\t\t\telm.className = elm.className.replace(repl, '$1');\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tgetCompStyle : function (elm) {\r\n\t\tvar compStyle = window.getComputedStyle ? window.getComputedStyle(elm) : elm.currentStyle;\r\n\r\n\t\t// Note: In Firefox, getComputedStyle returns null in a hidden iframe,\r\n\t\t// that's why we need to check if the returned value is non-empty\r\n\t\tif (!compStyle) {\r\n\t\t\treturn {};\r\n\t\t}\r\n\t\treturn compStyle;\r\n\t},\r\n\r\n\r\n\t// Note:\r\n\t// Setting a property to NULL reverts it to the state before it was first set\r\n\t// with the 'reversible' flag enabled\r\n\t//\r\n\tsetStyle : function (elm, styles, important, reversible) {\r\n\t\t// using '' for standard priority (IE10 apparently doesn't like value undefined)\r\n\t\tvar priority = important ? 'important' : '';\r\n\t\tvar origStyle = null;\r\n\r\n\t\tfor (var prop in styles) {\r\n\t\t\tif (styles.hasOwnProperty(prop)) {\r\n\t\t\t\tvar setVal = null;\r\n\r\n\t\t\t\tif (styles[prop] === null) {\r\n\t\t\t\t\t// reverting a property value\r\n\r\n\t\t\t\t\tif (!origStyle) {\r\n\t\t\t\t\t\t// get the original style object, but dont't try to create it if it doesn't exist\r\n\t\t\t\t\t\torigStyle = jsc.getData(elm, 'origStyle');\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (origStyle && origStyle.hasOwnProperty(prop)) {\r\n\t\t\t\t\t\t// we have property's original value -> use it\r\n\t\t\t\t\t\tsetVal = origStyle[prop];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// setting a property value\r\n\r\n\t\t\t\t\tif (reversible) {\r\n\t\t\t\t\t\tif (!origStyle) {\r\n\t\t\t\t\t\t\t// get the original style object and if it doesn't exist, create it\r\n\t\t\t\t\t\t\torigStyle = jsc.getData(elm, 'origStyle', {});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!origStyle.hasOwnProperty(prop)) {\r\n\t\t\t\t\t\t\t// original property value not yet stored -> store it\r\n\t\t\t\t\t\t\torigStyle[prop] = elm.style[prop];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tsetVal = styles[prop];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (setVal !== null) {\r\n\t\t\t\t\telm.style.setProperty(prop, setVal, priority);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\thexColor : function (r, g, b) {\r\n\t\treturn '#' + (\r\n\t\t\t('0' + Math.round(r).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(g).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(b).toString(16)).substr(-2)\r\n\t\t).toUpperCase();\r\n\t},\r\n\r\n\r\n\thexaColor : function (r, g, b, a) {\r\n\t\treturn '#' + (\r\n\t\t\t('0' + Math.round(r).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(g).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(b).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(a * 255).toString(16)).substr(-2)\r\n\t\t).toUpperCase();\r\n\t},\r\n\r\n\r\n\trgbColor : function (r, g, b) {\r\n\t\treturn 'rgb(' +\r\n\t\t\tMath.round(r) + ',' +\r\n\t\t\tMath.round(g) + ',' +\r\n\t\t\tMath.round(b) +\r\n\t\t')';\r\n\t},\r\n\r\n\r\n\trgbaColor : function (r, g, b, a) {\r\n\t\treturn 'rgba(' +\r\n\t\t\tMath.round(r) + ',' +\r\n\t\t\tMath.round(g) + ',' +\r\n\t\t\tMath.round(b) + ',' +\r\n\t\t\t(Math.round((a===undefined || a===null ? 1 : a) * 100) / 100) +\r\n\t\t')';\r\n\t},\r\n\r\n\r\n\tlinearGradient : (function () {\r\n\r\n\t\tfunction getFuncName () {\r\n\t\t\tvar stdName = 'linear-gradient';\r\n\t\t\tvar prefixes = ['', '-webkit-', '-moz-', '-o-', '-ms-'];\r\n\t\t\tvar helper = window.document.createElement('div');\r\n\r\n\t\t\tfor (var i = 0; i < prefixes.length; i += 1) {\r\n\t\t\t\tvar tryFunc = prefixes[i] + stdName;\r\n\t\t\t\tvar tryVal = tryFunc + '(to right, rgba(0,0,0,0), rgba(0,0,0,0))';\r\n\r\n\t\t\t\thelper.style.background = tryVal;\r\n\t\t\t\tif (helper.style.background) { // CSS background successfully set -> function name is supported\r\n\t\t\t\t\treturn tryFunc;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn stdName; // fallback to standard 'linear-gradient' without vendor prefix\r\n\t\t}\r\n\r\n\t\tvar funcName = getFuncName();\r\n\r\n\t\treturn function () {\r\n\t\t\treturn funcName + '(' + Array.prototype.join.call(arguments, ', ') + ')';\r\n\t\t};\r\n\r\n\t})(),\r\n\r\n\r\n\tsetBorderRadius : function (elm, value) {\r\n\t\tjsc.setStyle(elm, {'border-radius' : value || '0'});\r\n\t},\r\n\r\n\r\n\tsetBoxShadow : function (elm, value) {\r\n\t\tjsc.setStyle(elm, {'box-shadow': value || 'none'});\r\n\t},\r\n\r\n\r\n\tgetElementPos : function (e, relativeToViewport) {\r\n\t\tvar x=0, y=0;\r\n\t\tvar rect = e.getBoundingClientRect();\r\n\t\tx = rect.left;\r\n\t\ty = rect.top;\r\n\t\tif (!relativeToViewport) {\r\n\t\t\tvar viewPos = jsc.getViewPos();\r\n\t\t\tx += viewPos[0];\r\n\t\t\ty += viewPos[1];\r\n\t\t}\r\n\t\treturn [x, y];\r\n\t},\r\n\r\n\r\n\tgetElementSize : function (e) {\r\n\t\treturn [e.offsetWidth, e.offsetHeight];\r\n\t},\r\n\r\n\r\n\t// get pointer's X/Y coordinates relative to viewport\r\n\tgetAbsPointerPos : function (e) {\r\n\t\tvar x = 0, y = 0;\r\n\t\tif (typeof e.changedTouches !== 'undefined' && e.changedTouches.length) {\r\n\t\t\t// touch devices\r\n\t\t\tx = e.changedTouches[0].clientX;\r\n\t\t\ty = e.changedTouches[0].clientY;\r\n\t\t} else if (typeof e.clientX === 'number') {\r\n\t\t\tx = e.clientX;\r\n\t\t\ty = e.clientY;\r\n\t\t}\r\n\t\treturn { x: x, y: y };\r\n\t},\r\n\r\n\r\n\t// get pointer's X/Y coordinates relative to target element\r\n\tgetRelPointerPos : function (e) {\r\n\t\tvar target = e.target || e.srcElement;\r\n\t\tvar targetRect = target.getBoundingClientRect();\r\n\r\n\t\tvar x = 0, y = 0;\r\n\r\n\t\tvar clientX = 0, clientY = 0;\r\n\t\tif (typeof e.changedTouches !== 'undefined' && e.changedTouches.length) {\r\n\t\t\t// touch devices\r\n\t\t\tclientX = e.changedTouches[0].clientX;\r\n\t\t\tclientY = e.changedTouches[0].clientY;\r\n\t\t} else if (typeof e.clientX === 'number') {\r\n\t\t\tclientX = e.clientX;\r\n\t\t\tclientY = e.clientY;\r\n\t\t}\r\n\r\n\t\tx = clientX - targetRect.left;\r\n\t\ty = clientY - targetRect.top;\r\n\t\treturn { x: x, y: y };\r\n\t},\r\n\r\n\r\n\tgetViewPos : function () {\r\n\t\tvar doc = window.document.documentElement;\r\n\t\treturn [\r\n\t\t\t(window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0),\r\n\t\t\t(window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0)\r\n\t\t];\r\n\t},\r\n\r\n\r\n\tgetViewSize : function () {\r\n\t\tvar doc = window.document.documentElement;\r\n\t\treturn [\r\n\t\t\t(window.innerWidth || doc.clientWidth),\r\n\t\t\t(window.innerHeight || doc.clientHeight),\r\n\t\t];\r\n\t},\r\n\r\n\r\n\t// r: 0-255\r\n\t// g: 0-255\r\n\t// b: 0-255\r\n\t//\r\n\t// returns: [ 0-360, 0-100, 0-100 ]\r\n\t//\r\n\tRGB_HSV : function (r, g, b) {\r\n\t\tr /= 255;\r\n\t\tg /= 255;\r\n\t\tb /= 255;\r\n\t\tvar n = Math.min(Math.min(r,g),b);\r\n\t\tvar v = Math.max(Math.max(r,g),b);\r\n\t\tvar m = v - n;\r\n\t\tif (m === 0) { return [ null, 0, 100 * v ]; }\r\n\t\tvar h = r===n ? 3+(b-g)/m : (g===n ? 5+(r-b)/m : 1+(g-r)/m);\r\n\t\treturn [\r\n\t\t\t60 * (h===6?0:h),\r\n\t\t\t100 * (m/v),\r\n\t\t\t100 * v\r\n\t\t];\r\n\t},\r\n\r\n\r\n\t// h: 0-360\r\n\t// s: 0-100\r\n\t// v: 0-100\r\n\t//\r\n\t// returns: [ 0-255, 0-255, 0-255 ]\r\n\t//\r\n\tHSV_RGB : function (h, s, v) {\r\n\t\tvar u = 255 * (v / 100);\r\n\r\n\t\tif (h === null) {\r\n\t\t\treturn [ u, u, u ];\r\n\t\t}\r\n\r\n\t\th /= 60;\r\n\t\ts /= 100;\r\n\r\n\t\tvar i = Math.floor(h);\r\n\t\tvar f = i%2 ? h-i : 1-(h-i);\r\n\t\tvar m = u * (1 - s);\r\n\t\tvar n = u * (1 - s * f);\r\n\t\tswitch (i) {\r\n\t\t\tcase 6:\r\n\t\t\tcase 0: return [u,n,m];\r\n\t\t\tcase 1: return [n,u,m];\r\n\t\t\tcase 2: return [m,u,n];\r\n\t\t\tcase 3: return [m,n,u];\r\n\t\t\tcase 4: return [n,m,u];\r\n\t\t\tcase 5: return [u,m,n];\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tparseColorString : function (str) {\r\n\t\tvar ret = {\r\n\t\t\trgba: null,\r\n\t\t\tformat: null // 'hex' | 'hexa' | 'rgb' | 'rgba'\r\n\t\t};\r\n\r\n\t\tvar m;\r\n\r\n\t\tif (m = str.match(/^\\W*([0-9A-F]{3,8})\\W*$/i)) {\r\n\t\t\t// HEX notation\r\n\r\n\t\t\tif (m[1].length === 8) {\r\n\t\t\t\t// 8-char notation (= with alpha)\r\n\t\t\t\tret.format = 'hexa';\r\n\t\t\t\tret.rgba = [\r\n\t\t\t\t\tparseInt(m[1].substr(0,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(2,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(4,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(6,2),16) / 255\r\n\t\t\t\t];\r\n\r\n\t\t\t} else if (m[1].length === 6) {\r\n\t\t\t\t// 6-char notation\r\n\t\t\t\tret.format = 'hex';\r\n\t\t\t\tret.rgba = [\r\n\t\t\t\t\tparseInt(m[1].substr(0,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(2,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(4,2),16),\r\n\t\t\t\t\tnull\r\n\t\t\t\t];\r\n\r\n\t\t\t} else if (m[1].length === 3) {\r\n\t\t\t\t// 3-char notation\r\n\t\t\t\tret.format = 'hex';\r\n\t\t\t\tret.rgba = [\r\n\t\t\t\t\tparseInt(m[1].charAt(0) + m[1].charAt(0),16),\r\n\t\t\t\t\tparseInt(m[1].charAt(1) + m[1].charAt(1),16),\r\n\t\t\t\t\tparseInt(m[1].charAt(2) + m[1].charAt(2),16),\r\n\t\t\t\t\tnull\r\n\t\t\t\t];\r\n\r\n\t\t\t} else {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\treturn ret;\r\n\t\t}\r\n\r\n\t\tif (m = str.match(/^\\W*rgba?\\(([^)]*)\\)\\W*$/i)) {\r\n\t\t\t// rgb(...) or rgba(...) notation\r\n\r\n\t\t\tvar par = m[1].split(',');\r\n\t\t\tvar re = /^\\s*(\\d+|\\d*\\.\\d+|\\d+\\.\\d*)\\s*$/;\r\n\t\t\tvar mR, mG, mB, mA;\r\n\t\t\tif (\r\n\t\t\t\tpar.length >= 3 &&\r\n\t\t\t\t(mR = par[0].match(re)) &&\r\n\t\t\t\t(mG = par[1].match(re)) &&\r\n\t\t\t\t(mB = par[2].match(re))\r\n\t\t\t) {\r\n\t\t\t\tret.format = 'rgb';\r\n\t\t\t\tret.rgba = [\r\n\t\t\t\t\tparseFloat(mR[1]) || 0,\r\n\t\t\t\t\tparseFloat(mG[1]) || 0,\r\n\t\t\t\t\tparseFloat(mB[1]) || 0,\r\n\t\t\t\t\tnull\r\n\t\t\t\t];\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tpar.length >= 4 &&\r\n\t\t\t\t\t(mA = par[3].match(re))\r\n\t\t\t\t) {\r\n\t\t\t\t\tret.format = 'rgba';\r\n\t\t\t\t\tret.rgba[3] = parseFloat(mA[1]) || 0;\r\n\t\t\t\t}\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\r\n\tparsePaletteValue : function (mixed) {\r\n\t\tvar vals = [];\r\n\r\n\t\tif (typeof mixed === 'string') { // input is a string of space separated color values\r\n\t\t\t// rgb() and rgba() may contain spaces too, so let's find all color values by regex\r\n\t\t\tmixed.replace(/#[0-9A-F]{3}([0-9A-F]{3})?|rgba?\\(([^)]*)\\)/ig, function (val) {\r\n\t\t\t\tvals.push(val);\r\n\t\t\t});\r\n\t\t} else if (Array.isArray(mixed)) { // input is an array of color values\r\n\t\t\tvals = mixed;\r\n\t\t}\r\n\r\n\t\t// convert all values into uniform color format\r\n\r\n\t\tvar colors = [];\r\n\r\n\t\tfor (var i = 0; i < vals.length; i++) {\r\n\t\t\tvar color = jsc.parseColorString(vals[i]);\r\n\t\t\tif (color) {\r\n\t\t\t\tcolors.push(color);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn colors;\r\n\t},\r\n\r\n\r\n\tcontainsTranparentColor : function (colors) {\r\n\t\tfor (var i = 0; i < colors.length; i++) {\r\n\t\t\tvar a = colors[i].rgba[3];\r\n\t\t\tif (a !== null && a < 1.0) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\r\n\tisAlphaFormat : function (format) {\r\n\t\tswitch (format.toLowerCase()) {\r\n\t\tcase 'hexa':\r\n\t\tcase 'rgba':\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\r\n\t// Canvas scaling for retina displays\r\n\t//\r\n\t// adapted from https://www.html5rocks.com/en/tutorials/canvas/hidpi/\r\n\t//\r\n\tscaleCanvasForHighDPR : function (canvas) {\r\n\t\tvar dpr = window.devicePixelRatio || 1;\r\n\t\tcanvas.width *= dpr;\r\n\t\tcanvas.height *= dpr;\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\t\tctx.scale(dpr, dpr);\r\n\t},\r\n\r\n\r\n\tgenColorPreviewCanvas : function (color, separatorPos, specWidth, scaleForHighDPR) {\r\n\r\n\t\tvar sepW = Math.round(jsc.pub.previewSeparator.length);\r\n\t\tvar sqSize = jsc.pub.chessboardSize;\r\n\t\tvar sqColor1 = jsc.pub.chessboardColor1;\r\n\t\tvar sqColor2 = jsc.pub.chessboardColor2;\r\n\r\n\t\tvar cWidth = specWidth ? specWidth : sqSize * 2;\r\n\t\tvar cHeight = sqSize * 2;\r\n\r\n\t\tvar canvas = jsc.createEl('canvas');\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\r\n\t\tcanvas.width = cWidth;\r\n\t\tcanvas.height = cHeight;\r\n\t\tif (scaleForHighDPR) {\r\n\t\t\tjsc.scaleCanvasForHighDPR(canvas);\r\n\t\t}\r\n\r\n\t\t// transparency chessboard - background\r\n\t\tctx.fillStyle = sqColor1;\r\n\t\tctx.fillRect(0, 0, cWidth, cHeight);\r\n\r\n\t\t// transparency chessboard - squares\r\n\t\tctx.fillStyle = sqColor2;\r\n\t\tfor (var x = 0; x < cWidth; x += sqSize * 2) {\r\n\t\t\tctx.fillRect(x, 0, sqSize, sqSize);\r\n\t\t\tctx.fillRect(x + sqSize, sqSize, sqSize, sqSize);\r\n\t\t}\r\n\r\n\t\tif (color) {\r\n\t\t\t// actual color in foreground\r\n\t\t\tctx.fillStyle = color;\r\n\t\t\tctx.fillRect(0, 0, cWidth, cHeight);\r\n\t\t}\r\n\r\n\t\tvar start = null;\r\n\t\tswitch (separatorPos) {\r\n\t\t\tcase 'left':\r\n\t\t\t\tstart = 0;\r\n\t\t\t\tctx.clearRect(0, 0, sepW/2, cHeight);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'right':\r\n\t\t\t\tstart = cWidth - sepW;\r\n\t\t\t\tctx.clearRect(cWidth - (sepW/2), 0, sepW/2, cHeight);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tif (start !== null) {\r\n\t\t\tctx.lineWidth = 1;\r\n\t\t\tfor (var i = 0; i < jsc.pub.previewSeparator.length; i += 1) {\r\n\t\t\t\tctx.beginPath();\r\n\t\t\t\tctx.strokeStyle = jsc.pub.previewSeparator[i];\r\n\t\t\t\tctx.moveTo(0.5 + start + i, 0);\r\n\t\t\t\tctx.lineTo(0.5 + start + i, cHeight);\r\n\t\t\t\tctx.stroke();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tcanvas: canvas,\r\n\t\t\twidth: cWidth,\r\n\t\t\theight: cHeight,\r\n\t\t};\r\n\t},\r\n\r\n\r\n\t// if position or width is not set => fill the entire element (0%-100%)\r\n\tgenColorPreviewGradient : function (color, position, width) {\r\n\t\tvar params = [];\r\n\r\n\t\tif (position && width) {\r\n\t\t\tparams = [\r\n\t\t\t\t'to ' + {'left':'right', 'right':'left'}[position],\r\n\t\t\t\tcolor + ' 0%',\r\n\t\t\t\tcolor + ' ' + width + 'px',\r\n\t\t\t\t'rgba(0,0,0,0) ' + (width + 1) + 'px',\r\n\t\t\t\t'rgba(0,0,0,0) 100%',\r\n\t\t\t];\r\n\t\t} else {\r\n\t\t\tparams = [\r\n\t\t\t\t'to right',\r\n\t\t\t\tcolor + ' 0%',\r\n\t\t\t\tcolor + ' 100%',\r\n\t\t\t];\r\n\t\t}\r\n\r\n\t\treturn jsc.linearGradient.apply(this, params);\r\n\t},\r\n\r\n\r\n\tredrawPosition : function () {\r\n\r\n\t\tif (!jsc.picker || !jsc.picker.owner) {\r\n\t\t\treturn; // picker is not shown\r\n\t\t}\r\n\r\n\t\tvar thisObj = jsc.picker.owner;\r\n\r\n\t\tvar tp, vp;\r\n\r\n\t\tif (thisObj.fixed) {\r\n\t\t\t// Fixed elements are positioned relative to viewport,\r\n\t\t\t// therefore we can ignore the scroll offset\r\n\t\t\ttp = jsc.getElementPos(thisObj.targetElement, true); // target pos\r\n\t\t\tvp = [0, 0]; // view pos\r\n\t\t} else {\r\n\t\t\ttp = jsc.getElementPos(thisObj.targetElement); // target pos\r\n\t\t\tvp = jsc.getViewPos(); // view pos\r\n\t\t}\r\n\r\n\t\tvar ts = jsc.getElementSize(thisObj.targetElement); // target size\r\n\t\tvar vs = jsc.getViewSize(); // view size\r\n\t\tvar pd = jsc.getPickerDims(thisObj);\r\n\t\tvar ps = [pd.borderW, pd.borderH]; // picker outer size\r\n\t\tvar a, b, c;\r\n\t\tswitch (thisObj.position.toLowerCase()) {\r\n\t\t\tcase 'left': a=1; b=0; c=-1; break;\r\n\t\t\tcase 'right':a=1; b=0; c=1; break;\r\n\t\t\tcase 'top': a=0; b=1; c=-1; break;\r\n\t\t\tdefault: a=0; b=1; c=1; break;\r\n\t\t}\r\n\t\tvar l = (ts[b]+ps[b])/2;\r\n\r\n\t\t// compute picker position\r\n\t\tif (!thisObj.smartPosition) {\r\n\t\t\tvar pp = [\r\n\t\t\t\ttp[a],\r\n\t\t\t\ttp[b]+ts[b]-l+l*c\r\n\t\t\t];\r\n\t\t} else {\r\n\t\t\tvar pp = [\r\n\t\t\t\t-vp[a]+tp[a]+ps[a] > vs[a] ?\r\n\t\t\t\t\t(-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) :\r\n\t\t\t\t\ttp[a],\r\n\t\t\t\t-vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ?\r\n\t\t\t\t\t(-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) :\r\n\t\t\t\t\t(tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c)\r\n\t\t\t];\r\n\t\t}\r\n\r\n\t\tvar x = pp[a];\r\n\t\tvar y = pp[b];\r\n\t\tvar positionValue = thisObj.fixed ? 'fixed' : 'absolute';\r\n\t\tvar contractShadow =\r\n\t\t\t(pp[0] + ps[0] > tp[0] || pp[0] < tp[0] + ts[0]) &&\r\n\t\t\t(pp[1] + ps[1] < tp[1] + ts[1]);\r\n\r\n\t\tjsc._drawPosition(thisObj, x, y, positionValue, contractShadow);\r\n\t},\r\n\r\n\r\n\t_drawPosition : function (thisObj, x, y, positionValue, contractShadow) {\r\n\t\tvar vShadow = contractShadow ? 0 : thisObj.shadowBlur; // px\r\n\r\n\t\tjsc.picker.wrap.style.position = positionValue;\r\n\t\tjsc.picker.wrap.style.left = x + 'px';\r\n\t\tjsc.picker.wrap.style.top = y + 'px';\r\n\r\n\t\tjsc.setBoxShadow(\r\n\t\t\tjsc.picker.boxS,\r\n\t\t\tthisObj.shadow ?\r\n\t\t\t\tnew jsc.BoxShadow(0, vShadow, thisObj.shadowBlur, 0, thisObj.shadowColor) :\r\n\t\t\t\tnull);\r\n\t},\r\n\r\n\r\n\tgetPickerDims : function (thisObj) {\r\n\t\tvar w = 2 * thisObj.controlBorderWidth + thisObj.width;\r\n\t\tvar h = 2 * thisObj.controlBorderWidth + thisObj.height;\r\n\r\n\t\tvar sliderSpace = 2 * thisObj.controlBorderWidth + 2 * jsc.getControlPadding(thisObj) + thisObj.sliderSize;\r\n\r\n\t\tif (jsc.getSliderChannel(thisObj)) {\r\n\t\t\tw += sliderSpace;\r\n\t\t}\r\n\t\tif (thisObj.hasAlphaChannel()) {\r\n\t\t\tw += sliderSpace;\r\n\t\t}\r\n\r\n\t\tvar pal = jsc.getPaletteDims(thisObj, w);\r\n\r\n\t\tif (pal.height) {\r\n\t\t\th += pal.height + thisObj.padding;\r\n\t\t}\r\n\t\tif (thisObj.closeButton) {\r\n\t\t\th += 2 * thisObj.controlBorderWidth + thisObj.padding + thisObj.buttonHeight;\r\n\t\t}\r\n\r\n\t\tvar pW = w + (2 * thisObj.padding);\r\n\t\tvar pH = h + (2 * thisObj.padding);\r\n\r\n\t\treturn {\r\n\t\t\tcontentW: w,\r\n\t\t\tcontentH: h,\r\n\t\t\tpaddedW: pW,\r\n\t\t\tpaddedH: pH,\r\n\t\t\tborderW: pW + (2 * thisObj.borderWidth),\r\n\t\t\tborderH: pH + (2 * thisObj.borderWidth),\r\n\t\t\tpalette: pal,\r\n\t\t};\r\n\t},\r\n\r\n\r\n\tgetPaletteDims : function (thisObj, width) {\r\n\t\tvar cols = 0, rows = 0, cellW = 0, cellH = 0, height = 0;\r\n\t\tvar sampleCount = thisObj._palette ? thisObj._palette.length : 0;\r\n\r\n\t\tif (sampleCount) {\r\n\t\t\tcols = thisObj.paletteCols;\r\n\t\t\trows = cols > 0 ? Math.ceil(sampleCount / cols) : 0;\r\n\r\n\t\t\t// color sample's dimensions (includes border)\r\n\t\t\tcellW = Math.max(1, Math.floor((width - ((cols - 1) * thisObj.paletteSpacing)) / cols));\r\n\t\t\tcellH = thisObj.paletteHeight ? Math.min(thisObj.paletteHeight, cellW) : cellW;\r\n\t\t}\r\n\r\n\t\tif (rows) {\r\n\t\t\theight =\r\n\t\t\t\trows * cellH +\r\n\t\t\t\t(rows - 1) * thisObj.paletteSpacing;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tcols: cols,\r\n\t\t\trows: rows,\r\n\t\t\tcellW: cellW,\r\n\t\t\tcellH: cellH,\r\n\t\t\twidth: width,\r\n\t\t\theight: height,\r\n\t\t};\r\n\t},\r\n\r\n\r\n\tgetControlPadding : function (thisObj) {\r\n\t\treturn Math.max(\r\n\t\t\tthisObj.padding / 2,\r\n\t\t\t(2 * thisObj.pointerBorderWidth + thisObj.pointerThickness) - thisObj.controlBorderWidth\r\n\t\t);\r\n\t},\r\n\r\n\r\n\tgetPadYChannel : function (thisObj) {\r\n\t\tswitch (thisObj.mode.charAt(1).toLowerCase()) {\r\n\t\t\tcase 'v': return 'v'; break;\r\n\t\t}\r\n\t\treturn 's';\r\n\t},\r\n\r\n\r\n\tgetSliderChannel : function (thisObj) {\r\n\t\tif (thisObj.mode.length > 2) {\r\n\t\t\tswitch (thisObj.mode.charAt(2).toLowerCase()) {\r\n\t\t\t\tcase 's': return 's'; break;\r\n\t\t\t\tcase 'v': return 'v'; break;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t},\r\n\r\n\r\n\t// calls function specified in picker's property\r\n\ttriggerCallback : function (thisObj, prop) {\r\n\t\tif (!thisObj[prop]) {\r\n\t\t\treturn; // callback func not specified\r\n\t\t}\r\n\t\tvar callback = null;\r\n\r\n\t\tif (typeof thisObj[prop] === 'string') {\r\n\t\t\t// string with code\r\n\t\t\ttry {\r\n\t\t\t\tcallback = new Function (thisObj[prop]);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tconsole.error(e);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// function\r\n\t\t\tcallback = thisObj[prop];\r\n\t\t}\r\n\r\n\t\tif (callback) {\r\n\t\t\tcallback.call(thisObj);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t// Triggers a color change related event(s) on all picker instances.\r\n\t// It is possible to specify multiple events separated with a space.\r\n\ttriggerGlobal : function (eventNames) {\r\n\t\tvar inst = jsc.getInstances();\r\n\t\tfor (var i = 0; i < inst.length; i += 1) {\r\n\t\t\tinst[i].trigger(eventNames);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t_pointerMoveEvent : {\r\n\t\tmouse: 'mousemove',\r\n\t\ttouch: 'touchmove'\r\n\t},\r\n\t_pointerEndEvent : {\r\n\t\tmouse: 'mouseup',\r\n\t\ttouch: 'touchend'\r\n\t},\r\n\r\n\r\n\t_pointerOrigin : null,\r\n\t_capturedTarget : null,\r\n\r\n\r\n\tonDocumentKeyUp : function (e) {\r\n\t\tif (['Tab', 'Escape'].indexOf(jsc.eventKey(e)) !== -1) {\r\n\t\t\tif (jsc.picker && jsc.picker.owner) {\r\n\t\t\t\tjsc.picker.owner.tryHide();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonWindowResize : function (e) {\r\n\t\tjsc.redrawPosition();\r\n\t},\r\n\r\n\r\n\tonWindowScroll : function (e) {\r\n\t\tjsc.redrawPosition();\r\n\t},\r\n\r\n\r\n\tonParentScroll : function (e) {\r\n\t\t// hide the picker when one of the parent elements is scrolled\r\n\t\tif (jsc.picker && jsc.picker.owner) {\r\n\t\t\tjsc.picker.owner.tryHide();\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonDocumentMouseDown : function (e) {\r\n\t\tvar target = e.target || e.srcElement;\r\n\r\n\t\tif (target.jscolor && target.jscolor instanceof jsc.pub) { // clicked targetElement -> show picker\r\n\t\t\tif (target.jscolor.showOnClick && !target.disabled) {\r\n\t\t\t\ttarget.jscolor.show();\r\n\t\t\t}\r\n\t\t} else if (jsc.getData(target, 'gui')) { // clicked jscolor's GUI element\r\n\t\t\tvar control = jsc.getData(target, 'control');\r\n\t\t\tif (control) {\r\n\t\t\t\t// jscolor's control\r\n\t\t\t\tjsc.onControlPointerStart(e, target, jsc.getData(target, 'control'), 'mouse');\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// mouse is outside the picker's controls -> hide the color picker!\r\n\t\t\tif (jsc.picker && jsc.picker.owner) {\r\n\t\t\t\tjsc.picker.owner.tryHide();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonPickerTouchStart : function (e) {\r\n\t\tvar target = e.target || e.srcElement;\r\n\r\n\t\tif (jsc.getData(target, 'control')) {\r\n\t\t\tjsc.onControlPointerStart(e, target, jsc.getData(target, 'control'), 'touch');\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonControlPointerStart : function (e, target, controlName, pointerType) {\r\n\t\tvar thisObj = jsc.getData(target, 'instance');\r\n\r\n\t\tjsc.preventDefault(e);\r\n\t\tjsc.captureTarget(target);\r\n\r\n\t\tvar registerDragEvents = function (doc, offset) {\r\n\t\t\tjsc.attachGroupEvent('drag', doc, jsc._pointerMoveEvent[pointerType],\r\n\t\t\t\tjsc.onDocumentPointerMove(e, target, controlName, pointerType, offset));\r\n\t\t\tjsc.attachGroupEvent('drag', doc, jsc._pointerEndEvent[pointerType],\r\n\t\t\t\tjsc.onDocumentPointerEnd(e, target, controlName, pointerType));\r\n\t\t};\r\n\r\n\t\tregisterDragEvents(window.document, [0, 0]);\r\n\r\n\t\tif (window.parent && window.frameElement) {\r\n\t\t\tvar rect = window.frameElement.getBoundingClientRect();\r\n\t\t\tvar ofs = [-rect.left, -rect.top];\r\n\t\t\tregisterDragEvents(window.parent.window.document, ofs);\r\n\t\t}\r\n\r\n\t\tvar abs = jsc.getAbsPointerPos(e);\r\n\t\tvar rel = jsc.getRelPointerPos(e);\r\n\t\tjsc._pointerOrigin = {\r\n\t\t\tx: abs.x - rel.x,\r\n\t\t\ty: abs.y - rel.y\r\n\t\t};\r\n\r\n\t\tswitch (controlName) {\r\n\t\tcase 'pad':\r\n\t\t\t// if the value slider is at the bottom, move it up\r\n\t\t\tif (jsc.getSliderChannel(thisObj) === 'v' && thisObj.channels.v === 0) {\r\n\t\t\t\tthisObj.fromHSVA(null, null, 100, null);\r\n\t\t\t}\r\n\t\t\tjsc.setPad(thisObj, e, 0, 0);\r\n\t\t\tbreak;\r\n\r\n\t\tcase 'sld':\r\n\t\t\tjsc.setSld(thisObj, e, 0);\r\n\t\t\tbreak;\r\n\r\n\t\tcase 'asld':\r\n\t\t\tjsc.setASld(thisObj, e, 0);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tthisObj.trigger('input');\r\n\t},\r\n\r\n\r\n\tonDocumentPointerMove : function (e, target, controlName, pointerType, offset) {\r\n\t\treturn function (e) {\r\n\t\t\tvar thisObj = jsc.getData(target, 'instance');\r\n\t\t\tswitch (controlName) {\r\n\t\t\tcase 'pad':\r\n\t\t\t\tjsc.setPad(thisObj, e, offset[0], offset[1]);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'sld':\r\n\t\t\t\tjsc.setSld(thisObj, e, offset[1]);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'asld':\r\n\t\t\t\tjsc.setASld(thisObj, e, offset[1]);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tthisObj.trigger('input');\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonDocumentPointerEnd : function (e, target, controlName, pointerType) {\r\n\t\treturn function (e) {\r\n\t\t\tvar thisObj = jsc.getData(target, 'instance');\r\n\t\t\tjsc.detachGroupEvents('drag');\r\n\t\t\tjsc.releaseTarget();\r\n\r\n\t\t\t// Always trigger changes AFTER detaching outstanding mouse handlers,\r\n\t\t\t// in case some color change that occured in user-defined onChange/onInput handler\r\n\t\t\t// intruded into current mouse events\r\n\t\t\tthisObj.trigger('input');\r\n\t\t\tthisObj.trigger('change');\r\n\t\t};\r\n\t},\r\n\r\n\r\n\tonPaletteSampleClick : function (e) {\r\n\t\tvar target = e.currentTarget;\r\n\t\tvar thisObj = jsc.getData(target, 'instance');\r\n\t\tvar color = jsc.getData(target, 'color');\r\n\r\n\t\t// when format is flexible, use the original format of this color sample\r\n\t\tif (thisObj.format.toLowerCase() === 'any') {\r\n\t\t\tthisObj._setFormat(color.format); // adapt format\r\n\t\t\tif (!jsc.isAlphaFormat(thisObj.getFormat())) {\r\n\t\t\t\tcolor.rgba[3] = 1.0; // when switching to a format that doesn't support alpha, set full opacity\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// if this color doesn't specify alpha, use alpha of 1.0 (if applicable)\r\n\t\tif (color.rgba[3] === null) {\r\n\t\t\tif (thisObj.paletteSetsAlpha === true || (thisObj.paletteSetsAlpha === 'auto' && thisObj._paletteHasTransparency)) {\r\n\t\t\t\tcolor.rgba[3] = 1.0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthisObj.fromRGBA.apply(thisObj, color.rgba);\r\n\r\n\t\tthisObj.trigger('input');\r\n\t\tthisObj.trigger('change');\r\n\r\n\t\tif (thisObj.hideOnPaletteClick) {\r\n\t\t\tthisObj.hide();\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tsetPad : function (thisObj, e, ofsX, ofsY) {\r\n\t\tvar pointerAbs = jsc.getAbsPointerPos(e);\r\n\t\tvar x = ofsX + pointerAbs.x - jsc._pointerOrigin.x - thisObj.padding - thisObj.controlBorderWidth;\r\n\t\tvar y = ofsY + pointerAbs.y - jsc._pointerOrigin.y - thisObj.padding - thisObj.controlBorderWidth;\r\n\r\n\t\tvar xVal = x * (360 / (thisObj.width - 1));\r\n\t\tvar yVal = 100 - (y * (100 / (thisObj.height - 1)));\r\n\r\n\t\tswitch (jsc.getPadYChannel(thisObj)) {\r\n\t\tcase 's': thisObj.fromHSVA(xVal, yVal, null, null); break;\r\n\t\tcase 'v': thisObj.fromHSVA(xVal, null, yVal, null); break;\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tsetSld : function (thisObj, e, ofsY) {\r\n\t\tvar pointerAbs = jsc.getAbsPointerPos(e);\r\n\t\tvar y = ofsY + pointerAbs.y - jsc._pointerOrigin.y - thisObj.padding - thisObj.controlBorderWidth;\r\n\t\tvar yVal = 100 - (y * (100 / (thisObj.height - 1)));\r\n\r\n\t\tswitch (jsc.getSliderChannel(thisObj)) {\r\n\t\tcase 's': thisObj.fromHSVA(null, yVal, null, null); break;\r\n\t\tcase 'v': thisObj.fromHSVA(null, null, yVal, null); break;\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tsetASld : function (thisObj, e, ofsY) {\r\n\t\tvar pointerAbs = jsc.getAbsPointerPos(e);\r\n\t\tvar y = ofsY + pointerAbs.y - jsc._pointerOrigin.y - thisObj.padding - thisObj.controlBorderWidth;\r\n\t\tvar yVal = 1.0 - (y * (1.0 / (thisObj.height - 1)));\r\n\r\n\t\tif (yVal < 1.0) {\r\n\t\t\t// if format is flexible and the current format doesn't support alpha, switch to a suitable one\r\n\t\t\tvar fmt = thisObj.getFormat();\r\n\t\t\tif (thisObj.format.toLowerCase() === 'any' && !jsc.isAlphaFormat(fmt)) {\r\n\t\t\t\tthisObj._setFormat(fmt === 'hex' ? 'hexa' : 'rgba');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthisObj.fromHSVA(null, null, null, yVal);\r\n\t},\r\n\r\n\r\n\tcreatePadCanvas : function () {\r\n\r\n\t\tvar ret = {\r\n\t\t\telm: null,\r\n\t\t\tdraw: null\r\n\t\t};\r\n\r\n\t\tvar canvas = jsc.createEl('canvas');\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\r\n\t\tvar drawFunc = function (width, height, type) {\r\n\t\t\tcanvas.width = width;\r\n\t\t\tcanvas.height = height;\r\n\r\n\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tvar hGrad = ctx.createLinearGradient(0, 0, canvas.width, 0);\r\n\t\t\thGrad.addColorStop(0 / 6, '#F00');\r\n\t\t\thGrad.addColorStop(1 / 6, '#FF0');\r\n\t\t\thGrad.addColorStop(2 / 6, '#0F0');\r\n\t\t\thGrad.addColorStop(3 / 6, '#0FF');\r\n\t\t\thGrad.addColorStop(4 / 6, '#00F');\r\n\t\t\thGrad.addColorStop(5 / 6, '#F0F');\r\n\t\t\thGrad.addColorStop(6 / 6, '#F00');\r\n\r\n\t\t\tctx.fillStyle = hGrad;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tvar vGrad = ctx.createLinearGradient(0, 0, 0, canvas.height);\r\n\t\t\tswitch (type.toLowerCase()) {\r\n\t\t\tcase 's':\r\n\t\t\t\tvGrad.addColorStop(0, 'rgba(255,255,255,0)');\r\n\t\t\t\tvGrad.addColorStop(1, 'rgba(255,255,255,1)');\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'v':\r\n\t\t\t\tvGrad.addColorStop(0, 'rgba(0,0,0,0)');\r\n\t\t\t\tvGrad.addColorStop(1, 'rgba(0,0,0,1)');\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tctx.fillStyle = vGrad;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\t\t};\r\n\r\n\t\tret.elm = canvas;\r\n\t\tret.draw = drawFunc;\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\r\n\tcreateSliderGradient : function () {\r\n\r\n\t\tvar ret = {\r\n\t\t\telm: null,\r\n\t\t\tdraw: null\r\n\t\t};\r\n\r\n\t\tvar canvas = jsc.createEl('canvas');\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\r\n\t\tvar drawFunc = function (width, height, color1, color2) {\r\n\t\t\tcanvas.width = width;\r\n\t\t\tcanvas.height = height;\r\n\r\n\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tvar grad = ctx.createLinearGradient(0, 0, 0, canvas.height);\r\n\t\t\tgrad.addColorStop(0, color1);\r\n\t\t\tgrad.addColorStop(1, color2);\r\n\r\n\t\t\tctx.fillStyle = grad;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\t\t};\r\n\r\n\t\tret.elm = canvas;\r\n\t\tret.draw = drawFunc;\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\r\n\tcreateASliderGradient : function () {\r\n\r\n\t\tvar ret = {\r\n\t\t\telm: null,\r\n\t\t\tdraw: null\r\n\t\t};\r\n\r\n\t\tvar canvas = jsc.createEl('canvas');\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\r\n\t\tvar drawFunc = function (width, height, color) {\r\n\t\t\tcanvas.width = width;\r\n\t\t\tcanvas.height = height;\r\n\r\n\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tvar sqSize = canvas.width / 2;\r\n\t\t\tvar sqColor1 = jsc.pub.chessboardColor1;\r\n\t\t\tvar sqColor2 = jsc.pub.chessboardColor2;\r\n\r\n\t\t\t// dark gray background\r\n\t\t\tctx.fillStyle = sqColor1;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tif (sqSize > 0) { // to avoid infinite loop\r\n\t\t\t\tfor (var y = 0; y < canvas.height; y += sqSize * 2) {\r\n\t\t\t\t\t// light gray squares\r\n\t\t\t\t\tctx.fillStyle = sqColor2;\r\n\t\t\t\t\tctx.fillRect(0, y, sqSize, sqSize);\r\n\t\t\t\t\tctx.fillRect(sqSize, y + sqSize, sqSize, sqSize);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar grad = ctx.createLinearGradient(0, 0, 0, canvas.height);\r\n\t\t\tgrad.addColorStop(0, color);\r\n\t\t\tgrad.addColorStop(1, 'rgba(0,0,0,0)');\r\n\r\n\t\t\tctx.fillStyle = grad;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\t\t};\r\n\r\n\t\tret.elm = canvas;\r\n\t\tret.draw = drawFunc;\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\r\n\tBoxShadow : (function () {\r\n\t\tvar BoxShadow = function (hShadow, vShadow, blur, spread, color, inset) {\r\n\t\t\tthis.hShadow = hShadow;\r\n\t\t\tthis.vShadow = vShadow;\r\n\t\t\tthis.blur = blur;\r\n\t\t\tthis.spread = spread;\r\n\t\t\tthis.color = color;\r\n\t\t\tthis.inset = !!inset;\r\n\t\t};\r\n\r\n\t\tBoxShadow.prototype.toString = function () {\r\n\t\t\tvar vals = [\r\n\t\t\t\tMath.round(this.hShadow) + 'px',\r\n\t\t\t\tMath.round(this.vShadow) + 'px',\r\n\t\t\t\tMath.round(this.blur) + 'px',\r\n\t\t\t\tMath.round(this.spread) + 'px',\r\n\t\t\t\tthis.color\r\n\t\t\t];\r\n\t\t\tif (this.inset) {\r\n\t\t\t\tvals.push('inset');\r\n\t\t\t}\r\n\t\t\treturn vals.join(' ');\r\n\t\t};\r\n\r\n\t\treturn BoxShadow;\r\n\t})(),\r\n\r\n\r\n\tflags : {\r\n\t\tleaveValue : 1 << 0,\r\n\t\tleaveAlpha : 1 << 1,\r\n\t\tleavePreview : 1 << 2,\r\n\t},\r\n\r\n\r\n\tenumOpts : {\r\n\t\tformat: ['auto', 'any', 'hex', 'hexa', 'rgb', 'rgba'],\r\n\t\tpreviewPosition: ['left', 'right'],\r\n\t\tmode: ['hsv', 'hvs', 'hs', 'hv'],\r\n\t\tposition: ['left', 'right', 'top', 'bottom'],\r\n\t\talphaChannel: ['auto', true, false],\r\n\t\tpaletteSetsAlpha: ['auto', true, false],\r\n\t},\r\n\r\n\r\n\tdeprecatedOpts : {\r\n\t\t// <old_option>: <new_option> (<new_option> can be null)\r\n\t\t'styleElement': 'previewElement',\r\n\t\t'onFineChange': 'onInput',\r\n\t\t'overwriteImportant': 'forceStyle',\r\n\t\t'closable': 'closeButton',\r\n\t\t'insetWidth': 'controlBorderWidth',\r\n\t\t'insetColor': 'controlBorderColor',\r\n\t\t'refine': null,\r\n\t},\r\n\r\n\r\n\tdocsRef : ' ' + 'See https://jscolor.com/docs/',\r\n\r\n\r\n\t//\r\n\t// Usage:\r\n\t// var myPicker = new JSColor(<targetElement> [, <options>])\r\n\t//\r\n\t// (constructor is accessible via both 'jscolor' and 'JSColor' name)\r\n\t//\r\n\r\n\tpub : function (targetElement, opts) {\r\n\r\n\t\tvar THIS = this;\r\n\r\n\t\tif (!opts) {\r\n\t\t\topts = {};\r\n\t\t}\r\n\r\n\t\tthis.channels = {\r\n\t\t\tr: 255, // red [0-255]\r\n\t\t\tg: 255, // green [0-255]\r\n\t\t\tb: 255, // blue [0-255]\r\n\t\t\th: 0, // hue [0-360]\r\n\t\t\ts: 0, // saturation [0-100]\r\n\t\t\tv: 100, // value (brightness) [0-100]\r\n\t\t\ta: 1.0, // alpha (opacity) [0.0 - 1.0]\r\n\t\t};\r\n\r\n\t\t// General options\r\n\t\t//\r\n\t\tthis.format = 'auto'; // 'auto' | 'any' | 'hex' | 'hexa' | 'rgb' | 'rgba' - Format of the input/output value\r\n\t\tthis.value = undefined; // INITIAL color value in any supported format. To change it later, use method fromString(), fromHSVA(), fromRGBA() or channel()\r\n\t\tthis.alpha = undefined; // INITIAL alpha value. To change it later, call method channel('A', <value>)\r\n\t\tthis.random = false; // whether to randomize the initial color. Either true | false, or an array of ranges: [minV, maxV, minS, maxS, minH, maxH, minA, maxA]\r\n\t\tthis.onChange = undefined; // called when color changes. Value can be either a function or a string with JS code.\r\n\t\tthis.onInput = undefined; // called repeatedly as the color is being changed, e.g. while dragging a slider. Value can be either a function or a string with JS code.\r\n\t\tthis.valueElement = undefined; // element that will be used to display and input the color value\r\n\t\tthis.alphaElement = undefined; // element that will be used to display and input the alpha (opacity) value\r\n\t\tthis.previewElement = undefined; // element that will preview the picked color using CSS background\r\n\t\tthis.previewPosition = 'left'; // 'left' | 'right' - position of the color preview in previewElement\r\n\t\tthis.previewSize = 32; // (px) width of the color preview displayed in previewElement\r\n\t\tthis.previewPadding = 8; // (px) space between color preview and content of the previewElement\r\n\t\tthis.required = true; // whether the associated text input must always contain a color value. If false, the input can be left empty.\r\n\t\tthis.hash = true; // whether to prefix the HEX color code with # symbol (only applicable for HEX format)\r\n\t\tthis.uppercase = true; // whether to show the HEX color code in upper case (only applicable for HEX format)\r\n\t\tthis.forceStyle = true; // whether to overwrite CSS style of the previewElement using !important flag\r\n\r\n\t\t// Color Picker options\r\n\t\t//\r\n\t\tthis.width = 181; // width of the color spectrum (in px)\r\n\t\tthis.height = 101; // height of the color spectrum (in px)\r\n\t\tthis.mode = 'HSV'; // 'HSV' | 'HVS' | 'HS' | 'HV' - layout of the color picker controls\r\n\t\tthis.alphaChannel = 'auto'; // 'auto' | true | false - if alpha channel is enabled, the alpha slider will be visible. If 'auto', it will be determined according to color format\r\n\t\tthis.position = 'bottom'; // 'left' | 'right' | 'top' | 'bottom' - position relative to the target element\r\n\t\tthis.smartPosition = true; // automatically change picker position when there is not enough space for it\r\n\t\tthis.showOnClick = true; // whether to show the picker when user clicks its target element\r\n\t\tthis.hideOnLeave = true; // whether to automatically hide the picker when user leaves its target element (e.g. upon clicking the document)\r\n\t\tthis.palette = []; // colors to be displayed in the palette, specified as an array or a string of space separated color values (in any supported format)\r\n\t\tthis.paletteCols = 10; // number of columns in the palette\r\n\t\tthis.paletteSetsAlpha = 'auto'; // 'auto' | true | false - if true, palette colors that don't specify alpha will set alpha to 1.0\r\n\t\tthis.paletteHeight = 16; // maximum height (px) of a row in the palette\r\n\t\tthis.paletteSpacing = 4; // distance (px) between color samples in the palette\r\n\t\tthis.hideOnPaletteClick = false; // when set to true, clicking the palette will also hide the color picker\r\n\t\tthis.sliderSize = 16; // px\r\n\t\tthis.crossSize = 8; // px\r\n\t\tthis.closeButton = false; // whether to display the Close button\r\n\t\tthis.closeText = 'Close';\r\n\t\tthis.buttonColor = 'rgba(0,0,0,1)'; // CSS color\r\n\t\tthis.buttonHeight = 18; // px\r\n\t\tthis.padding = 12; // px\r\n\t\tthis.backgroundColor = 'rgba(255,255,255,1)'; // CSS color\r\n\t\tthis.borderWidth = 1; // px\r\n\t\tthis.borderColor = 'rgba(187,187,187,1)'; // CSS color\r\n\t\tthis.borderRadius = 8; // px\r\n\t\tthis.controlBorderWidth = 1; // px\r\n\t\tthis.controlBorderColor = 'rgba(187,187,187,1)'; // CSS color\r\n\t\tthis.shadow = true; // whether to display a shadow\r\n\t\tthis.shadowBlur = 15; // px\r\n\t\tthis.shadowColor = 'rgba(0,0,0,0.2)'; // CSS color\r\n\t\tthis.pointerColor = 'rgba(76,76,76,1)'; // CSS color\r\n\t\tthis.pointerBorderWidth = 1; // px\r\n\t\tthis.pointerBorderColor = 'rgba(255,255,255,1)'; // CSS color\r\n\t\tthis.pointerThickness = 2; // px\r\n\t\tthis.zIndex = 5000;\r\n\t\tthis.container = undefined; // where to append the color picker (BODY element by default)\r\n\r\n\t\t// Experimental\r\n\t\t//\r\n\t\tthis.minS = 0; // min allowed saturation (0 - 100)\r\n\t\tthis.maxS = 100; // max allowed saturation (0 - 100)\r\n\t\tthis.minV = 0; // min allowed value (brightness) (0 - 100)\r\n\t\tthis.maxV = 100; // max allowed value (brightness) (0 - 100)\r\n\t\tthis.minA = 0.0; // min allowed alpha (opacity) (0.0 - 1.0)\r\n\t\tthis.maxA = 1.0; // max allowed alpha (opacity) (0.0 - 1.0)\r\n\r\n\r\n\t\t// Getter: option(name)\r\n\t\t// Setter: option(name, value)\r\n\t\t// option({name:value, ...})\r\n\t\t//\r\n\t\tthis.option = function () {\r\n\t\t\tif (!arguments.length) {\r\n\t\t\t\tthrow new Error('No option specified');\r\n\t\t\t}\r\n\r\n\t\t\tif (arguments.length === 1 && typeof arguments[0] === 'string') {\r\n\t\t\t\t// getting a single option\r\n\t\t\t\ttry {\r\n\t\t\t\t\treturn getOption(arguments[0]);\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\r\n\t\t\t} else if (arguments.length >= 2 && typeof arguments[0] === 'string') {\r\n\t\t\t\t// setting a single option\r\n\t\t\t\ttry {\r\n\t\t\t\t\tif (!setOption(arguments[0], arguments[1])) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tthis.redraw(); // immediately redraws the picker, if it's displayed\r\n\t\t\t\tthis.exposeColor(); // in case some preview-related or format-related option was changed\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t} else if (arguments.length === 1 && typeof arguments[0] === 'object') {\r\n\t\t\t\t// setting multiple options\r\n\t\t\t\tvar opts = arguments[0];\r\n\t\t\t\tvar success = true;\r\n\t\t\t\tfor (var opt in opts) {\r\n\t\t\t\t\tif (opts.hasOwnProperty(opt)) {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tif (!setOption(opt, opts[opt])) {\r\n\t\t\t\t\t\t\t\tsuccess = false;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\t\t\tsuccess = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tthis.redraw(); // immediately redraws the picker, if it's displayed\r\n\t\t\t\tthis.exposeColor(); // in case some preview-related or format-related option was changed\r\n\t\t\t\treturn success;\r\n\t\t\t}\r\n\r\n\t\t\tthrow new Error('Invalid arguments');\r\n\t\t}\r\n\r\n\r\n\t\t// Getter: channel(name)\r\n\t\t// Setter: channel(name, value)\r\n\t\t//\r\n\t\tthis.channel = function (name, value) {\r\n\t\t\tif (typeof name !== 'string') {\r\n\t\t\t\tthrow new Error('Invalid value for channel name: ' + name);\r\n\t\t\t}\r\n\r\n\t\t\tif (value === undefined) {\r\n\t\t\t\t// getting channel value\r\n\t\t\t\tif (!this.channels.hasOwnProperty(name.toLowerCase())) {\r\n\t\t\t\t\tconsole.warn('Getting unknown channel: ' + name);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\treturn this.channels[name.toLowerCase()];\r\n\r\n\t\t\t} else {\r\n\t\t\t\t// setting channel value\r\n\t\t\t\tvar res = false;\r\n\t\t\t\tswitch (name.toLowerCase()) {\r\n\t\t\t\t\tcase 'r': res = this.fromRGBA(value, null, null, null); break;\r\n\t\t\t\t\tcase 'g': res = this.fromRGBA(null, value, null, null); break;\r\n\t\t\t\t\tcase 'b': res = this.fromRGBA(null, null, value, null); break;\r\n\t\t\t\t\tcase 'h': res = this.fromHSVA(value, null, null, null); break;\r\n\t\t\t\t\tcase 's': res = this.fromHSVA(null, value, null, null); break;\r\n\t\t\t\t\tcase 'v': res = this.fromHSVA(null, null, value, null); break;\r\n\t\t\t\t\tcase 'a': res = this.fromHSVA(null, null, null, value); break;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tconsole.warn('Setting unknown channel: ' + name);\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif (res) {\r\n\t\t\t\t\tthis.redraw(); // immediately redraws the picker, if it's displayed\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\r\n\t\t// Triggers given input event(s) by:\r\n\t\t// - executing on<Event> callback specified as picker's option\r\n\t\t// - triggering standard DOM event listeners attached to the value element\r\n\t\t//\r\n\t\t// It is possible to specify multiple events separated with a space.\r\n\t\t//\r\n\t\tthis.trigger = function (eventNames) {\r\n\t\t\tvar evs = jsc.strList(eventNames);\r\n\t\t\tfor (var i = 0; i < evs.length; i += 1) {\r\n\t\t\t\tvar ev = evs[i].toLowerCase();\r\n\r\n\t\t\t\t// trigger a callback\r\n\t\t\t\tvar callbackProp = null;\r\n\t\t\t\tswitch (ev) {\r\n\t\t\t\t\tcase 'input': callbackProp = 'onInput'; break;\r\n\t\t\t\t\tcase 'change': callbackProp = 'onChange'; break;\r\n\t\t\t\t}\r\n\t\t\t\tif (callbackProp) {\r\n\t\t\t\t\tjsc.triggerCallback(this, callbackProp);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// trigger standard DOM event listeners on the value element\r\n\t\t\t\tjsc.triggerInputEvent(this.valueElement, ev, true, true);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\t// h: 0-360\r\n\t\t// s: 0-100\r\n\t\t// v: 0-100\r\n\t\t// a: 0.0-1.0\r\n\t\t//\r\n\t\tthis.fromHSVA = function (h, s, v, a, flags) { // null = don't change\r\n\t\t\tif (h === undefined) { h = null; }\r\n\t\t\tif (s === undefined) { s = null; }\r\n\t\t\tif (v === undefined) { v = null; }\r\n\t\t\tif (a === undefined) { a = null; }\r\n\r\n\t\t\tif (h !== null) {\r\n\t\t\t\tif (isNaN(h)) { return false; }\r\n\t\t\t\tthis.channels.h = Math.max(0, Math.min(360, h));\r\n\t\t\t}\r\n\t\t\tif (s !== null) {\r\n\t\t\t\tif (isNaN(s)) { return false; }\r\n\t\t\t\tthis.channels.s = Math.max(0, Math.min(100, this.maxS, s), this.minS);\r\n\t\t\t}\r\n\t\t\tif (v !== null) {\r\n\t\t\t\tif (isNaN(v)) { return false; }\r\n\t\t\t\tthis.channels.v = Math.max(0, Math.min(100, this.maxV, v), this.minV);\r\n\t\t\t}\r\n\t\t\tif (a !== null) {\r\n\t\t\t\tif (isNaN(a)) { return false; }\r\n\t\t\t\tthis.channels.a = this.hasAlphaChannel() ?\r\n\t\t\t\t\tMath.max(0, Math.min(1, this.maxA, a), this.minA) :\r\n\t\t\t\t\t1.0; // if alpha channel is disabled, the color should stay 100% opaque\r\n\t\t\t}\r\n\r\n\t\t\tvar rgb = jsc.HSV_RGB(\r\n\t\t\t\tthis.channels.h,\r\n\t\t\t\tthis.channels.s,\r\n\t\t\t\tthis.channels.v\r\n\t\t\t);\r\n\t\t\tthis.channels.r = rgb[0];\r\n\t\t\tthis.channels.g = rgb[1];\r\n\t\t\tthis.channels.b = rgb[2];\r\n\r\n\t\t\tthis.exposeColor(flags);\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\r\n\t\t// r: 0-255\r\n\t\t// g: 0-255\r\n\t\t// b: 0-255\r\n\t\t// a: 0.0-1.0\r\n\t\t//\r\n\t\tthis.fromRGBA = function (r, g, b, a, flags) { // null = don't change\r\n\t\t\tif (r === undefined) { r = null; }\r\n\t\t\tif (g === undefined) { g = null; }\r\n\t\t\tif (b === undefined) { b = null; }\r\n\t\t\tif (a === undefined) { a = null; }\r\n\r\n\t\t\tif (r !== null) {\r\n\t\t\t\tif (isNaN(r)) { return false; }\r\n\t\t\t\tr = Math.max(0, Math.min(255, r));\r\n\t\t\t}\r\n\t\t\tif (g !== null) {\r\n\t\t\t\tif (isNaN(g)) { return false; }\r\n\t\t\t\tg = Math.max(0, Math.min(255, g));\r\n\t\t\t}\r\n\t\t\tif (b !== null) {\r\n\t\t\t\tif (isNaN(b)) { return false; }\r\n\t\t\t\tb = Math.max(0, Math.min(255, b));\r\n\t\t\t}\r\n\t\t\tif (a !== null) {\r\n\t\t\t\tif (isNaN(a)) { return false; }\r\n\t\t\t\tthis.channels.a = this.hasAlphaChannel() ?\r\n\t\t\t\t\tMath.max(0, Math.min(1, this.maxA, a), this.minA) :\r\n\t\t\t\t\t1.0; // if alpha channel is disabled, the color should stay 100% opaque\r\n\t\t\t}\r\n\r\n\t\t\tvar hsv = jsc.RGB_HSV(\r\n\t\t\t\tr===null ? this.channels.r : r,\r\n\t\t\t\tg===null ? this.channels.g : g,\r\n\t\t\t\tb===null ? this.channels.b : b\r\n\t\t\t);\r\n\t\t\tif (hsv[0] !== null) {\r\n\t\t\t\tthis.channels.h = Math.max(0, Math.min(360, hsv[0]));\r\n\t\t\t}\r\n\t\t\tif (hsv[2] !== 0) { // fully black color stays black through entire saturation range, so let's not change saturation\r\n\t\t\t\tthis.channels.s = Math.max(0, this.minS, Math.min(100, this.maxS, hsv[1]));\r\n\t\t\t}\r\n\t\t\tthis.channels.v = Math.max(0, this.minV, Math.min(100, this.maxV, hsv[2]));\r\n\r\n\t\t\t// update RGB according to final HSV, as some values might be trimmed\r\n\t\t\tvar rgb = jsc.HSV_RGB(this.channels.h, this.channels.s, this.channels.v);\r\n\t\t\tthis.channels.r = rgb[0];\r\n\t\t\tthis.channels.g = rgb[1];\r\n\t\t\tthis.channels.b = rgb[2];\r\n\r\n\t\t\tthis.exposeColor(flags);\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\r\n\t\t// DEPRECATED. Use .fromHSVA() instead\r\n\t\t//\r\n\t\tthis.fromHSV = function (h, s, v, flags) {\r\n\t\t\tconsole.warn('fromHSV() method is DEPRECATED. Using fromHSVA() instead.' + jsc.docsRef);\r\n\t\t\treturn this.fromHSVA(h, s, v, null, flags);\r\n\t\t};\r\n\r\n\r\n\t\t// DEPRECATED. Use .fromRGBA() instead\r\n\t\t//\r\n\t\tthis.fromRGB = function (r, g, b, flags) {\r\n\t\t\tconsole.warn('fromRGB() method is DEPRECATED. Using fromRGBA() instead.' + jsc.docsRef);\r\n\t\t\treturn this.fromRGBA(r, g, b, null, flags);\r\n\t\t};\r\n\r\n\r\n\t\tthis.fromString = function (str, flags) {\r\n\t\t\tif (!this.required && str.trim() === '') {\r\n\t\t\t\t// setting empty string to an optional color input\r\n\t\t\t\tthis.setPreviewElementBg(null);\r\n\t\t\t\tthis.setValueElementValue('');\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\tvar color = jsc.parseColorString(str);\r\n\t\t\tif (!color) {\r\n\t\t\t\treturn false; // could not parse\r\n\t\t\t}\r\n\t\t\tif (this.format.toLowerCase() === 'any') {\r\n\t\t\t\tthis._setFormat(color.format); // adapt format\r\n\t\t\t\tif (!jsc.isAlphaFormat(this.getFormat())) {\r\n\t\t\t\t\tcolor.rgba[3] = 1.0; // when switching to a format that doesn't support alpha, set full opacity\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.fromRGBA(\r\n\t\t\t\tcolor.rgba[0],\r\n\t\t\t\tcolor.rgba[1],\r\n\t\t\t\tcolor.rgba[2],\r\n\t\t\t\tcolor.rgba[3],\r\n\t\t\t\tflags\r\n\t\t\t);\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\r\n\t\tthis.randomize = function (minV, maxV, minS, maxS, minH, maxH, minA, maxA) {\r\n\t\t\tif (minV === undefined) { minV = 0; }\r\n\t\t\tif (maxV === undefined) { maxV = 100; }\r\n\t\t\tif (minS === undefined) { minS = 0; }\r\n\t\t\tif (maxS === undefined) { maxS = 100; }\r\n\t\t\tif (minH === undefined) { minH = 0; }\r\n\t\t\tif (maxH === undefined) { maxH = 359; }\r\n\t\t\tif (minA === undefined) { minA = 1; }\r\n\t\t\tif (maxA === undefined) { maxA = 1; }\r\n\r\n\t\t\tthis.fromHSVA(\r\n\t\t\t\tminH + Math.floor(Math.random() * (maxH - minH + 1)),\r\n\t\t\t\tminS + Math.floor(Math.random() * (maxS - minS + 1)),\r\n\t\t\t\tminV + Math.floor(Math.random() * (maxV - minV + 1)),\r\n\t\t\t\t((100 * minA) + Math.floor(Math.random() * (100 * (maxA - minA) + 1))) / 100\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toString = function (format) {\r\n\t\t\tif (format === undefined) {\r\n\t\t\t\tformat = this.getFormat(); // format not specified -> use the current format\r\n\t\t\t}\r\n\t\t\tswitch (format.toLowerCase()) {\r\n\t\t\t\tcase 'hex': return this.toHEXString(); break;\r\n\t\t\t\tcase 'hexa': return this.toHEXAString(); break;\r\n\t\t\t\tcase 'rgb': return this.toRGBString(); break;\r\n\t\t\t\tcase 'rgba': return this.toRGBAString(); break;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t};\r\n\r\n\r\n\t\tthis.toHEXString = function () {\r\n\t\t\treturn jsc.hexColor(\r\n\t\t\t\tthis.channels.r,\r\n\t\t\t\tthis.channels.g,\r\n\t\t\t\tthis.channels.b\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toHEXAString = function () {\r\n\t\t\treturn jsc.hexaColor(\r\n\t\t\t\tthis.channels.r,\r\n\t\t\t\tthis.channels.g,\r\n\t\t\t\tthis.channels.b,\r\n\t\t\t\tthis.channels.a\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toRGBString = function () {\r\n\t\t\treturn jsc.rgbColor(\r\n\t\t\t\tthis.channels.r,\r\n\t\t\t\tthis.channels.g,\r\n\t\t\t\tthis.channels.b\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toRGBAString = function () {\r\n\t\t\treturn jsc.rgbaColor(\r\n\t\t\t\tthis.channels.r,\r\n\t\t\t\tthis.channels.g,\r\n\t\t\t\tthis.channels.b,\r\n\t\t\t\tthis.channels.a\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toGrayscale = function () {\r\n\t\t\treturn (\r\n\t\t\t\t0.213 * this.channels.r +\r\n\t\t\t\t0.715 * this.channels.g +\r\n\t\t\t\t0.072 * this.channels.b\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toCanvas = function () {\r\n\t\t\treturn jsc.genColorPreviewCanvas(this.toRGBAString()).canvas;\r\n\t\t};\r\n\r\n\r\n\t\tthis.toDataURL = function () {\r\n\t\t\treturn this.toCanvas().toDataURL();\r\n\t\t};\r\n\r\n\r\n\t\tthis.toBackground = function () {\r\n\t\t\treturn jsc.pub.background(this.toRGBAString());\r\n\t\t};\r\n\r\n\r\n\t\tthis.isLight = function () {\r\n\t\t\treturn this.toGrayscale() > 255 / 2;\r\n\t\t};\r\n\r\n\r\n\t\tthis.hide = function () {\r\n\t\t\tif (isPickerOwner()) {\r\n\t\t\t\tdetachPicker();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.show = function () {\r\n\t\t\tdrawPicker();\r\n\t\t};\r\n\r\n\r\n\t\tthis.redraw = function () {\r\n\t\t\tif (isPickerOwner()) {\r\n\t\t\t\tdrawPicker();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.getFormat = function () {\r\n\t\t\treturn this._currentFormat;\r\n\t\t};\r\n\r\n\r\n\t\tthis._setFormat = function (format) {\r\n\t\t\tthis._currentFormat = format.toLowerCase();\r\n\t\t};\r\n\r\n\r\n\t\tthis.hasAlphaChannel = function () {\r\n\t\t\tif (this.alphaChannel === 'auto') {\r\n\t\t\t\treturn (\r\n\t\t\t\t\tthis.format.toLowerCase() === 'any' || // format can change on the fly (e.g. from hex to rgba), so let's consider the alpha channel enabled\r\n\t\t\t\t\tjsc.isAlphaFormat(this.getFormat()) || // the current format supports alpha channel\r\n\t\t\t\t\tthis.alpha !== undefined || // initial alpha value is set, so we're working with alpha channel\r\n\t\t\t\t\tthis.alphaElement !== undefined // the alpha value is redirected, so we're working with alpha channel\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\treturn this.alphaChannel; // the alpha channel is explicitly set\r\n\t\t};\r\n\r\n\r\n\t\tthis.processValueInput = function (str) {\r\n\t\t\tif (!this.fromString(str)) {\r\n\t\t\t\t// could not parse the color value - let's just expose the current color\r\n\t\t\t\tthis.exposeColor();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.processAlphaInput = function (str) {\r\n\t\t\tif (!this.fromHSVA(null, null, null, parseFloat(str))) {\r\n\t\t\t\t// could not parse the alpha value - let's just expose the current color\r\n\t\t\t\tthis.exposeColor();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.exposeColor = function (flags) {\r\n\t\t\tvar colorStr = this.toString();\r\n\t\t\tvar fmt = this.getFormat();\r\n\r\n\t\t\t// reflect current color in data- attribute\r\n\t\t\tjsc.setDataAttr(this.targetElement, 'current-color', colorStr);\r\n\r\n\t\t\tif (!(flags & jsc.flags.leaveValue) && this.valueElement) {\r\n\t\t\t\tif (fmt === 'hex' || fmt === 'hexa') {\r\n\t\t\t\t\tif (!this.uppercase) { colorStr = colorStr.toLowerCase(); }\r\n\t\t\t\t\tif (!this.hash) { colorStr = colorStr.replace(/^#/, ''); }\r\n\t\t\t\t}\r\n\t\t\t\tthis.setValueElementValue(colorStr);\r\n\t\t\t}\r\n\r\n\t\t\tif (!(flags & jsc.flags.leaveAlpha) && this.alphaElement) {\r\n\t\t\t\tvar alphaVal = Math.round(this.channels.a * 100) / 100;\r\n\t\t\t\tthis.setAlphaElementValue(alphaVal);\r\n\t\t\t}\r\n\r\n\t\t\tif (!(flags & jsc.flags.leavePreview) && this.previewElement) {\r\n\t\t\t\tvar previewPos = null; // 'left' | 'right' (null -> fill the entire element)\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tjsc.isTextInput(this.previewElement) || // text input\r\n\t\t\t\t\t(jsc.isButton(this.previewElement) && !jsc.isButtonEmpty(this.previewElement)) // button with text\r\n\t\t\t\t) {\r\n\t\t\t\t\tpreviewPos = this.previewPosition;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.setPreviewElementBg(this.toRGBAString());\r\n\t\t\t}\r\n\r\n\t\t\tif (isPickerOwner()) {\r\n\t\t\t\tredrawPad();\r\n\t\t\t\tredrawSld();\r\n\t\t\t\tredrawASld();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.setPreviewElementBg = function (color) {\r\n\t\t\tif (!this.previewElement) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar position = null; // color preview position: null | 'left' | 'right'\r\n\t\t\tvar width = null; // color preview width: px | null = fill the entire element\r\n\t\t\tif (\r\n\t\t\t\tjsc.isTextInput(this.previewElement) || // text input\r\n\t\t\t\t(jsc.isButton(this.previewElement) && !jsc.isButtonEmpty(this.previewElement)) // button with text\r\n\t\t\t) {\r\n\t\t\t\tposition = this.previewPosition;\r\n\t\t\t\twidth = this.previewSize;\r\n\t\t\t}\r\n\r\n\t\t\tvar backgrounds = [];\r\n\r\n\t\t\tif (!color) {\r\n\t\t\t\t// there is no color preview to display -> let's remove any previous background image\r\n\t\t\t\tbackgrounds.push({\r\n\t\t\t\t\timage: 'none',\r\n\t\t\t\t\tposition: 'left top',\r\n\t\t\t\t\tsize: 'auto',\r\n\t\t\t\t\trepeat: 'no-repeat',\r\n\t\t\t\t\torigin: 'padding-box',\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\t// CSS gradient for background color preview\r\n\t\t\t\tbackgrounds.push({\r\n\t\t\t\t\timage: jsc.genColorPreviewGradient(\r\n\t\t\t\t\t\tcolor,\r\n\t\t\t\t\t\tposition,\r\n\t\t\t\t\t\twidth ? width - jsc.pub.previewSeparator.length : null\r\n\t\t\t\t\t),\r\n\t\t\t\t\tposition: 'left top',\r\n\t\t\t\t\tsize: 'auto',\r\n\t\t\t\t\trepeat: position ? 'repeat-y' : 'repeat',\r\n\t\t\t\t\torigin: 'padding-box',\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// data URL of generated PNG image with a gray transparency chessboard\r\n\t\t\t\tvar preview = jsc.genColorPreviewCanvas(\r\n\t\t\t\t\t'rgba(0,0,0,0)',\r\n\t\t\t\t\tposition ? {'left':'right', 'right':'left'}[position] : null,\r\n\t\t\t\t\twidth,\r\n\t\t\t\t\ttrue\r\n\t\t\t\t);\r\n\t\t\t\tbackgrounds.push({\r\n\t\t\t\t\timage: 'url(\\'' + preview.canvas.toDataURL() + '\\')',\r\n\t\t\t\t\tposition: (position || 'left') + ' top',\r\n\t\t\t\t\tsize: preview.width + 'px ' + preview.height + 'px',\r\n\t\t\t\t\trepeat: position ? 'repeat-y' : 'repeat',\r\n\t\t\t\t\torigin: 'padding-box',\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tvar bg = {\r\n\t\t\t\timage: [],\r\n\t\t\t\tposition: [],\r\n\t\t\t\tsize: [],\r\n\t\t\t\trepeat: [],\r\n\t\t\t\torigin: [],\r\n\t\t\t};\r\n\t\t\tfor (var i = 0; i < backgrounds.length; i += 1) {\r\n\t\t\t\tbg.image.push(backgrounds[i].image);\r\n\t\t\t\tbg.position.push(backgrounds[i].position);\r\n\t\t\t\tbg.size.push(backgrounds[i].size);\r\n\t\t\t\tbg.repeat.push(backgrounds[i].repeat);\r\n\t\t\t\tbg.origin.push(backgrounds[i].origin);\r\n\t\t\t}\r\n\r\n\t\t\t// set previewElement's background-images\r\n\t\t\tvar sty = {\r\n\t\t\t\t'background-image': bg.image.join(', '),\r\n\t\t\t\t'background-position': bg.position.join(', '),\r\n\t\t\t\t'background-size': bg.size.join(', '),\r\n\t\t\t\t'background-repeat': bg.repeat.join(', '),\r\n\t\t\t\t'background-origin': bg.origin.join(', '),\r\n\t\t\t};\r\n\t\t\tjsc.setStyle(this.previewElement, sty, this.forceStyle);\r\n\r\n\r\n\t\t\t// set/restore previewElement's padding\r\n\t\t\tvar padding = {\r\n\t\t\t\tleft: null,\r\n\t\t\t\tright: null,\r\n\t\t\t};\r\n\t\t\tif (position) {\r\n\t\t\t\tpadding[position] = (this.previewSize + this.previewPadding) + 'px';\r\n\t\t\t}\r\n\r\n\t\t\tvar sty = {\r\n\t\t\t\t'padding-left': padding.left,\r\n\t\t\t\t'padding-right': padding.right,\r\n\t\t\t};\r\n\t\t\tjsc.setStyle(this.previewElement, sty, this.forceStyle, true);\r\n\t\t};\r\n\r\n\r\n\t\tthis.setValueElementValue = function (str) {\r\n\t\t\tif (this.valueElement) {\r\n\t\t\t\tif (jsc.nodeName(this.valueElement) === 'input') {\r\n\t\t\t\t\tthis.valueElement.value = str;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.valueElement.innerHTML = str;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.setAlphaElementValue = function (str) {\r\n\t\t\tif (this.alphaElement) {\r\n\t\t\t\tif (jsc.nodeName(this.alphaElement) === 'input') {\r\n\t\t\t\t\tthis.alphaElement.value = str;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.alphaElement.innerHTML = str;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis._processParentElementsInDOM = function () {\r\n\t\t\tif (this._parentElementsProcessed) { return; }\r\n\t\t\tthis._parentElementsProcessed = true;\r\n\r\n\t\t\tvar elm = this.targetElement;\r\n\t\t\tdo {\r\n\t\t\t\t// If the target element or one of its parent nodes has fixed position,\r\n\t\t\t\t// then use fixed positioning instead\r\n\t\t\t\tvar compStyle = jsc.getCompStyle(elm);\r\n\t\t\t\tif (compStyle.position && compStyle.position.toLowerCase() === 'fixed') {\r\n\t\t\t\t\tthis.fixed = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (elm !== this.targetElement) {\r\n\t\t\t\t\t// Ensure to attach onParentScroll only once to each parent element\r\n\t\t\t\t\t// (multiple targetElements can share the same parent nodes)\r\n\t\t\t\t\t//\r\n\t\t\t\t\t// Note: It's not just offsetParents that can be scrollable,\r\n\t\t\t\t\t// that's why we loop through all parent nodes\r\n\t\t\t\t\tif (!jsc.getData(elm, 'hasScrollListener')) {\r\n\t\t\t\t\t\telm.addEventListener('scroll', jsc.onParentScroll, false);\r\n\t\t\t\t\t\tjsc.setData(elm, 'hasScrollListener', true);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} while ((elm = elm.parentNode) && jsc.nodeName(elm) !== 'body');\r\n\t\t};\r\n\r\n\r\n\t\tthis.tryHide = function () {\r\n\t\t\tif (this.hideOnLeave) {\r\n\t\t\t\tthis.hide();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.set__palette = function (val) {\r\n\t\t\tthis.palette = val;\r\n\t\t\tthis._palette = jsc.parsePaletteValue(val);\r\n\t\t\tthis._paletteHasTransparency = jsc.containsTranparentColor(this._palette);\r\n\t\t};\r\n\r\n\r\n\t\tfunction setOption (option, value) {\r\n\t\t\tif (typeof option !== 'string') {\r\n\t\t\t\tthrow new Error('Invalid value for option name: ' + option);\r\n\t\t\t}\r\n\r\n\t\t\t// enum option\r\n\t\t\tif (jsc.enumOpts.hasOwnProperty(option)) {\r\n\t\t\t\tif (typeof value === 'string') { // enum string values are case insensitive\r\n\t\t\t\t\tvalue = value.toLowerCase();\r\n\t\t\t\t}\r\n\t\t\t\tif (jsc.enumOpts[option].indexOf(value) === -1) {\r\n\t\t\t\t\tthrow new Error('Option \\'' + option + '\\' has invalid value: ' + value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// deprecated option\r\n\t\t\tif (jsc.deprecatedOpts.hasOwnProperty(option)) {\r\n\t\t\t\tvar oldOpt = option;\r\n\t\t\t\tvar newOpt = jsc.deprecatedOpts[option];\r\n\t\t\t\tif (newOpt) {\r\n\t\t\t\t\t// if we have a new name for this option, let's log a warning and use the new name\r\n\t\t\t\t\tconsole.warn('Option \\'%s\\' is DEPRECATED, using \\'%s\\' instead.' + jsc.docsRef, oldOpt, newOpt);\r\n\t\t\t\t\toption = newOpt;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// new name not available for the option\r\n\t\t\t\t\tthrow new Error('Option \\'' + option + '\\' is DEPRECATED');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar setter = 'set__' + option;\r\n\r\n\t\t\tif (typeof THIS[setter] === 'function') { // a setter exists for this option\r\n\t\t\t\tTHIS[setter](value);\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t} else if (option in THIS) { // option exists as a property\r\n\t\t\t\tTHIS[option] = value;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\tthrow new Error('Unrecognized configuration option: ' + option);\r\n\t\t}\r\n\r\n\r\n\t\tfunction getOption (option) {\r\n\t\t\tif (typeof option !== 'string') {\r\n\t\t\t\tthrow new Error('Invalid value for option name: ' + option);\r\n\t\t\t}\r\n\r\n\t\t\t// deprecated option\r\n\t\t\tif (jsc.deprecatedOpts.hasOwnProperty(option)) {\r\n\t\t\t\tvar oldOpt = option;\r\n\t\t\t\tvar newOpt = jsc.deprecatedOpts[option];\r\n\t\t\t\tif (newOpt) {\r\n\t\t\t\t\t// if we have a new name for this option, let's log a warning and use the new name\r\n\t\t\t\t\tconsole.warn('Option \\'%s\\' is DEPRECATED, using \\'%s\\' instead.' + jsc.docsRef, oldOpt, newOpt);\r\n\t\t\t\t\toption = newOpt;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// new name not available for the option\r\n\t\t\t\t\tthrow new Error('Option \\'' + option + '\\' is DEPRECATED');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar getter = 'get__' + option;\r\n\r\n\t\t\tif (typeof THIS[getter] === 'function') { // a getter exists for this option\r\n\t\t\t\treturn THIS[getter](value);\r\n\r\n\t\t\t} else if (option in THIS) { // option exists as a property\r\n\t\t\t\treturn THIS[option];\r\n\t\t\t}\r\n\r\n\t\t\tthrow new Error('Unrecognized configuration option: ' + option);\r\n\t\t}\r\n\r\n\r\n\t\tfunction detachPicker () {\r\n\t\t\tjsc.removeClass(THIS.targetElement, jsc.pub.activeClassName);\r\n\t\t\tjsc.picker.wrap.parentNode.removeChild(jsc.picker.wrap);\r\n\t\t\tdelete jsc.picker.owner;\r\n\t\t}\r\n\r\n\r\n\t\tfunction drawPicker () {\r\n\r\n\t\t\t// At this point, when drawing the picker, we know what the parent elements are\r\n\t\t\t// and we can do all related DOM operations, such as registering events on them\r\n\t\t\t// or checking their positioning\r\n\t\t\tTHIS._processParentElementsInDOM();\r\n\r\n\t\t\tif (!jsc.picker) {\r\n\t\t\t\tjsc.picker = {\r\n\t\t\t\t\towner: null, // owner picker instance\r\n\t\t\t\t\twrap : jsc.createEl('div'),\r\n\t\t\t\t\tbox : jsc.createEl('div'),\r\n\t\t\t\t\tboxS : jsc.createEl('div'), // shadow area\r\n\t\t\t\t\tboxB : jsc.createEl('div'), // border\r\n\t\t\t\t\tpad : jsc.createEl('div'),\r\n\t\t\t\t\tpadB : jsc.createEl('div'), // border\r\n\t\t\t\t\tpadM : jsc.createEl('div'), // mouse/touch area\r\n\t\t\t\t\tpadCanvas : jsc.createPadCanvas(),\r\n\t\t\t\t\tcross : jsc.createEl('div'),\r\n\t\t\t\t\tcrossBY : jsc.createEl('div'), // border Y\r\n\t\t\t\t\tcrossBX : jsc.createEl('div'), // border X\r\n\t\t\t\t\tcrossLY : jsc.createEl('div'), // line Y\r\n\t\t\t\t\tcrossLX : jsc.createEl('div'), // line X\r\n\t\t\t\t\tsld : jsc.createEl('div'), // slider\r\n\t\t\t\t\tsldB : jsc.createEl('div'), // border\r\n\t\t\t\t\tsldM : jsc.createEl('div'), // mouse/touch area\r\n\t\t\t\t\tsldGrad : jsc.createSliderGradient(),\r\n\t\t\t\t\tsldPtrS : jsc.createEl('div'), // slider pointer spacer\r\n\t\t\t\t\tsldPtrIB : jsc.createEl('div'), // slider pointer inner border\r\n\t\t\t\t\tsldPtrMB : jsc.createEl('div'), // slider pointer middle border\r\n\t\t\t\t\tsldPtrOB : jsc.createEl('div'), // slider pointer outer border\r\n\t\t\t\t\tasld : jsc.createEl('div'), // alpha slider\r\n\t\t\t\t\tasldB : jsc.createEl('div'), // border\r\n\t\t\t\t\tasldM : jsc.createEl('div'), // mouse/touch area\r\n\t\t\t\t\tasldGrad : jsc.createASliderGradient(),\r\n\t\t\t\t\tasldPtrS : jsc.createEl('div'), // slider pointer spacer\r\n\t\t\t\t\tasldPtrIB : jsc.createEl('div'), // slider pointer inner border\r\n\t\t\t\t\tasldPtrMB : jsc.createEl('div'), // slider pointer middle border\r\n\t\t\t\t\tasldPtrOB : jsc.createEl('div'), // slider pointer outer border\r\n\t\t\t\t\tpal : jsc.createEl('div'), // palette\r\n\t\t\t\t\tbtn : jsc.createEl('div'),\r\n\t\t\t\t\tbtnT : jsc.createEl('span'), // text\r\n\t\t\t\t};\r\n\r\n\t\t\t\tjsc.picker.pad.appendChild(jsc.picker.padCanvas.elm);\r\n\t\t\t\tjsc.picker.padB.appendChild(jsc.picker.pad);\r\n\t\t\t\tjsc.picker.cross.appendChild(jsc.picker.crossBY);\r\n\t\t\t\tjsc.picker.cross.appendChild(jsc.picker.crossBX);\r\n\t\t\t\tjsc.picker.cross.appendChild(jsc.picker.crossLY);\r\n\t\t\t\tjsc.picker.cross.appendChild(jsc.picker.crossLX);\r\n\t\t\t\tjsc.picker.padB.appendChild(jsc.picker.cross);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.padB);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.padM);\r\n\r\n\t\t\t\tjsc.picker.sld.appendChild(jsc.picker.sldGrad.elm);\r\n\t\t\t\tjsc.picker.sldB.appendChild(jsc.picker.sld);\r\n\t\t\t\tjsc.picker.sldB.appendChild(jsc.picker.sldPtrOB);\r\n\t\t\t\tjsc.picker.sldPtrOB.appendChild(jsc.picker.sldPtrMB);\r\n\t\t\t\tjsc.picker.sldPtrMB.appendChild(jsc.picker.sldPtrIB);\r\n\t\t\t\tjsc.picker.sldPtrIB.appendChild(jsc.picker.sldPtrS);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.sldB);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.sldM);\r\n\r\n\t\t\t\tjsc.picker.asld.appendChild(jsc.picker.asldGrad.elm);\r\n\t\t\t\tjsc.picker.asldB.appendChild(jsc.picker.asld);\r\n\t\t\t\tjsc.picker.asldB.appendChild(jsc.picker.asldPtrOB);\r\n\t\t\t\tjsc.picker.asldPtrOB.appendChild(jsc.picker.asldPtrMB);\r\n\t\t\t\tjsc.picker.asldPtrMB.appendChild(jsc.picker.asldPtrIB);\r\n\t\t\t\tjsc.picker.asldPtrIB.appendChild(jsc.picker.asldPtrS);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.asldB);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.asldM);\r\n\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.pal);\r\n\r\n\t\t\t\tjsc.picker.btn.appendChild(jsc.picker.btnT);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.btn);\r\n\r\n\t\t\t\tjsc.picker.boxB.appendChild(jsc.picker.box);\r\n\t\t\t\tjsc.picker.wrap.appendChild(jsc.picker.boxS);\r\n\t\t\t\tjsc.picker.wrap.appendChild(jsc.picker.boxB);\r\n\r\n\t\t\t\tjsc.picker.wrap.addEventListener('touchstart', jsc.onPickerTouchStart,\r\n\t\t\t\t\tjsc.isPassiveEventSupported ? {passive: false} : false);\r\n\t\t\t}\r\n\r\n\t\t\tvar p = jsc.picker;\r\n\r\n\t\t\tvar displaySlider = !!jsc.getSliderChannel(THIS);\r\n\t\t\tvar displayAlphaSlider = THIS.hasAlphaChannel();\r\n\t\t\tvar pickerDims = jsc.getPickerDims(THIS);\r\n\t\t\tvar crossOuterSize = (2 * THIS.pointerBorderWidth + THIS.pointerThickness + 2 * THIS.crossSize);\r\n\t\t\tvar controlPadding = jsc.getControlPadding(THIS);\r\n\t\t\tvar borderRadius = Math.min(\r\n\t\t\t\tTHIS.borderRadius,\r\n\t\t\t\tMath.round(THIS.padding * Math.PI)); // px\r\n\t\t\tvar padCursor = 'crosshair';\r\n\r\n\t\t\t// wrap\r\n\t\t\tp.wrap.className = 'jscolor-picker-wrap';\r\n\t\t\tp.wrap.style.clear = 'both';\r\n\t\t\tp.wrap.style.width = pickerDims.borderW + 'px';\r\n\t\t\tp.wrap.style.height = pickerDims.borderH + 'px';\r\n\t\t\tp.wrap.style.zIndex = THIS.zIndex;\r\n\r\n\t\t\t// picker\r\n\t\t\tp.box.className = 'jscolor-picker';\r\n\t\t\tp.box.style.width = pickerDims.paddedW + 'px';\r\n\t\t\tp.box.style.height = pickerDims.paddedH + 'px';\r\n\t\t\tp.box.style.position = 'relative';\r\n\r\n\t\t\t// picker shadow\r\n\t\t\tp.boxS.className = 'jscolor-picker-shadow';\r\n\t\t\tp.boxS.style.position = 'absolute';\r\n\t\t\tp.boxS.style.left = '0';\r\n\t\t\tp.boxS.style.top = '0';\r\n\t\t\tp.boxS.style.width = '100%';\r\n\t\t\tp.boxS.style.height = '100%';\r\n\t\t\tjsc.setBorderRadius(p.boxS, borderRadius + 'px');\r\n\r\n\t\t\t// picker border\r\n\t\t\tp.boxB.className = 'jscolor-picker-border';\r\n\t\t\tp.boxB.style.position = 'relative';\r\n\t\t\tp.boxB.style.border = THIS.borderWidth + 'px solid';\r\n\t\t\tp.boxB.style.borderColor = THIS.borderColor;\r\n\t\t\tp.boxB.style.background = THIS.backgroundColor;\r\n\t\t\tjsc.setBorderRadius(p.boxB, borderRadius + 'px');\r\n\r\n\t\t\t// IE hack:\r\n\t\t\t// If the element is transparent, IE will trigger the event on the elements under it,\r\n\t\t\t// e.g. on Canvas or on elements with border\r\n\t\t\tp.padM.style.background = 'rgba(255,0,0,.2)';\r\n\t\t\tp.sldM.style.background = 'rgba(0,255,0,.2)';\r\n\t\t\tp.asldM.style.background = 'rgba(0,0,255,.2)';\r\n\r\n\t\t\tp.padM.style.opacity =\r\n\t\t\tp.sldM.style.opacity =\r\n\t\t\tp.asldM.style.opacity =\r\n\t\t\t\t'0';\r\n\r\n\t\t\t// pad\r\n\t\t\tp.pad.style.position = 'relative';\r\n\t\t\tp.pad.style.width = THIS.width + 'px';\r\n\t\t\tp.pad.style.height = THIS.height + 'px';\r\n\r\n\t\t\t// pad - color spectrum (HSV and HVS)\r\n\t\t\tp.padCanvas.draw(THIS.width, THIS.height, jsc.getPadYChannel(THIS));\r\n\r\n\t\t\t// pad border\r\n\t\t\tp.padB.style.position = 'absolute';\r\n\t\t\tp.padB.style.left = THIS.padding + 'px';\r\n\t\t\tp.padB.style.top = THIS.padding + 'px';\r\n\t\t\tp.padB.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\tp.padB.style.borderColor = THIS.controlBorderColor;\r\n\r\n\t\t\t// pad mouse area\r\n\t\t\tp.padM.style.position = 'absolute';\r\n\t\t\tp.padM.style.left = 0 + 'px';\r\n\t\t\tp.padM.style.top = 0 + 'px';\r\n\t\t\tp.padM.style.width = (THIS.padding + 2 * THIS.controlBorderWidth + THIS.width + controlPadding) + 'px';\r\n\t\t\tp.padM.style.height = (2 * THIS.controlBorderWidth + 2 * THIS.padding + THIS.height) + 'px';\r\n\t\t\tp.padM.style.cursor = padCursor;\r\n\t\t\tjsc.setData(p.padM, {\r\n\t\t\t\tinstance: THIS,\r\n\t\t\t\tcontrol: 'pad',\r\n\t\t\t})\r\n\r\n\t\t\t// pad cross\r\n\t\t\tp.cross.style.position = 'absolute';\r\n\t\t\tp.cross.style.left =\r\n\t\t\tp.cross.style.top =\r\n\t\t\t\t'0';\r\n\t\t\tp.cross.style.width =\r\n\t\t\tp.cross.style.height =\r\n\t\t\t\tcrossOuterSize + 'px';\r\n\r\n\t\t\t// pad cross border Y and X\r\n\t\t\tp.crossBY.style.position =\r\n\t\t\tp.crossBX.style.position =\r\n\t\t\t\t'absolute';\r\n\t\t\tp.crossBY.style.background =\r\n\t\t\tp.crossBX.style.background =\r\n\t\t\t\tTHIS.pointerBorderColor;\r\n\t\t\tp.crossBY.style.width =\r\n\t\t\tp.crossBX.style.height =\r\n\t\t\t\t(2 * THIS.pointerBorderWidth + THIS.pointerThickness) + 'px';\r\n\t\t\tp.crossBY.style.height =\r\n\t\t\tp.crossBX.style.width =\r\n\t\t\t\tcrossOuterSize + 'px';\r\n\t\t\tp.crossBY.style.left =\r\n\t\t\tp.crossBX.style.top =\r\n\t\t\t\t(Math.floor(crossOuterSize / 2) - Math.floor(THIS.pointerThickness / 2) - THIS.pointerBorderWidth) + 'px';\r\n\t\t\tp.crossBY.style.top =\r\n\t\t\tp.crossBX.style.left =\r\n\t\t\t\t'0';\r\n\r\n\t\t\t// pad cross line Y and X\r\n\t\t\tp.crossLY.style.position =\r\n\t\t\tp.crossLX.style.position =\r\n\t\t\t\t'absolute';\r\n\t\t\tp.crossLY.style.background =\r\n\t\t\tp.crossLX.style.background =\r\n\t\t\t\tTHIS.pointerColor;\r\n\t\t\tp.crossLY.style.height =\r\n\t\t\tp.crossLX.style.width =\r\n\t\t\t\t(crossOuterSize - 2 * THIS.pointerBorderWidth) + 'px';\r\n\t\t\tp.crossLY.style.width =\r\n\t\t\tp.crossLX.style.height =\r\n\t\t\t\tTHIS.pointerThickness + 'px';\r\n\t\t\tp.crossLY.style.left =\r\n\t\t\tp.crossLX.style.top =\r\n\t\t\t\t(Math.floor(crossOuterSize / 2) - Math.floor(THIS.pointerThickness / 2)) + 'px';\r\n\t\t\tp.crossLY.style.top =\r\n\t\t\tp.crossLX.style.left =\r\n\t\t\t\tTHIS.pointerBorderWidth + 'px';\r\n\r\n\r\n\t\t\t// slider\r\n\t\t\tp.sld.style.overflow = 'hidden';\r\n\t\t\tp.sld.style.width = THIS.sliderSize + 'px';\r\n\t\t\tp.sld.style.height = THIS.height + 'px';\r\n\r\n\t\t\t// slider gradient\r\n\t\t\tp.sldGrad.draw(THIS.sliderSize, THIS.height, '#000', '#000');\r\n\r\n\t\t\t// slider border\r\n\t\t\tp.sldB.style.display = displaySlider ? 'block' : 'none';\r\n\t\t\tp.sldB.style.position = 'absolute';\r\n\t\t\tp.sldB.style.left = (THIS.padding + THIS.width + 2 * THIS.controlBorderWidth + 2 * controlPadding) + 'px';\r\n\t\t\tp.sldB.style.top = THIS.padding + 'px';\r\n\t\t\tp.sldB.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\tp.sldB.style.borderColor = THIS.controlBorderColor;\r\n\r\n\t\t\t// slider mouse area\r\n\t\t\tp.sldM.style.display = displaySlider ? 'block' : 'none';\r\n\t\t\tp.sldM.style.position = 'absolute';\r\n\t\t\tp.sldM.style.left = (THIS.padding + THIS.width + 2 * THIS.controlBorderWidth + controlPadding) + 'px';\r\n\t\t\tp.sldM.style.top = 0 + 'px';\r\n\t\t\tp.sldM.style.width = (\r\n\t\t\t\t\t(THIS.sliderSize + 2 * controlPadding + 2 * THIS.controlBorderWidth) +\r\n\t\t\t\t\t(displayAlphaSlider ? 0 : Math.max(0, THIS.padding - controlPadding)) // remaining padding to the right edge\r\n\t\t\t\t) + 'px';\r\n\t\t\tp.sldM.style.height = (2 * THIS.controlBorderWidth + 2 * THIS.padding + THIS.height) + 'px';\r\n\t\t\tp.sldM.style.cursor = 'default';\r\n\t\t\tjsc.setData(p.sldM, {\r\n\t\t\t\tinstance: THIS,\r\n\t\t\t\tcontrol: 'sld',\r\n\t\t\t});\r\n\r\n\t\t\t// slider pointer inner and outer border\r\n\t\t\tp.sldPtrIB.style.border =\r\n\t\t\tp.sldPtrOB.style.border =\r\n\t\t\t\tTHIS.pointerBorderWidth + 'px solid ' + THIS.pointerBorderColor;\r\n\r\n\t\t\t// slider pointer outer border\r\n\t\t\tp.sldPtrOB.style.position = 'absolute';\r\n\t\t\tp.sldPtrOB.style.left = -(2 * THIS.pointerBorderWidth + THIS.pointerThickness) + 'px';\r\n\t\t\tp.sldPtrOB.style.top = '0';\r\n\r\n\t\t\t// slider pointer middle border\r\n\t\t\tp.sldPtrMB.style.border = THIS.pointerThickness + 'px solid ' + THIS.pointerColor;\r\n\r\n\t\t\t// slider pointer spacer\r\n\t\t\tp.sldPtrS.style.width = THIS.sliderSize + 'px';\r\n\t\t\tp.sldPtrS.style.height = jsc.pub.sliderInnerSpace + 'px';\r\n\r\n\r\n\t\t\t// alpha slider\r\n\t\t\tp.asld.style.overflow = 'hidden';\r\n\t\t\tp.asld.style.width = THIS.sliderSize + 'px';\r\n\t\t\tp.asld.style.height = THIS.height + 'px';\r\n\r\n\t\t\t// alpha slider gradient\r\n\t\t\tp.asldGrad.draw(THIS.sliderSize, THIS.height, '#000');\r\n\r\n\t\t\t// alpha slider border\r\n\t\t\tp.asldB.style.display = displayAlphaSlider ? 'block' : 'none';\r\n\t\t\tp.asldB.style.position = 'absolute';\r\n\t\t\tp.asldB.style.left = (\r\n\t\t\t\t\t(THIS.padding + THIS.width + 2 * THIS.controlBorderWidth + controlPadding) +\r\n\t\t\t\t\t(displaySlider ? (THIS.sliderSize + 3 * controlPadding + 2 * THIS.controlBorderWidth) : 0)\r\n\t\t\t\t) + 'px';\r\n\t\t\tp.asldB.style.top = THIS.padding + 'px';\r\n\t\t\tp.asldB.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\tp.asldB.style.borderColor = THIS.controlBorderColor;\r\n\r\n\t\t\t// alpha slider mouse area\r\n\t\t\tp.asldM.style.display = displayAlphaSlider ? 'block' : 'none';\r\n\t\t\tp.asldM.style.position = 'absolute';\r\n\t\t\tp.asldM.style.left = (\r\n\t\t\t\t\t(THIS.padding + THIS.width + 2 * THIS.controlBorderWidth + controlPadding) +\r\n\t\t\t\t\t(displaySlider ? (THIS.sliderSize + 2 * controlPadding + 2 * THIS.controlBorderWidth) : 0)\r\n\t\t\t\t) + 'px';\r\n\t\t\tp.asldM.style.top = 0 + 'px';\r\n\t\t\tp.asldM.style.width = (\r\n\t\t\t\t\t(THIS.sliderSize + 2 * controlPadding + 2 * THIS.controlBorderWidth) +\r\n\t\t\t\t\tMath.max(0, THIS.padding - controlPadding) // remaining padding to the right edge\r\n\t\t\t\t) + 'px';\r\n\t\t\tp.asldM.style.height = (2 * THIS.controlBorderWidth + 2 * THIS.padding + THIS.height) + 'px';\r\n\t\t\tp.asldM.style.cursor = 'default';\r\n\t\t\tjsc.setData(p.asldM, {\r\n\t\t\t\tinstance: THIS,\r\n\t\t\t\tcontrol: 'asld',\r\n\t\t\t})\r\n\r\n\t\t\t// alpha slider pointer inner and outer border\r\n\t\t\tp.asldPtrIB.style.border =\r\n\t\t\tp.asldPtrOB.style.border =\r\n\t\t\t\tTHIS.pointerBorderWidth + 'px solid ' + THIS.pointerBorderColor;\r\n\r\n\t\t\t// alpha slider pointer outer border\r\n\t\t\tp.asldPtrOB.style.position = 'absolute';\r\n\t\t\tp.asldPtrOB.style.left = -(2 * THIS.pointerBorderWidth + THIS.pointerThickness) + 'px';\r\n\t\t\tp.asldPtrOB.style.top = '0';\r\n\r\n\t\t\t// alpha slider pointer middle border\r\n\t\t\tp.asldPtrMB.style.border = THIS.pointerThickness + 'px solid ' + THIS.pointerColor;\r\n\r\n\t\t\t// alpha slider pointer spacer\r\n\t\t\tp.asldPtrS.style.width = THIS.sliderSize + 'px';\r\n\t\t\tp.asldPtrS.style.height = jsc.pub.sliderInnerSpace + 'px';\r\n\r\n\r\n\t\t\t// palette\r\n\t\t\tp.pal.className = 'jscolor-palette';\r\n\t\t\tp.pal.style.display = pickerDims.palette.rows ? 'block' : 'none';\r\n\t\t\tp.pal.style.position = 'absolute';\r\n\t\t\tp.pal.style.left = THIS.padding + 'px';\r\n\t\t\tp.pal.style.top = (2 * THIS.controlBorderWidth + 2 * THIS.padding + THIS.height) + 'px';\r\n\r\n\t\t\t// palette's color samples\r\n\r\n\t\t\tp.pal.innerHTML = '';\r\n\r\n\t\t\tvar chessboard = jsc.genColorPreviewCanvas('rgba(0,0,0,0)');\r\n\r\n\t\t\tvar si = 0; // color sample's index\r\n\t\t\tfor (var r = 0; r < pickerDims.palette.rows; r++) {\r\n\t\t\t\tfor (var c = 0; c < pickerDims.palette.cols && si < THIS._palette.length; c++, si++) {\r\n\t\t\t\t\tvar sampleColor = THIS._palette[si];\r\n\t\t\t\t\tvar sampleCssColor = jsc.rgbaColor.apply(null, sampleColor.rgba);\r\n\r\n\t\t\t\t\tvar sc = jsc.createEl('div'); // color sample's color\r\n\t\t\t\t\tsc.style.width = (pickerDims.palette.cellW - 2 * THIS.controlBorderWidth) + 'px';\r\n\t\t\t\t\tsc.style.height = (pickerDims.palette.cellH - 2 * THIS.controlBorderWidth) + 'px';\r\n\t\t\t\t\tsc.style.backgroundColor = sampleCssColor;\r\n\r\n\t\t\t\t\tvar sw = jsc.createEl('div'); // color sample's wrap\r\n\t\t\t\t\tsw.className = 'jscolor-palette-sample';\r\n\t\t\t\t\tsw.style.display = 'block';\r\n\t\t\t\t\tsw.style.position = 'absolute';\r\n\t\t\t\t\tsw.style.left = (\r\n\t\t\t\t\t\t\tpickerDims.palette.cols <= 1 ? 0 :\r\n\t\t\t\t\t\t\tMath.round(10 * (c * ((pickerDims.contentW - pickerDims.palette.cellW) / (pickerDims.palette.cols - 1)))) / 10\r\n\t\t\t\t\t\t) + 'px';\r\n\t\t\t\t\tsw.style.top = (r * (pickerDims.palette.cellH + THIS.paletteSpacing)) + 'px';\r\n\t\t\t\t\tsw.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\t\t\tsw.style.borderColor = THIS.controlBorderColor;\r\n\t\t\t\t\tsw.style.cursor = 'pointer';\r\n\t\t\t\t\tif (sampleColor.rgba[3] !== null && sampleColor.rgba[3] < 1.0) { // only create chessboard background if the sample has transparency\r\n\t\t\t\t\t\tsw.style.backgroundImage = 'url(\\'' + chessboard.canvas.toDataURL() + '\\')';\r\n\t\t\t\t\t\tsw.style.backgroundRepeat = 'repeat';\r\n\t\t\t\t\t\tsw.style.backgroundPosition = 'center center';\r\n\t\t\t\t\t}\r\n\t\t\t\t\tjsc.setData(sw, {\r\n\t\t\t\t\t\tinstance: THIS,\r\n\t\t\t\t\t\tcontrol: 'palette-sample',\r\n\t\t\t\t\t\tcolor: sampleColor,\r\n\t\t\t\t\t})\r\n\t\t\t\t\tsw.addEventListener('click', jsc.onPaletteSampleClick, false);\r\n\t\t\t\t\tsw.appendChild(sc);\r\n\t\t\t\t\tp.pal.appendChild(sw);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\r\n\t\t\t// the Close button\r\n\t\t\tfunction setBtnBorder () {\r\n\t\t\t\tvar insetColors = THIS.controlBorderColor.split(/\\s+/);\r\n\t\t\t\tvar outsetColor = insetColors.length < 2 ? insetColors[0] : insetColors[1] + ' ' + insetColors[0] + ' ' + insetColors[0] + ' ' + insetColors[1];\r\n\t\t\t\tp.btn.style.borderColor = outsetColor;\r\n\t\t\t}\r\n\t\t\tvar btnPadding = 15; // px\r\n\t\t\tp.btn.className = 'jscolor-btn-close';\r\n\t\t\tp.btn.style.display = THIS.closeButton ? 'block' : 'none';\r\n\t\t\tp.btn.style.position = 'absolute';\r\n\t\t\tp.btn.style.left = THIS.padding + 'px';\r\n\t\t\tp.btn.style.bottom = THIS.padding + 'px';\r\n\t\t\tp.btn.style.padding = '0 ' + btnPadding + 'px';\r\n\t\t\tp.btn.style.maxWidth = (pickerDims.contentW - 2 * THIS.controlBorderWidth - 2 * btnPadding) + 'px';\r\n\t\t\tp.btn.style.overflow = 'hidden';\r\n\t\t\tp.btn.style.height = THIS.buttonHeight + 'px';\r\n\t\t\tp.btn.style.whiteSpace = 'nowrap';\r\n\t\t\tp.btn.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\tsetBtnBorder();\r\n\t\t\tp.btn.style.color = THIS.buttonColor;\r\n\t\t\tp.btn.style.font = '12px sans-serif';\r\n\t\t\tp.btn.style.textAlign = 'center';\r\n\t\t\tp.btn.style.cursor = 'pointer';\r\n\t\t\tp.btn.onmousedown = function () {\r\n\t\t\t\tTHIS.hide();\r\n\t\t\t};\r\n\t\t\tp.btnT.style.lineHeight = THIS.buttonHeight + 'px';\r\n\t\t\tp.btnT.innerHTML = '';\r\n\t\t\tp.btnT.appendChild(window.document.createTextNode(THIS.closeText));\r\n\r\n\t\t\t// reposition the pointers\r\n\t\t\tredrawPad();\r\n\t\t\tredrawSld();\r\n\t\t\tredrawASld();\r\n\r\n\t\t\t// If we are changing the owner without first closing the picker,\r\n\t\t\t// make sure to first deal with the old owner\r\n\t\t\tif (jsc.picker.owner && jsc.picker.owner !== THIS) {\r\n\t\t\t\tjsc.removeClass(jsc.picker.owner.targetElement, jsc.pub.activeClassName);\r\n\t\t\t}\r\n\r\n\t\t\t// Set a new picker owner\r\n\t\t\tjsc.picker.owner = THIS;\r\n\r\n\t\t\t// The redrawPosition() method needs picker.owner to be set, that's why we call it here,\r\n\t\t\t// after setting the owner\r\n\t\t\tif (THIS.container === window.document.body) {\r\n\t\t\t\tjsc.redrawPosition();\r\n\t\t\t} else {\r\n\t\t\t\tjsc._drawPosition(THIS, 0, 0, 'relative', false);\r\n\t\t\t}\r\n\r\n\t\t\tif (p.wrap.parentNode !== THIS.container) {\r\n\t\t\t\tTHIS.container.appendChild(p.wrap);\r\n\t\t\t}\r\n\r\n\t\t\tjsc.addClass(THIS.targetElement, jsc.pub.activeClassName);\r\n\t\t}\r\n\r\n\r\n\t\tfunction redrawPad () {\r\n\t\t\t// redraw the pad pointer\r\n\t\t\tvar yChannel = jsc.getPadYChannel(THIS);\r\n\t\t\tvar x = Math.round((THIS.channels.h / 360) * (THIS.width - 1));\r\n\t\t\tvar y = Math.round((1 - THIS.channels[yChannel] / 100) * (THIS.height - 1));\r\n\t\t\tvar crossOuterSize = (2 * THIS.pointerBorderWidth + THIS.pointerThickness + 2 * THIS.crossSize);\r\n\t\t\tvar ofs = -Math.floor(crossOuterSize / 2);\r\n\t\t\tjsc.picker.cross.style.left = (x + ofs) + 'px';\r\n\t\t\tjsc.picker.cross.style.top = (y + ofs) + 'px';\r\n\r\n\t\t\t// redraw the slider\r\n\t\t\tswitch (jsc.getSliderChannel(THIS)) {\r\n\t\t\tcase 's':\r\n\t\t\t\tvar rgb1 = jsc.HSV_RGB(THIS.channels.h, 100, THIS.channels.v);\r\n\t\t\t\tvar rgb2 = jsc.HSV_RGB(THIS.channels.h, 0, THIS.channels.v);\r\n\t\t\t\tvar color1 = 'rgb(' +\r\n\t\t\t\t\tMath.round(rgb1[0]) + ',' +\r\n\t\t\t\t\tMath.round(rgb1[1]) + ',' +\r\n\t\t\t\t\tMath.round(rgb1[2]) + ')';\r\n\t\t\t\tvar color2 = 'rgb(' +\r\n\t\t\t\t\tMath.round(rgb2[0]) + ',' +\r\n\t\t\t\t\tMath.round(rgb2[1]) + ',' +\r\n\t\t\t\t\tMath.round(rgb2[2]) + ')';\r\n\t\t\t\tjsc.picker.sldGrad.draw(THIS.sliderSize, THIS.height, color1, color2);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'v':\r\n\t\t\t\tvar rgb = jsc.HSV_RGB(THIS.channels.h, THIS.channels.s, 100);\r\n\t\t\t\tvar color1 = 'rgb(' +\r\n\t\t\t\t\tMath.round(rgb[0]) + ',' +\r\n\t\t\t\t\tMath.round(rgb[1]) + ',' +\r\n\t\t\t\t\tMath.round(rgb[2]) + ')';\r\n\t\t\t\tvar color2 = '#000';\r\n\t\t\t\tjsc.picker.sldGrad.draw(THIS.sliderSize, THIS.height, color1, color2);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\t// redraw the alpha slider\r\n\t\t\tjsc.picker.asldGrad.draw(THIS.sliderSize, THIS.height, THIS.toHEXString());\r\n\t\t}\r\n\r\n\r\n\t\tfunction redrawSld () {\r\n\t\t\tvar sldChannel = jsc.getSliderChannel(THIS);\r\n\t\t\tif (sldChannel) {\r\n\t\t\t\t// redraw the slider pointer\r\n\t\t\t\tvar y = Math.round((1 - THIS.channels[sldChannel] / 100) * (THIS.height - 1));\r\n\t\t\t\tjsc.picker.sldPtrOB.style.top = (y - (2 * THIS.pointerBorderWidth + THIS.pointerThickness) - Math.floor(jsc.pub.sliderInnerSpace / 2)) + 'px';\r\n\t\t\t}\r\n\r\n\t\t\t// redraw the alpha slider\r\n\t\t\tjsc.picker.asldGrad.draw(THIS.sliderSize, THIS.height, THIS.toHEXString());\r\n\t\t}\r\n\r\n\r\n\t\tfunction redrawASld () {\r\n\t\t\tvar y = Math.round((1 - THIS.channels.a) * (THIS.height - 1));\r\n\t\t\tjsc.picker.asldPtrOB.style.top = (y - (2 * THIS.pointerBorderWidth + THIS.pointerThickness) - Math.floor(jsc.pub.sliderInnerSpace / 2)) + 'px';\r\n\t\t}\r\n\r\n\r\n\t\tfunction isPickerOwner () {\r\n\t\t\treturn jsc.picker && jsc.picker.owner === THIS;\r\n\t\t}\r\n\r\n\r\n\t\tfunction onValueKeyDown (ev) {\r\n\t\t\tif (jsc.eventKey(ev) === 'Enter') {\r\n\t\t\t\tif (THIS.valueElement) {\r\n\t\t\t\t\tTHIS.processValueInput(THIS.valueElement.value);\r\n\t\t\t\t}\r\n\t\t\t\tTHIS.tryHide();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction onAlphaKeyDown (ev) {\r\n\t\t\tif (jsc.eventKey(ev) === 'Enter') {\r\n\t\t\t\tif (THIS.alphaElement) {\r\n\t\t\t\t\tTHIS.processAlphaInput(THIS.alphaElement.value);\r\n\t\t\t\t}\r\n\t\t\t\tTHIS.tryHide();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction onValueChange (ev) {\r\n\t\t\tif (jsc.getData(ev, 'internal')) {\r\n\t\t\t\treturn; // skip if the event was internally triggered by jscolor\r\n\t\t\t}\r\n\r\n\t\t\tvar oldVal = THIS.valueElement.value;\r\n\r\n\t\t\tTHIS.processValueInput(THIS.valueElement.value); // this might change the value\r\n\r\n\t\t\tjsc.triggerCallback(THIS, 'onChange');\r\n\r\n\t\t\tif (THIS.valueElement.value !== oldVal) {\r\n\t\t\t\t// value was additionally changed -> let's trigger the change event again, even though it was natively dispatched\r\n\t\t\t\tjsc.triggerInputEvent(THIS.valueElement, 'change', true, true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction onAlphaChange (ev) {\r\n\t\t\tif (jsc.getData(ev, 'internal')) {\r\n\t\t\t\treturn; // skip if the event was internally triggered by jscolor\r\n\t\t\t}\r\n\r\n\t\t\tvar oldVal = THIS.alphaElement.value;\r\n\r\n\t\t\tTHIS.processAlphaInput(THIS.alphaElement.value); // this might change the value\r\n\r\n\t\t\tjsc.triggerCallback(THIS, 'onChange');\r\n\r\n\t\t\t// triggering valueElement's onChange (because changing alpha changes the entire color, e.g. with rgba format)\r\n\t\t\tjsc.triggerInputEvent(THIS.valueElement, 'change', true, true);\r\n\r\n\t\t\tif (THIS.alphaElement.value !== oldVal) {\r\n\t\t\t\t// value was additionally changed -> let's trigger the change event again, even though it was natively dispatched\r\n\t\t\t\tjsc.triggerInputEvent(THIS.alphaElement, 'change', true, true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction onValueInput (ev) {\r\n\t\t\tif (jsc.getData(ev, 'internal')) {\r\n\t\t\t\treturn; // skip if the event was internally triggered by jscolor\r\n\t\t\t}\r\n\r\n\t\t\tif (THIS.valueElement) {\r\n\t\t\t\tTHIS.fromString(THIS.valueElement.value, jsc.flags.leaveValue);\r\n\t\t\t}\r\n\r\n\t\t\tjsc.triggerCallback(THIS, 'onInput');\r\n\r\n\t\t\t// triggering valueElement's onInput\r\n\t\t\t// (not needed, it was dispatched normally by the browser)\r\n\t\t}\r\n\r\n\r\n\t\tfunction onAlphaInput (ev) {\r\n\t\t\tif (jsc.getData(ev, 'internal')) {\r\n\t\t\t\treturn; // skip if the event was internally triggered by jscolor\r\n\t\t\t}\r\n\r\n\t\t\tif (THIS.alphaElement) {\r\n\t\t\t\tTHIS.fromHSVA(null, null, null, parseFloat(THIS.alphaElement.value), jsc.flags.leaveAlpha);\r\n\t\t\t}\r\n\r\n\t\t\tjsc.triggerCallback(THIS, 'onInput');\r\n\r\n\t\t\t// triggering valueElement's onInput (because changing alpha changes the entire color, e.g. with rgba format)\r\n\t\t\tjsc.triggerInputEvent(THIS.valueElement, 'input', true, true);\r\n\t\t}\r\n\r\n\r\n\t\t// let's process the DEPRECATED 'options' property (this will be later removed)\r\n\t\tif (jsc.pub.options) {\r\n\t\t\t// let's set custom default options, if specified\r\n\t\t\tfor (var opt in jsc.pub.options) {\r\n\t\t\t\tif (jsc.pub.options.hasOwnProperty(opt)) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tsetOption(opt, jsc.pub.options[opt]);\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\t// let's apply configuration presets\r\n\t\t//\r\n\t\tvar presetsArr = [];\r\n\r\n\t\tif (opts.preset) {\r\n\t\t\tif (typeof opts.preset === 'string') {\r\n\t\t\t\tpresetsArr = opts.preset.split(/\\s+/);\r\n\t\t\t} else if (Array.isArray(opts.preset)) {\r\n\t\t\t\tpresetsArr = opts.preset.slice(); // slice() to clone\r\n\t\t\t} else {\r\n\t\t\t\tconsole.warn('Unrecognized preset value');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// always use the 'default' preset. If it's not listed, append it to the end.\r\n\t\tif (presetsArr.indexOf('default') === -1) {\r\n\t\t\tpresetsArr.push('default');\r\n\t\t}\r\n\r\n\t\t// let's apply the presets in reverse order, so that should there be any overlapping options,\r\n\t\t// the formerly listed preset will override the latter\r\n\t\tfor (var i = presetsArr.length - 1; i >= 0; i -= 1) {\r\n\t\t\tvar pres = presetsArr[i];\r\n\t\t\tif (!pres) {\r\n\t\t\t\tcontinue; // preset is empty string\r\n\t\t\t}\r\n\t\t\tif (!jsc.pub.presets.hasOwnProperty(pres)) {\r\n\t\t\t\tconsole.warn('Unknown preset: %s', pres);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tfor (var opt in jsc.pub.presets[pres]) {\r\n\t\t\t\tif (jsc.pub.presets[pres].hasOwnProperty(opt)) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tsetOption(opt, jsc.pub.presets[pres][opt]);\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\t// let's set specific options for this color picker\r\n\t\tvar nonProperties = [\r\n\t\t\t// these options won't be set as instance properties\r\n\t\t\t'preset',\r\n\t\t];\r\n\t\tfor (var opt in opts) {\r\n\t\t\tif (opts.hasOwnProperty(opt)) {\r\n\t\t\t\tif (nonProperties.indexOf(opt) === -1) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tsetOption(opt, opts[opt]);\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\t//\r\n\t\t// Install the color picker on chosen element(s)\r\n\t\t//\r\n\r\n\r\n\t\t// Determine picker's container element\r\n\t\tif (this.container === undefined) {\r\n\t\t\tthis.container = window.document.body; // default container is BODY element\r\n\r\n\t\t} else { // explicitly set to custom element\r\n\t\t\tthis.container = jsc.node(this.container);\r\n\t\t}\r\n\r\n\t\tif (!this.container) {\r\n\t\t\tthrow new Error('Cannot instantiate color picker without a container element');\r\n\t\t}\r\n\r\n\r\n\t\t// Fetch the target element\r\n\t\tthis.targetElement = jsc.node(targetElement);\r\n\r\n\t\tif (!this.targetElement) {\r\n\t\t\t// temporarily customized error message to help with migrating from versions prior to 2.2\r\n\t\t\tif (typeof targetElement === 'string' && /^[a-zA-Z][\\w:.-]*$/.test(targetElement)) {\r\n\t\t\t\t// targetElement looks like valid ID\r\n\t\t\t\tvar possiblyId = targetElement;\r\n\t\t\t\tthrow new Error('If \\'' + possiblyId + '\\' is supposed to be an ID, please use \\'#' + possiblyId + '\\' or any valid CSS selector.');\r\n\t\t\t}\r\n\r\n\t\t\tthrow new Error('Cannot instantiate color picker without a target element');\r\n\t\t}\r\n\r\n\t\tif (this.targetElement.jscolor && this.targetElement.jscolor instanceof jsc.pub) {\r\n\t\t\tthrow new Error('Color picker already installed on this element');\r\n\t\t}\r\n\r\n\r\n\t\t// link this instance with the target element\r\n\t\tthis.targetElement.jscolor = this;\r\n\t\tjsc.addClass(this.targetElement, jsc.pub.className);\r\n\r\n\t\t// register this instance\r\n\t\tjsc.instances.push(this);\r\n\r\n\r\n\t\t// if target is BUTTON\r\n\t\tif (jsc.isButton(this.targetElement)) {\r\n\r\n\t\t\tif (this.targetElement.type.toLowerCase() !== 'button') {\r\n\t\t\t\t// on buttons, always force type to be 'button', e.g. in situations the target <button> has no type\r\n\t\t\t\t// and thus defaults to 'submit' and would submit the form when clicked\r\n\t\t\t\tthis.targetElement.type = 'button';\r\n\t\t\t}\r\n\r\n\t\t\tif (jsc.isButtonEmpty(this.targetElement)) { // empty button\r\n\t\t\t\t// it is important to clear element's contents first.\r\n\t\t\t\t// if we're re-instantiating color pickers on DOM that has been modified by changing page's innerHTML,\r\n\t\t\t\t// we would keep adding more non-breaking spaces to element's content (because element's contents survive\r\n\t\t\t\t// innerHTML changes, but picker instances don't)\r\n\t\t\t\tjsc.removeChildren(this.targetElement);\r\n\r\n\t\t\t\t// let's insert a non-breaking space\r\n\t\t\t\tthis.targetElement.appendChild(window.document.createTextNode('\\xa0'));\r\n\r\n\t\t\t\t// set min-width = previewSize, if not already greater\r\n\t\t\t\tvar compStyle = jsc.getCompStyle(this.targetElement);\r\n\t\t\t\tvar currMinWidth = parseFloat(compStyle['min-width']) || 0;\r\n\t\t\t\tif (currMinWidth < this.previewSize) {\r\n\t\t\t\t\tjsc.setStyle(this.targetElement, {\r\n\t\t\t\t\t\t'min-width': this.previewSize + 'px',\r\n\t\t\t\t\t}, this.forceStyle);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Determine the value element\r\n\t\tif (this.valueElement === undefined) {\r\n\t\t\tif (jsc.isTextInput(this.targetElement)) {\r\n\t\t\t\t// for text inputs, default valueElement is targetElement\r\n\t\t\t\tthis.valueElement = this.targetElement;\r\n\t\t\t} else {\r\n\t\t\t\t// leave it undefined\r\n\t\t\t}\r\n\r\n\t\t} else if (this.valueElement === null) { // explicitly set to null\r\n\t\t\t// leave it null\r\n\r\n\t\t} else { // explicitly set to custom element\r\n\t\t\tthis.valueElement = jsc.node(this.valueElement);\r\n\t\t}\r\n\r\n\t\t// Determine the alpha element\r\n\t\tif (this.alphaElement) {\r\n\t\t\tthis.alphaElement = jsc.node(this.alphaElement);\r\n\t\t}\r\n\r\n\t\t// Determine the preview element\r\n\t\tif (this.previewElement === undefined) {\r\n\t\t\tthis.previewElement = this.targetElement; // default previewElement is targetElement\r\n\r\n\t\t} else if (this.previewElement === null) { // explicitly set to null\r\n\t\t\t// leave it null\r\n\r\n\t\t} else { // explicitly set to custom element\r\n\t\t\tthis.previewElement = jsc.node(this.previewElement);\r\n\t\t}\r\n\r\n\t\t// valueElement\r\n\t\tif (this.valueElement && jsc.isTextInput(this.valueElement)) {\r\n\r\n\t\t\t// If the value element has onInput event already set, we need to detach it and attach AFTER our listener.\r\n\t\t\t// otherwise the picker instance would still contain the old color when accessed from the onInput handler.\r\n\t\t\tvar valueElementOrigEvents = {\r\n\t\t\t\tonInput: this.valueElement.oninput\r\n\t\t\t};\r\n\t\t\tthis.valueElement.oninput = null;\r\n\r\n\t\t\tthis.valueElement.addEventListener('keydown', onValueKeyDown, false);\r\n\t\t\tthis.valueElement.addEventListener('change', onValueChange, false);\r\n\t\t\tthis.valueElement.addEventListener('input', onValueInput, false);\r\n\t\t\t// the original event listener must be attached AFTER our handler (to let it first set picker's color)\r\n\t\t\tif (valueElementOrigEvents.onInput) {\r\n\t\t\t\tthis.valueElement.addEventListener('input', valueElementOrigEvents.onInput, false);\r\n\t\t\t}\r\n\r\n\t\t\tthis.valueElement.setAttribute('autocomplete', 'off');\r\n\t\t\tthis.valueElement.setAttribute('autocorrect', 'off');\r\n\t\t\tthis.valueElement.setAttribute('autocapitalize', 'off');\r\n\t\t\tthis.valueElement.setAttribute('spellcheck', false);\r\n\t\t}\r\n\r\n\t\t// alphaElement\r\n\t\tif (this.alphaElement && jsc.isTextInput(this.alphaElement)) {\r\n\t\t\tthis.alphaElement.addEventListener('keydown', onAlphaKeyDown, false);\r\n\t\t\tthis.alphaElement.addEventListener('change', onAlphaChange, false);\r\n\t\t\tthis.alphaElement.addEventListener('input', onAlphaInput, false);\r\n\r\n\t\t\tthis.alphaElement.setAttribute('autocomplete', 'off');\r\n\t\t\tthis.alphaElement.setAttribute('autocorrect', 'off');\r\n\t\t\tthis.alphaElement.setAttribute('autocapitalize', 'off');\r\n\t\t\tthis.alphaElement.setAttribute('spellcheck', false);\r\n\t\t}\r\n\r\n\t\t// determine initial color value\r\n\t\t//\r\n\t\tvar initValue = 'FFFFFF';\r\n\r\n\t\tif (this.value !== undefined) {\r\n\t\t\tinitValue = this.value; // get initial color from the 'value' property\r\n\t\t} else if (this.valueElement && this.valueElement.value !== undefined) {\r\n\t\t\tinitValue = this.valueElement.value; // get initial color from valueElement's value\r\n\t\t}\r\n\r\n\t\t// determine initial alpha value\r\n\t\t//\r\n\t\tvar initAlpha = undefined;\r\n\r\n\t\tif (this.alpha !== undefined) {\r\n\t\t\tinitAlpha = (''+this.alpha); // get initial alpha value from the 'alpha' property\r\n\t\t} else if (this.alphaElement && this.alphaElement.value !== undefined) {\r\n\t\t\tinitAlpha = this.alphaElement.value; // get initial color from alphaElement's value\r\n\t\t}\r\n\r\n\t\t// determine current format based on the initial color value\r\n\t\t//\r\n\t\tthis._currentFormat = null;\r\n\r\n\t\tif (['auto', 'any'].indexOf(this.format.toLowerCase()) > -1) {\r\n\t\t\t// format is 'auto' or 'any' -> let's auto-detect current format\r\n\t\t\tvar color = jsc.parseColorString(initValue);\r\n\t\t\tthis._currentFormat = color ? color.format : 'hex';\r\n\t\t} else {\r\n\t\t\t// format is specified\r\n\t\t\tthis._currentFormat = this.format.toLowerCase();\r\n\t\t}\r\n\r\n\r\n\t\t// let's parse the initial color value and expose color's preview\r\n\t\tthis.processValueInput(initValue);\r\n\r\n\t\t// let's also parse and expose the initial alpha value, if any\r\n\t\t//\r\n\t\t// Note: If the initial color value contains alpha value in it (e.g. in rgba format),\r\n\t\t// this will overwrite it. So we should only process alpha input if there was initial\r\n\t\t// alpha explicitly set, otherwise we could needlessly lose initial value's alpha\r\n\t\tif (initAlpha !== undefined) {\r\n\t\t\tthis.processAlphaInput(initAlpha);\r\n\t\t}\r\n\r\n\t\tif (this.random) {\r\n\t\t\t// randomize the initial color value\r\n\t\t\tthis.randomize.apply(this, Array.isArray(this.random) ? this.random : []);\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n\r\n//================================\r\n// Public properties and methods\r\n//================================\r\n\r\n//\r\n// These will be publicly available via jscolor.<name> and JSColor.<name>\r\n//\r\n\r\n\r\n// class that will be set to elements having jscolor installed on them\r\njsc.pub.className = 'jscolor';\r\n\r\n\r\n// class that will be set to elements having jscolor active on them\r\njsc.pub.activeClassName = 'jscolor-active';\r\n\r\n\r\n// whether to try to parse the options string by evaluating it using 'new Function()'\r\n// in case it could not be parsed with JSON.parse()\r\njsc.pub.looseJSON = true;\r\n\r\n\r\n// presets\r\njsc.pub.presets = {};\r\n\r\n// built-in presets\r\njsc.pub.presets['default'] = {}; // baseline for customization\r\n\r\njsc.pub.presets['light'] = { // default color scheme\r\n\tbackgroundColor: 'rgba(255,255,255,1)',\r\n\tcontrolBorderColor: 'rgba(187,187,187,1)',\r\n\tbuttonColor: 'rgba(0,0,0,1)',\r\n};\r\njsc.pub.presets['dark'] = {\r\n\tbackgroundColor: 'rgba(51,51,51,1)',\r\n\tcontrolBorderColor: 'rgba(153,153,153,1)',\r\n\tbuttonColor: 'rgba(240,240,240,1)',\r\n};\r\n\r\njsc.pub.presets['small'] = { width:101, height:101, padding:10, sliderSize:14, paletteCols:8 };\r\njsc.pub.presets['medium'] = { width:181, height:101, padding:12, sliderSize:16, paletteCols:10 }; // default size\r\njsc.pub.presets['large'] = { width:271, height:151, padding:12, sliderSize:24, paletteCols:15 };\r\n\r\njsc.pub.presets['thin'] = { borderWidth:1, controlBorderWidth:1, pointerBorderWidth:1 }; // default thickness\r\njsc.pub.presets['thick'] = { borderWidth:2, controlBorderWidth:2, pointerBorderWidth:2 };\r\n\r\n\r\n// size of space in the sliders\r\njsc.pub.sliderInnerSpace = 3; // px\r\n\r\n// transparency chessboard\r\njsc.pub.chessboardSize = 8; // px\r\njsc.pub.chessboardColor1 = '#666666';\r\njsc.pub.chessboardColor2 = '#999999';\r\n\r\n// preview separator\r\njsc.pub.previewSeparator = ['rgba(255,255,255,.65)', 'rgba(128,128,128,.65)'];\r\n\r\n\r\n// Initializes jscolor\r\njsc.pub.init = function () {\r\n\tif (jsc.initialized) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t// attach some necessary handlers\r\n\twindow.document.addEventListener('mousedown', jsc.onDocumentMouseDown, false);\r\n\twindow.document.addEventListener('keyup', jsc.onDocumentKeyUp, false);\r\n\twindow.addEventListener('resize', jsc.onWindowResize, false);\r\n\twindow.addEventListener('scroll', jsc.onWindowScroll, false);\r\n\r\n\t// install jscolor on current DOM\r\n\tjsc.pub.install();\r\n\r\n\tjsc.initialized = true;\r\n\r\n\t// call functions waiting in the queue\r\n\twhile (jsc.readyQueue.length) {\r\n\t\tvar func = jsc.readyQueue.shift();\r\n\t\tfunc();\r\n\t}\r\n};\r\n\r\n\r\n// Installs jscolor on current DOM tree\r\njsc.pub.install = function (rootNode) {\r\n\tvar success = true;\r\n\r\n\ttry {\r\n\t\tjsc.installBySelector('[data-jscolor]', rootNode);\r\n\t} catch (e) {\r\n\t\tsuccess = false;\r\n\t\tconsole.warn(e);\r\n\t}\r\n\r\n\t// for backward compatibility with DEPRECATED installation using class name\r\n\tif (jsc.pub.lookupClass) {\r\n\t\ttry {\r\n\t\t\tjsc.installBySelector(\r\n\t\t\t\t(\r\n\t\t\t\t\t'input.' + jsc.pub.lookupClass + ', ' +\r\n\t\t\t\t\t'button.' + jsc.pub.lookupClass\r\n\t\t\t\t),\r\n\t\t\t\trootNode\r\n\t\t\t);\r\n\t\t} catch (e) {}\r\n\t}\r\n\r\n\treturn success;\r\n};\r\n\r\n\r\n// Registers function to be called as soon as jscolor is initialized (or immediately, if it already is).\r\n//\r\njsc.pub.ready = function (func) {\r\n\tif (typeof func !== 'function') {\r\n\t\tconsole.warn('Passed value is not a function');\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif (jsc.initialized) {\r\n\t\tfunc();\r\n\t} else {\r\n\t\tjsc.readyQueue.push(func);\r\n\t}\r\n\treturn true;\r\n};\r\n\r\n\r\n// Triggers given input event(s) (e.g. 'input' or 'change') on all color pickers.\r\n//\r\n// It is possible to specify multiple events separated with a space.\r\n// If called before jscolor is initialized, then the events will be triggered after initialization.\r\n//\r\njsc.pub.trigger = function (eventNames) {\r\n\tvar triggerNow = function () {\r\n\t\tjsc.triggerGlobal(eventNames);\r\n\t};\r\n\r\n\tif (jsc.initialized) {\r\n\t\ttriggerNow();\r\n\t} else {\r\n\t\tjsc.pub.ready(triggerNow);\r\n\t}\r\n};\r\n\r\n\r\n// Hides current color picker box\r\njsc.pub.hide = function () {\r\n\tif (jsc.picker && jsc.picker.owner) {\r\n\t\tjsc.picker.owner.hide();\r\n\t}\r\n};\r\n\r\n\r\n// Returns a data URL of a gray chessboard image that indicates transparency\r\njsc.pub.chessboard = function (color) {\r\n\tif (!color) {\r\n\t\tcolor = 'rgba(0,0,0,0)';\r\n\t}\r\n\tvar preview = jsc.genColorPreviewCanvas(color);\r\n\treturn preview.canvas.toDataURL();\r\n};\r\n\r\n\r\n// Returns a data URL of a gray chessboard image that indicates transparency\r\njsc.pub.background = function (color) {\r\n\tvar backgrounds = [];\r\n\r\n\t// CSS gradient for background color preview\r\n\tbackgrounds.push(jsc.genColorPreviewGradient(color));\r\n\r\n\t// data URL of generated PNG image with a gray transparency chessboard\r\n\tvar preview = jsc.genColorPreviewCanvas();\r\n\tbackgrounds.push([\r\n\t\t'url(\\'' + preview.canvas.toDataURL() + '\\')',\r\n\t\t'left top',\r\n\t\t'repeat',\r\n\t].join(' '));\r\n\r\n\treturn backgrounds.join(', ');\r\n};\r\n\r\n\r\n//\r\n// DEPRECATED properties and methods\r\n//\r\n\r\n\r\n// DEPRECATED. Use jscolor.presets.default instead.\r\n//\r\n// Custom default options for all color pickers, e.g. { hash: true, width: 300 }\r\njsc.pub.options = {};\r\n\r\n\r\n// DEPRECATED. Use data-jscolor attribute instead, which installs jscolor on given element.\r\n//\r\n// By default, we'll search for all elements with class=\"jscolor\" and install a color picker on them.\r\n//\r\n// You can change what class name will be looked for by setting the property jscolor.lookupClass\r\n// anywhere in your HTML document. To completely disable the automatic lookup, set it to null.\r\n//\r\njsc.pub.lookupClass = 'jscolor';\r\n\r\n\r\n// DEPRECATED. Use data-jscolor attribute instead, which installs jscolor on given element.\r\n//\r\n// Install jscolor on all elements that have the specified class name\r\njsc.pub.installByClassName = function () {\r\n\tconsole.error('jscolor.installByClassName() is DEPRECATED. Use data-jscolor=\"\" attribute instead of a class name.' + jsc.docsRef);\r\n\treturn false;\r\n};\r\n\r\n\r\njsc.register();\r\n\r\n\r\nreturn jsc.pub;\r\n\r\n\r\n})(); // END jscolor\r\n\r\n\r\nif (typeof window.jscolor === 'undefined') {\r\n\twindow.jscolor = window.JSColor = jscolor;\r\n}\r\n\r\n\r\n// END jscolor code\r\n\r\nreturn jscolor;\r\n\r\n}); // END factory\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/** The basic setting class */\nexport default class Setting {\n constructor(defaultValue, type, group) {\n this.defaultValue = defaultValue;\n this.type = type;\n this.group = group;\n }\n}\n","/** Creates a Prompt similar to the base game fixing some of the stuff breaking them\n * @param \t{string}\tcontent\t The outerHTML of the inputPrompt\n * @param \t{Array}\t\toptions\t An array containing labels and functions for the buttons of the prompt\n */\nexport default function cookieMonsterPrompt(content, options) {\n Game.promptWrapL.className = 'framed';\n Game.promptL.innerHTML = `${content}<div class=\"optionBox\"></div>`;\n Object.keys(options).forEach((i) => {\n const option = document.createElement('a');\n option.id = `promptOption${i}`;\n option.className = 'option';\n option.onclick = function () {\n PlaySound('snd/tick.mp3');\n options[i][1]();\n };\n option.textContent = options[i][0]; // eslint-disable-line prefer-destructuring\n Game.promptL.children[1].appendChild(option);\n });\n Game.promptAnchorL.style.display = 'block';\n Game.darkenL.style.display = 'block';\n Game.promptL.focus();\n Game.promptOn = 1;\n Game.UpdatePrompt();\n}\n","/**\n * This function creates a flash depending on config\n * @param\t{string}\tmodName\t The name of the mod\n * @param\t{number}\tmode\t Sets the intensity of the flash, used to recursively dim flash\n * \t\t\t\t\t\t\t\t All initial calls of function have use mode === 3\n * @param\t{string}\tconfigName\tThe setting that is checked before creating the flash\n * @param\t{bool} forced\t Whether the sound should play regardless of settings, used to test the sound\n */\n\nexport default function createFlash(modName, mode, configName, forced) {\n // The arguments check makes the sound not play upon initialization of the mod\n if (\n ((Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] === 1 || forced) &&\n mode === 3 &&\n window.cookieMonsterFrameworkData.isInitializing === false) ||\n mode === 1\n ) {\n l('CMFlashScreen').style.backgroundColor =\n Game.mods.cookieMonsterFramework.saveData[modName].settings[`Colour${configName}`];\n l('CMFlashScreen').style.opacity = '0.5';\n if (mode === 3) {\n l('CMFlashScreen').style.display = 'inline';\n setTimeout(() => {\n createFlash(modName, 2, configName, true);\n }, 1000 / Game.fps);\n } else {\n setTimeout(() => {\n createFlash(modName, 0, configName, true);\n }, 1000 / Game.fps);\n }\n } else if (mode === 2) {\n l('CMFlashScreen').style.opacity = '1';\n setTimeout(() => {\n createFlash(modName, 1, configName, true);\n }, 1000 / Game.fps);\n } else if (mode === 0) l('CMFlashScreen').style.display = 'none';\n}\n","/**\n * This function saves the settings and headers within the Framework without saving any of the other save-data\n * This allows saving in between the autosave intervals\n */\nexport default function saveFramework() {\n Object.keys(Game.mods.cookieMonsterFramework.saveData).forEach((modName) => {\n const modSaveString = JSON.stringify(Game.mods.cookieMonsterFramework.saveData[modName]);\n\n const cookieClickerSaveString = b64_to_utf8(\n unescape(localStorage.getItem('CookieClickerGame')).split('!END!')[0],\n );\n const pattern = new RegExp(`${modName}.*(;|$)`);\n const modSave = cookieClickerSaveString.match(pattern);\n if (modSave !== null) {\n const newSaveString = cookieClickerSaveString.replace(\n modSave[0],\n `${modName}:${modSaveString}`,\n );\n localStorage.setItem('CookieClickerGame', escape(`${utf8_to_b64(newSaveString)}!END!`));\n }\n });\n}\n","import saveFramework from '../../savingAndLoading/saveFramework';\n\n/**\n * This function toggles header options by incrementing them with 1 and handling changes\n * It is called by the onclick event of the +/- next to headers\n * @param \t{string}\tconfig\tThe name of the header\n */\nexport default function toggleHeader(modName, headerName) {\n if (\n typeof Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName] === 'undefined'\n ) {\n Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName] = 1;\n }\n switch (Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName]) {\n case 0:\n Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName] = 1;\n break;\n default:\n Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName] = 0;\n break;\n }\n saveFramework();\n}\n","/**\n * This function plays a sound depending on config\n * @param\t{string}\tmodName\t The name of the mod\n * @param\t{variable}\turl\t\t\tA variable that gives the url for the sound (e.g., CM.Options.GCSoundURL)\n * @param\t{string}\tsndConfig\tThe setting in CM.Options that is checked before creating the sound\n * @param\t{string}\tvolConfig\tThe setting in CM.Options that is checked to determine volume\n * @param\t{bool} forced\t\tWhether the sound should play regardless of settings, used to test the sound\n */\nexport default function playCMSound(modName, url, sndConfig, volConfig, forced) {\n if (\n (Game.mods.cookieMonsterFramework.saveData[modName].settings[sndConfig] === 1 || forced) &&\n window.cookieMonsterFrameworkData.isInitializing === false\n ) {\n // eslint-disable-next-line new-cap\n const sound = new Audio(url);\n if (Game.mods.cookieMonsterFramework.saveData[modName].settings.GeneralSound)\n sound.volume =\n (Game.mods.cookieMonsterFramework.saveData[modName].settings[volConfig] / 100) *\n (Game.volume / 100);\n else\n sound.volume = Game.mods.cookieMonsterFramework.saveData[modName].settings[volConfig] / 100;\n sound.play();\n }\n}\n","import saveFramework from '../savingAndLoading/saveFramework';\n\n/**\n * This function sets the value of the specified volume-option and updates the display in the options menu\n * It is called by the oninput and onchange event of \"vol\" type options\n * @param \t{string}\tmodName\t The name of the option\n * @param \t{string} configName The name of the option\n */\nexport default function toggleConfigVolume(modName, configName) {\n if (l(`slider${modName}${configName}`) !== null) {\n l(`slider${modName}${configName}right`).innerHTML = `${\n l(`slider${modName}${configName}`).value\n }%`;\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = Math.round(\n l(`slider${modName}${configName}`).value,\n );\n }\n saveFramework();\n}\n","import addInfoMenuSection from './info/addInfoMenuSection';\n// import addOptionsMenuSection from './options/addOptionsMenuSection';\n\n/**\n * Call the function to add a Menu based on the current menu\n * @param {MutationObserver} The observer object that is listening to DOM-changes of id='menu'\n */\nexport default function addMenu(_, observer) {\n // Disconnect observer to avoid infinite loop\n observer.disconnect();\n\n if (Game.onMenu === 'log') {\n addInfoMenuSection();\n } else if (Game.onMenu === 'prefs') {\n // Commented out because this is broken\n // addOptionsMenuSection();\n }\n\n // Reconnect observer to monitor changes\n observer.observe(document.getElementById('menu'), {\n attributes: true,\n childList: true,\n subtree: true,\n });\n}\n","import createFrameworkInfoMenuSection from './createFrameworkInfoMenuSection';\n/**\n * Add things to the Info menu\n * The listeners.infoMenu objects contains functions which create <div>'s to add to the menu section\n */\nexport default function addInfoMenuSection() {\n const menu = l('menu').children[1];\n menu.insertBefore(createFrameworkInfoMenuSection(), menu.children[1]);\n\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu) {\n const listeners = Game.mods.cookieMonsterFramework.listeners.infoMenu;\n for (let i = 0; i < listeners.length; i++) {\n l('cookieMonsterFrameworkMenuSection').appendChild(listeners[i]());\n }\n }\n}\n","import modDescription from '../../data/modInfo';\nimport toggleHeader from '../../../menu/toggles/toggleHeader';\n/**\n * Add things to the Info menu\n * @returns {object} frameworkInfoDiv Subsection to which other mods can add their info sections\n */\nexport default function createFrameworkInfoMenuSection() {\n const frameworkInfoDiv = document.createElement('div');\n frameworkInfoDiv.className = 'subsection';\n frameworkInfoDiv.id = 'cookieMonsterFrameworkMenuSection';\n\n const titleDiv = document.createElement('div');\n titleDiv.className = 'title';\n titleDiv.innerHTML = 'Cookie Monster Mod Family';\n\n const buttonSpan = document.createElement('span');\n buttonSpan.style.cursor = 'pointer';\n buttonSpan.style.display = 'inline-block';\n buttonSpan.style.height = '14px';\n buttonSpan.style.width = '14px';\n buttonSpan.style.borderRadius = '7px';\n buttonSpan.style.textAlign = 'center';\n buttonSpan.style.backgroundColor = '#C0C0C0';\n buttonSpan.style.color = 'black';\n buttonSpan.style.fontSize = '13px';\n buttonSpan.style.verticalAlign = 'middle';\n buttonSpan.textContent = Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers\n .infoMenu\n ? '-'\n : '+';\n buttonSpan.onclick = function () {\n toggleHeader('cookieMonsterFramework', 'infoMenu');\n Game.UpdateMenu();\n };\n titleDiv.appendChild(buttonSpan);\n\n frameworkInfoDiv.appendChild(titleDiv);\n\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu) {\n const descriptionDiv = document.createElement('div');\n descriptionDiv.className = 'listing';\n descriptionDiv.innerHTML = modDescription;\n frameworkInfoDiv.appendChild(descriptionDiv);\n }\n\n return frameworkInfoDiv;\n}\n","/**\n * Short description of the mod\n */\nconst modDescription = `<a href=\"https://github.com/CookieMonsterTeam\" target=\"blank\">Cookie Monster Team</a>\noffers a suite of tools to enhance your game experience.</br>\nOriginally known from our work on the Cookie Monster add-on we are now expanding and working on new tools within the Cookie Monster Mod Family.</br>\nKeep an eye on our GitHub to see future work or use it to report bugs or feature requests!</br>\n`;\n\nexport default modDescription;\n","/**\n * Main draw loop\n */\nexport default function drawLoop() {}\n","/** This includes all headers of the Cookie Monster Framework and their relevant data */\nconst headers = { infoMenu: 1, optionsMenu: 1 };\nexport default headers;\n","import createSaveDataObject from './createSaveDataObject';\nimport saveFramework from './saveFramework';\n\n/**\n * Load the data from a save-file into a mod\n * @param {string} modName The name of the mode to be saved\n * @param {string} saveData JSON-string of the save data\n * @param {object} settingsData The data containing default values of settings\n * @param {object} headersData The data containing default values of headers\n * @param {Function} logicLoop The logic-loop of the mod\n */\nexport default function loadMod(modName, saveData, settingsData, headersData, logicLoop) {\n const saveDataObject = JSON.parse(saveData);\n Game.mods.cookieMonsterFramework.saveData[modName] = createSaveDataObject(\n saveDataObject,\n settingsData,\n headersData,\n );\n saveFramework();\n logicLoop();\n Object.keys(Game.mods.cookieMonsterFramework.saveData[modName].settings).forEach((i) => {\n if (typeof settingsData[i].func !== 'undefined') {\n settingsData[i].func();\n }\n });\n Game.UpdateMenu();\n}\n","/**\n * Creates the save data object to be stored\n * @param {object} saveData The loaded save data\n * @param {object} settingsData The data containing default values of settings\n * @param {object} headersData The data containing default values of headers\n */\nexport default function createSaveDataObject(saveData, settingsData, headersData) {\n const modSaveData = {};\n\n // When a setting is missing (because it is new or modified) these lines add the default value\n const settingsObject = {};\n Object.keys(settingsData).forEach((i) => {\n if (typeof saveData.settings === 'undefined' || typeof saveData.settings[i] === 'undefined') {\n settingsObject[i] = settingsData[i].defaultValue; // eslint-disable-line prefer-destructuring\n } else {\n settingsObject[i] = saveData.settings[i];\n }\n });\n modSaveData.settings = settingsObject;\n\n // When a header is missing (because it is new or modified) these lines add the default value\n const headersObject = {};\n Object.keys(headersData).forEach((i) => {\n if (typeof saveData.headers === 'undefined' || typeof saveData.headers[i] === 'undefined') {\n headersObject[i] = headersData[i];\n } else {\n headersObject[i] = saveData.headers[i];\n }\n });\n modSaveData.headers = headersObject;\n\n Object.keys(saveData).forEach((key) => {\n if (key !== 'settings' && key !== 'headers') {\n modSaveData[key] = saveData[key];\n }\n });\n\n if (typeof modSaveData.favouriteSettings === 'undefined') {\n modSaveData.favouriteSettings = [];\n }\n return modSaveData;\n}\n","/**\n * Main logic loop\n */\nexport default function logicLoop() {}\n","/** This includes all options of the Cookie Monster Framework and their relevant data */\nconst settings = {};\nexport default settings;\n","import headers from './data/headers';\nimport loadMod from '../savingAndLoading/loadMod';\nimport logicLoop from './logic/logicLoop';\nimport settings from './data/settings';\n\n/**\n * This creates a load function to the CM object. Per Game code/comments:\n * \"do stuff with the string data you saved previously\"\n * @param {string} JSON string of save-data\n */\nexport default function load(str) {\n loadMod('cookieMonsterFramework', str, settings, headers, logicLoop);\n}\n","import init from './init';\nimport load from './load';\nimport save from './save';\n\n/** The mod object to be registered with the Modding API */\nconst cookieMonsterFramework = {\n init,\n load,\n save,\n listeners: {\n infoMenu: [],\n optionsMenu: [],\n },\n saveData: { cookieMonsterFramework: { headers: {}, settings: {} } },\n};\n\nexport default cookieMonsterFramework;\n","import addMenu from './menuSections/addMenu';\nimport createFlashScreen from './init/createFlashScreen';\nimport drawLoop from './draw/drawLoop';\nimport load from './load';\n\n/**\n * This creates a init function for the CM object. Per Game code/comments:\n * \"this function is called as soon as the mod is registered\n * declare hooks here\"\n * It starts the further initialization of CookieMonster and registers hooks\n */\nexport default function init() {\n // Create Data object in global scope\n window.cookieMonsterFrameworkData = { isInitializing: true };\n\n // Create MutationObserver for menu sections\n const observer = new MutationObserver(addMenu);\n observer.observe(document.getElementById('menu'), {\n attributes: true,\n childList: true,\n subtree: true,\n });\n\n // Draw initiaization\n createFlashScreen();\n\n // Register hooks\n Game.registerHook('draw', drawLoop);\n\n // Load defaults if there is no previous save\n if (typeof Game.modSaveData.cookieMonsterFramework === 'undefined') {\n load('{}');\n }\n window.cookieMonsterFrameworkData.isInitializing = false;\n}\n","/**\n * This function creates a white square over the full screen and appends it to l('wrapper')\n */\nexport default function createFlashScreen() {\n const WhiteScreen = document.createElement('div');\n WhiteScreen.id = 'CMFlashScreen';\n WhiteScreen.style.width = '100%';\n WhiteScreen.style.height = '100%';\n WhiteScreen.style.backgroundColor = 'white';\n WhiteScreen.style.display = 'none';\n WhiteScreen.style.zIndex = '9999999999';\n WhiteScreen.style.position = 'absolute';\n WhiteScreen.style.pointerEvents = \"none\";\n l('wrapper').appendChild(WhiteScreen);\n}\n","/**\n * This creates a save function to the CM object. Per Game code/comments:\n * \"use this to store persistent data associated with your mod\n * return 'a string to be saved';\"\n * @returns {string} The data to be saved\n */\nexport default function save() {\n return JSON.stringify(Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework);\n}\n","import SettingColours from './options/settingClasses/settingColours';\nimport SettingInputNumber from './options/settingClasses/settingInputNumber';\nimport SettingKeycode from './options/settingClasses/settingKeycode';\nimport SettingStandard from './options/settingClasses/settingStandard';\nimport SettingStandardWithFunc from './options/settingClasses/settingStandardWithFunc';\nimport SettingVolume from './options/settingClasses/settingVolume';\nimport cookieMonsterPrompt from './notifications/prompt';\nimport createFlash from './notifications/flash';\nimport createInfoListing from './menu/listings/createInfoListing';\nimport createModMenuSection from './menu/createModMenuSection';\nimport createNotification from './notifications/notification';\nimport createOptionsListing from './menu/listings/createOptionListing';\nimport createOptionsSubHeader from './menu/listings/createOptionsSubHeader';\nimport initModFramework from './init/initModFramework';\nimport loadMod from './savingAndLoading/loadMod';\nimport playCMSound from './notifications/sound';\nimport registerMod from './init/registerMod';\nimport saveFramework from './savingAndLoading/saveFramework';\n\nexport const initFunctions = {\n initModFramework,\n registerMod,\n};\nexport const menuFunctions = {\n listings: {\n createInfoListing,\n createOptionsListing,\n createOptionsSubHeader,\n },\n createModMenuSection,\n};\n\nexport const notificationsFunctions = {\n createFlash,\n createNotification,\n cookieMonsterPrompt,\n playCMSound,\n};\n\nexport const optionFunctions = {};\n\nexport const saveAndLoadingFunctions = {\n loadMod,\n saveFramework,\n};\n\nexport const settingClasses = {\n SettingColours,\n SettingInputNumber,\n SettingStandard,\n SettingStandardWithFunc,\n SettingKeycode,\n SettingVolume,\n};\n","import cookieMonsterFramework from '../frameworkDataObject/cookieMonsterFramework';\n\n/** Check if Cookie Monster Mod Framework has been loaded yet and if not, does so */\nexport default function initModFramework() {\n if (typeof cookieMonsterFrameworkData === 'undefined') {\n Game.registerMod('cookieMonsterFramework', cookieMonsterFramework);\n }\n}\n","/**\n * Adds the mod to the saveData object to store (favourite) settings and headers\n */\nexport default function registerMod(modName) {\n Game.mods.cookieMonsterFramework.saveData[modName] = {\n favouriteSettings: [],\n headers: {},\n settings: {},\n };\n}\n","/**\n * Returns a subsection for the mod to add listings/info to\n * @param {string} listingHTML The innerHTML of the listing\n * @returns {object} listingDiv Div of the subseciont\n */\nexport default function createInfoListing(listingHTML) {\n const listingDiv = document.createElement('div');\n listingDiv.className = 'listing';\n listingDiv.innerHTML = listingHTML;\n return listingDiv;\n}\n","import jscolor, * as JsColor from '@eastdesire/jscolor';\n\nimport cookieMonsterPrompt from '../../notifications/prompt';\nimport createFavouriteStar from './createOptionsFavouriteStar';\nimport createFlash from '../../notifications/flash';\nimport playCMSound from '../../notifications/sound';\nimport saveFramework from '../../savingAndLoading/saveFramework';\nimport toggleConfig from '../../options/toggleConfig';\nimport toggleConfigKeycode from '../../options/toggleConfigKeycode';\nimport toggleConfigVolume from '../../options/toggleConfigVolume';\n\n/**\n * This function creates an option listing div-object\n * @param \t{string}\t\tmodName\t The name of the option\n * @param \t{string}\t\tconfigName\t The name of the option\n * @param \t{object}\t\tsettingsData\t Object with data about the settings\n * @param \t{function}\tupdateColoursFunc\tFunction to be called to update colours\n * @param \t{function}\trefreshScaleFunc\tFunction to be called to refresh scale\n * @returns\t{object}\t\tdiv\t\t The option object\n */\nexport default function createOptionsListing(\n modName,\n configName,\n settingsData,\n updateColoursFunc,\n refreshScaleFunc,\n) {\n const div = document.createElement('div');\n div.className = 'listing';\n\n if (Game.mods.cookieMonsterFramework.saveData[modName].settings.FavouriteSettings === 1) {\n div.appendChild(\n createFavouriteStar(\n modName,\n configName,\n Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings,\n ),\n );\n }\n\n if (settingsData[configName].type === 'bool') {\n // Create toggle button\n const a = document.createElement('a');\n if (\n settingsData[configName].toggle &&\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] === 0\n ) {\n a.className = 'option off';\n } else {\n a.className = 'option';\n }\n a.id = `${modName}Options${configName}`;\n a.onclick = function () {\n toggleConfig(modName, configName, settingsData);\n Game.UpdateMenu();\n };\n a.textContent =\n settingsData[configName].label[\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName]\n ];\n div.appendChild(a);\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n div.appendChild(label);\n return div;\n }\n\n if (settingsData[configName].type === 'vol') {\n const volume = document.createElement('div');\n\n // Create slider\n volume.className = 'sliderBox';\n const title = document.createElement('div');\n title.style.float = 'left';\n title.innerHTML = settingsData[configName].desc;\n volume.appendChild(title);\n const percent = document.createElement('div');\n percent.id = `slider${modName}${configName}right`;\n percent.style.float = 'right';\n percent.innerHTML = `${Game.mods.cookieMonsterFramework.saveData[modName].settings[configName]}%`;\n volume.appendChild(percent);\n const slider = document.createElement('input');\n slider.className = 'slider';\n slider.id = `slider${modName}${configName}`;\n slider.style.clear = 'both';\n slider.type = 'range';\n slider.min = '0';\n slider.max = '100';\n slider.step = '1';\n slider.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n slider.oninput = function () {\n toggleConfigVolume(modName, configName);\n Game.UpdateMenu();\n };\n slider.onchange = function () {\n toggleConfigVolume(modName, configName);\n Game.UpdateMenu();\n };\n volume.appendChild(slider);\n div.appendChild(volume);\n\n // Create test sound button\n const a = document.createElement('a');\n a.className = 'option';\n a.onclick = function () {\n playCMSound(\n modName,\n Game.mods.cookieMonsterFramework.saveData[modName].settings[\n configName.replace('Volume', 'SoundURL')\n ],\n configName.replace('Volume', 'Sound'),\n configName,\n true,\n );\n };\n a.textContent = 'Test sound';\n div.appendChild(a);\n return div;\n }\n\n if (settingsData[configName].type === 'url') {\n // Create label\n const span = document.createElement('span');\n span.className = 'option';\n span.textContent = `${settingsData[configName].label} `;\n span.style.lineHeight = '1.6';\n div.appendChild(span);\n\n // Create input\n const input = document.createElement('input');\n input.id = `${modName}Options${configName}`;\n input.className = 'option';\n input.type = 'text';\n input.readOnly = true;\n input.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n input.style.width = '300px';\n div.appendChild(input);\n div.appendChild(document.createTextNode(' '));\n\n // Create prompt\n const inputPrompt = document.createElement('input');\n inputPrompt.id = `${modName}Options${configName}Prompt`;\n inputPrompt.className = 'option';\n inputPrompt.type = 'text';\n inputPrompt.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n\n const a = document.createElement('a');\n a.className = 'option';\n a.onclick = function () {\n cookieMonsterPrompt(inputPrompt.outerHTML, [\n [\n 'Save',\n function () {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = l(\n `${modName}Options${configName}Prompt`,\n ).value;\n saveFramework();\n Game.ClosePrompt();\n Game.UpdateMenu();\n },\n ],\n [\n 'Cancel',\n function () {\n Game.ClosePrompt();\n },\n ],\n ]);\n };\n a.textContent = 'Edit';\n div.appendChild(a);\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n div.appendChild(label);\n return div;\n }\n\n if (settingsData[configName].type === 'colour') {\n const innerSpan = document.createElement('span');\n innerSpan.className = 'option';\n\n // Create input\n const input = document.createElement('input');\n input.id = configName;\n input.style.width = '65px';\n input.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n innerSpan.appendChild(input);\n const change = function () {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[this.targetElement.id] =\n this.toHEXString();\n updateColoursFunc();\n saveFramework();\n Game.UpdateMenu();\n };\n // eslint-disable-next-line no-new\n new JsColor(input, { hash: true, position: 'right', onInput: change });\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n innerSpan.appendChild(label);\n\n // Create test button for flash colour\n if (configName.includes('Flash')) {\n const a = document.createElement('a');\n a.className = 'option';\n a.onclick = function () {\n createFlash(modName, 3, configName.replace('Colour', ''), true);\n };\n a.textContent = 'Test flash';\n innerSpan.appendChild(a);\n }\n div.appendChild(innerSpan);\n jscolor.init();\n return div;\n }\n\n if (settingsData[configName].type === 'numscale') {\n const span = document.createElement('span');\n span.className = 'option';\n span.textContent = `${settingsData[configName].label} `;\n span.style.lineHeight = '1.6';\n div.appendChild(span);\n\n // Create input\n const input = document.createElement('input');\n input.id = `${modName}Options${configName}`;\n input.className = 'option';\n input.type = 'number';\n input.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n input.min = settingsData[configName].min;\n input.max = settingsData[configName].max;\n input.oninput = function () {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = this.value;\n saveFramework();\n refreshScaleFunc();\n Game.UpdateMenu();\n };\n div.appendChild(input);\n div.appendChild(document.createTextNode(' '));\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n div.appendChild(label);\n return div;\n }\n\n if (settingsData[configName].type === 'keycode') {\n // Create prompt\n const inputPrompt = document.createElement('input');\n inputPrompt.id = `${modName}Options${configName}Prompt`;\n inputPrompt.className = 'option';\n inputPrompt.type = 'text';\n inputPrompt.value =\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName].displayName;\n\n // Create toggle button\n const a = document.createElement('a');\n a.className = 'option';\n a.id = `${modName}Options${configName}`;\n a.onclick = function () {\n cookieMonsterPrompt(inputPrompt.outerHTML, []);\n l(`${modName}Options${configName}Prompt`).addEventListener('keyup', (e) => {\n toggleConfigKeycode(modName, configName, e);\n Game.ClosePrompt();\n Game.UpdateMenu();\n });\n };\n a.textContent =\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName].displayName;\n div.appendChild(a);\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n div.appendChild(label);\n return div;\n }\n return div;\n}\n","import saveFramework from '../../savingAndLoading/saveFramework';\nimport toggleFavouriteSetting from '../toggles/toggleFavourite';\n/**\n * This function creates the favourite setting star div-object\n * @param \t{string} modName\t The name of the Mod\n * @param \t{string} configName\tThe name of the option\n * @parm {array} favourites An array with the names of all settings that are currently favourited\n * @returns\t{object} div\t\t The option object\n */\nexport default function createFavouriteStar(modName, configName, favourites) {\n const FavStar = document.createElement('a');\n if (favourites.includes(configName)) {\n FavStar.innerText = '★';\n FavStar.style.color = 'yellow';\n } else FavStar.innerText = '☆';\n FavStar.className = 'option';\n FavStar.onclick = function () {\n toggleFavouriteSetting(modName, configName);\n saveFramework();\n Game.UpdateMenu();\n };\n FavStar.onmouseover = function () {\n Game.tooltip.draw(\n this,\n escape(\n '<div style=\"min-width: 250px; margin-bottom: 4px;\"><div style=\"text-align: left;\">Click to set this setting as favourite and show it in \\'favourite\\' settings at the top of the Cookie Monster Settings</div></div>',\n ),\n );\n };\n FavStar.onmouseout = function () {\n Game.tooltip.hide();\n };\n FavStar.appendChild(document.createTextNode(' '));\n return FavStar;\n}\n","import saveFramework from '../../savingAndLoading/saveFramework';\n\n/**\n * This function toggles favourite settings by adding them to an array in the savedata\n * It is called by the onclick event of the favourite stars\n * @param \t{string} modName\t The name of the mod\n * @param \t{string}\tconfigName\tThe name of the setting\n */\nexport default function toggleFavouriteSetting(modName, configName) {\n if (Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings.includes(configName))\n Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings =\n Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings.filter(\n (ele) => ele !== configName,\n );\n else Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings.push(configName);\n saveFramework();\n}\n","import saveFramework from '../savingAndLoading/saveFramework';\n\n/**\n * This function toggles options by incrementing them with 1 and handling changes\n * It is called by the onclick event of options of the \"bool\" type\n * @param \t{string}\tmodName\t The name of the option\n * @param \t{string}\tconfigName\t The name of the option\n * @param \t{object}\tsettingsData\tObject with data about the settings\n */\nexport default function toggleConfig(modName, configName, settingsData) {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] += 1;\n if (\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] ===\n settingsData[configName].label.length\n ) {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = 0;\n if (settingsData[configName].toggle)\n l(`${modName}Options${configName}`).className = 'option off';\n } else l(`${modName}Options${configName}`).className = 'option';\n\n if (typeof settingsData[configName].func !== 'undefined') {\n settingsData[configName].func();\n }\n\n saveFramework();\n}\n","import saveFramework from '../savingAndLoading/saveFramework';\n\n/**\n * This function toggles options by deconstructing the KeyboardEvent\n * It is called by the onclick event of prompts of the \"keycode\" type\n * @param \t{string}\tmodName\t The name of the option\n * @param \t{string}\tconfigName\t The name of the option\n * @param {object} event The KeyboardEvent\n */\nexport default function toggleConfigKeycode(modName, configName, event) {\n const saveObject = {\n key: event.key,\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n shiftKey: event.shiftKey,\n displayName: `${event.shiftKey ? `Shift + ` : ''}${event.altKey ? `Alt + ` : ''}${\n event.ctrlKey ? `Ctrl + ` : ''\n }${event.key}`,\n };\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = saveObject;\n saveFramework();\n}\n","import toggleHeader from '../toggles/toggleHeader';\n\n/**\n * This function creates a header-object for the options page\n * @param \t{string}\t\tmodName\t The name of the mod\n * @param \t{string}\t\tconfigName\tThe name of the Config-group\n * @param \t{string}\t\ttext\t The to-be displayed name of the header\n * @returns\t{object}\t\tdiv\t\t The header object\n */\nexport default function createOptionsSubHeader(modName, configName, text) {\n const div = document.createElement('div');\n div.className = 'title';\n\n div.style.opacity = '0.7';\n div.style.fontSize = '17px';\n div.appendChild(document.createTextNode(`${text} `));\n\n // Creates the +/- button\n const span = document.createElement('span');\n span.style.cursor = 'pointer';\n span.style.display = 'inline-block';\n span.style.height = '14px';\n span.style.width = '14px';\n span.style.borderRadius = '7px';\n span.style.textAlign = 'center';\n span.style.backgroundColor = '#C0C0C0';\n span.style.color = 'black';\n span.style.fontSize = '13px';\n span.style.verticalAlign = 'middle';\n span.textContent = Game.mods.cookieMonsterFramework.saveData[modName].headers[configName]\n ? '-'\n : '+';\n span.onclick = function () {\n toggleHeader(modName, configName);\n Game.UpdateMenu();\n };\n div.appendChild(span);\n return div;\n}\n","import toggleHeader from './toggles/toggleHeader';\n\n/**\n * Returns a subsection for the mod to add listings/info to\n * @param {string} modName The name of the mod (i.e., CookieMonster)\n * @param {string} modDisplayName Display name of the mod (i.e., Cookie Monster)\n * @param {string} menuName Name of the menu (i.e., Info, Options)\n * @returns {object} modSectionDiv Div of the subseciont\n */\nexport default function createModMenuSection(modName, modDisplayName, menuName) {\n const modSectionDiv = document.createElement('div');\n modSectionDiv.className = 'subsection';\n modSectionDiv.id = `${modName}MenuSection`;\n\n const titleDiv = document.createElement('div');\n titleDiv.className = 'title';\n titleDiv.style.fontSize = '18px';\n titleDiv.innerHTML = modDisplayName;\n\n const buttonSpan = document.createElement('span'); // Creates the +/- button\n buttonSpan.style.cursor = 'pointer';\n buttonSpan.style.display = 'inline-block';\n buttonSpan.style.height = '14px';\n buttonSpan.style.width = '14px';\n buttonSpan.style.borderRadius = '7px';\n buttonSpan.style.textAlign = 'center';\n buttonSpan.style.backgroundColor = '#C0C0C0';\n buttonSpan.style.color = 'black';\n buttonSpan.style.fontSize = '13px';\n buttonSpan.style.verticalAlign = 'middle';\n buttonSpan.textContent = Game.mods.cookieMonsterFramework.saveData[modName].headers[menuName]\n ? '-'\n : '+';\n buttonSpan.onclick = function () {\n toggleHeader(modName, menuName);\n Game.UpdateMenu();\n };\n\n titleDiv.appendChild(buttonSpan);\n\n modSectionDiv.appendChild(titleDiv);\n\n return modSectionDiv;\n}\n","/**\n * This function creates a notifcation depending on config\n * @param\t{string}\tmodName\t The name of the mod\n * @param\t{string}\tconfigName\tThe setting in CM.Options that is checked before creating the notification\n * @param\t{string}\ttitle\t\t\t The title of the to-be created notifications\n * @param\t{string}\tmessage\t\t\tThe text of the to-be created notifications\n */\nexport default function createNotification(modName, configName, title, message) {\n if (\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] === 1 &&\n document.visibilityState === 'hidden' &&\n window.cookieMonsterFrameworkData.isInitializing === false\n ) {\n // eslint-disable-next-line no-new\n new Notification(title, {\n body: message,\n badge: 'https://orteil.dashnet.org/cookieclicker/favicon.ico',\n });\n }\n}\n","import Setting from './baseSetting';\n\n/** The colour picker setting class */\nexport default class SettingColours extends Setting {\n constructor(defaultValue, type, group, desc) {\n super(defaultValue, type, group);\n this.desc = desc;\n }\n}\n","import Setting from './baseSetting';\n\n/** The number input setting class */\nexport default class SettingInputNumber extends Setting {\n constructor(defaultValue, type, group, label, desc, min, max) {\n super(defaultValue, type, group);\n this.label = label;\n this.desc = desc;\n this.min = min;\n this.max = max;\n }\n}\n","import Setting from './baseSetting';\n\n/** The standard toggle setting class */\nexport default class SettingStandard extends Setting {\n constructor(defaultValue, type, group, label, desc, toggle) {\n super(defaultValue, type, group);\n this.label = label;\n this.desc = desc;\n this.toggle = toggle;\n }\n}\n","import Setting from './baseSetting';\n\n/** The standard toggle setting class with functions */\nexport default class SettingStandardWithFunc extends Setting {\n constructor(defaultValue, type, group, label, desc, toggle, func) {\n super(defaultValue, type, group);\n this.label = label;\n this.desc = desc;\n this.toggle = toggle;\n if (func !== undefined) {\n this.func = func;\n }\n }\n}\n","import Setting from './baseSetting';\n\n/** The volume level setting class */\nexport default class SettingVolume extends Setting {\n constructor(defaultValue, type, group, label, desc) {\n super(defaultValue, type, group);\n this.label = label;\n this.desc = desc;\n for (let i = 0; i < 101; i++) {\n this.label[i] = `${i}%`;\n }\n }\n}\n","/**\r\n * This function updates the display setting of the two objects created by CM.Disp.CreateWrinklerButtons()\r\n * It is called by changes in CM.Options.WrinklerButtons\r\n */\r\nexport default function ToggleWrinklerButtons() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerButtons &&\r\n Game.elderWrath\r\n ) {\r\n l('PopAllNormalWrinklerButton').style.display = '';\r\n l('PopFattestWrinklerButton').style.display = '';\r\n } else {\r\n l('PopAllNormalWrinklerButton').style.display = 'none';\r\n l('PopFattestWrinklerButton').style.display = 'none';\r\n }\r\n}\r\n","/* eslint-disable prefer-const */\r\n\r\nexport let CacheDragonAura = 0;\r\nexport let CacheDragonAura2 = 0;\r\nexport let CacheLastDragonLevel = 0;\r\nexport let CacheCostDragonUpgrade = 0;\r\nexport let CacheLucky = 0;\r\nexport let CacheLuckyReward = 0;\r\nexport let CacheLuckyWrathReward = 0;\r\nexport let CacheLuckyFrenzy = 0;\r\nexport let CacheLuckyRewardFrenzy = 0;\r\nexport let CacheLuckyWrathRewardFrenzy = 0;\r\nexport let CacheConjure = 0;\r\nexport let CacheConjureReward = 0;\r\nexport let CacheEdifice = 0;\r\nexport let CacheEdificeBuilding = 0;\r\nexport let CacheNoGoldSwitchCookiesPS = 0;\r\nexport let CacheDragonsFortuneMultAdjustment = 1;\r\nexport let CacheGoldenCookiesMult = 1;\r\nexport let CacheWrathCookiesMult = 1;\r\n\r\nexport let CacheHCPerSecond = 0;\r\n\r\nexport let CacheCentEgg = 0;\r\nexport let CacheSeaSpec = 0;\r\nexport let CacheLastChoEgg = 0;\r\n\r\nexport let CacheObjects1 = {};\r\nexport let CacheObjects10 = {};\r\nexport let CacheObjects100 = {};\r\nexport let CacheObjectsNextAchievement = {};\r\n\r\nexport let CacheWrinklersTotal = 0;\r\nexport let CacheWrinklersNormal = 0;\r\nexport let CacheWrinklersFattest = [0, null];\r\n\r\nexport let CacheCurrWrinklerCPSMult = 0;\r\nexport let CacheCurrWrinklerCount = 0;\r\n\r\nexport let CacheUpgrades = {};\r\n\r\nexport let CacheAverageClicks = {};\r\nexport let CacheAverageCookiesFromClicks;\r\n\r\nexport let CacheMissingUpgrades = {};\r\nexport let CacheMissingUpgradesPrestige = {};\r\nexport let CacheMissingUpgradesCookies = {};\r\n\r\nexport let CacheChainRequired = 0;\r\nexport let CacheChainRequiredNext = 0;\r\nexport let CacheChainMaxReward = [];\r\nexport let CacheChainWrathRequired = 0;\r\nexport let CacheChainWrathRequiredNext = 0;\r\nexport let CacheChainWrathMaxReward = [];\r\nexport let CacheChainFrenzyRequired = 0;\r\nexport let CacheChainFrenzyRequiredNext = 0;\r\nexport let CacheChainFrenzyMaxReward = [];\r\nexport let CacheChainFrenzyWrathRequired = 0;\r\nexport let CacheChainFrenzyWrathRequiredNext = 0;\r\nexport let CacheChainFrenzyWrathMaxReward = [];\r\n\r\nexport let CacheRealCookiesEarned = 0;\r\nexport let CacheAvgCPSWithChoEgg = 0;\r\n\r\nexport let CacheSpawnedGoldenShimmer = {};\r\nexport let CacheSeasonPopShimmer = {};\r\n\r\nexport let CacheTimeTillNextPrestige = 0;\r\n\r\n/** Stores lowest PP value */\r\nexport let CacheMinPP = 0;\r\n/** Stores lowest PP value category */\r\nexport let CacheMinPPBulk = 0;\r\n/** Stores all PP values of all buildings for all buy settings (1, 10, 100) */\r\nexport let CachePPArray = [];\r\n\r\nexport let CacheGoldenShimmersByID = {};\r\n\r\nexport let CacheSellForChoEgg = 0;\r\n\r\nexport let CookiesDiff;\r\nexport let WrinkDiff;\r\nexport let WrinkFattestDiff;\r\nexport let ChoEggDiff;\r\nexport let ClicksDiff;\r\nexport let HeavenlyChipsDiff;\r\n\r\nexport let CacheLastCPSCheck;\r\nexport let CacheLastCookies;\r\nexport let CacheLastWrinkCookies;\r\nexport let CacheLastWrinkFattestCookies;\r\nexport let CacheLastClicks;\r\n\r\nexport let CacheAverageGainBank;\r\nexport let CacheAverageGainWrink;\r\nexport let CacheAverageGainWrinkFattest;\r\nexport let CacheAverageGainChoEgg;\r\nexport let CacheAverageCPS;\r\n\r\nexport let CacheLastHeavenlyCheck;\r\nexport let CacheLastHeavenlyChips;\r\n\r\nexport let CacheDoRemakeBuildPrices;\r\n\r\nexport let CacheHadBuildAura;\r\n\r\n/** Store the CPS effect of each god if it was put into each slot */\r\nexport let CacheGods = {\r\n 0: [0, 0, 0],\r\n 1: [0, 0, 0],\r\n 2: [0, 0, 0],\r\n 3: [0, 0, 0],\r\n 4: [0, 0, 0],\r\n 5: [0, 0, 0],\r\n 6: [0, 0, 0],\r\n 7: [0, 0, 0],\r\n 8: [0, 0, 0],\r\n 9: [0, 0, 0],\r\n 10: [0, 0, 0],\r\n};\r\n","/** All variables used by simulation functions */\r\n\r\nexport let SimObjects = []; // eslint-disable-line prefer-const\r\nexport let SimUpgrades = []; // eslint-disable-line prefer-const\r\nexport let SimAchievements = []; // eslint-disable-line prefer-const\r\nexport let SimBuildingsOwned;\r\nexport let SimUpgradesOwned;\r\nexport let SimPledges;\r\nexport let SimAchievementsOwned;\r\nexport let SimHeavenlyPower;\r\nexport let SimPrestige;\r\nexport let SimDragonAura;\r\nexport let SimDragonAura2;\r\nexport let SimGod1;\r\nexport let SimGod2;\r\nexport let SimGod3;\r\nexport let SimDoSims;\r\nexport let SimEffs;\r\nexport let SimCookiesPs;\r\nexport let SimCookiesPsRaw;\r\n","import { SimDragonAura, SimDragonAura2 } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.auraMult but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimAuraMult(what) {\r\n let n = 0;\r\n if (\r\n Game.dragonAuras[SimDragonAura].name === what ||\r\n Game.dragonAuras[SimDragonAura2].name === what\r\n )\r\n n = 1;\r\n if (\r\n Game.dragonAuras[SimDragonAura].name === 'Reality Bending' ||\r\n (Game.dragonAuras[SimDragonAura2].name === 'Reality Bending' &&\r\n Game.dragonLevel >= Game.dragonAurasBN[what].id + 4)\r\n )\r\n n += 0.1;\r\n return n;\r\n}\r\n","import SimAuraMult from './SimAuraMult';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.getSellMultiplier but checks Sim Data instead of Game Data\r\n * @returns {number}\tgiveBack\tThe multiplier\r\n */\r\nexport default function SimGetSellMultiplier() {\r\n let giveBack = 0.25;\r\n giveBack *= 1 + SimAuraMult('Earth Shatterer');\r\n return giveBack;\r\n}\r\n","import { SimEffs } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.Eff but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimEff(name, def) {\r\n if (typeof SimEffs[name] === 'undefined') {\r\n return typeof def === 'undefined' ? 1 : def;\r\n }\r\n return SimEffs[name];\r\n}\r\n","import { SimUpgrades } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.Has but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimHas(what) {\r\n const it = SimUpgrades[what];\r\n if (it && Game.ascensionMode === 1 && (it.pool === 'prestige' || it.tier === 'fortune')) return 0;\r\n return it ? it.bought : 0;\r\n}\r\n","import { SimDragonAura, SimDragonAura2 } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.hasAura but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimHasAura(what) {\r\n if (\r\n Game.dragonAuras[SimDragonAura].name === what ||\r\n Game.dragonAuras[SimDragonAura2].name === what\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n","import { SimGod1, SimGod2, SimGod3, SimObjects } from '../VariablesAndData';\r\nimport SimHasAura from './SimHasAura';\r\n\r\n/**\r\n * This function checks for the current God level in the sim data\r\n * It functions similarly to Game.hasGod()\r\n * @param\t{string}\twhat\tName of the achievement\r\n */\r\nexport default function SimHasGod(what) {\r\n if (Game.hasGod) {\r\n if (SimObjects.Temple.minigame === undefined) {\r\n SimObjects.Temple.minigame = Game.Objects.Temple.minigame;\r\n }\r\n const god = SimObjects.Temple.minigame.gods[what];\r\n if (SimGod1 === god.id) {\r\n return 1;\r\n }\r\n if (SimGod2 === god.id) {\r\n if (SimHasAura('Supreme Intellect')) {\r\n return 1;\r\n }\r\n return 2;\r\n }\r\n if (SimGod3 === god.id) {\r\n if (SimHasAura('Supreme Intellect')) {\r\n return 2;\r\n }\r\n return 3;\r\n }\r\n }\r\n return false;\r\n}\r\n","import { SimObjects } from '../VariablesAndData';\r\nimport SimAuraMult from './SimAuraMult';\r\nimport SimEff from './SimEff';\r\nimport SimHas from './SimHas';\r\nimport SimHasGod from './SimHasGod';\r\n\r\n/**\r\n * This function calculates the sell price of a building based on current \"sim data\"\r\n * @param\t{string}\tbuilding\tName of the building\r\n * @param\t{number}\tprice\t\tCurrent price of building\r\n * @returns {number}\tModifiedPrice\t\tThe modified building price\r\n */\r\nexport default function SimModifyBuildingPrice(building, price) {\r\n let ModifiedPrice = price;\r\n if (SimHas('Season savings')) ModifiedPrice *= 0.99;\r\n if (SimHas(\"Santa's dominion\")) ModifiedPrice *= 0.99;\r\n if (SimHas('Faberge egg')) ModifiedPrice *= 0.99;\r\n if (SimHas('Divine discount')) ModifiedPrice *= 0.99;\r\n if (SimHas('Fortune #100')) ModifiedPrice *= 0.99;\r\n // if (SimHasAura('Fierce Hoarder')) ModifiedPrice *= 0.98;\r\n ModifiedPrice *= 1 - SimAuraMult('Fierce Hoarder') * 0.02;\r\n if (Game.hasBuff('Everything must go')) ModifiedPrice *= 0.95;\r\n if (Game.hasBuff('Crafty pixies')) ModifiedPrice *= 0.98;\r\n if (Game.hasBuff('Nasty goblins')) ModifiedPrice *= 1.02;\r\n if (building.fortune && SimHas(building.fortune.name)) ModifiedPrice *= 0.93;\r\n ModifiedPrice *= SimEff('buildingCost');\r\n if (SimObjects.Temple.minigameLoaded) {\r\n const godLvl = SimHasGod('creation');\r\n if (godLvl === 1) ModifiedPrice *= 0.93;\r\n else if (godLvl === 2) ModifiedPrice *= 0.95;\r\n else if (godLvl === 3) ModifiedPrice *= 0.98;\r\n }\r\n return ModifiedPrice;\r\n}\r\n","import SimGetSellMultiplier from '../ReplacedGameFunctions/SimGetSellMultiplier';\r\nimport SimModifyBuildingPrice from '../ReplacedGameFunctions/SimModifyBuidlingPrice';\r\n\r\n/**\r\n * This function calculates the cookies returned for selling a building\r\n * Base Game does not do this correctly\r\n * @param\t{string}\tbuild\t\tName of the building\r\n * @param\t{number}\tbasePrice\tBase Price of building\r\n * @param\t{number}\tstart\t\tStarting amount of building\r\n * @param\t{number}\tfree\t\tFree amount of building\r\n * @param\t{number}\tincrease\tIncrease of building\r\n * @param\t{number}\tnoSim\t\t1 of 0 depending on if function is called from CM.Sim\r\n * @returns {number}\tmoni\t\tTotal price gained\r\n */\r\nexport default function BuildingSell(build, basePrice, start, free, amount, noSim) {\r\n // Calculate money gains from selling buildings\r\n // If noSim is set, use Game methods to compute price instead of Sim ones.\r\n const noSimRes = typeof noSim === 'undefined' ? 0 : noSim;\r\n let toChange = amount;\r\n let startingAmount = start;\r\n let moni = 0;\r\n if (amount === -1) toChange = startingAmount;\r\n if (!amount) toChange = Game.buyBulk;\r\n for (let i = 0; i < toChange; i++) {\r\n let price = basePrice * Game.priceIncrease ** Math.max(0, startingAmount - free);\r\n price = noSimRes\r\n ? Game.modifyBuildingPrice(build, price)\r\n : SimModifyBuildingPrice(build, price);\r\n price = Math.ceil(price);\r\n const giveBack = noSimRes ? build.getSellMultiplier() : SimGetSellMultiplier();\r\n price = Math.floor(price * giveBack);\r\n if (startingAmount > 0) {\r\n moni += price;\r\n startingAmount -= 1;\r\n }\r\n }\r\n return moni;\r\n}\r\n","/** Data related directly to the scales used by Cookie Monster */\r\n\r\n/** Array of abbreviations used in the \"Metric\" scale */\r\nexport const metric = ['', '', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'];\r\n\r\n/** Array of abbreviations used in the \"Short\" scale */\r\nexport const shortScale = [\r\n '',\r\n '',\r\n 'M',\r\n 'B',\r\n 'Tr',\r\n 'Quadr',\r\n 'Quint',\r\n 'Sext',\r\n 'Sept',\r\n 'Oct',\r\n 'Non',\r\n 'Dec',\r\n 'Undec',\r\n 'Duodec',\r\n 'Tredec',\r\n 'Quattuordec',\r\n 'Quindec',\r\n 'Sexdec',\r\n 'Septendec',\r\n 'Octodec',\r\n 'Novemdec',\r\n 'Vigint',\r\n 'Unvigint',\r\n 'Duovigint',\r\n 'Trevigint',\r\n 'Quattuorvigint',\r\n];\r\n\r\n/** Array of abbreviations used in the \"Abbreviated Short\" scale */\r\nexport const shortScaleAbbreviated = [\r\n '',\r\n 'K',\r\n 'M',\r\n 'B',\r\n 'T',\r\n 'Qa',\r\n 'Qi',\r\n 'Sx',\r\n 'Sp',\r\n 'Oc',\r\n 'No',\r\n 'De',\r\n 'UDe',\r\n 'DDe',\r\n 'TDe',\r\n 'QaDe',\r\n 'QiDe',\r\n 'SxDe',\r\n 'SpDe',\r\n 'ODe',\r\n 'NDe',\r\n 'Vi',\r\n 'UVi',\r\n 'DVi',\r\n 'TVi',\r\n 'QaVi',\r\n 'QiVi',\r\n 'SxVi',\r\n 'SpVi',\r\n 'OVi',\r\n 'NVi',\r\n 'Tr',\r\n 'UTr',\r\n 'DTr',\r\n 'TTr',\r\n 'QaTr',\r\n 'QiTr',\r\n 'SxTr',\r\n 'SpTr',\r\n 'OTr',\r\n 'NTr',\r\n 'Qaa',\r\n 'UQa',\r\n 'DQa',\r\n 'TQa',\r\n 'QaQa',\r\n 'QiQa',\r\n 'SxQa',\r\n 'SpQa',\r\n 'OQa',\r\n 'NQa',\r\n 'Qia',\r\n 'UQi',\r\n 'DQi',\r\n 'TQi',\r\n 'QaQi',\r\n 'QiQi',\r\n 'SxQi',\r\n 'SpQi',\r\n 'OQi',\r\n 'NQi',\r\n 'Sxa',\r\n 'USx',\r\n 'DSx',\r\n 'TSx',\r\n 'QaSx',\r\n 'QiSx',\r\n 'SxSx',\r\n 'SpSx',\r\n 'OSx',\r\n 'NSx',\r\n 'Spa',\r\n 'USp',\r\n 'DSp',\r\n 'TSp',\r\n 'QaSp',\r\n 'QiSp',\r\n 'SxSp',\r\n 'SpSp',\r\n 'OSp',\r\n 'NSp',\r\n 'Oco',\r\n 'UOc',\r\n 'DOc',\r\n 'TOc',\r\n 'QaOc',\r\n 'QiOc',\r\n 'SxOc',\r\n 'SpOc',\r\n 'OOc',\r\n 'NOc',\r\n 'Noa',\r\n 'UNo',\r\n 'DNo',\r\n 'TNo',\r\n 'QaNo',\r\n 'QiNo',\r\n 'SxNo',\r\n 'SpNo',\r\n 'ONo',\r\n 'NNo',\r\n 'Ct',\r\n 'UCt',\r\n];\r\n","export let LastModCount;\r\nexport let TooltipBuildBackup = []; // eslint-disable-line prefer-const\r\nexport let TooltipLumpBackup;\r\nexport let TooltipGrimoireBackup = []; // eslint-disable-line prefer-const\r\nexport let TooltipUpgradeBackup = []; // eslint-disable-line prefer-const\r\nexport let BackupGrimoireLaunch;\r\nexport let BackupGrimoireLaunchMod;\r\nexport let BackupGrimoireDraw;\r\nexport let HasReplaceNativeGrimoireLaunch;\r\nexport let HasReplaceNativeGrimoireDraw;\r\nexport let LoadMinigames;\r\nexport let BackupFunctions = {}; // eslint-disable-line prefer-const\r\n\r\nexport let LastSeasonPopupState;\r\nexport let LastTickerFortuneState;\r\nexport let LastGardenNextStep;\r\nexport let LastGoldenCookieState;\r\nexport let LastSpawnedGoldenCookieState;\r\nexport let LastMagicBarFull;\r\nexport let CurrSpawnedGoldenCookieState;\r\nexport let LastWrinklerCount;\r\n\r\n/** Stores the date at Game.CalculateGains for God Cyclius\r\n */\r\nexport let CycliusDateAtBeginLoop = Date.now(); // eslint-disable-line prefer-const\r\n\r\n/** Stores the date at Game.CalculateGains for the Century egg\r\n */\r\nexport let CenturyDateAtBeginLoop = Date.now(); // eslint-disable-line prefer-const\r\n","/**\r\n * Section: Variables used in Disp functions */\r\n\r\nexport let DispCSS;\r\n\r\n/**\r\n * These are variables used to create DOM object names and id (e.g., 'CMTextTooltip)\r\n */\r\nexport const ColourTextPre = 'CMText';\r\nexport const ColourBackPre = 'CMBack';\r\nexport const ColourBorderPre = 'CMBorder';\r\n\r\n/**\r\n * These are variables which can be set in the options by the user to standardize colours throughout CookieMonster\r\n */\r\nexport const ColourBlue = 'Blue';\r\nexport const ColourGreen = 'Green';\r\nexport const ColourYellow = 'Yellow';\r\nexport const ColourOrange = 'Orange';\r\nexport const ColourRed = 'Red';\r\nexport const ColourPurple = 'Purple';\r\nexport const ColourGray = 'Gray';\r\nexport const ColourPink = 'Pink';\r\nexport const ColourBrown = 'Brown';\r\nexport const ColoursOrdering = [\r\n ColourBlue,\r\n ColourGreen,\r\n ColourYellow,\r\n ColourOrange,\r\n ColourRed,\r\n ColourPurple,\r\n ColourPink,\r\n ColourBrown,\r\n ColourGray,\r\n];\r\n\r\n/**\r\n * This list is used to make some very basic tooltips.\r\n * It is used by CM.Main.DelayInit() in the call of CM.Disp.CreateSimpleTooltip()\r\n * @item\t{string}\tplaceholder\r\n * @item\t{string}\ttext\r\n * @item\t{string}\tminWidth\r\n */\r\nexport const TooltipText = [\r\n ['GoldCookTooltipPlaceholder', 'Calculated with Golden Switch off', '200px'],\r\n [\r\n 'GoldCookDragonsFortuneTooltipPlaceholder',\r\n 'Calculated with Golden Switch off and at least one golden cookie on-screen',\r\n '240px',\r\n ],\r\n [\r\n 'PrestMaxTooltipPlaceholder',\r\n 'The MAX prestige is calculated with the cookies gained from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and buying Chocolate egg',\r\n '320px',\r\n ],\r\n [\r\n 'NextPrestTooltipPlaceholder',\r\n 'Calculated with cookies gained from wrinklers and Chocolate egg',\r\n '200px',\r\n ],\r\n [\r\n 'HeavenChipMaxTooltipPlaceholder',\r\n 'The MAX heavenly chips is calculated with the cookies gained from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and buying Chocolate egg',\r\n '330px',\r\n ],\r\n [\r\n 'ResetTooltipPlaceholder',\r\n 'The bonus income you would get from new prestige levels unlocked at 100% of its potential and from ascension achievements if you have the same buildings/upgrades after reset',\r\n '370px',\r\n ],\r\n [\r\n 'ChoEggTooltipPlaceholder',\r\n 'The amount of cookies you would get from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and then buying Chocolate egg',\r\n '300px',\r\n ],\r\n ['ChainNextLevelPlaceholder', 'Cheated cookies might break this formula', '250px'],\r\n [\r\n 'FavouriteSettingPlaceholder',\r\n \"Click to set this setting as favourite and show it in 'favourite' settings at the top of the Cookie Monster Settings\",\r\n '250px',\r\n ],\r\n];\r\nexport const SimpleTooltipElements = {};\r\n\r\n/**\r\n * These are variables used by the functions that create tooltips for wrinklers\r\n * See CM.Disp.CheckWrinklerTooltip(), CM.Disp.UpdateWrinklerTooltip() and CM.Main.AddWrinklerAreaDetect()\r\n */\r\nexport let TooltipWrinklerArea = 0; // eslint-disable-line prefer-const\r\nexport let TooltipWrinkler = -1; // eslint-disable-line prefer-const\r\n\r\n/**\r\n * This array is used to store whether a Wrinkler tooltip is being shown or not\r\n * [i] = 1 means tooltip is being shown, [i] = 0 means hidden\r\n * It is used by CM.Disp.CheckWrinklerTooltip() and CM.Main.AddWrinklerAreaDetect()\r\n */\r\nexport let TooltipWrinklerBeingShown = []; // eslint-disable-line prefer-const\r\n\r\nexport let CMLastAscendState;\r\nexport let CMSayTime = function () {}; // eslint-disable-line prefer-const\r\n\r\n/**\r\n * These are variables used to create various displays when the game is loaded on the \"sell all\" screen\r\n */\r\nexport let LastTargetBotBar = 1; // eslint-disable-line prefer-const\r\nexport let LastTargetBuildings = 1; // eslint-disable-line prefer-const\r\nexport let LastTargetTooltipBuilding = 1; // eslint-disable-line prefer-const\r\n\r\n/**\r\n * These arrays are used in the stats page to show\r\n * average cookies per {CM.Disp.cookieTimes/CM.Disp.clickTimes} seconds\r\n */\r\nexport const CookieTimes = [10, 15, 30, 60, 300, 600, 900, 1800];\r\nexport const ClickTimes = [1, 5, 10, 15, 30];\r\n\r\n/**\r\n * This array is used to give certain timers specific colours\r\n */\r\nexport const BuffColours = {\r\n Frenzy: ColourYellow,\r\n 'Dragon Harvest': ColourBrown,\r\n 'Elder frenzy': ColourGreen,\r\n Clot: ColourRed,\r\n 'Click frenzy': ColourBlue,\r\n Dragonflight: ColourPink,\r\n};\r\n\r\n/**\r\n * This array is used to track GC timers\r\n */\r\nexport let GCTimers = {}; // eslint-disable-line prefer-const\r\n\r\n/**\r\n * Used to store the number of cookies to be displayed in the tab-title\r\n */\r\nexport let Title = ''; // eslint-disable-line prefer-const\r\n\r\nexport let TooltipPrice;\r\nexport let TooltipBonusIncome;\r\nexport let TooltipType;\r\nexport let TooltipName;\r\nexport let TooltipBonusMouse;\r\n\r\nexport let LastAscendState;\r\nexport let LastNumberOfTimers;\r\n\r\n/**\r\n * This stores the names of settings shown in the favourites section\r\n */\r\nexport let FavouriteSettings = []; // eslint-disable-line prefer-const\r\n","/** General functions to format or beautify strings */\r\n\r\nimport { metric, shortScale, shortScaleAbbreviated } from '../../Data/Scales';\r\nimport { BackupFunctions } from '../../Main/VariablesAndData';\r\n\r\n/**\r\n * This function returns formats number based on the Scale setting\r\n * @param\t{number}\tnum\t\tNumber to be beautified\r\n * @param \t{any}\t\tfloats \tUsed in some scenario's by CM.Backup.Beautify (Game's original function)\r\n * @param\t{number}\tforced\tUsed to force (type 3) in certains cases\r\n * @returns\t{string}\t\t\tFormatted number\r\n */\r\nexport default function Beautify(num, floats, forced) {\r\n const decimals =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleDecimals + 1;\r\n if (num === Infinity) {\r\n return 'Infinity';\r\n }\r\n if (typeof num === 'undefined') {\r\n return '0';\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 0) {\r\n return BackupFunctions.Beautify(num, floats);\r\n }\r\n if (Number.isFinite(num)) {\r\n if (num < 0) {\r\n return `-${Beautify(Math.abs(num))}`;\r\n }\r\n let answer = '';\r\n if (num === 0) {\r\n return num.toString();\r\n }\r\n if (\r\n num > 0.001 &&\r\n num < Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleCutoff\r\n ) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator)\r\n answer = num.toLocaleString('nl');\r\n else answer = num.toLocaleString('en');\r\n return answer;\r\n }\r\n if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 4 &&\r\n !forced) ||\r\n forced === 4\r\n ) {\r\n // Scientific notation, 123456789 => 1.235E+8\r\n answer = num.toExponential(decimals).toString().replace('e', 'E');\r\n } else {\r\n const exponential = num.toExponential().toString();\r\n const AmountOfTenPowerThree = Math.floor(exponential.slice(exponential.indexOf('e') + 1) / 3);\r\n answer = (num / Number(`1e${AmountOfTenPowerThree * 3}`)).toFixed(decimals);\r\n // answer is now \"xxx.xx\" (e.g., 123456789 would be 123.46)\r\n if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 1 &&\r\n !forced) ||\r\n forced === 1\r\n ) {\r\n // Metric scale, 123456789 => 123.457 M\r\n if (num >= 0.01 && num < Number(`1e${metric.length * 3}`)) {\r\n answer += ` ${metric[AmountOfTenPowerThree]}`;\r\n } else answer = Beautify(num, 0, 4); // If number is too large or little, revert to scientific notation\r\n } else if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 2 &&\r\n !forced) ||\r\n forced === 2\r\n ) {\r\n // Short scale, 123456789 => 123.457 M\r\n if (num >= 0.01 && num < Number(`1e${shortScale.length * 3}`)) {\r\n answer += ` ${shortScale[AmountOfTenPowerThree]}`;\r\n } else answer = Beautify(num, 0, 4); // If number is too large or little, revert to scientific notation\r\n } else if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 3 &&\r\n !forced) ||\r\n forced === 3\r\n ) {\r\n // Short scale, 123456789 => 123.457 M\r\n if (num >= 0.01 && num < Number(`1e${shortScaleAbbreviated.length * 3}`)) {\r\n answer += ` ${shortScaleAbbreviated[AmountOfTenPowerThree]}`;\r\n } else answer = Beautify(num, 0, 4); // If number is too large or little, revert to scientific notation\r\n } else if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 5 &&\r\n !forced) ||\r\n forced === 5\r\n ) {\r\n // Engineering notation, 123456789 => 123.457E+6\r\n answer += `E${AmountOfTenPowerThree * 3}`;\r\n }\r\n }\r\n if (answer === '') {\r\n // eslint-disable-next-line no-console\r\n console.log(`Could not beautify number with Cookie Monster Beautify: ${num}`);\r\n answer = BackupFunctions.Beautify(num, floats);\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator)\r\n answer = answer.replace('.', ',');\r\n return answer;\r\n }\r\n console.log(`Could not beautify number with Cookie Monster Beautify: ${num}`); // eslint-disable-line no-console\r\n return BackupFunctions.Beautify(num, floats);\r\n}\r\n","import {\r\n CacheMinPPBulk,\r\n CacheObjects1,\r\n CacheObjects10,\r\n CacheObjects100,\r\n CacheObjectsNextAchievement,\r\n} from '../../Cache/VariablesAndData';\r\nimport BuildingSell from '../../Sim/SimulationEvents/SellBuilding';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\nimport { ColoursOrdering, LastTargetBuildings } from '../VariablesAndData';\r\n\r\n/**\r\n * Section: Functions related to right column of the screen (buildings/upgrades)\r\n\r\n/**\r\n * This function adjusts some things in the column of buildings.\r\n * It colours them, helps display the correct sell-price and shuffles the order when CM.Options.SortBuildings is set\r\n * The function is called by CM.Disp.Draw(), CM.Disp.UpdateColours() & CM.Disp.RefreshScale()\r\n * And by changes in CM.Options.BuildColour, CM.Options.SortBuild & CM.Data.Config.BulkBuildColour\r\n */\r\nexport default function UpdateBuildings() {\r\n let target = Game.buyBulk;\r\n if (Game.buyMode === 1) {\r\n LastTargetBuildings = target;\r\n } else {\r\n target = LastTargetBuildings;\r\n }\r\n if (target === 1) target = CacheObjects1;\r\n else if (target === 10) target = CacheObjects10;\r\n else if (target === 100) target = CacheObjects100;\r\n\r\n // Remove colour if applied\r\n l(`storeBulk1`).style.removeProperty('color');\r\n l(`storeBulk10`).style.removeProperty('color');\r\n l(`storeBulk100`).style.removeProperty('color');\r\n\r\n if (Game.buyMode === 1) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BuildColour === 1) {\r\n Object.keys(target).forEach((i) => {\r\n l(`productPrice${Game.Objects[i].id}`).style.color =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[\r\n `Colour${target[i].colour}`\r\n ];\r\n });\r\n l(`storeBulk${CacheMinPPBulk}`).style.color =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ColourGreen;\r\n } else {\r\n Object.keys(Game.Objects).forEach((i) => {\r\n l(`productPrice${Game.Objects[i].id}`).style.removeProperty('color');\r\n });\r\n }\r\n } else if (Game.buyMode === -1) {\r\n Object.keys(CacheObjects1).forEach((i) => {\r\n const o = Game.Objects[i];\r\n l(`productPrice${o.id}`).style.color = '';\r\n /*\r\n * Fix sell price displayed in the object in the store.\r\n *\r\n * The buildings sell price displayed by the game itself (without any mod) is incorrect.\r\n * The following line of code fixes this issue, and can be safely removed when the game gets fixed.\r\n *\r\n * This issue is extensively detailed here: https://github.com/Aktanusa/CookieMonster/issues/359#issuecomment-735658262\r\n */\r\n l(`productPrice${o.id}`).innerHTML = Beautify(\r\n BuildingSell(o, o.basePrice, o.amount, o.free, Game.buyBulk, 1),\r\n );\r\n });\r\n }\r\n\r\n // Build array of pointers and sort according to the user's configured sort option.\r\n // This regulates sorting of buildings.\r\n let arr;\r\n if (\r\n Game.buyMode !== 1 ||\r\n !Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings\r\n ) {\r\n arr = Object.keys(CacheObjects1).map((k) => {\r\n const o = {};\r\n o.name = k;\r\n o.id = Game.Objects[k].id;\r\n return o;\r\n });\r\n // Sort using default order.\r\n arr.sort((a, b) => a.id - b.id);\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings === 1\r\n ) {\r\n arr = Object.keys(CacheObjects1).map((k) => {\r\n const o = {};\r\n o.name = k;\r\n o.pp = CacheObjects1[k].pp;\r\n o.colour = CacheObjects1[k].colour;\r\n return o;\r\n });\r\n // Sort by pp colour group, then by pp.\r\n arr.sort((a, b) =>\r\n ColoursOrdering.indexOf(a.colour) === ColoursOrdering.indexOf(b.colour)\r\n ? a.pp - b.pp\r\n : ColoursOrdering.indexOf(a.colour) - ColoursOrdering.indexOf(b.colour),\r\n );\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings === 2\r\n ) {\r\n arr = Object.keys(target).map((k) => {\r\n const o = {};\r\n o.name = k;\r\n o.pp = target[k].pp;\r\n o.colour = target[k].colour;\r\n return o;\r\n });\r\n // Sort by pp colour group, then by pp.\r\n arr.sort((a, b) =>\r\n ColoursOrdering.indexOf(a.colour) === ColoursOrdering.indexOf(b.colour)\r\n ? a.pp - b.pp\r\n : ColoursOrdering.indexOf(a.colour) - ColoursOrdering.indexOf(b.colour),\r\n );\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings === 3\r\n ) {\r\n arr = Object.keys(CacheObjectsNextAchievement).map((k) => {\r\n const o = {};\r\n o.name = k;\r\n o.id = Game.Objects[k].id;\r\n o.amountUntilNext = CacheObjectsNextAchievement[k].AmountNeeded;\r\n o.priceUntilNext = CacheObjectsNextAchievement[k].price;\r\n return o;\r\n });\r\n // First, sort using default order.\r\n arr.sort((a, b) => a.id - b.id);\r\n // Sort by price until next achievement.\r\n // Buildings that aren't within 100 of an achievement are placed at the end, still in\r\n // default order relative to each other because sort() is guaranteed stable.\r\n arr.sort(\r\n (a, b) =>\r\n (a.amountUntilNext !== 101 ? a.priceUntilNext : Infinity) -\r\n (b.amountUntilNext !== 101 ? b.priceUntilNext : Infinity),\r\n );\r\n }\r\n\r\n // Use array index (+2) as the grid row number.\r\n // (grid rows are 1-based indexing, and row 1 is the bulk buy/sell options)\r\n for (let x = 0; x < arr.length; x++) {\r\n Game.Objects[arr[x].name].l.style.gridRow = `${x + 2}/${x + 2}`;\r\n }\r\n}\r\n","/**\r\n * This function toggles the upgrade to be always expanded\r\n * It is called by a change in CM.Options.ToolWarnPos\r\n * and upon creation of the warning tooltip by CM.Disp.UpdateTooltipWarnings()\r\n */\r\nexport default function UpdateUpgradeSectionsHeight() {\r\n Object.values(document.getElementsByClassName('storeSection')).forEach((section) => {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpgradesNeverCollapse ||\r\n section.id === 'products'\r\n ) {\r\n section.style.height = 'auto'; // eslint-disable-line no-param-reassign\r\n } else if (section.id === 'vaultUpgrades') {\r\n section.style.height = ''; // eslint-disable-line no-param-reassign\r\n section.style.minHeight = '0px'; // eslint-disable-line no-param-reassign\r\n } else if (section.id === 'upgrades') {\r\n section.style.height = ''; // eslint-disable-line no-param-reassign\r\n if (section.className.includes('hasMenu')) {\r\n section.style.minHeight = '82px'; // eslint-disable-line no-param-reassign\r\n } else {\r\n section.style.minHeight = '60px'; // eslint-disable-line no-param-reassign\r\n }\r\n } else {\r\n section.style.height = ''; // eslint-disable-line no-param-reassign\r\n section.style.minHeight = '60px'; // eslint-disable-line no-param-reassign\r\n }\r\n });\r\n}\r\n","import { CacheUpgrades } from '../../Cache/VariablesAndData';\r\nimport {\r\n ColourBackPre,\r\n ColourBlue,\r\n ColourGray,\r\n ColourGreen,\r\n ColourOrange,\r\n ColourPurple,\r\n ColourRed,\r\n ColoursOrdering,\r\n ColourYellow,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function adjusts some things in the upgrades section\r\n * It colours them and shuffles the order when CM.Options.SortBuildings is set\r\n * The function is called by CM.Disp.Draw(), CM.Disp.ToggleUpgradeBarAndColour & CM.Disp.RefreshScale()\r\n * And by changes in CM.Options.SortUpgrades\r\n */\r\nexport default function UpdateUpgrades() {\r\n // This counts the amount of upgrades for each pp group and updates the Upgrade Bar\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour > 0) {\r\n let blue = 0;\r\n let green = 0;\r\n let yellow = 0;\r\n let orange = 0;\r\n let red = 0;\r\n let purple = 0;\r\n let gray = 0;\r\n\r\n Object.keys(Game.UpgradesInStore).forEach((i) => {\r\n const me = Game.UpgradesInStore[i];\r\n let addedColour = false;\r\n for (let j = 0; j < l(`upgrade${i}`).childNodes.length; j += 1) {\r\n if (l(`upgrade${i}`).childNodes[j].className.indexOf(ColourBackPre) !== -1) {\r\n l(`upgrade${i}`).childNodes[j].className = ColourBackPre + CacheUpgrades[me.name].colour;\r\n addedColour = true;\r\n break;\r\n }\r\n }\r\n if (!addedColour) {\r\n const div = document.createElement('div');\r\n div.style.width = '10px';\r\n div.style.height = '10px';\r\n div.className = ColourBackPre + CacheUpgrades[me.name].colour;\r\n l(`upgrade${i}`).appendChild(div);\r\n }\r\n if (CacheUpgrades[me.name].colour === ColourBlue) blue += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourGreen) green += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourYellow) yellow += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourOrange) orange += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourRed) red += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourPurple) purple += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourGray) gray += 1;\r\n });\r\n\r\n l('CMUpgradeBarBlue').textContent = blue;\r\n l('CMUpgradeBarGreen').textContent = green;\r\n l('CMUpgradeBarYellow').textContent = yellow;\r\n l('CMUpgradeBarOrange').textContent = orange;\r\n l('CMUpgradeBarRed').textContent = red;\r\n l('CMUpgradeBarPurple').textContent = purple;\r\n l('CMUpgradeBarGray').textContent = gray;\r\n }\r\n\r\n const arr = [];\r\n // Build array of pointers, sort by pp, set flex positions\r\n // This regulates sorting of upgrades\r\n for (let x = 0; x < Game.UpgradesInStore.length; x += 1) {\r\n const o = {};\r\n o.name = Game.UpgradesInStore[x].name;\r\n o.price = Game.UpgradesInStore[x].basePrice;\r\n o.pp = CacheUpgrades[o.name].pp;\r\n o.colour = CacheUpgrades[o.name].colour;\r\n arr.push(o);\r\n }\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortUpgrades) {\r\n // Sort by pp colour group, then by pp.\r\n arr.sort((a, b) =>\r\n ColoursOrdering.indexOf(a.colour) === ColoursOrdering.indexOf(b.colour)\r\n ? a.pp - b.pp\r\n : ColoursOrdering.indexOf(a.colour) - ColoursOrdering.indexOf(b.colour),\r\n );\r\n } else {\r\n arr.sort((a, b) => a.price - b.price);\r\n }\r\n\r\n const nameChecker = function (arr2, upgrade) {\r\n return arr2.findIndex((e) => e.name === upgrade.name);\r\n };\r\n for (let x = 0; x < Game.UpgradesInStore.length; x += 1) {\r\n l(`upgrade${x}`).style.order = nameChecker(arr, Game.UpgradesInStore[x]) + 1;\r\n }\r\n}\r\n","/**\r\n * This function returns time as a string depending on TimeFormat setting\r\n * @param \t{number} \ttime\t\tTime to be formatted\r\n * @param \t{number}\tlongFormat \t1 or 0\r\n * @returns\t{string}\t\t\t\tFormatted time\r\n */\r\nexport default function FormatTime(time, longFormat) {\r\n /* eslint-disable no-nested-ternary */\r\n let formattedTime = time;\r\n if (time === Infinity) return time;\r\n if (time < 0) return 'Negative time period';\r\n formattedTime = Math.ceil(time);\r\n const y = Math.floor(formattedTime / 31536000);\r\n const d = Math.floor((formattedTime % 31536000) / 86400);\r\n const h = Math.floor(((formattedTime % 31536000) % 86400) / 3600);\r\n const m = Math.floor((((formattedTime % 31536000) % 86400) % 3600) / 60);\r\n const s = Math.floor((((formattedTime % 31536000) % 86400) % 3600) % 60);\r\n let str = '';\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat === 0) {\r\n if (formattedTime > 777600000) return longFormat ? 'Over 9000 days!' : '>9000d';\r\n str += y > 0 ? `${y + (longFormat ? (y === 1 ? ' year' : ' years') : 'y')}, ` : '';\r\n if (str.length > 0 || d > 0)\r\n str += `${d + (longFormat ? (d === 1 ? ' day' : ' days') : 'd')}, `;\r\n if (str.length > 0 || h > 0)\r\n str += `${h + (longFormat ? (h === 1 ? ' hour' : ' hours') : 'h')}, `;\r\n if (str.length > 0 || m > 0)\r\n str += `${m + (longFormat ? (m === 1 ? ' minute' : ' minutes') : 'm')}, `;\r\n str += s + (longFormat ? (s === 1 ? ' second' : ' seconds') : 's');\r\n } else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat === 1) {\r\n if (formattedTime > 3155760000) return 'XX:XX:XX:XX:XX';\r\n str += `${(y < 10 ? '0' : '') + y}:`;\r\n str += `${(d < 10 ? '0' : '') + d}:`;\r\n str += `${(h < 10 ? '0' : '') + h}:`;\r\n str += `${(m < 10 ? '0' : '') + m}:`;\r\n str += (s < 10 ? '0' : '') + s;\r\n } else {\r\n // Similar to TimeFormat === 0, but only two most significant components are included.\r\n if (formattedTime > 777600000) return longFormat ? 'Over 9000 days!' : '>9000d';\r\n if (y > 0) {\r\n str += `${y + (longFormat ? (y === 1 ? ' year' : ' years') : 'y')}, `;\r\n str += `${d + (longFormat ? (d === 1 ? ' day' : ' days') : 'd')}`;\r\n } else if (d > 0) {\r\n str += `${d + (longFormat ? (d === 1 ? ' day' : ' days') : 'd')}, `;\r\n str += `${h + (longFormat ? (h === 1 ? ' hour' : ' hours') : 'h')}`;\r\n } else if (h > 0) {\r\n str += `${h + (longFormat ? (h === 1 ? ' hour' : ' hours') : 'h')}, `;\r\n str += `${m + (longFormat ? (m === 1 ? ' minute' : ' minutes') : 'm')}`;\r\n } else if (m > 0) {\r\n str += `${m + (longFormat ? (m === 1 ? ' minute' : ' minutes') : 'm')}, `;\r\n str += s + (longFormat ? (s === 1 ? ' second' : ' seconds') : 's');\r\n } else {\r\n str += s + (longFormat ? (s === 1 ? ' second' : ' seconds') : 's');\r\n }\r\n }\r\n return str;\r\n}\r\n","import { ColourGreen, ColourOrange, ColourRed, ColourYellow } from '../VariablesAndData';\r\nimport FormatTime from './FormatTime';\r\n\r\n/**\r\n * This function returns the colour to be used for time-strings\r\n * @param\t{number}\t\t\ttime\t\t\tTime to be coloured\r\n * @returns {{string, string}}\t{text, colour}\tBoth the formatted time and colour as strings in an array\r\n */\r\nexport default function GetTimeColour(time) {\r\n let colour;\r\n let text;\r\n if (time <= 0) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat === 1)\r\n text = '00:00:00:00:00';\r\n else text = 'Done!';\r\n colour = ColourGreen;\r\n } else {\r\n text = FormatTime(time);\r\n if (time > 300) colour = ColourRed;\r\n else if (time > 60) colour = ColourOrange;\r\n else colour = ColourYellow;\r\n }\r\n return { text, colour };\r\n}\r\n","import {\r\n CacheAverageCPS,\r\n CacheCurrWrinklerCount,\r\n CacheCurrWrinklerCPSMult,\r\n CacheWrinklersFattest,\r\n} from '../../Cache/VariablesAndData';\r\n\r\n/**\r\n * This function returns the cps as either current or average CPS depending on CM.Options.CPSMode\r\n * @returns\t{number}\tThe average or current cps\r\n */\r\nexport default function GetCPS() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CPSMode) {\r\n return CacheAverageCPS;\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 0) {\r\n return Game.cookiesPs * (1 - Game.cpsSucked);\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 1) {\r\n return Game.cookiesPs * (CacheCurrWrinklerCPSMult + (1 - CacheCurrWrinklerCount * 0.05));\r\n }\r\n if (CacheWrinklersFattest[1] !== null)\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 2 &&\r\n Game.wrinklers[CacheWrinklersFattest[1]].type === 1\r\n ) {\r\n return (\r\n Game.cookiesPs *\r\n ((CacheCurrWrinklerCPSMult * 3) / CacheCurrWrinklerCount +\r\n (1 - CacheCurrWrinklerCount * 0.05))\r\n );\r\n }\r\n return (\r\n Game.cookiesPs *\r\n (CacheCurrWrinklerCPSMult / CacheCurrWrinklerCount + (1 - CacheCurrWrinklerCount * 0.05))\r\n );\r\n}\r\n","import { CacheWrinklersFattest, CacheWrinklersTotal } from '../../Cache/VariablesAndData';\r\n\r\n/**\r\n * This function returns the total amount stored in the Wrinkler Bank\r\n * as calculated by CM.Cache.CacheWrinklers() if CM.Options.CalcWrink is set\r\n * @returns\t{number}\t0 or the amount of cookies stored (CM.Cache.WrinklersTotal)\r\n */\r\nexport default function GetWrinkConfigBank() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 1) {\r\n return CacheWrinklersTotal;\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 2) {\r\n return CacheWrinklersFattest[0];\r\n }\r\n return 0;\r\n}\r\n","/** Functions to create various DOM elements used by the Bars */\r\n\r\nimport { ColourBackPre, ColourBlue, ColourTextPre } from '../VariablesAndData';\r\n\r\n/**\r\n * This function creates an indivudual timer for the timer bar\r\n * @param\t{string}\t\t\t\t\tid\t\t\t\t\tAn id to identify the timer\r\n * @param\t{string}\t\t\t\t\tname\t\t\t\tThe title of the timer\r\n * @param\t[{{string}, {string}}, ...]\tbars ([id, colour])\tThe id and colours of individual parts of the timer\r\n */\r\nexport function CreateTimer(id, name, bars) {\r\n const timerBar = document.createElement('div');\r\n timerBar.id = id;\r\n timerBar.style.height = '12px';\r\n timerBar.style.margin = '0px 10px';\r\n timerBar.style.position = 'relative';\r\n\r\n const div = document.createElement('div');\r\n div.style.width = '100%';\r\n div.style.height = '10px';\r\n div.style.margin = 'auto';\r\n div.style.position = 'absolute';\r\n div.style.left = '0px';\r\n div.style.top = '0px';\r\n div.style.right = '0px';\r\n div.style.bottom = '0px';\r\n\r\n const type = document.createElement('span');\r\n type.style.display = 'inline-block';\r\n type.style.textAlign = 'right';\r\n type.style.fontSize = '10px';\r\n type.style.width = '108px';\r\n type.style.marginRight = '5px';\r\n type.style.verticalAlign = 'text-top';\r\n type.textContent = name;\r\n div.appendChild(type);\r\n\r\n for (let i = 0; i < bars.length; i++) {\r\n const colourBar = document.createElement('span');\r\n colourBar.id = bars[i].id;\r\n colourBar.style.display = 'inline-block';\r\n colourBar.style.height = '10px';\r\n colourBar.style.verticalAlign = 'text-top';\r\n colourBar.style.textAlign = 'center';\r\n if (bars.length - 1 === i) {\r\n colourBar.style.borderTopRightRadius = '10px';\r\n colourBar.style.borderBottomRightRadius = '10px';\r\n }\r\n if (typeof bars[i].colour !== 'undefined') {\r\n colourBar.className = ColourBackPre + bars[i].colour;\r\n }\r\n div.appendChild(colourBar);\r\n }\r\n\r\n const timer = document.createElement('span');\r\n timer.id = `${id}Time`;\r\n timer.style.marginLeft = '5px';\r\n timer.style.verticalAlign = 'text-top';\r\n div.appendChild(timer);\r\n\r\n timerBar.appendChild(div);\r\n\r\n return timerBar;\r\n}\r\n\r\n/**\r\n * This function extends the bottom bar (created by CM.Disp.CreateBotBar) with a column for the given building.\r\n * @param\t{string}\tbuildingName\tObjectname to be added (e.g., \"Cursor\")\r\n */\r\nexport function CreateBotBarBuildingColumn(buildingName) {\r\n if (l('CMBotBar') !== null) {\r\n const type = l('CMBotBar').firstChild.firstChild.childNodes[0];\r\n const bonus = l('CMBotBar').firstChild.firstChild.childNodes[1];\r\n const pp = l('CMBotBar').firstChild.firstChild.childNodes[2];\r\n const time = l('CMBotBar').firstChild.firstChild.childNodes[3];\r\n\r\n const i = buildingName;\r\n const header = type.appendChild(document.createElement('td'));\r\n header.appendChild(\r\n document.createTextNode(`${i.indexOf(' ') !== -1 ? i.substring(0, i.indexOf(' ')) : i} (`),\r\n );\r\n\r\n const span = header.appendChild(document.createElement('span'));\r\n span.className = ColourTextPre + ColourBlue;\r\n\r\n header.appendChild(document.createTextNode(')'));\r\n type.lastChild.style.paddingLeft = '8px';\r\n bonus.appendChild(document.createElement('td'));\r\n bonus.lastChild.style.paddingLeft = '8px';\r\n pp.appendChild(document.createElement('td'));\r\n pp.lastChild.style.paddingLeft = '8px';\r\n time.appendChild(document.createElement('td'));\r\n time.lastChild.style.paddingLeft = '2px';\r\n }\r\n}\r\n","/** Functions related to the Bottom Bar */\r\n\r\nimport { CacheObjects1, CacheObjects10, CacheObjects100 } from '../../Cache/VariablesAndData';\r\nimport { VersionMajor, VersionMinor } from '../../Data/Moddata';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../BeautifyAndFormatting/FormatTime';\r\nimport GetTimeColour from '../BeautifyAndFormatting/GetTimeColour';\r\n\r\nimport GetCPS from '../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../HelperFunctions/GetWrinkConfigBank';\r\nimport { ColourBlue, ColourTextPre, ColourYellow, LastTargetBotBar } from '../VariablesAndData';\r\nimport { CreateBotBarBuildingColumn } from './CreateDOMElements';\r\n\r\n/**\r\n * This function creates the bottom bar and appends it to l('wrapper')\r\n */\r\nexport function CreateBotBar() {\r\n const BotBar = document.createElement('div');\r\n BotBar.id = 'CMBotBar';\r\n BotBar.style.height = '69px';\r\n BotBar.style.width = '100%';\r\n BotBar.style.position = 'absolute';\r\n BotBar.style.display = 'none';\r\n BotBar.style.backgroundColor = '#262224';\r\n BotBar.style.backgroundImage = 'linear-gradient(to bottom, #4d4548, #000000)';\r\n BotBar.style.borderTop = '1px solid black';\r\n BotBar.style.overflow = 'auto';\r\n BotBar.style.textShadow = '-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black';\r\n\r\n const table = BotBar.appendChild(document.createElement('table'));\r\n table.style.width = '100%';\r\n table.style.textAlign = 'center';\r\n table.style.whiteSpace = 'nowrap';\r\n const tbody = table.appendChild(document.createElement('tbody'));\r\n\r\n const firstCol = function (text, colour) {\r\n const td = document.createElement('td');\r\n td.style.textAlign = 'right';\r\n td.className = ColourTextPre + colour;\r\n td.textContent = text;\r\n return td;\r\n };\r\n const type = tbody.appendChild(document.createElement('tr'));\r\n type.style.fontWeight = 'bold';\r\n type.appendChild(firstCol(`CM ${VersionMajor}.${VersionMinor}`, ColourYellow));\r\n const bonus = tbody.appendChild(document.createElement('tr'));\r\n bonus.appendChild(firstCol('Bonus Income', ColourBlue));\r\n const pp = tbody.appendChild(document.createElement('tr'));\r\n pp.appendChild(firstCol('Payback Period', ColourBlue));\r\n const time = tbody.appendChild(document.createElement('tr'));\r\n time.appendChild(firstCol('Time Left', ColourBlue));\r\n\r\n l('wrapper').appendChild(BotBar);\r\n\r\n Object.keys(Game.Objects).forEach((i) => {\r\n CreateBotBarBuildingColumn(i);\r\n });\r\n}\r\n\r\n/**\r\n * This function updates the bonus-, pp-, and time-rows in the the bottom bar\r\n */\r\nexport function UpdateBotBar() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1 &&\r\n CacheObjects1 &&\r\n Game.buyMode === 1\r\n ) {\r\n let count = 0;\r\n Object.keys(CacheObjects1).forEach((i) => {\r\n let target = Game.buyBulk;\r\n if (Game.buyMode === 1) {\r\n LastTargetBotBar = target;\r\n } else {\r\n target = LastTargetBotBar;\r\n }\r\n if (target === 1) target = CacheObjects1;\r\n if (target === 10) target = CacheObjects10;\r\n if (target === 100) target = CacheObjects100;\r\n count += 1;\r\n l('CMBotBar').firstChild.firstChild.childNodes[0].childNodes[\r\n count\r\n ].childNodes[1].textContent = Game.Objects[i].amount;\r\n l('CMBotBar').firstChild.firstChild.childNodes[1].childNodes[count].textContent = Beautify(\r\n target[i].bonus,\r\n 2,\r\n );\r\n l('CMBotBar').firstChild.firstChild.childNodes[2].childNodes[count].className =\r\n ColourTextPre + target[i].colour;\r\n let PPString;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime)\r\n PPString = FormatTime(Math.round(target[i].pp));\r\n else PPString = Beautify(Math.round(target[i].pp), 2);\r\n l('CMBotBar').firstChild.firstChild.childNodes[2].childNodes[count].textContent = PPString;\r\n const timeColour = GetTimeColour(\r\n (Game.Objects[i].bulkPrice - (Game.cookies + GetWrinkConfigBank())) / GetCPS(),\r\n );\r\n l('CMBotBar').firstChild.firstChild.childNodes[3].childNodes[count].className =\r\n ColourTextPre + timeColour.colour;\r\n if (timeColour.text === 'Done!' && Game.cookies < Game.Objects[i].bulkPrice) {\r\n l('CMBotBar').firstChild.firstChild.childNodes[3].childNodes[\r\n count\r\n ].textContent = `${timeColour.text} (with Wrink)`;\r\n } else\r\n l('CMBotBar').firstChild.firstChild.childNodes[3].childNodes[count].textContent =\r\n timeColour.text;\r\n });\r\n }\r\n}\r\n","/**\r\n * This function sets the size of the background of the full game and the left column\r\n * depending on whether certain abrs are activated\r\n * It is called by CM.Disp.UpdateAscendState() and CM.Disp.UpdateBotTimerBarPosition()\r\n */\r\nexport default function UpdateBackground() {\r\n Game.Background.canvas.width = Game.Background.canvas.parentNode.offsetWidth;\r\n Game.Background.canvas.height = Game.Background.canvas.parentNode.offsetHeight;\r\n Game.LeftBackground.canvas.width = Game.LeftBackground.canvas.parentNode.offsetWidth;\r\n Game.LeftBackground.canvas.height = Game.LeftBackground.canvas.parentNode.offsetHeight;\r\n Game.DrawBackground();\r\n}\r\n","/** Called by the \"func\" of individual settings */\r\n\r\nimport UpdateBackground from '../Disp/HelperFunctions/UpdateBackground';\r\n\r\n/**\r\n * This function changes the position of both the bottom and timer bar\r\n */\r\nexport function UpdateBotTimerBarPosition() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 1\r\n ) {\r\n l('CMBotBar').style.bottom = l('CMTimerBar').style.height;\r\n l('game').style.bottom = `${Number(l('CMTimerBar').style.height.replace('px', '')) + 70}px`;\r\n } else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1) {\r\n l('CMBotBar').style.bottom = '0px';\r\n l('game').style.bottom = '70px';\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 1\r\n ) {\r\n l('game').style.bottom = l('CMTimerBar').style.height;\r\n } else {\r\n // No bars\r\n l('game').style.bottom = '0px';\r\n }\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 0\r\n ) {\r\n l('sectionLeft').style.top = l('CMTimerBar').style.height;\r\n } else {\r\n l('sectionLeft').style.top = '';\r\n }\r\n\r\n UpdateBackground();\r\n}\r\n\r\n/**\r\n * This function changes the visibility of the timer bar\r\n */\r\nexport function ToggleTimerBar() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1)\r\n l('CMTimerBar').style.display = '';\r\n else l('CMTimerBar').style.display = 'none';\r\n UpdateBotTimerBarPosition();\r\n}\r\n\r\n/**\r\n * This function changes the position of the timer bar\r\n */\r\nexport function ToggleTimerBarPos() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 0) {\r\n l('CMTimerBar').style.width = '30%';\r\n l('CMTimerBar').style.bottom = '';\r\n l('game').insertBefore(l('CMTimerBar'), l('sectionLeft'));\r\n } else {\r\n l('CMTimerBar').style.width = '100%';\r\n l('CMTimerBar').style.bottom = '0px';\r\n l('wrapper').appendChild(l('CMTimerBar'));\r\n }\r\n UpdateBotTimerBarPosition();\r\n}\r\n","import { CacheDragonAura, CacheDragonAura2 } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This functions caches the currently selected Dragon Auras\r\n */\r\nexport default function CacheDragonAuras() {\r\n CacheDragonAura = Game.dragonAura;\r\n CacheDragonAura2 = Game.dragonAura2;\r\n}\r\n","/**\r\n * This function constructs an object with the static properties of an achievement\r\n * @param\t{string}\tachievementName\tName of the Achievement\r\n * @returns {Object}\tyou\t\t\t\tThe static object\r\n */\r\nexport default function InitAchievement(achievementName) {\r\n const me = Game.Achievements[achievementName];\r\n const you = {};\r\n you.name = me.name;\r\n return you;\r\n}\r\n","import { SimObjects } from '../VariablesAndData';\r\nimport SimHas from './SimHas';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.GetTieredCpsMult but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimGetTieredCpsMult(me) {\r\n let mult = 1;\r\n Object.keys(me.tieredUpgrades).forEach((i) => {\r\n if (!Game.Tiers[me.tieredUpgrades[i].tier].special && SimHas(me.tieredUpgrades[i].name)) {\r\n let tierMult = 2;\r\n // unshackled multipliers\r\n if (\r\n Game.ascensionMode !== 1 &&\r\n SimHas(me.unshackleUpgrade) &&\r\n SimHas(Game.Tiers[me.tieredUpgrades[i].tier].unshackleUpgrade)\r\n )\r\n tierMult += me.id === 1 ? 0.5 : (20 - me.id) * 0.1;\r\n mult *= tierMult;\r\n }\r\n });\r\n Object.keys(me.synergies).forEach((i) => {\r\n if (SimHas(me.synergies[i].name)) {\r\n const syn = me.synergies[i];\r\n if (syn.buildingTie1.name === me.name) mult *= 1 + 0.05 * syn.buildingTie2.amount;\r\n else if (syn.buildingTie2.name === me.name) mult *= 1 + 0.001 * syn.buildingTie1.amount;\r\n }\r\n });\r\n if (me.fortune && SimHas(me.fortune.name)) mult *= 1.07;\r\n if (me.grandma && SimHas(me.grandma.name))\r\n mult *= 1 + SimObjects.Grandma.amount * 0.01 * (1 / (me.id - 1));\r\n if (typeof me.tieredUpgrades.misfortune === 'object') {\r\n if (me.vanilla === 1 && SimHas(me.tieredUpgrades.misfortune.name)) {\r\n switch (Game.elderWrath) {\r\n default:\r\n mult *= 1;\r\n break;\r\n case 1:\r\n mult *= 1.02;\r\n break;\r\n case 2:\r\n mult *= 1.04;\r\n break;\r\n case 3:\r\n mult *= 1.06;\r\n break;\r\n }\r\n }\r\n }\r\n return mult;\r\n}\r\n","import SimAuraMult from '../ReplacedGameFunctions/SimAuraMult';\r\nimport SimEff from '../ReplacedGameFunctions/SimEff';\r\nimport SimGetTieredCpsMult from '../ReplacedGameFunctions/SimGetTieredCpsMult';\r\nimport SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport { SimObjects } from '../VariablesAndData';\r\n\r\n/**\r\n * This function constructs an object with the static properties of a building,\r\n * but with a 'cps' method changed to check sim data\r\n *\r\n * @param\t{string}\tbuildingName\tName of the building\r\n * @returns {Object}\tyou\t\t\t\tThe static object\r\n */\r\nexport default function InitialBuildingData(buildingName) {\r\n const me = Game.Objects[buildingName];\r\n const you = {};\r\n if (me.name === 'Cursor') {\r\n you.cps = function (it) {\r\n let add = 0;\r\n if (SimHas('Thousand fingers')) add += 0.1;\r\n if (SimHas('Million fingers')) add *= 5;\r\n if (SimHas('Billion fingers')) add *= 10;\r\n if (SimHas('Trillion fingers')) add *= 20;\r\n if (SimHas('Quadrillion fingers')) add *= 20;\r\n if (SimHas('Quintillion fingers')) add *= 20;\r\n if (SimHas('Sextillion fingers')) add *= 20;\r\n if (SimHas('Septillion fingers')) add *= 20;\r\n if (SimHas('Octillion fingers')) add *= 20;\r\n if (SimHas('Nonillion fingers')) add *= 20;\r\n if (SimHas('Decillion fingers')) add *= 20;\r\n if (SimHas('Undecillion fingers')) add *= 20;\r\n if (SimHas('Unshackled cursors')) add *= 25;\r\n let mult = 1;\r\n let num = 0;\r\n Object.keys(SimObjects).forEach((i) => {\r\n if (SimObjects[i].name !== 'Cursor') num += SimObjects[i].amount;\r\n });\r\n add *= num;\r\n mult *= SimGetTieredCpsMult(it);\r\n mult *= Game.magicCpS('Cursor');\r\n mult *= SimEff('cursorCps');\r\n return (\r\n Game.ComputeCps(\r\n 0.1,\r\n SimHas('Reinforced index finger') +\r\n SimHas('Carpal tunnel prevention cream') +\r\n SimHas('Ambidextrous'),\r\n add,\r\n ) * mult\r\n );\r\n };\r\n } else if (me.name === 'Grandma') {\r\n you.cps = function (it) {\r\n let mult = 1;\r\n Object.keys(Game.GrandmaSynergies).forEach((i) => {\r\n if (SimHas(Game.GrandmaSynergies[i])) mult *= 2;\r\n });\r\n if (SimHas('Bingo center/Research facility')) mult *= 4;\r\n if (SimHas('Ritual rolling pins')) mult *= 2;\r\n if (SimHas('Naughty list')) mult *= 2;\r\n\r\n if (SimHas('Elderwort biscuits')) mult *= 1.02;\r\n\r\n mult *= SimEff('grandmaCps');\r\n\r\n if (SimHas('Cat ladies')) {\r\n for (let i = 0; i < Game.UpgradesByPool.kitten.length; i++) {\r\n if (SimHas(Game.UpgradesByPool.kitten[i].name)) mult *= 1.29;\r\n }\r\n }\r\n\r\n mult *= SimGetTieredCpsMult(it);\r\n\r\n let add = 0;\r\n if (SimHas('One mind')) add += SimObjects.Grandma.amount * 0.02;\r\n if (SimHas('Communal brainsweep')) add += SimObjects.Grandma.amount * 0.02;\r\n if (SimHas('Elder Pact')) add += SimObjects.Portal.amount * 0.05;\r\n\r\n let num = 0;\r\n Object.keys(SimObjects).forEach((i) => {\r\n if (SimObjects[i].name !== 'Grandma') num += SimObjects[i].amount;\r\n });\r\n // if (Game.hasAura('Elder Battalion')) mult*=1+0.01*num;\r\n mult *= 1 + SimAuraMult('Elder Battalion') * 0.01 * num;\r\n\r\n mult *= Game.magicCpS(me.name);\r\n\r\n return (me.baseCps + add) * mult;\r\n };\r\n } else {\r\n you.cps = function (it) {\r\n let mult = 1;\r\n mult *= SimGetTieredCpsMult(it);\r\n mult *= Game.magicCpS(it.name);\r\n return it.baseCPS * mult;\r\n };\r\n }\r\n\r\n // Below is needed for above eval, specifically for the SimGetTieredCpsMult function\r\n you.baseCps = me.baseCps;\r\n you.name = me.name;\r\n you.tieredUpgrades = me.tieredUpgrades;\r\n you.synergies = me.synergies;\r\n you.fortune = me.fortune;\r\n you.grandma = me.grandma;\r\n you.baseCPS = me.baseCps;\r\n you.id = me.id;\r\n you.vanilla = me.vanilla;\r\n you.unshackleUpgrade = me.unshackleUpgrade;\r\n return you;\r\n}\r\n","import SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport SimHasGod from '../ReplacedGameFunctions/SimHasGod';\r\nimport { SimObjects } from '../VariablesAndData';\r\n\r\n/**\r\n * This function constructs an object with the static properties of an upgrade\r\n * @param\t{string}\tupgradeName\t\tName of the Upgrade\r\n * @returns {Object}\tyou\t\t\t\tThe static object\r\n */\r\nexport default function InitUpgrade(upgradeName) {\r\n const me = Game.Upgrades[upgradeName];\r\n const you = {};\r\n // Some upgrades have a function for .power (notably the valentine cookies)\r\n you.power = me.power;\r\n if (typeof you.power === 'function') {\r\n if (me.name === 'Sugar crystal cookies') {\r\n you.power = function () {\r\n let n = 5;\r\n Object.keys(SimObjects).forEach((i) => {\r\n if (SimObjects[i].level >= 10) n += 1;\r\n });\r\n return n;\r\n };\r\n } else {\r\n you.power = function () {\r\n let pow = 2;\r\n if (SimHas('Starlove')) pow = 3;\r\n if (Game.hasGod) {\r\n const godLvl = SimHasGod('seasons');\r\n if (godLvl === 1) pow *= 1.3;\r\n else if (godLvl === 2) pow *= 1.2;\r\n else if (godLvl === 3) pow *= 1.1;\r\n }\r\n return pow;\r\n };\r\n }\r\n }\r\n you.pool = me.pool;\r\n you.name = me.name;\r\n return you;\r\n}\r\n","import CacheDragonAuras from '../../Cache/Dragon/CacheDragonAuras';\r\nimport { CacheDragonAura, CacheDragonAura2 } from '../../Cache/VariablesAndData';\r\nimport { CreateBotBarBuildingColumn } from '../../Disp/InfoBars/CreateDOMElements';\r\nimport InitAchievement from '../InitializeData/InitAchievement';\r\nimport InitialBuildingData from '../InitializeData/InitialBuildingData';\r\nimport InitUpgrade from '../InitializeData/InitUpgrade';\r\nimport {\r\n SimAchievements,\r\n SimAchievementsOwned, // eslint-disable-line no-unused-vars\r\n SimDragonAura, // eslint-disable-line no-unused-vars\r\n SimDragonAura2, // eslint-disable-line no-unused-vars\r\n SimGod1, // eslint-disable-line no-unused-vars\r\n SimGod2, // eslint-disable-line no-unused-vars\r\n SimGod3, // eslint-disable-line no-unused-vars\r\n SimHeavenlyPower, // eslint-disable-line no-unused-vars\r\n SimObjects,\r\n SimPledges, // eslint-disable-line no-unused-vars\r\n SimPrestige, // eslint-disable-line no-unused-vars\r\n SimUpgrades,\r\n SimUpgradesOwned, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function copies all relevant data and therefore sets a new iteration of the \"sim data\"\r\n * It is called at the start of any function that simulates certain behaviour or actions\r\n */\r\nexport default function CopyData() {\r\n // Other variables\r\n SimUpgradesOwned = Game.UpgradesOwned;\r\n SimPledges = Game.pledges;\r\n SimAchievementsOwned = Game.AchievementsOwned;\r\n SimHeavenlyPower = Game.heavenlyPower;\r\n SimPrestige = Game.prestige;\r\n\r\n // Buildings\r\n Object.keys(Game.Objects).forEach((i) => {\r\n const me = Game.Objects[i];\r\n let you = SimObjects[i];\r\n if (you === undefined) {\r\n // New building!\r\n SimObjects[i] = InitialBuildingData(i);\r\n you = SimObjects[i];\r\n CreateBotBarBuildingColumn(i); // Add new building to the bottom bar\r\n }\r\n you.amount = me.amount;\r\n you.level = me.level;\r\n you.totalCookies = me.totalCookies;\r\n you.basePrice = me.basePrice;\r\n you.free = me.free;\r\n if (me.minigameLoaded) {\r\n if (me.name === 'Temple') {\r\n SimGod1 = me.minigame.slot[0];\r\n SimGod2 = me.minigame.slot[1];\r\n SimGod3 = me.minigame.slot[2];\r\n }\r\n you.minigameLoaded = me.minigameLoaded;\r\n you.minigame = me.minigame;\r\n }\r\n SimObjects[i] = you;\r\n });\r\n\r\n // Upgrades\r\n Object.keys(Game.Upgrades).forEach((i) => {\r\n const me = Game.Upgrades[i];\r\n let you = SimUpgrades[i];\r\n if (you === undefined) {\r\n SimUpgrades[i] = InitUpgrade(i);\r\n you = SimUpgrades[i];\r\n }\r\n you.bought = me.bought;\r\n SimUpgrades[i] = you;\r\n });\r\n\r\n // Achievements\r\n Object.keys(Game.Achievements).forEach((i) => {\r\n const me = Game.Achievements[i];\r\n let you = SimAchievements[i];\r\n if (you === undefined) {\r\n SimAchievements[i] = InitAchievement(i);\r\n you = SimAchievements[i];\r\n }\r\n you.won = me.won;\r\n SimAchievements[i] = you;\r\n });\r\n\r\n // Auras\r\n CacheDragonAuras();\r\n SimDragonAura = CacheDragonAura;\r\n SimDragonAura2 = CacheDragonAura2;\r\n}\r\n","import {\r\n ColourTextPre,\r\n ColourBorderPre,\r\n ColourGray,\r\n ColourBlue,\r\n ColourRed,\r\n ColourYellow,\r\n ColourPurple,\r\n TooltipType,\r\n} from '../VariablesAndData';\r\n\r\n/** Creates various sections of tooltips */\r\n\r\n/**\r\n * This function creates a tooltipBox object which contains all CookieMonster added tooltip information.\r\n * @returns {object}\tdiv\t\tAn object containing the stylized box\r\n */\r\nexport function TooltipCreateTooltipBox() {\r\n l('tooltip').firstChild.style.paddingBottom = '4px'; // Sets padding on base-tooltip\r\n const tooltipBox = document.createElement('div');\r\n tooltipBox.style.border = '1px solid';\r\n tooltipBox.style.padding = '4px';\r\n tooltipBox.style.margin = '0px -4px';\r\n tooltipBox.id = 'CMTooltipBorder';\r\n tooltipBox.className = ColourTextPre + ColourGray;\r\n return tooltipBox;\r\n}\r\n\r\n/**\r\n * This function creates a header object for tooltips.\r\n * @param\t{string}\ttext\tTitle of header\r\n * @returns {object}\tdiv\t\tAn object containing the stylized header\r\n */\r\nexport function TooltipCreateHeader(text) {\r\n const div = document.createElement('div');\r\n div.style.fontWeight = 'bold';\r\n div.id = `${text}Title`;\r\n div.className = ColourTextPre + ColourBlue;\r\n div.textContent = text;\r\n return div;\r\n}\r\n\r\n/**\r\n * This function creates the tooltip objectm for warnings\r\n * The object is also removed by CM.Disp.UpdateTooltipWarnings() when type is 's' or 'g'\r\n * @returns {object}\tTooltipWarn\tThe Warnings-tooltip object\r\n */\r\nexport function TooltipCreateWarningSection() {\r\n const TooltipWarn = document.createElement('div');\r\n TooltipWarn.style.position = 'absolute';\r\n TooltipWarn.style.display = 'block';\r\n TooltipWarn.style.left = 'auto';\r\n TooltipWarn.style.bottom = 'auto';\r\n TooltipWarn.id = 'CMDispTooltipWarningParent';\r\n\r\n const create = function (boxId, colour, labelTextFront, labelTextBack, deficitId) {\r\n const box = document.createElement('div');\r\n box.id = boxId;\r\n box.style.display = 'none';\r\n box.style.transition = 'opacity 0.1s ease-out';\r\n box.className = ColourBorderPre + colour;\r\n box.style.padding = '2px';\r\n box.style.background = '#000 url(img/darkNoise.png)';\r\n const labelDiv = document.createElement('div');\r\n box.appendChild(labelDiv);\r\n const labelSpan = document.createElement('span');\r\n labelSpan.className = ColourTextPre + colour;\r\n labelSpan.style.fontWeight = 'bold';\r\n labelSpan.textContent = labelTextFront;\r\n labelDiv.appendChild(labelSpan);\r\n labelDiv.appendChild(document.createTextNode(labelTextBack));\r\n const deficitDiv = document.createElement('div');\r\n box.appendChild(deficitDiv);\r\n const deficitSpan = document.createElement('span');\r\n deficitSpan.id = deficitId;\r\n deficitDiv.appendChild(document.createTextNode('Deficit: '));\r\n deficitDiv.appendChild(deficitSpan);\r\n return box;\r\n };\r\n\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnLucky',\r\n ColourRed,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies required for \"Lucky!\"',\r\n 'CMDispTooltipWarnLuckyText',\r\n ),\r\n );\r\n TooltipWarn.firstChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnLuckyFrenzy',\r\n ColourYellow,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies required for \"Lucky!\" (Frenzy)',\r\n 'CMDispTooltipWarnLuckyFrenzyText',\r\n ),\r\n );\r\n TooltipWarn.lastChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnConjure',\r\n ColourPurple,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies required for \"Conjure Baked Goods\"',\r\n 'CMDispTooltipWarnConjureText',\r\n ),\r\n );\r\n TooltipWarn.lastChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnConjureFrenzy',\r\n ColourPurple,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies required for \"Conjure Baked Goods\" (Frenzy)',\r\n 'CMDispTooltipWarnConjureFrenzyText',\r\n ),\r\n );\r\n TooltipWarn.lastChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnEdifice',\r\n ColourPurple,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies needed for \"Spontaneous Edifice\" to possibly give you your most expensive building\"',\r\n 'CMDispTooltipWarnEdificeText',\r\n ),\r\n );\r\n TooltipWarn.lastChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnUser',\r\n ColourRed,\r\n 'Warning: ',\r\n `Purchase of this item will put you under the number of Cookies equal to ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser} seconds of CPS`,\r\n 'CMDispTooltipWarnUserText',\r\n ),\r\n );\r\n\r\n return TooltipWarn;\r\n}\r\n\r\n/**\r\n * This function appends the sections for Bonus Income, PP and Time left (to achiev) to the tooltip-object\r\n * The actual data is added by the Update-functions themselves\r\n * @param\t{object}\ttooltip\t\tObject of a TooltipBox, normally created by a call to CM.Disp.TooltipCreateTooltipBox()\r\n */\r\nexport function TooltipCreateCalculationSection(tooltip) {\r\n tooltip.appendChild(TooltipCreateHeader('Bonus Income'));\r\n const income = document.createElement('div');\r\n income.style.marginBottom = '4px';\r\n income.style.color = 'white';\r\n income.id = 'CMTooltipIncome';\r\n tooltip.appendChild(income);\r\n\r\n tooltip.appendChild(TooltipCreateHeader('Bonus Cookies per Click'));\r\n tooltip.lastChild.style.display = 'none'; // eslint-disable-line no-param-reassign\r\n const click = document.createElement('div');\r\n click.style.marginBottom = '4px';\r\n click.style.color = 'white';\r\n click.style.display = 'none';\r\n click.id = 'CMTooltipCookiePerClick';\r\n tooltip.appendChild(click);\r\n\r\n tooltip.appendChild(TooltipCreateHeader('Payback Period'));\r\n const pp = document.createElement('div');\r\n pp.style.marginBottom = '4px';\r\n pp.id = 'CMTooltipPP';\r\n tooltip.appendChild(pp);\r\n\r\n tooltip.appendChild(TooltipCreateHeader('Time Left'));\r\n const time = document.createElement('div');\r\n time.id = 'CMTooltipTime';\r\n tooltip.appendChild(time);\r\n\r\n if (TooltipType === 'b') {\r\n tooltip.appendChild(TooltipCreateHeader('Production left till next achievement'));\r\n tooltip.lastChild.id = 'CMTooltipProductionLeftHeader'; // eslint-disable-line no-param-reassign\r\n const production = document.createElement('div');\r\n production.id = 'CMTooltipProductionLeft';\r\n tooltip.appendChild(production);\r\n }\r\n if (TooltipType === 'b') {\r\n tooltip.appendChild(TooltipCreateHeader('Buildings (price / PP) left till next achievement'));\r\n tooltip.lastChild.id = 'CMTooltipNextAchievementHeader'; // eslint-disable-line no-param-reassign\r\n const production = document.createElement('div');\r\n production.id = 'CMTooltipNextAchievement';\r\n tooltip.appendChild(production);\r\n }\r\n}\r\n","import GetCPS from '../../Disp/HelperFunctions/GetCPS';\r\nimport {\r\n ColourBlue,\r\n ColourGray,\r\n ColourGreen,\r\n ColourOrange,\r\n ColourPurple,\r\n ColourRed,\r\n ColourYellow,\r\n} from '../../Disp/VariablesAndData';\r\nimport { CacheMinPP, CachePPArray } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions return the colour assosciated with the given pp value\r\n * It is called by CM.Cache.CacheBuildingsPP(), CM.Cache.CacheBuildingsBulkPP() and CM.Cache.CacheUpgradePP()\r\n * @params\t{object}\tobj\t\tThe obj of which the pp value should be checked\r\n * @params\t{number}\tprice\tThe price of the object\r\n * @returns {string}\tcolour\tThe colour assosciated with the pp value\r\n */\r\nexport default function ColourOfPP(me, price) {\r\n let colour = '';\r\n // Colour based on PP\r\n if (me.pp <= 0 || me.pp === Infinity) colour = ColourGray;\r\n else if (me.pp < CacheMinPP) colour = ColourBlue;\r\n else if (me.pp === CacheMinPP) colour = ColourGreen;\r\n else if (me.pp < CachePPArray[10][0]) colour = ColourYellow;\r\n else if (me.pp < CachePPArray[20][0]) colour = ColourOrange;\r\n else if (me.pp < CachePPArray[30][0]) colour = ColourRed;\r\n else colour = ColourPurple;\r\n\r\n // Colour based on price in terms of CPS\r\n if (\r\n Number(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPSecondsLowerLimit,\r\n ) !== 0\r\n ) {\r\n if (\r\n price / GetCPS() <\r\n Number(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPSecondsLowerLimit,\r\n )\r\n )\r\n colour = ColourBlue;\r\n }\r\n // Colour based on being able to purchase\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPOnlyConsiderBuyable) {\r\n if (price - Game.cookies > 0) colour = ColourRed;\r\n }\r\n return colour;\r\n}\r\n","/**\r\n * This function returns the current CPS buff\r\n * @returns {number}\tmult\tThe multiplier\r\n */\r\nexport default function GetCPSBuffMult() {\r\n let mult = 1;\r\n Object.keys(Game.buffs).forEach((i) => {\r\n if (typeof Game.buffs[i].multCpS !== 'undefined') mult *= Game.buffs[i].multCpS;\r\n });\r\n return mult;\r\n}\r\n","import { SimAchievements, SimAchievementsOwned } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This function \"wins\" an achievement in the current sim data\r\n * It functions similarly to Game.Win()\r\n * It is not created by CM.Sim.CreateSimFunctions() in order to avoid spamming pop-ups upon winning\r\n * @param\t{string}\twhat\tName of the achievement\r\n */\r\nexport default function SimWin(what) {\r\n if (SimAchievements[what]) {\r\n if (SimAchievements[what].won === 0) {\r\n SimAchievements[what].won = 1;\r\n if (Game.Achievements[what].pool !== 'shadow') SimAchievementsOwned += 1;\r\n }\r\n }\r\n}\r\n","import GetCPSBuffMult from '../../Cache/CPS/GetCPSBuffMult';\r\nimport { CacheCentEgg } from '../../Cache/VariablesAndData';\r\nimport { CenturyDateAtBeginLoop, CycliusDateAtBeginLoop } from '../../Main/VariablesAndData';\r\nimport SimAuraMult from '../ReplacedGameFunctions/SimAuraMult';\r\nimport SimEff from '../ReplacedGameFunctions/SimEff';\r\nimport SimGetHeavenlyMultiplier from '../ReplacedGameFunctions/SimGetHeavenlyMultiplier';\r\nimport SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport SimHasGod from '../ReplacedGameFunctions/SimHasGod';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport {\r\n SimAchievementsOwned,\r\n SimCookiesPs,\r\n SimCookiesPsRaw, // eslint-disable-line no-unused-vars\r\n SimEffs, // eslint-disable-line no-unused-vars\r\n SimHeavenlyPower,\r\n SimObjects,\r\n SimPrestige,\r\n SimUpgrades,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates the CPS of the current \"sim data\"\r\n * It is similar to Game.CalculateGains()\r\n * It is called at the start of any function that simulates certain behaviour or actions\r\n * @global\t{number}\tCM.Sim.cookiesPs\tThe CPS of the current sim data\r\n */\r\nexport default function CalculateGains() {\r\n SimCookiesPs = 0;\r\n let mult = 1;\r\n // Include minigame effects\r\n const effs = {};\r\n Object.keys(Game.Objects).forEach((i) => {\r\n if (Game.Objects[i].minigameLoaded && Game.Objects[i].minigame.effs) {\r\n const myEffs = Game.Objects[i].minigame.effs;\r\n Object.keys(myEffs).forEach((ii) => {\r\n if (effs[ii]) effs[ii] *= myEffs[ii];\r\n else effs[ii] = myEffs[ii];\r\n });\r\n }\r\n });\r\n SimEffs = effs;\r\n\r\n if (Game.ascensionMode !== 1)\r\n mult += parseFloat(SimPrestige) * 0.01 * SimHeavenlyPower * SimGetHeavenlyMultiplier();\r\n\r\n mult *= SimEff('cps');\r\n\r\n if (SimHas('Heralds') && Game.ascensionMode !== 1) mult *= 1 + 0.01 * Game.heralds;\r\n\r\n Object.keys(Game.cookieUpgrades).forEach((i) => {\r\n const me = Game.cookieUpgrades[i];\r\n if (SimHas(me.name)) {\r\n // Some upgrades have a function as .power (notably the valentine cookies)\r\n // CM.Sim.InitialBuildingData has changed to use CM.Sim.Has instead of Game.Has etc.\r\n // Therefore this call is to the .power of the Sim.Object\r\n if (typeof me.power === 'function') {\r\n mult *= 1 + SimUpgrades[me.name].power(SimUpgrades[me.name]) * 0.01;\r\n } else mult *= 1 + me.power * 0.01;\r\n }\r\n });\r\n\r\n if (SimHas('Specialized chocolate chips')) mult *= 1.01;\r\n if (SimHas('Designer cocoa beans')) mult *= 1.02;\r\n if (SimHas('Underworld ovens')) mult *= 1.03;\r\n if (SimHas('Exotic nuts')) mult *= 1.04;\r\n if (SimHas('Arcane sugar')) mult *= 1.05;\r\n\r\n if (SimHas('Increased merriness')) mult *= 1.15;\r\n if (SimHas('Improved jolliness')) mult *= 1.15;\r\n if (SimHas('A lump of coal')) mult *= 1.01;\r\n if (SimHas('An itchy sweater')) mult *= 1.01;\r\n if (SimHas(\"Santa's dominion\")) mult *= 1.2;\r\n\r\n if (SimHas('Fortune #100')) mult *= 1.01;\r\n if (SimHas('Fortune #101')) mult *= 1.07;\r\n\r\n if (SimHas('Dragon scale')) mult *= 1.03;\r\n\r\n // Check effect of chosen Gods\r\n let buildMult = 1;\r\n if (SimHasGod) {\r\n let godLvl = SimHasGod('asceticism');\r\n if (godLvl === 1) mult *= 1.15;\r\n else if (godLvl === 2) mult *= 1.1;\r\n else if (godLvl === 3) mult *= 1.05;\r\n\r\n godLvl = SimHasGod('ages');\r\n if (godLvl === 1)\r\n mult *= 1 + 0.15 * Math.sin((CycliusDateAtBeginLoop / 1000 / (60 * 60 * 3)) * Math.PI * 2);\r\n else if (godLvl === 2)\r\n mult *= 1 + 0.15 * Math.sin((CycliusDateAtBeginLoop / 1000 / (60 * 60 * 12)) * Math.PI * 2);\r\n else if (godLvl === 3)\r\n mult *= 1 + 0.15 * Math.sin((CycliusDateAtBeginLoop / 1000 / (60 * 60 * 24)) * Math.PI * 2);\r\n\r\n godLvl = SimHasGod('decadence');\r\n if (godLvl === 1) buildMult *= 0.93;\r\n else if (godLvl === 2) buildMult *= 0.95;\r\n else if (godLvl === 3) buildMult *= 0.98;\r\n\r\n godLvl = SimHasGod('industry');\r\n if (godLvl === 1) buildMult *= 1.1;\r\n else if (godLvl === 2) buildMult *= 1.06;\r\n else if (godLvl === 3) buildMult *= 1.03;\r\n\r\n godLvl = SimHasGod('labor');\r\n if (godLvl === 1) buildMult *= 0.97;\r\n else if (godLvl === 2) buildMult *= 0.98;\r\n else if (godLvl === 3) buildMult *= 0.99;\r\n }\r\n\r\n if (SimHas(\"Santa's legacy\")) mult *= 1 + (Game.santaLevel + 1) * 0.03;\r\n\r\n const milkProgress = SimAchievementsOwned / 25;\r\n let milkMult = 1;\r\n if (SimHas(\"Santa's milk and cookies\")) milkMult *= 1.05;\r\n // if (CM.Sim.hasAura('Breath of Milk')) milkMult *= 1.05;\r\n milkMult *= 1 + SimAuraMult('Breath of Milk') * 0.05;\r\n if (SimHasGod) {\r\n const godLvl = SimHasGod('mother');\r\n if (godLvl === 1) milkMult *= 1.1;\r\n else if (godLvl === 2) milkMult *= 1.05;\r\n else if (godLvl === 3) milkMult *= 1.03;\r\n }\r\n milkMult *= SimEff('milk');\r\n\r\n let catMult = 1;\r\n\r\n if (SimHas('Kitten helpers')) catMult *= 1 + milkProgress * 0.1 * milkMult;\r\n if (SimHas('Kitten workers')) catMult *= 1 + milkProgress * 0.125 * milkMult;\r\n if (SimHas('Kitten engineers')) catMult *= 1 + milkProgress * 0.15 * milkMult;\r\n if (SimHas('Kitten overseers')) catMult *= 1 + milkProgress * 0.175 * milkMult;\r\n if (SimHas('Kitten managers')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten accountants')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten specialists')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten experts')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten consultants')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten assistants to the regional manager'))\r\n catMult *= 1 + milkProgress * 0.175 * milkMult;\r\n if (SimHas('Kitten marketeers')) catMult *= 1 + milkProgress * 0.15 * milkMult;\r\n if (SimHas('Kitten analysts')) catMult *= 1 + milkProgress * 0.125 * milkMult;\r\n if (SimHas('Kitten executives')) catMult *= 1 + milkProgress * 0.115 * milkMult;\r\n if (SimHas('Kitten admins')) catMult *= 1 + milkProgress * 0.11 * milkMult;\r\n if (SimHas('Kitten strategists')) catMult *= 1 + milkProgress * 0.105 * milkMult;\r\n if (SimHas('Kitten angels')) catMult *= 1 + milkProgress * 0.1 * milkMult;\r\n if (SimHas('Fortune #103')) catMult *= 1 + milkProgress * 0.05 * milkMult;\r\n\r\n Object.keys(SimObjects).forEach((i) => {\r\n const me = SimObjects[i];\r\n let storedCps = me.cps(me);\r\n if (Game.ascensionMode !== 1) storedCps *= (1 + me.level * 0.01) * buildMult;\r\n if (me.name === 'Grandma' && SimHas('Milkhelp® lactose intolerance relief tablets'))\r\n storedCps *= 1 + 0.05 * milkProgress * milkMult;\r\n SimCookiesPs += me.amount * storedCps;\r\n });\r\n\r\n if (SimHas('\"egg\"')) SimCookiesPs += 9; // \"egg\"\r\n\r\n mult *= catMult;\r\n\r\n let eggMult = 1;\r\n if (SimHas('Chicken egg')) eggMult *= 1.01;\r\n if (SimHas('Duck egg')) eggMult *= 1.01;\r\n if (SimHas('Turkey egg')) eggMult *= 1.01;\r\n if (SimHas('Quail egg')) eggMult *= 1.01;\r\n if (SimHas('Robin egg')) eggMult *= 1.01;\r\n if (SimHas('Ostrich egg')) eggMult *= 1.01;\r\n if (SimHas('Cassowary egg')) eggMult *= 1.01;\r\n if (SimHas('Salmon roe')) eggMult *= 1.01;\r\n if (SimHas('Frogspawn')) eggMult *= 1.01;\r\n if (SimHas('Shark egg')) eggMult *= 1.01;\r\n if (SimHas('Turtle egg')) eggMult *= 1.01;\r\n if (SimHas('Ant larva')) eggMult *= 1.01;\r\n if (SimHas('Century egg')) {\r\n // The boost increases a little every day, with diminishing returns up to +10% on the 100th day\r\n let day =\r\n (Math.floor((CenturyDateAtBeginLoop - Game.startDate) / 1000 / 10) * 10) / 60 / 60 / 24;\r\n day = Math.min(day, 100);\r\n // Sets a Cache value to be displayed in the Stats page, could be moved...\r\n CacheCentEgg = 1 + (1 - (1 - day / 100) ** 3) * 0.1;\r\n eggMult *= CacheCentEgg;\r\n }\r\n mult *= eggMult;\r\n\r\n if (SimHas('Sugar baking')) mult *= 1 + Math.min(100, Game.lumps) * 0.01;\r\n\r\n // if (CM.Sim.hasAura('Radiant Appetite')) mult *= 2;\r\n mult *= 1 + SimAuraMult('Radiant Appetite');\r\n\r\n const rawCookiesPs = SimCookiesPs * mult;\r\n Object.keys(Game.CpsAchievements).forEach((i) => {\r\n if (rawCookiesPs >= Game.CpsAchievements[i].threshold) SimWin(Game.CpsAchievements[i].name);\r\n });\r\n\r\n SimCookiesPsRaw = rawCookiesPs;\r\n\r\n const { n } = Game.shimmerTypes.golden;\r\n const auraMult = SimAuraMult(\"Dragon's Fortune\");\r\n for (let i = 0; i < n; i++) {\r\n mult *= 1 + auraMult * 1.23;\r\n }\r\n\r\n const name = Game.bakeryName.toLowerCase();\r\n if (name === 'orteil') mult *= 0.99;\r\n else if (name === 'ortiel') mult *= 0.98;\r\n\r\n if (SimHas('Elder Covenant')) mult *= 0.95;\r\n\r\n if (SimHas('Golden switch [off]')) {\r\n let goldenSwitchMult = 1.5;\r\n if (SimHas('Residual luck')) {\r\n const upgrades = Game.goldenCookieUpgrades;\r\n Object.keys(upgrades).forEach((i) => {\r\n if (SimHas(upgrades[i])) goldenSwitchMult += 0.1;\r\n });\r\n }\r\n mult *= goldenSwitchMult;\r\n }\r\n if (SimHas('Shimmering veil [off]')) {\r\n let veilMult = 0.5;\r\n if (SimHas('Reinforced membrane')) veilMult += 0.1;\r\n if (SimHas('Delicate touch')) veilMult += 0.05;\r\n if (SimHas('Steadfast murmur')) veilMult += 0.05;\r\n if (SimHas('Glittering edge')) veilMult += 0.05;\r\n mult *= 1 + veilMult;\r\n }\r\n\r\n if (SimHas('Magic shenanigans')) mult *= 1000;\r\n if (SimHas('Occult obstruction')) mult *= 0;\r\n\r\n SimCookiesPs = Game.runModHookOnValue('cps', SimCookiesPs);\r\n\r\n mult *= GetCPSBuffMult();\r\n\r\n SimCookiesPs *= mult;\r\n\r\n // if (Game.hasBuff('Cursed finger')) Game.cookiesPs = 0;\r\n}\r\n","import SimAuraMult from './SimAuraMult';\r\nimport SimHas from './SimHas';\r\nimport SimHasGod from './SimHasGod';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.GetHeavenlyMultiplier but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimGetHeavenlyMultiplier() {\r\n let heavenlyMult = 0;\r\n if (SimHas('Heavenly chip secret')) heavenlyMult += 0.05;\r\n if (SimHas('Heavenly cookie stand')) heavenlyMult += 0.2;\r\n if (SimHas('Heavenly bakery')) heavenlyMult += 0.25;\r\n if (SimHas('Heavenly confectionery')) heavenlyMult += 0.25;\r\n if (SimHas('Heavenly key')) heavenlyMult += 0.25;\r\n // if (SimHasAura('Dragon God')) heavenlyMult*=1.05;\r\n heavenlyMult *= 1 + SimAuraMult('Dragon God') * 0.05;\r\n if (SimHas('Lucky digit')) heavenlyMult *= 1.01;\r\n if (SimHas('Lucky number')) heavenlyMult *= 1.01;\r\n if (SimHas('Lucky payout')) heavenlyMult *= 1.01;\r\n if (Game.hasGod) {\r\n const godLvl = SimHasGod('creation');\r\n if (godLvl === 1) heavenlyMult *= 0.7;\r\n else if (godLvl === 2) heavenlyMult *= 0.8;\r\n else if (godLvl === 3) heavenlyMult *= 0.9;\r\n }\r\n return heavenlyMult;\r\n}\r\n","/** Data copied directly from the game */\r\n\r\n/** Array of the names of all fortune cookies obtainable from the ticker */\r\nexport const Fortunes = [\r\n 'Fortune #001',\r\n 'Fortune #002',\r\n 'Fortune #003',\r\n 'Fortune #004',\r\n 'Fortune #005',\r\n 'Fortune #006',\r\n 'Fortune #007',\r\n 'Fortune #008',\r\n 'Fortune #009',\r\n 'Fortune #010',\r\n 'Fortune #011',\r\n 'Fortune #012',\r\n 'Fortune #013',\r\n 'Fortune #014',\r\n 'Fortune #015',\r\n 'Fortune #016',\r\n 'Fortune #017',\r\n 'Fortune #018',\r\n 'Fortune #019',\r\n 'Fortune #020',\r\n 'Fortune #100',\r\n 'Fortune #101',\r\n 'Fortune #102',\r\n 'Fortune #103',\r\n 'Fortune #104',\r\n];\r\n\r\n/** Array of the names of all Halloween cookies */\r\nexport const HalloCookies = [\r\n 'Skull cookies',\r\n 'Ghost cookies',\r\n 'Bat cookies',\r\n 'Slime cookies',\r\n 'Pumpkin cookies',\r\n 'Eyeball cookies',\r\n 'Spider cookies',\r\n];\r\n\r\n/** Array of the names of all Christmas cookies */\r\nexport const ChristCookies = [\r\n 'Christmas tree biscuits',\r\n 'Snowflake biscuits',\r\n 'Snowman biscuits',\r\n 'Holly biscuits',\r\n 'Candy cane biscuits',\r\n 'Bell biscuits',\r\n 'Present biscuits',\r\n];\r\n\r\n/** Array of the names of all Valentine cookies */\r\nexport const ValCookies = [\r\n 'Pure heart biscuits',\r\n 'Ardent heart biscuits',\r\n 'Sour heart biscuits',\r\n 'Weeping heart biscuits',\r\n 'Golden heart biscuits',\r\n 'Eternal heart biscuits',\r\n 'Prism heart biscuits',\r\n];\r\n\r\n/** Array of the names of all plant drops */\r\nexport const PlantDrops = [\r\n 'Elderwort biscuits',\r\n 'Bakeberry cookies',\r\n 'Duketater cookies',\r\n 'Green yeast digestives',\r\n 'Wheat slims',\r\n 'Fern tea',\r\n 'Ichor syrup',\r\n];\r\n\r\n/** All possible effects plants and other items can have with a display-title */\r\nexport const Effects = {\r\n buildingCost: 'Building prices',\r\n click: 'Cookies per click',\r\n cps: 'Total CPS',\r\n cursorCps: 'Cursor CPS',\r\n goldenCookieDur: 'Golden cookie duration',\r\n goldenCookieEffDur: 'Golden cookie effect duration',\r\n goldenCookieFreq: 'Golden cookie frequency',\r\n goldenCookieGain: 'Golden cookie gains',\r\n grandmaCps: 'Grandma CPS',\r\n itemDrops: 'Random item drop chance',\r\n milk: 'Effect from milk',\r\n reindeerDur: 'Reindeer duration',\r\n reindeerFreq: 'Reindeer frequency',\r\n reindeerGain: 'Reindeer gains',\r\n upgradeCost: 'Upgrade prices',\r\n wrathCookieDur: 'Wrath cookie duration',\r\n wrathCookieEffDur: 'Wrath cookie effect duration',\r\n wrathCookieFreq: 'Wrath cookie frequency',\r\n wrathCookieGain: 'Wrath cookie gains',\r\n wrinklerEat: 'Wrinkler ',\r\n wrinklerSpawn: 'Wrinkler spawn frequency',\r\n};\r\n","import { SimAchievements } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.HasAchiev but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimHasAchiev(what) {\r\n return SimAchievements[what] ? SimAchievements[what].won : 0;\r\n}\r\n","import { ChristCookies, HalloCookies } from '../../Data/Gamedata';\r\nimport SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport SimHasAchiev from '../ReplacedGameFunctions/SimHasAchiev';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport { SimObjects, SimUpgradesOwned } from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates if any special achievements have been obtained\r\n * If so it SimWin()'s them and the caller function will know to recall CM.Sim.CalculateGains()\r\n * It is called at the end of any functions that simulates certain behaviour\r\n */\r\nexport default function CheckOtherAchiev() {\r\n let grandmas = 0;\r\n Object.keys(Game.GrandmaSynergies).forEach((i) => {\r\n if (SimHas(Game.GrandmaSynergies[i])) grandmas += 1;\r\n });\r\n if (!SimHasAchiev('Elder') && grandmas >= 7) SimWin('Elder');\r\n if (!SimHasAchiev('Veteran') && grandmas >= 14) SimWin('Veteran');\r\n\r\n let buildingsOwned = 0;\r\n let mathematician = 1;\r\n let base10 = 1;\r\n let minAmount = 100000;\r\n Object.keys(SimObjects).forEach((i) => {\r\n buildingsOwned += SimObjects[i].amount;\r\n minAmount = Math.min(SimObjects[i].amount, minAmount);\r\n if (!SimHasAchiev('Mathematician')) {\r\n if (\r\n SimObjects[i].amount <\r\n Math.min(128, 2 ** (Game.ObjectsById.length - Game.Objects[i].id - 1))\r\n )\r\n mathematician = 0;\r\n }\r\n if (!SimHasAchiev('Base 10')) {\r\n if (SimObjects[i].amount < (Game.ObjectsById.length - Game.Objects[i].id) * 10) base10 = 0;\r\n }\r\n });\r\n if (minAmount >= 1) SimWin('One with everything');\r\n if (mathematician === 1) SimWin('Mathematician');\r\n if (base10 === 1) SimWin('Base 10');\r\n if (minAmount >= 100) SimWin('Centennial');\r\n if (minAmount >= 150) SimWin('Centennial and a half');\r\n if (minAmount >= 200) SimWin('Bicentennial');\r\n if (minAmount >= 250) SimWin('Bicentennial and a half');\r\n if (minAmount >= 300) SimWin('Tricentennial');\r\n if (minAmount >= 350) SimWin('Tricentennial and a half');\r\n if (minAmount >= 400) SimWin('Quadricentennial');\r\n if (minAmount >= 450) SimWin('Quadricentennial and a half');\r\n if (minAmount >= 500) SimWin('Quincentennial');\r\n if (minAmount >= 550) SimWin('Quincentennial and a half');\r\n if (minAmount >= 600) SimWin('Sexcentennial');\r\n if (minAmount >= 650) SimWin('Sexcentennial and a half');\r\n if (minAmount >= 700) SimWin('Septcentennial');\r\n\r\n if (buildingsOwned >= 100) SimWin('Builder');\r\n if (buildingsOwned >= 500) SimWin('Architect');\r\n if (buildingsOwned >= 1000) SimWin('Engineer');\r\n if (buildingsOwned >= 2500) SimWin('Lord of Constructs');\r\n if (buildingsOwned >= 5000) SimWin('Grand design');\r\n if (buildingsOwned >= 7500) SimWin('Ecumenopolis');\r\n if (buildingsOwned >= 10000) SimWin('Myriad');\r\n\r\n if (SimUpgradesOwned >= 20) SimWin('Enhancer');\r\n if (SimUpgradesOwned >= 50) SimWin('Augmenter');\r\n if (SimUpgradesOwned >= 100) SimWin('Upgrader');\r\n if (SimUpgradesOwned >= 200) SimWin('Lord of Progress');\r\n if (SimUpgradesOwned >= 300) SimWin('The full picture');\r\n if (SimUpgradesOwned >= 400) SimWin(\"When there's nothing left to add\");\r\n if (SimUpgradesOwned >= 500) SimWin('Kaizen');\r\n if (SimUpgradesOwned >= 600) SimWin('Beyond quality');\r\n if (SimUpgradesOwned >= 700) SimWin(\"Oft we mar what's well\");\r\n\r\n if (buildingsOwned >= 4000 && SimUpgradesOwned >= 300) SimWin('Polymath');\r\n if (buildingsOwned >= 8000 && SimUpgradesOwned >= 400) SimWin('Renaissance baker');\r\n\r\n if (SimObjects.Cursor.amount + SimObjects.Grandma.amount >= 777) SimWin('The elder scrolls');\r\n\r\n let hasAllHalloCook = true;\r\n Object.keys(HalloCookies).forEach((i) => {\r\n if (!SimHas(HalloCookies[i])) hasAllHalloCook = false;\r\n });\r\n if (hasAllHalloCook) SimWin('Spooky cookies');\r\n\r\n let hasAllChristCook = true;\r\n Object.keys(ChristCookies).forEach((i) => {\r\n if (!SimHas(ChristCookies[i])) hasAllChristCook = false;\r\n });\r\n if (hasAllChristCook) SimWin('Let it snow');\r\n\r\n if (SimHas('Fortune cookies')) {\r\n const list = Game.Tiers.fortune.upgrades;\r\n let fortunes = 0;\r\n Object.keys(list).forEach((i) => {\r\n if (SimHas(list[i].name)) fortunes += 1;\r\n });\r\n if (fortunes >= list.length) SimWin('O Fortuna');\r\n }\r\n}\r\n","import CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport { SimAchievementsOwned, SimCookiesPs, SimObjects } from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates the bonus income of buying a building\r\n * It is called by CM.Cache.CacheBuildingIncome()\r\n * @param\t{string}\tbuilding\tThe name of the building to be bought\r\n * @param\t{number}\tamount\t\tThe amount to be bought\r\n * @returns {number}\t\t\t\tThe bonus income of the building\r\n */\r\nexport default function BuyBuildingsBonusIncome(building, amount) {\r\n CopyData();\r\n SimObjects[building].amount += amount;\r\n const me = SimObjects[building];\r\n\r\n if (building === 'Cursor') {\r\n if (me.amount >= 1) SimWin('Click');\r\n if (me.amount >= 2) SimWin('Double-click');\r\n if (me.amount >= 50) SimWin('Mouse wheel');\r\n if (me.amount >= 100) SimWin('Of Mice and Men');\r\n if (me.amount >= 200) SimWin('The Digital');\r\n if (me.amount >= 300) SimWin('Extreme polydactyly');\r\n if (me.amount >= 400) SimWin('Dr. T');\r\n if (me.amount >= 500) SimWin('Thumbs, phalanges, metacarpals');\r\n if (me.amount >= 600) SimWin('With her finger and her thumb');\r\n if (me.amount >= 700) SimWin('Gotta hand it to you');\r\n if (me.amount >= 800) SimWin(\"The devil's workshop\");\r\n if (me.amount >= 900) SimWin('All on deck');\r\n if (me.amount >= 1000) SimWin('A round of applause');\r\n } else {\r\n Object.keys(Game.Objects[me.name].tieredAchievs).forEach((j) => {\r\n if (me.amount >= Game.Tiers[Game.Objects[me.name].tieredAchievs[j].tier].achievUnlock) {\r\n SimWin(Game.Objects[me.name].tieredAchievs[j].name);\r\n }\r\n });\r\n }\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n\r\n return SimCookiesPs - Game.cookiesPs;\r\n}\r\n","/**\r\n * This function calculates the time it takes to reach a certain magic level\r\n * @param\t{number}\tcurrentMagic\t\tThe current magic level\r\n * @param\t{number}\tmaxMagic\t\t\tThe user's max magic level\r\n * @param\t{number}\ttargetMagic\t\t\tThe target magic level\r\n * @returns\t{number}\tcount / Game.fps\tThe time it takes to reach targetMagic\r\n */\r\nexport default function CalculateGrimoireRefillTime(currentMagic, maxMagic, targetMagic) {\r\n let magic = currentMagic;\r\n let count = 0;\r\n while (magic < targetMagic) {\r\n magic += Math.max(0.002, (magic / Math.max(maxMagic, 100)) ** 0.5) * 0.002;\r\n count += 1;\r\n }\r\n return count / Game.fps;\r\n}\r\n","/**\r\n * This function toggles the position of the warnings created by CM.Disp.TooltipCreateWarningSection()\r\n * It is called by a change in CM.Options.ToolWarnPos\r\n * and upon creation of the warning tooltip by CM.Disp.UpdateTooltipWarnings()\r\n */\r\nexport default function ToggleToolWarnPos() {\r\n if (l('CMDispTooltipWarningParent') !== null) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos === 0) {\r\n l('CMDispTooltipWarningParent').style.top = 'auto';\r\n l('CMDispTooltipWarningParent').style.margin = '4px -4px';\r\n l('CMDispTooltipWarningParent').style.padding = '3px 4px';\r\n } else {\r\n l('CMDispTooltipWarningParent').style.right = 'auto';\r\n l('CMDispTooltipWarningParent').style.margin = '4px';\r\n l('CMDispTooltipWarningParent').style.padding = '4px 3px';\r\n }\r\n }\r\n}\r\n","import CopyData from '../../Sim/SimulationData/CopyData';\r\nimport { TooltipName, TooltipType } from '../VariablesAndData';\r\nimport * as Create from './CreateTooltip';\r\nimport Building from './TypesOfTooltips/Building';\r\nimport GardenPlots from './TypesOfTooltips/GardenPlots';\r\nimport Grimoire from './TypesOfTooltips/Grimoire';\r\nimport HarvestAll from './TypesOfTooltips/HarvestAll';\r\nimport PantheonGods from './TypesOfTooltips/PantheonGods';\r\nimport SugarLump from './TypesOfTooltips/SugarLump';\r\nimport Upgrade from './TypesOfTooltips/Upgrade';\r\nimport Warnings from './TypesOfTooltips/Warnings';\r\nimport WrinklerButton from './TypesOfTooltips/WrinklerButton';\r\n\r\n/**\r\n * This function updates the sections of the tooltips created by CookieMonster\r\n */\r\nexport default function UpdateTooltips() {\r\n CopyData();\r\n if (l('tooltipAnchor').style.display !== 'none' && l('CMTooltipArea')) {\r\n l('CMTooltipArea').innerHTML = '';\r\n const tooltipBox = Create.TooltipCreateTooltipBox();\r\n l('CMTooltipArea').appendChild(tooltipBox);\r\n\r\n if (TooltipType === 'b') {\r\n Building();\r\n } else if (TooltipType === 'u') {\r\n Upgrade();\r\n } else if (TooltipType === 's') {\r\n SugarLump();\r\n } else if (TooltipType === 'g') {\r\n Grimoire();\r\n } else if (TooltipType === 'p') {\r\n GardenPlots();\r\n } else if (TooltipType === 'ha') {\r\n HarvestAll();\r\n } else if (TooltipType === 'wb') {\r\n WrinklerButton();\r\n } else if (TooltipType === 'pag' || (TooltipType === 'pas' && TooltipName[1] !== -1)) {\r\n PantheonGods();\r\n }\r\n Warnings();\r\n } else if (l('CMTooltipArea') === null) {\r\n // Remove warnings if its a basic tooltip\r\n if (l('CMDispTooltipWarningParent') !== null) {\r\n l('CMDispTooltipWarningParent').remove();\r\n }\r\n }\r\n}\r\n","import ColourOfPP from '../../../Cache/PP/ColourOfPP';\r\nimport {\r\n CacheObjects1,\r\n CacheObjects10,\r\n CacheObjects100,\r\n CacheObjectsNextAchievement,\r\n} from '../../../Cache/VariablesAndData';\r\n\r\nimport BuyBuildingsBonusIncome from '../../../Sim/SimulationEvents/BuyBuildingBonusIncome';\r\nimport { SimObjects } from '../../../Sim/VariablesAndData';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../BeautifyAndFormatting/FormatTime';\r\nimport GetTimeColour from '../../BeautifyAndFormatting/GetTimeColour';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../../HelperFunctions/GetWrinkConfigBank';\r\nimport {\r\n ColourTextPre,\r\n LastTargetTooltipBuilding,\r\n TooltipBonusIncome,\r\n TooltipName,\r\n TooltipPrice,\r\n} from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Building tooltips\r\n */\r\nexport default function Building() {\r\n let target;\r\n if (Game.buyMode === 1) {\r\n LastTargetTooltipBuilding = target;\r\n } else {\r\n target = LastTargetTooltipBuilding;\r\n }\r\n if (Game.buyBulk === 1) target = CacheObjects1;\r\n else if (Game.buyBulk === 10) target = CacheObjects10;\r\n else if (Game.buyBulk === 100) target = CacheObjects100;\r\n\r\n TooltipPrice = Game.Objects[TooltipName].bulkPrice;\r\n TooltipBonusIncome = target[TooltipName].bonus;\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade === 1 &&\r\n Game.buyMode === 1\r\n ) {\r\n const tooltipBox = l('CMTooltipBorder');\r\n Create.TooltipCreateCalculationSection(tooltipBox);\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade ===\r\n 1 &&\r\n Game.buyMode === 1\r\n ) {\r\n l('CMTooltipIncome').textContent = Beautify(TooltipBonusIncome, 2);\r\n const increase = Math.round((TooltipBonusIncome / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n l('CMTooltipIncome').textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n l('CMTooltipIncome').textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n l('CMTooltipBorder').className = ColourTextPre + target[TooltipName].colour;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime)\r\n l('CMTooltipPP').textContent = FormatTime(target[TooltipName].pp);\r\n else l('CMTooltipPP').textContent = Beautify(target[TooltipName].pp, 2);\r\n l('CMTooltipPP').className = ColourTextPre + target[TooltipName].colour;\r\n const timeColour = GetTimeColour(\r\n (TooltipPrice - (Game.cookies + GetWrinkConfigBank())) / GetCPS(),\r\n );\r\n l('CMTooltipTime').textContent = timeColour.text;\r\n if (timeColour.text === 'Done!' && Game.cookies < target[TooltipName].price) {\r\n l('CMTooltipTime').textContent = `${timeColour.text} (with Wrink)`;\r\n } else l('CMTooltipTime').textContent = timeColour.text;\r\n l('CMTooltipTime').className = ColourTextPre + timeColour.colour;\r\n }\r\n\r\n // Add \"production left till next achievement\"-bar\r\n l('CMTooltipProductionLeftHeader').style.display = 'none';\r\n l('CMTooltipTime').style.marginBottom = '0px';\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n for (const i of Object.keys(Game.Objects[TooltipName].productionAchievs)) {\r\n if (!Game.HasAchiev(Game.Objects[TooltipName].productionAchievs[i].achiev.name)) {\r\n const nextProductionAchiev = Game.Objects[TooltipName].productionAchievs[i];\r\n l('CMTooltipTime').style.marginBottom = '4px';\r\n l('CMTooltipProductionLeftHeader').style.display = '';\r\n l('CMTooltipProductionLeft').className = `ProdAchievement${TooltipName}`;\r\n l('CMTooltipProductionLeft').textContent = Beautify(\r\n nextProductionAchiev.pow - SimObjects[TooltipName].totalCookies,\r\n 15,\r\n );\r\n l('CMTooltipProductionLeft').style.color = 'white';\r\n break;\r\n }\r\n }\r\n\r\n const ObjectsTillNext = CacheObjectsNextAchievement[TooltipName];\r\n if (ObjectsTillNext.AmountNeeded < 101) {\r\n l('CMTooltipProductionLeft').style.marginBottom = '4px';\r\n l('CMTooltipNextAchievementHeader').style.display = '';\r\n\r\n let PPOfAmount;\r\n if (Game.cookiesPs) {\r\n PPOfAmount =\r\n Math.max(ObjectsTillNext.price - (Game.cookies + GetWrinkConfigBank()), 0) /\r\n Game.cookiesPs +\r\n ObjectsTillNext.price /\r\n BuyBuildingsBonusIncome(TooltipName, ObjectsTillNext.AmountNeeded);\r\n } else\r\n PPOfAmount =\r\n ObjectsTillNext.price /\r\n BuyBuildingsBonusIncome(TooltipName, ObjectsTillNext.AmountNeeded);\r\n\r\n l('CMTooltipNextAchievement').textContent = `${Beautify(\r\n ObjectsTillNext.AmountNeeded,\r\n )} / ${Beautify(ObjectsTillNext.price)} / `;\r\n l('CMTooltipNextAchievement').style.color = 'white';\r\n const PPFrag = document.createElement('span');\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime)\r\n PPFrag.textContent = FormatTime(PPOfAmount);\r\n else PPFrag.textContent = Beautify(PPOfAmount);\r\n PPFrag.className = ColourTextPre + ColourOfPP({ pp: PPOfAmount }, ObjectsTillNext.price);\r\n l('CMTooltipNextAchievement').appendChild(PPFrag);\r\n } else {\r\n l('CMTooltipNextAchievementHeader').style.display = 'none';\r\n l('CMTooltipProductionLeft').style.marginBottom = '0px';\r\n }\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import { CacheLastChoEgg, CacheUpgrades } from '../../../Cache/VariablesAndData';\r\n\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../BeautifyAndFormatting/FormatTime';\r\nimport GetTimeColour from '../../BeautifyAndFormatting/GetTimeColour';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../../HelperFunctions/GetWrinkConfigBank';\r\nimport {\r\n ColourTextPre,\r\n TooltipBonusIncome,\r\n TooltipBonusMouse,\r\n TooltipName,\r\n TooltipPrice,\r\n} from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Upgrade tooltips\r\n */\r\nexport default function Upgrade() {\r\n const tooltipBox = l('CMTooltipBorder');\r\n Create.TooltipCreateCalculationSection(tooltipBox);\r\n\r\n TooltipBonusIncome = CacheUpgrades[Game.UpgradesInStore[TooltipName].name].bonus;\r\n TooltipPrice = Game.Upgrades[Game.UpgradesInStore[TooltipName].name].getPrice();\r\n TooltipBonusMouse = CacheUpgrades[Game.UpgradesInStore[TooltipName].name].bonusMouse;\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade === 1\r\n ) {\r\n l('CMTooltipIncome').textContent = Beautify(TooltipBonusIncome, 2);\r\n const increase = Math.round((TooltipBonusIncome / Game.cookiesPs) * 10000);\r\n // Don't display certain parts of tooltip if not applicable\r\n if (l('CMTooltipIncome').textContent === '0') {\r\n l('Bonus IncomeTitle').style.display = 'none';\r\n l('CMTooltipIncome').style.display = 'none';\r\n l('Payback PeriodTitle').style.display = 'none';\r\n l('CMTooltipPP').style.display = 'none';\r\n } else {\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n l('CMTooltipIncome').textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n l('CMTooltipIncome').textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n l('CMTooltipBorder').className =\r\n ColourTextPre + CacheUpgrades[Game.UpgradesInStore[TooltipName].name].colour;\r\n }\r\n\r\n // If clicking power upgrade\r\n if (TooltipBonusMouse) {\r\n l('CMTooltipCookiePerClick').textContent = Beautify(TooltipBonusMouse);\r\n l('CMTooltipCookiePerClick').style.display = 'block';\r\n l('CMTooltipCookiePerClick').previousSibling.style.display = 'block';\r\n }\r\n // If only a clicking power upgrade change PP to click-based period\r\n if (!TooltipBonusIncome && TooltipBonusMouse) {\r\n l('CMTooltipPP').textContent = `${Beautify(TooltipPrice / TooltipBonusMouse)} Clicks`;\r\n l('CMTooltipPP').style.color = 'white';\r\n l('Payback PeriodTitle').style.display = 'block';\r\n l('CMTooltipPP').style.display = 'block';\r\n } else {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime)\r\n l('CMTooltipPP').textContent = FormatTime(\r\n CacheUpgrades[Game.UpgradesInStore[TooltipName].name].pp,\r\n );\r\n else\r\n l('CMTooltipPP').textContent = Beautify(\r\n CacheUpgrades[Game.UpgradesInStore[TooltipName].name].pp,\r\n 2,\r\n );\r\n l('CMTooltipPP').className =\r\n ColourTextPre + CacheUpgrades[Game.UpgradesInStore[TooltipName].name].colour;\r\n }\r\n const timeColour = GetTimeColour(\r\n (TooltipPrice - (Game.cookies + GetWrinkConfigBank())) / GetCPS(),\r\n );\r\n l('CMTooltipTime').textContent = timeColour.text;\r\n if (\r\n timeColour.text === 'Done!' &&\r\n Game.cookies < Game.UpgradesInStore[TooltipName].getPrice()\r\n ) {\r\n l('CMTooltipTime').textContent = `${timeColour.text} (with Wrink)`;\r\n } else l('CMTooltipTime').textContent = timeColour.text;\r\n l('CMTooltipTime').className = ColourTextPre + timeColour.colour;\r\n\r\n // Add extra info to Chocolate egg tooltip\r\n if (Game.UpgradesInStore[TooltipName].name === 'Chocolate egg') {\r\n l('CMTooltipBorder').lastChild.style.marginBottom = '4px';\r\n l('CMTooltipBorder').appendChild(\r\n Create.TooltipCreateHeader('Cookies to be gained (Currently/Max)'),\r\n );\r\n const chocolate = document.createElement('div');\r\n chocolate.style.color = 'white';\r\n chocolate.textContent = `${Beautify(Game.cookies * 0.05)} / ${Beautify(CacheLastChoEgg)}`;\r\n l('CMTooltipBorder').appendChild(chocolate);\r\n }\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import GetLumpColour from '../../HelperFunctions/GetLumpColour';\r\nimport { ColourTextPre } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n/**\r\n * This function adds extra info to the Sugar Lump tooltip\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function SugarLump() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipLump === 1) {\r\n const tooltipBox = l('CMTooltipBorder');\r\n\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Current Sugar Lump'));\r\n\r\n const lumpType = document.createElement('div');\r\n lumpType.id = 'CMTooltipTime';\r\n tooltipBox.appendChild(lumpType);\r\n const lumpColour = GetLumpColour(Game.lumpCurrentType);\r\n lumpType.textContent = lumpColour.text;\r\n lumpType.className = ColourTextPre + lumpColour.colour;\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import {\r\n ColourGray,\r\n ColourGreen,\r\n ColourOrange,\r\n ColourPurple,\r\n ColourRed,\r\n ColourYellow,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function returns Name and Colour as object for sugar lump type that is given as input param.\r\n * It is called by CM.Disp.UpdateTooltipSugarLump()\r\n * @param \t{string} \t\t\t\ttype \t\t\tSugar Lump Type.\r\n * @returns {{string}, {string}}\ttext, colour\t\tAn array containing the text and display-colour of the sugar lump\r\n */\r\nexport default function GetLumpColour(type) {\r\n if (type === 0) {\r\n return { text: 'Normal', colour: ColourGray };\r\n }\r\n if (type === 1) {\r\n return { text: 'Bifurcated', colour: ColourGreen };\r\n }\r\n if (type === 2) {\r\n return { text: 'Golden', colour: ColourYellow };\r\n }\r\n if (type === 3) {\r\n return { text: 'Meaty', colour: ColourOrange };\r\n }\r\n if (type === 4) {\r\n return { text: 'Caramelized', colour: ColourPurple };\r\n }\r\n return { text: 'Unknown Sugar Lump', colour: ColourRed };\r\n}\r\n","import Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport GetTimeColour from '../../BeautifyAndFormatting/GetTimeColour';\r\nimport CalculateGrimoireRefillTime from '../../HelperFunctions/CalculateGrimoireRefillTime';\r\nimport { ColourTextPre, TooltipName } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Grimoire tooltips\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function Grimoire() {\r\n const { minigame } = Game.Objects['Wizard tower'];\r\n const spellCost = minigame.getSpellCost(minigame.spellsById[TooltipName]);\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipGrim === 1 &&\r\n spellCost <= minigame.magicM\r\n ) {\r\n const tooltipBox = l('CMTooltipBorder');\r\n\r\n // Time left till enough magic for spell\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Time Left'));\r\n const time = document.createElement('div');\r\n time.id = 'CMTooltipTime';\r\n tooltipBox.appendChild(time);\r\n const timeColour = GetTimeColour(\r\n CalculateGrimoireRefillTime(minigame.magic, minigame.magicM, spellCost),\r\n );\r\n time.textContent = timeColour.text;\r\n time.className = ColourTextPre + timeColour.colour;\r\n\r\n // Time left untill magic spent is recovered\r\n if (spellCost <= minigame.magic) {\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Recover Time'));\r\n const recover = document.createElement('div');\r\n recover.id = 'CMTooltipRecover';\r\n tooltipBox.appendChild(recover);\r\n const recoverColour = GetTimeColour(\r\n CalculateGrimoireRefillTime(\r\n Math.max(0, minigame.magic - spellCost),\r\n minigame.magicM,\r\n minigame.magic,\r\n ),\r\n );\r\n recover.textContent = recoverColour.text;\r\n recover.className = ColourTextPre + recoverColour.colour;\r\n }\r\n\r\n // Extra information on cookies gained when spell is Conjure Baked Goods (Name === 0)\r\n if (TooltipName === '0') {\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Cookies to be gained/lost'));\r\n const conjure = document.createElement('div');\r\n conjure.id = 'x';\r\n tooltipBox.appendChild(conjure);\r\n const reward = document.createElement('span');\r\n reward.style.color = '#33FF00';\r\n reward.textContent = Beautify(\r\n Math.max(Math.min(Game.cookies * 0.15, Game.cookiesPs * 60 * 30), 7),\r\n 2,\r\n );\r\n conjure.appendChild(reward);\r\n const seperator = document.createElement('span');\r\n seperator.textContent = ' / ';\r\n conjure.appendChild(seperator);\r\n const loss = document.createElement('span');\r\n loss.style.color = 'red';\r\n loss.textContent = Beautify(\r\n Math.min(Game.cookies, Math.min(Game.cookies * 0.15, Game.cookiesPs * 60 * 15) + 13),\r\n 2,\r\n );\r\n conjure.appendChild(loss);\r\n }\r\n\r\n l('CMTooltipArea').appendChild(tooltipBox);\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport { TooltipName } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Garden plots tooltips\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function GardenPlots() {\r\n const { minigame } = Game.Objects.Farm;\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipPlots &&\r\n minigame.plot[TooltipName[1]][TooltipName[0]][0] !== 0\r\n ) {\r\n const mature =\r\n minigame.plot[TooltipName[1]][TooltipName[0]][1] >\r\n minigame.plantsById[minigame.plot[TooltipName[1]][TooltipName[0]][0] - 1].mature;\r\n const plantName =\r\n minigame.plantsById[minigame.plot[TooltipName[1]][TooltipName[0]][0] - 1].name;\r\n l('CMTooltipBorder').appendChild(Create.TooltipCreateHeader('Reward (Current / Maximum)'));\r\n const reward = document.createElement('div');\r\n reward.id = 'CMTooltipPlantReward';\r\n l('CMTooltipBorder').appendChild(reward);\r\n if (plantName === 'Chocoroot' || plantName === 'White chocoroot') {\r\n l('CMTooltipPlantReward').textContent = `${\r\n mature ? Beautify(Math.min(Game.cookies * 0.03, Game.cookiesPs * 60 * 3)) : '0'\r\n } / ${Beautify(Game.cookiesPs * 60 * 3)}`;\r\n } else if (plantName === 'Bakeberry') {\r\n l('CMTooltipPlantReward').textContent = `${\r\n mature ? Beautify(Math.min(Game.cookies * 0.03, Game.cookiesPs * 60 * 30)) : '0'\r\n } / ${Beautify(Game.cookiesPs * 60 * 30)}`;\r\n } else if (plantName === 'Queenbeet') {\r\n l('CMTooltipPlantReward').textContent = `${\r\n mature ? Beautify(Math.min(Game.cookies * 0.04, Game.cookiesPs * 60 * 60)) : '0'\r\n } / ${Beautify(Game.cookiesPs * 60 * 60)}`;\r\n } else if (plantName === 'Duketater') {\r\n l('CMTooltipPlantReward').textContent = `${\r\n mature ? Beautify(Math.min(Game.cookies * 0.08, Game.cookiesPs * 60 * 120)) : '0'\r\n } / ${Beautify(Game.cookiesPs * 60 * 120)}`;\r\n } else l('CMTooltipArea').style.display = 'none';\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Garden Harvest All tooltip\r\n * It is called when the Harvest All tooltip is created or refreshed by CM.Disp.UpdateTooltip()\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function HarvestAll() {\r\n const { minigame } = Game.Objects.Farm;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipLump) {\r\n l('CMTooltipBorder').appendChild(Create.TooltipCreateHeader('Cookies gained from harvesting:'));\r\n let totalGain = 0;\r\n let mortal = 0;\r\n if (Game.keys[16] && Game.keys[17]) mortal = 1;\r\n for (let y = 0; y < 6; y++) {\r\n for (let x = 0; x < 6; x++) {\r\n if (minigame.plot[y][x][0] >= 1) {\r\n const tile = minigame.plot[y][x];\r\n const me = minigame.plantsById[tile[0] - 1];\r\n const plantName = me.name;\r\n\r\n let count = true;\r\n if (mortal && me.immortal) count = false;\r\n if (tile[1] < me.matureBase) count = false;\r\n if (count && plantName === 'Bakeberry') {\r\n totalGain += Math.min(Game.cookies * 0.03, Game.cookiesPs * 60 * 30);\r\n } else if ((count && plantName === 'Chocoroot') || plantName === 'White chocoroot') {\r\n totalGain += Math.min(Game.cookies * 0.03, Game.cookiesPs * 60 * 3);\r\n } else if (count && plantName === 'Queenbeet') {\r\n totalGain += Math.min(Game.cookies * 0.04, Game.cookiesPs * 60 * 60);\r\n } else if (count && plantName === 'Duketater') {\r\n totalGain += Math.min(Game.cookies * 0.08, Game.cookiesPs * 60 * 120);\r\n }\r\n }\r\n }\r\n }\r\n l('CMTooltipBorder').appendChild(document.createTextNode(Beautify(totalGain)));\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import { CacheWrinklersFattest, CacheWrinklersNormal } from '../../../Cache/VariablesAndData';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport { TooltipName } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the wrinkler button tooltip\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function WrinklerButton() {\r\n l('tooltip').innerHTML = '';\r\n l('tooltip').appendChild(Create.TooltipCreateHeader('Reward:'));\r\n\r\n const WrinklerReward = document.createElement('div');\r\n WrinklerReward.id = 'CMWrinklerReward';\r\n if (TooltipName === 'PopAllNormal') {\r\n WrinklerReward.textContent = Beautify(CacheWrinklersNormal);\r\n } else if (TooltipName === 'PopFattest') {\r\n WrinklerReward.textContent = Beautify(CacheWrinklersFattest[0]);\r\n }\r\n\r\n l('tooltip').appendChild(WrinklerReward);\r\n}\r\n","import { CacheGods } from '../../../Cache/VariablesAndData';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport { TooltipName, TooltipType } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Pantheon Gods tooltip\r\n * It is called when the Harvest All tooltip is created or refreshed by CM.Disp.UpdateTooltip()\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function PantheonGods() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipPantheon === 1) {\r\n const tooltipBox = l('CMTooltipBorder');\r\n let GodID;\r\n if (TooltipType === 'pas') GodID = TooltipName[1];\r\n else GodID = TooltipName;\r\n\r\n // Time left till enough magic for spell\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Effect in position 1:'));\r\n const cps1 = document.createElement('div');\r\n cps1.id = 'CMPantheonTooltipPosition1';\r\n if (CacheGods[GodID][0] !== 0) {\r\n cps1.textContent = Beautify(CacheGods[GodID][0]);\r\n const increase = Math.round((CacheGods[GodID][0] / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n cps1.textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n cps1.textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n } else cps1.textContent = 'No effect to CPS';\r\n tooltipBox.appendChild(cps1);\r\n\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Effect in position 2:'));\r\n const cps2 = document.createElement('div');\r\n cps2.id = 'CMPantheonTooltipPosition2';\r\n if (CacheGods[GodID][1] !== 0) {\r\n cps2.textContent = Beautify(CacheGods[GodID][1]);\r\n const increase = Math.round((CacheGods[GodID][1] / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n cps2.textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n cps2.textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n } else cps2.textContent = 'No effect to CPS';\r\n tooltipBox.appendChild(cps2);\r\n\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Effect in position 3:'));\r\n const cps3 = document.createElement('div');\r\n cps3.id = 'CMPantheonTooltipPosition2';\r\n if (CacheGods[GodID][2] !== 0) {\r\n cps3.textContent = Beautify(CacheGods[GodID][2]);\r\n const increase = Math.round((CacheGods[GodID][2] / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n cps3.textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n cps3.textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n } else cps3.textContent = 'No effect to CPS';\r\n tooltipBox.appendChild(cps3);\r\n\r\n l('CMTooltipArea').appendChild(tooltipBox);\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import GetCPSBuffMult from '../../../Cache/CPS/GetCPSBuffMult';\r\nimport { CacheEdifice, CacheLucky } from '../../../Cache/VariablesAndData';\r\nimport ToggleToolWarnPos from '../../../Config/Toggles/ToggleToolWarnPos';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../BeautifyAndFormatting/FormatTime';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../../HelperFunctions/GetWrinkConfigBank';\r\nimport { TooltipBonusIncome, TooltipPrice, TooltipType } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function updates the warnings section of the building and upgrade tooltips\r\n */\r\nexport default function Warnings() {\r\n if (TooltipType === 'b' || TooltipType === 'u') {\r\n if (document.getElementById('CMDispTooltipWarningParent') === null) {\r\n l('tooltipAnchor').appendChild(Create.TooltipCreateWarningSection());\r\n ToggleToolWarnPos();\r\n }\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos === 0)\r\n l('CMDispTooltipWarningParent').style.right = '0px';\r\n else l('CMDispTooltipWarningParent').style.top = `${l('tooltip').offsetHeight}px`;\r\n\r\n l('CMDispTooltipWarningParent').style.width = `${l('tooltip').offsetWidth - 6}px`;\r\n\r\n const amount = Game.cookies + GetWrinkConfigBank() - TooltipPrice;\r\n const bonusIncomeUsed = Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings\r\n .ToolWarnBon\r\n ? TooltipBonusIncome\r\n : 0;\r\n let limitLucky = CacheLucky;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnBon === 1) {\r\n let bonusNoFren = TooltipBonusIncome;\r\n bonusNoFren /= GetCPSBuffMult();\r\n limitLucky += (bonusNoFren * 60 * 15) / 0.15;\r\n }\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLucky === 1) {\r\n if (amount < limitLucky && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnLucky').style.display = '';\r\n l('CMDispTooltipWarnLuckyText').textContent = `${Beautify(\r\n limitLucky - amount,\r\n )} (${FormatTime((limitLucky - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnLucky').style.display = 'none';\r\n } else l('CMDispTooltipWarnLucky').style.display = 'none';\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLuckyFrenzy === 1\r\n ) {\r\n const limitLuckyFrenzy = limitLucky * 7;\r\n if (amount < limitLuckyFrenzy && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnLuckyFrenzy').style.display = '';\r\n l('CMDispTooltipWarnLuckyFrenzyText').textContent = `${Beautify(\r\n limitLuckyFrenzy - amount,\r\n )} (${FormatTime((limitLuckyFrenzy - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnLuckyFrenzy').style.display = 'none';\r\n } else l('CMDispTooltipWarnLuckyFrenzy').style.display = 'none';\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnConjure === 1) {\r\n const limitConjure = limitLucky * 2;\r\n if (amount < limitConjure && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnConjure').style.display = '';\r\n l('CMDispTooltipWarnConjureText').textContent = `${Beautify(\r\n limitConjure - amount,\r\n )} (${FormatTime((limitConjure - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnConjure').style.display = 'none';\r\n } else l('CMDispTooltipWarnConjure').style.display = 'none';\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnConjureFrenzy ===\r\n 1\r\n ) {\r\n const limitConjureFrenzy = limitLucky * 2 * 7;\r\n if (amount < limitConjureFrenzy && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnConjureFrenzy').style.display = '';\r\n l('CMDispTooltipWarnConjureFrenzyText').textContent = `${Beautify(\r\n limitConjureFrenzy - amount,\r\n )} (${FormatTime((limitConjureFrenzy - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnConjureFrenzy').style.display = 'none';\r\n } else l('CMDispTooltipWarnConjureFrenzy').style.display = 'none';\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnEdifice === 1 &&\r\n Game.Objects['Wizard tower'].minigameLoaded\r\n ) {\r\n if (CacheEdifice && amount < CacheEdifice && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnEdifice').style.display = '';\r\n l('CMDispTooltipWarnEdificeText').textContent = `${Beautify(\r\n CacheEdifice - amount,\r\n )} (${FormatTime((CacheEdifice - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnEdifice').style.display = 'none';\r\n } else l('CMDispTooltipWarnEdifice').style.display = 'none';\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser > 0) {\r\n if (\r\n amount <\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser *\r\n GetCPS() &&\r\n (TooltipType !== 'b' || Game.buyMode === 1)\r\n ) {\r\n l('CMDispTooltipWarnUser').style.display = '';\r\n // Need to update tooltip text dynamically\r\n l(\r\n 'CMDispTooltipWarnUser',\r\n ).children[0].textContent = `Purchase of this item will put you under the number of Cookies equal to ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser} seconds of CPS`;\r\n l('CMDispTooltipWarnUserText').textContent = `${Beautify(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser *\r\n GetCPS() -\r\n amount,\r\n )} (${FormatTime(\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser *\r\n GetCPS() -\r\n amount) /\r\n (GetCPS() + bonusIncomeUsed),\r\n )})`;\r\n } else l('CMDispTooltipWarnUser').style.display = 'none';\r\n } else l('CMDispTooltipWarnUser').style.display = 'none';\r\n } else if (l('CMDispTooltipWarningParent') !== null) {\r\n l('CMDispTooltipWarningParent').remove();\r\n }\r\n}\r\n","import ToggleWrinklerButtons from '../Config/Toggles/ToggleWrinklerButtons';\r\nimport UpdateBuildings from './BuildingsUpgrades/Buildings';\r\nimport UpdateUpgradeSectionsHeight from './BuildingsUpgrades/UpdateUpgradeSectionsHeight';\r\nimport UpdateUpgrades from './BuildingsUpgrades/Upgrades';\r\nimport { UpdateBotBar } from './InfoBars/BottomBar';\r\nimport { UpdateTimerBar } from './InfoBars/TimerBar';\r\nimport RefreshMenu from './MenuSections/Refreshmenu';\r\nimport UpdateTooltips from './Tooltips/UpdateTooltips';\r\nimport { CheckWrinklerTooltip, UpdateWrinklerTooltip } from './Tooltips/WrinklerTooltips';\r\n\r\n/**\r\n * This function handles all custom drawing for the Game.Draw() function.\r\n * It is hooked on 'draw' by CM.RegisterHooks()\r\n */\r\nexport default function CMDrawHook() {\r\n // Draw autosave timer in stats menu, this must be done here to make it count down correctly\r\n if (\r\n Game.prefs.autosave &&\r\n Game.drawT % 10 === 0 && // with autosave ON and every 10 ticks\r\n Game.onMenu === 'stats' &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Stats // while being on the stats menu only\r\n ) {\r\n const timer = document.getElementById('CMStatsAutosaveTimer');\r\n if (timer) {\r\n timer.innerText = Game.sayTime(Game.fps * 60 - (Game.T % (Game.fps * 60)), 4);\r\n }\r\n }\r\n\r\n // Update colours\r\n UpdateBuildings();\r\n UpdateUpgrades();\r\n UpdateUpgradeSectionsHeight();\r\n\r\n // Redraw timers\r\n UpdateTimerBar();\r\n\r\n // Update Bottom Bar\r\n UpdateBotBar();\r\n\r\n // Update Tooltip\r\n UpdateTooltips();\r\n\r\n // Update Wrinkler Tooltip\r\n CheckWrinklerTooltip();\r\n UpdateWrinklerTooltip();\r\n\r\n // Change menu refresh interval\r\n RefreshMenu();\r\n\r\n // Update display of wrinkler buttons, this checks if Elder Pledge has been bought and if they should be disabled\r\n ToggleWrinklerButtons();\r\n}\r\n","/** Functions related to the Timer Bar */\r\n\r\nimport { UpdateBotTimerBarPosition } from '../../Config/SpecificToggles';\r\nimport {\r\n BuffColours,\r\n ColourBackPre,\r\n ColourGray,\r\n ColourOrange,\r\n ColourPurple,\r\n LastNumberOfTimers,\r\n} from '../VariablesAndData';\r\nimport { CreateTimer } from './CreateDOMElements';\r\n\r\n/**\r\n * This function creates the TimerBar and appends it to l('wrapper')\r\n */\r\nexport function CreateTimerBar() {\r\n const TimerBar = document.createElement('div');\r\n TimerBar.id = 'CMTimerBar';\r\n TimerBar.style.position = 'absolute';\r\n TimerBar.style.display = 'none';\r\n TimerBar.style.height = '0px';\r\n TimerBar.style.fontSize = '10px';\r\n TimerBar.style.fontWeight = 'bold';\r\n TimerBar.style.backgroundColor = 'black';\r\n\r\n // Create standard Autosave bar\r\n const CMTimerBarAutosave = CreateTimer('CMTimerBarAutosave', 'Autosave', [\r\n { id: 'CMTimerBarAutosaveBar', colour: ColourPurple },\r\n ]);\r\n TimerBar.appendChild(CMTimerBarAutosave);\r\n\r\n // Create standard Golden Cookie bar\r\n const CMTimerBarGC = CreateTimer('CMTimerBarGC', 'Next Cookie', [\r\n { id: 'CMTimerBarGCMinBar', colour: ColourGray },\r\n { id: 'CMTimerBarGCBar', colour: ColourPurple },\r\n ]);\r\n TimerBar.appendChild(CMTimerBarGC);\r\n\r\n // Create standard Reindeer bar\r\n const CMTimerBarRen = CreateTimer('CMTimerBarRen', 'Next Reindeer', [\r\n { id: 'CMTimerBarRenMinBar', colour: ColourGray },\r\n { id: 'CMTimerBarRenBar', colour: ColourOrange },\r\n ]);\r\n TimerBar.appendChild(CMTimerBarRen);\r\n const TimerBarBuffTimers = document.createElement('div');\r\n TimerBarBuffTimers.id = 'CMTimerBarBuffTimers';\r\n TimerBar.appendChild(TimerBarBuffTimers);\r\n\r\n l('wrapper').appendChild(TimerBar);\r\n}\r\n\r\n/**\r\n * This function updates indivudual timers in the timer bar\r\n */\r\nexport function UpdateTimerBar() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1) {\r\n // label width: 113, timer width: 30, div margin: 20\r\n const maxWidthTwoBar = l('CMTimerBar').offsetWidth - 163;\r\n // label width: 113, div margin: 20, calculate timer width at runtime\r\n const maxWidthOneBar = l('CMTimerBar').offsetWidth - 133;\r\n let numberOfTimers = 0;\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AutosaveTimerBar &&\r\n Game.prefs.autosave\r\n ) {\r\n const timeTillNextAutosave =\r\n (Game.fps * 60 - (Game.OnAscend ? 0 : Game.T % (Game.fps * 60))) / Game.fps;\r\n l('CMTimerBarAutosave').style.display = '';\r\n l('CMTimerBarAutosaveBar').style.width = `${Math.round(\r\n (timeTillNextAutosave *\r\n (maxWidthOneBar - Math.ceil(timeTillNextAutosave).toString().length * 8)) /\r\n 60,\r\n )}px`;\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1\r\n ) {\r\n l('CMTimerBarAutosaveBar').textContent = Math.ceil(timeTillNextAutosave);\r\n } else l('CMTimerBarAutosaveBar').textContent = '';\r\n l('CMTimerBarAutosaveTime').textContent = Math.ceil(timeTillNextAutosave);\r\n numberOfTimers += 1;\r\n } else l('CMTimerBarAutosave').style.display = 'none';\r\n\r\n // Regulates visibility of Golden Cookie timer\r\n if (Game.shimmerTypes.golden.spawned === 0 && !Game.Has('Golden switch [off]')) {\r\n l('CMTimerBarGC').style.display = '';\r\n l('CMTimerBarGCMinBar').style.width = `${Math.round(\r\n (Math.max(0, Game.shimmerTypes.golden.minTime - Game.shimmerTypes.golden.time) *\r\n maxWidthTwoBar) /\r\n Game.shimmerTypes.golden.maxTime,\r\n )}px`;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1)\r\n l('CMTimerBarGCMinBar').textContent = Math.ceil(\r\n (Game.shimmerTypes.golden.minTime - Game.shimmerTypes.golden.time) / Game.fps,\r\n );\r\n else l('CMTimerBarGCMinBar').textContent = '';\r\n if (Game.shimmerTypes.golden.minTime === Game.shimmerTypes.golden.maxTime) {\r\n l('CMTimerBarGCMinBar').style.borderTopRightRadius = '10px';\r\n l('CMTimerBarGCMinBar').style.borderBottomRightRadius = '10px';\r\n } else {\r\n l('CMTimerBarGCMinBar').style.borderTopRightRadius = '';\r\n l('CMTimerBarGCMinBar').style.borderBottomRightRadius = '';\r\n }\r\n l('CMTimerBarGCBar').style.width = `${Math.round(\r\n (Math.min(\r\n Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.minTime,\r\n Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.time,\r\n ) *\r\n maxWidthTwoBar) /\r\n Game.shimmerTypes.golden.maxTime,\r\n )}px`;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1)\r\n l('CMTimerBarGCBar').textContent = Math.ceil(\r\n Math.min(\r\n Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.minTime,\r\n Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.time,\r\n ) / Game.fps,\r\n );\r\n else l('CMTimerBarGCBar').textContent = '';\r\n const chanceToSpawn =\r\n Math.max(\r\n 0,\r\n (Game.shimmerTypes.golden.time - Game.shimmerTypes.golden.minTime) /\r\n (Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.minTime),\r\n ) ** 5;\r\n l('CMTimerBarGCTime').textContent = `${Math.ceil(\r\n (Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.time) / Game.fps,\r\n )} ${chanceToSpawn < 0.01 ? '<' : ''}${chanceToSpawn.toLocaleString('en', {\r\n style: 'percent',\r\n })}`;\r\n numberOfTimers += 1;\r\n } else l('CMTimerBarGC').style.display = 'none';\r\n\r\n // Regulates visibility of Reindeer timer\r\n if (Game.season === 'christmas' && Game.shimmerTypes.reindeer.spawned === 0) {\r\n l('CMTimerBarRen').style.display = '';\r\n l('CMTimerBarRenMinBar').style.width = `${Math.round(\r\n (Math.max(0, Game.shimmerTypes.reindeer.minTime - Game.shimmerTypes.reindeer.time) *\r\n maxWidthTwoBar) /\r\n Game.shimmerTypes.reindeer.maxTime,\r\n )}px`;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1)\r\n l('CMTimerBarRenMinBar').textContent = Math.ceil(\r\n (Game.shimmerTypes.reindeer.minTime - Game.shimmerTypes.reindeer.time) / Game.fps,\r\n );\r\n else l('CMTimerBarRenMinBar').textContent = '';\r\n l('CMTimerBarRenBar').style.width = `${Math.round(\r\n (Math.min(\r\n Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.minTime,\r\n Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.time,\r\n ) *\r\n maxWidthTwoBar) /\r\n Game.shimmerTypes.reindeer.maxTime,\r\n )}px`;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1)\r\n l('CMTimerBarRenBar').textContent = Math.ceil(\r\n Math.min(\r\n Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.minTime,\r\n Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.time,\r\n ) / Game.fps,\r\n );\r\n else l('CMTimerBarRenBar').textContent = '';\r\n const chanceToSpawn =\r\n Math.max(\r\n 0,\r\n (Game.shimmerTypes.reindeer.time - Game.shimmerTypes.reindeer.minTime) /\r\n (Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.minTime),\r\n ) ** 5;\r\n l('CMTimerBarRenTime').textContent = `${Math.ceil(\r\n (Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.time) / Game.fps,\r\n )} ${chanceToSpawn < 0.01 ? '<' : ''}${chanceToSpawn.toLocaleString('en', {\r\n style: 'percent',\r\n })}`;\r\n numberOfTimers += 1;\r\n } else {\r\n l('CMTimerBarRen').style.display = 'none';\r\n }\r\n\r\n // On every frame all buff-timers are deleted and re-created\r\n const BuffTimerBars = {};\r\n l('CMTimerBarBuffTimers').innerHTML = '';\r\n Object.keys(Game.buffs).forEach((i) => {\r\n if (Game.buffs[i]) {\r\n const timer = CreateTimer(Game.buffs[i].name, Game.buffs[i].name, [\r\n { id: `${Game.buffs[i].name}Bar` },\r\n ]);\r\n timer.style.display = '';\r\n let classColour = '';\r\n // Gives specific timers specific colours\r\n if (typeof BuffColours[Game.buffs[i].name] !== 'undefined') {\r\n classColour = BuffColours[Game.buffs[i].name];\r\n } else classColour = ColourPurple;\r\n timer.lastChild.children[1].className = ColourBackPre + classColour;\r\n timer.lastChild.children[1].style.color = 'black';\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay === 2\r\n )\r\n timer.lastChild.children[1].textContent = `${Math.round(\r\n 100 * (Game.buffs[i].time / Game.buffs[i].maxTime),\r\n )}%`;\r\n else timer.lastChild.children[1].textContent = '';\r\n timer.lastChild.children[1].style.width = `${Math.round(\r\n (Game.buffs[i].time *\r\n (maxWidthOneBar - Math.ceil(Game.buffs[i].time / Game.fps).toString().length * 8)) /\r\n Game.buffs[i].maxTime,\r\n )}px`;\r\n timer.lastChild.children[2].textContent = Math.ceil(Game.buffs[i].time / Game.fps);\r\n numberOfTimers += 1;\r\n BuffTimerBars[Game.buffs[i].name] = timer;\r\n }\r\n });\r\n Object.keys(BuffTimerBars).forEach((i) => {\r\n l('CMTimerBarBuffTimers').appendChild(BuffTimerBars[i]);\r\n });\r\n\r\n if (numberOfTimers !== 0) {\r\n l('CMTimerBar').style.height = `${numberOfTimers * 12 + 2}px`;\r\n }\r\n if (LastNumberOfTimers !== numberOfTimers) {\r\n LastNumberOfTimers = numberOfTimers;\r\n UpdateBotTimerBarPosition();\r\n }\r\n }\r\n}\r\n","import { SimObjects } from '../../Sim/VariablesAndData';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\nimport {\r\n TooltipWrinkler,\r\n TooltipWrinklerArea,\r\n TooltipWrinklerBeingShown,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks and create a tooltip for the wrinklers\r\n * It is called by CM.Disp.Draw()\r\n * As wrinklers are not appended to the DOM we us a different system than for other tooltips\r\n */\r\nexport function CheckWrinklerTooltip() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipWrink === 1 &&\r\n TooltipWrinklerArea === 1\r\n ) {\r\n // Latter is set by CM.Main.AddWrinklerAreaDetect\r\n let showingTooltip = false;\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n const me = Game.wrinklers[i];\r\n if (me.phase > 0 && me.selected) {\r\n showingTooltip = true;\r\n if (TooltipWrinklerBeingShown[i] === 0 || TooltipWrinklerBeingShown[i] === undefined) {\r\n const placeholder = document.createElement('div');\r\n const wrinkler = document.createElement('div');\r\n wrinkler.style.minWidth = '120px';\r\n wrinkler.style.marginBottom = '4px';\r\n const div = document.createElement('div');\r\n div.style.textAlign = 'center';\r\n div.id = 'CMTooltipWrinkler';\r\n wrinkler.appendChild(div);\r\n placeholder.appendChild(wrinkler);\r\n Game.tooltip.draw(this, escape(placeholder.innerHTML));\r\n TooltipWrinkler = i;\r\n TooltipWrinklerBeingShown[i] = 1;\r\n }\r\n } else {\r\n TooltipWrinklerBeingShown[i] = 0;\r\n }\r\n });\r\n if (!showingTooltip) {\r\n Game.tooltip.hide();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * This function updates the amount to be displayed by the wrinkler tooltip created by CM.Disp.CheckWrinklerTooltip()\r\n * It is called by CM.Disp.Draw()\r\n * As wrinklers are not appended to the DOM we us a different system than for other tooltips\r\n */\r\nexport function UpdateWrinklerTooltip() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipWrink === 1 &&\r\n l('CMTooltipWrinkler') !== null\r\n ) {\r\n let { sucked } = Game.wrinklers[TooltipWrinkler];\r\n let toSuck = 1.1;\r\n if (Game.Has('Sacrilegious corruption')) toSuck *= 1.05;\r\n if (Game.wrinklers[TooltipWrinkler].type === 1) toSuck *= 3; // Shiny wrinklers\r\n sucked *= toSuck;\r\n if (Game.Has('Wrinklerspawn')) sucked *= 1.05;\r\n if (SimObjects.Temple.minigameLoaded) {\r\n const godLvl = Game.hasGod('scorn');\r\n if (godLvl === 1) sucked *= 1.15;\r\n else if (godLvl === 2) sucked *= 1.1;\r\n else if (godLvl === 3) sucked *= 1.05;\r\n }\r\n l('CMTooltipWrinkler').textContent = Beautify(sucked);\r\n }\r\n}\r\n","/**\r\n * This function refreshes the stats page, CM.Options.UpStats determines the rate at which that happens\r\n * It is called by CM.Disp.Draw()\r\n */\r\nexport default function RefreshMenu() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpStats &&\r\n Game.onMenu === 'stats' &&\r\n (Game.drawT - 1) % (Game.fps * 5) !== 0 &&\r\n (Game.drawT - 1) % Game.fps === 0\r\n )\r\n Game.UpdateMenu();\r\n}\r\n","import { CacheAverageCookiesFromClicks } from '../Cache/VariablesAndData';\r\n\r\nexport default function CMClickHook() {\r\n // Add cookies from click to array that stores average\r\n CacheAverageCookiesFromClicks.addLatest(Game.computedMouseCps);\r\n}\r\n","import { ClickTimes, CookieTimes } from '../../Disp/VariablesAndData';\r\nimport {\r\n ChoEggDiff, // eslint-disable-line no-unused-vars\r\n ClicksDiff, // eslint-disable-line no-unused-vars\r\n CookiesDiff, // eslint-disable-line no-unused-vars\r\n WrinkDiff, // eslint-disable-line no-unused-vars\r\n WrinkFattestDiff, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * @class\r\n * @classdesc \tThis is a class used to store values used to calculate average over time (mostly cps)\r\n * @var\t\t\t{number}\t\t\t\tmaxLength\tThe maximum length of the value-storage\r\n * @var\t\t\t{[]}\t\t\t\t\tqueue\t\tThe values stored\r\n * @method\t\taddLatest(newValue)\t\tAppends newValue to the value storage\r\n * @method\t\tcalcAverage(timePeriod)\tReturns the average over the specified timeperiod\r\n */\r\nexport class CMAvgQueue {\r\n constructor(maxLength) {\r\n this.maxLength = maxLength;\r\n this.queue = [];\r\n }\r\n\r\n addLatest(newValue) {\r\n if (this.queue.push(newValue) > this.maxLength) {\r\n this.queue.shift();\r\n }\r\n }\r\n\r\n /**\r\n * This functions returns the average of the values in the queue\r\n * @param \t{number}\ttimePeriod\tThe period in seconds to computer average over\r\n * @returns {number}\tret\t\t\tThe average\r\n */\r\n calcAverage(timePeriod) {\r\n let time = timePeriod;\r\n if (time > this.maxLength) time = this.maxLength;\r\n if (time > this.queue.length) time = this.queue.length;\r\n let ret = 0;\r\n for (let i = this.queue.length - 1; i >= 0 && i > this.queue.length - 1 - time; i--) {\r\n ret += this.queue[i];\r\n }\r\n if (ret === 0) {\r\n return 0;\r\n }\r\n return ret / time;\r\n }\r\n\r\n calcSum(timePeriod) {\r\n let time = timePeriod;\r\n if (time > this.maxLength) time = this.maxLength;\r\n if (time > this.queue.length) time = this.queue.length;\r\n if (time === 0) return 0;\r\n return this.queue.slice(-time).reduce((a, b) => a + b, 0);\r\n }\r\n}\r\n\r\n/**\r\n * This functions caches creates the CMAvgQueue used by CM.Cache.CacheAvgCPS() to calculate CPS\r\n * Called by CM.Cache.InitCache()\r\n */\r\nexport function InitCookiesDiff() {\r\n CookiesDiff = new CMAvgQueue(CookieTimes[CookieTimes.length - 1]);\r\n WrinkDiff = new CMAvgQueue(CookieTimes[CookieTimes.length - 1]);\r\n WrinkFattestDiff = new CMAvgQueue(CookieTimes[CookieTimes.length - 1]);\r\n ChoEggDiff = new CMAvgQueue(CookieTimes[CookieTimes.length - 1]);\r\n ClicksDiff = new CMAvgQueue(ClickTimes[ClickTimes.length - 1]);\r\n}\r\n","/**\r\n * Insert the provided values into `window.CookieMonsterData.Cache`.\r\n *\r\n * The initial 'Cache' is dropped from the name, so e.g. `CacheWrinklersTotal`\r\n * becomes `window.CookieMonsterData.Cache.WrinklersTotal`.\r\n */\r\nexport default function FillCMDCache(caches) {\r\n if (!('Cache' in window.CookieMonsterData)) {\r\n window.CookieMonsterData.Cache = {};\r\n }\r\n\r\n Object.keys(caches).forEach((name) => {\r\n const exportName = name.replace(/^Cache/, '');\r\n\r\n if (typeof caches[name] === 'undefined') {\r\n window.CookieMonsterData.Cache[exportName] = undefined;\r\n } else {\r\n // Passing through JSON ensures that no references are retained.\r\n window.CookieMonsterData.Cache[exportName] = JSON.parse(JSON.stringify(caches[name]));\r\n }\r\n });\r\n}\r\n","import { ClickTimes, CookieTimes } from '../../Disp/VariablesAndData';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheAverageClicks,\r\n CacheAverageCPS,\r\n CacheAverageGainBank,\r\n CacheAverageGainChoEgg,\r\n CacheAverageGainWrink,\r\n CacheAverageGainWrinkFattest,\r\n CacheAvgCPSWithChoEgg,\r\n CacheLastChoEgg,\r\n CacheLastClicks,\r\n CacheLastCookies,\r\n CacheLastCPSCheck,\r\n CacheLastWrinkCookies,\r\n CacheLastWrinkFattestCookies,\r\n CacheRealCookiesEarned,\r\n CacheSellForChoEgg,\r\n CacheWrinklersFattest,\r\n CacheWrinklersTotal,\r\n ChoEggDiff,\r\n ClicksDiff,\r\n CookiesDiff,\r\n WrinkDiff,\r\n WrinkFattestDiff,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches two variables related average CPS and Clicks\r\n * It is called by CM.Cache.LoopCache()\r\n * @global\t{number}\tCM.Cache.RealCookiesEarned\tCookies earned including the Chocolate Egg\r\n * @global\t{number}\tCM.Cache.AvgCPS\t\t\t\tAverage cookies over time-period as defined by AvgCPSHist\r\n * @global\t{number}\tCM.Cache.AverageClicks\t\tAverage cookies from clicking over time-period as defined by AvgClicksHist\r\n * @global\t{number}\tCM.Cache.AvgCPSChoEgg\t\tAverage cookies from combination of normal CPS and average Chocolate Cookie CPS\r\n */\r\nexport default function CacheAvgCPS() {\r\n const currDate = Math.floor(Date.now() / 1000);\r\n // Only calculate every new second\r\n if ((Game.T / Game.fps) % 1 === 0) {\r\n let choEggTotal = Game.cookies + CacheSellForChoEgg;\r\n if (Game.cpsSucked > 0) choEggTotal += CacheWrinklersTotal;\r\n CacheRealCookiesEarned = Math.max(Game.cookiesEarned, choEggTotal);\r\n choEggTotal *= 0.05;\r\n\r\n // Add recent gains to AvgQueue's\r\n const timeDiff = currDate - CacheLastCPSCheck;\r\n const bankDiffAvg = Math.max(0, Game.cookies - CacheLastCookies) / timeDiff;\r\n const wrinkDiffAvg = Math.max(0, CacheWrinklersTotal - CacheLastWrinkCookies) / timeDiff;\r\n const wrinkFattestDiffAvg =\r\n Math.max(0, CacheWrinklersFattest[0] - CacheLastWrinkFattestCookies) / timeDiff;\r\n const choEggDiffAvg = Math.max(0, choEggTotal - CacheLastChoEgg) / timeDiff;\r\n const clicksDiffAvg = (Game.cookieClicks - CacheLastClicks) / timeDiff;\r\n for (let i = 0; i < timeDiff; i++) {\r\n CookiesDiff.addLatest(bankDiffAvg);\r\n WrinkDiff.addLatest(wrinkDiffAvg);\r\n WrinkFattestDiff.addLatest(wrinkFattestDiffAvg);\r\n ChoEggDiff.addLatest(choEggDiffAvg);\r\n ClicksDiff.addLatest(clicksDiffAvg);\r\n }\r\n\r\n // Store current data for next loop\r\n CacheLastCPSCheck = currDate;\r\n CacheLastCookies = Game.cookies;\r\n CacheLastWrinkCookies = CacheWrinklersTotal;\r\n CacheLastWrinkFattestCookies = CacheWrinklersFattest[0];\r\n CacheLastChoEgg = choEggTotal;\r\n CacheLastClicks = Game.cookieClicks;\r\n\r\n // Get average gain over period of cpsLength seconds\r\n const cpsLength =\r\n CookieTimes[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist];\r\n CacheAverageGainBank = CookiesDiff.calcAverage(cpsLength);\r\n CacheAverageGainWrink = WrinkDiff.calcAverage(cpsLength);\r\n CacheAverageGainWrinkFattest = WrinkFattestDiff.calcAverage(cpsLength);\r\n CacheAverageGainChoEgg = ChoEggDiff.calcAverage(cpsLength);\r\n CacheAverageCPS = CacheAverageGainBank;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 1)\r\n CacheAverageCPS += CacheAverageGainWrink;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 2)\r\n CacheAverageCPS += CacheAverageGainWrinkFattest;\r\n\r\n const choEgg = Game.HasUnlocked('Chocolate egg') && !Game.Has('Chocolate egg');\r\n\r\n if (\r\n choEgg ||\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 0\r\n ) {\r\n CacheAvgCPSWithChoEgg =\r\n CacheAverageGainBank + CacheAverageGainWrink + (choEgg ? CacheAverageGainChoEgg : 0);\r\n } else CacheAvgCPSWithChoEgg = CacheAverageCPS;\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n CacheAverageClicks = ClicksDiff.calcAverage(\r\n ClickTimes[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist],\r\n );\r\n }\r\n\r\n FillCMDCache({\r\n CacheRealCookiesEarned,\r\n CacheLastCPSCheck,\r\n CacheLastCookies,\r\n CacheLastWrinkCookies,\r\n CacheLastWrinkFattestCookies,\r\n CacheLastChoEgg,\r\n CacheLastClicks,\r\n CacheAverageGainBank,\r\n CacheAverageGainWrink,\r\n CacheAverageGainWrinkFattest,\r\n CacheAverageGainChoEgg,\r\n CacheAverageCPS,\r\n CacheAvgCPSWithChoEgg,\r\n CacheAverageClicks,\r\n });\r\n}\r\n","/**\r\n * This function calculates the total price for buying \"increase\" of a building\r\n * @param\t{string}\tbuild\t\tName of the building\r\n * @param\t{number}\tbasePrice\tBase Price of building\r\n * @param\t{number}\tstart\t\tStarting amount of building\r\n * @param\t{number}\tfree\t\tFree amount of building\r\n * @param\t{number}\tincrease\tIncrease of building\r\n * @returns {number}\tmoni\t\tTotal price\r\n */\r\nexport default function BuildingGetPrice(build, basePrice, start, free, increase) {\r\n let partialPrice = 0;\r\n for (let i = Math.max(0, start); i < Math.max(0, start + increase); i++) {\r\n partialPrice += Game.priceIncrease ** Math.max(0, i - free);\r\n }\r\n let price = basePrice * partialPrice;\r\n price = Game.modifyBuildingPrice(Game.Objects[build], price);\r\n return Math.ceil(price);\r\n}\r\n","import GetWrinkConfigBank from '../../Disp/HelperFunctions/GetWrinkConfigBank';\r\nimport { ColourGray } from '../../Disp/VariablesAndData';\r\nimport BuildingGetPrice from '../../Sim/SimulationEvents/BuyBuilding';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheMinPP,\r\n CacheMinPPBulk,\r\n CacheObjects1,\r\n CacheObjects10,\r\n CacheObjects100,\r\n CachePPArray,\r\n} from '../VariablesAndData';\r\nimport ColourOfPP from './ColourOfPP';\r\n\r\n/**\r\n * This functions caches the buildings of bulk-buy mode when PP is compared against optimal single-purchase building\r\n * It saves all date in CM.Cache.Objects...\r\n * It is called by CM.Cache.CacheBuildingsPP()\r\n */\r\nfunction CacheColour(target, amount) {\r\n Object.keys(target).forEach((i) => {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPRigidelMode &&\r\n amount === 1\r\n ) {\r\n target[i].colour = ColourGray; // eslint-disable-line no-param-reassign\r\n return;\r\n }\r\n // eslint-disable-next-line no-param-reassign\r\n target[i].colour = ColourOfPP(\r\n target[i],\r\n BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n amount,\r\n ),\r\n );\r\n // Colour based on excluding certain top-buildings\r\n for (\r\n let j = 0;\r\n j < Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop;\r\n j++\r\n ) {\r\n if (target[i].pp === CachePPArray[j][0]) target[i].colour = ColourGray; // eslint-disable-line no-param-reassign\r\n }\r\n });\r\n}\r\n\r\nfunction CachePP(target, amount) {\r\n Object.keys(target).forEach((i) => {\r\n const price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n amount,\r\n );\r\n if (Game.cookiesPs) {\r\n target[i].pp = // eslint-disable-line no-param-reassign\r\n Math.max(price - (Game.cookies + GetWrinkConfigBank()), 0) / Game.cookiesPs +\r\n price / target[i].bonus;\r\n } else target[i].pp = price / target[i].bonus; // eslint-disable-line no-param-reassign\r\n if (\r\n !(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPRigidelMode &&\r\n amount === 1\r\n )\r\n )\r\n CachePPArray.push([target[i].pp, amount, price]);\r\n });\r\n}\r\n\r\n/**\r\n * This functions caches the PP of each building it saves all date in CM.Cache.Objects...\r\n * It is called by CM.Cache.CachePP()\r\n */\r\nexport default function CacheBuildingsPP() {\r\n CacheMinPP = Infinity;\r\n CachePPArray = [];\r\n if (\r\n typeof Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop ===\r\n 'undefined'\r\n )\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop = 0; // Otherwise breaks during initialization\r\n\r\n // Calculate PP and colours\r\n CachePP(CacheObjects1, 1);\r\n CachePP(CacheObjects10, 10);\r\n CachePP(CacheObjects100, 100);\r\n\r\n // Set CM.Cache.min to best non-excluded buidliung\r\n CachePPArray.sort((a, b) => a[0] - b[0]);\r\n let indexOfMin = Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPOnlyConsiderBuyable) {\r\n while (CachePPArray[indexOfMin][2] > Game.cookies) {\r\n indexOfMin += 1;\r\n if (CachePPArray.length === indexOfMin + 1) {\r\n break;\r\n }\r\n }\r\n }\r\n CacheMinPP = CachePPArray[indexOfMin][0];\r\n CacheMinPPBulk = CachePPArray[indexOfMin][1];\r\n\r\n CacheColour(CacheObjects1, 1);\r\n CacheColour(CacheObjects10, 10);\r\n CacheColour(CacheObjects100, 100);\r\n\r\n FillCMDCache({ CacheMinPP, CacheMinPPBulk, CachePPArray });\r\n}\r\n","/**\r\n * Section: Functions related to caching PP */\r\n\r\nimport { CacheObjects1, CacheObjects10, CacheObjects100, CacheUpgrades } from '../VariablesAndData';\r\nimport CacheBuildingsPP from './Building';\r\nimport CacheUpgradePP from './Upgrade';\r\n\r\n/**\r\n * This functions caches the PP of each building and upgrade and stores it in the cache\r\n * It is called by CM.Cache.LoopCache() and CM.Cache.InitCache()\r\n */\r\nexport default function CachePP() {\r\n CacheBuildingsPP();\r\n CacheUpgradePP();\r\n window.CookieMonsterData.Objects1 = JSON.parse(JSON.stringify(CacheObjects1));\r\n window.CookieMonsterData.Objects10 = JSON.parse(JSON.stringify(CacheObjects10));\r\n window.CookieMonsterData.Objects100 = JSON.parse(JSON.stringify(CacheObjects100));\r\n window.CookieMonsterData.Upgrades = [];\r\n Object.entries(CacheUpgrades).forEach((i) => {\r\n window.CookieMonsterData.Upgrades[i[0]] = JSON.parse(JSON.stringify(i[1]));\r\n });\r\n}\r\n","import GetWrinkConfigBank from '../../Disp/HelperFunctions/GetWrinkConfigBank';\r\nimport { CacheUpgrades } from '../VariablesAndData';\r\nimport ColourOfPP from './ColourOfPP';\r\n\r\n/**\r\n * This functions caches the PP of each building it saves all date in CM.Cache.Upgrades\r\n * It is called by CM.Cache.CachePP()\r\n */\r\nexport default function CacheUpgradePP() {\r\n Object.keys(CacheUpgrades).forEach((i) => {\r\n if (Game.cookiesPs) {\r\n CacheUpgrades[i].pp =\r\n Math.max(Game.Upgrades[i].getPrice() - (Game.cookies + GetWrinkConfigBank()), 0) /\r\n Game.cookiesPs +\r\n Game.Upgrades[i].getPrice() / CacheUpgrades[i].bonus;\r\n } else CacheUpgrades[i].pp = Game.Upgrades[i].getPrice() / CacheUpgrades[i].bonus;\r\n if (Number.isNaN(CacheUpgrades[i].pp)) CacheUpgrades[i].pp = Infinity;\r\n\r\n CacheUpgrades[i].colour = ColourOfPP(CacheUpgrades[i], Game.Upgrades[i].getPrice());\r\n });\r\n}\r\n","import CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport SimAuraMult from '../ReplacedGameFunctions/SimAuraMult';\r\nimport SimEff from '../ReplacedGameFunctions/SimEff';\r\nimport SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport SimHasGod from '../ReplacedGameFunctions/SimHasGod';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport {\r\n SimAchievementsOwned,\r\n SimCookiesPs,\r\n SimObjects,\r\n SimPledges,\r\n SimUpgrades,\r\n SimUpgradesOwned, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates the cookies per click\r\n * It is called by CM.Sim.BuyUpgradesBonusIncome() when an upgrades has no bonus-income (and is thus a clicking-upgrade)\r\n * @returns\t{number}\tout\tThe clicking power\r\n */\r\nfunction MouseCps() {\r\n let add = 0;\r\n if (SimHas('Thousand fingers')) add += 0.1;\r\n if (SimHas('Million fingers')) add *= 5;\r\n if (SimHas('Billion fingers')) add *= 10;\r\n if (SimHas('Trillion fingers')) add *= 20;\r\n if (SimHas('Quadrillion fingers')) add *= 20;\r\n if (SimHas('Quintillion fingers')) add *= 20;\r\n if (SimHas('Sextillion fingers')) add *= 20;\r\n if (SimHas('Septillion fingers')) add *= 20;\r\n if (SimHas('Octillion fingers')) add *= 20;\r\n if (SimHas('Nonillion fingers')) add *= 20;\r\n if (SimHas('Decillion fingers')) add *= 20;\r\n if (SimHas('Undecillion fingers')) add *= 20;\r\n if (SimHas('Unshackled cursors')) add *= 25;\r\n let num = 0;\r\n Object.keys(SimObjects).forEach((i) => {\r\n num += SimObjects[i].amount;\r\n });\r\n num -= SimObjects.Cursor.amount;\r\n add *= num;\r\n\r\n // Can use SimCookiesPs as function is always called after CM.Sim.CalculateGains()\r\n if (SimHas('Plastic mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Iron mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Titanium mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Adamantium mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Unobtainium mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Eludium mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Wishalloy mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Fantasteel mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Nevercrack mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Armythril mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Technobsidian mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Plasmarble mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Miraculite mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Aetherice mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Omniplast mouse')) add += SimCookiesPs * 0.01;\r\n\r\n if (SimHas('Fortune #104')) add += SimCookiesPs * 0.01;\r\n\r\n let mult = 1;\r\n if (SimHas(\"Santa's helpers\")) mult *= 1.1;\r\n if (SimHas('Cookie egg')) mult *= 1.1;\r\n if (SimHas('Halo gloves')) mult *= 1.1;\r\n if (SimHas('Dragon claw')) mult *= 1.03;\r\n\r\n if (SimHas('Aura gloves')) {\r\n mult *= 1 + 0.05 * Math.min(Game.Objects.Cursor.level, SimHas('Luminous gloves') ? 20 : 10);\r\n }\r\n\r\n mult *= SimEff('click');\r\n if (SimObjects.Temple.minigameLoaded) {\r\n if (SimHasGod) {\r\n const godLvl = SimHasGod('labor');\r\n if (godLvl === 1) mult *= 1.15;\r\n else if (godLvl === 2) mult *= 1.1;\r\n else if (godLvl === 3) mult *= 1.05;\r\n }\r\n }\r\n\r\n Object.keys(Game.buffs).forEach((i) => {\r\n if (typeof Game.buffs[i].multClick !== 'undefined') mult *= Game.buffs[i].multClick;\r\n });\r\n\r\n // if (CM.Sim.auraMult('Dragon Cursor')) mult*=1.05;\r\n mult *= 1 + SimAuraMult('Dragon Cursor') * 0.05;\r\n\r\n // No need to make this function a CM function\r\n let out =\r\n mult *\r\n Game.ComputeCps(\r\n 1,\r\n SimHas('Reinforced index finger') +\r\n SimHas('Carpal tunnel prevention cream') +\r\n SimHas('Ambidextrous'),\r\n add,\r\n );\r\n\r\n out = Game.runModHookOnValue('cookiesPerClick', out);\r\n\r\n if (Game.hasBuff('Cursed finger')) out = Game.buffs['Cursed finger'].power;\r\n\r\n return out;\r\n}\r\n\r\n/**\r\n * This function calculates the bonus income of buying a building\r\n * It is called by CM.Cache.CacheBuildingIncome()\r\n * @param\t{string}\t\t\t\tbuilding\tThe name of the upgrade to be bought\r\n * @returns {[{number, number}]}\t\t\t\tThe bonus income of the upgrade and the difference in MouseCPS\r\n */\r\nexport default function BuyUpgradesBonusIncome(upgrade) {\r\n if (\r\n Game.Upgrades[upgrade].pool === 'toggle' ||\r\n (Game.Upgrades[upgrade].bought === 0 &&\r\n Game.Upgrades[upgrade].unlocked &&\r\n Game.Upgrades[upgrade].pool !== 'prestige')\r\n ) {\r\n CopyData();\r\n if (SimUpgrades[upgrade].name === 'Shimmering veil [on]') {\r\n SimUpgrades['Shimmering veil [off]'].bought = 0;\r\n } else if (SimUpgrades[upgrade].name === 'Golden switch [on]') {\r\n SimUpgrades['Golden switch [off]'].bought = 0;\r\n } else {\r\n SimUpgrades[upgrade].bought = (SimUpgrades[upgrade].bought + 1) % 2;\r\n }\r\n if (Game.CountsAsUpgradeOwned(Game.Upgrades[upgrade].pool)) SimUpgradesOwned += 1;\r\n\r\n if (upgrade === 'Elder Pledge') {\r\n SimPledges += 1;\r\n if (SimPledges > 0) SimWin('Elder nap');\r\n if (SimPledges >= 5) SimWin('Elder slumber');\r\n } else if (upgrade === 'Elder Covenant') {\r\n SimWin('Elder calm');\r\n } else if (upgrade === 'Prism heart biscuits') {\r\n SimWin('Lovely cookies');\r\n } else if (upgrade === 'Heavenly key') {\r\n SimWin('Wholesome');\r\n }\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n\r\n const diffMouseCPS = MouseCps() - Game.computedMouseCps;\r\n if (diffMouseCPS) {\r\n return [SimCookiesPs - Game.cookiesPs, diffMouseCPS];\r\n }\r\n return [SimCookiesPs - Game.cookiesPs];\r\n }\r\n return [];\r\n}\r\n","/** Section: Functions related to caching income */\r\n\r\nimport BuildingGetPrice from '../../Sim/SimulationEvents/BuyBuilding';\r\nimport BuyBuildingsBonusIncome from '../../Sim/SimulationEvents/BuyBuildingBonusIncome';\r\nimport BuyUpgradesBonusIncome from '../../Sim/SimulationEvents/BuyUpgrades';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheAverageGainBank,\r\n CacheAverageGainWrink,\r\n CacheAverageGainWrinkFattest,\r\n CacheDoRemakeBuildPrices, // eslint-disable-line no-unused-vars\r\n CacheObjects1,\r\n CacheObjects10,\r\n CacheObjects100,\r\n CacheObjectsNextAchievement,\r\n CacheUpgrades,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions starts the calculation/simulation of the bonus income of buildings\r\n * It is called by CM.Cache.CacheIncome()\r\n * @param\t{amount}\tamount\tAmount to be bought\r\n * @parem\t{string}\ttarget\tThe target Cache object (\"Objects1\", \"Objects10\" or \"Objects100\")\r\n */\r\nfunction CacheBuildingIncome(amount) {\r\n const result = {};\r\n Object.keys(Game.Objects).forEach((i) => {\r\n result[i] = {};\r\n result[i].bonus = BuyBuildingsBonusIncome(i, amount);\r\n if (amount !== 1) {\r\n CacheDoRemakeBuildPrices = 1;\r\n }\r\n });\r\n return result;\r\n}\r\n\r\n/**\r\n * This functions starts the calculation/simulation of the bonus income of upgrades\r\n * It is called by CM.Cache.CacheIncome()\r\n */\r\nfunction CacheUpgradeIncome() {\r\n CacheUpgrades = {};\r\n for (let i = 0; i < Game.UpgradesInStore.length; i++) {\r\n const upgradeName = Game.UpgradesInStore[i].name;\r\n const bonusIncome = BuyUpgradesBonusIncome(upgradeName);\r\n if (upgradeName === 'Elder Pledge') {\r\n CacheUpgrades[upgradeName] = {\r\n bonus: Game.cookiesPs - CacheAverageGainBank,\r\n };\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 1)\r\n CacheUpgrades[upgradeName].bonus -= CacheAverageGainWrink;\r\n else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 2)\r\n CacheUpgrades[upgradeName].bonus -= CacheAverageGainWrinkFattest;\r\n if (!Number.isFinite(CacheUpgrades[upgradeName].bonus)) CacheUpgrades[upgradeName].bonus = 0;\r\n } else {\r\n CacheUpgrades[upgradeName] = {};\r\n if (bonusIncome[0]) CacheUpgrades[upgradeName].bonus = bonusIncome[0];\r\n if (bonusIncome[1]) CacheUpgrades[upgradeName].bonusMouse = bonusIncome[1];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * This functions caches the price of each building and stores it in the cache\r\n */\r\nexport function CacheBuildingsPrices() {\r\n Object.keys(Game.Objects).forEach((i) => {\r\n CacheObjects1[i].price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n 1,\r\n );\r\n CacheObjects10[i].price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n 10,\r\n );\r\n CacheObjects100[i].price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n 100,\r\n );\r\n CacheObjectsNextAchievement[i].price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n CacheObjectsNextAchievement[i].AmountNeeded,\r\n );\r\n });\r\n\r\n FillCMDCache({ CacheObjectsNextAchievement });\r\n}\r\n\r\n/**\r\n * This functions caches the income gain of each building and upgrade and stores it in the cache\r\n * It is called by CM.Main.Loop() and CM.Cache.InitCache()\r\n */\r\nexport function CacheIncome() {\r\n // Simulate Building Buys for 1, 10 and 100 amount\r\n CacheObjects1 = CacheBuildingIncome(1);\r\n CacheObjects10 = CacheBuildingIncome(10);\r\n CacheObjects100 = CacheBuildingIncome(100);\r\n\r\n // Simulate Upgrade Buys\r\n CacheUpgradeIncome();\r\n}\r\n","import GetCPSBuffMult from '../CPS/GetCPSBuffMult';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheChainFrenzyMaxReward,\r\n CacheChainFrenzyRequired,\r\n CacheChainFrenzyRequiredNext,\r\n CacheChainFrenzyWrathMaxReward,\r\n CacheChainFrenzyWrathRequired,\r\n CacheChainFrenzyWrathRequiredNext,\r\n CacheChainMaxReward,\r\n CacheChainRequired,\r\n CacheChainRequiredNext,\r\n CacheChainWrathMaxReward,\r\n CacheChainWrathRequired,\r\n CacheChainWrathRequiredNext,\r\n CacheDragonsFortuneMultAdjustment,\r\n CacheGoldenCookiesMult,\r\n CacheNoGoldSwitchCookiesPS,\r\n CacheWrathCookiesMult,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions calculates the max possible payout given a set of variables\r\n * It is called by CM.Disp.CreateStatsChainSection() and CM.Cache.CacheChain()\r\n * @param\t{number}\t\t\t\t\tdigit\t\tNumber of Golden Cookies in chain\r\n * @param\t{number}\t\t\t\t\tmaxPayout\tMaximum payout\r\n * @param\t{number}\t\t\t\t\tmult\t\tMultiplier\r\n * @returns\t[{number, number, number}]\t\t\t\tTotal cookies earned, cookie needed for this and next level\r\n */\r\nexport function MaxChainCookieReward(digit, maxPayout, mult) {\r\n let totalFromChain = 0;\r\n let moni = 0;\r\n let nextMoni = 0;\r\n let nextRequired = 0;\r\n let chain = 1 + Math.max(0, Math.ceil(Math.log(Game.cookies) / Math.LN10) - 10);\r\n while (nextMoni < maxPayout * mult) {\r\n moni = Math.max(\r\n digit,\r\n Math.min(Math.floor((1 / 9) * 10 ** chain * digit * mult), maxPayout * mult),\r\n );\r\n nextMoni = Math.max(\r\n digit,\r\n Math.min(Math.floor((1 / 9) * 10 ** (chain + 1) * digit * mult), maxPayout * mult),\r\n );\r\n nextRequired = Math.floor((1 / 9) * 10 ** (chain + 1) * digit * mult);\r\n totalFromChain += moni;\r\n chain += 1;\r\n }\r\n return [totalFromChain, moni, nextRequired];\r\n}\r\n\r\n/**\r\n * This functions caches data related to Chain Cookies reward from Golden Cookioes\r\n * It is called by CM.Main.Loop() upon changes to cps and CM.Cache.InitCache()\r\n * @global\t[{number, number}]\tCM.Cache.ChainMaxReward\t\t\tTotal cookies earned, and cookies needed for next level for normal chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainRequired\t\t\tCookies needed for maximum reward for normal chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainRequiredNext\t\tTotal cookies needed for next level for normal chain\r\n * @global\t[{number, number}]\tCM.Cache.ChainMaxWrathReward\t\t\tTotal cookies earned, and cookies needed for next level for wrath chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainWrathRequired\t\t\tCookies needed for maximum reward for wrath chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainWrathRequiredNext\t\tTotal cookies needed for next level for wrath chain\r\n * @global\t[{number, number}]\tCM.Cache.ChainFrenzyMaxReward\t\t\tTotal cookies earned, and cookies needed for next level for normal frenzy chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainFrenzyRequired\t\t\tCookies needed for maximum reward for normal frenzy chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainFrenzyRequiredNext\t\tTotal cookies needed for next level for normal frenzy chain\r\n * @global\t[{number, number}]\tCM.Cache.ChainFrenzyWrathMaxReward\t\t\tTotal cookies earned, and cookies needed for next level for wrath frenzy chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainFrenzyWrathRequired\t\t\tCookies needed for maximum reward for wrath frenzy chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainFrenzyWrathRequiredNext\t\tTotal cookies needed for next level for wrath frenzy chain\r\n */\r\nexport function CacheChain() {\r\n let maxPayout = CacheNoGoldSwitchCookiesPS * 60 * 60 * 6 * CacheDragonsFortuneMultAdjustment;\r\n // Removes effect of Frenzy etc.\r\n const cpsBuffMult = GetCPSBuffMult();\r\n if (cpsBuffMult > 0) maxPayout /= cpsBuffMult;\r\n else maxPayout = 0;\r\n\r\n CacheChainMaxReward = MaxChainCookieReward(7, maxPayout, CacheGoldenCookiesMult);\r\n CacheChainRequired = (CacheChainMaxReward[1] * 2) / CacheGoldenCookiesMult;\r\n CacheChainRequiredNext = CacheChainMaxReward[2] / 60 / 60 / 6 / CacheDragonsFortuneMultAdjustment;\r\n\r\n CacheChainWrathMaxReward = MaxChainCookieReward(6, maxPayout, CacheWrathCookiesMult);\r\n CacheChainWrathRequired = (CacheChainWrathMaxReward[1] * 2) / CacheWrathCookiesMult;\r\n CacheChainWrathRequiredNext =\r\n CacheChainWrathMaxReward[2] / 60 / 60 / 6 / CacheDragonsFortuneMultAdjustment;\r\n\r\n CacheChainFrenzyMaxReward = MaxChainCookieReward(7, maxPayout * 7, CacheGoldenCookiesMult);\r\n CacheChainFrenzyRequired = (CacheChainFrenzyMaxReward[1] * 2) / CacheGoldenCookiesMult;\r\n CacheChainFrenzyRequiredNext =\r\n CacheChainFrenzyMaxReward[2] / 60 / 60 / 6 / CacheDragonsFortuneMultAdjustment;\r\n\r\n CacheChainFrenzyWrathMaxReward = MaxChainCookieReward(6, maxPayout * 7, CacheWrathCookiesMult);\r\n CacheChainFrenzyWrathRequired = (CacheChainFrenzyWrathMaxReward[1] * 2) / CacheWrathCookiesMult;\r\n CacheChainFrenzyWrathRequiredNext =\r\n CacheChainFrenzyWrathMaxReward[2] / 60 / 60 / 6 / CacheDragonsFortuneMultAdjustment;\r\n\r\n FillCMDCache({\r\n CacheChainMaxReward,\r\n CacheChainRequired,\r\n CacheChainRequiredNext,\r\n CacheChainWrathMaxReward,\r\n CacheChainWrathRequired,\r\n CacheChainWrathRequiredNext,\r\n CacheChainFrenzyMaxReward,\r\n CacheChainFrenzyRequired,\r\n CacheChainFrenzyRequiredNext,\r\n CacheChainFrenzyWrathMaxReward,\r\n CacheChainFrenzyWrathRequired,\r\n CacheChainFrenzyWrathRequiredNext,\r\n });\r\n}\r\n","import FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheHCPerSecond,\r\n CacheLastHeavenlyCheck,\r\n CacheLastHeavenlyChips,\r\n HeavenlyChipsDiff,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the heavenly chips per second in the last five seconds\r\n * It is called by CM.Cache.LoopCache()\r\n * @global\t{number}\tCM.Cache.HCPerSecond\tThe Heavenly Chips per second in the last five seconds\r\n */\r\nexport default function CacheHeavenlyChipsPS() {\r\n const currDate = Math.floor(Date.now() / 1000);\r\n // Only calculate every new second\r\n if ((Game.T / Game.fps) % 1 === 0) {\r\n const chipsOwned = Game.HowMuchPrestige(Game.cookiesReset);\r\n const ascendNowToOwn = Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned));\r\n const ascendNowToGet = ascendNowToOwn - Math.floor(chipsOwned);\r\n\r\n // Add recent gains to AvgQueue's\r\n const timeDiff = currDate - CacheLastHeavenlyCheck;\r\n const heavenlyChipsDiffAvg = Math.max(0, ascendNowToGet - CacheLastHeavenlyChips) / timeDiff;\r\n for (let i = 0; i < timeDiff; i++) {\r\n HeavenlyChipsDiff.addLatest(heavenlyChipsDiffAvg);\r\n }\r\n\r\n // Store current data for next loop\r\n CacheLastHeavenlyCheck = currDate;\r\n CacheLastHeavenlyChips = ascendNowToGet;\r\n\r\n // Get average gain over period of 5 seconds\r\n CacheHCPerSecond = HeavenlyChipsDiff.calcAverage(5);\r\n }\r\n\r\n FillCMDCache({ CacheLastHeavenlyCheck, CacheLastHeavenlyChips, CacheHCPerSecond });\r\n}\r\n","import { crateMissing } from '../../Disp/MenuSections/Statistics/CreateMissingUpgrades';\r\nimport {\r\n CacheMissingUpgrades, // eslint-disable-line no-unused-vars\r\n CacheMissingUpgradesCookies, // eslint-disable-line no-unused-vars\r\n CacheMissingUpgradesPrestige, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches variables related to missing upgrades\r\n * It is called by CM.Main.Loop() and CM.Cache.InitCache()\r\n * @global\t{string}\tCM.Cache.MissingUpgrades\t\t\tString containig the HTML to create the \"crates\" for missing normal upgrades\r\n * @global\t{string}\tCM.Cache.MissingUpgradesCookies\t\tString containig the HTML to create the \"crates\" for missing cookie upgrades\r\n * @global\t{string}\tCM.Cache.MissingUpgradesPrestige\tString containig the HTML to create the \"crates\" for missing prestige upgrades\r\n */\r\nexport default function CacheAllMissingUpgrades() {\r\n CacheMissingUpgrades = '';\r\n CacheMissingUpgradesCookies = '';\r\n CacheMissingUpgradesPrestige = '';\r\n const list = [];\r\n // sort the upgrades\r\n Object.keys(Game.Upgrades).forEach((i) => {\r\n list.push(Game.Upgrades[i]);\r\n });\r\n const sortMap = function (a, b) {\r\n if (a.order > b.order) return 1;\r\n if (a.order < b.order) return -1;\r\n return 0;\r\n };\r\n list.sort(sortMap);\r\n\r\n Object.keys(list).forEach((i) => {\r\n const me = list[i];\r\n\r\n if (me.bought === 0) {\r\n let str = '';\r\n\r\n str += crateMissing(me);\r\n /* eslint-disable no-unused-vars */\r\n if (me.pool === 'prestige') CacheMissingUpgradesPrestige += str;\r\n else if (me.pool === 'cookie') CacheMissingUpgradesCookies += str;\r\n else if (me.pool !== 'toggle' && me.pool !== 'unused' && me.pool !== 'debug')\r\n CacheMissingUpgrades += str;\r\n /* eslint-enable no-unused-vars */\r\n }\r\n });\r\n}\r\n","/** Functions related to displaying the missing upgrades in the Statistics page */\r\n\r\nimport {\r\n CacheMissingUpgrades,\r\n CacheMissingUpgradesCookies,\r\n CacheMissingUpgradesPrestige,\r\n} from '../../../Cache/VariablesAndData';\r\n\r\n/**\r\n * This function creates the missing upgrades sections for prestige, normal and cookie upgrades\r\n */\r\nexport function AddMissingUpgrades() {\r\n l('menu').childNodes.forEach((menuSection) => {\r\n if (menuSection.children[0]) {\r\n if (menuSection.children[0].innerHTML === 'Prestige' && CacheMissingUpgradesPrestige) {\r\n const prestigeUpgradesMissing =\r\n CacheMissingUpgradesPrestige.match(new RegExp('div', 'g') || []).length / 2;\r\n const title = document.createElement('div');\r\n title.id = 'CMMissingUpgradesPrestigeTitle';\r\n title.className = 'listing';\r\n const titlefrag = document.createElement('div');\r\n titlefrag.innerHTML = `<b>Missing Prestige upgrades:</b> ${prestigeUpgradesMissing}/${\r\n Game.PrestigeUpgrades.length\r\n } (${Math.floor((prestigeUpgradesMissing / Game.PrestigeUpgrades.length) * 100)}%)`;\r\n title.appendChild(titlefrag);\r\n menuSection.appendChild(title);\r\n const upgrades = document.createElement('div');\r\n upgrades.className = 'listing crateBox';\r\n upgrades.innerHTML = CacheMissingUpgradesPrestige;\r\n menuSection.appendChild(upgrades);\r\n } else if (menuSection.children[0].innerHTML === 'Upgrades') {\r\n if (CacheMissingUpgrades) {\r\n const normalUpgradesMissing =\r\n CacheMissingUpgrades.match(new RegExp('div', 'g') || []).length / 2;\r\n const title = document.createElement('div');\r\n title.id = 'CMMissingUpgradesTitle';\r\n title.className = 'listing';\r\n const titlefrag = document.createElement('div');\r\n titlefrag.innerHTML = `<b>Missing normal upgrades:</b> ${normalUpgradesMissing}/${\r\n Game.UpgradesByPool[''].length + Game.UpgradesByPool.tech.length\r\n } (${Math.floor(\r\n (normalUpgradesMissing /\r\n (Game.UpgradesByPool[''].length + Game.UpgradesByPool.tech.length)) *\r\n 100,\r\n )}%)`;\r\n title.appendChild(titlefrag);\r\n menuSection.insertBefore(title, menuSection.childNodes[3]);\r\n const upgrades = document.createElement('div');\r\n upgrades.className = 'listing crateBox';\r\n upgrades.innerHTML = CacheMissingUpgrades;\r\n menuSection.insertBefore(\r\n upgrades,\r\n document.getElementById('CMMissingUpgradesTitle').nextSibling,\r\n );\r\n }\r\n if (CacheMissingUpgradesCookies) {\r\n const cookieUpgradesMissing =\r\n CacheMissingUpgradesCookies.match(new RegExp('div', 'g') || []).length / 2;\r\n const title = document.createElement('div');\r\n title.id = 'CMMissingUpgradesCookiesTitle';\r\n title.className = 'listing';\r\n const titlefrag = document.createElement('div');\r\n titlefrag.innerHTML = `<b>Missing Cookie upgrades:</b> ${cookieUpgradesMissing}/${\r\n Game.UpgradesByPool.cookie.length\r\n } (${Math.floor((cookieUpgradesMissing / Game.UpgradesByPool.cookie.length) * 100)}%)`;\r\n title.appendChild(titlefrag);\r\n menuSection.appendChild(title);\r\n const upgrades = document.createElement('div');\r\n upgrades.className = 'listing crateBox';\r\n upgrades.innerHTML = CacheMissingUpgradesCookies;\r\n menuSection.appendChild(upgrades);\r\n }\r\n }\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * This function returns the \"crates\" (icons) for missing upgrades in the stats sections\r\n * It returns a html string that gets appended to the respective CM.Cache.MissingUpgrades-variable by CM.Cache.CacheMissingUpgrades()\r\n * @param\t{object}\tme\tThe upgrade object\r\n * @returns\t{string}\t?\tThe HTML string that creates the icon.\r\n */\r\nexport function crateMissing(me) {\r\n let classes = 'crate upgrade missing';\r\n if (me.pool === 'prestige') classes += ' heavenly';\r\n\r\n let noFrame = 0;\r\n if (!Game.prefs.crates) noFrame = 1;\r\n if (noFrame) classes += ' noFrame';\r\n\r\n let { icon } = me;\r\n if (me.iconFunction) icon = me.iconFunction();\r\n const tooltip = `function() {return Game.crateTooltip(Game.UpgradesById[${me.id}], 'stats');}`;\r\n return `<div class=\"${classes}\"\r\n\t${Game.getDynamicTooltip(tooltip, 'top', true)}\r\n\tstyle = \"${`${icon[2] ? `background-image: url(${icon[2]});` : ''}background-position:${\r\n -icon[0] * 48\r\n }px ${-icon[1] * 48}px`};\">\r\n\t</div>`;\r\n}\r\n","import FillCMDCache from '../FillCMDCache';\r\nimport { CacheSeaSpec } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the reward of popping a reindeer\r\n * It is called by CM.Main.Loop() and CM.Cache.InitCache()\r\n * @global\t{number}\tCM.Cache.SeaSpec\tThe reward for popping a reindeer\r\n */\r\nexport default function CacheSeasonSpec() {\r\n if (Game.season === 'christmas') {\r\n let val = Game.cookiesPs * 60;\r\n if (Game.hasBuff('Elder frenzy')) val *= 0.5;\r\n if (Game.hasBuff('Frenzy')) val *= 0.75;\r\n CacheSeaSpec = Math.max(25, val);\r\n if (Game.Has('Ho ho ho-flavored frosting')) CacheSeaSpec *= 2;\r\n }\r\n\r\n FillCMDCache({ CacheSeaSpec });\r\n}\r\n","/** Functions related to Caching stats */\r\n\r\nimport SimHas from '../../Sim/ReplacedGameFunctions/SimHas';\r\nimport GetCPSBuffMult from '../CPS/GetCPSBuffMult';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheConjure,\r\n CacheConjureReward,\r\n CacheDragonsFortuneMultAdjustment,\r\n CacheEdifice,\r\n CacheEdificeBuilding,\r\n CacheGoldenCookiesMult,\r\n CacheLucky,\r\n CacheLuckyFrenzy,\r\n CacheLuckyReward,\r\n CacheLuckyRewardFrenzy,\r\n CacheLuckyWrathReward,\r\n CacheLuckyWrathRewardFrenzy,\r\n CacheNoGoldSwitchCookiesPS,\r\n CacheWrathCookiesMult,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches variables related to the stats page\r\n */\r\nexport function CacheStatsCookies() {\r\n CacheLucky = (CacheNoGoldSwitchCookiesPS * 900) / 0.15;\r\n CacheLucky *= CacheDragonsFortuneMultAdjustment;\r\n const cpsBuffMult = GetCPSBuffMult();\r\n if (cpsBuffMult > 0) CacheLucky /= cpsBuffMult;\r\n else CacheLucky = 0;\r\n CacheLuckyReward = CacheGoldenCookiesMult * (CacheLucky * 0.15) + 13;\r\n CacheLuckyWrathReward = CacheWrathCookiesMult * (CacheLucky * 0.15) + 13;\r\n CacheLuckyFrenzy = CacheLucky * 7;\r\n CacheLuckyRewardFrenzy = CacheGoldenCookiesMult * (CacheLuckyFrenzy * 0.15) + 13;\r\n CacheLuckyWrathRewardFrenzy = CacheWrathCookiesMult * (CacheLuckyFrenzy * 0.15) + 13;\r\n CacheConjure = CacheLucky * 2;\r\n CacheConjureReward = CacheConjure * 0.15;\r\n\r\n CacheEdifice = 0;\r\n let max = 0;\r\n let n = 0;\r\n Object.keys(Game.Objects).forEach((i) => {\r\n if (Game.Objects[i].amount > max) max = Game.Objects[i].amount;\r\n if (Game.Objects[i].amount > 0) n += 1;\r\n });\r\n Object.keys(Game.Objects).forEach((i) => {\r\n if (\r\n (Game.Objects[i].amount < max || n === 1) &&\r\n Game.Objects[i].amount < 400 &&\r\n Game.Objects[i].price * 2 > CacheEdifice\r\n ) {\r\n CacheEdifice = Game.Objects[i].price * 2;\r\n CacheEdificeBuilding = i;\r\n }\r\n });\r\n\r\n FillCMDCache({\r\n CacheLucky,\r\n CacheLuckyReward,\r\n CacheLuckyWrathReward,\r\n CacheLuckyFrenzy,\r\n CacheLuckyRewardFrenzy,\r\n CacheLuckyWrathRewardFrenzy,\r\n CacheConjure,\r\n CacheConjureReward,\r\n CacheEdifice,\r\n CacheEdificeBuilding,\r\n });\r\n}\r\n\r\n/**\r\n * This functions calculates the multipliers of Golden and Wrath cookie rewards\r\n */\r\nexport function CacheGoldenAndWrathCookiesMults() {\r\n let goldenMult = 1;\r\n let wrathMult = 1;\r\n let mult = 1;\r\n\r\n // Factor auras and upgrade in mults\r\n if (SimHas('Green yeast digestives')) mult *= 1.01;\r\n if (SimHas('Dragon fang')) mult *= 1.03;\r\n\r\n goldenMult *= 1 + Game.auraMult('Ancestral Metamorphosis') * 0.1;\r\n goldenMult *= Game.eff('goldenCookieGain');\r\n wrathMult *= 1 + Game.auraMult('Unholy Dominion') * 0.1;\r\n wrathMult *= Game.eff('wrathCookieGain');\r\n\r\n // Calculate final golden and wrath multipliers\r\n CacheGoldenCookiesMult = mult * goldenMult;\r\n CacheWrathCookiesMult = mult * wrathMult;\r\n\r\n // Calculate Dragon's Fortune multiplier adjustment:\r\n // If Dragon's Fortune (or Reality Bending) aura is active and there are currently no golden cookies,\r\n // compute a multiplier adjustment to apply on the current CPS to simulate 1 golden cookie on screen.\r\n // Otherwise, the aura effect will be factored in the base CPS making the multiplier not requiring adjustment.\r\n CacheDragonsFortuneMultAdjustment = 1;\r\n if (Game.shimmerTypes.golden.n === 0) {\r\n CacheDragonsFortuneMultAdjustment *= 1 + Game.auraMult(\"Dragon's Fortune\") * 1.23;\r\n }\r\n\r\n FillCMDCache({\r\n CacheGoldenCookiesMult,\r\n CacheWrathCookiesMult,\r\n CacheDragonsFortuneMultAdjustment,\r\n });\r\n}\r\n","import BuildingGetPrice from '../../Sim/SimulationEvents/BuyBuilding';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheObjectsNextAchievement } from '../VariablesAndData';\r\nimport IndividualAmountTillNextAchievement from './IndividualAmountTillNextAchievement';\r\n\r\n/**\r\n * This functions caches the amount of buildings needed till next achievement\r\n * @param\t{boolean}\tforceRecalc\tWhether a recalcution should be forced (after CPS change)\r\n */\r\nexport default function AllAmountTillNextAchievement(forceRecalc) {\r\n const result = {};\r\n\r\n Object.keys(Game.Objects).forEach((i) => {\r\n if (\r\n Object.keys(CacheObjectsNextAchievement).length !== 0 &&\r\n CacheObjectsNextAchievement[i].TotalNeeded > Game.Objects[i].amount &&\r\n !forceRecalc\r\n ) {\r\n result[i] = {\r\n AmountNeeded: CacheObjectsNextAchievement[i].TotalNeeded - Game.Objects[i].amount,\r\n TotalNeeded: CacheObjectsNextAchievement[i].TotalNeeded,\r\n price: BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n CacheObjectsNextAchievement[i].TotalNeeded - Game.Objects[i].amount,\r\n ),\r\n };\r\n } else {\r\n const tillNext = IndividualAmountTillNextAchievement(i);\r\n result[i] = {\r\n AmountNeeded: tillNext,\r\n TotalNeeded: Game.Objects[i].amount + tillNext,\r\n price: BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n tillNext,\r\n ),\r\n };\r\n }\r\n });\r\n CacheObjectsNextAchievement = result;\r\n\r\n FillCMDCache({ CacheObjectsNextAchievement });\r\n}\r\n","import BuyBuildingsBonusIncome from '../../Sim/SimulationEvents/BuyBuildingBonusIncome';\r\nimport { SimAchievementsOwned } from '../../Sim/VariablesAndData';\r\n\r\nexport default function IndividualAmountTillNextAchievement(building) {\r\n const AchievementsAtStart = Game.AchievementsOwned;\r\n let index = 100;\r\n let lastIndexWithChange = 100;\r\n while (index > -1) {\r\n BuyBuildingsBonusIncome(building, index);\r\n if (SimAchievementsOwned > AchievementsAtStart) {\r\n lastIndexWithChange = index;\r\n index -= 10;\r\n } else if (index === 100) {\r\n return 101;\r\n } else {\r\n index += 1;\r\n while (index <= lastIndexWithChange) {\r\n BuyBuildingsBonusIncome(building, index);\r\n if (SimAchievementsOwned > AchievementsAtStart) {\r\n return index;\r\n }\r\n index += 1;\r\n }\r\n }\r\n }\r\n return 101;\r\n}\r\n","/** Caches data related to Wrinklers */\r\n\r\nimport { SimObjects } from '../../Sim/VariablesAndData';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheWrinklersFattest,\r\n CacheWrinklersNormal,\r\n CacheWrinklersTotal,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches data related to Wrinklers\r\n * It is called by CM.Cache.LoopCache() and CM.Cache.InitCache()\r\n * @global\t{number}\t\t\t\tCM.Cache.WrinklersTotal\t\tThe cookies of all wrinklers\r\n * @global\t{number}\t\t\t\tCM.Cache.WrinklersNormal\tThe cookies of all normal wrinklers\r\n * @global\t{[{number}, {number}]}\tCM.Cache.WrinklersFattest\tA list containing the cookies and the id of the fattest non-shiny wrinkler\r\n */\r\nexport default function CacheWrinklers() {\r\n CacheWrinklersTotal = 0;\r\n CacheWrinklersNormal = 0;\r\n CacheWrinklersFattest = [0, null];\r\n for (let i = 0; i < Game.wrinklers.length; i++) {\r\n let { sucked } = Game.wrinklers[i];\r\n let toSuck = 1.1;\r\n if (Game.Has('Sacrilegious corruption')) toSuck *= 1.05;\r\n if (Game.wrinklers[i].type === 1) toSuck *= 3; // Shiny wrinklers\r\n sucked *= toSuck;\r\n if (Game.Has('Wrinklerspawn')) sucked *= 1.05;\r\n if (SimObjects.Temple.minigameLoaded) {\r\n const godLvl = Game.hasGod('scorn');\r\n if (godLvl === 1) sucked *= 1.15;\r\n else if (godLvl === 2) sucked *= 1.1;\r\n else if (godLvl === 3) sucked *= 1.05;\r\n }\r\n CacheWrinklersTotal += sucked;\r\n if (Game.wrinklers[i].type === 0) {\r\n CacheWrinklersNormal += sucked;\r\n if (sucked > CacheWrinklersFattest[0]) CacheWrinklersFattest = [sucked, i];\r\n }\r\n }\r\n\r\n FillCMDCache({ CacheWrinklersTotal, CacheWrinklersNormal, CacheWrinklersFattest });\r\n}\r\n","import { ClickTimes } from '../Disp/VariablesAndData';\r\nimport { CMAvgQueue, InitCookiesDiff } from './CPS/AverageQueue';\r\nimport CacheAvgCPS from './CPS/CPS';\r\nimport CacheDragonAuras from './Dragon/CacheDragonAuras';\r\nimport CachePP from './PP/PP';\r\nimport { CacheBuildingsPrices, CacheIncome } from './PriceAndIncome/PriceAndIncome';\r\nimport { CacheChain } from './Stats/ChainCookies';\r\nimport CacheHeavenlyChipsPS from './Stats/HeavenlyChips';\r\nimport CacheAllMissingUpgrades from './Stats/MissingUpgrades';\r\nimport CacheSeasonSpec from './Stats/Reindeer';\r\nimport { CacheGoldenAndWrathCookiesMults, CacheStatsCookies } from './Stats/Stats';\r\nimport AllAmountTillNextAchievement from './TillNextAchievement/AllAmountTillNextAchievement';\r\nimport { CacheAverageCookiesFromClicks, HeavenlyChipsDiff } from './VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport CacheWrinklers from './Wrinklers/Wrinklers';\r\n\r\n/**\r\n * This functions runs all cache-functions to generate all \"full\" cache\r\n */\r\nexport default function InitCache() {\r\n CacheDragonAuras();\r\n CacheWrinklers();\r\n CacheStatsCookies();\r\n CacheGoldenAndWrathCookiesMults();\r\n CacheChain();\r\n CacheAllMissingUpgrades();\r\n CacheSeasonSpec();\r\n InitCookiesDiff();\r\n /** Used by CM.Cache.CacheHeavenlyChipsPS() */\r\n HeavenlyChipsDiff = new CMAvgQueue(5);\r\n CacheAverageCookiesFromClicks = new CMAvgQueue(ClickTimes[ClickTimes.length - 1] * 20);\r\n CacheHeavenlyChipsPS();\r\n AllAmountTillNextAchievement();\r\n CacheAvgCPS();\r\n CacheIncome();\r\n CacheBuildingsPrices();\r\n CachePP();\r\n}\r\n","/**\r\n * This function pops all normal wrinklers\r\n * It is called by a click of the 'pop all' button created by CM.Disp.AddMenuStats()\r\n */\r\nexport default function PopAllNormalWrinklers() {\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n if (Game.wrinklers[i].sucked > 0 && Game.wrinklers[i].type === 0) {\r\n Game.wrinklers[i].hp = 0;\r\n }\r\n });\r\n}\r\n","import UpdateTooltips from './UpdateTooltips';\r\nimport { SimpleTooltipElements, TooltipName, TooltipType } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport BuildingGetPrice from '../../Sim/SimulationEvents/BuyBuilding';\r\nimport GetTimeColour from '../BeautifyAndFormatting/GetTimeColour';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\n\r\n/** All general functions related to creating and updating tooltips */\r\n\r\n/**\r\n * This function creates some very basic tooltips, (e.g., the tooltips in the stats page)\r\n * The tooltips are created with CM.Disp[placeholder].appendChild(desc)\r\n * @param\t{string}\tplaceholder\tThe name used to later refer and spawn the tooltip\r\n * @param\t{string}\ttext\t\tThe text of the tooltip\r\n * @param\t{string}\tminWidth\tThe minimum width of the tooltip\r\n */\r\nexport function CreateSimpleTooltip(placeholder, text, minWidth) {\r\n const Tooltip = document.createElement('div');\r\n Tooltip.id = placeholder;\r\n const desc = document.createElement('div');\r\n desc.style.minWidth = minWidth;\r\n desc.style.marginBottom = '4px';\r\n const div = document.createElement('div');\r\n div.style.textAlign = 'left';\r\n div.textContent = text;\r\n desc.appendChild(div);\r\n Tooltip.appendChild(desc);\r\n SimpleTooltipElements[placeholder] = Tooltip;\r\n}\r\n\r\n/**\r\n * This function enhance the standard tooltips by creating and changing l('tooltip')\r\n * The function is called by .onmouseover events that have replaced original code to use CM.Disp.Tooltip()\r\n * @param\t{string}\ttype\t\t\t\t\tType of tooltip (b, u, s or g)\r\n * @param\t{string}\tname\t\t\t\t\tName of the object/item the tooltip relates to\r\n * @returns {string}\tl('tooltip').innerHTML\tThe HTML of the l('tooltip')-object\r\n */\r\nexport function CreateTooltip(type, name) {\r\n if (type === 'b') {\r\n // Buildings\r\n l('tooltip').innerHTML = Game.Objects[name].tooltip();\r\n // Adds amortization info to the list of info per building\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipAmor === 1) {\r\n const buildPrice = BuildingGetPrice(\r\n name,\r\n Game.Objects[name].basePrice,\r\n 0,\r\n Game.Objects[name].free,\r\n Game.Objects[name].amount,\r\n );\r\n const amortizeAmount = buildPrice - Game.Objects[name].totalCookies;\r\n if (amortizeAmount > 0) {\r\n l('tooltip').innerHTML = l('tooltip')\r\n .innerHTML.split('so far</div>')\r\n .join(\r\n `so far<br/>• <b>${Beautify(amortizeAmount)}</b> ${\r\n Math.floor(amortizeAmount) === 1 ? 'cookie' : 'cookies'\r\n } left to amortize (${\r\n GetTimeColour(\r\n (buildPrice - Game.Objects[name].totalCookies) /\r\n (Game.Objects[name].storedTotalCps * Game.globalCpsMult),\r\n ).text\r\n })</div>`,\r\n );\r\n }\r\n }\r\n if (Game.buyMode === -1) {\r\n /*\r\n * Fix sell price displayed in the object tooltip.\r\n *\r\n * The buildings sell price displayed by the game itself (without any mod) is incorrect.\r\n * The following line of code fixes this issue, and can be safely removed when the game gets fixed.\r\n *\r\n * This issue is extensively detailed here: https://github.com/Aktanusa/CookieMonster/issues/359#issuecomment-735658262\r\n */\r\n l('tooltip').innerHTML = l('tooltip')\r\n .innerHTML.split(Beautify(Game.Objects[name].bulkPrice))\r\n .join(\r\n Beautify(\r\n (Game.Objects[name],\r\n Game.Objects[name].basePrice,\r\n Game.Objects[name].amount,\r\n Game.Objects[name].free,\r\n Game.buyBulk,\r\n 1),\r\n ),\r\n );\r\n }\r\n } else if (type === 'u') {\r\n // Upgrades\r\n if (!Game.UpgradesInStore[name]) return '';\r\n l('tooltip').innerHTML = Game.crateTooltip(Game.UpgradesInStore[name], 'store');\r\n } else if (type === 's') l('tooltip').innerHTML = Game.lumpTooltip();\r\n // Sugar Lumps\r\n else if (type === 'g')\r\n l('tooltip').innerHTML = Game.Objects['Wizard tower'].minigame.spellTooltip(name)();\r\n // Grimoire\r\n else if (type === 'p')\r\n l('tooltip').innerHTML = Game.ObjectsById[2].minigame.tileTooltip(name[0], name[1])();\r\n // Harvest all button in garden\r\n else if (type === 'ha') l('tooltip').innerHTML = Game.ObjectsById[2].minigame.toolTooltip(1)();\r\n else if (type === 'wb') l('tooltip').innerHTML = '';\r\n else if (type === 'pag') l('tooltip').innerHTML = Game.Objects.Temple.minigame.godTooltip(name)();\r\n else if (type === 'pas')\r\n l('tooltip').innerHTML = Game.Objects.Temple.minigame.slotTooltip(name[0])();\r\n\r\n // Adds area for extra tooltip-sections\r\n if (\r\n (type === 'b' && Game.buyMode === 1) ||\r\n type === 'u' ||\r\n type === 's' ||\r\n type === 'g' ||\r\n (type === 'p' && !Game.keys[16]) ||\r\n type === 'ha' ||\r\n type === 'wb' ||\r\n type === 'pag' ||\r\n (type === 'pas' && name[1] !== -1)\r\n ) {\r\n const area = document.createElement('div');\r\n area.id = 'CMTooltipArea';\r\n l('tooltip').appendChild(area);\r\n }\r\n\r\n // Sets global variables used by CM.Disp.UpdateTooltip()\r\n TooltipType = type;\r\n TooltipName = name;\r\n\r\n UpdateTooltips();\r\n\r\n return l('tooltip').innerHTML;\r\n}\r\n","import { CacheSpawnedGoldenShimmer } from '../../Cache/VariablesAndData';\r\nimport { LastGoldenCookieState } from '../../Main/VariablesAndData';\r\n\r\n/**\r\n * This function creates the Favicon, it is called by CM.Main.DelayInit()\r\n */\r\nexport function CreateFavicon() {\r\n const Favicon = document.createElement('link');\r\n Favicon.id = 'CMFavicon';\r\n Favicon.rel = 'shortcut icon';\r\n Favicon.href = 'https://orteil.dashnet.org/cookieclicker/favicon.ico';\r\n document.getElementsByTagName('head')[0].appendChild(Favicon);\r\n}\r\n\r\n/**\r\n * This function updates the Favicon depending on whether a Golden Cookie has spawned\r\n * By relying on CM.Cache.spawnedGoldenShimmer it only changes for non-user spawned cookie\r\n */\r\nexport function UpdateFavicon() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Favicon === 1 &&\r\n LastGoldenCookieState > 0\r\n ) {\r\n if (CacheSpawnedGoldenShimmer.wrath)\r\n l('CMFavicon').href =\r\n 'https://CookieMonsterTeam.github.io/CookieMonster/favicon/wrathCookie.ico';\r\n else\r\n l('CMFavicon').href =\r\n 'https://CookieMonsterTeam.github.io/CookieMonster/favicon/goldenCookie.ico';\r\n } else l('CMFavicon').href = 'https://orteil.dashnet.org/cookieclicker/favicon.ico';\r\n}\r\n","/** Functions used to create static objects of Buildings, Upgrades and Achievements */\r\n\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport { SimAchievements, SimObjects, SimUpgrades } from '../VariablesAndData';\r\nimport InitAchievement from './InitAchievement';\r\nimport InitialBuildingData from './InitialBuildingData';\r\nimport InitUpgrade from './InitUpgrade';\r\n\r\n/**\r\n * This function creates static objects for Buildings, Upgrades and Achievements\r\n */\r\nexport default function InitData() {\r\n // Buildings\r\n SimObjects = [];\r\n Object.keys(Game.Objects).forEach((i) => {\r\n SimObjects[i] = InitialBuildingData(i);\r\n });\r\n\r\n // Upgrades\r\n SimUpgrades = [];\r\n Object.keys(Game.Upgrades).forEach((i) => {\r\n SimUpgrades[i] = InitUpgrade(i);\r\n });\r\n\r\n // Achievements\r\n SimAchievements = [];\r\n Object.keys(Game.Achievements).forEach((i) => {\r\n SimAchievements[i] = InitAchievement(i);\r\n });\r\n CopyData();\r\n}\r\n","import { CreateTooltip } from '../../Disp/Tooltips/Tooltip';\r\nimport { TooltipGrimoireBackup } from '../VariablesAndData';\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of the Grimoire minigame\r\n */\r\nexport default function ReplaceTooltipGrimoire() {\r\n if (Game.Objects['Wizard tower'].minigameLoaded) {\r\n Object.keys(Game.Objects['Wizard tower'].minigame.spellsById).forEach((i) => {\r\n if (l(`grimoireSpell${i}`).onmouseover !== null) {\r\n TooltipGrimoireBackup[i] = l(`grimoireSpell${i}`).onmouseover;\r\n l(`grimoireSpell${i}`).onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('g', `${i}`), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n });\r\n }\r\n}\r\n","import FormatTime from '../../Disp/BeautifyAndFormatting/FormatTime';\r\nimport CalculateGrimoireRefillTime from '../../Disp/HelperFunctions/CalculateGrimoireRefillTime';\r\nimport {\r\n BackupGrimoireDraw,\r\n BackupGrimoireLaunch, // eslint-disable-line no-unused-vars\r\n BackupGrimoireLaunchMod,\r\n HasReplaceNativeGrimoireDraw,\r\n HasReplaceNativeGrimoireLaunch,\r\n} from '../VariablesAndData';\r\nimport ReplaceTooltipGrimoire from './TooltipGrimoire';\r\n\r\n/**\r\n * This function fixes replaces the .draw function of the Grimoire\r\n */\r\nfunction ReplaceNativeGrimoireDraw() {\r\n if (!HasReplaceNativeGrimoireDraw && Game.Objects['Wizard tower'].minigameLoaded) {\r\n const { minigame } = Game.Objects['Wizard tower'];\r\n BackupGrimoireDraw = minigame.draw;\r\n Game.Objects['Wizard tower'].minigame.draw = function () {\r\n BackupGrimoireDraw();\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GrimoireBar === 1 &&\r\n minigame.magic < minigame.magicM &&\r\n Game.drawT % 5 === 0\r\n ) {\r\n minigame.magicBarTextL.innerHTML += ` (${FormatTime(\r\n CalculateGrimoireRefillTime(minigame.magic, minigame.magicM, minigame.magicM),\r\n )})`;\r\n minigame.magicBarL.style.width = '75%'; // TODO: Fix this after Orteil pushes fix to main game;\r\n }\r\n };\r\n HasReplaceNativeGrimoireDraw = true;\r\n }\r\n}\r\n\r\n/**\r\n * This function fixes replaces the .launch function of the Grimoire\r\n */\r\nfunction ReplaceNativeGrimoireLaunch() {\r\n if (!HasReplaceNativeGrimoireLaunch && Game.Objects['Wizard tower'].minigameLoaded) {\r\n const { minigame } = Game.Objects['Wizard tower'];\r\n BackupGrimoireLaunch = minigame.launch;\r\n BackupGrimoireLaunchMod = new Function( // eslint-disable-line no-new-func\r\n `return ${minigame.launch\r\n .toString()\r\n .split('=this')\r\n .join(\"= Game.Objects['Wizard tower'].minigame\")}`,\r\n );\r\n Game.Objects['Wizard tower'].minigame.launch = function () {\r\n BackupGrimoireLaunchMod();\r\n ReplaceTooltipGrimoire();\r\n HasReplaceNativeGrimoireDraw = false;\r\n ReplaceNativeGrimoireDraw();\r\n\r\n HasReplaceNativeGrimoireLaunch = true;\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * This function fixes replaces the Launch and Draw functions of the Grimoire\r\n */\r\nexport default function ReplaceNativeGrimoire() {\r\n ReplaceNativeGrimoireLaunch();\r\n ReplaceNativeGrimoireDraw();\r\n}\r\n","/** Functions related to the Dragon */\r\n\r\nimport Beautify from '../../Disp/BeautifyAndFormatting/Beautify';\r\nimport CopyData from '../../Sim/SimulationData/CopyData';\r\nimport { SimDoSims, SimObjects } from '../../Sim/VariablesAndData';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheCostDragonUpgrade, CacheLastDragonLevel } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This functions caches the current cost of upgrading the dragon level so it can be displayed in the tooltip\r\n */\r\nexport default function CacheDragonCost() {\r\n if (CacheLastDragonLevel !== Game.dragonLevel || SimDoSims) {\r\n if (\r\n Game.dragonLevel < 25 &&\r\n Game.dragonLevels[Game.dragonLevel].buy.toString().includes('sacrifice')\r\n ) {\r\n const objectMatch = Game.dragonLevels[Game.dragonLevel].buy\r\n .toString()\r\n .match(/Objects\\[(.*)\\]/);\r\n let target =\r\n objectMatch !== null ? objectMatch[1] : Game.ObjectsById[Game.dragonLevel - 5].name;\r\n const amount = Game.dragonLevels[Game.dragonLevel].buy\r\n .toString()\r\n .match(/sacrifice\\((.*?)\\)/)[1];\r\n if (target !== 'i') {\r\n target = target.replaceAll(\"'\", '');\r\n if (Game.Objects[target].amount < amount) {\r\n CacheCostDragonUpgrade = 'Not enough buildings to sell';\r\n } else {\r\n let cost = 0;\r\n CopyData();\r\n for (let i = 0; i < amount; i++) {\r\n let price =\r\n SimObjects[target].basePrice *\r\n Game.priceIncrease **\r\n Math.max(0, SimObjects[target].amount - 1 - SimObjects[target].free);\r\n price = Game.modifyBuildingPrice(SimObjects[target], price);\r\n price = Math.ceil(price);\r\n cost += price;\r\n SimObjects[target].amount -= 1;\r\n }\r\n CacheCostDragonUpgrade = `Cost to rebuy: ${Beautify(cost)}`;\r\n }\r\n } else {\r\n let cost = 0;\r\n CopyData();\r\n Object.keys(Game.Objects).forEach((j) => {\r\n target = j;\r\n if (Game.Objects[target].amount < amount) {\r\n CacheCostDragonUpgrade = 'Not enough buildings to sell';\r\n return;\r\n }\r\n for (let i = 0; i < amount; i++) {\r\n let price =\r\n SimObjects[target].basePrice *\r\n Game.priceIncrease **\r\n Math.max(0, SimObjects[target].amount - 1 - SimObjects[target].free);\r\n price = Game.modifyBuildingPrice(SimObjects[target], price);\r\n price = Math.ceil(price);\r\n cost += price;\r\n SimObjects[target].amount -= 1;\r\n }\r\n CacheCostDragonUpgrade = `Cost to rebuy: ${Beautify(cost)}`;\r\n });\r\n }\r\n }\r\n CacheLastDragonLevel = Game.dragonLevel;\r\n }\r\n\r\n FillCMDCache({ CacheLastDragonLevel });\r\n}\r\n","/** Data related to the display titles of certain sections in menu screens */\r\n\r\n/** Display titles of the headers of the Cookie Monster settings section */\r\nexport const ConfigGroups = {\r\n Favourite: 'Favourite Settings',\r\n Calculation: 'Calculation',\r\n Notation: 'Notation',\r\n Colours: 'Colours and colour coding',\r\n BarsDisplay: 'Infobars and visual settings',\r\n Tooltip: 'Tooltips',\r\n Statistics: 'Statistics',\r\n Notification: 'Notifications',\r\n Miscellaneous: 'Miscellaneous',\r\n};\r\n\r\n/** Display titles of the headers of the notification section of the Cookie Monster settings */\r\nexport const ConfigGroupsNotification = {\r\n NotificationGeneral: 'General Notifications',\r\n NotificationGC: 'Golden Cookie',\r\n NotificationFC: 'Fortune Cookie',\r\n NotificationSea: 'Season Special',\r\n NotificationGard: 'Garden Tick',\r\n NotificationMagi: 'Full Magic Bar',\r\n NotificationWrink: 'Wrinkler',\r\n NotificationWrinkMax: 'Maximum Wrinklers',\r\n};\r\n","/**\r\n * This function checks if the user has given permissions for notifications\r\n * It is called by a change in any of the notification options\r\n * Note that most browsers will stop asking if the user has ignored the prompt around 6 times\r\n * @param \t{number}\tToggleOnOff\t\tA number indicating whether the option has been turned off (0) or on (1)\r\n */\r\nfunction CheckNotificationPermissions(ToggleOnOff) {\r\n if (ToggleOnOff === 1) {\r\n // Check if browser support Promise version of Notification Permissions\r\n const checkNotificationPromise = function () {\r\n try {\r\n Notification.requestPermission().then();\r\n } catch (e) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n // Check if the browser supports notifications and which type\r\n if (!('Notification' in window)) {\r\n console.log('This browser does not support notifications.'); // eslint-disable-line no-console\r\n } else if (checkNotificationPromise()) {\r\n Notification.requestPermission().then();\r\n } else {\r\n Notification.requestPermission();\r\n }\r\n }\r\n}\r\n\r\nexport default CheckNotificationPermissions;\r\n","import UpdateBuildings from '../BuildingsUpgrades/Buildings';\r\nimport UpdateUpgrades from '../BuildingsUpgrades/Upgrades';\r\nimport { UpdateBotBar } from '../InfoBars/BottomBar';\r\n\r\n/**\r\n * This function refreshes all numbers after a change in scale-setting\r\n * It is therefore called by a changes in CM.Options.Scale, CM.Options.ScaleDecimals, CM.Options.ScaleSeparator and CM.Options.ScaleCutoff\r\n */\r\nexport default function RefreshScale() {\r\n BeautifyAll();\r\n Game.RefreshStore();\r\n Game.RebuildUpgrades();\r\n\r\n UpdateBotBar();\r\n UpdateBuildings();\r\n UpdateUpgrades();\r\n}\r\n","import { UpdateBotBar } from '../../Disp/InfoBars/BottomBar';\r\nimport { UpdateBotTimerBarPosition } from '../SpecificToggles';\r\n\r\n/**\r\n * This function toggle the bottom bar\r\n * It is called by CM.Disp.UpdateAscendState() and a change in Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar\r\n */\r\nexport default function ToggleBotBar() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1) {\r\n l('CMBotBar').style.display = '';\r\n UpdateBotBar();\r\n } else {\r\n l('CMBotBar').style.display = 'none';\r\n }\r\n UpdateBotTimerBarPosition();\r\n}\r\n","import { settingClasses } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\n\r\nimport CheckNotificationPermissions from '../Config/CheckNotificationPermissions';\r\nimport RefreshScale from '../Disp/HelperFunctions/RefreshScale';\r\nimport { SimDoSims } from '../Sim/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport ToggleBotBar from '../Config/Toggles/ToggleBotBar';\r\nimport ToggleDetailedTime from '../Config/Toggles/ToggleDetailedTime';\r\nimport ToggleGCTimer from '../Config/Toggles/ToggleGCTimer';\r\nimport ToggleSectionHideButtons from '../Config/Toggles/ToggleSectionHideButtons';\r\nimport ToggleToolWarnPos from '../Config/Toggles/ToggleToolWarnPos';\r\nimport ToggleUpgradeBarAndColour from '../Config/Toggles/ToggleUpgradeBarAndColour';\r\nimport ToggleUpgradeBarFixedPos from '../Config/Toggles/ToggleUpgradeBarFixedPos';\r\nimport ToggleWrinklerButtons from '../Config/Toggles/ToggleWrinklerButtons';\r\nimport UpdateBuildings from '../Disp/BuildingsUpgrades/Buildings';\r\nimport { UpdateFavicon } from '../Disp/TabTitle/FavIcon';\r\nimport UpdateUpgradeSectionsHeight from '../Disp/BuildingsUpgrades/UpdateUpgradeSectionsHeight';\r\nimport UpdateUpgrades from '../Disp/BuildingsUpgrades/Upgrades';\r\nimport { ToggleTimerBar, ToggleTimerBarPos } from '../Config/SpecificToggles';\r\n\r\n/** This includes all options of CookieMonster and their relevant data */\r\nconst settings = {\r\n // Calculation\r\n CPSMode: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Calculation',\r\n ['Current cookies per second', 'Average cookies per second'],\r\n 'Calculate times using current cookies per second or average cookies per second',\r\n false,\r\n ),\r\n AvgCPSHist: new settingClasses.SettingStandard(\r\n 3,\r\n 'bool',\r\n 'Calculation',\r\n [\r\n 'Average CPS in past 10s',\r\n 'Average CPS in past 15s',\r\n 'Average CPS in past 30s',\r\n 'Average CPS in past 1m',\r\n 'Average CPS in past 5m',\r\n 'Average CPS in past 10m',\r\n 'Average CPS in past 15m',\r\n 'Average CPS in past 30m',\r\n ],\r\n 'How much time average Cookies Per Second should consider',\r\n false,\r\n ),\r\n AvgClicksHist: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Calculation',\r\n [\r\n 'Average clicks in past 1s',\r\n 'Average clicks in past 5s',\r\n 'Average clicks in past 10s',\r\n 'Average clicks in past 15s',\r\n 'Average clicks in past 30s',\r\n ],\r\n 'How much time average Cookie Clicks should consider',\r\n false,\r\n ),\r\n CalcWrink: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'Calculation',\r\n [\r\n 'Calculate with wrinklers OFF',\r\n 'Calculate with wrinklers ON',\r\n 'Calculate with single fattest wrinkler ON',\r\n ],\r\n 'Calculate times and average Cookies Per Second with (only the single non-shiny fattest) wrinklers',\r\n true,\r\n () => {\r\n SimDoSims = true;\r\n },\r\n ),\r\n\r\n // Notation\r\n Scale: new settingClasses.SettingStandardWithFunc(\r\n 2,\r\n 'bool',\r\n 'Notation',\r\n [\r\n \"Game's setting scale\",\r\n 'Metric',\r\n 'Short scale',\r\n 'Short scale (Abbreviated)',\r\n 'Scientific notation',\r\n 'Engineering notation',\r\n ],\r\n 'Change how long numbers are formatted',\r\n false,\r\n () => {\r\n RefreshScale();\r\n },\r\n ),\r\n ScaleDecimals: new settingClasses.SettingStandardWithFunc(\r\n 2,\r\n 'bool',\r\n 'Notation',\r\n ['1 decimals', '2 decimals', '3 decimals'],\r\n `Set the number of decimals used when applicable. This only works with Cookie Monster scales and not with \"Game's Setting Scale\"`,\r\n false,\r\n () => {\r\n RefreshScale();\r\n },\r\n ),\r\n ScaleSeparator: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'Notation',\r\n ['. for decimals (standard)', '. for thousands'],\r\n 'Set the separator used for decimals and thousands',\r\n false,\r\n () => {\r\n RefreshScale();\r\n },\r\n ),\r\n ScaleCutoff: new settingClasses.SettingInputNumber(\r\n 999999,\r\n 'numscale',\r\n 'Notation',\r\n 'Notation cut-off point: ',\r\n 'The number from which Cookie Monster will start formatting numbers based on chosen scale. Standard is 999,999. Setting this above 999,999,999 might break certain notations',\r\n 1,\r\n 999999999,\r\n ),\r\n TimeFormat: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Notation',\r\n ['Time XXd, XXh, XXm, XXs', 'Time XX:XX:XX:XX:XX', 'Time XXx, XXx'],\r\n 'Change the time format',\r\n false,\r\n ),\r\n DetailedTime: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'Notation',\r\n ['Detailed time OFF', 'Detailed time ON'],\r\n 'Change how time is displayed in certain statistics and tooltips',\r\n true,\r\n () => {\r\n ToggleDetailedTime();\r\n },\r\n ),\r\n PPDisplayTime: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Notation',\r\n ['PP as value (standard)', 'PP as time unit'],\r\n 'Display PP as calculated value or as approximate time unit. Note that PP does not translate directly into a time unit and this is therefore only an approximation.',\r\n false,\r\n ),\r\n\r\n // Colours\r\n BuildColour: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'Colours',\r\n ['Building colours OFF', 'Building colours ON'],\r\n 'Colour code buildings',\r\n true,\r\n () => {\r\n UpdateBuildings();\r\n },\r\n ),\r\n PPOnlyConsiderBuyable: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Colours',\r\n [\"Don't ignore non-buyable\", 'Ignore non-buyable'],\r\n \"Makes Cookie Monster label buildings and upgrades you can't buy right now red, useful in those situations where you just want to spend your full bank 'most optimally'\",\r\n true,\r\n ),\r\n PPExcludeTop: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Colours',\r\n [\r\n \"Don't ignore any\",\r\n 'Ignore 1st best',\r\n 'Ignore 1st and 2nd best',\r\n 'Ignore 1st, 2nd and 3rd best',\r\n ],\r\n 'Makes Cookie Monster ignore the 1st, 2nd or 3rd best buildings in labeling and colouring PP values',\r\n true,\r\n ),\r\n PPRigidelMode: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Colours',\r\n ['Rigidel mode OFF', 'Rigidel mode ON'],\r\n 'Makes Cookie Monster ignore all \"buy 1\" options when colouring PP in order to stay at a total building count ending in 10 for pantheon god Rigidel',\r\n true,\r\n ),\r\n PPSecondsLowerLimit: new settingClasses.SettingInputNumber(\r\n 0,\r\n 'numscale',\r\n 'Colours',\r\n 'Lower limit for PP (in seconds): ',\r\n 'If a building or upgrade costs less than the specified seconds of CPS it will also be considered optimal and label it as such (\"PP is less than xx seconds of CPS\"); setting to 0 ignores this option',\r\n 0,\r\n Infinity,\r\n ),\r\n ColourBlue: new settingClasses.SettingColours(\r\n '#4bb8f0',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is blue. Used to show upgrades better than best PP building, for Click Frenzy bar, and for various labels',\r\n ),\r\n ColourGreen: new settingClasses.SettingColours(\r\n '#00ff00',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is green. Used to show best PP building, for Blood Frenzy bar, and for various labels',\r\n ),\r\n ColourYellow: new settingClasses.SettingColours(\r\n '#ffff00',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is yellow. Used to show buildings within the top 10 of PP, for Frenzy bar, and for various labels',\r\n ),\r\n ColourOrange: new settingClasses.SettingColours(\r\n '#ff7f00',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is orange. Used to show buildings within the top 20 of PP, for Next Reindeer bar, and for various labels',\r\n ),\r\n ColourRed: new settingClasses.SettingColours(\r\n '#ff0000',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is Red. Used to show buildings within the top 30 of PP, for Clot bar, and for various labels',\r\n ),\r\n ColourPurple: new settingClasses.SettingColours(\r\n '#ff00ff',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is purple. Used to show buildings outside of the top 30 of PP, for Next Cookie bar, and for various labels',\r\n ),\r\n ColourGray: new settingClasses.SettingColours(\r\n '#b3b3b3',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is gray. Used to show negative or infinity PP, and for Next Cookie/Next Reindeer bar',\r\n ),\r\n ColourPink: new settingClasses.SettingColours(\r\n '#ff1493',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is pink. Used for Dragonflight bar',\r\n ),\r\n ColourBrown: new settingClasses.SettingColours(\r\n '#8b4513',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is brown. Used for Dragon Harvest bar',\r\n ),\r\n\r\n // BarsDisplay\r\n BotBar: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Bottom bar OFF', 'Bottom bar ON'],\r\n 'Building information',\r\n true,\r\n () => {\r\n ToggleBotBar();\r\n },\r\n ),\r\n TimerBar: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Timer bar OFF', 'Timer bar ON'],\r\n 'Bar with timers for golden cookie, season popup, Frenzy (Normal, Clot, Elder), Click Frenzy',\r\n true,\r\n () => {\r\n ToggleTimerBar();\r\n },\r\n ),\r\n TimerBarPos: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Timer bar position (top left)', 'Timer bar position (bottom)'],\r\n 'Placement of the timer bar',\r\n false,\r\n () => {\r\n ToggleTimerBarPos();\r\n },\r\n ),\r\n TimerBarOverlay: new settingClasses.SettingStandard(\r\n 2,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Timer bar overlay OFF', 'Timer bar overlay only seconds', 'Timer bar overlay full'],\r\n 'Overlay on timers displaying seconds and/or percentage left',\r\n true,\r\n ),\r\n AutosaveTimerBar: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Autosave timer bar OFF', 'Autosave timer bar ON'],\r\n 'Show a timer counting down till next autosave in the timer bar',\r\n true,\r\n ),\r\n UpBarColour: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Upgrade colours/bar OFF', 'Upgrade colours with bar ON', 'Upgrade colours without bar ON'],\r\n 'Colour code upgrades and optionally add a counter bar',\r\n false,\r\n () => {\r\n ToggleUpgradeBarAndColour();\r\n },\r\n ),\r\n UpgradeBarFixedPos: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Upgrade bar fixed position OFF', 'Upgrade bar fixed position ON'],\r\n 'Lock the upgrade bar at top of the screen to prevent it from moving ofscreen when scrolling',\r\n true,\r\n () => {\r\n ToggleUpgradeBarFixedPos();\r\n },\r\n ),\r\n SortBuildings: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n [\r\n 'Sort buildings: default',\r\n 'Sort buildings: PP of x1 purchase',\r\n 'Sort buildings: PP of selected bulk mode',\r\n 'Sort buildings: price until next achievement',\r\n ],\r\n 'Sort the display of buildings in default order, by PP, or until next achievement',\r\n false,\r\n () => {\r\n UpdateBuildings();\r\n },\r\n ),\r\n SortUpgrades: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Sort upgrades: default', 'Sort upgrades: PP'],\r\n 'Sort the display of upgrades in either default order or by PP',\r\n false,\r\n () => {\r\n UpdateUpgrades();\r\n },\r\n ),\r\n UpgradesNeverCollapse: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Upgrades always expanded OFF', 'Upgrades always expanded ON'],\r\n 'Toggle to make the upgrades sections always expanded to the size needed to display all upgrades',\r\n true,\r\n () => {\r\n UpdateUpgradeSectionsHeight();\r\n },\r\n ),\r\n DragonAuraInfo: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Extra dragon aura info OFF', 'Extra dragon aura info ON'],\r\n 'Shows information about changes in CPS and costs in the dragon aura interface.',\r\n true,\r\n ),\r\n GrimoireBar: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Grimoire magic meter timer OFF', 'Grimoire magic meter timer ON'],\r\n 'A timer overlay showing how long till the Grimoire magic meter is full',\r\n true,\r\n ),\r\n GCTimer: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Golden cookie timer OFF', 'Golden cookie timer ON'],\r\n 'A timer on the golden cookie when it has been spawned',\r\n true,\r\n () => {\r\n ToggleGCTimer();\r\n },\r\n ),\r\n Favicon: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Favicon OFF', 'Favicon ON'],\r\n 'Update favicon with golden/wrath cookie',\r\n true,\r\n () => {\r\n UpdateFavicon();\r\n },\r\n ),\r\n WrinklerButtons: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Extra wrinkler buttons OFF', 'Extra wrinkler buttons ON'],\r\n 'Show buttons for popping wrinklers at bottom of cookie section',\r\n true,\r\n () => {\r\n ToggleWrinklerButtons();\r\n },\r\n ),\r\n HideSectionsButtons: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Hide buildings/upgrades button OFF', 'Hide buildings/upgrades button ON'],\r\n 'Show buttons for hiding and showing the buildings and upgrades sections in the right column',\r\n true,\r\n () => {\r\n ToggleSectionHideButtons();\r\n },\r\n ),\r\n\r\n // Tooltip\r\n TooltipBuildUpgrade: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Building/upgrade tooltip information OFF', 'Building/upgrade tooltip information ON'],\r\n 'Extra information in building/upgrade tooltips',\r\n true,\r\n ),\r\n TooltipAmor: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Tooltip',\r\n [\r\n 'Buildings tooltip amortization information OFF',\r\n 'Buildings tooltip amortization information ON',\r\n ],\r\n 'Add amortization information to buildings tooltip',\r\n true,\r\n ),\r\n ToolWarnLucky: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip lucky warning OFF', 'Tooltip lucky warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for max \"Lucky!\" rewards',\r\n true,\r\n ),\r\n ToolWarnLuckyFrenzy: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip lucky frenzy warning OFF', 'Tooltip lucky frenzy warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for max \"Lucky!\" (Frenzy) rewards',\r\n true,\r\n ),\r\n ToolWarnConjure: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip conjure warning OFF', 'Tooltip conjure warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for max \"Conjure Baked Goods\" rewards',\r\n true,\r\n ),\r\n ToolWarnConjureFrenzy: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip conjure frenzy warning OFF', 'Tooltip conjure frenzy warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for max \"Conjure Baked Goods\" rewards with Frenzy active',\r\n true,\r\n ),\r\n ToolWarnEdifice: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip edifice warning OFF', 'Tooltip edifice warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for \"Spontaneous Edifice\" to possibly give you your most expensive building',\r\n true,\r\n ),\r\n ToolWarnUser: new settingClasses.SettingInputNumber(\r\n 0,\r\n 'numscale',\r\n 'Tooltip',\r\n 'Tooltip warning at x times CPS: ',\r\n 'Use this to show a customized warning if buying it will put the bank under the amount equal to value times cps; setting to 0 disables the function altogether',\r\n 0,\r\n Infinity,\r\n ),\r\n ToolWarnBon: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Calculate tooltip warning with bonus CPS OFF', 'Calculate tooltip warning with bonus CPS ON'],\r\n 'Calculate the warning with or without the bonus CPS you get from buying',\r\n true,\r\n ),\r\n ToolWarnPos: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip warning position (left)', 'Tooltip warning position (bottom)'],\r\n 'Placement of the warning boxes',\r\n false,\r\n () => {\r\n ToggleToolWarnPos();\r\n },\r\n ),\r\n TooltipGrim: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Grimoire tooltip information OFF', 'Grimoire tooltip information ON'],\r\n 'Extra information in tooltip for grimoire',\r\n true,\r\n ),\r\n TooltipWrink: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Wrinkler tooltip OFF', 'Wrinkler tooltip ON'],\r\n 'Shows the amount of cookies a wrinkler will give when popping it',\r\n true,\r\n ),\r\n TooltipLump: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Sugar lump tooltip OFF', 'Sugar lump tooltip ON'],\r\n 'Shows the current Sugar Lump type in Sugar lump tooltip.',\r\n true,\r\n ),\r\n TooltipPlots: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Garden plots tooltip OFF', 'Garden plots tooltip ON'],\r\n 'Shows a tooltip for plants that have a cookie reward.',\r\n true,\r\n ),\r\n TooltipPantheon: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Pantheon tooltip OFF', 'Pantheon tooltip ON'],\r\n 'Shows additional info in the pantheon tooltip',\r\n true,\r\n ),\r\n TooltipAscendButton: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Show Extra Info Ascend Tooltip OFF', 'Show Extra Info Ascend Tooltip ON'],\r\n 'Shows additional info in the ascend tooltip',\r\n true,\r\n ),\r\n\r\n // Statistics\r\n Stats: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Statistics',\r\n ['Statistics OFF', 'Statistics ON'],\r\n 'Extra Cookie Monster statistics!',\r\n true,\r\n ),\r\n MissingUpgrades: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Statistics',\r\n ['Missing upgrades OFF', 'Missing upgrades ON'],\r\n 'Shows missing upgrades in statistics menu',\r\n true,\r\n ),\r\n MissingAchievements: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Statistics',\r\n ['Missing Achievements OFF', 'Missing Normal Achievements ON'],\r\n 'Shows missing normal achievements in statistics menu.',\r\n true,\r\n ),\r\n UpStats: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Statistics',\r\n ['Statistics update rate (default)', 'Statistics update rate (1s)'],\r\n 'Default rate is once every 5 seconds',\r\n false,\r\n ),\r\n HeavenlyChipsTarget: new settingClasses.SettingInputNumber(\r\n 1,\r\n 'numscale',\r\n 'Statistics',\r\n 'Heavenly chips target: ',\r\n 'Use this to set a heavenly chips target that will be counted towards in the \"prestige\" statsistics sections',\r\n 1,\r\n Infinity,\r\n ),\r\n ShowMissedGC: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Statistics',\r\n ['Missed GC OFF', 'Missed GC ON'],\r\n 'Show a stat in the statistics screen that counts how many golden cookies you have missed',\r\n true,\r\n ),\r\n\r\n // Notification\r\n Title: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGeneral',\r\n ['Title OFF', 'Title ON', 'Title pinned tab highlight'],\r\n 'Update title with colden cookie/season popup timers; pinned tab highlight only changes the title when a golden cookie/season popup spawns; \"!\" means that golden cookie/reindeer can spawn',\r\n true,\r\n ),\r\n GeneralSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGeneral',\r\n ['Consider game volume setting OFF', 'Consider game volume setting ON'],\r\n 'Turning this toggle to \"off\" makes Cookie Monster no longer consider the volume setting of the base game, allowing mod notifications to play with base game volume turned down',\r\n true,\r\n ),\r\n GCNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationGC',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when golden cookie spawns',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCNotification,\r\n );\r\n },\r\n ),\r\n GCFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGC',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen on golden cookie',\r\n true,\r\n ),\r\n ColourGCFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationGC',\r\n 'The colour of the GC flash, standard colour is white',\r\n ),\r\n GCSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGC',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound on golden cookie',\r\n true,\r\n ),\r\n GCVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationGC', [], 'Volume'),\r\n GCSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/66/66717_931655-lq.mp3',\r\n 'url',\r\n 'NotificationGC',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when a golden cookie spawns',\r\n ),\r\n FortuneNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationFC',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when fortune cookie is on the ticker',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FortuneNotification,\r\n );\r\n },\r\n ),\r\n FortuneFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationFC',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen on fortune cookie spawn',\r\n true,\r\n ),\r\n ColourFortuneFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationFC',\r\n 'The colour of the fortune flash, standard colour is white',\r\n ),\r\n FortuneSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationFC',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound on fortune cookie spawn',\r\n true,\r\n ),\r\n FortuneVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationFC', [], 'Volume'),\r\n FortuneSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/174/174027_3242494-lq.mp3',\r\n 'url',\r\n 'NotificationFC',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when the ticker has a fortune cookie',\r\n ),\r\n SeaNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationSea',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification on season popup',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SeaNotification,\r\n );\r\n },\r\n ),\r\n SeaFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationSea',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen on season popup',\r\n true,\r\n ),\r\n ColourSeaFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationSea',\r\n 'The colour of the season popup flash, standard colour is white',\r\n ),\r\n SeaSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationSea',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound on season popup',\r\n true,\r\n ),\r\n SeaVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationSea', [], 'Volume'),\r\n SeaSoundURL: new settingClasses.SettingStandard(\r\n 'https://www.freesound.org/data/previews/121/121099_2193266-lq.mp3',\r\n 'url',\r\n 'NotificationSea',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when on season popup spawns',\r\n ),\r\n GardFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGard',\r\n ['Garden Tick Flash OFF', 'Flash ON'],\r\n 'Flash screen on garden tick',\r\n true,\r\n ),\r\n ColourGardFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationGard',\r\n 'The colour of the garden flash, standard colour is white',\r\n ),\r\n GardSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGard',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound on garden tick',\r\n true,\r\n ),\r\n GardVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationGard', [], 'Volume'),\r\n GardSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/103/103046_861714-lq.mp3',\r\n 'url',\r\n 'NotificationGard',\r\n 'Garden Tick Sound URL:',\r\n 'URL of the sound to be played when the garden ticks',\r\n ),\r\n MagicNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationMagi',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when magic reaches maximum',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MagicNotification,\r\n );\r\n },\r\n ),\r\n MagicFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationMagi',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen when magic reaches maximum',\r\n true,\r\n ),\r\n ColourMagicFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationMagi',\r\n 'The colour of the magic flash, standard colour is white',\r\n ),\r\n MagicSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationMagi',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound when magic reaches maximum',\r\n true,\r\n ),\r\n MagicVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationMagi', [], 'Volume'),\r\n MagicSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/221/221683_1015240-lq.mp3',\r\n 'url',\r\n 'NotificationMagi',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when magic reaches maxium',\r\n ),\r\n WrinklerNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationWrink',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when a wrinkler appears',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerNotification,\r\n );\r\n },\r\n ),\r\n WrinklerFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationWrink',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen when a wrinkler appears',\r\n true,\r\n ),\r\n ColourWrinklerFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationWrink',\r\n 'The colour of the wrinkler flash, standard colour is white',\r\n ),\r\n WrinklerSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationWrink',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound when a wrinkler appears',\r\n true,\r\n ),\r\n WrinklerVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationWrink', [], 'Volume'),\r\n WrinklerSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/124/124186_8043-lq.mp3',\r\n 'url',\r\n 'NotificationWrink',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when a wrinkler appears',\r\n ),\r\n WrinklerMaxNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationWrinkMax',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when the maximum amount of wrinklers has appeared',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxNotification,\r\n );\r\n },\r\n ),\r\n WrinklerMaxFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationWrinkMax',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen when the maximum amount of Wrinklers has appeared',\r\n true,\r\n ),\r\n ColourWrinklerMaxFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationWrinkMax',\r\n 'The colour of the maximum wrinkler flash, standard colour is white',\r\n ),\r\n WrinklerMaxSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationWrinkMax',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound when the maximum amount of wrinklers has appeared',\r\n true,\r\n ),\r\n WrinklerMaxVolume: new settingClasses.SettingVolume(\r\n 100,\r\n 'vol',\r\n 'NotificationWrinkMax',\r\n [],\r\n 'Volume',\r\n ),\r\n WrinklerMaxSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/152/152743_15663-lq.mp3',\r\n 'url',\r\n 'NotificationWrinkMax',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when the maximum amount of wrinklers has appeared',\r\n ),\r\n\r\n // Miscellaneous\r\n BulkBuyBlock: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Miscellaneous',\r\n ['Block bulk buying OFF', 'Block bulk buying ON'],\r\n \"Block clicking bulk buying when you can't buy all. This prevents buying 7 of a building when you are in buy-10 or buy-100 mode.\",\r\n true,\r\n ),\r\n FavouriteSettings: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'Miscellaneous',\r\n [\r\n 'Favourite settings section OFF',\r\n 'Favourite settings section ON',\r\n 'Favourite settings section ON (Locked)',\r\n ],\r\n \"Show stars before each setting which allows selecting it for a 'favourites' section at the top of the Cookie Monster settings. Setting this to Locked removes the stars but shows the 'favourites' section\",\r\n true,\r\n () => {\r\n Game.UpdateMenu();\r\n },\r\n ),\r\n};\r\n\r\nexport default settings;\r\n","import { CMSayTime } from '../../Disp/VariablesAndData';\r\nimport { BackupFunctions } from '../../Main/VariablesAndData';\r\n\r\n/**\r\n * This function changes some of the time-displays in the game to be more detailed\r\n * It is called by a change in CM.Options.DetailedTime\r\n */\r\nexport default function ToggleDetailedTime() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.DetailedTime === 1)\r\n Game.sayTime = CMSayTime;\r\n else Game.sayTime = BackupFunctions.sayTime;\r\n}\r\n","import UpdateUpgrades from '../../Disp/BuildingsUpgrades/Upgrades';\r\n\r\n/**\r\n * This function toggles the upgrade bar and the colours of upgrades\r\n * It is called by a change in CM.Options.UpBarColour\r\n */\r\nexport default function ToggleUpgradeBarAndColour() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour === 1) {\r\n // Colours and bar on\r\n l('CMUpgradeBar').style.display = '';\r\n UpdateUpgrades();\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour === 2\r\n ) {\r\n // Colours on and bar off\r\n l('CMUpgradeBar').style.display = 'none';\r\n UpdateUpgrades();\r\n } else {\r\n // Colours and bar off\r\n l('CMUpgradeBar').style.display = 'none';\r\n Game.RebuildUpgrades();\r\n }\r\n}\r\n","/**\r\n * This function toggles the position of the upgrade bar from fixed or non-fixed mode\r\n * It is called by a change in CM.Options.UpgradeBarFixedPos\r\n */\r\nexport default function ToggleUpgradeBarFixedPos() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpgradeBarFixedPos === 1\r\n ) {\r\n // Fix to top of screen when scrolling\r\n l('CMUpgradeBar').style.position = 'sticky';\r\n l('CMUpgradeBar').style.top = '0px';\r\n } else {\r\n l('CMUpgradeBar').style.position = ''; // Possible to scroll offscreen\r\n }\r\n}\r\n","import { CacheGoldenShimmersByID } from '../../Cache/VariablesAndData';\r\nimport { GCTimers } from '../../Disp/VariablesAndData';\r\n\r\n/**\r\n * This function toggles GC Timers are visible\r\n * It is called by a change in CM.Options.GCTimer\r\n */\r\nexport default function ToggleGCTimer() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer === 1) {\r\n Object.keys(GCTimers).forEach((i) => {\r\n GCTimers[i].style.display = 'block';\r\n GCTimers[i].style.left = CacheGoldenShimmersByID[i].l.style.left;\r\n GCTimers[i].style.top = CacheGoldenShimmersByID[i].l.style.top;\r\n });\r\n } else {\r\n // eslint-disable-next-line no-return-assign\r\n Object.keys(GCTimers).forEach((i) => (GCTimers[i].style.display = 'none'));\r\n }\r\n}\r\n","/**\r\n * This function updates the display setting of the two objects created by CM.Disp.CreateWrinklerButtons()\r\n * It is called by changes in CM.Options.WrinklerButtons\r\n */\r\nexport default function ToggleSectionHideButtons() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.HideSectionsButtons) {\r\n l('CMSectionHidButtons').style.display = '';\r\n } else {\r\n l('CMSectionHidButtons').style.display = 'none';\r\n }\r\n}\r\n","import UpdateBuildings from '../BuildingsUpgrades/Buildings';\r\nimport {\r\n ColourBackPre,\r\n ColourBorderPre,\r\n ColoursOrdering,\r\n ColourTextPre,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function changes/refreshes colours if the user has set new standard colours\r\n * The function is therefore called by a change in CM.Options.Colours\r\n */\r\nexport default function UpdateColours() {\r\n let str = '';\r\n for (let i = 0; i < ColoursOrdering.length; i++) {\r\n str += `.${ColourTextPre}${ColoursOrdering[i]} { color: ${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[\r\n `Colour${ColoursOrdering[i]}`\r\n ]\r\n }; }\\n`;\r\n }\r\n for (let i = 0; i < ColoursOrdering.length; i++) {\r\n str += `.${ColourBackPre}${ColoursOrdering[i]} { background-color: ${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[\r\n `Colour${ColoursOrdering[i]}`\r\n ]\r\n }; }\\n`;\r\n }\r\n for (let i = 0; i < ColoursOrdering.length; i++) {\r\n str += `.${ColourBorderPre}${ColoursOrdering[i]} { border: 1px solid ${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[\r\n `Colour${ColoursOrdering[i]}`\r\n ]\r\n }; }\\n`;\r\n }\r\n l('CMCSS').textContent = str;\r\n UpdateBuildings(); // Class has been already set\r\n}\r\n","import { menuFunctions as mF } from '@cookiemonsterteam/cookiemonsterframework';\r\nimport { ConfigGroups, ConfigGroupsNotification } from '../../Data/Sectionheaders';\r\nimport settings from '../../Data/settings';\r\nimport UpdateColours from '../HelperFunctions/UpdateColours';\r\nimport RefreshScale from '../HelperFunctions/RefreshScale';\r\n\r\n/**\r\n * Creates the <div> to be added to the Options section\r\n * @returns {object} menuDiv\tObject of the <div> of Cookie Monster in options tab\r\n */\r\nexport default function createMenuOptions() {\r\n const menuDiv = mF.createModMenuSection('cookieMonsterMod', 'Cookie Monster', 'optionsMenu');\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.optionsMenu) {\r\n Object.keys(ConfigGroups).forEach((group) => {\r\n if (group === 'Favourite') {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings.length !==\r\n 0 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FavouriteSettings > 0\r\n ) {\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsSubHeader('cookieMonsterMod', group, ConfigGroups[group]),\r\n );\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[group])\r\n for (\r\n let index = 0;\r\n index <\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings.length;\r\n index++\r\n ) {\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsListing(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings[\r\n index\r\n ],\r\n settings,\r\n UpdateColours,\r\n RefreshScale,\r\n ),\r\n );\r\n }\r\n }\r\n } else {\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsSubHeader('cookieMonsterMod', group, ConfigGroups[group]),\r\n );\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[group]) {\r\n // 0 is show, 1 is collapsed\r\n // Make sub-sections of Notification section\r\n if (group === 'Notification') {\r\n Object.keys(ConfigGroupsNotification).forEach((subGroup) => {\r\n const subGroupObject = mF.listings.createOptionsSubHeader(\r\n 'cookieMonsterMod',\r\n subGroup,\r\n ConfigGroupsNotification[subGroup],\r\n );\r\n subGroupObject.style.fontSize = '15px';\r\n subGroupObject.style.opacity = '0.5';\r\n menuDiv.appendChild(subGroupObject);\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[subGroup]) {\r\n Object.keys(settings).forEach((option) => {\r\n if (settings[option].group === subGroup)\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsListing(\r\n 'cookieMonsterMod',\r\n option,\r\n settings,\r\n UpdateColours,\r\n RefreshScale,\r\n ),\r\n );\r\n });\r\n }\r\n });\r\n } else {\r\n Object.keys(settings).forEach((option) => {\r\n if (settings[option].group === group)\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsListing(\r\n 'cookieMonsterMod',\r\n option,\r\n settings,\r\n UpdateColours,\r\n RefreshScale,\r\n ),\r\n );\r\n });\r\n }\r\n }\r\n }\r\n });\r\n }\r\n return menuDiv;\r\n}\r\n","const SPECIAL_DIGIT = 7;\r\n\r\n/**\r\n * Count the number of 7s in any number\r\n * @param\t{number}\tnumber\tThe number to count sevens for\r\n * @returns\t{number}\tThe number of 7s in the provided number\r\n */\r\nexport function CountSevens(number) {\r\n return String(number).split(String(SPECIAL_DIGIT)).length - 1;\r\n}\r\n\r\n/**\r\n * Calculate the delta for the next number where the given digit is a 7\r\n * @param\t{number}\tnumber\t\t\tThe starting number to calculate the delta for\r\n * @param\t{number}\tdigitPlace\t1 for ones place, 10 for tens place, 100 for hundreds place, etc\r\n * @returns\t{number}\tThe calculated delta\r\n */\r\nexport function CalculateSevenDelta(number, digitPlace) {\r\n const target = SPECIAL_DIGIT * digitPlace;\r\n const modulus = digitPlace * 10;\r\n\r\n let delta = target - (number % modulus) + (number % digitPlace);\r\n if (delta < 0) delta += modulus;\r\n\r\n return delta;\r\n}\r\n\r\n/**\r\n * This function calculates each of the next \"lucky\" prestige levels\r\n * @param\t{number}\tcurrentLevel\tThe user's prestige level, including levels earned since the last ascension\r\n * @returns\t{{number}, {number}, {number}}\tluckyDigit, luckyNumber, luckyPayout\tThe next eligible level for each upgrade\r\n */\r\nexport default function CalculateLuckyLevels(currentLevel) {\r\n const result = {};\r\n let sevenCount = CountSevens(currentLevel);\r\n const numberOfDigits = String(currentLevel).length;\r\n\r\n if (sevenCount >= 1) {\r\n result.luckyDigit = currentLevel;\r\n if (sevenCount >= 2) {\r\n result.luckyNumber = currentLevel;\r\n if (sevenCount >= 4) {\r\n result.luckyPayout = currentLevel;\r\n return result;\r\n }\r\n }\r\n }\r\n\r\n // Consider only top 15 digits if it is big number\r\n let localLevel;\r\n if (numberOfDigits >= 16) {\r\n localLevel = Math.ceil(currentLevel / (10 ** (numberOfDigits - 15)));\r\n } else {\r\n localLevel = currentLevel;\r\n }\r\n sevenCount = CountSevens(localLevel);\r\n\r\n if (result.luckyDigit === undefined) {\r\n if (sevenCount < 1) {\r\n const delta = CalculateSevenDelta(localLevel, 1);\r\n\r\n localLevel += delta;\r\n sevenCount = CountSevens(localLevel);\r\n }\r\n\r\n result.luckyDigit = localLevel;\r\n if (numberOfDigits >= 16) {\r\n result.luckyDigit *= 10 ** Number((numberOfDigits - 15));\r\n }\r\n }\r\n\r\n if (result.luckyNumber === undefined) {\r\n while (sevenCount < 2) {\r\n let delta = CalculateSevenDelta(localLevel, 1);\r\n if (delta === 0) delta = CalculateSevenDelta(localLevel, 10);\r\n\r\n localLevel += delta;\r\n sevenCount = CountSevens(localLevel);\r\n }\r\n\r\n result.luckyNumber = localLevel;\r\n if (numberOfDigits >= 16) {\r\n result.luckyNumber *= 10 ** Number((numberOfDigits - 15));\r\n }\r\n }\r\n\r\n let digitPlace = 1;\r\n while (sevenCount < 4) {\r\n const delta = CalculateSevenDelta(localLevel, digitPlace);\r\n if (delta === 0) {\r\n digitPlace *= 10;\r\n } else {\r\n localLevel += delta;\r\n sevenCount = CountSevens(localLevel);\r\n }\r\n }\r\n\r\n result.luckyPayout = localLevel;\r\n if (numberOfDigits >= 16) {\r\n result.luckyPayout *= 10 ** Number((numberOfDigits - 15));\r\n }\r\n\r\n return result;\r\n}\r\n","/** Section: Functions related to the creation of basic DOM elements page */\r\n\r\nimport { ToggleHeader } from '../../../Config/ToggleSetting';\r\n\r\nimport { SimpleTooltipElements } from '../../VariablesAndData';\r\n\r\n/**\r\n * This function creates a header-object for the stats page\r\n * It is called by CM.Disp.AddMenuStats()\r\n * @param \t{string}\t\tconfig\tThe name of the Config-group\r\n * @param \t{string}\t\ttext\tThe to-be displayed name of the header\r\n * @returns\t{object}\t\tdiv\t\tThe header object\r\n */\r\nexport function StatsHeader(text, config) {\r\n const div = document.createElement('div');\r\n div.className = 'title';\r\n div.style.padding = '0px 16px';\r\n div.style.opacity = '0.7';\r\n div.style.fontSize = '17px';\r\n div.style.fontFamily = '\"Kavoon\", Georgia, serif';\r\n div.appendChild(document.createTextNode(`${text} `));\r\n const span = document.createElement('span');\r\n span.style.cursor = 'pointer';\r\n span.style.display = 'inline-block';\r\n span.style.height = '14px';\r\n span.style.width = '14px';\r\n span.style.borderRadius = '7px';\r\n span.style.textAlign = 'center';\r\n span.style.backgroundColor = '#C0C0C0';\r\n span.style.color = 'black';\r\n span.style.fontSize = '13px';\r\n span.style.verticalAlign = 'middle';\r\n span.textContent = Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[config]\r\n ? '-'\r\n : '+';\r\n span.onclick = function () {\r\n ToggleHeader(config);\r\n Game.UpdateMenu();\r\n };\r\n div.appendChild(span);\r\n return div;\r\n}\r\n\r\n/**\r\n * This function creates an stats-listing-object for the stats page\r\n * It is called by CM.Disp.AddMenuStats()\r\n * @param \t{string}\t\ttype\t\tThe type fo the listing\r\n * @param \t{string}\t\tname\t\tThe name of the option\r\n * @param \t{object}\t\ttext\t\tThe text-object of the option\r\n * @param \t{string}\t\tplaceholder\tThe id of the to-be displayed tooltip if applicable\r\n * @returns\t{object}\t\tdiv\t\t\tThe option object\r\n */\r\nexport function StatsListing(type, name, text, placeholder) {\r\n const div = document.createElement('div');\r\n div.className = 'listing';\r\n\r\n const listingName = document.createElement('b');\r\n listingName.textContent = name;\r\n div.appendChild(listingName);\r\n if (type === 'withTooltip') {\r\n div.className = 'listing';\r\n div.appendChild(document.createTextNode(' '));\r\n\r\n const tooltip = document.createElement('span');\r\n tooltip.onmouseout = function () {\r\n Game.tooltip.hide();\r\n };\r\n tooltip.onmouseover = function () {\r\n Game.tooltip.draw(this, escape(SimpleTooltipElements[placeholder].innerHTML));\r\n };\r\n tooltip.style.cursor = 'default';\r\n tooltip.style.display = 'inline-block';\r\n tooltip.style.height = '10px';\r\n tooltip.style.width = '10px';\r\n tooltip.style.borderRadius = '5px';\r\n tooltip.style.textAlign = 'center';\r\n tooltip.style.backgroundColor = '#C0C0C0';\r\n tooltip.style.color = 'black';\r\n tooltip.style.fontSize = '9px';\r\n tooltip.style.verticalAlign = 'bottom';\r\n tooltip.textContent = '?';\r\n div.appendChild(tooltip);\r\n }\r\n div.appendChild(document.createTextNode(': '));\r\n div.appendChild(text);\r\n return div;\r\n}\r\n\r\n/**\r\n * This function creates an stats-listing-object for the stats page for missing items displays\r\n * It is called by CM.Disp.AddMenuStats()\r\n * @param \t{string}\t\ttype\t\tThe type fo the listing\r\n * @param \t{string}\t\tname\t\tThe name of the option\r\n * @param \t{object}\t\ttext\t\tThe text-object of the option\r\n * @param \t{bool}\t\t current Whether the season of the item is the current season\r\n * @returns\t{object}\t\tdiv\t\t\tThe option object\r\n */\r\nexport function StatsMissDispListing(type, name, text, current) {\r\n const div = document.createElement('div');\r\n div.className = 'listing';\r\n\r\n const listingName = document.createElement('b');\r\n listingName.textContent = name;\r\n if (current === true)\r\n listingName.style.color =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ColourGreen;\r\n div.appendChild(listingName);\r\n div.appendChild(document.createTextNode(': '));\r\n div.appendChild(text);\r\n return div;\r\n}\r\n\r\n/**\r\n * This function creates a tooltip containing all missing holiday items contained in the list theMissDisp\r\n * @param \t{list}\t\t\ttheMissDisp\t\tA list of the missing holiday items\r\n * @returns\t{object}\t\tfrag\t\t\tThe tooltip object\r\n */\r\nexport function StatsMissDisp(theMissDisp) {\r\n const frag = document.createDocumentFragment();\r\n frag.appendChild(document.createTextNode(`${theMissDisp.length} `));\r\n const span = document.createElement('span');\r\n span.onmouseout = function () {\r\n Game.tooltip.hide();\r\n };\r\n const placeholder = document.createElement('div');\r\n const missing = document.createElement('div');\r\n missing.style.minWidth = '140px';\r\n missing.style.marginBottom = '4px';\r\n const title = document.createElement('div');\r\n title.className = 'name';\r\n title.style.marginBottom = '4px';\r\n title.style.textAlign = 'center';\r\n title.textContent = 'Missing';\r\n missing.appendChild(title);\r\n Object.keys(theMissDisp).forEach((i) => {\r\n const div = document.createElement('div');\r\n div.style.textAlign = 'center';\r\n div.appendChild(document.createTextNode(theMissDisp[i]));\r\n missing.appendChild(div);\r\n });\r\n placeholder.appendChild(missing);\r\n span.onmouseover = function () {\r\n Game.tooltip.draw(this, escape(placeholder.innerHTML));\r\n };\r\n span.style.cursor = 'default';\r\n span.style.display = 'inline-block';\r\n span.style.height = '10px';\r\n span.style.width = '10px';\r\n span.style.borderRadius = '5px';\r\n span.style.textAlign = 'center';\r\n span.style.backgroundColor = '#C0C0C0';\r\n span.style.color = 'black';\r\n span.style.fontSize = '9px';\r\n span.style.verticalAlign = 'bottom';\r\n span.textContent = '?';\r\n frag.appendChild(span);\r\n return frag;\r\n}\r\n","import { saveAndLoadingFunctions } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\n\r\n/** Functions related to toggling or changing an individual setting */\r\n\r\n/** Used to name certain DOM or outside facing elements and refer to them */\r\nexport const ConfigPrefix = 'CMConfig';\r\n\r\n/**\r\n * This function toggles header options by incrementing them with 1 and handling changes\r\n * It is called by the onclick event of the +/- next to headers\r\n * @param \t{string}\tconfig\tThe name of the header\r\n */\r\nexport function ToggleHeader(config) {\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[config] += 1;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[config] > 1)\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[config] = 0;\r\n saveAndLoadingFunctions.saveFramework();\r\n}\r\n","/** Main function to create the sections of Cookie Monster on the Statistics page */\r\n\r\nimport { AddMissingUpgrades } from './CreateMissingUpgrades';\r\nimport * as CreateSections from './CreateStatsSections';\r\nimport * as CreateElements from './CreateDOMElements';\r\nimport * as GameData from '../../../Data/Gamedata';\r\n\r\nimport {\r\n CacheAverageClicks,\r\n CacheAverageCookiesFromClicks,\r\n CacheObjectsNextAchievement,\r\n CacheWrinklersFattest,\r\n CacheWrinklersNormal,\r\n CacheWrinklersTotal,\r\n} from '../../../Cache/VariablesAndData';\r\nimport PopAllNormalWrinklers from '../../HelperFunctions/PopWrinklers';\r\nimport { ClickTimes, CookieTimes } from '../../VariablesAndData';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport AddMissingAchievements from './CreateMissingAchievements';\r\n\r\n/**\r\n * This function adds stats created by CookieMonster to the stats page\r\n * It is called by CM.Disp.AddMenu\r\n * @param {object} title\tOn object that includes the title of the menu\r\n */\r\nexport default function AddMenuStats(title) {\r\n const stats = document.createElement('div');\r\n stats.className = 'subsection';\r\n stats.appendChild(title);\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Lucky Cookies', 'Lucky'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Lucky) {\r\n stats.appendChild(CreateSections.LuckySection());\r\n }\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Chain Cookies', 'Chain'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Chain) {\r\n stats.appendChild(CreateSections.ChainSection());\r\n }\r\n\r\n if (Game.Objects['Wizard tower'].minigameLoaded) {\r\n stats.appendChild(CreateElements.StatsHeader('Spells', 'Spells'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Spells) {\r\n stats.appendChild(CreateSections.SpellsSection());\r\n }\r\n }\r\n\r\n if (Game.Objects.Farm.minigameLoaded) {\r\n stats.appendChild(CreateElements.StatsHeader('Garden', 'Garden'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Garden) {\r\n stats.appendChild(CreateSections.GardenSection());\r\n }\r\n }\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Prestige', 'Prestige'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Prestige) {\r\n stats.appendChild(CreateSections.PrestigeSection());\r\n }\r\n\r\n if (Game.cpsSucked > 0) {\r\n stats.appendChild(CreateElements.StatsHeader('Wrinklers', 'Wrink'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Wrink) {\r\n const popAllFrag = document.createDocumentFragment();\r\n popAllFrag.appendChild(\r\n document.createTextNode(\r\n `${Beautify(CacheWrinklersTotal)} / ${Beautify(CacheWrinklersNormal)} `,\r\n ),\r\n );\r\n const popAllA = document.createElement('a');\r\n popAllA.textContent = 'Pop All Normal';\r\n popAllA.className = 'option';\r\n popAllA.onclick = function () {\r\n PopAllNormalWrinklers();\r\n };\r\n popAllFrag.appendChild(popAllA);\r\n stats.appendChild(\r\n CreateElements.StatsListing('basic', 'Rewards of Popping (All/Normal)', popAllFrag),\r\n );\r\n const popFattestFrag = document.createDocumentFragment();\r\n popFattestFrag.appendChild(document.createTextNode(`${Beautify(CacheWrinklersFattest[0])} `));\r\n const popFattestA = document.createElement('a');\r\n popFattestA.textContent = 'Pop Single Fattest';\r\n popFattestA.className = 'option';\r\n popFattestA.onclick = function () {\r\n if (CacheWrinklersFattest[1] !== null) Game.wrinklers[CacheWrinklersFattest[1]].hp = 0;\r\n };\r\n popFattestFrag.appendChild(popFattestA);\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n `Rewards of Popping Single Fattest Non-Shiny Wrinkler (id: ${\r\n CacheWrinklersFattest[1] !== null ? CacheWrinklersFattest[1] : 'None'\r\n })`,\r\n popFattestFrag,\r\n ),\r\n );\r\n }\r\n }\r\n\r\n stats.appendChild(CreateSections.SeasonSection());\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Achievements', 'Achievs'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Achievs) {\r\n Object.keys(Game.Objects).forEach((i) => {\r\n const ObjectsTillNext = CacheObjectsNextAchievement[i];\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n i,\r\n ObjectsTillNext.AmountNeeded < 101\r\n ? document.createTextNode(\r\n `Next achievement in ${ObjectsTillNext.AmountNeeded}, price: ${Beautify(\r\n ObjectsTillNext.price,\r\n )}`,\r\n )\r\n : document.createTextNode('No new achievement for next 100 buildings'),\r\n ),\r\n );\r\n });\r\n }\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Miscellaneous', 'Misc'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Misc) {\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n `Average cookies per second (past ${\r\n CookieTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist\r\n ] < 60\r\n ? `${\r\n CookieTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist\r\n ]\r\n } seconds`\r\n : CookieTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist\r\n ] /\r\n 60 +\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist === 3\r\n ? ' minute'\r\n : ' minutes')\r\n })`,\r\n document.createTextNode(Beautify(GetCPS(), 3)),\r\n ),\r\n );\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n `Average cookie clicks per second (past ${\r\n ClickTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist\r\n ]\r\n }${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist === 0\r\n ? ' second'\r\n : ' seconds'\r\n })`,\r\n document.createTextNode(Beautify(CacheAverageClicks, 1)),\r\n ),\r\n );\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n `Cookies from clicking (past ${\r\n ClickTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist\r\n ]\r\n }${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist === 0\r\n ? ' second'\r\n : ' seconds'\r\n })`,\r\n document.createTextNode(\r\n Beautify(\r\n CacheAverageCookiesFromClicks.calcSum(\r\n CacheAverageClicks *\r\n ClickTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist\r\n ],\r\n ),\r\n ),\r\n ),\r\n ),\r\n );\r\n if (Game.Has('Fortune cookies')) {\r\n const fortunes = [];\r\n Object.keys(GameData.Fortunes).forEach((i) => {\r\n if (!Game.Has(GameData.Fortunes[i])) {\r\n fortunes.push(GameData.Fortunes[i]);\r\n }\r\n });\r\n if (fortunes.length !== 0)\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n 'Fortune Upgrades Left to Buy',\r\n CreateElements.StatsMissDisp(fortunes),\r\n ),\r\n );\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ShowMissedGC) {\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n 'Missed golden cookies',\r\n document.createTextNode(Beautify(Game.missedGoldenClicks)),\r\n ),\r\n );\r\n }\r\n if (Game.prefs.autosave) {\r\n const timer = document.createElement('span');\r\n timer.id = 'CMStatsAutosaveTimer';\r\n timer.innerText = Game.sayTime(\r\n Game.fps * 60 - (Game.OnAscend ? 0 : Game.T % (Game.fps * 60)),\r\n 4,\r\n );\r\n stats.appendChild(CreateElements.StatsListing('basic', 'Time till autosave', timer));\r\n }\r\n }\r\n\r\n l('menu').insertBefore(stats, l('menu').childNodes[2]);\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingUpgrades) {\r\n AddMissingUpgrades();\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingAchievements) {\r\n AddMissingAchievements();\r\n }\r\n}\r\n","/** Functions to create the individual sections of the Statistics page */\r\n\r\nimport * as GameData from '../../../Data/Gamedata';\r\nimport { MaxChainCookieReward } from '../../../Cache/Stats/ChainCookies';\r\nimport {\r\n CacheAvgCPSWithChoEgg,\r\n CacheCentEgg,\r\n CacheChainFrenzyMaxReward,\r\n CacheChainFrenzyRequired,\r\n CacheChainFrenzyRequiredNext,\r\n CacheChainFrenzyWrathRequired,\r\n CacheChainFrenzyWrathRequiredNext,\r\n CacheChainMaxReward,\r\n CacheChainRequired,\r\n CacheChainRequiredNext,\r\n CacheChainWrathMaxReward,\r\n CacheChainWrathRequired,\r\n CacheChainWrathRequiredNext,\r\n CacheConjure,\r\n CacheConjureReward,\r\n CacheDragonsFortuneMultAdjustment,\r\n CacheEdifice,\r\n CacheEdificeBuilding,\r\n CacheGoldenCookiesMult,\r\n CacheHCPerSecond,\r\n CacheLastChoEgg,\r\n CacheLucky,\r\n CacheLuckyFrenzy,\r\n CacheLuckyReward,\r\n CacheLuckyRewardFrenzy,\r\n CacheLuckyWrathReward,\r\n CacheLuckyWrathRewardFrenzy,\r\n CacheNoGoldSwitchCookiesPS,\r\n CacheRealCookiesEarned,\r\n CacheSeaSpec,\r\n CacheWrathCookiesMult,\r\n CacheWrinklersTotal,\r\n} from '../../../Cache/VariablesAndData';\r\nimport ResetBonus from '../../../Sim/SimulationEvents/ResetAscension';\r\nimport CalculateLuckyLevels from '../../HelperFunctions/CalculateLuckyLevels';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../../HelperFunctions/GetWrinkConfigBank';\r\nimport { ColourGreen, ColourRed, ColourTextPre } from '../../VariablesAndData';\r\nimport {\r\n StatsListing,\r\n StatsHeader,\r\n StatsMissDisp,\r\n StatsMissDispListing,\r\n} from './CreateDOMElements';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../BeautifyAndFormatting/FormatTime';\r\n\r\n/**\r\n * This function creates the \"Lucky\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Lucky section\r\n */\r\nexport function LuckySection() {\r\n // This sets which tooltip to display for certain stats\r\n const goldCookTooltip = Game.auraMult(\"Dragon's Fortune\")\r\n ? 'GoldCookDragonsFortuneTooltipPlaceholder'\r\n : 'GoldCookTooltipPlaceholder';\r\n\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsLuckySection';\r\n\r\n const luckyColour = Game.cookies + GetWrinkConfigBank() < CacheLucky ? ColourRed : ColourGreen;\r\n const luckyTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheLucky\r\n ? FormatTime((CacheLucky - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const luckyReqFrag = document.createDocumentFragment();\r\n const luckyReqSpan = document.createElement('span');\r\n luckyReqSpan.style.fontWeight = 'bold';\r\n luckyReqSpan.className = ColourTextPre + luckyColour;\r\n luckyReqSpan.textContent = Beautify(CacheLucky);\r\n luckyReqFrag.appendChild(luckyReqSpan);\r\n if (luckyTime !== '') {\r\n const luckyReqSmall = document.createElement('small');\r\n luckyReqSmall.textContent = ` (${luckyTime})`;\r\n luckyReqFrag.appendChild(luckyReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing('withTooltip', '\"Lucky!\" cookies required', luckyReqFrag, goldCookTooltip),\r\n );\r\n\r\n const luckyColourFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheLuckyFrenzy ? ColourRed : ColourGreen;\r\n const luckyTimeFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheLuckyFrenzy\r\n ? FormatTime((CacheLuckyFrenzy - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const luckyReqFrenFrag = document.createDocumentFragment();\r\n const luckyReqFrenSpan = document.createElement('span');\r\n luckyReqFrenSpan.style.fontWeight = 'bold';\r\n luckyReqFrenSpan.className = ColourTextPre + luckyColourFrenzy;\r\n luckyReqFrenSpan.textContent = Beautify(CacheLuckyFrenzy);\r\n luckyReqFrenFrag.appendChild(luckyReqFrenSpan);\r\n if (luckyTimeFrenzy !== '') {\r\n const luckyReqFrenSmall = document.createElement('small');\r\n luckyReqFrenSmall.textContent = ` (${luckyTimeFrenzy})`;\r\n luckyReqFrenFrag.appendChild(luckyReqFrenSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Lucky!\" cookies required (frenzy)',\r\n luckyReqFrenFrag,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const luckySplit = CacheLuckyReward !== CacheLuckyWrathReward;\r\n\r\n const luckyRewardMaxSpan = document.createElement('span');\r\n luckyRewardMaxSpan.style.fontWeight = 'bold';\r\n luckyRewardMaxSpan.className = ColourTextPre + CacheLuckyReward;\r\n luckyRewardMaxSpan.textContent =\r\n Beautify(CacheLuckyReward) + (luckySplit ? ` / ${Beautify(CacheLuckyWrathReward)}` : '');\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n `\"Lucky!\" reward (max)${luckySplit ? ' (golden / wrath)' : ''}`,\r\n luckyRewardMaxSpan,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const luckyRewardFrenzyMaxSpan = document.createElement('span');\r\n luckyRewardFrenzyMaxSpan.style.fontWeight = 'bold';\r\n luckyRewardFrenzyMaxSpan.className = ColourTextPre + luckyRewardFrenzyMaxSpan;\r\n luckyRewardFrenzyMaxSpan.textContent =\r\n Beautify(CacheLuckyRewardFrenzy) +\r\n (luckySplit ? ` / ${Beautify(CacheLuckyWrathRewardFrenzy)}` : '');\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n `\"Lucky!\" reward (max) (frenzy)${luckySplit ? ' (golden / wrath)' : ''}`,\r\n luckyRewardFrenzyMaxSpan,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const luckyCurBase =\r\n Math.min(\r\n (Game.cookies + GetWrinkConfigBank()) * 0.15,\r\n CacheNoGoldSwitchCookiesPS * CacheDragonsFortuneMultAdjustment * 60 * 15,\r\n ) + 13;\r\n const luckyCurSpan = document.createElement('span');\r\n luckyCurSpan.style.fontWeight = 'bold';\r\n luckyCurSpan.className = ColourTextPre + luckyCurSpan;\r\n luckyCurSpan.textContent =\r\n Beautify(CacheGoldenCookiesMult * luckyCurBase) +\r\n (luckySplit ? ` / ${Beautify(CacheWrathCookiesMult * luckyCurBase)}` : '');\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n `\"Lucky!\" reward (cur)${luckySplit ? ' (golden / wrath)' : ''}`,\r\n luckyCurSpan,\r\n goldCookTooltip,\r\n ),\r\n );\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Chain\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Chain section\r\n */\r\nexport function ChainSection() {\r\n // This sets which tooltip to display for certain stats\r\n const goldCookTooltip = Game.auraMult(\"Dragon's Fortune\")\r\n ? 'GoldCookDragonsFortuneTooltipPlaceholder'\r\n : 'GoldCookTooltipPlaceholder';\r\n\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsChainSection';\r\n\r\n const chainColour =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainRequired ? ColourRed : ColourGreen;\r\n const chainTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainRequired\r\n ? FormatTime((CacheChainRequired - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const chainReqFrag = document.createDocumentFragment();\r\n const chainReqSpan = document.createElement('span');\r\n chainReqSpan.style.fontWeight = 'bold';\r\n chainReqSpan.className = ColourTextPre + chainColour;\r\n chainReqSpan.textContent = Beautify(CacheChainRequired);\r\n chainReqFrag.appendChild(chainReqSpan);\r\n if (chainTime !== '') {\r\n const chainReqSmall = document.createElement('small');\r\n chainReqSmall.textContent = ` (${chainTime})`;\r\n chainReqFrag.appendChild(chainReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing('withTooltip', '\"Chain\" cookies required', chainReqFrag, goldCookTooltip),\r\n );\r\n\r\n const chainWrathColour =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainWrathRequired ? ColourRed : ColourGreen;\r\n const chainWrathTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainWrathRequired\r\n ? FormatTime((CacheChainWrathRequired - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const chainWrathReqFrag = document.createDocumentFragment();\r\n const chainWrathReqSpan = document.createElement('span');\r\n chainWrathReqSpan.style.fontWeight = 'bold';\r\n chainWrathReqSpan.className = ColourTextPre + chainWrathColour;\r\n chainWrathReqSpan.textContent = Beautify(CacheChainWrathRequired);\r\n chainWrathReqFrag.appendChild(chainWrathReqSpan);\r\n if (chainWrathTime !== '') {\r\n const chainWrathReqSmall = document.createElement('small');\r\n chainWrathReqSmall.textContent = ` (${chainWrathTime})`;\r\n chainWrathReqFrag.appendChild(chainWrathReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" cookies required (Wrath)',\r\n chainWrathReqFrag,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const chainColourFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainFrenzyRequired ? ColourRed : ColourGreen;\r\n const chainTimeFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainFrenzyRequired\r\n ? FormatTime((CacheChainFrenzyRequired - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const chainReqFrenFrag = document.createDocumentFragment();\r\n const chainReqFrenSpan = document.createElement('span');\r\n chainReqFrenSpan.style.fontWeight = 'bold';\r\n chainReqFrenSpan.className = ColourTextPre + chainColourFrenzy;\r\n chainReqFrenSpan.textContent = Beautify(CacheChainFrenzyRequired);\r\n chainReqFrenFrag.appendChild(chainReqFrenSpan);\r\n if (chainTimeFrenzy !== '') {\r\n const chainReqFrenSmall = document.createElement('small');\r\n chainReqFrenSmall.textContent = ` (${chainTimeFrenzy})`;\r\n chainReqFrenFrag.appendChild(chainReqFrenSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" cookies required (Frenzy)',\r\n chainReqFrenFrag,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const chainWrathColourFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainFrenzyWrathRequired ? ColourRed : ColourGreen;\r\n const chainWrathTimeFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainFrenzyWrathRequired\r\n ? FormatTime(\r\n (CacheChainFrenzyWrathRequired - (Game.cookies + GetWrinkConfigBank())) / GetCPS(),\r\n )\r\n : '';\r\n const chainWrathReqFrenFrag = document.createDocumentFragment();\r\n const chainWrathReqFrenSpan = document.createElement('span');\r\n chainWrathReqFrenSpan.style.fontWeight = 'bold';\r\n chainWrathReqFrenSpan.className = ColourTextPre + chainWrathColourFrenzy;\r\n chainWrathReqFrenSpan.textContent = Beautify(CacheChainFrenzyWrathRequired);\r\n chainWrathReqFrenFrag.appendChild(chainWrathReqFrenSpan);\r\n if (chainWrathTimeFrenzy !== '') {\r\n const chainWrathReqFrenSmall = document.createElement('small');\r\n chainWrathReqFrenSmall.textContent = ` (${chainWrathTimeFrenzy})`;\r\n chainWrathReqFrenFrag.appendChild(chainWrathReqFrenSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" cookies required (frenzy) (Wrath)',\r\n chainWrathReqFrenFrag,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" reward (max) (golden / wrath)',\r\n document.createTextNode(\r\n `${Beautify(CacheChainMaxReward[0])} / ${Beautify(CacheChainWrathMaxReward[0])}`,\r\n ),\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" reward (max) (frenzy) (golden / wrath)',\r\n document.createTextNode(\r\n `${Beautify(CacheChainFrenzyMaxReward[0])} / ${Beautify(CacheChainFrenzyMaxReward[0])}`,\r\n ),\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const chainCurMax = Math.min(\r\n Game.cookiesPs * 60 * 60 * 6 * CacheDragonsFortuneMultAdjustment,\r\n Game.cookies * 0.5,\r\n );\r\n const chainCur = MaxChainCookieReward(7, chainCurMax, CacheGoldenCookiesMult)[0];\r\n const chainCurWrath = MaxChainCookieReward(6, chainCurMax, CacheWrathCookiesMult)[0];\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" reward (cur) (golden / wrath)',\r\n document.createTextNode(`${Beautify(chainCur)} / ${Beautify(chainCurWrath)}`),\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'CPS needed for next level (g / w)',\r\n document.createTextNode(\r\n `${Beautify(CacheChainRequiredNext)} / ${Beautify(CacheChainWrathRequiredNext)}`,\r\n ),\r\n 'ChainNextLevelPlaceholder',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'CPS needed for next level (frenzy) (g / w)',\r\n document.createTextNode(\r\n `${Beautify(CacheChainFrenzyRequiredNext)} / ${Beautify(\r\n CacheChainFrenzyWrathRequiredNext,\r\n )}`,\r\n ),\r\n 'ChainNextLevelPlaceholder',\r\n ),\r\n );\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Spells\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Spells section\r\n */\r\nexport function SpellsSection() {\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsSpellsSection';\r\n\r\n const conjureColour =\r\n Game.cookies + GetWrinkConfigBank() < CacheConjure ? ColourRed : ColourGreen;\r\n const conjureTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheConjure\r\n ? FormatTime((CacheConjure - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n\r\n const conjureReqFrag = document.createDocumentFragment();\r\n const conjureReqSpan = document.createElement('span');\r\n conjureReqSpan.style.fontWeight = 'bold';\r\n conjureReqSpan.className = ColourTextPre + conjureColour;\r\n conjureReqSpan.textContent = Beautify(CacheConjure);\r\n conjureReqFrag.appendChild(conjureReqSpan);\r\n if (conjureTime !== '') {\r\n const conjureReqSmall = document.createElement('small');\r\n conjureReqSmall.textContent = ` (${conjureTime})`;\r\n conjureReqFrag.appendChild(conjureReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" cookies required',\r\n conjureReqFrag,\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" reward (max)',\r\n document.createTextNode(Beautify(CacheConjureReward)),\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n\r\n const conjureFrenzyColour =\r\n Game.cookies + GetWrinkConfigBank() < CacheConjure * 7 ? ColourRed : ColourGreen;\r\n const conjureFrenzyCur = Math.min(\r\n (Game.cookies + GetWrinkConfigBank()) * 0.15,\r\n CacheNoGoldSwitchCookiesPS * 60 * 30,\r\n );\r\n const conjureFrenzyTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheConjure * 7\r\n ? FormatTime((CacheConjure * 7 - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n\r\n const conjureFrenzyReqFrag = document.createDocumentFragment();\r\n const conjureFrenzyReqSpan = document.createElement('span');\r\n conjureFrenzyReqSpan.style.fontWeight = 'bold';\r\n conjureFrenzyReqSpan.className = ColourTextPre + conjureFrenzyColour;\r\n conjureFrenzyReqSpan.textContent = Beautify(CacheConjure * 7);\r\n conjureFrenzyReqFrag.appendChild(conjureFrenzyReqSpan);\r\n if (conjureFrenzyTime !== '') {\r\n const conjureFrenzyReqSmall = document.createElement('small');\r\n conjureFrenzyReqSmall.textContent = ` (${conjureFrenzyTime})`;\r\n conjureFrenzyReqFrag.appendChild(conjureFrenzyReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" cookies required (frenzy)',\r\n conjureFrenzyReqFrag,\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" reward (max) (frenzy)',\r\n document.createTextNode(Beautify(CacheConjureReward * 7)),\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" reward (cur)',\r\n document.createTextNode(Beautify(conjureFrenzyCur)),\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n if (CacheEdifice) {\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Spontaneous Edifice\" cookies required (most expensive building)',\r\n document.createTextNode(`${Beautify(CacheEdifice)} (${CacheEdificeBuilding})`),\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n }\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Garden\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Spells section\r\n */\r\nexport function GardenSection() {\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsGardenSection';\r\n\r\n const bakeberryColour = Game.cookies < Game.cookiesPs * 60 * 10 * 100 ? ColourRed : ColourGreen;\r\n const bakeberryFrag = document.createElement('span');\r\n bakeberryFrag.style.fontWeight = 'bold';\r\n bakeberryFrag.className = ColourTextPre + bakeberryColour;\r\n bakeberryFrag.textContent = Beautify(Game.cookiesPs * 60 * 10 * 100);\r\n section.appendChild(\r\n StatsListing('basic', 'Cookies required for max reward of Bakeberry: ', bakeberryFrag),\r\n );\r\n\r\n const chocorootColour = Game.cookies < Game.cookiesPs * 60 * 100 ? ColourRed : ColourGreen;\r\n const chocorootFrag = document.createElement('span');\r\n chocorootFrag.style.fontWeight = 'bold';\r\n chocorootFrag.className = ColourTextPre + chocorootColour;\r\n chocorootFrag.textContent = Beautify(Game.cookiesPs * 60 * 100);\r\n section.appendChild(\r\n StatsListing('basic', 'Cookies required for max reward of Chocoroot: ', chocorootFrag),\r\n );\r\n\r\n const queenbeetColour = Game.cookies < Game.cookiesPs * 60 * 60 * 25 ? ColourRed : ColourGreen;\r\n const queenbeetFrag = document.createElement('span');\r\n queenbeetFrag.style.fontWeight = 'bold';\r\n queenbeetFrag.className = ColourTextPre + queenbeetColour;\r\n queenbeetFrag.textContent = Beautify(Game.cookiesPs * 60 * 60 * 25);\r\n section.appendChild(\r\n StatsListing('basic', 'Cookies required for max reward of Queenbeet: ', queenbeetFrag),\r\n );\r\n\r\n const duketaterColour = Game.cookies < Game.cookiesPs * 60 * 15 * 100 ? ColourRed : ColourGreen;\r\n const duketaterFrag = document.createElement('span');\r\n duketaterFrag.style.fontWeight = 'bold';\r\n duketaterFrag.className = ColourTextPre + duketaterColour;\r\n duketaterFrag.textContent = Beautify(Game.cookiesPs * 60 * 15 * 100);\r\n section.appendChild(\r\n StatsListing('basic', 'Cookies required for max reward of Duketater: ', duketaterFrag),\r\n );\r\n const missingPlantDrops = [];\r\n Object.keys(GameData.PlantDrops).forEach((i) => {\r\n if (!Game.HasUnlocked(GameData.PlantDrops[i])) {\r\n missingPlantDrops.push(GameData.PlantDrops[i]);\r\n }\r\n });\r\n if (missingPlantDrops.length !== 0) {\r\n section.appendChild(\r\n StatsListing('basic', 'Rare plant drops left to unlock', StatsMissDisp(missingPlantDrops)),\r\n );\r\n }\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Prestige\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Prestige section\r\n */\r\nexport function PrestigeSection() {\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsPrestigeSection';\r\n\r\n const possiblePresMax = Math.floor(\r\n Game.HowMuchPrestige(\r\n CacheRealCookiesEarned +\r\n Game.cookiesReset +\r\n CacheWrinklersTotal +\r\n (Game.HasUnlocked('Chocolate egg') && !Game.Has('Chocolate egg') ? CacheLastChoEgg : 0),\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'Prestige level (cur / max)',\r\n document.createTextNode(`${Beautify(Game.prestige)} / ${Beautify(possiblePresMax)}`),\r\n 'PrestMaxTooltipPlaceholder',\r\n ),\r\n );\r\n\r\n const neededCook = Math.max(\r\n 0,\r\n Game.HowManyCookiesReset(possiblePresMax + 1) -\r\n (CacheRealCookiesEarned +\r\n Game.cookiesReset +\r\n CacheWrinklersTotal +\r\n ((Game.HasUnlocked('Chocolate egg') && !Game.Has('Chocolate egg') ? CacheLastChoEgg : 0)\r\n ? CacheLastChoEgg\r\n : 0)),\r\n );\r\n const cookiesNextFrag = document.createDocumentFragment();\r\n cookiesNextFrag.appendChild(document.createTextNode(Beautify(neededCook)));\r\n const cookiesNextSmall = document.createElement('small');\r\n cookiesNextSmall.textContent = ` (${FormatTime(neededCook / CacheAvgCPSWithChoEgg, 1)})`;\r\n cookiesNextFrag.appendChild(cookiesNextSmall);\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'Cookies to next level',\r\n cookiesNextFrag,\r\n 'NextPrestTooltipPlaceholder',\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'Heavenly chips (cur / max)',\r\n document.createTextNode(\r\n `${Beautify(Game.heavenlyChips)} / ${Beautify(\r\n possiblePresMax - Game.prestige + Game.heavenlyChips,\r\n )}`,\r\n ),\r\n 'HeavenChipMaxTooltipPlaceholder',\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'basic',\r\n 'Heavenly chips per second (last 5 seconds)',\r\n document.createTextNode(Beautify(CacheHCPerSecond, 2)),\r\n ),\r\n );\r\n\r\n const HCTarget = Number(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.HeavenlyChipsTarget,\r\n );\r\n if (!Number.isNaN(HCTarget)) {\r\n const CookiesTillTarget =\r\n HCTarget - Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned));\r\n if (CookiesTillTarget > 0) {\r\n section.appendChild(\r\n StatsListing(\r\n 'basic',\r\n 'Heavenly chips to target set in settings (cur)',\r\n document.createTextNode(Beautify(CookiesTillTarget)),\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'basic',\r\n 'Time till target (cur, current 5 second average)',\r\n document.createTextNode(FormatTime(CookiesTillTarget / CacheHCPerSecond)),\r\n ),\r\n );\r\n }\r\n }\r\n\r\n const resetBonus = ResetBonus(possiblePresMax);\r\n const resetFrag = document.createDocumentFragment();\r\n resetFrag.appendChild(document.createTextNode(Beautify(resetBonus)));\r\n const increase = Math.round((resetBonus / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n const resetSmall = document.createElement('small');\r\n resetSmall.textContent = ` (${increase / 100}% of income)`;\r\n resetFrag.appendChild(resetSmall);\r\n }\r\n section.appendChild(\r\n StatsListing('withTooltip', 'Reset bonus income', resetFrag, 'ResetTooltipPlaceholder'),\r\n );\r\n\r\n const currentPrestige = Math.floor(Game.HowMuchPrestige(Game.cookiesReset));\r\n const willHave = Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned));\r\n const willGet = willHave - currentPrestige;\r\n const {\r\n luckyDigit,\r\n luckyNumber,\r\n luckyPayout\r\n } = CalculateLuckyLevels(willHave);\r\n if (!Game.Has('Lucky digit')) {\r\n const luckyDigitDelta = luckyDigit - willHave;\r\n const luckyDigitReset = willGet + luckyDigitDelta;\r\n const fragLuckyDigit = document.createDocumentFragment();\r\n fragLuckyDigit.appendChild(\r\n document.createTextNode(\r\n `${luckyDigit.toLocaleString()} / ${luckyDigitReset.toLocaleString()} (+${luckyDigitDelta})`,\r\n ),\r\n );\r\n section.appendChild(StatsListing('basic', 'Next \"Lucky Digit\" (total / reset)', fragLuckyDigit));\r\n }\r\n\r\n if (!Game.Has('Lucky number')) {\r\n const luckyNumberDelta = luckyNumber - willHave;\r\n const luckyNumberReset = willGet + luckyNumberDelta;\r\n const fragLuckyNumber = document.createDocumentFragment();\r\n fragLuckyNumber.appendChild(\r\n document.createTextNode(\r\n `${luckyNumber.toLocaleString()} / ${luckyNumberReset.toLocaleString()} (+${luckyNumberDelta})`,\r\n ),\r\n );\r\n section.appendChild(StatsListing('basic', 'Next \"Lucky Number\" (total / reset)', fragLuckyNumber));\r\n }\r\n\r\n if (!Game.Has('Lucky payout')) {\r\n const luckyPayoutDelta = luckyPayout - willHave;\r\n const luckyPayoutReset = willGet + luckyPayoutDelta;\r\n const fragLuckyPayout = document.createDocumentFragment();\r\n fragLuckyPayout.appendChild(\r\n document.createTextNode(\r\n `${luckyPayout.toLocaleString()} / ${luckyPayoutReset.toLocaleString()} (+${luckyPayoutDelta})`,\r\n ),\r\n );\r\n section.appendChild(StatsListing('basic', 'Next \"Lucky Payout\" (total / reset)', fragLuckyPayout));\r\n }\r\n\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Season Specials\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Season Specials section\r\n */\r\nexport function SeasonSection() {\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsSeasonSection';\r\n\r\n let specDisp = false;\r\n const missingHalloweenCookies = [];\r\n Object.keys(GameData.HalloCookies).forEach((i) => {\r\n if (!Game.Has(GameData.HalloCookies[i])) {\r\n missingHalloweenCookies.push(GameData.HalloCookies[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const missingChristmasCookies = [];\r\n Object.keys(GameData.ChristCookies).forEach((i) => {\r\n if (!Game.Has(GameData.ChristCookies[i])) {\r\n missingChristmasCookies.push(GameData.ChristCookies[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const missingValentineCookies = [];\r\n Object.keys(GameData.ValCookies).forEach((i) => {\r\n if (!Game.Has(GameData.ValCookies[i])) {\r\n missingValentineCookies.push(GameData.ValCookies[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const missingNormalEggs = [];\r\n Object.keys(Game.eggDrops).forEach((i) => {\r\n if (!Game.HasUnlocked(Game.eggDrops[i])) {\r\n missingNormalEggs.push(Game.eggDrops[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const missingRareEggs = [];\r\n Object.keys(Game.rareEggDrops).forEach((i) => {\r\n if (!Game.HasUnlocked(Game.rareEggDrops[i])) {\r\n missingRareEggs.push(Game.rareEggDrops[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const choEgg = Game.HasUnlocked('Chocolate egg') && !Game.Has('Chocolate egg');\r\n const centEgg = Game.Has('Century egg');\r\n\r\n if (Game.season === 'christmas' || specDisp || choEgg || centEgg) {\r\n section.appendChild(StatsHeader('Season Specials', 'Sea'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Sea) {\r\n if (missingHalloweenCookies.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Halloween cookies left to buy',\r\n StatsMissDisp(missingHalloweenCookies),\r\n Game.season === 'halloween',\r\n ),\r\n );\r\n let failRateHalloween = 0.95;\r\n if (Game.HasAchiev('Spooky cookies')) failRateHalloween = 0.8;\r\n if (Game.Has('Starterror')) failRateHalloween *= 0.9;\r\n failRateHalloween *= 1 / Game.dropRateMult();\r\n if (Game.hasGod) {\r\n const godLvl = Game.hasGod('seasons');\r\n if (godLvl === 1) failRateHalloween *= 0.9;\r\n else if (godLvl === 2) failRateHalloween *= 0.95;\r\n else if (godLvl === 3) failRateHalloween *= 0.97;\r\n }\r\n const obtainedCookiesChance = missingHalloweenCookies.length / 7;\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Chance of receiving a cookie from wrinkler/shiny wrinkler',\r\n document.createTextNode(\r\n `${Beautify((1 - failRateHalloween) * obtainedCookiesChance * 100)}% / ${Beautify(\r\n (1 - failRateHalloween * 0.9) * obtainedCookiesChance * 100,\r\n )}%`,\r\n ),\r\n Game.season === 'halloween',\r\n ),\r\n );\r\n }\r\n if (missingChristmasCookies.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Christmas cookies left to buy',\r\n StatsMissDisp(missingChristmasCookies),\r\n Game.season === 'christmas',\r\n ),\r\n );\r\n let failRateChristmas = 0.8;\r\n if (Game.HasAchiev('Let it snow')) failRateChristmas = 0.6;\r\n failRateChristmas *= 1 / Game.dropRateMult();\r\n if (Game.Has('Starsnow')) failRateChristmas *= 0.95;\r\n if (Game.hasGod) {\r\n const godLvl = Game.hasGod('seasons');\r\n if (godLvl === 1) failRateChristmas *= 0.9;\r\n else if (godLvl === 2) failRateChristmas *= 0.95;\r\n else if (godLvl === 3) failRateChristmas *= 0.97;\r\n }\r\n const obtainedCookiesChance = missingChristmasCookies.length / 7;\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Chance of receiving a cookie from reindeer',\r\n document.createTextNode(\r\n `${Beautify((1 - failRateChristmas) * obtainedCookiesChance * 100)}%`,\r\n ),\r\n Game.season === 'christmas',\r\n ),\r\n );\r\n }\r\n if (missingValentineCookies.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Valentine cookies left to buy',\r\n StatsMissDisp(missingValentineCookies),\r\n Game.season === 'valentines',\r\n ),\r\n );\r\n }\r\n const dropRateEgg = function (StartingFailRate) {\r\n let failRateEgg = StartingFailRate * (1 / Game.dropRateMult());\r\n if (Game.HasAchiev('Hide & seek champion')) failRateEgg *= 0.7;\r\n if (Game.Has('Omelette')) failRateEgg *= 0.9;\r\n if (Game.Has('Starspawn')) failRateEgg *= 0.9;\r\n if (Game.hasGod) {\r\n const godLvl = Game.hasGod('seasons');\r\n if (godLvl === 1) failRateEgg *= 0.9;\r\n else if (godLvl === 2) failRateEgg *= 0.95;\r\n else if (godLvl === 3) failRateEgg *= 0.97;\r\n }\r\n // Calculations courtesy of @svschouw, at https://github.com/Aktanusa/CookieMonster/issues/25\r\n const succesRateEgg = 1 - failRateEgg;\r\n const obtainedEggs = Game.eggDrops.length - missingNormalEggs.length;\r\n const obtainedRareEggs = Game.rareEggDrops.length - missingRareEggs.length;\r\n const pNormal1 = succesRateEgg * 0.9 * (1 - obtainedEggs / Game.eggDrops.length);\r\n const pRare1 = succesRateEgg * 0.1 * (1 - obtainedRareEggs / Game.rareEggDrops.length);\r\n const pRedropNormal = succesRateEgg * 0.9 * (obtainedEggs / Game.eggDrops.length);\r\n const pRedropRare = succesRateEgg * 0.1 * (obtainedRareEggs / Game.rareEggDrops.length);\r\n const pRedrop = pRedropNormal + pRedropRare;\r\n const pNormal2 = pRedrop * 0.9 * (1 - obtainedEggs / Game.eggDrops.length);\r\n const pRare2 = pRedrop * 0.1 * (1 - obtainedRareEggs / Game.rareEggDrops.length);\r\n return [pNormal1 + pNormal2, pRare1 + pRare2];\r\n };\r\n if (missingNormalEggs.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Normal easter eggs left to unlock',\r\n StatsMissDisp(missingNormalEggs),\r\n Game.season === 'easter',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Chance of receiving an egg from wrinkler/golden cookie',\r\n document.createTextNode(\r\n `${Beautify(dropRateEgg(0.98)[0] * 100)}% / ${Beautify(dropRateEgg(0.9)[0] * 100)}%`,\r\n ),\r\n Game.season === 'easter',\r\n ),\r\n );\r\n }\r\n if (missingRareEggs.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Rare easter eggs left to unlock',\r\n StatsMissDisp(missingRareEggs),\r\n Game.season === 'easter',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Chance of receiving a rare egg from wrinkler/golden cookie',\r\n document.createTextNode(\r\n `${Beautify(dropRateEgg(0.98)[1] * 100)}% / ${Beautify(dropRateEgg(0.9)[1] * 100)}%`,\r\n ),\r\n Game.season === 'easter',\r\n ),\r\n );\r\n }\r\n\r\n if (Game.season === 'christmas')\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Reindeer reward',\r\n document.createTextNode(Beautify(CacheSeaSpec)),\r\n true,\r\n ),\r\n );\r\n if (choEgg) {\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'Chocolate egg cookies',\r\n document.createTextNode(Beautify(CacheLastChoEgg)),\r\n 'ChoEggTooltipPlaceholder',\r\n ),\r\n );\r\n }\r\n if (centEgg) {\r\n section.appendChild(\r\n StatsListing(\r\n 'basic',\r\n 'Century egg multiplier',\r\n document.createTextNode(`${Math.round((CacheCentEgg - 1) * 10000) / 100}%`),\r\n ),\r\n );\r\n }\r\n }\r\n }\r\n return section;\r\n}\r\n","import { CacheRealCookiesEarned } from '../../Cache/VariablesAndData';\r\nimport CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport { SimAchievementsOwned, SimCookiesPs, SimPrestige, SimUpgrades } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This function calculates the cookies per click difference betwene current and after a ascension\r\n * It is called by CM.Disp.CreateStatsPrestigeSection()\r\n * @param\t{number}\tnewHeavenlyChips\tThe total heavenly chips after ascension\r\n * @returns\t{number}\tResetCPS\t\t\tThe CPS difference after reset\r\n */\r\nexport default function ResetBonus(newHeavenlyChips) {\r\n // Calculate CPS with all Heavenly upgrades\r\n let curCPS = Game.cookiesPs;\r\n\r\n CopyData();\r\n\r\n if (SimUpgrades['Heavenly key'].bought === 0) {\r\n SimUpgrades['Heavenly chip secret'].bought = 1;\r\n SimUpgrades['Heavenly cookie stand'].bought = 1;\r\n SimUpgrades['Heavenly bakery'].bought = 1;\r\n SimUpgrades['Heavenly confectionery'].bought = 1;\r\n SimUpgrades['Heavenly key'].bought = 1;\r\n\r\n CalculateGains();\r\n\r\n curCPS = SimCookiesPs;\r\n\r\n CopyData();\r\n }\r\n\r\n if (CacheRealCookiesEarned >= 1000000) SimWin('Sacrifice');\r\n if (CacheRealCookiesEarned >= 1000000000) SimWin('Oblivion');\r\n if (CacheRealCookiesEarned >= 1000000000000) SimWin('From scratch');\r\n if (CacheRealCookiesEarned >= 1000000000000000) SimWin('Nihilism');\r\n if (CacheRealCookiesEarned >= 1000000000000000000) SimWin('Dematerialize');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000) SimWin('Nil zero zilch');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000) SimWin('Transcendence');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000) SimWin('Obliterate');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000) SimWin('Negative void');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000) SimWin('To crumbs, you say?');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000) SimWin('You get nothing');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000)\r\n SimWin('Humble rebeginnings');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000)\r\n SimWin('The end of the world');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000000)\r\n SimWin(\"Oh, you're back\");\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000000000)\r\n SimWin('Lazarus');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000000000000)\r\n SimWin('Smurf account');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000000000000000)\r\n SimWin(\"If at first you don't succeed\");\r\n\r\n SimUpgrades['Heavenly chip secret'].bought = 1;\r\n SimUpgrades['Heavenly cookie stand'].bought = 1;\r\n SimUpgrades['Heavenly bakery'].bought = 1;\r\n SimUpgrades['Heavenly confectionery'].bought = 1;\r\n SimUpgrades['Heavenly key'].bought = 1;\r\n\r\n SimPrestige = newHeavenlyChips;\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n\r\n const ResetCPS = SimCookiesPs - curCPS;\r\n\r\n // Reset Pretige level after calculation as it is used in CM.Sim.CalculateGains() so can't be local\r\n SimPrestige = Game.prestige;\r\n\r\n return ResetCPS;\r\n}\r\n","function CrateTooltipLockedAchievements(me) {\r\n const tags = [];\r\n if (me.pool === 'shadow') tags.push('Shadow Achievement', '#9700cf');\r\n else tags.push('Achievement', 0);\r\n tags.push('Locked', 0);\r\n\r\n let neuromancy = 0;\r\n if (Game.Has('Neuromancy') || (Game.sesame && me.pool === 'debug')) neuromancy = 1;\r\n if (neuromancy && me.won === 0) tags.push('Click to win!', '#00c462');\r\n else if (neuromancy && me.won > 0) tags.push('Click to lose!', '#00c462');\r\n\r\n let { icon } = me;\r\n if (me.iconFunction) icon = me.iconFunction();\r\n\r\n let { desc } = me;\r\n if (me.descFunc) desc = me.descFunc('stats');\r\n\r\n let tagsStr = '';\r\n for (let i = 0; i < tags.length; i += 2) {\r\n if (i % 2 === 0)\r\n tagsStr += ` <div class=\"tag\" style=\"color:${tags[i + 1] === 0 ? '#fff' : tags[i + 1]};\">[${\r\n tags[i]\r\n }]</div>`;\r\n }\r\n tagsStr = tagsStr.substring(1);\r\n\r\n return `<div style=\"padding:8px 4px;min-width:350px;opacity:0.5\">\r\n <div class=\"icon\" style=\"float:left;margin-left:-8px;margin-top:-8px;background-position:${\r\n -icon[0] * 48\r\n }px ${-icon[1] * 48}px;\"></div>\r\n <div class=\"name\">${me.name}</div>\r\n ${tagsStr}<div class=\"line\"></div><div class=\"description\">${desc}</div></div>\r\n ${\r\n Game.sesame\r\n ? `<div style=\"font-size:9px;\">Id : ${me.id} | Order : ${Math.floor(me.order)}${\r\n me.tier ? ` | Tier : ${me.tier}` : ''\r\n }</div>`\r\n : ''\r\n }`;\r\n}\r\n\r\n/**\r\n * This function overwrites the crates of missing achievements\r\n */\r\nexport default function AddMissingAchievements() {\r\n let achievs;\r\n Object.values(document.querySelectorAll('div.title')).forEach((i) => {\r\n if (i.textContent.includes('Achievements')) {\r\n achievs = i.parentElement.querySelectorAll('div.listing.crateBox')[0];\r\n }\r\n });\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingAchievements) {\r\n Object.values(achievs.children).forEach((achievsCrate) => {\r\n if (!achievsCrate.className.includes('enabled')) {\r\n const id = achievsCrate.onclick.toString().split(/\\[(.*)\\]/gi)[1];\r\n const { icon } = Game.AchievementsById[id];\r\n // eslint-disable-next-line no-param-reassign\r\n achievsCrate.style.backgroundPosition = `${-icon[0] * 48}px ${-icon[1] * 48}px`;\r\n // eslint-disable-next-line no-param-reassign\r\n achievsCrate.onmouseover = function () {\r\n if (!Game.mouseDown) {\r\n Game.setOnCrate(this);\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(\r\n this,\r\n () =>\r\n (function () {\r\n return CrateTooltipLockedAchievements(Game.AchievementsById[id]);\r\n })(),\r\n 'top',\r\n );\r\n Game.tooltip.wobble();\r\n }\r\n };\r\n }\r\n });\r\n }\r\n}\r\n","/**\r\n * This function fixes Game.mouseY as a result of bars that are added by CookieMonster\r\n * It is called by Game.UpdateWrinklers(), Game.UpdateSpecial() and the .onmousover of the BigCookie\r\n * before execution of their actual function\r\n */\r\nexport default function FixMouseY(target) {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 0\r\n ) {\r\n const timerBarHeight = parseInt(l('CMTimerBar').style.height, 10);\r\n Game.mouseY -= timerBarHeight;\r\n target();\r\n Game.mouseY += timerBarHeight;\r\n } else {\r\n target();\r\n }\r\n}\r\n","import jscolor from '@eastdesire/jscolor';\r\n\r\nimport CMBeautify from '../../Disp/BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../Disp/BeautifyAndFormatting/FormatTime';\r\nimport { AddAuraInfo, AddDragonLevelUpTooltip } from '../../Disp/Dragon/Dragon';\r\nimport AddMenu from '../../Disp/MenuSections/AddMenus';\r\nimport UpdateTitle from '../../Disp/TabTitle/TabTitle';\r\nimport ReplaceAscendTooltip from '../../Disp/Tooltips/AscendButton';\r\nimport UpdateTooltipLocation from '../../Disp/Tooltips/PositionLocation';\r\nimport { CMSayTime, Title } from '../../Disp/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport { SimDoSims } from '../../Sim/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport ReplaceTooltipUpgrade from '../ReplaceGameElements/TooltipUpgrades';\r\nimport {\r\n BackupFunctions,\r\n CenturyDateAtBeginLoop, // eslint-disable-line no-unused-vars\r\n CycliusDateAtBeginLoop, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\nimport FixMouseY from './FixMouse';\r\n\r\n/**\r\n * This function replaces certain native (from the base-game) functions\r\n */\r\nexport default function ReplaceNative() {\r\n // eslint-disable-next-line no-undef\r\n BackupFunctions.Beautify = Beautify;\r\n // eslint-disable-next-line no-undef\r\n Beautify = CMBeautify;\r\n\r\n BackupFunctions.CalculateGains = Game.CalculateGains;\r\n Game.CalculateGains = function () {\r\n BackupFunctions.CalculateGains();\r\n SimDoSims = 1;\r\n CycliusDateAtBeginLoop = Date.now();\r\n CenturyDateAtBeginLoop = Date.now();\r\n };\r\n\r\n BackupFunctions.tooltip = {};\r\n BackupFunctions.tooltip.draw = Game.tooltip.draw;\r\n BackupFunctions.tooltip.drawMod = new Function( // eslint-disable-line no-new-func\r\n `return ${Game.tooltip.draw.toString().split('this').join('Game.tooltip')}`,\r\n )();\r\n Game.tooltip.draw = function (from, text, origin) {\r\n BackupFunctions.tooltip.drawMod(from, text, origin);\r\n };\r\n\r\n BackupFunctions.tooltip.update = Game.tooltip.update;\r\n BackupFunctions.tooltip.updateMod = new Function( // eslint-disable-line no-new-func\r\n `return ${Game.tooltip.update.toString().split('this.').join('Game.tooltip.')}`,\r\n )();\r\n Game.tooltip.update = function () {\r\n BackupFunctions.tooltip.updateMod();\r\n UpdateTooltipLocation();\r\n };\r\n\r\n BackupFunctions.UpdateWrinklers = Game.UpdateWrinklers;\r\n Game.UpdateWrinklers = function () {\r\n FixMouseY(BackupFunctions.UpdateWrinklers);\r\n };\r\n\r\n BackupFunctions.UpdateSpecial = Game.UpdateSpecial;\r\n Game.UpdateSpecial = function () {\r\n FixMouseY(BackupFunctions.UpdateSpecial);\r\n };\r\n\r\n // Assumes newer browsers\r\n l('bigCookie').removeEventListener('click', Game.ClickCookie, false);\r\n l('bigCookie').addEventListener(\r\n 'click',\r\n (event) => {\r\n FixMouseY(() => Game.ClickCookie(event, 0));\r\n },\r\n false,\r\n );\r\n\r\n BackupFunctions.RebuildUpgrades = Game.RebuildUpgrades;\r\n Game.RebuildUpgrades = function () {\r\n BackupFunctions.RebuildUpgrades();\r\n ReplaceTooltipUpgrade();\r\n Game.CalculateGains();\r\n };\r\n\r\n BackupFunctions.ClickProduct = Game.ClickProduct;\r\n /**\r\n * This function adds a check to the purchase of a building to allow BulkBuyBlock to work.\r\n * If the options is 1 (on) bulkPrice is under cookies you can't buy the building.\r\n */\r\n Game.ClickProduct = function (what) {\r\n if (\r\n !Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BulkBuyBlock ||\r\n Game.ObjectsById[what].bulkPrice <= Game.cookies ||\r\n Game.buyMode === -1\r\n ) {\r\n BackupFunctions.ClickProduct(what);\r\n }\r\n };\r\n\r\n BackupFunctions.DescribeDragonAura = Game.DescribeDragonAura;\r\n /**\r\n * This function adds the function CM.Disp.AddAuraInfo() to Game.DescribeDragonAura()\r\n * This adds information about CPS differences and costs to the aura choosing interface\r\n * @param\t{number}\taura\tThe number of the aura currently selected by the mouse/user\r\n */\r\n Game.DescribeDragonAura = function (aura) {\r\n BackupFunctions.DescribeDragonAura(aura);\r\n AddAuraInfo(aura);\r\n };\r\n\r\n BackupFunctions.ToggleSpecialMenu = Game.ToggleSpecialMenu;\r\n /**\r\n * This function adds the code to display the tooltips for the levelUp button of the dragon\r\n */\r\n Game.ToggleSpecialMenu = function (on) {\r\n BackupFunctions.ToggleSpecialMenu(on);\r\n AddDragonLevelUpTooltip();\r\n };\r\n\r\n BackupFunctions.UpdateMenu = Game.UpdateMenu;\r\n Game.UpdateMenu = function () {\r\n if (typeof jscolor.picker === 'undefined' || typeof jscolor.picker.owner === 'undefined') {\r\n BackupFunctions.UpdateMenu();\r\n AddMenu();\r\n }\r\n };\r\n\r\n BackupFunctions.sayTime = Game.sayTime;\r\n // eslint-disable-next-line no-unused-vars\r\n CMSayTime = function (time, detail) {\r\n if (Number.isNaN(time) || time <= 0) return BackupFunctions.sayTime(time, detail);\r\n return FormatTime(time / Game.fps, 1);\r\n };\r\n\r\n BackupFunctions.Logic = Game.Logic;\r\n Game.Logic = function () {\r\n BackupFunctions.Logic();\r\n\r\n // Update tab title\r\n let title = 'Cookie Clicker';\r\n if (Game.season === 'fools') title = 'Cookie Baker';\r\n // eslint-disable-next-line no-unused-vars\r\n Title = `${Game.OnAscend ? 'Ascending! ' : ''}${CMBeautify(Game.cookies)} ${\r\n Game.cookies === 1 ? 'cookie' : 'cookies'\r\n } - ${title}`;\r\n UpdateTitle();\r\n\r\n // Since the Ascend Tooltip is not actually a tooltip we need to add our additional info here...\r\n ReplaceAscendTooltip();\r\n };\r\n}\r\n","/**\r\n * This function updates the location of the tooltip\r\n * It is called by Game.tooltip.update() because of CM.Main.ReplaceNative()\r\n */\r\nexport default function UpdateTooltipLocation() {\r\n if (Game.tooltip.origin === 'store') {\r\n let warnOffset = 0;\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLucky === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos === 1 &&\r\n l('CMDispTooltipWarningParent') !== null\r\n ) {\r\n warnOffset = l('CMDispTooltipWarningParent').clientHeight - 4;\r\n }\r\n Game.tooltip.tta.style.top = `${Math.min(\r\n parseInt(Game.tooltip.tta.style.top, 10),\r\n l('game').clientHeight +\r\n l('topBar').clientHeight -\r\n Game.tooltip.tt.clientHeight -\r\n warnOffset -\r\n 46,\r\n )}px`;\r\n }\r\n // Kept for future possible use if the code changes again\r\n /* else if (!Game.onCrate && !Game.OnAscend && CM.Options.TimerBar === 1 && CM.Options.TimerBarPos === 0) {\r\n\t\tGame.tooltip.tta.style.top = (parseInt(Game.tooltip.tta.style.top) + parseInt(CM.Disp.TimerBar.style.height)) + 'px';\r\n\t} */\r\n}\r\n","import { CreateTooltip } from '../../Disp/Tooltips/Tooltip';\r\nimport { TooltipUpgradeBackup } from '../VariablesAndData';\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of upgrades so that it calls CM.Disp.Tooltip()\r\n * CM.Disp.Tooltip() sets the tooltip type to 'u'\r\n * It is called by Game.RebuildUpgrades() through CM.Main.ReplaceNative() and is therefore not permanent like the other ReplaceTooltip functions\r\n */\r\nexport default function ReplaceTooltipUpgrade() {\r\n TooltipUpgradeBackup = [];\r\n Object.keys(Game.UpgradesInStore).forEach((i) => {\r\n if (l(`upgrade${i}`).onmouseover !== null) {\r\n TooltipUpgradeBackup[i] = l(`upgrade${i}`).onmouseover;\r\n l(`upgrade${i}`).onmouseover = function () {\r\n if (!Game.mouseDown) {\r\n Game.setOnCrate(this);\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('u', `${i}`), 'store');\r\n Game.tooltip.wobble();\r\n }\r\n };\r\n }\r\n });\r\n}\r\n","/** Functions related to the Dragon */\r\n\r\nimport CacheDragonCost from '../../Cache/Dragon/Dragon';\r\nimport { CacheCostDragonUpgrade } from '../../Cache/VariablesAndData';\r\nimport CalculateChangeAura from '../../Sim/SimulationEvents/AuraChange';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../BeautifyAndFormatting/FormatTime';\r\n\r\n/**\r\n * This functions adds the two extra lines about CPS and time to recover to the aura picker infoscreen\r\n * @param\t{number}\taura\tThe number of the aura currently selected by the mouse/user\r\n */\r\nexport function AddAuraInfo(aura) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.DragonAuraInfo === 1) {\r\n const [bonusCPS, priceOfChange] = CalculateChangeAura(aura);\r\n const timeToRecover = FormatTime(priceOfChange / (bonusCPS + Game.cookiesPs));\r\n let bonusCPSPercentage;\r\n if (Game.cookiesPs === 0) bonusCPSPercentage = Beautify(Infinity);\r\n else bonusCPSPercentage = Beautify((bonusCPS / Game.cookiesPs) * 100);\r\n\r\n l('dragonAuraInfo').style.minHeight = '60px';\r\n l('dragonAuraInfo').style.margin = '8px';\r\n l('dragonAuraInfo').appendChild(document.createElement('div')).className = 'line';\r\n const div = document.createElement('div');\r\n div.style.minWidth = '200px';\r\n div.style.textAlign = 'center';\r\n div.textContent = `Picking this aura will change CPS by ${Beautify(\r\n bonusCPS,\r\n )} (${bonusCPSPercentage}% of current CPS).`;\r\n l('dragonAuraInfo').appendChild(div);\r\n const div2 = document.createElement('div');\r\n div2.style.minWidth = '200px';\r\n div2.style.textAlign = 'center';\r\n div2.textContent = `It will take ${timeToRecover} to recover the cost.`;\r\n l('dragonAuraInfo').appendChild(div2);\r\n }\r\n}\r\n\r\n/**\r\n * This functions adds a tooltip to the level up button displaying the cost of rebuying all\r\n * It is called by Game.ToggleSpecialMenu() after CM.Main.ReplaceNative()\r\n */\r\nexport function AddDragonLevelUpTooltip() {\r\n // Check if it is the dragon popup that is on screen\r\n if (\r\n (l('specialPopup').className.match(/onScreen/) &&\r\n l('specialPopup').children[0].style.background.match(/dragon/)) !== null\r\n ) {\r\n for (let i = 0; i < l('specialPopup').childNodes.length; i++) {\r\n if (l('specialPopup').childNodes[i].className === 'optionBox') {\r\n l('specialPopup').children[i].onmouseover = function () {\r\n CacheDragonCost();\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(\r\n l('specialPopup'),\r\n `<div style=\"min-width:200px;text-align:center;\">${CacheCostDragonUpgrade}</div>`,\r\n 'this',\r\n );\r\n Game.tooltip.wobble();\r\n };\r\n l('specialPopup').children[i].onmouseout = function () {\r\n Game.tooltip.shouldHide = 1;\r\n };\r\n }\r\n }\r\n }\r\n}\r\n","import { CacheDragonAura, CacheDragonAura2 } from '../../Cache/VariablesAndData';\r\nimport CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport {\r\n SimAchievementsOwned,\r\n SimBuildingsOwned, // eslint-disable-line no-unused-vars\r\n SimCookiesPs,\r\n SimDragonAura,\r\n SimDragonAura2,\r\n SimObjects,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions calculates the cps and cost of changing a Dragon Aura\r\n * It is called by CM.Disp.AddAuraInfo()\r\n * @param\t{number}\t\t\taura\t\t\t\t\t\t\t\t\t\tThe number of the aura currently selected by the mouse/user\r\n * @returns {[number, number]} \t[CM.Sim.cookiesPs - Game.cookiesPs, price]\tThe bonus cps and the price of the change\r\n */\r\nexport default function CalculateChangeAura(aura) {\r\n CopyData();\r\n\r\n // Check if aura being changed is first or second aura\r\n const auraToBeChanged = l('promptContent').children[0].innerHTML.includes('secondary');\r\n if (auraToBeChanged) SimDragonAura2 = aura;\r\n else SimDragonAura = aura;\r\n\r\n // Sell highest building but only if aura is different\r\n let price = 0;\r\n if (SimDragonAura !== CacheDragonAura || SimDragonAura2 !== CacheDragonAura2) {\r\n for (let i = Game.ObjectsById.length - 1; i > -1; --i) {\r\n if (Game.ObjectsById[i].amount > 0) {\r\n const highestBuilding = SimObjects[Game.ObjectsById[i].name].name;\r\n SimObjects[highestBuilding].amount -= 1;\r\n SimBuildingsOwned -= 1;\r\n price =\r\n SimObjects[highestBuilding].basePrice *\r\n Game.priceIncrease **\r\n Math.max(0, SimObjects[highestBuilding].amount - 1 - SimObjects[highestBuilding].free);\r\n price = Game.modifyBuildingPrice(SimObjects[highestBuilding], price);\r\n price = Math.ceil(price);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n return [SimCookiesPs - Game.cookiesPs, price];\r\n}\r\n","import createMenuOptions from './createMenuOptions';\r\nimport AddMenuStats from './Statistics/AddStatsPage';\r\n\r\n/**\r\n * This function adds the calll the functions to add extra info to the stats and options pages\r\n */\r\nexport default function AddMenu() {\r\n const title = document.createElement('div');\r\n title.className = 'title';\r\n\r\n if (Game.onMenu === 'stats') {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Stats) {\r\n title.textContent = 'Cookie Monster Statistics';\r\n AddMenuStats(title);\r\n }\r\n } else if (Game.onMenu === 'prefs') {\r\n // Added because Framework is broken\r\n l('menu').childNodes[2].insertBefore(\r\n createMenuOptions(),\r\n l('menu').childNodes[2].childNodes[l('menu').childNodes[2].childNodes.length - 1],\r\n );\r\n }\r\n}\r\n","/** Functions related to updating the tab in the browser's tab-bar */\r\n\r\nimport { CacheSeasonPopShimmer, CacheSpawnedGoldenShimmer } from '../../Cache/VariablesAndData';\r\n\r\nimport { LastSeasonPopupState, LastTickerFortuneState } from '../../Main/VariablesAndData';\r\nimport { Title } from '../VariablesAndData';\r\n\r\n/**\r\n * This function updates the tab title\r\n * It is called on every loop by Game.Logic() which also sets CM.Disp.Title to Game.cookies\r\n */\r\nexport default function UpdateTitle() {\r\n if (\r\n Game.OnAscend ||\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title === 0\r\n ) {\r\n document.title = Title;\r\n } else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title === 1) {\r\n let addFC = false;\r\n let addSP = false;\r\n let titleGC;\r\n let titleFC;\r\n let titleSP;\r\n\r\n if (CacheSpawnedGoldenShimmer) {\r\n if (CacheSpawnedGoldenShimmer.wrath)\r\n titleGC = `[W${Math.ceil(CacheSpawnedGoldenShimmer.life / Game.fps)}]`;\r\n else titleGC = `[G${Math.ceil(CacheSpawnedGoldenShimmer.life / Game.fps)}]`;\r\n } else if (!Game.Has('Golden switch [off]')) {\r\n titleGC = `[${Number(l('CMTimerBarGCMinBar').textContent) < 0 ? '!' : ''}${Math.ceil(\r\n (Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.time) / Game.fps,\r\n )}]`;\r\n } else titleGC = '[GS]';\r\n\r\n if (LastTickerFortuneState) {\r\n addFC = true;\r\n titleFC = '[F]';\r\n }\r\n\r\n if (Game.season === 'christmas') {\r\n addSP = true;\r\n if (LastSeasonPopupState) titleSP = `[R${Math.ceil(CacheSeasonPopShimmer.life / Game.fps)}]`;\r\n else {\r\n titleSP = `[${Number(l('CMTimerBarRenMinBar').textContent) < 0 ? '!' : ''}${Math.ceil(\r\n (Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.time) / Game.fps,\r\n )}]`;\r\n }\r\n }\r\n\r\n // Remove previous timers and add current cookies\r\n let str = Title;\r\n if (str.charAt(0) === '[') {\r\n str = str.substring(str.lastIndexOf(']') + 1);\r\n }\r\n document.title = `${titleGC + (addFC ? titleFC : '') + (addSP ? titleSP : '')} ${str}`;\r\n } else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title === 2) {\r\n let str = '';\r\n let spawn = false;\r\n if (CacheSpawnedGoldenShimmer) {\r\n spawn = true;\r\n if (CacheSpawnedGoldenShimmer.wrath)\r\n str += `[W${Math.ceil(CacheSpawnedGoldenShimmer.life / Game.fps)}]`;\r\n else str += `[G${Math.ceil(CacheSpawnedGoldenShimmer.life / Game.fps)}]`;\r\n }\r\n if (LastTickerFortuneState) {\r\n spawn = true;\r\n str += '[F]';\r\n }\r\n if (Game.season === 'christmas' && LastSeasonPopupState) {\r\n str += `[R${Math.ceil(CacheSeasonPopShimmer.life / Game.fps)}]`;\r\n spawn = true;\r\n }\r\n if (spawn) str += ' - ';\r\n let title = 'Cookie Clicker';\r\n if (Game.season === 'fools') title = 'Cookie Baker';\r\n str += title;\r\n document.title = str;\r\n }\r\n}\r\n","import {\r\n CacheHCPerSecond,\r\n CacheLastHeavenlyChips,\r\n CacheTimeTillNextPrestige,\r\n} from '../../Cache/VariablesAndData';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\n\r\n/**\r\n * This function creates a header object for tooltips.\r\n * @param\t{string}\ttext\tTitle of header\r\n * @returns {object}\tdiv\t\tAn object containing the stylized header\r\n */\r\nexport default function ReplaceAscendTooltip() {\r\n const cookiesToNext = Math.max(\r\n 0,\r\n Game.HowManyCookiesReset(\r\n Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned)) + 1,\r\n ) -\r\n (Game.cookiesEarned + Game.cookiesReset),\r\n );\r\n\r\n const startDate = Game.sayTime(((Date.now() - Game.startDate) / 1000) * Game.fps, -1);\r\n let str = `You've been on this run for <b>${\r\n startDate === '' ? 'not very long' : startDate\r\n }</b>.<br>\r\n <div class=\"line\"></div>`;\r\n if (Game.prestige > 0) {\r\n str += `Your prestige level is currently <b>${Beautify(Game.prestige)}</b>.<br>(CpS +${Beautify(\r\n Game.prestige,\r\n )}%)\r\n <div class=\"line\"></div>`;\r\n }\r\n if (CacheLastHeavenlyChips < 1) str += 'Ascending now would grant you no prestige.';\r\n else if (CacheLastHeavenlyChips < 2)\r\n str +=\r\n 'Ascending now would grant you<br><b>1 prestige level</b> (+1% CpS)<br>and <b>1 heavenly chip</b> to spend.';\r\n else\r\n str += `Ascending now would grant you<br><b>${Beautify(\r\n CacheLastHeavenlyChips,\r\n )} prestige levels</b> (+${Beautify(CacheLastHeavenlyChips)}% CpS)<br>and <b>${Beautify(\r\n CacheLastHeavenlyChips,\r\n )} heavenly chips</b> to spend.`;\r\n str += `<div class=\"line\"></div>\r\n You need <b>${Beautify(cookiesToNext)} more cookies</b> for the next level.<br>\r\n ${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipAscendButton\r\n ? `<div class='line'></div>It takes ${CacheTimeTillNextPrestige} to reach the next level and you were making ${Beautify(\r\n CacheHCPerSecond,\r\n 2,\r\n )} chips on average in the last 5 seconds.<br>`\r\n : ''\r\n }`;\r\n l('ascendTooltip').innerHTML = str;\r\n}\r\n","import InitCache from '../Cache/CacheInit';\r\nimport { CacheStatsCookies } from '../Cache/Stats/Stats';\r\nimport { VersionMajor, VersionMinor } from '../Data/Moddata';\r\nimport CreateUpgradeBar from '../Disp/BuildingsUpgrades/UpgradeBar';\r\nimport { CreateBotBar } from '../Disp/InfoBars/BottomBar';\r\nimport { CreateTimerBar } from '../Disp/InfoBars/TimerBar';\r\nimport CreateSectionHideButtons from '../Disp/Initialization/CreateSectionHideButtons';\r\nimport CreateWrinklerButtons from '../Disp/Initialization/CreateWrinklerButton';\r\nimport CreateCssArea from '../Disp/Initialization/CssArea';\r\nimport UpdateBuildingUpgradeStyle from '../Disp/Initialization/UpdateBuildingUpgradeStyle';\r\nimport { CreateFavicon } from '../Disp/TabTitle/FavIcon';\r\nimport { CreateSimpleTooltip } from '../Disp/Tooltips/Tooltip';\r\nimport { CMLastAscendState, TooltipText } from '../Disp/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport InitData from '../Sim/InitializeData/InitData';\r\nimport ReplaceNativeGrimoire from './ReplaceGameElements/NativeGrimoire';\r\nimport ReplaceTooltips from './ReplaceGameElements/Tooltips';\r\nimport ReplaceNative from './ReplaceGameFunctions/ReplaceNative';\r\nimport { LastModCount } from './VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport AddWrinklerAreaDetect from './WrinklerArea/AddDetectArea';\r\nimport createBuildingLockButtons from '../Disp/buildingTiles/createBuildingLockButtons';\r\n// import createMenuInfo from '../Disp/MenuSections/createMenuInfo';\r\nimport createMenuOptions from '../Disp/MenuSections/createMenuOptions';\r\n\r\n/**\r\n * Initialization loop of Cookie Monster\r\n */\r\nexport default function InitializeCookieMonster() {\r\n // Create global data object\r\n window.CookieMonsterData = {};\r\n\r\n // Register listeners in Cookie Monster Mod Framework\r\n // Commented because Framework is currently broken\r\n // Game.mods.cookieMonsterFramework.listeners.infoMenu.push(createMenuInfo);\r\n Game.mods.cookieMonsterFramework.listeners.optionsMenu.push(createMenuOptions);\r\n\r\n InitData();\r\n CacheStatsCookies();\r\n InitCache();\r\n\r\n // Stored to check if we need to re-initiliaze data\r\n LastModCount = Object.keys(Game.mods).length;\r\n\r\n // Creating visual elements\r\n CreateCssArea();\r\n CreateBotBar();\r\n CreateTimerBar();\r\n CreateUpgradeBar();\r\n CreateSectionHideButtons();\r\n CreateFavicon();\r\n Object.keys(TooltipText).forEach((i) => {\r\n CreateSimpleTooltip(TooltipText[i][0], TooltipText[i][1], TooltipText[i][2]);\r\n });\r\n CreateWrinklerButtons();\r\n UpdateBuildingUpgradeStyle();\r\n createBuildingLockButtons();\r\n\r\n ReplaceTooltips();\r\n AddWrinklerAreaDetect();\r\n\r\n // Replace native functions\r\n ReplaceNative();\r\n ReplaceNativeGrimoire();\r\n Game.CalculateGains();\r\n\r\n CMLastAscendState = Game.OnAscend;\r\n\r\n if (Game.prefs.popups)\r\n Game.Popup(`Cookie Monster version ${VersionMajor}.${VersionMinor} loaded!`);\r\n else Game.Notify(`Cookie Monster version ${VersionMajor}.${VersionMinor} loaded!`, '', '', 1, 1);\r\n\r\n Game.Win('Third-party');\r\n}\r\n","import { DispCSS } from '../VariablesAndData';\r\n\r\n/**\r\n * This function creates a CSS style that stores certain standard CSS classes used by CookieMonster\r\n\r\n */\r\nexport default function CreateCssArea() {\r\n DispCSS = document.createElement('style');\r\n DispCSS.type = 'text/css';\r\n DispCSS.id = 'CMCSS';\r\n\r\n document.head.appendChild(DispCSS);\r\n}\r\n","import {\r\n ColourBackPre,\r\n ColourBlue,\r\n ColourGray,\r\n ColourGreen,\r\n ColourOrange,\r\n ColourPurple,\r\n ColourRed,\r\n ColourTextPre,\r\n ColourYellow,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function creates the legend for the upgrade bar\r\n * @returns\t{object}\tlegend\tThe legend-object to be added\r\n */\r\nfunction CreateUpgradeBarLegend() {\r\n const legend = document.createElement('div');\r\n legend.style.minWidth = '330px';\r\n legend.style.marginBottom = '4px';\r\n const title = document.createElement('div');\r\n title.className = 'name';\r\n title.style.marginBottom = '4px';\r\n title.textContent = 'Legend';\r\n legend.appendChild(title);\r\n\r\n const legendLine = function (colour, text) {\r\n const div = document.createElement('div');\r\n div.style.verticalAlign = 'middle';\r\n const span = document.createElement('span');\r\n span.className = ColourBackPre + colour;\r\n span.style.display = 'inline-block';\r\n span.style.height = '10px';\r\n span.style.width = '10px';\r\n span.style.marginRight = '4px';\r\n div.appendChild(span);\r\n div.appendChild(document.createTextNode(text));\r\n return div;\r\n };\r\n\r\n legend.appendChild(legendLine(ColourBlue, 'Better than the best PP of a building option'));\r\n legend.appendChild(legendLine(ColourGreen, 'Same as the best PP building option'));\r\n legend.appendChild(legendLine(ColourYellow, 'Within the top 10 of PP for buildings'));\r\n legend.appendChild(legendLine(ColourOrange, 'Within the top 20 of PP for buildings'));\r\n legend.appendChild(legendLine(ColourRed, 'Within the top 30 of PP for buildings'));\r\n legend.appendChild(legendLine(ColourPurple, 'Outside of the top 30 of PP for buildings'));\r\n legend.appendChild(legendLine(ColourGray, 'Negative or infinity PP'));\r\n return legend;\r\n}\r\n\r\n/**\r\n * This function creates the upgrade bar above the upgrade-section in the right section of the screen\r\n */\r\nexport default function CreateUpgradeBar() {\r\n const UpgradeBar = document.createElement('div');\r\n UpgradeBar.id = 'CMUpgradeBar';\r\n UpgradeBar.style.width = '100%';\r\n UpgradeBar.style.backgroundColor = 'black';\r\n UpgradeBar.style.textAlign = 'center';\r\n UpgradeBar.style.fontWeight = 'bold';\r\n UpgradeBar.style.display = 'none';\r\n UpgradeBar.style.zIndex = '21';\r\n UpgradeBar.onmouseout = function () {\r\n Game.tooltip.hide();\r\n };\r\n\r\n const placeholder = document.createElement('div');\r\n placeholder.appendChild(CreateUpgradeBarLegend());\r\n UpgradeBar.onmouseover = function () {\r\n Game.tooltip.draw(this, escape(placeholder.innerHTML), 'store');\r\n };\r\n\r\n const upgradeNumber = function (id, colour) {\r\n const span = document.createElement('span');\r\n span.id = id;\r\n span.className = ColourTextPre + colour;\r\n span.style.width = '14.28571428571429%';\r\n span.style.display = 'inline-block';\r\n span.textContent = '0';\r\n return span;\r\n };\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarBlue', ColourBlue));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarGreen', ColourGreen));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarYellow', ColourYellow));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarOrange', ColourOrange));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarRed', ColourRed));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarPurple', ColourPurple));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarGray', ColourGray));\r\n\r\n l('upgrades').parentNode.insertBefore(UpgradeBar, l('upgrades').parentNode.childNodes[3]);\r\n}\r\n","/**\r\n * This function creates two objects at the top of the right column that allowing hiding the upgrade and building section\r\n */\r\nexport default function CreateSectionHideButtons() {\r\n const div = document.createElement('div');\r\n div.id = 'CMSectionHidButtons';\r\n div.style.textAlign = 'center';\r\n const a = document.createElement('a');\r\n a.className = 'option';\r\n a.onclick = function () {\r\n if (l('upgrades').style.display === 'flex') {\r\n l('upgrades').style.display = 'none';\r\n l('toggleUpgrades').style.display = 'none';\r\n l('techUpgrades').style.display = 'none';\r\n l('vaultUpgrades').style.display = 'none';\r\n } else {\r\n l('upgrades').style.display = 'flex';\r\n if (l('toggleUpgrades').children.length !== 0) l('toggleUpgrades').style.display = 'block';\r\n if (l('techUpgrades').children.length !== 0) l('techUpgrades').style.display = 'block';\r\n if (l('vaultUpgrades').children.length !== 0) l('vaultUpgrades').style.display = 'block';\r\n }\r\n };\r\n a.textContent = 'Hide/Show Upgrades';\r\n div.appendChild(a);\r\n const b = document.createElement('a');\r\n b.className = 'option';\r\n b.onclick = function () {\r\n if (l('products').style.display === 'grid') l('products').style.display = 'none';\r\n else l('products').style.display = 'grid';\r\n };\r\n b.textContent = 'Hide/Show Buildings';\r\n div.appendChild(b);\r\n l('store').insertBefore(div, l('store').childNodes[2]);\r\n}\r\n","import { CacheWrinklersFattest } from '../../Cache/VariablesAndData';\r\nimport PopAllNormalWrinklers from '../HelperFunctions/PopWrinklers';\r\nimport { CreateTooltip } from '../Tooltips/Tooltip';\r\n\r\n/**\r\n * This function creates two objects at the bottom of the left column that allowing popping of wrinklers\r\n */\r\nexport default function CreateWrinklerButtons() {\r\n const popAllA = document.createElement('a');\r\n popAllA.id = 'PopAllNormalWrinklerButton';\r\n popAllA.textContent = 'Pop All Normal';\r\n popAllA.className = 'option';\r\n popAllA.onclick = function () {\r\n PopAllNormalWrinklers();\r\n };\r\n popAllA.onmouseout = function () {\r\n Game.tooltip.shouldHide = 1;\r\n };\r\n popAllA.onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('wb', 'PopAllNormal'), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n l('sectionLeftExtra').children[0].append(popAllA);\r\n const popFattestA = document.createElement('a');\r\n popFattestA.id = 'PopFattestWrinklerButton';\r\n popFattestA.textContent = 'Pop Single Fattest';\r\n popFattestA.className = 'option';\r\n popFattestA.onclick = function () {\r\n if (CacheWrinklersFattest[1] !== null) Game.wrinklers[CacheWrinklersFattest[1]].hp = 0;\r\n };\r\n popFattestA.onmouseout = function () {\r\n Game.tooltip.shouldHide = 1;\r\n };\r\n popFattestA.onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('wb', 'PopFattest'), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n l('sectionLeftExtra').children[0].append(popFattestA);\r\n}\r\n","/**\r\n * This function updates the style of the building and upgrade sections to make these sortable\r\n */\r\nexport default function UpdateBuildingUpgradeStyle() {\r\n l('products').style.display = 'grid';\r\n l('storeBulk').style.gridRow = '1/1';\r\n\r\n l('upgrades').style.display = 'flex';\r\n l('upgrades').style['flex-wrap'] = 'wrap';\r\n}\r\n","import toggleBuildingLock from './toggleBuildingLock';\r\n\r\n/**\r\n * This function adds a lock button to the \"building view\" in the middle section\r\n */\r\nexport default function createBuildingLockButtons() {\r\n Object.keys(l('rows').children).forEach((index) => {\r\n const productButtons = l('rows').children[index].children[1];\r\n const button = document.createElement('div');\r\n button.id = `productLock${Number(index) + 1}`;\r\n button.className = 'productButton';\r\n button.innerHTML = 'Lock';\r\n button.onclick = function () {\r\n toggleBuildingLock(Number(index) + 1);\r\n };\r\n productButtons.appendChild(button);\r\n });\r\n}\r\n","/**\r\n * This function toggle the locked state of a building\r\n * @param\t{number}\tindex\tIndex of the row to change\r\n */\r\nexport default function toggleBuildingLock(index) {\r\n if (l(`productLock${index}`).innerHTML === 'Lock') {\r\n // Add to storing array\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.push(\r\n index.toString(),\r\n );\r\n\r\n // Update styles\r\n l(`row${index}`).style.pointerEvents = 'none';\r\n l(`row${index}`).style.opacity = '0.4';\r\n l(`productLock${index}`).innerHTML = 'Unlock';\r\n l(`productLock${index}`).style.pointerEvents = 'auto';\r\n } else {\r\n // Remove from storing array\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.includes(\r\n index.toString(),\r\n )\r\n ) {\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.filter(\r\n (value) => value !== index.toString(),\r\n );\r\n }\r\n\r\n // Update styles\r\n l(`productLock${index}`).innerHTML = 'Lock';\r\n l(`row${index}`).style.pointerEvents = 'auto';\r\n l(`row${index}`).style.opacity = '1';\r\n }\r\n}\r\n","/** Functions related to replacing tooltips */\r\n\r\nimport { CreateTooltip } from '../../Disp/Tooltips/Tooltip';\r\nimport { LoadMinigames, TooltipBuildBackup, TooltipLumpBackup } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport ReplaceNativeGrimoire from './NativeGrimoire';\r\nimport ReplaceTooltipGrimoire from './TooltipGrimoire';\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of buildings\r\n */\r\nfunction ReplaceTooltipBuild() {\r\n Object.keys(Game.Objects).forEach((i) => {\r\n const me = Game.Objects[i];\r\n if (l(`product${me.id}`).onmouseover !== null) {\r\n TooltipBuildBackup[i] = l(`product${me.id}`).onmouseover;\r\n l(`product${me.id}`).onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('b', `${i}`), 'store');\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of sugar lumps\r\n */\r\nfunction ReplaceTooltipLump() {\r\n if (Game.canLumps()) {\r\n TooltipLumpBackup = l('lumps').onmouseover;\r\n l('lumps').onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('s', 'Lump'), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of all garden plants\r\n */\r\nfunction ReplaceTooltipGarden() {\r\n if (Game.Objects.Farm.minigameLoaded) {\r\n l('gardenTool-1').onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('ha', 'HarvestAllButton'), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n Array.from(l('gardenPlot').children).forEach((child) => {\r\n const coords = child.id.slice(-3);\r\n // eslint-disable-next-line no-param-reassign\r\n child.onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('p', [`${coords[0]}`, `${coords[2]}`]), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n });\r\n }\r\n}\r\n\r\nfunction ReplaceTooltipPantheon() {\r\n if (Game.Objects.Temple.minigameLoaded) {\r\n for (let i = 0; i < 11; i += 1) {\r\n l(`templeGod${i}`).onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('pag', i), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n for (let i = 0; i < 3; i += 1) {\r\n l(`templeSlot${i}`).onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(\r\n this,\r\n () => CreateTooltip('pas', [i, Game.Objects.Temple.minigame.slot[i]]),\r\n 'this',\r\n );\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * This function call all functions that replace Game-tooltips with Cookie Monster enhanced tooltips\r\n */\r\nexport default function ReplaceTooltips() {\r\n ReplaceTooltipBuild();\r\n ReplaceTooltipLump();\r\n\r\n // Replace Tooltips of Minigames. Nesting it in LoadMinigames makes sure to replace them even if\r\n // they were not loaded initially\r\n // eslint-disable-next-line prefer-destructuring\r\n LoadMinigames = Game.LoadMinigames;\r\n Game.LoadMinigames = function () {\r\n LoadMinigames();\r\n ReplaceTooltipGarden();\r\n ReplaceTooltipGrimoire();\r\n ReplaceTooltipPantheon();\r\n ReplaceNativeGrimoire();\r\n };\r\n Game.LoadMinigames();\r\n}\r\n","import { TooltipWrinklerArea, TooltipWrinklerBeingShown } from '../../Disp/VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This function creates .onmouseover/out events that determine if the mouse is hovering-over a Wrinkler\r\n * As wrinklers are not appended to the DOM we us a different system than for other tooltips\r\n */\r\nexport default function AddWrinklerAreaDetect() {\r\n l('backgroundLeftCanvas').onmouseover = function () {\r\n TooltipWrinklerArea = 1;\r\n };\r\n l('backgroundLeftCanvas').onmouseout = function () {\r\n TooltipWrinklerArea = 0;\r\n Game.tooltip.hide();\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n TooltipWrinklerBeingShown[i] = 0;\r\n });\r\n };\r\n}\r\n","import CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport { SimAchievementsOwned, SimCookiesPs, SimGod1, SimGod2, SimGod3 } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This functions calculates the cps and cost of changing a Dragon Aura\r\n * It is called by CM.Disp.AddAuraInfo()\r\n * @param\t{number}\tgod\t\tThe number of the slot to be swapped in\r\n * @param\t{number slot\tThe slot the god will go to\r\n * @returns {number} \tCM.Sim.cookiesPs - Game.cookiesPs The bonus cps and the price of the change\r\n */\r\nexport default function CalculateChangeGod(god, slot) {\r\n if (!Game.Objects.Temple.minigameLoaded) return 0;\r\n CopyData();\r\n const { minigame } = Game.Objects.Temple;\r\n const CurrentSlot = minigame.godsById[god].slot;\r\n if (CurrentSlot === '0') SimGod1 = minigame.slot[slot];\r\n else if (CurrentSlot === '1') SimGod2 = minigame.slot[slot];\r\n else if (CurrentSlot === '2') SimGod3 = minigame.slot[slot];\r\n /* eslint-disable no-unused-vars */\r\n if (slot === 0) SimGod1 = god;\r\n else if (slot === 1) SimGod2 = god;\r\n else if (slot === 2) SimGod3 = god;\r\n /* eslint-enable no-unused-vars */\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n return SimCookiesPs - Game.cookiesPs;\r\n}\r\n","import InitCache from '../Cache/CacheInit';\r\nimport LoopCache from '../Cache/CacheLoop';\r\nimport CacheNoGoldSwitchCPS from '../Cache/CPS/NoGoldSwitchCPS';\r\nimport CacheSellAllForChoEgg from '../Cache/CPS/SellChoEgg';\r\nimport CacheDragonCost from '../Cache/Dragon/Dragon';\r\nimport CachePantheonGods from '../Cache/PantheonGods/CacheGods';\r\nimport { CacheBuildingsPrices, CacheIncome } from '../Cache/PriceAndIncome/PriceAndIncome';\r\nimport { CacheChain } from '../Cache/Stats/ChainCookies';\r\nimport CacheAllMissingUpgrades from '../Cache/Stats/MissingUpgrades';\r\nimport CacheSeasonSpec from '../Cache/Stats/Reindeer';\r\nimport { CacheGoldenAndWrathCookiesMults, CacheStatsCookies } from '../Cache/Stats/Stats';\r\nimport AllAmountTillNextAchievement from '../Cache/TillNextAchievement/AllAmountTillNextAchievement';\r\nimport { CacheDoRemakeBuildPrices, CacheHadBuildAura } from '../Cache/VariablesAndData';\r\nimport UpdateAscendState from '../Disp/HelperFunctions/UpdateAscendState';\r\nimport { LastAscendState } from '../Disp/VariablesAndData';\r\nimport InitData from '../Sim/InitializeData/InitData';\r\nimport { SimDoSims } from '../Sim/VariablesAndData';\r\nimport CheckGardenTick from './CheckStates/Garden';\r\nimport CheckGoldenCookie from './CheckStates/GoldenCookie';\r\nimport CheckMagicMeter from './CheckStates/Grimoire';\r\nimport CheckSeasonPopup from './CheckStates/Season';\r\nimport CheckTickerFortune from './CheckStates/Ticker';\r\nimport CheckWrinklerCount from './CheckStates/Wrinkler';\r\nimport { LastModCount } from './VariablesAndData';\r\n\r\n/**\r\n * Main loop of Cookie Monster\r\n * CM.init registers it to the \"logic\" hook provided by the modding api\r\n */\r\nexport default function CMLoopHook() {\r\n if (LastAscendState !== Game.OnAscend) {\r\n LastAscendState = Game.OnAscend;\r\n UpdateAscendState();\r\n }\r\n if (!Game.OnAscend && Game.AscendTimer === 0) {\r\n // Check if any other mods have been loaded\r\n if (LastModCount !== Object.keys(Game.mods).length) {\r\n InitData();\r\n InitCache();\r\n LastModCount = Object.keys(Game.mods).length;\r\n }\r\n\r\n // CM.Sim.DoSims is set whenever CPS has changed\r\n if (SimDoSims) {\r\n AllAmountTillNextAchievement(true);\r\n CacheIncome();\r\n\r\n CacheNoGoldSwitchCPS(); // Needed first\r\n CacheGoldenAndWrathCookiesMults();\r\n CacheStatsCookies();\r\n CacheAllMissingUpgrades();\r\n CacheChain();\r\n CacheDragonCost();\r\n CachePantheonGods();\r\n\r\n CacheSeasonSpec();\r\n CacheSellAllForChoEgg();\r\n\r\n SimDoSims = 0;\r\n }\r\n\r\n // Check for aura change to recalculate buildings prices\r\n const hasBuildAura = Game.auraMult('Fierce Hoarder') > 0;\r\n if (!CacheHadBuildAura && hasBuildAura) {\r\n CacheHadBuildAura = true;\r\n CacheDoRemakeBuildPrices = 1;\r\n } else if (CacheHadBuildAura && !hasBuildAura) {\r\n CacheHadBuildAura = false;\r\n CacheDoRemakeBuildPrices = 1;\r\n }\r\n\r\n if (CacheDoRemakeBuildPrices) {\r\n CacheBuildingsPrices();\r\n CacheDoRemakeBuildPrices = 0;\r\n }\r\n\r\n LoopCache();\r\n\r\n // Check all changing minigames and game-states\r\n CheckTickerFortune();\r\n CheckSeasonPopup();\r\n CheckGardenTick();\r\n CheckMagicMeter();\r\n CheckWrinklerCount();\r\n }\r\n // To remove Timers when ascending\r\n CheckGoldenCookie();\r\n}\r\n","import { ToggleTimerBar } from '../../Config/SpecificToggles';\r\nimport ToggleBotBar from '../../Config/Toggles/ToggleBotBar';\r\n\r\nimport UpdateBackground from './UpdateBackground';\r\n\r\n/**\r\n * This function disables and shows the bars created by CookieMonster when the game is \"ascending\"\r\n * It is called by CM.Disp.Draw()\r\n */\r\nexport default function UpdateAscendState() {\r\n if (Game.OnAscend) {\r\n l('game').style.bottom = '0px';\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1)\r\n l('CMBotBar').style.display = 'none';\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1)\r\n l('CMTimerBar').style.display = 'none';\r\n } else {\r\n ToggleBotBar();\r\n ToggleTimerBar();\r\n }\r\n UpdateBackground();\r\n}\r\n","import CalcNoGoldSwitchCPS from '../../Sim/Calculations/NoGoldenSwitchCalc';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheNoGoldSwitchCookiesPS } from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates CPS without the Golden Switch as it might be needed in other functions\r\n * If so it CM.Sim.Win()'s them and the caller function will know to recall CM.Sim.CalculateGains()\r\n * It is called at the end of any functions that simulates certain behaviour\r\n */\r\nexport default function CacheNoGoldSwitchCPS() {\r\n if (Game.Has('Golden switch [off]')) {\r\n CacheNoGoldSwitchCookiesPS = CalcNoGoldSwitchCPS();\r\n } else CacheNoGoldSwitchCookiesPS = Game.cookiesPs;\r\n\r\n FillCMDCache({ CacheNoGoldSwitchCookiesPS });\r\n}\r\n","import CopyData from '../SimulationData/CopyData';\r\nimport { SimCookiesPs, SimUpgrades } from '../VariablesAndData';\r\nimport CalculateGains from './CalculateGains';\r\n\r\n/**\r\n * This function calculates CPS without the Golden Switch\r\n * It is called by CM.Cache.NoGoldSwitchCPS()\r\n */\r\nexport default function CalcNoGoldSwitchCPS() {\r\n CopyData();\r\n SimUpgrades['Golden switch [off]'].bought = 0;\r\n CalculateGains();\r\n return SimCookiesPs;\r\n}\r\n","import CalculateChangeGod from '../../Sim/SimulationEvents/GodChange';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheGods } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the cps effect of each God in slot 1, 2 or 3\r\n */\r\nexport default function CachePantheonGods() {\r\n for (let god = 0; god < 11; god += 1) {\r\n for (let slot = 0; slot < 3; slot += 1) {\r\n CacheGods[god][slot] = CalculateChangeGod(god, slot);\r\n }\r\n }\r\n\r\n FillCMDCache({ CacheGods });\r\n}\r\n","import SellBuildingsForChoEgg from '../../Sim/SimulationEvents/SellBuildingForChoEgg';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheSellForChoEgg } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the reward for selling the Chocolate egg\r\n * It is called by CM.Main.Loop()\r\n * @global\t{number}\tCM.Cache.SellForChoEgg\tTotal cookies to be gained from selling Chocolate egg\r\n */\r\nexport default function CacheSellAllForChoEgg() {\r\n let sellTotal = 0;\r\n // Compute cookies earned by selling stock market goods\r\n if (Game.Objects.Bank.minigameLoaded) {\r\n const marketGoods = Game.Objects.Bank.minigame.goods;\r\n let goodsVal = 0;\r\n Object.keys(marketGoods).forEach((i) => {\r\n const marketGood = marketGoods[i];\r\n goodsVal += marketGood.stock * marketGood.val;\r\n });\r\n sellTotal += goodsVal * Game.cookiesPsRawHighest;\r\n }\r\n // Compute cookies earned by selling all buildings with optimal auras (ES + RB)\r\n sellTotal += SellBuildingsForChoEgg();\r\n CacheSellForChoEgg = sellTotal;\r\n\r\n FillCMDCache({ CacheSellForChoEgg });\r\n}\r\n","import CopyData from '../SimulationData/CopyData';\r\nimport { SimBuildingsOwned, SimDragonAura, SimDragonAura2, SimObjects } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport BuildingSell from './SellBuilding';\r\n\r\n/**\r\n * This function calculates the maximum cookies obtained from selling buildings just before purchasing the chocolate egg\r\n * It is called by CM.Cache.CacheSellForChoEgg()\r\n * @returns\t{number}\tsellTotal\tThe maximum cookies to be earned\r\n */\r\nexport default function SellBuildingsForChoEgg() {\r\n let sellTotal = 0;\r\n\r\n CopyData();\r\n\r\n // Change auras to Earth Shatterer + Reality bending to optimize money made by selling\r\n let buildingsToSacrifice = 2;\r\n if (SimDragonAura === 5 || SimDragonAura === 18) {\r\n buildingsToSacrifice -= 1;\r\n }\r\n if (SimDragonAura2 === 5 || SimDragonAura2 === 18) {\r\n buildingsToSacrifice -= 1;\r\n }\r\n SimDragonAura = 5;\r\n SimDragonAura2 = 18;\r\n\r\n // Sacrifice highest buildings for the aura switch\r\n for (let i = 0; i < buildingsToSacrifice; ++i) {\r\n let highestBuilding = 'Cursor';\r\n Object.keys(SimObjects).forEach((j) => {\r\n if (SimObjects[j].amount > 0) {\r\n highestBuilding = j;\r\n }\r\n });\r\n SimObjects[highestBuilding].amount -= 1;\r\n SimBuildingsOwned -= 1;\r\n }\r\n\r\n // Get money made by selling all remaining buildings\r\n Object.keys(SimObjects).forEach((i) => {\r\n const me = SimObjects[i];\r\n sellTotal += BuildingSell(\r\n Game.Objects[me.name],\r\n Game.Objects[i].basePrice,\r\n me.amount,\r\n Game.Objects[i].free,\r\n me.amount,\r\n );\r\n });\r\n\r\n return sellTotal;\r\n}\r\n","import FormatTime from '../Disp/BeautifyAndFormatting/FormatTime';\r\nimport GetCPS from '../Disp/HelperFunctions/GetCPS';\r\nimport CacheAvgCPS from './CPS/CPS';\r\nimport CacheCurrWrinklerCPS from './CPS/CurrWrinklerCPS';\r\nimport CachePP from './PP/PP';\r\nimport CacheHeavenlyChipsPS from './Stats/HeavenlyChips';\r\nimport AllAmountTillNextAchievement from './TillNextAchievement/AllAmountTillNextAchievement';\r\nimport { CacheTimeTillNextPrestige } from './VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport CacheWrinklers from './Wrinklers/Wrinklers';\r\n\r\n/**\r\n * This functions caches variables that are needed every loop\r\n * @global\t{string}\tCM.Cache.TimeTillNextPrestige\tTime requried till next prestige level\r\n */\r\nexport default function LoopCache() {\r\n // Update Wrinkler Bank\r\n CacheWrinklers();\r\n\r\n CachePP();\r\n AllAmountTillNextAchievement(false);\r\n CacheCurrWrinklerCPS();\r\n CacheAvgCPS();\r\n CacheHeavenlyChipsPS();\r\n\r\n const cookiesToNext =\r\n Game.HowManyCookiesReset(\r\n Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned)) + 1,\r\n ) -\r\n (Game.cookiesEarned + Game.cookiesReset);\r\n CacheTimeTillNextPrestige = FormatTime(cookiesToNext / GetCPS());\r\n}\r\n","import { SimObjects } from '../../Sim/VariablesAndData';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheCurrWrinklerCount, CacheCurrWrinklerCPSMult } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the current Wrinkler CPS multiplier\r\n * @global\t{number}\tCM.Cache.CurrWrinklerCount\t\tCurrent number of wrinklers\r\n * @global\t{number}\tCM.Cache.CurrWrinklerCPSMult\tCurrent multiplier of CPS because of wrinklers (excluding their negative sucking effect)\r\n */\r\nexport default function CacheCurrWrinklerCPS() {\r\n CacheCurrWrinklerCPSMult = 0;\r\n let count = 0;\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n if (Game.wrinklers[i].phase === 2) count += 1;\r\n });\r\n let godMult = 1;\r\n if (SimObjects.Temple.minigameLoaded) {\r\n const godLvl = Game.hasGod('scorn');\r\n if (godLvl === 1) godMult *= 1.15;\r\n else if (godLvl === 2) godMult *= 1.1;\r\n else if (godLvl === 3) godMult *= 1.05;\r\n }\r\n CacheCurrWrinklerCount = count;\r\n CacheCurrWrinklerCPSMult =\r\n count *\r\n (count * 0.05 * 1.1) *\r\n (Game.Has('Sacrilegious corruption') * 0.05 + 1) *\r\n (Game.Has('Wrinklerspawn') * 0.05 + 1) *\r\n godMult;\r\n\r\n FillCMDCache({ CacheCurrWrinklerCount, CacheCurrWrinklerCPSMult });\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { LastTickerFortuneState } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if there is a fortune cookie on the ticker\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckTickerFortune() {\r\n if (LastTickerFortuneState !== (Game.TickerEffect && Game.TickerEffect.type === 'fortune')) {\r\n LastTickerFortuneState = Game.TickerEffect && Game.TickerEffect.type === 'fortune';\r\n if (LastTickerFortuneState) {\r\n nF.createFlash('cookieMonsterMod', 3, 'FortuneFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FortuneSoundURL,\r\n 'FortuneSound',\r\n 'FortuneVolume',\r\n false,\r\n );\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'FortuneNotification',\r\n 'Fortune Cookie found',\r\n 'A Fortune Cookie has appeared on the Ticker.',\r\n );\r\n }\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { CacheSeasonPopShimmer } from '../../Cache/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport { LastSeasonPopupState } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if there is reindeer that has spawned\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckSeasonPopup() {\r\n if (LastSeasonPopupState !== Game.shimmerTypes.reindeer.spawned) {\r\n LastSeasonPopupState = Game.shimmerTypes.reindeer.spawned;\r\n Object.keys(Game.shimmers).forEach((i) => {\r\n if (Game.shimmers[i].spawnLead && Game.shimmers[i].type === 'reindeer') {\r\n CacheSeasonPopShimmer = Game.shimmers[i];\r\n }\r\n });\r\n nF.createFlash('cookieMonsterMod', 3, 'SeaFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SeaSoundURL,\r\n 'SeaSound',\r\n 'SeaVolume',\r\n false,\r\n );\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'SeaNotification',\r\n 'Reindeer sighted!',\r\n 'A Reindeer has spawned. Click it now!',\r\n );\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { LastGardenNextStep } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if a garden tick has happened\r\n */\r\nexport default function CheckGardenTick() {\r\n if (\r\n Game.Objects.Farm.minigameLoaded &&\r\n LastGardenNextStep !== Game.Objects.Farm.minigame.nextStep\r\n ) {\r\n if (LastGardenNextStep !== 0 && LastGardenNextStep < Date.now()) {\r\n nF.createFlash('cookieMonsterMod', 3, 'GardFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GardSoundURL,\r\n 'GardSound',\r\n 'GardVolume',\r\n false,\r\n );\r\n }\r\n LastGardenNextStep = Game.Objects.Farm.minigame.nextStep;\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { LastMagicBarFull } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if the magic meter is full\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckMagicMeter() {\r\n if (\r\n Game.Objects['Wizard tower'].minigameLoaded &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GrimoireBar === 1\r\n ) {\r\n const { minigame } = Game.Objects['Wizard tower'];\r\n if (minigame.magic < minigame.magicM) LastMagicBarFull = false;\r\n else if (!LastMagicBarFull) {\r\n LastMagicBarFull = true;\r\n nF.createFlash('cookieMonsterMod', 3, 'MagicFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MagicSoundURL,\r\n 'MagicSound',\r\n 'MagicVolume',\r\n false,\r\n );\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'MagicNotification',\r\n 'Magic Meter full',\r\n 'Your Magic Meter is full. Cast a spell!',\r\n );\r\n }\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { LastWrinklerCount } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if any new Wrinklers have popped up\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckWrinklerCount() {\r\n if (Game.elderWrath > 0) {\r\n let CurrentWrinklers = 0;\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n if (Game.wrinklers[i].phase === 2) CurrentWrinklers += 1;\r\n });\r\n if (CurrentWrinklers > LastWrinklerCount) {\r\n LastWrinklerCount = CurrentWrinklers;\r\n if (\r\n CurrentWrinklers === Game.getWrinklersMax() &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxFlash\r\n ) {\r\n nF.createFlash('cookieMonsterMod', 3, 'WrinklerMaxFlash', false);\r\n } else {\r\n nF.createFlash('cookieMonsterMod', 3, 'WrinklerFlash', false);\r\n }\r\n if (\r\n CurrentWrinklers === Game.getWrinklersMax() &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxSound\r\n ) {\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxSoundURL,\r\n 'WrinklerMaxSound',\r\n 'WrinklerMaxVolume',\r\n false,\r\n );\r\n } else {\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerSoundURL,\r\n 'WrinklerSound',\r\n 'WrinklerVolume',\r\n false,\r\n );\r\n }\r\n if (\r\n CurrentWrinklers === Game.getWrinklersMax() &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxNotification\r\n ) {\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'WrinklerMaxNotification',\r\n 'Maximum Wrinklers Reached',\r\n 'You have reached your maximum ammount of wrinklers',\r\n );\r\n } else {\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'WrinklerNotification',\r\n 'A Wrinkler appeared',\r\n 'A new wrinkler has appeared',\r\n );\r\n }\r\n } else {\r\n LastWrinklerCount = CurrentWrinklers;\r\n }\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { CacheSpawnedGoldenShimmer, CacheGoldenShimmersByID } from '../../Cache/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport CreateGCTimer from '../../Disp/GoldenCookieTimers/GoldenCookieTimers';\r\nimport { UpdateFavicon } from '../../Disp/TabTitle/FavIcon';\r\nimport { GCTimers } from '../../Disp/VariablesAndData';\r\nimport {\r\n CurrSpawnedGoldenCookieState,\r\n LastGoldenCookieState,\r\n LastSpawnedGoldenCookieState,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * Auxilirary function that finds all currently spawned shimmers.\r\n * CM.Cache.spawnedGoldenShimmer stores the non-user spawned cookie to later determine data for the favicon and tab-title\r\n * It is called by CM.CM.Main.CheckGoldenCookie\r\n */\r\nfunction FindShimmer() {\r\n CurrSpawnedGoldenCookieState = 0;\r\n CacheGoldenShimmersByID = {};\r\n Object.keys(Game.shimmers).forEach((i) => {\r\n CacheGoldenShimmersByID[Game.shimmers[i].id] = Game.shimmers[i];\r\n if (Game.shimmers[i].spawnLead && Game.shimmers[i].type === 'golden') {\r\n CacheSpawnedGoldenShimmer = Game.shimmers[i];\r\n CurrSpawnedGoldenCookieState += 1;\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * This function checks for changes in the amount of Golden Cookies\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckGoldenCookie() {\r\n FindShimmer();\r\n Object.keys(GCTimers).forEach((i) => {\r\n if (typeof CacheGoldenShimmersByID[i] === 'undefined') {\r\n GCTimers[i].parentNode.removeChild(GCTimers[i]);\r\n delete GCTimers[i];\r\n }\r\n });\r\n if (LastGoldenCookieState !== Game.shimmerTypes.golden.n) {\r\n LastGoldenCookieState = Game.shimmerTypes.golden.n;\r\n if (LastGoldenCookieState) {\r\n if (LastSpawnedGoldenCookieState < CurrSpawnedGoldenCookieState) {\r\n nF.createFlash('cookieMonsterMod', 3, 'GCFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCSoundURL,\r\n 'GCSound',\r\n 'GCVolume',\r\n false,\r\n );\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'GCNotification',\r\n 'Golden Cookie Spawned',\r\n 'A Golden Cookie has spawned. Click it now!',\r\n );\r\n }\r\n\r\n Object.keys(Game.shimmers).forEach((i) => {\r\n if (typeof GCTimers[Game.shimmers[i].id] === 'undefined') {\r\n CreateGCTimer(Game.shimmers[i]);\r\n }\r\n });\r\n }\r\n UpdateFavicon();\r\n LastSpawnedGoldenCookieState = CurrSpawnedGoldenCookieState;\r\n if (CurrSpawnedGoldenCookieState === 0) CacheSpawnedGoldenShimmer = 0;\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer === 1 &&\r\n LastGoldenCookieState\r\n ) {\r\n Object.keys(GCTimers).forEach((i) => {\r\n GCTimers[i].style.opacity = CacheGoldenShimmersByID[i].l.style.opacity;\r\n GCTimers[i].style.transform = CacheGoldenShimmersByID[i].l.style.transform;\r\n GCTimers[i].textContent = Math.ceil(CacheGoldenShimmersByID[i].life / Game.fps);\r\n });\r\n }\r\n}\r\n","/** Section: Functions related to the Golden Cookie Timers */\r\n\r\nimport { GCTimers } from '../VariablesAndData';\r\n\r\n/**\r\n * This function creates a new Golden Cookie Timer and appends it CM.Disp.GCTimers based on the id of the cookie\r\n * @param\t{object}\tcookie\tA Golden Cookie object\r\n */\r\nexport default function CreateGCTimer(cookie) {\r\n const GCTimer = document.createElement('div');\r\n GCTimer.id = `GCTimer${cookie.id}`;\r\n GCTimer.style.width = '96px';\r\n GCTimer.style.height = '96px';\r\n GCTimer.style.position = 'absolute';\r\n GCTimer.style.zIndex = '10000000001';\r\n GCTimer.style.textAlign = 'center';\r\n GCTimer.style.lineHeight = '96px';\r\n GCTimer.style.fontFamily = '\"Kavoon\", Georgia, serif';\r\n GCTimer.style.fontSize = '35px';\r\n GCTimer.style.cursor = 'pointer';\r\n GCTimer.style.display = 'block';\r\n GCTimer.style.pointerEvents = 'none';\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer === 0)\r\n GCTimer.style.display = 'none';\r\n GCTimer.style.left = cookie.l.style.left;\r\n GCTimer.style.top = cookie.l.style.top;\r\n GCTimer.onclick = function () {\r\n cookie.pop();\r\n };\r\n GCTimer.onmouseover = function () {\r\n cookie.l.style.filter = 'brightness(125%) drop-shadow(0px 0px 3px rgba(255,255,255,1))'; // eslint-disable-line no-param-reassign\r\n cookie.l.style.webkitFilter = 'brightness(125%) drop-shadow(0px 0px 3px rgba(255,255,255,1))'; // eslint-disable-line no-param-reassign\r\n };\r\n GCTimer.onmouseout = function () {\r\n cookie.l.style.filter = ''; // eslint-disable-line no-param-reassign\r\n cookie.l.style.webkitFilter = ''; // eslint-disable-line no-param-reassign\r\n };\r\n\r\n GCTimers[cookie.id] = GCTimer;\r\n l('shimmers').appendChild(GCTimer);\r\n}\r\n","/** This includes all headers of Cookie Monster and their relevant data */\r\nconst headers = {\r\n Favourite: 1,\r\n Calculation: 1,\r\n Notation: 1,\r\n Colours: 1,\r\n BarsDisplay: 1,\r\n Tooltip: 1,\r\n Statistics: 1,\r\n Notification: 1,\r\n NotificationGeneral: 1,\r\n NotificationGC: 1,\r\n NotificationFC: 1,\r\n NotificationSea: 1,\r\n NotificationGard: 1,\r\n NotificationMagi: 1,\r\n NotificationWrink: 1,\r\n NotificationWrinkMax: 1,\r\n Miscellaneous: 1,\r\n Lucky: 1,\r\n Chain: 1,\r\n Spells: 1,\r\n Garden: 1,\r\n Prestige: 1,\r\n Wrink: 1,\r\n Sea: 1,\r\n Achievs: 1,\r\n Misc: 1,\r\n infoMenu: 1,\r\n optionsMenu: 1,\r\n};\r\n\r\nexport default headers;\r\n","import { saveAndLoadingFunctions } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\n\r\nimport headers from '../Data/headers';\r\nimport { VersionMajor, VersionMinor } from '../Data/Moddata';\r\nimport settings from '../Data/settings';\r\nimport UpdateColours from '../Disp/HelperFunctions/UpdateColours';\r\nimport CMLoopHook from '../Main/LoopHook';\r\nimport InitData from '../Sim/InitializeData/InitData';\r\n\r\n/**\r\n * This creates a load function to the CM object. Per Game code/comments:\r\n * \"do stuff with the string data you saved previously\"\r\n */\r\nexport default function load(str) {\r\n InitData();\r\n\r\n // Load saveData\r\n saveAndLoadingFunctions.loadMod('cookieMonsterMod', str, settings, headers, CMLoopHook);\r\n if (\r\n typeof Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames ===\r\n 'undefined'\r\n ) {\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames = [];\r\n }\r\n\r\n // Update display with colours and locking of minigames\r\n UpdateColours();\r\n for (\r\n let index = 0;\r\n index < Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.length;\r\n index++\r\n ) {\r\n const buildingIndex =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames[index];\r\n l(`row${buildingIndex}`).style.pointerEvents = 'none';\r\n l(`row${buildingIndex}`).style.opacity = '0.4';\r\n l(`productLock${buildingIndex}`).innerHTML = 'Unlock';\r\n l(`productLock${buildingIndex}`).style.pointerEvents = 'auto';\r\n }\r\n\r\n // Notify of update\r\n if (\r\n typeof Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.version !== 'undefined' &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.version !==\r\n `${VersionMajor}.${VersionMinor}`\r\n ) {\r\n if (Game.prefs.popups)\r\n Game.Popup(\r\n 'A new version of Cookie Monster has been loaded, check out the release notes in the info tab!',\r\n );\r\n else\r\n Game.Notify(\r\n 'A new version of Cookie Monster has been loaded, check out the release notes in the info tab!',\r\n '',\r\n '',\r\n 0,\r\n 1,\r\n );\r\n }\r\n}\r\n","import init from './InitSaveLoad/init';\r\nimport load from './InitSaveLoad/load';\r\nimport save from './InitSaveLoad/save';\r\n\r\nconst CM = {\r\n init,\r\n load,\r\n save,\r\n};\r\n\r\nif (typeof Steam !== 'undefined') {\r\n // Need to add a delay for steam\r\n setTimeout(function () {\r\n Game.registerMod('CookieMonster', CM);\r\n\r\n // Game.registerMod also calls CM.load() which calls the loop hook\r\n // Thus sounds normally play at start up as Season and Garden states are checked\r\n window.cookieMonsterFrameworkData.isInitializing = false;\r\n }, 2000);\r\n} else {\r\n Game.registerMod('CookieMonster', CM);\r\n window.cookieMonsterFrameworkData.isInitializing = false;\r\n}\r\n","import { initFunctions } from '@cookiemonsterteam/cookiemonsterframework';\r\nimport { VersionMajor, VersionMinor } from '../Data/Moddata';\r\nimport CMDrawHook from '../Disp/DrawHook';\r\nimport CMClickHook from '../Main/ClickHook';\r\nimport InitializeCookieMonster from '../Main/Initialization';\r\nimport CMLoopHook from '../Main/LoopHook';\r\nimport load from './load';\r\n\r\n/**\r\n * This creates a init function for the CM object. Per Game code/comments:\r\n * \"this function is called as soon as the mod is registered\r\n * declare hooks here\"\r\n * It starts the further initialization of CookieMonster and registers hooks\r\n */\r\nexport default function init() {\r\n let proceed = true;\r\n\r\n // Load Cookie Monster Mod Framework and register mod\r\n initFunctions.initModFramework();\r\n window.cookieMonsterFrameworkData.isInitializing = true;\r\n initFunctions.registerMod('cookieMonsterMod');\r\n\r\n if (Game.version !== Number(VersionMajor)) {\r\n // eslint-disable-next-line no-restricted-globals, no-alert\r\n proceed = confirm(\r\n `Cookie Monster version ${VersionMajor}.${VersionMinor} is meant for Game version ${VersionMajor}. Loading a different version may cause errors. Do you still want to load Cookie Monster?`,\r\n );\r\n }\r\n if (proceed) {\r\n InitializeCookieMonster();\r\n Game.registerHook('click', CMClickHook);\r\n Game.registerHook('draw', CMDrawHook);\r\n Game.registerHook('logic', CMLoopHook);\r\n\r\n // Load default settings if no previous saveData is found\r\n if (typeof Game.modSaveData.cookieMonsterMod === 'undefined') {\r\n load('{}');\r\n }\r\n }\r\n}\r\n","/** Data related directly to Cookie Monster */\r\n\r\nexport const VersionMajor = '2.052';\r\nexport const VersionMinor = '10';\r\n\r\n/** Information about Cookie Monster to be displayed in the info section */\r\nexport const ModDescription = `<a href=\"https://github.com/CookieMonsterTeam/CookieMonster\" target=\"blank\">Cookie Monster</a>\r\n offers a wide range of tools and statistics to enhance your game experience.\r\n It is not a cheat interface – although it does offer helpers for golden cookies and such, everything can be toggled off at will to only leave how much information you want.</br>\r\n Progess on new updates and all previous release notes can be found on the GitHub page linked above!</br>\r\n Please also report any bugs you may find over there!</br>\r\n `;\r\n\r\n/** Latest releasenotes of Cookie Monster to be displayed in the info section */\r\nexport const LatestReleaseNotes = `This update adds support for some parts of cookie clicker 2.048</br>\r\n- added support for Dragon Aura 'Supreme Intellect' in the pantheon calculations</br>\r\n- added support for new tiers of Shimmering veil</br>\r\n- added support for unshackled upgrades</br>\r\n- updated some simulator logic to more cloesly match updated cookie clicker logic</br>\r\n- Bugfix: conjure backed goods tooltip used cached no gold switch raw cps instead of live cps</br>\r\n- Bugfix: negative calculations due to glucosimium upgrades, kittens, unshackled, and achievements</br>`;\r\n","import { VersionMajor, VersionMinor } from '../Data/Moddata';\r\n\r\n/**\r\n * This creates a save function to the CM object. Per Game code/comments:\r\n * \"use this to store persistent data associated with your mod\r\n * return 'a string to be saved';\"\r\n */\r\nexport default function save() {\r\n const saveObject = Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod;\r\n saveObject.version = `${VersionMajor}.${VersionMinor}`;\r\n return JSON.stringify(saveObject);\r\n}\r\n"],"names":["global","factory","module","exports","document","win","Error","window","this","BoxShadow","funcName","elm","jsc","jscolor","initialized","instances","readyQueue","register","addEventListener","pub","init","installBySelector","selector","rootNode","node","elms","querySelectorAll","matchClass","RegExp","lookupClass","i","length","dataOpts","m","undefined","type","toLowerCase","isColorAttrSupported","getDataAttr","className","match","targetElm","optsStr","console","warn","docsRef","opts","trim","parseOptionsStr","e","str","JSON","parse","eParse","looseJSON","Function","eEval","getInstances","inst","targetElement","push","createEl","tagName","el","createElement","setData","nodeOrSelector","sel","querySelector","isNode","val","Node","nodeType","nodeName","removeChildren","firstChild","removeChild","isTextInput","isButton","n","indexOf","isButtonEmpty","value","textContent","isPassiveEventSupported","supported","Object","defineProperty","get","removeEventListener","setAttribute","dataProp","obj","arguments","data","hasOwnProperty","prop","map","removeData","getData","setDefault","name","attrName","getAttribute","setDataAttr","_attachedGroupEvents","attachGroupEvent","groupName","evnt","func","detachGroupEvents","evt","preventDefault","returnValue","captureTarget","target","setCapture","_capturedTarget","releaseTarget","releaseCapture","triggerEvent","eventName","bubbles","cancelable","ev","Event","createEvent","initEvent","dispatchEvent","triggerInputEvent","eventKey","keys","code","keyCode","strList","replace","split","hasClass","classList","contains","addClass","classNames","add","removeClass","repl","remove","getCompStyle","getComputedStyle","currentStyle","setStyle","styles","important","reversible","priority","origStyle","setVal","style","setProperty","hexColor","r","g","b","Math","round","toString","substr","toUpperCase","hexaColor","a","rgbColor","rgbaColor","linearGradient","stdName","prefixes","helper","tryFunc","tryVal","background","getFuncName","Array","prototype","join","call","setBorderRadius","setBoxShadow","getElementPos","relativeToViewport","x","y","rect","getBoundingClientRect","left","top","viewPos","getViewPos","getElementSize","offsetWidth","offsetHeight","getAbsPointerPos","changedTouches","clientX","clientY","getRelPointerPos","targetRect","srcElement","doc","documentElement","pageXOffset","scrollLeft","clientLeft","pageYOffset","scrollTop","clientTop","getViewSize","innerWidth","clientWidth","innerHeight","clientHeight","RGB_HSV","min","v","max","h","HSV_RGB","s","u","floor","parseColorString","ret","rgba","format","parseInt","charAt","mR","mG","mB","mA","par","re","parseFloat","parsePaletteValue","mixed","vals","isArray","colors","color","containsTranparentColor","isAlphaFormat","scaleCanvasForHighDPR","canvas","dpr","devicePixelRatio","width","height","getContext","scale","genColorPreviewCanvas","separatorPos","specWidth","scaleForHighDPR","sepW","previewSeparator","sqSize","chessboardSize","sqColor1","chessboardColor1","sqColor2","chessboardColor2","cWidth","cHeight","ctx","fillStyle","fillRect","start","clearRect","lineWidth","beginPath","strokeStyle","moveTo","lineTo","stroke","genColorPreviewGradient","position","params","apply","redrawPosition","picker","owner","tp","vp","thisObj","fixed","c","ts","vs","pd","getPickerDims","ps","borderW","borderH","l","smartPosition","pp","positionValue","contractShadow","_drawPosition","vShadow","shadowBlur","wrap","boxS","shadow","shadowColor","w","controlBorderWidth","sliderSpace","getControlPadding","sliderSize","getSliderChannel","hasAlphaChannel","pal","getPaletteDims","padding","closeButton","buttonHeight","pW","pH","contentW","contentH","paddedW","paddedH","borderWidth","palette","cols","rows","cellW","cellH","sampleCount","_palette","paletteCols","ceil","paletteSpacing","paletteHeight","pointerBorderWidth","pointerThickness","getPadYChannel","mode","triggerCallback","callback","error","triggerGlobal","eventNames","trigger","_pointerMoveEvent","mouse","touch","_pointerEndEvent","_pointerOrigin","onDocumentKeyUp","tryHide","onWindowResize","onWindowScroll","onParentScroll","onDocumentMouseDown","showOnClick","disabled","show","onControlPointerStart","onPickerTouchStart","controlName","pointerType","registerDragEvents","offset","onDocumentPointerMove","onDocumentPointerEnd","parent","frameElement","ofs","abs","rel","channels","fromHSVA","setPad","setSld","setASld","onPaletteSampleClick","currentTarget","_setFormat","getFormat","paletteSetsAlpha","_paletteHasTransparency","fromRGBA","hideOnPaletteClick","hide","ofsX","ofsY","pointerAbs","xVal","yVal","fmt","createPadCanvas","draw","hGrad","createLinearGradient","addColorStop","vGrad","createSliderGradient","color1","color2","grad","createASliderGradient","hShadow","blur","spread","inset","flags","leaveValue","leaveAlpha","leavePreview","enumOpts","previewPosition","alphaChannel","deprecatedOpts","THIS","setOption","option","oldOpt","newOpt","setter","getOption","getter","drawPicker","_processParentElementsInDOM","box","boxB","pad","padB","padM","padCanvas","cross","crossBY","crossBX","crossLY","crossLX","sld","sldB","sldM","sldGrad","sldPtrS","sldPtrIB","sldPtrMB","sldPtrOB","asld","asldB","asldM","asldGrad","asldPtrS","asldPtrIB","asldPtrMB","asldPtrOB","btn","btnT","appendChild","passive","insetColors","outsetColor","p","displaySlider","displayAlphaSlider","pickerDims","crossOuterSize","crossSize","controlPadding","borderRadius","PI","clear","zIndex","border","borderColor","backgroundColor","opacity","controlBorderColor","cursor","instance","control","pointerBorderColor","pointerColor","overflow","display","sliderInnerSpace","innerHTML","chessboard","si","sampleColor","sampleCssColor","sc","sw","backgroundImage","toDataURL","backgroundRepeat","backgroundPosition","bottom","maxWidth","whiteSpace","buttonColor","font","textAlign","onmousedown","lineHeight","createTextNode","closeText","redrawPad","redrawSld","redrawASld","activeClassName","container","body","parentNode","yChannel","rgb1","rgb2","rgb","toHEXString","sldChannel","isPickerOwner","alpha","random","onChange","onInput","valueElement","alphaElement","previewElement","previewSize","previewPadding","required","hash","uppercase","forceStyle","hideOnLeave","minS","maxS","minV","maxV","minA","maxA","redraw","exposeColor","success","opt","channel","res","evs","callbackProp","isNaN","hsv","fromHSV","fromRGB","fromString","setPreviewElementBg","setValueElementValue","randomize","minH","maxH","toHEXAString","toRGBString","toRGBAString","toGrayscale","toCanvas","toBackground","isLight","_currentFormat","processValueInput","processAlphaInput","colorStr","alphaVal","setAlphaElementValue","backgrounds","image","size","repeat","origin","preview","bg","sty","right","_parentElementsProcessed","compStyle","set__palette","options","presetsArr","preset","slice","pres","presets","nonProperties","test","valueElementOrigEvents","oninput","oldVal","initValue","initAlpha","install","shift","ready","triggerNow","installByClassName","JSColor","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","__esModule","d","definition","key","o","enumerable","Setting","constructor","defaultValue","group","cookieMonsterPrompt","content","Game","promptWrapL","promptL","forEach","id","onclick","PlaySound","children","promptAnchorL","darkenL","focus","promptOn","UpdatePrompt","createFlash","modName","configName","forced","mods","cookieMonsterFramework","saveData","settings","cookieMonsterFrameworkData","isInitializing","setTimeout","fps","saveFramework","modSaveString","stringify","cookieClickerSaveString","b64_to_utf8","unescape","localStorage","getItem","pattern","modSave","newSaveString","setItem","escape","utf8_to_b64","toggleHeader","headerName","headers","playCMSound","url","sndConfig","volConfig","sound","Audio","GeneralSound","volume","play","toggleConfigVolume","addMenu","_","observer","disconnect","onMenu","menu","insertBefore","frameworkInfoDiv","titleDiv","buttonSpan","fontSize","verticalAlign","infoMenu","UpdateMenu","descriptionDiv","createFrameworkInfoMenuSection","listeners","addInfoMenuSection","observe","getElementById","attributes","childList","subtree","drawLoop","optionsMenu","loadMod","settingsData","headersData","logicLoop","saveDataObject","modSaveData","settingsObject","headersObject","favouriteSettings","createSaveDataObject","load","MutationObserver","WhiteScreen","pointerEvents","createFlashScreen","registerHook","save","initFunctions","registerMod","menuFunctions","createInfoListing","listingHTML","listingDiv","createOptionsListing","updateColoursFunc","refreshScaleFunc","div","FavouriteSettings","favourites","FavStar","includes","innerText","filter","ele","toggleFavouriteSetting","onmouseover","tooltip","onmouseout","createFavouriteStar","toggle","label","toggleConfig","desc","title","float","percent","slider","step","onchange","span","input","readOnly","inputPrompt","outerHTML","ClosePrompt","innerSpan","displayName","event","saveObject","altKey","ctrlKey","shiftKey","toggleConfigKeycode","createOptionsSubHeader","text","modDisplayName","menuName","modSectionDiv","notificationsFunctions","createNotification","message","visibilityState","Notification","badge","saveAndLoadingFunctions","settingClasses","super","ToggleWrinklerButtons","cookieMonsterMod","WrinklerButtons","elderWrath","CacheAverageCookiesFromClicks","CookiesDiff","WrinkDiff","WrinkFattestDiff","ChoEggDiff","ClicksDiff","HeavenlyChipsDiff","CacheLastCPSCheck","CacheLastCookies","CacheLastWrinkCookies","CacheLastWrinkFattestCookies","CacheLastClicks","CacheAverageGainBank","CacheAverageGainWrink","CacheAverageGainWrinkFattest","CacheAverageGainChoEgg","CacheAverageCPS","CacheLastHeavenlyCheck","CacheLastHeavenlyChips","CacheDoRemakeBuildPrices","CacheHadBuildAura","SimBuildingsOwned","SimUpgradesOwned","SimPledges","SimAchievementsOwned","SimHeavenlyPower","SimPrestige","SimDragonAura","SimDragonAura2","SimGod1","SimGod2","SimGod3","SimDoSims","SimEffs","SimCookiesPs","SimCookiesPsRaw","CacheDragonAura","CacheDragonAura2","CacheLastDragonLevel","CacheCostDragonUpgrade","CacheLucky","CacheLuckyReward","CacheLuckyWrathReward","CacheLuckyFrenzy","CacheLuckyRewardFrenzy","CacheLuckyWrathRewardFrenzy","CacheConjure","CacheConjureReward","CacheEdifice","CacheEdificeBuilding","CacheNoGoldSwitchCookiesPS","CacheDragonsFortuneMultAdjustment","CacheGoldenCookiesMult","CacheWrathCookiesMult","CacheHCPerSecond","CacheCentEgg","CacheSeaSpec","CacheLastChoEgg","CacheObjects1","CacheObjects10","CacheObjects100","CacheObjectsNextAchievement","CacheWrinklersTotal","CacheWrinklersNormal","CacheWrinklersFattest","CacheCurrWrinklerCPSMult","CacheCurrWrinklerCount","CacheUpgrades","CacheAverageClicks","CacheMissingUpgrades","CacheMissingUpgradesPrestige","CacheMissingUpgradesCookies","CacheChainRequired","CacheChainRequiredNext","CacheChainMaxReward","CacheChainWrathRequired","CacheChainWrathRequiredNext","CacheChainWrathMaxReward","CacheChainFrenzyRequired","CacheChainFrenzyRequiredNext","CacheChainFrenzyMaxReward","CacheChainFrenzyWrathRequired","CacheChainFrenzyWrathRequiredNext","CacheChainFrenzyWrathMaxReward","CacheRealCookiesEarned","CacheAvgCPSWithChoEgg","CacheSpawnedGoldenShimmer","CacheSeasonPopShimmer","CacheTimeTillNextPrestige","CacheMinPP","CacheMinPPBulk","CachePPArray","CacheGoldenShimmersByID","CacheSellForChoEgg","CacheGods","SimObjects","SimUpgrades","SimAchievements","SimAuraMult","what","dragonAuras","dragonLevel","dragonAurasBN","SimGetSellMultiplier","giveBack","SimEff","def","SimHas","it","ascensionMode","pool","tier","bought","SimHasAura","SimHasGod","hasGod","Temple","minigame","Objects","god","gods","SimModifyBuildingPrice","building","price","ModifiedPrice","hasBuff","fortune","minigameLoaded","godLvl","BuildingSell","build","basePrice","free","amount","noSim","noSimRes","toChange","startingAmount","moni","buyBulk","priceIncrease","modifyBuildingPrice","getSellMultiplier","metric","shortScale","shortScaleAbbreviated","LastModCount","TooltipLumpBackup","BackupGrimoireLaunch","BackupGrimoireLaunchMod","BackupGrimoireDraw","HasReplaceNativeGrimoireLaunch","HasReplaceNativeGrimoireDraw","LoadMinigames","LastSeasonPopupState","LastTickerFortuneState","LastGardenNextStep","LastGoldenCookieState","LastSpawnedGoldenCookieState","LastMagicBarFull","CurrSpawnedGoldenCookieState","LastWrinklerCount","DispCSS","TooltipBuildBackup","TooltipGrimoireBackup","TooltipUpgradeBackup","BackupFunctions","CycliusDateAtBeginLoop","Date","now","CenturyDateAtBeginLoop","num","floats","decimals","ScaleDecimals","Infinity","Scale","Beautify","Number","isFinite","answer","ScaleCutoff","ScaleSeparator","toLocaleString","toExponential","exponential","AmountOfTenPowerThree","toFixed","log","ColourTextPre","ColourBackPre","ColourBlue","ColourGreen","ColourYellow","ColourOrange","ColourRed","ColourPurple","ColourGray","ColourPink","ColourBrown","ColoursOrdering","TooltipText","SimpleTooltipElements","CMLastAscendState","TooltipWrinklerArea","TooltipWrinkler","TooltipWrinklerBeingShown","CMSayTime","LastTargetBotBar","LastTargetBuildings","LastTargetTooltipBuilding","CookieTimes","ClickTimes","BuffColours","Frenzy","Clot","Dragonflight","TooltipPrice","TooltipBonusIncome","TooltipType","TooltipName","TooltipBonusMouse","LastAscendState","LastNumberOfTimers","GCTimers","Title","UpdateBuildings","arr","buyMode","removeProperty","BuildColour","colour","SortBuildings","k","sort","amountUntilNext","AmountNeeded","priceUntilNext","gridRow","UpdateUpgradeSectionsHeight","values","getElementsByClassName","section","UpgradesNeverCollapse","minHeight","UpdateUpgrades","UpBarColour","blue","green","yellow","orange","red","purple","gray","UpgradesInStore","me","addedColour","j","childNodes","SortUpgrades","nameChecker","arr2","upgrade","findIndex","order","FormatTime","time","longFormat","formattedTime","TimeFormat","GetTimeColour","GetCPS","CPSMode","CalcWrink","cookiesPs","cpsSucked","wrinklers","GetWrinkConfigBank","CreateTimer","bars","timerBar","margin","marginRight","colourBar","borderTopRightRadius","borderBottomRightRadius","timer","marginLeft","CreateBotBarBuildingColumn","buildingName","bonus","header","substring","lastChild","paddingLeft","UpdateBotBar","BotBar","count","PPString","PPDisplayTime","timeColour","bulkPrice","cookies","UpdateBackground","Background","LeftBackground","DrawBackground","UpdateBotTimerBarPosition","TimerBar","TimerBarPos","ToggleTimerBar","CacheDragonAuras","dragonAura","dragonAura2","InitAchievement","achievementName","Achievements","you","SimGetTieredCpsMult","mult","tieredUpgrades","Tiers","special","tierMult","unshackleUpgrade","synergies","syn","buildingTie1","buildingTie2","grandma","Grandma","misfortune","vanilla","InitialBuildingData","cps","magicCpS","ComputeCps","GrandmaSynergies","UpgradesByPool","kitten","Portal","baseCps","baseCPS","InitUpgrade","upgradeName","Upgrades","power","level","pow","CopyData","UpgradesOwned","pledges","AchievementsOwned","heavenlyPower","prestige","totalCookies","slot","won","TooltipCreateHeader","fontWeight","TooltipCreateCalculationSection","income","marginBottom","click","production","ColourOfPP","PPSecondsLowerLimit","PPOnlyConsiderBuyable","GetCPSBuffMult","buffs","multCpS","SimWin","CalculateGains","effs","myEffs","ii","heavenlyMult","SimGetHeavenlyMultiplier","heralds","cookieUpgrades","buildMult","sin","santaLevel","milkProgress","milkMult","catMult","storedCps","eggMult","day","startDate","lumps","rawCookiesPs","CpsAchievements","threshold","shimmerTypes","golden","auraMult","bakeryName","goldenSwitchMult","upgrades","goldenCookieUpgrades","veilMult","runModHookOnValue","Fortunes","HalloCookies","ChristCookies","ValCookies","PlantDrops","SimHasAchiev","CheckOtherAchiev","grandmas","buildingsOwned","mathematician","base10","minAmount","ObjectsById","Cursor","hasAllHalloCook","hasAllChristCook","list","fortunes","BuyBuildingsBonusIncome","tieredAchievs","achievUnlock","lastAchievementsOwned","CalculateGrimoireRefillTime","currentMagic","maxMagic","targetMagic","magic","ToggleToolWarnPos","ToolWarnPos","UpdateTooltips","tooltipBox","paddingBottom","TooltipBuildUpgrade","increase","productionAchievs","HasAchiev","achiev","nextProductionAchiev","ObjectsTillNext","PPOfAmount","PPFrag","Building","getPrice","bonusMouse","previousSibling","chocolate","Upgrade","TooltipLump","lumpType","lumpColour","lumpCurrentType","SugarLump","spellCost","getSpellCost","spellsById","TooltipGrim","magicM","recover","recoverColour","conjure","reward","seperator","loss","Grimoire","Farm","TooltipPlots","plot","mature","plantsById","plantName","GardenPlots","totalGain","mortal","tile","immortal","matureBase","HarvestAll","WrinklerReward","WrinklerButton","TooltipPantheon","GodID","cps1","cps2","cps3","PantheonGods","TooltipWarn","create","boxId","labelTextFront","labelTextBack","deficitId","transition","labelDiv","labelSpan","deficitDiv","deficitSpan","ToolWarnUser","bonusIncomeUsed","ToolWarnBon","limitLucky","bonusNoFren","ToolWarnLucky","ToolWarnLuckyFrenzy","limitLuckyFrenzy","ToolWarnConjure","limitConjure","ToolWarnConjureFrenzy","limitConjureFrenzy","ToolWarnEdifice","Warnings","CMDrawHook","prefs","autosave","drawT","Stats","sayTime","T","maxWidthTwoBar","maxWidthOneBar","numberOfTimers","AutosaveTimerBar","timeTillNextAutosave","OnAscend","TimerBarOverlay","spawned","Has","minTime","maxTime","chanceToSpawn","season","reindeer","BuffTimerBars","classColour","UpdateTimerBar","TooltipWrink","showingTooltip","phase","selected","placeholder","wrinkler","minWidth","CheckWrinklerTooltip","sucked","toSuck","UpdateWrinklerTooltip","UpStats","CMClickHook","addLatest","computedMouseCps","CMAvgQueue","maxLength","queue","newValue","calcAverage","timePeriod","calcSum","reduce","FillCMDCache","caches","CookieMonsterData","Cache","exportName","CacheAvgCPS","currDate","choEggTotal","cookiesEarned","timeDiff","bankDiffAvg","wrinkDiffAvg","wrinkFattestDiffAvg","choEggDiffAvg","clicksDiffAvg","cookieClicks","cpsLength","AvgCPSHist","choEgg","HasUnlocked","AvgClicksHist","BuildingGetPrice","partialPrice","CacheColour","PPRigidelMode","PPExcludeTop","CachePP","indexOfMin","CacheBuildingsPP","Objects1","Objects10","Objects100","entries","BuyUpgradesBonusIncome","unlocked","CountsAsUpgradeOwned","diffMouseCPS","multClick","out","MouseCps","CacheBuildingIncome","result","CacheBuildingsPrices","CacheIncome","bonusIncome","CacheUpgradeIncome","MaxChainCookieReward","digit","maxPayout","totalFromChain","nextMoni","nextRequired","chain","LN10","CacheChain","cpsBuffMult","CacheHeavenlyChipsPS","chipsOwned","HowMuchPrestige","cookiesReset","ascendNowToGet","heavenlyChipsDiffAvg","CacheAllMissingUpgrades","classes","noFrame","crates","icon","iconFunction","getDynamicTooltip","crateMissing","CacheSeasonSpec","CacheStatsCookies","CacheGoldenAndWrathCookiesMults","goldenMult","wrathMult","eff","AllAmountTillNextAchievement","forceRecalc","TotalNeeded","tillNext","AchievementsAtStart","index","lastIndexWithChange","IndividualAmountTillNextAchievement","CacheWrinklers","InitCache","PopAllNormalWrinklers","hp","CreateTooltip","TooltipAmor","buildPrice","amortizeAmount","storedTotalCps","globalCpsMult","crateTooltip","lumpTooltip","spellTooltip","tileTooltip","toolTooltip","godTooltip","slotTooltip","area","UpdateFavicon","Favicon","wrath","href","InitData","ReplaceTooltipGrimoire","dynamic","wobble","ReplaceNativeGrimoireDraw","GrimoireBar","magicBarTextL","magicBarL","ReplaceNativeGrimoire","launch","ReplaceNativeGrimoireLaunch","CacheDragonCost","dragonLevels","buy","objectMatch","replaceAll","cost","ConfigGroups","Favourite","Calculation","Notation","Colours","BarsDisplay","Tooltip","Statistics","Miscellaneous","ConfigGroupsNotification","NotificationGeneral","NotificationGC","NotificationFC","NotificationSea","NotificationGard","NotificationMagi","NotificationWrink","NotificationWrinkMax","ToggleOnOff","checkNotificationPromise","requestPermission","then","RefreshScale","BeautifyAll","RefreshStore","RebuildUpgrades","ToggleBotBar","DetailedTime","UpgradeBarFixedPos","DragonAuraInfo","GCTimer","HideSectionsButtons","TooltipAscendButton","MissingUpgrades","MissingAchievements","HeavenlyChipsTarget","ShowMissedGC","GCNotification","GCFlash","ColourGCFlash","GCSound","GCVolume","GCSoundURL","FortuneNotification","FortuneFlash","ColourFortuneFlash","FortuneSound","FortuneVolume","FortuneSoundURL","SeaNotification","SeaFlash","ColourSeaFlash","SeaSound","SeaVolume","SeaSoundURL","GardFlash","ColourGardFlash","GardSound","GardVolume","GardSoundURL","MagicNotification","MagicFlash","ColourMagicFlash","MagicSound","MagicVolume","MagicSoundURL","WrinklerNotification","WrinklerFlash","ColourWrinklerFlash","WrinklerSound","WrinklerVolume","WrinklerSoundURL","WrinklerMaxNotification","WrinklerMaxFlash","ColourWrinklerMaxFlash","WrinklerMaxSound","WrinklerMaxVolume","WrinklerMaxSoundURL","BulkBuyBlock","UpdateColours","createMenuOptions","menuDiv","subGroup","subGroupObject","CountSevens","number","String","CalculateSevenDelta","digitPlace","modulus","delta","StatsHeader","config","fontFamily","ToggleHeader","StatsListing","listingName","StatsMissDispListing","current","StatsMissDisp","theMissDisp","frag","createDocumentFragment","missing","AddMenuStats","stats","Lucky","goldCookTooltip","luckyColour","luckyTime","luckyReqFrag","luckyReqSpan","luckyReqSmall","luckyColourFrenzy","luckyTimeFrenzy","luckyReqFrenFrag","luckyReqFrenSpan","luckyReqFrenSmall","luckySplit","luckyRewardMaxSpan","luckyRewardFrenzyMaxSpan","luckyCurBase","luckyCurSpan","Chain","chainColour","chainTime","chainReqFrag","chainReqSpan","chainReqSmall","chainWrathColour","chainWrathTime","chainWrathReqFrag","chainWrathReqSpan","chainWrathReqSmall","chainColourFrenzy","chainTimeFrenzy","chainReqFrenFrag","chainReqFrenSpan","chainReqFrenSmall","chainWrathColourFrenzy","chainWrathTimeFrenzy","chainWrathReqFrenFrag","chainWrathReqFrenSpan","chainWrathReqFrenSmall","chainCurMax","chainCur","chainCurWrath","Spells","conjureColour","conjureTime","conjureReqFrag","conjureReqSpan","conjureReqSmall","conjureFrenzyColour","conjureFrenzyCur","conjureFrenzyTime","conjureFrenzyReqFrag","conjureFrenzyReqSpan","conjureFrenzyReqSmall","Garden","bakeberryColour","bakeberryFrag","chocorootColour","chocorootFrag","queenbeetColour","queenbeetFrag","duketaterColour","duketaterFrag","missingPlantDrops","Prestige","possiblePresMax","neededCook","HowManyCookiesReset","cookiesNextFrag","cookiesNextSmall","heavenlyChips","HCTarget","CookiesTillTarget","resetBonus","newHeavenlyChips","curCPS","ResetCPS","ResetBonus","resetFrag","resetSmall","currentPrestige","willHave","willGet","luckyDigit","luckyNumber","luckyPayout","currentLevel","sevenCount","numberOfDigits","localLevel","CalculateLuckyLevels","luckyDigitDelta","luckyDigitReset","fragLuckyDigit","luckyNumberDelta","luckyNumberReset","fragLuckyNumber","luckyPayoutDelta","luckyPayoutReset","fragLuckyPayout","Wrink","popAllFrag","popAllA","popFattestFrag","popFattestA","specDisp","missingHalloweenCookies","missingChristmasCookies","missingValentineCookies","missingNormalEggs","eggDrops","missingRareEggs","rareEggDrops","centEgg","Sea","failRateHalloween","dropRateMult","obtainedCookiesChance","failRateChristmas","dropRateEgg","StartingFailRate","failRateEgg","succesRateEgg","obtainedEggs","obtainedRareEggs","pNormal1","pRare1","pRedrop","Achievs","Misc","missedGoldenClicks","menuSection","prestigeUpgradesMissing","titlefrag","PrestigeUpgrades","normalUpgradesMissing","tech","nextSibling","cookieUpgradesMissing","cookie","achievs","parentElement","achievsCrate","AchievementsById","mouseDown","setOnCrate","tags","neuromancy","sesame","descFunc","tagsStr","CrateTooltipLockedAchievements","AddMissingAchievements","FixMouseY","timerBarHeight","mouseY","ReplaceNative","drawMod","from","update","updateMod","warnOffset","tta","tt","UpdateTooltipLocation","UpdateWrinklers","UpdateSpecial","ClickCookie","ClickProduct","DescribeDragonAura","aura","bonusCPS","priceOfChange","highestBuilding","CalculateChangeAura","timeToRecover","bonusCPSPercentage","div2","AddAuraInfo","ToggleSpecialMenu","on","shouldHide","AddDragonLevelUpTooltip","AddMenu","detail","Logic","titleGC","titleFC","titleSP","addFC","addSP","life","lastIndexOf","spawn","UpdateTitle","cookiesToNext","ReplaceAscendTooltip","InitializeCookieMonster","head","borderTop","textShadow","table","tbody","firstCol","td","CreateBotBar","CMTimerBarAutosave","CMTimerBarGC","CMTimerBarRen","TimerBarBuffTimers","CreateTimerBar","UpgradeBar","legend","legendLine","CreateUpgradeBarLegend","upgradeNumber","CreateUpgradeBar","CreateSectionHideButtons","getElementsByTagName","CreateFavicon","CreateSimpleTooltip","append","CreateWrinklerButtons","productButtons","button","lockedMinigames","toggleBuildingLock","canLumps","child","coords","ReplaceTooltipPantheon","popups","Popup","Notify","Win","CalculateChangeGod","CurrentSlot","godsById","CMLoopHook","AscendTimer","CachePantheonGods","sellTotal","Bank","marketGoods","goods","goodsVal","marketGood","stock","cookiesPsRawHighest","buildingsToSacrifice","SellBuildingsForChoEgg","CacheSellAllForChoEgg","hasBuildAura","godMult","CacheCurrWrinklerCPS","LoopCache","TickerEffect","shimmers","spawnLead","nextStep","CheckMagicMeter","CurrentWrinklers","getWrinklersMax","CheckWrinklerCount","pop","webkitFilter","CreateGCTimer","transform","buildingIndex","version","CM","proceed","confirm","Steam"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"CookieMonsterDev.js","mappings":"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AQtuB,KAAKgE,MAAMsqB,EAAQnB,GACvBiC,EAAiB,IACnBC,GAAQf,EACRc,GAAkB,EAEtB,CACA,OAAOC,CACT,CClCO,MAAMK,GAAS,CAAC,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAGhDC,GAAa,CACxB,GACA,GACA,IACA,IACA,KACA,QACA,QACA,OACA,OACA,MACA,MACA,MACA,QACA,SACA,SACA,cACA,UACA,SACA,YACA,UACA,WACA,SACA,WACA,YACA,YACA,kBAIWC,GAAwB,CACnC,GACA,IACA,IACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,KACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,KACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,KACA,OC3IK,IAAIC,GAEAC,GAGAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAGAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GCjBAC,GDFAC,GAAqB,GAErBC,GAAwB,GACxBC,GAAuB,GAOvBC,GAAkB,CAAC,EAanBC,GAAyBC,KAAKC,MAI9BC,GAAyBF,KAAKC,MEhB1B,SAAS,GAASE,EAAKC,EAAQ1T,GAC5C,MAAM2T,EACJ3U,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASwT,cAAgB,EACtF,GAAIH,IAAQI,IACV,MAAO,WAET,QAAmB,IAARJ,EACT,MAAO,IAET,GAAkF,IAA9E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tB,IAAc,IAGlBziB,cAAe,IAAIpL,EACjB,EACA,OACA,WACA,CAAC,aAAc,aAAc,cAC7B,oIACA,GACA,KACE6tB,IAAc,IAGlBjiB,eAAgB,IAAI5L,EAClB,EACA,OACA,WACA,CAAC,4BAA6B,mBAC9B,qDACA,GACA,KACE6tB,IAAc,IAGlBliB,YAAa,IAAI3L,EACf,OACA,WACA,WACA,2BACA,8KACA,EACA,WAEFmR,WAAY,IAAInR,EACd,EACA,OACA,WACA,CAAC,0BAA2B,sBAAuB,iBACnD,0BACA,GAEFkuB,aAAc,IAAIluB,EAChB,EACA,OACA,WACA,CAAC,oBAAqB,oBACtB,mEACA,GACA,KCtIuF,IAArFxJ,KAAKiB,KAAKC,uBAAuBC,SAASwI,iBAAiBvI,SAASs2B,aACtE13B,KAAKyrB,QAAU5U,GACZ7W,KAAKyrB,QAAUrX,GAAgBqX,ODqIZ,IAGxBhP,cAAe,IAAIjT,EACjB,EACA,OACA,WACA,CAAC,yBAA0B,mBAC3B,sKACA,GAIF4O,YAAa,IAAI5O,EACf,EACA,OACA,UACA,CAAC,uBAAwB,uBACzB,yBACA,GACA,KACEwO,IAAiB,IAGrB6I,sBAAuB,IAAIrX,EACzB,EACA,OACA,UACA,CAAC,2BAA4B,sBAC7B,0KACA,GAEFomB,aAAc,IAAIpmB,EAChB,EACA,OACA,UACA,CACE,mBACA,kBACA,0BACA,gCAEF,sGACA,GAEFmmB,cAAe,IAAInmB,EACjB,EACA,OACA,UACA,CAAC,mBAAoB,mBACrB,sJACA,GAEFoX,oBAAqB,IAAIpX,EACvB,EACA,WACA,UACA,oCACA,wMACA,EACAqL,KAEFgB,WAAY,IAAIrM,EACd,UACA,SACA,UACA,6HAEFsM,YAAa,IAAItM,EACf,UACA,SACA,UACA,yGAEFuM,aAAc,IAAIvM,EAChB,UACA,SACA,UACA,qHAEFwM,aAAc,IAAIxM,EAChB,UACA,SACA,UACA,4HAEFyM,UAAW,IAAIzM,EACb,UACA,SACA,UACA,gHAEF0M,aAAc,IAAI1M,EAChB,UACA,SACA,UACA,8HAEF2M,WAAY,IAAI3M,EACd,UACA,SACA,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","sources":["webpack:///./node_modules/@eastdesire/jscolor/jscolor.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/baseSetting.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/notifications/prompt.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/notifications/flash.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/savingAndLoading/saveFramework.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/toggles/toggleHeader.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/notifications/sound.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/toggleConfigVolume.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/menuSections/addMenu.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/menuSections/info/addInfoMenuSection.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/menuSections/info/createFrameworkInfoMenuSection.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/data/modInfo.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/draw/drawLoop.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/data/headers.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/savingAndLoading/loadMod.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/savingAndLoading/createSaveDataObject.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/logic/logicLoop.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/data/settings.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/load.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/cookieMonsterFramework.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/init.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/init/createFlashScreen.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/frameworkDataObject/save.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/index.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/init/initModFramework.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/init/registerMod.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/listings/createInfoListing.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/listings/createOptionListing.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/listings/createOptionsFavouriteStar.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/toggles/toggleFavourite.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/toggleConfig.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/toggleConfigKeycode.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/listings/createOptionsSubHeader.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/menu/createModMenuSection.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/notifications/notification.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingColours.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingInputNumber.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingStandard.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingStandardWithFunc.js","webpack:///./node_modules/@cookiemonsterteam/cookiemonsterframework/src/options/settingClasses/settingVolume.js","webpack:///./src/Config/Toggles/ToggleWrinklerButtons.js","webpack:///./src/Cache/VariablesAndData.js","webpack:///./src/Sim/VariablesAndData.js","webpack:///./src/Sim/ReplacedGameFunctions/SimAuraMult.js","webpack:///./src/Sim/ReplacedGameFunctions/SimGetSellMultiplier.js","webpack:///./src/Sim/ReplacedGameFunctions/SimEff.js","webpack:///./src/Sim/ReplacedGameFunctions/SimHas.js","webpack:///./src/Sim/ReplacedGameFunctions/SimHasAura.js","webpack:///./src/Sim/ReplacedGameFunctions/SimHasGod.js","webpack:///./src/Sim/ReplacedGameFunctions/SimModifyBuidlingPrice.js","webpack:///./src/Sim/SimulationEvents/SellBuilding.js","webpack:///./src/Data/Scales.js","webpack:///./src/Main/VariablesAndData.js","webpack:///./src/Disp/VariablesAndData.js","webpack:///./src/Disp/BeautifyAndFormatting/Beautify.js","webpack:///./src/Disp/BuildingsUpgrades/Buildings.js","webpack:///./src/Disp/BuildingsUpgrades/UpdateUpgradeSectionsHeight.js","webpack:///./src/Disp/BuildingsUpgrades/Upgrades.js","webpack:///./src/Disp/BeautifyAndFormatting/FormatTime.js","webpack:///./src/Disp/BeautifyAndFormatting/GetTimeColour.js","webpack:///./src/Disp/HelperFunctions/GetCPS.js","webpack:///./src/Disp/HelperFunctions/GetWrinkConfigBank.js","webpack:///./src/Disp/InfoBars/CreateDOMElements.js","webpack:///./src/Disp/InfoBars/BottomBar.js","webpack:///./src/Disp/HelperFunctions/UpdateBackground.js","webpack:///./src/Config/SpecificToggles.js","webpack:///./src/Cache/Dragon/CacheDragonAuras.js","webpack:///./src/Sim/InitializeData/InitAchievement.js","webpack:///./src/Sim/ReplacedGameFunctions/SimGetTieredCpsMult.js","webpack:///./src/Sim/InitializeData/InitialBuildingData.js","webpack:///./src/Sim/InitializeData/InitUpgrade.js","webpack:///./src/Sim/SimulationData/CopyData.js","webpack:///./src/Disp/Tooltips/CreateTooltip.js","webpack:///./src/Cache/PP/ColourOfPP.js","webpack:///./src/Cache/CPS/GetCPSBuffMult.js","webpack:///./src/Sim/SimulationData/SimWin.js","webpack:///./src/Sim/Calculations/CalculateGains.js","webpack:///./src/Sim/ReplacedGameFunctions/SimGetHeavenlyMultiplier.js","webpack:///./src/Data/Gamedata.js","webpack:///./src/Sim/ReplacedGameFunctions/SimHasAchiev.js","webpack:///./src/Sim/Calculations/CheckOtherAchiev.js","webpack:///./src/Sim/SimulationEvents/BuyBuildingBonusIncome.js","webpack:///./src/Disp/HelperFunctions/CalculateGrimoireRefillTime.js","webpack:///./src/Config/Toggles/ToggleToolWarnPos.js","webpack:///./src/Disp/Tooltips/UpdateTooltips.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/Building.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/Upgrade.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/SugarLump.js","webpack:///./src/Disp/HelperFunctions/GetLumpColour.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/Grimoire.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/GardenPlots.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/HarvestAll.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/StockMarket.js","webpack:///./src/Disp/HelperFunctions/CalculateStockNextExpectedValue.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/WrinklerButton.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/PantheonGods.js","webpack:///./src/Disp/Tooltips/TypesOfTooltips/Warnings.js","webpack:///./src/Disp/DrawHook.js","webpack:///./src/Disp/InfoBars/TimerBar.js","webpack:///./src/Disp/Tooltips/WrinklerTooltips.js","webpack:///./src/Disp/MenuSections/Refreshmenu.js","webpack:///./src/Main/ClickHook.js","webpack:///./src/Cache/CPS/AverageQueue.js","webpack:///./src/Cache/FillCMDCache.js","webpack:///./src/Cache/CPS/CPS.js","webpack:///./src/Sim/SimulationEvents/BuyBuilding.js","webpack:///./src/Cache/PP/Building.js","webpack:///./src/Cache/PP/PP.js","webpack:///./src/Cache/PP/Upgrade.js","webpack:///./src/Sim/SimulationEvents/BuyUpgrades.js","webpack:///./src/Cache/PriceAndIncome/PriceAndIncome.js","webpack:///./src/Cache/Stats/ChainCookies.js","webpack:///./src/Cache/Stats/HeavenlyChips.js","webpack:///./src/Cache/Stats/MissingUpgrades.js","webpack:///./src/Disp/MenuSections/Statistics/CreateMissingUpgrades.js","webpack:///./src/Cache/Stats/Reindeer.js","webpack:///./src/Cache/Stats/Stats.js","webpack:///./src/Cache/TillNextAchievement/AllAmountTillNextAchievement.js","webpack:///./src/Cache/TillNextAchievement/IndividualAmountTillNextAchievement.js","webpack:///./src/Cache/Wrinklers/Wrinklers.js","webpack:///./src/Cache/CacheInit.js","webpack:///./src/Disp/HelperFunctions/PopWrinklers.js","webpack:///./src/Disp/Tooltips/Tooltip.js","webpack:///./src/Disp/TabTitle/FavIcon.js","webpack:///./src/Sim/InitializeData/InitData.js","webpack:///./src/Main/ReplaceGameElements/TooltipGrimoire.js","webpack:///./src/Main/ReplaceGameElements/NativeGrimoire.js","webpack:///./src/Cache/Dragon/Dragon.js","webpack:///./src/Data/Sectionheaders.js","webpack:///./src/Config/CheckNotificationPermissions.js","webpack:///./src/Disp/HelperFunctions/RefreshScale.js","webpack:///./src/Config/Toggles/ToggleBotBar.js","webpack:///./src/Data/settings.js","webpack:///./src/Config/Toggles/ToggleDetailedTime.js","webpack:///./src/Config/Toggles/ToggleUpgradeBarAndColour.js","webpack:///./src/Config/Toggles/ToggleUpgradeBarFixedPos.js","webpack:///./src/Config/Toggles/ToggleGCTimer.js","webpack:///./src/Config/Toggles/ToggleSectionHideButtons.js","webpack:///./src/Disp/HelperFunctions/UpdateColours.js","webpack:///./src/Disp/MenuSections/createMenuOptions.js","webpack:///./src/Disp/HelperFunctions/CalculateLuckyLevels.js","webpack:///./src/Disp/MenuSections/Statistics/CreateDOMElements.js","webpack:///./src/Config/ToggleSetting.js","webpack:///./src/Disp/MenuSections/Statistics/AddStatsPage.js","webpack:///./src/Disp/MenuSections/Statistics/CreateStatsSections.js","webpack:///./src/Sim/SimulationEvents/ResetAscension.js","webpack:///./src/Disp/MenuSections/Statistics/CreateMissingAchievements.js","webpack:///./src/Main/ReplaceGameFunctions/FixMouse.js","webpack:///./src/Main/ReplaceGameFunctions/ReplaceNative.js","webpack:///./src/Disp/Tooltips/PositionLocation.js","webpack:///./src/Main/ReplaceGameElements/TooltipUpgrades.js","webpack:///./src/Disp/Dragon/Dragon.js","webpack:///./src/Sim/SimulationEvents/AuraChange.js","webpack:///./src/Disp/MenuSections/AddMenus.js","webpack:///./src/Disp/TabTitle/TabTitle.js","webpack:///./src/Disp/Tooltips/AscendButton.js","webpack:///./src/Main/Initialization.js","webpack:///./src/Disp/Initialization/CssArea.js","webpack:///./src/Disp/BuildingsUpgrades/UpgradeBar.js","webpack:///./src/Disp/Initialization/CreateSectionHideButtons.js","webpack:///./src/Disp/Initialization/CreateWrinklerButton.js","webpack:///./src/Disp/Initialization/UpdateBuildingUpgradeStyle.js","webpack:///./src/Disp/buildingTiles/createBuildingLockButtons.js","webpack:///./src/Disp/buildingTiles/toggleBuildingLock.js","webpack:///./src/Main/ReplaceGameElements/Tooltips.js","webpack:///./src/Main/WrinklerArea/AddDetectArea.js","webpack:///./src/Sim/SimulationEvents/GodChange.js","webpack:///./src/Main/LoopHook.js","webpack:///./src/Disp/HelperFunctions/UpdateAscendState.js","webpack:///./src/Cache/CPS/NoGoldSwitchCPS.js","webpack:///./src/Sim/Calculations/NoGoldenSwitchCalc.js","webpack:///./src/Cache/PantheonGods/CacheGods.js","webpack:///./src/Cache/CPS/SellChoEgg.js","webpack:///./src/Sim/SimulationEvents/SellBuildingForChoEgg.js","webpack:///./src/Cache/CacheLoop.js","webpack:///./src/Cache/CPS/CurrWrinklerCPS.js","webpack:///./src/Main/CheckStates/Ticker.js","webpack:///./src/Main/CheckStates/Season.js","webpack:///./src/Main/CheckStates/Garden.js","webpack:///./src/Main/CheckStates/Grimoire.js","webpack:///./src/Main/CheckStates/Wrinkler.js","webpack:///./src/Main/CheckStates/GoldenCookie.js","webpack:///./src/Disp/GoldenCookieTimers/GoldenCookieTimers.js","webpack:///./src/Data/headers.js","webpack:///./src/InitSaveLoad/load.js","webpack:///./src/CookieMonster.js","webpack:///./src/InitSaveLoad/init.js","webpack:///./src/Data/Moddata.js","webpack:///./src/InitSaveLoad/save.js"],"sourcesContent":["/**\r\n * jscolor - JavaScript Color Picker\r\n *\r\n * @link http://jscolor.com\r\n * @license For open source use: GPLv3\r\n * For commercial use: JSColor Commercial License\r\n * @author Jan Odvarko - East Desire\r\n *\r\n * See usage examples at http://jscolor.com/examples/\r\n */\r\n\r\n\r\n(function (global, factory) {\r\n\r\n\t'use strict';\r\n\r\n\tif (typeof module === 'object' && typeof module.exports === 'object') {\r\n\t\t// Export jscolor as a module\r\n\t\tmodule.exports = global.document ?\r\n\t\t\tfactory (global) :\r\n\t\t\tfunction (win) {\r\n\t\t\t\tif (!win.document) {\r\n\t\t\t\t\tthrow new Error('jscolor needs a window with document');\r\n\t\t\t\t}\r\n\t\t\t\treturn factory(win);\r\n\t\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\t// Default use (no module export)\r\n\tfactory(global);\r\n\r\n})(typeof window !== 'undefined' ? window : this, function (window) { // BEGIN factory\r\n\r\n// BEGIN jscolor code\r\n\r\n\r\n'use strict';\r\n\r\n\r\nvar jscolor = (function () { // BEGIN jscolor\r\n\r\nvar jsc = {\r\n\r\n\r\n\tinitialized : false,\r\n\r\n\tinstances : [], // created instances of jscolor\r\n\r\n\treadyQueue : [], // functions waiting to be called after init\r\n\r\n\r\n\tregister : function () {\r\n\t\tif (typeof window !== 'undefined' && window.document) {\r\n\t\t\twindow.document.addEventListener('DOMContentLoaded', jsc.pub.init, false);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tinstallBySelector : function (selector, rootNode) {\r\n\t\trootNode = rootNode ? jsc.node(rootNode) : window.document;\r\n\t\tif (!rootNode) {\r\n\t\t\tthrow new Error('Missing root node');\r\n\t\t}\r\n\r\n\t\tvar elms = rootNode.querySelectorAll(selector);\r\n\r\n\t\t// for backward compatibility with DEPRECATED installation/configuration using className\r\n\t\tvar matchClass = new RegExp('(^|\\\\s)(' + jsc.pub.lookupClass + ')(\\\\s*(\\\\{[^}]*\\\\})|\\\\s|$)', 'i');\r\n\r\n\t\tfor (var i = 0; i < elms.length; i += 1) {\r\n\r\n\t\t\tif (elms[i].jscolor && elms[i].jscolor instanceof jsc.pub) {\r\n\t\t\t\tcontinue; // jscolor already installed on this element\r\n\t\t\t}\r\n\r\n\t\t\tif (elms[i].type !== undefined && elms[i].type.toLowerCase() == 'color' && jsc.isColorAttrSupported) {\r\n\t\t\t\tcontinue; // skips inputs of type 'color' if supported by the browser\r\n\t\t\t}\r\n\r\n\t\t\tvar dataOpts, m;\r\n\r\n\t\t\tif (\r\n\t\t\t\t(dataOpts = jsc.getDataAttr(elms[i], 'jscolor')) !== null ||\r\n\t\t\t\t(elms[i].className && (m = elms[i].className.match(matchClass))) // installation using className (DEPRECATED)\r\n\t\t\t) {\r\n\t\t\t\tvar targetElm = elms[i];\r\n\r\n\t\t\t\tvar optsStr = '';\r\n\t\t\t\tif (dataOpts !== null) {\r\n\t\t\t\t\toptsStr = dataOpts;\r\n\r\n\t\t\t\t} else if (m) { // installation using className (DEPRECATED)\r\n\t\t\t\t\tconsole.warn('Installation using class name is DEPRECATED. Use data-jscolor=\"\" attribute instead.' + jsc.docsRef);\r\n\t\t\t\t\tif (m[4]) {\r\n\t\t\t\t\t\toptsStr = m[4];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar opts = null;\r\n\t\t\t\tif (optsStr.trim()) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\topts = jsc.parseOptionsStr(optsStr);\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tconsole.warn(e + '\\n' + optsStr);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tnew jsc.pub(targetElm, opts);\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tparseOptionsStr : function (str) {\r\n\t\tvar opts = null;\r\n\r\n\t\ttry {\r\n\t\t\topts = JSON.parse(str);\r\n\r\n\t\t} catch (eParse) {\r\n\t\t\tif (!jsc.pub.looseJSON) {\r\n\t\t\t\tthrow new Error('Could not parse jscolor options as JSON: ' + eParse);\r\n\t\t\t} else {\r\n\t\t\t\t// loose JSON syntax is enabled -> try to evaluate the options string as JavaScript object\r\n\t\t\t\ttry {\r\n\t\t\t\t\topts = (new Function ('var opts = (' + str + '); return typeof opts === \"object\" ? opts : {};'))();\r\n\t\t\t\t} catch (eEval) {\r\n\t\t\t\t\tthrow new Error('Could not evaluate jscolor options: ' + eEval);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn opts;\r\n\t},\r\n\r\n\r\n\tgetInstances : function () {\r\n\t\tvar inst = [];\r\n\t\tfor (var i = 0; i < jsc.instances.length; i += 1) {\r\n\t\t\t// if the targetElement still exists, the instance is considered \"alive\"\r\n\t\t\tif (jsc.instances[i] && jsc.instances[i].targetElement) {\r\n\t\t\t\tinst.push(jsc.instances[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn inst;\r\n\t},\r\n\r\n\r\n\tcreateEl : function (tagName) {\r\n\t\tvar el = window.document.createElement(tagName);\r\n\t\tjsc.setData(el, 'gui', true);\r\n\t\treturn el;\r\n\t},\r\n\r\n\r\n\tnode : function (nodeOrSelector) {\r\n\t\tif (!nodeOrSelector) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif (typeof nodeOrSelector === 'string') {\r\n\t\t\t// query selector\r\n\t\t\tvar sel = nodeOrSelector;\r\n\t\t\tvar el = null;\r\n\t\t\ttry {\r\n\t\t\t\tel = window.document.querySelector(sel);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tconsole.warn(e);\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tif (!el) {\r\n\t\t\t\tconsole.warn('No element matches the selector: %s', sel);\r\n\t\t\t}\r\n\t\t\treturn el;\r\n\t\t}\r\n\r\n\t\tif (jsc.isNode(nodeOrSelector)) {\r\n\t\t\t// DOM node\r\n\t\t\treturn nodeOrSelector;\r\n\t\t}\r\n\r\n\t\tconsole.warn('Invalid node of type %s: %s', typeof nodeOrSelector, nodeOrSelector);\r\n\t\treturn null;\r\n\t},\r\n\r\n\r\n\t// See https://stackoverflow.com/questions/384286/\r\n\tisNode : function (val) {\r\n\t\tif (typeof Node === 'object') {\r\n\t\t\treturn val instanceof Node;\r\n\t\t}\r\n\t\treturn val && typeof val === 'object' && typeof val.nodeType === 'number' && typeof val.nodeName === 'string';\r\n\t},\r\n\r\n\r\n\tnodeName : function (node) {\r\n\t\tif (node && node.nodeName) {\r\n\t\t\treturn node.nodeName.toLowerCase();\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\r\n\tremoveChildren : function (node) {\r\n\t\twhile (node.firstChild) {\r\n\t\t\tnode.removeChild(node.firstChild);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tisTextInput : function (el) {\r\n\t\treturn el && jsc.nodeName(el) === 'input' && el.type.toLowerCase() === 'text';\r\n\t},\r\n\r\n\r\n\tisButton : function (el) {\r\n\t\tif (!el) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tvar n = jsc.nodeName(el);\r\n\t\treturn (\r\n\t\t\t(n === 'button') ||\r\n\t\t\t(n === 'input' && ['button', 'submit', 'reset'].indexOf(el.type.toLowerCase()) > -1)\r\n\t\t);\r\n\t},\r\n\r\n\r\n\tisButtonEmpty : function (el) {\r\n\t\tswitch (jsc.nodeName(el)) {\r\n\t\t\tcase 'input': return (!el.value || el.value.trim() === '');\r\n\t\t\tcase 'button': return (el.textContent.trim() === '');\r\n\t\t}\r\n\t\treturn null; // could not determine element's text\r\n\t},\r\n\r\n\r\n\t// See https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\r\n\tisPassiveEventSupported : (function () {\r\n\t\tvar supported = false;\r\n\r\n\t\ttry {\r\n\t\t\tvar opts = Object.defineProperty({}, 'passive', {\r\n\t\t\t\tget: function () { supported = true; }\r\n\t\t\t});\r\n\t\t\twindow.addEventListener('testPassive', null, opts);\r\n\t\t\twindow.removeEventListener('testPassive', null, opts);\r\n\t\t} catch (e) {}\r\n\r\n\t\treturn supported;\r\n\t})(),\r\n\r\n\r\n\tisColorAttrSupported : (function () {\r\n\t\tvar elm = window.document.createElement('input');\r\n\t\tif (elm.setAttribute) {\r\n\t\t\telm.setAttribute('type', 'color');\r\n\t\t\tif (elm.type.toLowerCase() == 'color') {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t})(),\r\n\r\n\r\n\tdataProp : '_data_jscolor',\r\n\r\n\r\n\t// usage:\r\n\t// setData(obj, prop, value)\r\n\t// setData(obj, {prop:value, ...})\r\n\t//\r\n\tsetData : function () {\r\n\t\tvar obj = arguments[0];\r\n\r\n\t\tif (arguments.length === 3) {\r\n\t\t\t// setting a single property\r\n\t\t\tvar data = obj.hasOwnProperty(jsc.dataProp) ? obj[jsc.dataProp] : (obj[jsc.dataProp] = {});\r\n\t\t\tvar prop = arguments[1];\r\n\t\t\tvar value = arguments[2];\r\n\r\n\t\t\tdata[prop] = value;\r\n\t\t\treturn true;\r\n\r\n\t\t} else if (arguments.length === 2 && typeof arguments[1] === 'object') {\r\n\t\t\t// setting multiple properties\r\n\t\t\tvar data = obj.hasOwnProperty(jsc.dataProp) ? obj[jsc.dataProp] : (obj[jsc.dataProp] = {});\r\n\t\t\tvar map = arguments[1];\r\n\r\n\t\t\tfor (var prop in map) {\r\n\t\t\t\tif (map.hasOwnProperty(prop)) {\r\n\t\t\t\t\tdata[prop] = map[prop];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tthrow new Error('Invalid arguments');\r\n\t},\r\n\r\n\r\n\t// usage:\r\n\t// removeData(obj, prop, [prop...])\r\n\t//\r\n\tremoveData : function () {\r\n\t\tvar obj = arguments[0];\r\n\t\tif (!obj.hasOwnProperty(jsc.dataProp)) {\r\n\t\t\treturn true; // data object does not exist\r\n\t\t}\r\n\t\tfor (var i = 1; i < arguments.length; i += 1) {\r\n\t\t\tvar prop = arguments[i];\r\n\t\t\tdelete obj[jsc.dataProp][prop];\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n\r\n\r\n\tgetData : function (obj, prop, setDefault) {\r\n\t\tif (!obj.hasOwnProperty(jsc.dataProp)) {\r\n\t\t\t// data object does not exist\r\n\t\t\tif (setDefault !== undefined) {\r\n\t\t\t\tobj[jsc.dataProp] = {}; // create data object\r\n\t\t\t} else {\r\n\t\t\t\treturn undefined; // no value to return\r\n\t\t\t}\r\n\t\t}\r\n\t\tvar data = obj[jsc.dataProp];\r\n\r\n\t\tif (!data.hasOwnProperty(prop) && setDefault !== undefined) {\r\n\t\t\tdata[prop] = setDefault;\r\n\t\t}\r\n\t\treturn data[prop];\r\n\t},\r\n\r\n\r\n\tgetDataAttr : function (el, name) {\r\n\t\tvar attrName = 'data-' + name;\r\n\t\tvar attrValue = el.getAttribute(attrName);\r\n\t\treturn attrValue;\r\n\t},\r\n\r\n\r\n\tsetDataAttr : function (el, name, value) {\r\n\t\tvar attrName = 'data-' + name;\r\n\t\tel.setAttribute(attrName, value);\r\n\t},\r\n\r\n\r\n\t_attachedGroupEvents : {},\r\n\r\n\r\n\tattachGroupEvent : function (groupName, el, evnt, func) {\r\n\t\tif (!jsc._attachedGroupEvents.hasOwnProperty(groupName)) {\r\n\t\t\tjsc._attachedGroupEvents[groupName] = [];\r\n\t\t}\r\n\t\tjsc._attachedGroupEvents[groupName].push([el, evnt, func]);\r\n\t\tel.addEventListener(evnt, func, false);\r\n\t},\r\n\r\n\r\n\tdetachGroupEvents : function (groupName) {\r\n\t\tif (jsc._attachedGroupEvents.hasOwnProperty(groupName)) {\r\n\t\t\tfor (var i = 0; i < jsc._attachedGroupEvents[groupName].length; i += 1) {\r\n\t\t\t\tvar evt = jsc._attachedGroupEvents[groupName][i];\r\n\t\t\t\tevt[0].removeEventListener(evt[1], evt[2], false);\r\n\t\t\t}\r\n\t\t\tdelete jsc._attachedGroupEvents[groupName];\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tpreventDefault : function (e) {\r\n\t\tif (e.preventDefault) { e.preventDefault(); }\r\n\t\te.returnValue = false;\r\n\t},\r\n\r\n\r\n\tcaptureTarget : function (target) {\r\n\t\t// IE\r\n\t\tif (target.setCapture) {\r\n\t\t\tjsc._capturedTarget = target;\r\n\t\t\tjsc._capturedTarget.setCapture();\r\n\t\t}\r\n\t},\r\n\r\n\r\n\treleaseTarget : function () {\r\n\t\t// IE\r\n\t\tif (jsc._capturedTarget) {\r\n\t\t\tjsc._capturedTarget.releaseCapture();\r\n\t\t\tjsc._capturedTarget = null;\r\n\t\t}\r\n\t},\r\n\r\n\r\n\ttriggerEvent : function (el, eventName, bubbles, cancelable) {\r\n\t\tif (!el) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar ev = null;\r\n\r\n\t\tif (typeof Event === 'function') {\r\n\t\t\tev = new Event(eventName, {\r\n\t\t\t\tbubbles: bubbles,\r\n\t\t\t\tcancelable: cancelable\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\t// IE\r\n\t\t\tev = window.document.createEvent('Event');\r\n\t\t\tev.initEvent(eventName, bubbles, cancelable);\r\n\t\t}\r\n\r\n\t\tif (!ev) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// so that we know that the event was triggered internally\r\n\t\tjsc.setData(ev, 'internal', true);\r\n\r\n\t\tel.dispatchEvent(ev);\r\n\t\treturn true;\r\n\t},\r\n\r\n\r\n\ttriggerInputEvent : function (el, eventName, bubbles, cancelable) {\r\n\t\tif (!el) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (jsc.isTextInput(el)) {\r\n\t\t\tjsc.triggerEvent(el, eventName, bubbles, cancelable);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\teventKey : function (ev) {\r\n\t\tvar keys = {\r\n\t\t\t9: 'Tab',\r\n\t\t\t13: 'Enter',\r\n\t\t\t27: 'Escape',\r\n\t\t};\r\n\t\tif (typeof ev.code === 'string') {\r\n\t\t\treturn ev.code;\r\n\t\t} else if (ev.keyCode !== undefined && keys.hasOwnProperty(ev.keyCode)) {\r\n\t\t\treturn keys[ev.keyCode];\r\n\t\t}\r\n\t\treturn null;\r\n\t},\r\n\r\n\r\n\tstrList : function (str) {\r\n\t\tif (!str) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t\treturn str.replace(/^\\s+|\\s+$/g, '').split(/\\s+/);\r\n\t},\r\n\r\n\r\n\t// The className parameter (str) can only contain a single class name\r\n\thasClass : function (elm, className) {\r\n\t\tif (!className) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (elm.classList !== undefined) {\r\n\t\t\treturn elm.classList.contains(className);\r\n\t\t}\r\n\t\t// polyfill\r\n\t\treturn -1 != (' ' + elm.className.replace(/\\s+/g, ' ') + ' ').indexOf(' ' + className + ' ');\r\n\t},\r\n\r\n\r\n\t// The className parameter (str) can contain multiple class names separated by whitespace\r\n\taddClass : function (elm, className) {\r\n\t\tvar classNames = jsc.strList(className);\r\n\r\n\t\tif (elm.classList !== undefined) {\r\n\t\t\tfor (var i = 0; i < classNames.length; i += 1) {\r\n\t\t\t\telm.classList.add(classNames[i]);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// polyfill\r\n\t\tfor (var i = 0; i < classNames.length; i += 1) {\r\n\t\t\tif (!jsc.hasClass(elm, classNames[i])) {\r\n\t\t\t\telm.className += (elm.className ? ' ' : '') + classNames[i];\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t// The className parameter (str) can contain multiple class names separated by whitespace\r\n\tremoveClass : function (elm, className) {\r\n\t\tvar classNames = jsc.strList(className);\r\n\r\n\t\tif (elm.classList !== undefined) {\r\n\t\t\tfor (var i = 0; i < classNames.length; i += 1) {\r\n\t\t\t\telm.classList.remove(classNames[i]);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// polyfill\r\n\t\tfor (var i = 0; i < classNames.length; i += 1) {\r\n\t\t\tvar repl = new RegExp(\r\n\t\t\t\t'^\\\\s*' + classNames[i] + '\\\\s*|' +\r\n\t\t\t\t'\\\\s*' + classNames[i] + '\\\\s*$|' +\r\n\t\t\t\t'\\\\s+' + classNames[i] + '(\\\\s+)',\r\n\t\t\t\t'g'\r\n\t\t\t);\r\n\t\t\telm.className = elm.className.replace(repl, '$1');\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tgetCompStyle : function (elm) {\r\n\t\tvar compStyle = window.getComputedStyle ? window.getComputedStyle(elm) : elm.currentStyle;\r\n\r\n\t\t// Note: In Firefox, getComputedStyle returns null in a hidden iframe,\r\n\t\t// that's why we need to check if the returned value is non-empty\r\n\t\tif (!compStyle) {\r\n\t\t\treturn {};\r\n\t\t}\r\n\t\treturn compStyle;\r\n\t},\r\n\r\n\r\n\t// Note:\r\n\t// Setting a property to NULL reverts it to the state before it was first set\r\n\t// with the 'reversible' flag enabled\r\n\t//\r\n\tsetStyle : function (elm, styles, important, reversible) {\r\n\t\t// using '' for standard priority (IE10 apparently doesn't like value undefined)\r\n\t\tvar priority = important ? 'important' : '';\r\n\t\tvar origStyle = null;\r\n\r\n\t\tfor (var prop in styles) {\r\n\t\t\tif (styles.hasOwnProperty(prop)) {\r\n\t\t\t\tvar setVal = null;\r\n\r\n\t\t\t\tif (styles[prop] === null) {\r\n\t\t\t\t\t// reverting a property value\r\n\r\n\t\t\t\t\tif (!origStyle) {\r\n\t\t\t\t\t\t// get the original style object, but dont't try to create it if it doesn't exist\r\n\t\t\t\t\t\torigStyle = jsc.getData(elm, 'origStyle');\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (origStyle && origStyle.hasOwnProperty(prop)) {\r\n\t\t\t\t\t\t// we have property's original value -> use it\r\n\t\t\t\t\t\tsetVal = origStyle[prop];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// setting a property value\r\n\r\n\t\t\t\t\tif (reversible) {\r\n\t\t\t\t\t\tif (!origStyle) {\r\n\t\t\t\t\t\t\t// get the original style object and if it doesn't exist, create it\r\n\t\t\t\t\t\t\torigStyle = jsc.getData(elm, 'origStyle', {});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!origStyle.hasOwnProperty(prop)) {\r\n\t\t\t\t\t\t\t// original property value not yet stored -> store it\r\n\t\t\t\t\t\t\torigStyle[prop] = elm.style[prop];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tsetVal = styles[prop];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (setVal !== null) {\r\n\t\t\t\t\telm.style.setProperty(prop, setVal, priority);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\thexColor : function (r, g, b) {\r\n\t\treturn '#' + (\r\n\t\t\t('0' + Math.round(r).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(g).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(b).toString(16)).substr(-2)\r\n\t\t).toUpperCase();\r\n\t},\r\n\r\n\r\n\thexaColor : function (r, g, b, a) {\r\n\t\treturn '#' + (\r\n\t\t\t('0' + Math.round(r).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(g).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(b).toString(16)).substr(-2) +\r\n\t\t\t('0' + Math.round(a * 255).toString(16)).substr(-2)\r\n\t\t).toUpperCase();\r\n\t},\r\n\r\n\r\n\trgbColor : function (r, g, b) {\r\n\t\treturn 'rgb(' +\r\n\t\t\tMath.round(r) + ',' +\r\n\t\t\tMath.round(g) + ',' +\r\n\t\t\tMath.round(b) +\r\n\t\t')';\r\n\t},\r\n\r\n\r\n\trgbaColor : function (r, g, b, a) {\r\n\t\treturn 'rgba(' +\r\n\t\t\tMath.round(r) + ',' +\r\n\t\t\tMath.round(g) + ',' +\r\n\t\t\tMath.round(b) + ',' +\r\n\t\t\t(Math.round((a===undefined || a===null ? 1 : a) * 100) / 100) +\r\n\t\t')';\r\n\t},\r\n\r\n\r\n\tlinearGradient : (function () {\r\n\r\n\t\tfunction getFuncName () {\r\n\t\t\tvar stdName = 'linear-gradient';\r\n\t\t\tvar prefixes = ['', '-webkit-', '-moz-', '-o-', '-ms-'];\r\n\t\t\tvar helper = window.document.createElement('div');\r\n\r\n\t\t\tfor (var i = 0; i < prefixes.length; i += 1) {\r\n\t\t\t\tvar tryFunc = prefixes[i] + stdName;\r\n\t\t\t\tvar tryVal = tryFunc + '(to right, rgba(0,0,0,0), rgba(0,0,0,0))';\r\n\r\n\t\t\t\thelper.style.background = tryVal;\r\n\t\t\t\tif (helper.style.background) { // CSS background successfully set -> function name is supported\r\n\t\t\t\t\treturn tryFunc;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn stdName; // fallback to standard 'linear-gradient' without vendor prefix\r\n\t\t}\r\n\r\n\t\tvar funcName = getFuncName();\r\n\r\n\t\treturn function () {\r\n\t\t\treturn funcName + '(' + Array.prototype.join.call(arguments, ', ') + ')';\r\n\t\t};\r\n\r\n\t})(),\r\n\r\n\r\n\tsetBorderRadius : function (elm, value) {\r\n\t\tjsc.setStyle(elm, {'border-radius' : value || '0'});\r\n\t},\r\n\r\n\r\n\tsetBoxShadow : function (elm, value) {\r\n\t\tjsc.setStyle(elm, {'box-shadow': value || 'none'});\r\n\t},\r\n\r\n\r\n\tgetElementPos : function (e, relativeToViewport) {\r\n\t\tvar x=0, y=0;\r\n\t\tvar rect = e.getBoundingClientRect();\r\n\t\tx = rect.left;\r\n\t\ty = rect.top;\r\n\t\tif (!relativeToViewport) {\r\n\t\t\tvar viewPos = jsc.getViewPos();\r\n\t\t\tx += viewPos[0];\r\n\t\t\ty += viewPos[1];\r\n\t\t}\r\n\t\treturn [x, y];\r\n\t},\r\n\r\n\r\n\tgetElementSize : function (e) {\r\n\t\treturn [e.offsetWidth, e.offsetHeight];\r\n\t},\r\n\r\n\r\n\t// get pointer's X/Y coordinates relative to viewport\r\n\tgetAbsPointerPos : function (e) {\r\n\t\tvar x = 0, y = 0;\r\n\t\tif (typeof e.changedTouches !== 'undefined' && e.changedTouches.length) {\r\n\t\t\t// touch devices\r\n\t\t\tx = e.changedTouches[0].clientX;\r\n\t\t\ty = e.changedTouches[0].clientY;\r\n\t\t} else if (typeof e.clientX === 'number') {\r\n\t\t\tx = e.clientX;\r\n\t\t\ty = e.clientY;\r\n\t\t}\r\n\t\treturn { x: x, y: y };\r\n\t},\r\n\r\n\r\n\t// get pointer's X/Y coordinates relative to target element\r\n\tgetRelPointerPos : function (e) {\r\n\t\tvar target = e.target || e.srcElement;\r\n\t\tvar targetRect = target.getBoundingClientRect();\r\n\r\n\t\tvar x = 0, y = 0;\r\n\r\n\t\tvar clientX = 0, clientY = 0;\r\n\t\tif (typeof e.changedTouches !== 'undefined' && e.changedTouches.length) {\r\n\t\t\t// touch devices\r\n\t\t\tclientX = e.changedTouches[0].clientX;\r\n\t\t\tclientY = e.changedTouches[0].clientY;\r\n\t\t} else if (typeof e.clientX === 'number') {\r\n\t\t\tclientX = e.clientX;\r\n\t\t\tclientY = e.clientY;\r\n\t\t}\r\n\r\n\t\tx = clientX - targetRect.left;\r\n\t\ty = clientY - targetRect.top;\r\n\t\treturn { x: x, y: y };\r\n\t},\r\n\r\n\r\n\tgetViewPos : function () {\r\n\t\tvar doc = window.document.documentElement;\r\n\t\treturn [\r\n\t\t\t(window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0),\r\n\t\t\t(window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0)\r\n\t\t];\r\n\t},\r\n\r\n\r\n\tgetViewSize : function () {\r\n\t\tvar doc = window.document.documentElement;\r\n\t\treturn [\r\n\t\t\t(window.innerWidth || doc.clientWidth),\r\n\t\t\t(window.innerHeight || doc.clientHeight),\r\n\t\t];\r\n\t},\r\n\r\n\r\n\t// r: 0-255\r\n\t// g: 0-255\r\n\t// b: 0-255\r\n\t//\r\n\t// returns: [ 0-360, 0-100, 0-100 ]\r\n\t//\r\n\tRGB_HSV : function (r, g, b) {\r\n\t\tr /= 255;\r\n\t\tg /= 255;\r\n\t\tb /= 255;\r\n\t\tvar n = Math.min(Math.min(r,g),b);\r\n\t\tvar v = Math.max(Math.max(r,g),b);\r\n\t\tvar m = v - n;\r\n\t\tif (m === 0) { return [ null, 0, 100 * v ]; }\r\n\t\tvar h = r===n ? 3+(b-g)/m : (g===n ? 5+(r-b)/m : 1+(g-r)/m);\r\n\t\treturn [\r\n\t\t\t60 * (h===6?0:h),\r\n\t\t\t100 * (m/v),\r\n\t\t\t100 * v\r\n\t\t];\r\n\t},\r\n\r\n\r\n\t// h: 0-360\r\n\t// s: 0-100\r\n\t// v: 0-100\r\n\t//\r\n\t// returns: [ 0-255, 0-255, 0-255 ]\r\n\t//\r\n\tHSV_RGB : function (h, s, v) {\r\n\t\tvar u = 255 * (v / 100);\r\n\r\n\t\tif (h === null) {\r\n\t\t\treturn [ u, u, u ];\r\n\t\t}\r\n\r\n\t\th /= 60;\r\n\t\ts /= 100;\r\n\r\n\t\tvar i = Math.floor(h);\r\n\t\tvar f = i%2 ? h-i : 1-(h-i);\r\n\t\tvar m = u * (1 - s);\r\n\t\tvar n = u * (1 - s * f);\r\n\t\tswitch (i) {\r\n\t\t\tcase 6:\r\n\t\t\tcase 0: return [u,n,m];\r\n\t\t\tcase 1: return [n,u,m];\r\n\t\t\tcase 2: return [m,u,n];\r\n\t\t\tcase 3: return [m,n,u];\r\n\t\t\tcase 4: return [n,m,u];\r\n\t\t\tcase 5: return [u,m,n];\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tparseColorString : function (str) {\r\n\t\tvar ret = {\r\n\t\t\trgba: null,\r\n\t\t\tformat: null // 'hex' | 'hexa' | 'rgb' | 'rgba'\r\n\t\t};\r\n\r\n\t\tvar m;\r\n\r\n\t\tif (m = str.match(/^\\W*([0-9A-F]{3,8})\\W*$/i)) {\r\n\t\t\t// HEX notation\r\n\r\n\t\t\tif (m[1].length === 8) {\r\n\t\t\t\t// 8-char notation (= with alpha)\r\n\t\t\t\tret.format = 'hexa';\r\n\t\t\t\tret.rgba = [\r\n\t\t\t\t\tparseInt(m[1].substr(0,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(2,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(4,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(6,2),16) / 255\r\n\t\t\t\t];\r\n\r\n\t\t\t} else if (m[1].length === 6) {\r\n\t\t\t\t// 6-char notation\r\n\t\t\t\tret.format = 'hex';\r\n\t\t\t\tret.rgba = [\r\n\t\t\t\t\tparseInt(m[1].substr(0,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(2,2),16),\r\n\t\t\t\t\tparseInt(m[1].substr(4,2),16),\r\n\t\t\t\t\tnull\r\n\t\t\t\t];\r\n\r\n\t\t\t} else if (m[1].length === 3) {\r\n\t\t\t\t// 3-char notation\r\n\t\t\t\tret.format = 'hex';\r\n\t\t\t\tret.rgba = [\r\n\t\t\t\t\tparseInt(m[1].charAt(0) + m[1].charAt(0),16),\r\n\t\t\t\t\tparseInt(m[1].charAt(1) + m[1].charAt(1),16),\r\n\t\t\t\t\tparseInt(m[1].charAt(2) + m[1].charAt(2),16),\r\n\t\t\t\t\tnull\r\n\t\t\t\t];\r\n\r\n\t\t\t} else {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\treturn ret;\r\n\t\t}\r\n\r\n\t\tif (m = str.match(/^\\W*rgba?\\(([^)]*)\\)\\W*$/i)) {\r\n\t\t\t// rgb(...) or rgba(...) notation\r\n\r\n\t\t\tvar par = m[1].split(',');\r\n\t\t\tvar re = /^\\s*(\\d+|\\d*\\.\\d+|\\d+\\.\\d*)\\s*$/;\r\n\t\t\tvar mR, mG, mB, mA;\r\n\t\t\tif (\r\n\t\t\t\tpar.length >= 3 &&\r\n\t\t\t\t(mR = par[0].match(re)) &&\r\n\t\t\t\t(mG = par[1].match(re)) &&\r\n\t\t\t\t(mB = par[2].match(re))\r\n\t\t\t) {\r\n\t\t\t\tret.format = 'rgb';\r\n\t\t\t\tret.rgba = [\r\n\t\t\t\t\tparseFloat(mR[1]) || 0,\r\n\t\t\t\t\tparseFloat(mG[1]) || 0,\r\n\t\t\t\t\tparseFloat(mB[1]) || 0,\r\n\t\t\t\t\tnull\r\n\t\t\t\t];\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tpar.length >= 4 &&\r\n\t\t\t\t\t(mA = par[3].match(re))\r\n\t\t\t\t) {\r\n\t\t\t\t\tret.format = 'rgba';\r\n\t\t\t\t\tret.rgba[3] = parseFloat(mA[1]) || 0;\r\n\t\t\t\t}\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\r\n\tparsePaletteValue : function (mixed) {\r\n\t\tvar vals = [];\r\n\r\n\t\tif (typeof mixed === 'string') { // input is a string of space separated color values\r\n\t\t\t// rgb() and rgba() may contain spaces too, so let's find all color values by regex\r\n\t\t\tmixed.replace(/#[0-9A-F]{3}([0-9A-F]{3})?|rgba?\\(([^)]*)\\)/ig, function (val) {\r\n\t\t\t\tvals.push(val);\r\n\t\t\t});\r\n\t\t} else if (Array.isArray(mixed)) { // input is an array of color values\r\n\t\t\tvals = mixed;\r\n\t\t}\r\n\r\n\t\t// convert all values into uniform color format\r\n\r\n\t\tvar colors = [];\r\n\r\n\t\tfor (var i = 0; i < vals.length; i++) {\r\n\t\t\tvar color = jsc.parseColorString(vals[i]);\r\n\t\t\tif (color) {\r\n\t\t\t\tcolors.push(color);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn colors;\r\n\t},\r\n\r\n\r\n\tcontainsTranparentColor : function (colors) {\r\n\t\tfor (var i = 0; i < colors.length; i++) {\r\n\t\t\tvar a = colors[i].rgba[3];\r\n\t\t\tif (a !== null && a < 1.0) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\r\n\tisAlphaFormat : function (format) {\r\n\t\tswitch (format.toLowerCase()) {\r\n\t\tcase 'hexa':\r\n\t\tcase 'rgba':\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\r\n\t// Canvas scaling for retina displays\r\n\t//\r\n\t// adapted from https://www.html5rocks.com/en/tutorials/canvas/hidpi/\r\n\t//\r\n\tscaleCanvasForHighDPR : function (canvas) {\r\n\t\tvar dpr = window.devicePixelRatio || 1;\r\n\t\tcanvas.width *= dpr;\r\n\t\tcanvas.height *= dpr;\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\t\tctx.scale(dpr, dpr);\r\n\t},\r\n\r\n\r\n\tgenColorPreviewCanvas : function (color, separatorPos, specWidth, scaleForHighDPR) {\r\n\r\n\t\tvar sepW = Math.round(jsc.pub.previewSeparator.length);\r\n\t\tvar sqSize = jsc.pub.chessboardSize;\r\n\t\tvar sqColor1 = jsc.pub.chessboardColor1;\r\n\t\tvar sqColor2 = jsc.pub.chessboardColor2;\r\n\r\n\t\tvar cWidth = specWidth ? specWidth : sqSize * 2;\r\n\t\tvar cHeight = sqSize * 2;\r\n\r\n\t\tvar canvas = jsc.createEl('canvas');\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\r\n\t\tcanvas.width = cWidth;\r\n\t\tcanvas.height = cHeight;\r\n\t\tif (scaleForHighDPR) {\r\n\t\t\tjsc.scaleCanvasForHighDPR(canvas);\r\n\t\t}\r\n\r\n\t\t// transparency chessboard - background\r\n\t\tctx.fillStyle = sqColor1;\r\n\t\tctx.fillRect(0, 0, cWidth, cHeight);\r\n\r\n\t\t// transparency chessboard - squares\r\n\t\tctx.fillStyle = sqColor2;\r\n\t\tfor (var x = 0; x < cWidth; x += sqSize * 2) {\r\n\t\t\tctx.fillRect(x, 0, sqSize, sqSize);\r\n\t\t\tctx.fillRect(x + sqSize, sqSize, sqSize, sqSize);\r\n\t\t}\r\n\r\n\t\tif (color) {\r\n\t\t\t// actual color in foreground\r\n\t\t\tctx.fillStyle = color;\r\n\t\t\tctx.fillRect(0, 0, cWidth, cHeight);\r\n\t\t}\r\n\r\n\t\tvar start = null;\r\n\t\tswitch (separatorPos) {\r\n\t\t\tcase 'left':\r\n\t\t\t\tstart = 0;\r\n\t\t\t\tctx.clearRect(0, 0, sepW/2, cHeight);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'right':\r\n\t\t\t\tstart = cWidth - sepW;\r\n\t\t\t\tctx.clearRect(cWidth - (sepW/2), 0, sepW/2, cHeight);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tif (start !== null) {\r\n\t\t\tctx.lineWidth = 1;\r\n\t\t\tfor (var i = 0; i < jsc.pub.previewSeparator.length; i += 1) {\r\n\t\t\t\tctx.beginPath();\r\n\t\t\t\tctx.strokeStyle = jsc.pub.previewSeparator[i];\r\n\t\t\t\tctx.moveTo(0.5 + start + i, 0);\r\n\t\t\t\tctx.lineTo(0.5 + start + i, cHeight);\r\n\t\t\t\tctx.stroke();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tcanvas: canvas,\r\n\t\t\twidth: cWidth,\r\n\t\t\theight: cHeight,\r\n\t\t};\r\n\t},\r\n\r\n\r\n\t// if position or width is not set => fill the entire element (0%-100%)\r\n\tgenColorPreviewGradient : function (color, position, width) {\r\n\t\tvar params = [];\r\n\r\n\t\tif (position && width) {\r\n\t\t\tparams = [\r\n\t\t\t\t'to ' + {'left':'right', 'right':'left'}[position],\r\n\t\t\t\tcolor + ' 0%',\r\n\t\t\t\tcolor + ' ' + width + 'px',\r\n\t\t\t\t'rgba(0,0,0,0) ' + (width + 1) + 'px',\r\n\t\t\t\t'rgba(0,0,0,0) 100%',\r\n\t\t\t];\r\n\t\t} else {\r\n\t\t\tparams = [\r\n\t\t\t\t'to right',\r\n\t\t\t\tcolor + ' 0%',\r\n\t\t\t\tcolor + ' 100%',\r\n\t\t\t];\r\n\t\t}\r\n\r\n\t\treturn jsc.linearGradient.apply(this, params);\r\n\t},\r\n\r\n\r\n\tredrawPosition : function () {\r\n\r\n\t\tif (!jsc.picker || !jsc.picker.owner) {\r\n\t\t\treturn; // picker is not shown\r\n\t\t}\r\n\r\n\t\tvar thisObj = jsc.picker.owner;\r\n\r\n\t\tvar tp, vp;\r\n\r\n\t\tif (thisObj.fixed) {\r\n\t\t\t// Fixed elements are positioned relative to viewport,\r\n\t\t\t// therefore we can ignore the scroll offset\r\n\t\t\ttp = jsc.getElementPos(thisObj.targetElement, true); // target pos\r\n\t\t\tvp = [0, 0]; // view pos\r\n\t\t} else {\r\n\t\t\ttp = jsc.getElementPos(thisObj.targetElement); // target pos\r\n\t\t\tvp = jsc.getViewPos(); // view pos\r\n\t\t}\r\n\r\n\t\tvar ts = jsc.getElementSize(thisObj.targetElement); // target size\r\n\t\tvar vs = jsc.getViewSize(); // view size\r\n\t\tvar pd = jsc.getPickerDims(thisObj);\r\n\t\tvar ps = [pd.borderW, pd.borderH]; // picker outer size\r\n\t\tvar a, b, c;\r\n\t\tswitch (thisObj.position.toLowerCase()) {\r\n\t\t\tcase 'left': a=1; b=0; c=-1; break;\r\n\t\t\tcase 'right':a=1; b=0; c=1; break;\r\n\t\t\tcase 'top': a=0; b=1; c=-1; break;\r\n\t\t\tdefault: a=0; b=1; c=1; break;\r\n\t\t}\r\n\t\tvar l = (ts[b]+ps[b])/2;\r\n\r\n\t\t// compute picker position\r\n\t\tif (!thisObj.smartPosition) {\r\n\t\t\tvar pp = [\r\n\t\t\t\ttp[a],\r\n\t\t\t\ttp[b]+ts[b]-l+l*c\r\n\t\t\t];\r\n\t\t} else {\r\n\t\t\tvar pp = [\r\n\t\t\t\t-vp[a]+tp[a]+ps[a] > vs[a] ?\r\n\t\t\t\t\t(-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) :\r\n\t\t\t\t\ttp[a],\r\n\t\t\t\t-vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ?\r\n\t\t\t\t\t(-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) :\r\n\t\t\t\t\t(tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c)\r\n\t\t\t];\r\n\t\t}\r\n\r\n\t\tvar x = pp[a];\r\n\t\tvar y = pp[b];\r\n\t\tvar positionValue = thisObj.fixed ? 'fixed' : 'absolute';\r\n\t\tvar contractShadow =\r\n\t\t\t(pp[0] + ps[0] > tp[0] || pp[0] < tp[0] + ts[0]) &&\r\n\t\t\t(pp[1] + ps[1] < tp[1] + ts[1]);\r\n\r\n\t\tjsc._drawPosition(thisObj, x, y, positionValue, contractShadow);\r\n\t},\r\n\r\n\r\n\t_drawPosition : function (thisObj, x, y, positionValue, contractShadow) {\r\n\t\tvar vShadow = contractShadow ? 0 : thisObj.shadowBlur; // px\r\n\r\n\t\tjsc.picker.wrap.style.position = positionValue;\r\n\t\tjsc.picker.wrap.style.left = x + 'px';\r\n\t\tjsc.picker.wrap.style.top = y + 'px';\r\n\r\n\t\tjsc.setBoxShadow(\r\n\t\t\tjsc.picker.boxS,\r\n\t\t\tthisObj.shadow ?\r\n\t\t\t\tnew jsc.BoxShadow(0, vShadow, thisObj.shadowBlur, 0, thisObj.shadowColor) :\r\n\t\t\t\tnull);\r\n\t},\r\n\r\n\r\n\tgetPickerDims : function (thisObj) {\r\n\t\tvar w = 2 * thisObj.controlBorderWidth + thisObj.width;\r\n\t\tvar h = 2 * thisObj.controlBorderWidth + thisObj.height;\r\n\r\n\t\tvar sliderSpace = 2 * thisObj.controlBorderWidth + 2 * jsc.getControlPadding(thisObj) + thisObj.sliderSize;\r\n\r\n\t\tif (jsc.getSliderChannel(thisObj)) {\r\n\t\t\tw += sliderSpace;\r\n\t\t}\r\n\t\tif (thisObj.hasAlphaChannel()) {\r\n\t\t\tw += sliderSpace;\r\n\t\t}\r\n\r\n\t\tvar pal = jsc.getPaletteDims(thisObj, w);\r\n\r\n\t\tif (pal.height) {\r\n\t\t\th += pal.height + thisObj.padding;\r\n\t\t}\r\n\t\tif (thisObj.closeButton) {\r\n\t\t\th += 2 * thisObj.controlBorderWidth + thisObj.padding + thisObj.buttonHeight;\r\n\t\t}\r\n\r\n\t\tvar pW = w + (2 * thisObj.padding);\r\n\t\tvar pH = h + (2 * thisObj.padding);\r\n\r\n\t\treturn {\r\n\t\t\tcontentW: w,\r\n\t\t\tcontentH: h,\r\n\t\t\tpaddedW: pW,\r\n\t\t\tpaddedH: pH,\r\n\t\t\tborderW: pW + (2 * thisObj.borderWidth),\r\n\t\t\tborderH: pH + (2 * thisObj.borderWidth),\r\n\t\t\tpalette: pal,\r\n\t\t};\r\n\t},\r\n\r\n\r\n\tgetPaletteDims : function (thisObj, width) {\r\n\t\tvar cols = 0, rows = 0, cellW = 0, cellH = 0, height = 0;\r\n\t\tvar sampleCount = thisObj._palette ? thisObj._palette.length : 0;\r\n\r\n\t\tif (sampleCount) {\r\n\t\t\tcols = thisObj.paletteCols;\r\n\t\t\trows = cols > 0 ? Math.ceil(sampleCount / cols) : 0;\r\n\r\n\t\t\t// color sample's dimensions (includes border)\r\n\t\t\tcellW = Math.max(1, Math.floor((width - ((cols - 1) * thisObj.paletteSpacing)) / cols));\r\n\t\t\tcellH = thisObj.paletteHeight ? Math.min(thisObj.paletteHeight, cellW) : cellW;\r\n\t\t}\r\n\r\n\t\tif (rows) {\r\n\t\t\theight =\r\n\t\t\t\trows * cellH +\r\n\t\t\t\t(rows - 1) * thisObj.paletteSpacing;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tcols: cols,\r\n\t\t\trows: rows,\r\n\t\t\tcellW: cellW,\r\n\t\t\tcellH: cellH,\r\n\t\t\twidth: width,\r\n\t\t\theight: height,\r\n\t\t};\r\n\t},\r\n\r\n\r\n\tgetControlPadding : function (thisObj) {\r\n\t\treturn Math.max(\r\n\t\t\tthisObj.padding / 2,\r\n\t\t\t(2 * thisObj.pointerBorderWidth + thisObj.pointerThickness) - thisObj.controlBorderWidth\r\n\t\t);\r\n\t},\r\n\r\n\r\n\tgetPadYChannel : function (thisObj) {\r\n\t\tswitch (thisObj.mode.charAt(1).toLowerCase()) {\r\n\t\t\tcase 'v': return 'v'; break;\r\n\t\t}\r\n\t\treturn 's';\r\n\t},\r\n\r\n\r\n\tgetSliderChannel : function (thisObj) {\r\n\t\tif (thisObj.mode.length > 2) {\r\n\t\t\tswitch (thisObj.mode.charAt(2).toLowerCase()) {\r\n\t\t\t\tcase 's': return 's'; break;\r\n\t\t\t\tcase 'v': return 'v'; break;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t},\r\n\r\n\r\n\t// calls function specified in picker's property\r\n\ttriggerCallback : function (thisObj, prop) {\r\n\t\tif (!thisObj[prop]) {\r\n\t\t\treturn; // callback func not specified\r\n\t\t}\r\n\t\tvar callback = null;\r\n\r\n\t\tif (typeof thisObj[prop] === 'string') {\r\n\t\t\t// string with code\r\n\t\t\ttry {\r\n\t\t\t\tcallback = new Function (thisObj[prop]);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tconsole.error(e);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// function\r\n\t\t\tcallback = thisObj[prop];\r\n\t\t}\r\n\r\n\t\tif (callback) {\r\n\t\t\tcallback.call(thisObj);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t// Triggers a color change related event(s) on all picker instances.\r\n\t// It is possible to specify multiple events separated with a space.\r\n\ttriggerGlobal : function (eventNames) {\r\n\t\tvar inst = jsc.getInstances();\r\n\t\tfor (var i = 0; i < inst.length; i += 1) {\r\n\t\t\tinst[i].trigger(eventNames);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t_pointerMoveEvent : {\r\n\t\tmouse: 'mousemove',\r\n\t\ttouch: 'touchmove'\r\n\t},\r\n\t_pointerEndEvent : {\r\n\t\tmouse: 'mouseup',\r\n\t\ttouch: 'touchend'\r\n\t},\r\n\r\n\r\n\t_pointerOrigin : null,\r\n\t_capturedTarget : null,\r\n\r\n\r\n\tonDocumentKeyUp : function (e) {\r\n\t\tif (['Tab', 'Escape'].indexOf(jsc.eventKey(e)) !== -1) {\r\n\t\t\tif (jsc.picker && jsc.picker.owner) {\r\n\t\t\t\tjsc.picker.owner.tryHide();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonWindowResize : function (e) {\r\n\t\tjsc.redrawPosition();\r\n\t},\r\n\r\n\r\n\tonWindowScroll : function (e) {\r\n\t\tjsc.redrawPosition();\r\n\t},\r\n\r\n\r\n\tonParentScroll : function (e) {\r\n\t\t// hide the picker when one of the parent elements is scrolled\r\n\t\tif (jsc.picker && jsc.picker.owner) {\r\n\t\t\tjsc.picker.owner.tryHide();\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonDocumentMouseDown : function (e) {\r\n\t\tvar target = e.target || e.srcElement;\r\n\r\n\t\tif (target.jscolor && target.jscolor instanceof jsc.pub) { // clicked targetElement -> show picker\r\n\t\t\tif (target.jscolor.showOnClick && !target.disabled) {\r\n\t\t\t\ttarget.jscolor.show();\r\n\t\t\t}\r\n\t\t} else if (jsc.getData(target, 'gui')) { // clicked jscolor's GUI element\r\n\t\t\tvar control = jsc.getData(target, 'control');\r\n\t\t\tif (control) {\r\n\t\t\t\t// jscolor's control\r\n\t\t\t\tjsc.onControlPointerStart(e, target, jsc.getData(target, 'control'), 'mouse');\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// mouse is outside the picker's controls -> hide the color picker!\r\n\t\t\tif (jsc.picker && jsc.picker.owner) {\r\n\t\t\t\tjsc.picker.owner.tryHide();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonPickerTouchStart : function (e) {\r\n\t\tvar target = e.target || e.srcElement;\r\n\r\n\t\tif (jsc.getData(target, 'control')) {\r\n\t\t\tjsc.onControlPointerStart(e, target, jsc.getData(target, 'control'), 'touch');\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonControlPointerStart : function (e, target, controlName, pointerType) {\r\n\t\tvar thisObj = jsc.getData(target, 'instance');\r\n\r\n\t\tjsc.preventDefault(e);\r\n\t\tjsc.captureTarget(target);\r\n\r\n\t\tvar registerDragEvents = function (doc, offset) {\r\n\t\t\tjsc.attachGroupEvent('drag', doc, jsc._pointerMoveEvent[pointerType],\r\n\t\t\t\tjsc.onDocumentPointerMove(e, target, controlName, pointerType, offset));\r\n\t\t\tjsc.attachGroupEvent('drag', doc, jsc._pointerEndEvent[pointerType],\r\n\t\t\t\tjsc.onDocumentPointerEnd(e, target, controlName, pointerType));\r\n\t\t};\r\n\r\n\t\tregisterDragEvents(window.document, [0, 0]);\r\n\r\n\t\tif (window.parent && window.frameElement) {\r\n\t\t\tvar rect = window.frameElement.getBoundingClientRect();\r\n\t\t\tvar ofs = [-rect.left, -rect.top];\r\n\t\t\tregisterDragEvents(window.parent.window.document, ofs);\r\n\t\t}\r\n\r\n\t\tvar abs = jsc.getAbsPointerPos(e);\r\n\t\tvar rel = jsc.getRelPointerPos(e);\r\n\t\tjsc._pointerOrigin = {\r\n\t\t\tx: abs.x - rel.x,\r\n\t\t\ty: abs.y - rel.y\r\n\t\t};\r\n\r\n\t\tswitch (controlName) {\r\n\t\tcase 'pad':\r\n\t\t\t// if the value slider is at the bottom, move it up\r\n\t\t\tif (jsc.getSliderChannel(thisObj) === 'v' && thisObj.channels.v === 0) {\r\n\t\t\t\tthisObj.fromHSVA(null, null, 100, null);\r\n\t\t\t}\r\n\t\t\tjsc.setPad(thisObj, e, 0, 0);\r\n\t\t\tbreak;\r\n\r\n\t\tcase 'sld':\r\n\t\t\tjsc.setSld(thisObj, e, 0);\r\n\t\t\tbreak;\r\n\r\n\t\tcase 'asld':\r\n\t\t\tjsc.setASld(thisObj, e, 0);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tthisObj.trigger('input');\r\n\t},\r\n\r\n\r\n\tonDocumentPointerMove : function (e, target, controlName, pointerType, offset) {\r\n\t\treturn function (e) {\r\n\t\t\tvar thisObj = jsc.getData(target, 'instance');\r\n\t\t\tswitch (controlName) {\r\n\t\t\tcase 'pad':\r\n\t\t\t\tjsc.setPad(thisObj, e, offset[0], offset[1]);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'sld':\r\n\t\t\t\tjsc.setSld(thisObj, e, offset[1]);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'asld':\r\n\t\t\t\tjsc.setASld(thisObj, e, offset[1]);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tthisObj.trigger('input');\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tonDocumentPointerEnd : function (e, target, controlName, pointerType) {\r\n\t\treturn function (e) {\r\n\t\t\tvar thisObj = jsc.getData(target, 'instance');\r\n\t\t\tjsc.detachGroupEvents('drag');\r\n\t\t\tjsc.releaseTarget();\r\n\r\n\t\t\t// Always trigger changes AFTER detaching outstanding mouse handlers,\r\n\t\t\t// in case some color change that occured in user-defined onChange/onInput handler\r\n\t\t\t// intruded into current mouse events\r\n\t\t\tthisObj.trigger('input');\r\n\t\t\tthisObj.trigger('change');\r\n\t\t};\r\n\t},\r\n\r\n\r\n\tonPaletteSampleClick : function (e) {\r\n\t\tvar target = e.currentTarget;\r\n\t\tvar thisObj = jsc.getData(target, 'instance');\r\n\t\tvar color = jsc.getData(target, 'color');\r\n\r\n\t\t// when format is flexible, use the original format of this color sample\r\n\t\tif (thisObj.format.toLowerCase() === 'any') {\r\n\t\t\tthisObj._setFormat(color.format); // adapt format\r\n\t\t\tif (!jsc.isAlphaFormat(thisObj.getFormat())) {\r\n\t\t\t\tcolor.rgba[3] = 1.0; // when switching to a format that doesn't support alpha, set full opacity\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// if this color doesn't specify alpha, use alpha of 1.0 (if applicable)\r\n\t\tif (color.rgba[3] === null) {\r\n\t\t\tif (thisObj.paletteSetsAlpha === true || (thisObj.paletteSetsAlpha === 'auto' && thisObj._paletteHasTransparency)) {\r\n\t\t\t\tcolor.rgba[3] = 1.0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthisObj.fromRGBA.apply(thisObj, color.rgba);\r\n\r\n\t\tthisObj.trigger('input');\r\n\t\tthisObj.trigger('change');\r\n\r\n\t\tif (thisObj.hideOnPaletteClick) {\r\n\t\t\tthisObj.hide();\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tsetPad : function (thisObj, e, ofsX, ofsY) {\r\n\t\tvar pointerAbs = jsc.getAbsPointerPos(e);\r\n\t\tvar x = ofsX + pointerAbs.x - jsc._pointerOrigin.x - thisObj.padding - thisObj.controlBorderWidth;\r\n\t\tvar y = ofsY + pointerAbs.y - jsc._pointerOrigin.y - thisObj.padding - thisObj.controlBorderWidth;\r\n\r\n\t\tvar xVal = x * (360 / (thisObj.width - 1));\r\n\t\tvar yVal = 100 - (y * (100 / (thisObj.height - 1)));\r\n\r\n\t\tswitch (jsc.getPadYChannel(thisObj)) {\r\n\t\tcase 's': thisObj.fromHSVA(xVal, yVal, null, null); break;\r\n\t\tcase 'v': thisObj.fromHSVA(xVal, null, yVal, null); break;\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tsetSld : function (thisObj, e, ofsY) {\r\n\t\tvar pointerAbs = jsc.getAbsPointerPos(e);\r\n\t\tvar y = ofsY + pointerAbs.y - jsc._pointerOrigin.y - thisObj.padding - thisObj.controlBorderWidth;\r\n\t\tvar yVal = 100 - (y * (100 / (thisObj.height - 1)));\r\n\r\n\t\tswitch (jsc.getSliderChannel(thisObj)) {\r\n\t\tcase 's': thisObj.fromHSVA(null, yVal, null, null); break;\r\n\t\tcase 'v': thisObj.fromHSVA(null, null, yVal, null); break;\r\n\t\t}\r\n\t},\r\n\r\n\r\n\tsetASld : function (thisObj, e, ofsY) {\r\n\t\tvar pointerAbs = jsc.getAbsPointerPos(e);\r\n\t\tvar y = ofsY + pointerAbs.y - jsc._pointerOrigin.y - thisObj.padding - thisObj.controlBorderWidth;\r\n\t\tvar yVal = 1.0 - (y * (1.0 / (thisObj.height - 1)));\r\n\r\n\t\tif (yVal < 1.0) {\r\n\t\t\t// if format is flexible and the current format doesn't support alpha, switch to a suitable one\r\n\t\t\tvar fmt = thisObj.getFormat();\r\n\t\t\tif (thisObj.format.toLowerCase() === 'any' && !jsc.isAlphaFormat(fmt)) {\r\n\t\t\t\tthisObj._setFormat(fmt === 'hex' ? 'hexa' : 'rgba');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthisObj.fromHSVA(null, null, null, yVal);\r\n\t},\r\n\r\n\r\n\tcreatePadCanvas : function () {\r\n\r\n\t\tvar ret = {\r\n\t\t\telm: null,\r\n\t\t\tdraw: null\r\n\t\t};\r\n\r\n\t\tvar canvas = jsc.createEl('canvas');\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\r\n\t\tvar drawFunc = function (width, height, type) {\r\n\t\t\tcanvas.width = width;\r\n\t\t\tcanvas.height = height;\r\n\r\n\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tvar hGrad = ctx.createLinearGradient(0, 0, canvas.width, 0);\r\n\t\t\thGrad.addColorStop(0 / 6, '#F00');\r\n\t\t\thGrad.addColorStop(1 / 6, '#FF0');\r\n\t\t\thGrad.addColorStop(2 / 6, '#0F0');\r\n\t\t\thGrad.addColorStop(3 / 6, '#0FF');\r\n\t\t\thGrad.addColorStop(4 / 6, '#00F');\r\n\t\t\thGrad.addColorStop(5 / 6, '#F0F');\r\n\t\t\thGrad.addColorStop(6 / 6, '#F00');\r\n\r\n\t\t\tctx.fillStyle = hGrad;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tvar vGrad = ctx.createLinearGradient(0, 0, 0, canvas.height);\r\n\t\t\tswitch (type.toLowerCase()) {\r\n\t\t\tcase 's':\r\n\t\t\t\tvGrad.addColorStop(0, 'rgba(255,255,255,0)');\r\n\t\t\t\tvGrad.addColorStop(1, 'rgba(255,255,255,1)');\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'v':\r\n\t\t\t\tvGrad.addColorStop(0, 'rgba(0,0,0,0)');\r\n\t\t\t\tvGrad.addColorStop(1, 'rgba(0,0,0,1)');\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tctx.fillStyle = vGrad;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\t\t};\r\n\r\n\t\tret.elm = canvas;\r\n\t\tret.draw = drawFunc;\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\r\n\tcreateSliderGradient : function () {\r\n\r\n\t\tvar ret = {\r\n\t\t\telm: null,\r\n\t\t\tdraw: null\r\n\t\t};\r\n\r\n\t\tvar canvas = jsc.createEl('canvas');\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\r\n\t\tvar drawFunc = function (width, height, color1, color2) {\r\n\t\t\tcanvas.width = width;\r\n\t\t\tcanvas.height = height;\r\n\r\n\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tvar grad = ctx.createLinearGradient(0, 0, 0, canvas.height);\r\n\t\t\tgrad.addColorStop(0, color1);\r\n\t\t\tgrad.addColorStop(1, color2);\r\n\r\n\t\t\tctx.fillStyle = grad;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\t\t};\r\n\r\n\t\tret.elm = canvas;\r\n\t\tret.draw = drawFunc;\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\r\n\tcreateASliderGradient : function () {\r\n\r\n\t\tvar ret = {\r\n\t\t\telm: null,\r\n\t\t\tdraw: null\r\n\t\t};\r\n\r\n\t\tvar canvas = jsc.createEl('canvas');\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\r\n\t\tvar drawFunc = function (width, height, color) {\r\n\t\t\tcanvas.width = width;\r\n\t\t\tcanvas.height = height;\r\n\r\n\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tvar sqSize = canvas.width / 2;\r\n\t\t\tvar sqColor1 = jsc.pub.chessboardColor1;\r\n\t\t\tvar sqColor2 = jsc.pub.chessboardColor2;\r\n\r\n\t\t\t// dark gray background\r\n\t\t\tctx.fillStyle = sqColor1;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tif (sqSize > 0) { // to avoid infinite loop\r\n\t\t\t\tfor (var y = 0; y < canvas.height; y += sqSize * 2) {\r\n\t\t\t\t\t// light gray squares\r\n\t\t\t\t\tctx.fillStyle = sqColor2;\r\n\t\t\t\t\tctx.fillRect(0, y, sqSize, sqSize);\r\n\t\t\t\t\tctx.fillRect(sqSize, y + sqSize, sqSize, sqSize);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar grad = ctx.createLinearGradient(0, 0, 0, canvas.height);\r\n\t\t\tgrad.addColorStop(0, color);\r\n\t\t\tgrad.addColorStop(1, 'rgba(0,0,0,0)');\r\n\r\n\t\t\tctx.fillStyle = grad;\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\t\t};\r\n\r\n\t\tret.elm = canvas;\r\n\t\tret.draw = drawFunc;\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\r\n\tBoxShadow : (function () {\r\n\t\tvar BoxShadow = function (hShadow, vShadow, blur, spread, color, inset) {\r\n\t\t\tthis.hShadow = hShadow;\r\n\t\t\tthis.vShadow = vShadow;\r\n\t\t\tthis.blur = blur;\r\n\t\t\tthis.spread = spread;\r\n\t\t\tthis.color = color;\r\n\t\t\tthis.inset = !!inset;\r\n\t\t};\r\n\r\n\t\tBoxShadow.prototype.toString = function () {\r\n\t\t\tvar vals = [\r\n\t\t\t\tMath.round(this.hShadow) + 'px',\r\n\t\t\t\tMath.round(this.vShadow) + 'px',\r\n\t\t\t\tMath.round(this.blur) + 'px',\r\n\t\t\t\tMath.round(this.spread) + 'px',\r\n\t\t\t\tthis.color\r\n\t\t\t];\r\n\t\t\tif (this.inset) {\r\n\t\t\t\tvals.push('inset');\r\n\t\t\t}\r\n\t\t\treturn vals.join(' ');\r\n\t\t};\r\n\r\n\t\treturn BoxShadow;\r\n\t})(),\r\n\r\n\r\n\tflags : {\r\n\t\tleaveValue : 1 << 0,\r\n\t\tleaveAlpha : 1 << 1,\r\n\t\tleavePreview : 1 << 2,\r\n\t},\r\n\r\n\r\n\tenumOpts : {\r\n\t\tformat: ['auto', 'any', 'hex', 'hexa', 'rgb', 'rgba'],\r\n\t\tpreviewPosition: ['left', 'right'],\r\n\t\tmode: ['hsv', 'hvs', 'hs', 'hv'],\r\n\t\tposition: ['left', 'right', 'top', 'bottom'],\r\n\t\talphaChannel: ['auto', true, false],\r\n\t\tpaletteSetsAlpha: ['auto', true, false],\r\n\t},\r\n\r\n\r\n\tdeprecatedOpts : {\r\n\t\t// <old_option>: <new_option> (<new_option> can be null)\r\n\t\t'styleElement': 'previewElement',\r\n\t\t'onFineChange': 'onInput',\r\n\t\t'overwriteImportant': 'forceStyle',\r\n\t\t'closable': 'closeButton',\r\n\t\t'insetWidth': 'controlBorderWidth',\r\n\t\t'insetColor': 'controlBorderColor',\r\n\t\t'refine': null,\r\n\t},\r\n\r\n\r\n\tdocsRef : ' ' + 'See https://jscolor.com/docs/',\r\n\r\n\r\n\t//\r\n\t// Usage:\r\n\t// var myPicker = new JSColor(<targetElement> [, <options>])\r\n\t//\r\n\t// (constructor is accessible via both 'jscolor' and 'JSColor' name)\r\n\t//\r\n\r\n\tpub : function (targetElement, opts) {\r\n\r\n\t\tvar THIS = this;\r\n\r\n\t\tif (!opts) {\r\n\t\t\topts = {};\r\n\t\t}\r\n\r\n\t\tthis.channels = {\r\n\t\t\tr: 255, // red [0-255]\r\n\t\t\tg: 255, // green [0-255]\r\n\t\t\tb: 255, // blue [0-255]\r\n\t\t\th: 0, // hue [0-360]\r\n\t\t\ts: 0, // saturation [0-100]\r\n\t\t\tv: 100, // value (brightness) [0-100]\r\n\t\t\ta: 1.0, // alpha (opacity) [0.0 - 1.0]\r\n\t\t};\r\n\r\n\t\t// General options\r\n\t\t//\r\n\t\tthis.format = 'auto'; // 'auto' | 'any' | 'hex' | 'hexa' | 'rgb' | 'rgba' - Format of the input/output value\r\n\t\tthis.value = undefined; // INITIAL color value in any supported format. To change it later, use method fromString(), fromHSVA(), fromRGBA() or channel()\r\n\t\tthis.alpha = undefined; // INITIAL alpha value. To change it later, call method channel('A', <value>)\r\n\t\tthis.random = false; // whether to randomize the initial color. Either true | false, or an array of ranges: [minV, maxV, minS, maxS, minH, maxH, minA, maxA]\r\n\t\tthis.onChange = undefined; // called when color changes. Value can be either a function or a string with JS code.\r\n\t\tthis.onInput = undefined; // called repeatedly as the color is being changed, e.g. while dragging a slider. Value can be either a function or a string with JS code.\r\n\t\tthis.valueElement = undefined; // element that will be used to display and input the color value\r\n\t\tthis.alphaElement = undefined; // element that will be used to display and input the alpha (opacity) value\r\n\t\tthis.previewElement = undefined; // element that will preview the picked color using CSS background\r\n\t\tthis.previewPosition = 'left'; // 'left' | 'right' - position of the color preview in previewElement\r\n\t\tthis.previewSize = 32; // (px) width of the color preview displayed in previewElement\r\n\t\tthis.previewPadding = 8; // (px) space between color preview and content of the previewElement\r\n\t\tthis.required = true; // whether the associated text input must always contain a color value. If false, the input can be left empty.\r\n\t\tthis.hash = true; // whether to prefix the HEX color code with # symbol (only applicable for HEX format)\r\n\t\tthis.uppercase = true; // whether to show the HEX color code in upper case (only applicable for HEX format)\r\n\t\tthis.forceStyle = true; // whether to overwrite CSS style of the previewElement using !important flag\r\n\r\n\t\t// Color Picker options\r\n\t\t//\r\n\t\tthis.width = 181; // width of the color spectrum (in px)\r\n\t\tthis.height = 101; // height of the color spectrum (in px)\r\n\t\tthis.mode = 'HSV'; // 'HSV' | 'HVS' | 'HS' | 'HV' - layout of the color picker controls\r\n\t\tthis.alphaChannel = 'auto'; // 'auto' | true | false - if alpha channel is enabled, the alpha slider will be visible. If 'auto', it will be determined according to color format\r\n\t\tthis.position = 'bottom'; // 'left' | 'right' | 'top' | 'bottom' - position relative to the target element\r\n\t\tthis.smartPosition = true; // automatically change picker position when there is not enough space for it\r\n\t\tthis.showOnClick = true; // whether to show the picker when user clicks its target element\r\n\t\tthis.hideOnLeave = true; // whether to automatically hide the picker when user leaves its target element (e.g. upon clicking the document)\r\n\t\tthis.palette = []; // colors to be displayed in the palette, specified as an array or a string of space separated color values (in any supported format)\r\n\t\tthis.paletteCols = 10; // number of columns in the palette\r\n\t\tthis.paletteSetsAlpha = 'auto'; // 'auto' | true | false - if true, palette colors that don't specify alpha will set alpha to 1.0\r\n\t\tthis.paletteHeight = 16; // maximum height (px) of a row in the palette\r\n\t\tthis.paletteSpacing = 4; // distance (px) between color samples in the palette\r\n\t\tthis.hideOnPaletteClick = false; // when set to true, clicking the palette will also hide the color picker\r\n\t\tthis.sliderSize = 16; // px\r\n\t\tthis.crossSize = 8; // px\r\n\t\tthis.closeButton = false; // whether to display the Close button\r\n\t\tthis.closeText = 'Close';\r\n\t\tthis.buttonColor = 'rgba(0,0,0,1)'; // CSS color\r\n\t\tthis.buttonHeight = 18; // px\r\n\t\tthis.padding = 12; // px\r\n\t\tthis.backgroundColor = 'rgba(255,255,255,1)'; // CSS color\r\n\t\tthis.borderWidth = 1; // px\r\n\t\tthis.borderColor = 'rgba(187,187,187,1)'; // CSS color\r\n\t\tthis.borderRadius = 8; // px\r\n\t\tthis.controlBorderWidth = 1; // px\r\n\t\tthis.controlBorderColor = 'rgba(187,187,187,1)'; // CSS color\r\n\t\tthis.shadow = true; // whether to display a shadow\r\n\t\tthis.shadowBlur = 15; // px\r\n\t\tthis.shadowColor = 'rgba(0,0,0,0.2)'; // CSS color\r\n\t\tthis.pointerColor = 'rgba(76,76,76,1)'; // CSS color\r\n\t\tthis.pointerBorderWidth = 1; // px\r\n\t\tthis.pointerBorderColor = 'rgba(255,255,255,1)'; // CSS color\r\n\t\tthis.pointerThickness = 2; // px\r\n\t\tthis.zIndex = 5000;\r\n\t\tthis.container = undefined; // where to append the color picker (BODY element by default)\r\n\r\n\t\t// Experimental\r\n\t\t//\r\n\t\tthis.minS = 0; // min allowed saturation (0 - 100)\r\n\t\tthis.maxS = 100; // max allowed saturation (0 - 100)\r\n\t\tthis.minV = 0; // min allowed value (brightness) (0 - 100)\r\n\t\tthis.maxV = 100; // max allowed value (brightness) (0 - 100)\r\n\t\tthis.minA = 0.0; // min allowed alpha (opacity) (0.0 - 1.0)\r\n\t\tthis.maxA = 1.0; // max allowed alpha (opacity) (0.0 - 1.0)\r\n\r\n\r\n\t\t// Getter: option(name)\r\n\t\t// Setter: option(name, value)\r\n\t\t// option({name:value, ...})\r\n\t\t//\r\n\t\tthis.option = function () {\r\n\t\t\tif (!arguments.length) {\r\n\t\t\t\tthrow new Error('No option specified');\r\n\t\t\t}\r\n\r\n\t\t\tif (arguments.length === 1 && typeof arguments[0] === 'string') {\r\n\t\t\t\t// getting a single option\r\n\t\t\t\ttry {\r\n\t\t\t\t\treturn getOption(arguments[0]);\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\r\n\t\t\t} else if (arguments.length >= 2 && typeof arguments[0] === 'string') {\r\n\t\t\t\t// setting a single option\r\n\t\t\t\ttry {\r\n\t\t\t\t\tif (!setOption(arguments[0], arguments[1])) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tthis.redraw(); // immediately redraws the picker, if it's displayed\r\n\t\t\t\tthis.exposeColor(); // in case some preview-related or format-related option was changed\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t} else if (arguments.length === 1 && typeof arguments[0] === 'object') {\r\n\t\t\t\t// setting multiple options\r\n\t\t\t\tvar opts = arguments[0];\r\n\t\t\t\tvar success = true;\r\n\t\t\t\tfor (var opt in opts) {\r\n\t\t\t\t\tif (opts.hasOwnProperty(opt)) {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tif (!setOption(opt, opts[opt])) {\r\n\t\t\t\t\t\t\t\tsuccess = false;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\t\t\tsuccess = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tthis.redraw(); // immediately redraws the picker, if it's displayed\r\n\t\t\t\tthis.exposeColor(); // in case some preview-related or format-related option was changed\r\n\t\t\t\treturn success;\r\n\t\t\t}\r\n\r\n\t\t\tthrow new Error('Invalid arguments');\r\n\t\t}\r\n\r\n\r\n\t\t// Getter: channel(name)\r\n\t\t// Setter: channel(name, value)\r\n\t\t//\r\n\t\tthis.channel = function (name, value) {\r\n\t\t\tif (typeof name !== 'string') {\r\n\t\t\t\tthrow new Error('Invalid value for channel name: ' + name);\r\n\t\t\t}\r\n\r\n\t\t\tif (value === undefined) {\r\n\t\t\t\t// getting channel value\r\n\t\t\t\tif (!this.channels.hasOwnProperty(name.toLowerCase())) {\r\n\t\t\t\t\tconsole.warn('Getting unknown channel: ' + name);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\treturn this.channels[name.toLowerCase()];\r\n\r\n\t\t\t} else {\r\n\t\t\t\t// setting channel value\r\n\t\t\t\tvar res = false;\r\n\t\t\t\tswitch (name.toLowerCase()) {\r\n\t\t\t\t\tcase 'r': res = this.fromRGBA(value, null, null, null); break;\r\n\t\t\t\t\tcase 'g': res = this.fromRGBA(null, value, null, null); break;\r\n\t\t\t\t\tcase 'b': res = this.fromRGBA(null, null, value, null); break;\r\n\t\t\t\t\tcase 'h': res = this.fromHSVA(value, null, null, null); break;\r\n\t\t\t\t\tcase 's': res = this.fromHSVA(null, value, null, null); break;\r\n\t\t\t\t\tcase 'v': res = this.fromHSVA(null, null, value, null); break;\r\n\t\t\t\t\tcase 'a': res = this.fromHSVA(null, null, null, value); break;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tconsole.warn('Setting unknown channel: ' + name);\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif (res) {\r\n\t\t\t\t\tthis.redraw(); // immediately redraws the picker, if it's displayed\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\r\n\t\t// Triggers given input event(s) by:\r\n\t\t// - executing on<Event> callback specified as picker's option\r\n\t\t// - triggering standard DOM event listeners attached to the value element\r\n\t\t//\r\n\t\t// It is possible to specify multiple events separated with a space.\r\n\t\t//\r\n\t\tthis.trigger = function (eventNames) {\r\n\t\t\tvar evs = jsc.strList(eventNames);\r\n\t\t\tfor (var i = 0; i < evs.length; i += 1) {\r\n\t\t\t\tvar ev = evs[i].toLowerCase();\r\n\r\n\t\t\t\t// trigger a callback\r\n\t\t\t\tvar callbackProp = null;\r\n\t\t\t\tswitch (ev) {\r\n\t\t\t\t\tcase 'input': callbackProp = 'onInput'; break;\r\n\t\t\t\t\tcase 'change': callbackProp = 'onChange'; break;\r\n\t\t\t\t}\r\n\t\t\t\tif (callbackProp) {\r\n\t\t\t\t\tjsc.triggerCallback(this, callbackProp);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// trigger standard DOM event listeners on the value element\r\n\t\t\t\tjsc.triggerInputEvent(this.valueElement, ev, true, true);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\t// h: 0-360\r\n\t\t// s: 0-100\r\n\t\t// v: 0-100\r\n\t\t// a: 0.0-1.0\r\n\t\t//\r\n\t\tthis.fromHSVA = function (h, s, v, a, flags) { // null = don't change\r\n\t\t\tif (h === undefined) { h = null; }\r\n\t\t\tif (s === undefined) { s = null; }\r\n\t\t\tif (v === undefined) { v = null; }\r\n\t\t\tif (a === undefined) { a = null; }\r\n\r\n\t\t\tif (h !== null) {\r\n\t\t\t\tif (isNaN(h)) { return false; }\r\n\t\t\t\tthis.channels.h = Math.max(0, Math.min(360, h));\r\n\t\t\t}\r\n\t\t\tif (s !== null) {\r\n\t\t\t\tif (isNaN(s)) { return false; }\r\n\t\t\t\tthis.channels.s = Math.max(0, Math.min(100, this.maxS, s), this.minS);\r\n\t\t\t}\r\n\t\t\tif (v !== null) {\r\n\t\t\t\tif (isNaN(v)) { return false; }\r\n\t\t\t\tthis.channels.v = Math.max(0, Math.min(100, this.maxV, v), this.minV);\r\n\t\t\t}\r\n\t\t\tif (a !== null) {\r\n\t\t\t\tif (isNaN(a)) { return false; }\r\n\t\t\t\tthis.channels.a = this.hasAlphaChannel() ?\r\n\t\t\t\t\tMath.max(0, Math.min(1, this.maxA, a), this.minA) :\r\n\t\t\t\t\t1.0; // if alpha channel is disabled, the color should stay 100% opaque\r\n\t\t\t}\r\n\r\n\t\t\tvar rgb = jsc.HSV_RGB(\r\n\t\t\t\tthis.channels.h,\r\n\t\t\t\tthis.channels.s,\r\n\t\t\t\tthis.channels.v\r\n\t\t\t);\r\n\t\t\tthis.channels.r = rgb[0];\r\n\t\t\tthis.channels.g = rgb[1];\r\n\t\t\tthis.channels.b = rgb[2];\r\n\r\n\t\t\tthis.exposeColor(flags);\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\r\n\t\t// r: 0-255\r\n\t\t// g: 0-255\r\n\t\t// b: 0-255\r\n\t\t// a: 0.0-1.0\r\n\t\t//\r\n\t\tthis.fromRGBA = function (r, g, b, a, flags) { // null = don't change\r\n\t\t\tif (r === undefined) { r = null; }\r\n\t\t\tif (g === undefined) { g = null; }\r\n\t\t\tif (b === undefined) { b = null; }\r\n\t\t\tif (a === undefined) { a = null; }\r\n\r\n\t\t\tif (r !== null) {\r\n\t\t\t\tif (isNaN(r)) { return false; }\r\n\t\t\t\tr = Math.max(0, Math.min(255, r));\r\n\t\t\t}\r\n\t\t\tif (g !== null) {\r\n\t\t\t\tif (isNaN(g)) { return false; }\r\n\t\t\t\tg = Math.max(0, Math.min(255, g));\r\n\t\t\t}\r\n\t\t\tif (b !== null) {\r\n\t\t\t\tif (isNaN(b)) { return false; }\r\n\t\t\t\tb = Math.max(0, Math.min(255, b));\r\n\t\t\t}\r\n\t\t\tif (a !== null) {\r\n\t\t\t\tif (isNaN(a)) { return false; }\r\n\t\t\t\tthis.channels.a = this.hasAlphaChannel() ?\r\n\t\t\t\t\tMath.max(0, Math.min(1, this.maxA, a), this.minA) :\r\n\t\t\t\t\t1.0; // if alpha channel is disabled, the color should stay 100% opaque\r\n\t\t\t}\r\n\r\n\t\t\tvar hsv = jsc.RGB_HSV(\r\n\t\t\t\tr===null ? this.channels.r : r,\r\n\t\t\t\tg===null ? this.channels.g : g,\r\n\t\t\t\tb===null ? this.channels.b : b\r\n\t\t\t);\r\n\t\t\tif (hsv[0] !== null) {\r\n\t\t\t\tthis.channels.h = Math.max(0, Math.min(360, hsv[0]));\r\n\t\t\t}\r\n\t\t\tif (hsv[2] !== 0) { // fully black color stays black through entire saturation range, so let's not change saturation\r\n\t\t\t\tthis.channels.s = Math.max(0, this.minS, Math.min(100, this.maxS, hsv[1]));\r\n\t\t\t}\r\n\t\t\tthis.channels.v = Math.max(0, this.minV, Math.min(100, this.maxV, hsv[2]));\r\n\r\n\t\t\t// update RGB according to final HSV, as some values might be trimmed\r\n\t\t\tvar rgb = jsc.HSV_RGB(this.channels.h, this.channels.s, this.channels.v);\r\n\t\t\tthis.channels.r = rgb[0];\r\n\t\t\tthis.channels.g = rgb[1];\r\n\t\t\tthis.channels.b = rgb[2];\r\n\r\n\t\t\tthis.exposeColor(flags);\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\r\n\t\t// DEPRECATED. Use .fromHSVA() instead\r\n\t\t//\r\n\t\tthis.fromHSV = function (h, s, v, flags) {\r\n\t\t\tconsole.warn('fromHSV() method is DEPRECATED. Using fromHSVA() instead.' + jsc.docsRef);\r\n\t\t\treturn this.fromHSVA(h, s, v, null, flags);\r\n\t\t};\r\n\r\n\r\n\t\t// DEPRECATED. Use .fromRGBA() instead\r\n\t\t//\r\n\t\tthis.fromRGB = function (r, g, b, flags) {\r\n\t\t\tconsole.warn('fromRGB() method is DEPRECATED. Using fromRGBA() instead.' + jsc.docsRef);\r\n\t\t\treturn this.fromRGBA(r, g, b, null, flags);\r\n\t\t};\r\n\r\n\r\n\t\tthis.fromString = function (str, flags) {\r\n\t\t\tif (!this.required && str.trim() === '') {\r\n\t\t\t\t// setting empty string to an optional color input\r\n\t\t\t\tthis.setPreviewElementBg(null);\r\n\t\t\t\tthis.setValueElementValue('');\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\tvar color = jsc.parseColorString(str);\r\n\t\t\tif (!color) {\r\n\t\t\t\treturn false; // could not parse\r\n\t\t\t}\r\n\t\t\tif (this.format.toLowerCase() === 'any') {\r\n\t\t\t\tthis._setFormat(color.format); // adapt format\r\n\t\t\t\tif (!jsc.isAlphaFormat(this.getFormat())) {\r\n\t\t\t\t\tcolor.rgba[3] = 1.0; // when switching to a format that doesn't support alpha, set full opacity\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.fromRGBA(\r\n\t\t\t\tcolor.rgba[0],\r\n\t\t\t\tcolor.rgba[1],\r\n\t\t\t\tcolor.rgba[2],\r\n\t\t\t\tcolor.rgba[3],\r\n\t\t\t\tflags\r\n\t\t\t);\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\r\n\t\tthis.randomize = function (minV, maxV, minS, maxS, minH, maxH, minA, maxA) {\r\n\t\t\tif (minV === undefined) { minV = 0; }\r\n\t\t\tif (maxV === undefined) { maxV = 100; }\r\n\t\t\tif (minS === undefined) { minS = 0; }\r\n\t\t\tif (maxS === undefined) { maxS = 100; }\r\n\t\t\tif (minH === undefined) { minH = 0; }\r\n\t\t\tif (maxH === undefined) { maxH = 359; }\r\n\t\t\tif (minA === undefined) { minA = 1; }\r\n\t\t\tif (maxA === undefined) { maxA = 1; }\r\n\r\n\t\t\tthis.fromHSVA(\r\n\t\t\t\tminH + Math.floor(Math.random() * (maxH - minH + 1)),\r\n\t\t\t\tminS + Math.floor(Math.random() * (maxS - minS + 1)),\r\n\t\t\t\tminV + Math.floor(Math.random() * (maxV - minV + 1)),\r\n\t\t\t\t((100 * minA) + Math.floor(Math.random() * (100 * (maxA - minA) + 1))) / 100\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toString = function (format) {\r\n\t\t\tif (format === undefined) {\r\n\t\t\t\tformat = this.getFormat(); // format not specified -> use the current format\r\n\t\t\t}\r\n\t\t\tswitch (format.toLowerCase()) {\r\n\t\t\t\tcase 'hex': return this.toHEXString(); break;\r\n\t\t\t\tcase 'hexa': return this.toHEXAString(); break;\r\n\t\t\t\tcase 'rgb': return this.toRGBString(); break;\r\n\t\t\t\tcase 'rgba': return this.toRGBAString(); break;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t};\r\n\r\n\r\n\t\tthis.toHEXString = function () {\r\n\t\t\treturn jsc.hexColor(\r\n\t\t\t\tthis.channels.r,\r\n\t\t\t\tthis.channels.g,\r\n\t\t\t\tthis.channels.b\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toHEXAString = function () {\r\n\t\t\treturn jsc.hexaColor(\r\n\t\t\t\tthis.channels.r,\r\n\t\t\t\tthis.channels.g,\r\n\t\t\t\tthis.channels.b,\r\n\t\t\t\tthis.channels.a\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toRGBString = function () {\r\n\t\t\treturn jsc.rgbColor(\r\n\t\t\t\tthis.channels.r,\r\n\t\t\t\tthis.channels.g,\r\n\t\t\t\tthis.channels.b\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toRGBAString = function () {\r\n\t\t\treturn jsc.rgbaColor(\r\n\t\t\t\tthis.channels.r,\r\n\t\t\t\tthis.channels.g,\r\n\t\t\t\tthis.channels.b,\r\n\t\t\t\tthis.channels.a\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toGrayscale = function () {\r\n\t\t\treturn (\r\n\t\t\t\t0.213 * this.channels.r +\r\n\t\t\t\t0.715 * this.channels.g +\r\n\t\t\t\t0.072 * this.channels.b\r\n\t\t\t);\r\n\t\t};\r\n\r\n\r\n\t\tthis.toCanvas = function () {\r\n\t\t\treturn jsc.genColorPreviewCanvas(this.toRGBAString()).canvas;\r\n\t\t};\r\n\r\n\r\n\t\tthis.toDataURL = function () {\r\n\t\t\treturn this.toCanvas().toDataURL();\r\n\t\t};\r\n\r\n\r\n\t\tthis.toBackground = function () {\r\n\t\t\treturn jsc.pub.background(this.toRGBAString());\r\n\t\t};\r\n\r\n\r\n\t\tthis.isLight = function () {\r\n\t\t\treturn this.toGrayscale() > 255 / 2;\r\n\t\t};\r\n\r\n\r\n\t\tthis.hide = function () {\r\n\t\t\tif (isPickerOwner()) {\r\n\t\t\t\tdetachPicker();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.show = function () {\r\n\t\t\tdrawPicker();\r\n\t\t};\r\n\r\n\r\n\t\tthis.redraw = function () {\r\n\t\t\tif (isPickerOwner()) {\r\n\t\t\t\tdrawPicker();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.getFormat = function () {\r\n\t\t\treturn this._currentFormat;\r\n\t\t};\r\n\r\n\r\n\t\tthis._setFormat = function (format) {\r\n\t\t\tthis._currentFormat = format.toLowerCase();\r\n\t\t};\r\n\r\n\r\n\t\tthis.hasAlphaChannel = function () {\r\n\t\t\tif (this.alphaChannel === 'auto') {\r\n\t\t\t\treturn (\r\n\t\t\t\t\tthis.format.toLowerCase() === 'any' || // format can change on the fly (e.g. from hex to rgba), so let's consider the alpha channel enabled\r\n\t\t\t\t\tjsc.isAlphaFormat(this.getFormat()) || // the current format supports alpha channel\r\n\t\t\t\t\tthis.alpha !== undefined || // initial alpha value is set, so we're working with alpha channel\r\n\t\t\t\t\tthis.alphaElement !== undefined // the alpha value is redirected, so we're working with alpha channel\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\treturn this.alphaChannel; // the alpha channel is explicitly set\r\n\t\t};\r\n\r\n\r\n\t\tthis.processValueInput = function (str) {\r\n\t\t\tif (!this.fromString(str)) {\r\n\t\t\t\t// could not parse the color value - let's just expose the current color\r\n\t\t\t\tthis.exposeColor();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.processAlphaInput = function (str) {\r\n\t\t\tif (!this.fromHSVA(null, null, null, parseFloat(str))) {\r\n\t\t\t\t// could not parse the alpha value - let's just expose the current color\r\n\t\t\t\tthis.exposeColor();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.exposeColor = function (flags) {\r\n\t\t\tvar colorStr = this.toString();\r\n\t\t\tvar fmt = this.getFormat();\r\n\r\n\t\t\t// reflect current color in data- attribute\r\n\t\t\tjsc.setDataAttr(this.targetElement, 'current-color', colorStr);\r\n\r\n\t\t\tif (!(flags & jsc.flags.leaveValue) && this.valueElement) {\r\n\t\t\t\tif (fmt === 'hex' || fmt === 'hexa') {\r\n\t\t\t\t\tif (!this.uppercase) { colorStr = colorStr.toLowerCase(); }\r\n\t\t\t\t\tif (!this.hash) { colorStr = colorStr.replace(/^#/, ''); }\r\n\t\t\t\t}\r\n\t\t\t\tthis.setValueElementValue(colorStr);\r\n\t\t\t}\r\n\r\n\t\t\tif (!(flags & jsc.flags.leaveAlpha) && this.alphaElement) {\r\n\t\t\t\tvar alphaVal = Math.round(this.channels.a * 100) / 100;\r\n\t\t\t\tthis.setAlphaElementValue(alphaVal);\r\n\t\t\t}\r\n\r\n\t\t\tif (!(flags & jsc.flags.leavePreview) && this.previewElement) {\r\n\t\t\t\tvar previewPos = null; // 'left' | 'right' (null -> fill the entire element)\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tjsc.isTextInput(this.previewElement) || // text input\r\n\t\t\t\t\t(jsc.isButton(this.previewElement) && !jsc.isButtonEmpty(this.previewElement)) // button with text\r\n\t\t\t\t) {\r\n\t\t\t\t\tpreviewPos = this.previewPosition;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.setPreviewElementBg(this.toRGBAString());\r\n\t\t\t}\r\n\r\n\t\t\tif (isPickerOwner()) {\r\n\t\t\t\tredrawPad();\r\n\t\t\t\tredrawSld();\r\n\t\t\t\tredrawASld();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.setPreviewElementBg = function (color) {\r\n\t\t\tif (!this.previewElement) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar position = null; // color preview position: null | 'left' | 'right'\r\n\t\t\tvar width = null; // color preview width: px | null = fill the entire element\r\n\t\t\tif (\r\n\t\t\t\tjsc.isTextInput(this.previewElement) || // text input\r\n\t\t\t\t(jsc.isButton(this.previewElement) && !jsc.isButtonEmpty(this.previewElement)) // button with text\r\n\t\t\t) {\r\n\t\t\t\tposition = this.previewPosition;\r\n\t\t\t\twidth = this.previewSize;\r\n\t\t\t}\r\n\r\n\t\t\tvar backgrounds = [];\r\n\r\n\t\t\tif (!color) {\r\n\t\t\t\t// there is no color preview to display -> let's remove any previous background image\r\n\t\t\t\tbackgrounds.push({\r\n\t\t\t\t\timage: 'none',\r\n\t\t\t\t\tposition: 'left top',\r\n\t\t\t\t\tsize: 'auto',\r\n\t\t\t\t\trepeat: 'no-repeat',\r\n\t\t\t\t\torigin: 'padding-box',\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\t// CSS gradient for background color preview\r\n\t\t\t\tbackgrounds.push({\r\n\t\t\t\t\timage: jsc.genColorPreviewGradient(\r\n\t\t\t\t\t\tcolor,\r\n\t\t\t\t\t\tposition,\r\n\t\t\t\t\t\twidth ? width - jsc.pub.previewSeparator.length : null\r\n\t\t\t\t\t),\r\n\t\t\t\t\tposition: 'left top',\r\n\t\t\t\t\tsize: 'auto',\r\n\t\t\t\t\trepeat: position ? 'repeat-y' : 'repeat',\r\n\t\t\t\t\torigin: 'padding-box',\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// data URL of generated PNG image with a gray transparency chessboard\r\n\t\t\t\tvar preview = jsc.genColorPreviewCanvas(\r\n\t\t\t\t\t'rgba(0,0,0,0)',\r\n\t\t\t\t\tposition ? {'left':'right', 'right':'left'}[position] : null,\r\n\t\t\t\t\twidth,\r\n\t\t\t\t\ttrue\r\n\t\t\t\t);\r\n\t\t\t\tbackgrounds.push({\r\n\t\t\t\t\timage: 'url(\\'' + preview.canvas.toDataURL() + '\\')',\r\n\t\t\t\t\tposition: (position || 'left') + ' top',\r\n\t\t\t\t\tsize: preview.width + 'px ' + preview.height + 'px',\r\n\t\t\t\t\trepeat: position ? 'repeat-y' : 'repeat',\r\n\t\t\t\t\torigin: 'padding-box',\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tvar bg = {\r\n\t\t\t\timage: [],\r\n\t\t\t\tposition: [],\r\n\t\t\t\tsize: [],\r\n\t\t\t\trepeat: [],\r\n\t\t\t\torigin: [],\r\n\t\t\t};\r\n\t\t\tfor (var i = 0; i < backgrounds.length; i += 1) {\r\n\t\t\t\tbg.image.push(backgrounds[i].image);\r\n\t\t\t\tbg.position.push(backgrounds[i].position);\r\n\t\t\t\tbg.size.push(backgrounds[i].size);\r\n\t\t\t\tbg.repeat.push(backgrounds[i].repeat);\r\n\t\t\t\tbg.origin.push(backgrounds[i].origin);\r\n\t\t\t}\r\n\r\n\t\t\t// set previewElement's background-images\r\n\t\t\tvar sty = {\r\n\t\t\t\t'background-image': bg.image.join(', '),\r\n\t\t\t\t'background-position': bg.position.join(', '),\r\n\t\t\t\t'background-size': bg.size.join(', '),\r\n\t\t\t\t'background-repeat': bg.repeat.join(', '),\r\n\t\t\t\t'background-origin': bg.origin.join(', '),\r\n\t\t\t};\r\n\t\t\tjsc.setStyle(this.previewElement, sty, this.forceStyle);\r\n\r\n\r\n\t\t\t// set/restore previewElement's padding\r\n\t\t\tvar padding = {\r\n\t\t\t\tleft: null,\r\n\t\t\t\tright: null,\r\n\t\t\t};\r\n\t\t\tif (position) {\r\n\t\t\t\tpadding[position] = (this.previewSize + this.previewPadding) + 'px';\r\n\t\t\t}\r\n\r\n\t\t\tvar sty = {\r\n\t\t\t\t'padding-left': padding.left,\r\n\t\t\t\t'padding-right': padding.right,\r\n\t\t\t};\r\n\t\t\tjsc.setStyle(this.previewElement, sty, this.forceStyle, true);\r\n\t\t};\r\n\r\n\r\n\t\tthis.setValueElementValue = function (str) {\r\n\t\t\tif (this.valueElement) {\r\n\t\t\t\tif (jsc.nodeName(this.valueElement) === 'input') {\r\n\t\t\t\t\tthis.valueElement.value = str;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.valueElement.innerHTML = str;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.setAlphaElementValue = function (str) {\r\n\t\t\tif (this.alphaElement) {\r\n\t\t\t\tif (jsc.nodeName(this.alphaElement) === 'input') {\r\n\t\t\t\t\tthis.alphaElement.value = str;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.alphaElement.innerHTML = str;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis._processParentElementsInDOM = function () {\r\n\t\t\tif (this._parentElementsProcessed) { return; }\r\n\t\t\tthis._parentElementsProcessed = true;\r\n\r\n\t\t\tvar elm = this.targetElement;\r\n\t\t\tdo {\r\n\t\t\t\t// If the target element or one of its parent nodes has fixed position,\r\n\t\t\t\t// then use fixed positioning instead\r\n\t\t\t\tvar compStyle = jsc.getCompStyle(elm);\r\n\t\t\t\tif (compStyle.position && compStyle.position.toLowerCase() === 'fixed') {\r\n\t\t\t\t\tthis.fixed = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (elm !== this.targetElement) {\r\n\t\t\t\t\t// Ensure to attach onParentScroll only once to each parent element\r\n\t\t\t\t\t// (multiple targetElements can share the same parent nodes)\r\n\t\t\t\t\t//\r\n\t\t\t\t\t// Note: It's not just offsetParents that can be scrollable,\r\n\t\t\t\t\t// that's why we loop through all parent nodes\r\n\t\t\t\t\tif (!jsc.getData(elm, 'hasScrollListener')) {\r\n\t\t\t\t\t\telm.addEventListener('scroll', jsc.onParentScroll, false);\r\n\t\t\t\t\t\tjsc.setData(elm, 'hasScrollListener', true);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} while ((elm = elm.parentNode) && jsc.nodeName(elm) !== 'body');\r\n\t\t};\r\n\r\n\r\n\t\tthis.tryHide = function () {\r\n\t\t\tif (this.hideOnLeave) {\r\n\t\t\t\tthis.hide();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.set__palette = function (val) {\r\n\t\t\tthis.palette = val;\r\n\t\t\tthis._palette = jsc.parsePaletteValue(val);\r\n\t\t\tthis._paletteHasTransparency = jsc.containsTranparentColor(this._palette);\r\n\t\t};\r\n\r\n\r\n\t\tfunction setOption (option, value) {\r\n\t\t\tif (typeof option !== 'string') {\r\n\t\t\t\tthrow new Error('Invalid value for option name: ' + option);\r\n\t\t\t}\r\n\r\n\t\t\t// enum option\r\n\t\t\tif (jsc.enumOpts.hasOwnProperty(option)) {\r\n\t\t\t\tif (typeof value === 'string') { // enum string values are case insensitive\r\n\t\t\t\t\tvalue = value.toLowerCase();\r\n\t\t\t\t}\r\n\t\t\t\tif (jsc.enumOpts[option].indexOf(value) === -1) {\r\n\t\t\t\t\tthrow new Error('Option \\'' + option + '\\' has invalid value: ' + value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// deprecated option\r\n\t\t\tif (jsc.deprecatedOpts.hasOwnProperty(option)) {\r\n\t\t\t\tvar oldOpt = option;\r\n\t\t\t\tvar newOpt = jsc.deprecatedOpts[option];\r\n\t\t\t\tif (newOpt) {\r\n\t\t\t\t\t// if we have a new name for this option, let's log a warning and use the new name\r\n\t\t\t\t\tconsole.warn('Option \\'%s\\' is DEPRECATED, using \\'%s\\' instead.' + jsc.docsRef, oldOpt, newOpt);\r\n\t\t\t\t\toption = newOpt;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// new name not available for the option\r\n\t\t\t\t\tthrow new Error('Option \\'' + option + '\\' is DEPRECATED');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar setter = 'set__' + option;\r\n\r\n\t\t\tif (typeof THIS[setter] === 'function') { // a setter exists for this option\r\n\t\t\t\tTHIS[setter](value);\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t} else if (option in THIS) { // option exists as a property\r\n\t\t\t\tTHIS[option] = value;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\tthrow new Error('Unrecognized configuration option: ' + option);\r\n\t\t}\r\n\r\n\r\n\t\tfunction getOption (option) {\r\n\t\t\tif (typeof option !== 'string') {\r\n\t\t\t\tthrow new Error('Invalid value for option name: ' + option);\r\n\t\t\t}\r\n\r\n\t\t\t// deprecated option\r\n\t\t\tif (jsc.deprecatedOpts.hasOwnProperty(option)) {\r\n\t\t\t\tvar oldOpt = option;\r\n\t\t\t\tvar newOpt = jsc.deprecatedOpts[option];\r\n\t\t\t\tif (newOpt) {\r\n\t\t\t\t\t// if we have a new name for this option, let's log a warning and use the new name\r\n\t\t\t\t\tconsole.warn('Option \\'%s\\' is DEPRECATED, using \\'%s\\' instead.' + jsc.docsRef, oldOpt, newOpt);\r\n\t\t\t\t\toption = newOpt;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// new name not available for the option\r\n\t\t\t\t\tthrow new Error('Option \\'' + option + '\\' is DEPRECATED');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar getter = 'get__' + option;\r\n\r\n\t\t\tif (typeof THIS[getter] === 'function') { // a getter exists for this option\r\n\t\t\t\treturn THIS[getter](value);\r\n\r\n\t\t\t} else if (option in THIS) { // option exists as a property\r\n\t\t\t\treturn THIS[option];\r\n\t\t\t}\r\n\r\n\t\t\tthrow new Error('Unrecognized configuration option: ' + option);\r\n\t\t}\r\n\r\n\r\n\t\tfunction detachPicker () {\r\n\t\t\tjsc.removeClass(THIS.targetElement, jsc.pub.activeClassName);\r\n\t\t\tjsc.picker.wrap.parentNode.removeChild(jsc.picker.wrap);\r\n\t\t\tdelete jsc.picker.owner;\r\n\t\t}\r\n\r\n\r\n\t\tfunction drawPicker () {\r\n\r\n\t\t\t// At this point, when drawing the picker, we know what the parent elements are\r\n\t\t\t// and we can do all related DOM operations, such as registering events on them\r\n\t\t\t// or checking their positioning\r\n\t\t\tTHIS._processParentElementsInDOM();\r\n\r\n\t\t\tif (!jsc.picker) {\r\n\t\t\t\tjsc.picker = {\r\n\t\t\t\t\towner: null, // owner picker instance\r\n\t\t\t\t\twrap : jsc.createEl('div'),\r\n\t\t\t\t\tbox : jsc.createEl('div'),\r\n\t\t\t\t\tboxS : jsc.createEl('div'), // shadow area\r\n\t\t\t\t\tboxB : jsc.createEl('div'), // border\r\n\t\t\t\t\tpad : jsc.createEl('div'),\r\n\t\t\t\t\tpadB : jsc.createEl('div'), // border\r\n\t\t\t\t\tpadM : jsc.createEl('div'), // mouse/touch area\r\n\t\t\t\t\tpadCanvas : jsc.createPadCanvas(),\r\n\t\t\t\t\tcross : jsc.createEl('div'),\r\n\t\t\t\t\tcrossBY : jsc.createEl('div'), // border Y\r\n\t\t\t\t\tcrossBX : jsc.createEl('div'), // border X\r\n\t\t\t\t\tcrossLY : jsc.createEl('div'), // line Y\r\n\t\t\t\t\tcrossLX : jsc.createEl('div'), // line X\r\n\t\t\t\t\tsld : jsc.createEl('div'), // slider\r\n\t\t\t\t\tsldB : jsc.createEl('div'), // border\r\n\t\t\t\t\tsldM : jsc.createEl('div'), // mouse/touch area\r\n\t\t\t\t\tsldGrad : jsc.createSliderGradient(),\r\n\t\t\t\t\tsldPtrS : jsc.createEl('div'), // slider pointer spacer\r\n\t\t\t\t\tsldPtrIB : jsc.createEl('div'), // slider pointer inner border\r\n\t\t\t\t\tsldPtrMB : jsc.createEl('div'), // slider pointer middle border\r\n\t\t\t\t\tsldPtrOB : jsc.createEl('div'), // slider pointer outer border\r\n\t\t\t\t\tasld : jsc.createEl('div'), // alpha slider\r\n\t\t\t\t\tasldB : jsc.createEl('div'), // border\r\n\t\t\t\t\tasldM : jsc.createEl('div'), // mouse/touch area\r\n\t\t\t\t\tasldGrad : jsc.createASliderGradient(),\r\n\t\t\t\t\tasldPtrS : jsc.createEl('div'), // slider pointer spacer\r\n\t\t\t\t\tasldPtrIB : jsc.createEl('div'), // slider pointer inner border\r\n\t\t\t\t\tasldPtrMB : jsc.createEl('div'), // slider pointer middle border\r\n\t\t\t\t\tasldPtrOB : jsc.createEl('div'), // slider pointer outer border\r\n\t\t\t\t\tpal : jsc.createEl('div'), // palette\r\n\t\t\t\t\tbtn : jsc.createEl('div'),\r\n\t\t\t\t\tbtnT : jsc.createEl('span'), // text\r\n\t\t\t\t};\r\n\r\n\t\t\t\tjsc.picker.pad.appendChild(jsc.picker.padCanvas.elm);\r\n\t\t\t\tjsc.picker.padB.appendChild(jsc.picker.pad);\r\n\t\t\t\tjsc.picker.cross.appendChild(jsc.picker.crossBY);\r\n\t\t\t\tjsc.picker.cross.appendChild(jsc.picker.crossBX);\r\n\t\t\t\tjsc.picker.cross.appendChild(jsc.picker.crossLY);\r\n\t\t\t\tjsc.picker.cross.appendChild(jsc.picker.crossLX);\r\n\t\t\t\tjsc.picker.padB.appendChild(jsc.picker.cross);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.padB);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.padM);\r\n\r\n\t\t\t\tjsc.picker.sld.appendChild(jsc.picker.sldGrad.elm);\r\n\t\t\t\tjsc.picker.sldB.appendChild(jsc.picker.sld);\r\n\t\t\t\tjsc.picker.sldB.appendChild(jsc.picker.sldPtrOB);\r\n\t\t\t\tjsc.picker.sldPtrOB.appendChild(jsc.picker.sldPtrMB);\r\n\t\t\t\tjsc.picker.sldPtrMB.appendChild(jsc.picker.sldPtrIB);\r\n\t\t\t\tjsc.picker.sldPtrIB.appendChild(jsc.picker.sldPtrS);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.sldB);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.sldM);\r\n\r\n\t\t\t\tjsc.picker.asld.appendChild(jsc.picker.asldGrad.elm);\r\n\t\t\t\tjsc.picker.asldB.appendChild(jsc.picker.asld);\r\n\t\t\t\tjsc.picker.asldB.appendChild(jsc.picker.asldPtrOB);\r\n\t\t\t\tjsc.picker.asldPtrOB.appendChild(jsc.picker.asldPtrMB);\r\n\t\t\t\tjsc.picker.asldPtrMB.appendChild(jsc.picker.asldPtrIB);\r\n\t\t\t\tjsc.picker.asldPtrIB.appendChild(jsc.picker.asldPtrS);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.asldB);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.asldM);\r\n\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.pal);\r\n\r\n\t\t\t\tjsc.picker.btn.appendChild(jsc.picker.btnT);\r\n\t\t\t\tjsc.picker.box.appendChild(jsc.picker.btn);\r\n\r\n\t\t\t\tjsc.picker.boxB.appendChild(jsc.picker.box);\r\n\t\t\t\tjsc.picker.wrap.appendChild(jsc.picker.boxS);\r\n\t\t\t\tjsc.picker.wrap.appendChild(jsc.picker.boxB);\r\n\r\n\t\t\t\tjsc.picker.wrap.addEventListener('touchstart', jsc.onPickerTouchStart,\r\n\t\t\t\t\tjsc.isPassiveEventSupported ? {passive: false} : false);\r\n\t\t\t}\r\n\r\n\t\t\tvar p = jsc.picker;\r\n\r\n\t\t\tvar displaySlider = !!jsc.getSliderChannel(THIS);\r\n\t\t\tvar displayAlphaSlider = THIS.hasAlphaChannel();\r\n\t\t\tvar pickerDims = jsc.getPickerDims(THIS);\r\n\t\t\tvar crossOuterSize = (2 * THIS.pointerBorderWidth + THIS.pointerThickness + 2 * THIS.crossSize);\r\n\t\t\tvar controlPadding = jsc.getControlPadding(THIS);\r\n\t\t\tvar borderRadius = Math.min(\r\n\t\t\t\tTHIS.borderRadius,\r\n\t\t\t\tMath.round(THIS.padding * Math.PI)); // px\r\n\t\t\tvar padCursor = 'crosshair';\r\n\r\n\t\t\t// wrap\r\n\t\t\tp.wrap.className = 'jscolor-picker-wrap';\r\n\t\t\tp.wrap.style.clear = 'both';\r\n\t\t\tp.wrap.style.width = pickerDims.borderW + 'px';\r\n\t\t\tp.wrap.style.height = pickerDims.borderH + 'px';\r\n\t\t\tp.wrap.style.zIndex = THIS.zIndex;\r\n\r\n\t\t\t// picker\r\n\t\t\tp.box.className = 'jscolor-picker';\r\n\t\t\tp.box.style.width = pickerDims.paddedW + 'px';\r\n\t\t\tp.box.style.height = pickerDims.paddedH + 'px';\r\n\t\t\tp.box.style.position = 'relative';\r\n\r\n\t\t\t// picker shadow\r\n\t\t\tp.boxS.className = 'jscolor-picker-shadow';\r\n\t\t\tp.boxS.style.position = 'absolute';\r\n\t\t\tp.boxS.style.left = '0';\r\n\t\t\tp.boxS.style.top = '0';\r\n\t\t\tp.boxS.style.width = '100%';\r\n\t\t\tp.boxS.style.height = '100%';\r\n\t\t\tjsc.setBorderRadius(p.boxS, borderRadius + 'px');\r\n\r\n\t\t\t// picker border\r\n\t\t\tp.boxB.className = 'jscolor-picker-border';\r\n\t\t\tp.boxB.style.position = 'relative';\r\n\t\t\tp.boxB.style.border = THIS.borderWidth + 'px solid';\r\n\t\t\tp.boxB.style.borderColor = THIS.borderColor;\r\n\t\t\tp.boxB.style.background = THIS.backgroundColor;\r\n\t\t\tjsc.setBorderRadius(p.boxB, borderRadius + 'px');\r\n\r\n\t\t\t// IE hack:\r\n\t\t\t// If the element is transparent, IE will trigger the event on the elements under it,\r\n\t\t\t// e.g. on Canvas or on elements with border\r\n\t\t\tp.padM.style.background = 'rgba(255,0,0,.2)';\r\n\t\t\tp.sldM.style.background = 'rgba(0,255,0,.2)';\r\n\t\t\tp.asldM.style.background = 'rgba(0,0,255,.2)';\r\n\r\n\t\t\tp.padM.style.opacity =\r\n\t\t\tp.sldM.style.opacity =\r\n\t\t\tp.asldM.style.opacity =\r\n\t\t\t\t'0';\r\n\r\n\t\t\t// pad\r\n\t\t\tp.pad.style.position = 'relative';\r\n\t\t\tp.pad.style.width = THIS.width + 'px';\r\n\t\t\tp.pad.style.height = THIS.height + 'px';\r\n\r\n\t\t\t// pad - color spectrum (HSV and HVS)\r\n\t\t\tp.padCanvas.draw(THIS.width, THIS.height, jsc.getPadYChannel(THIS));\r\n\r\n\t\t\t// pad border\r\n\t\t\tp.padB.style.position = 'absolute';\r\n\t\t\tp.padB.style.left = THIS.padding + 'px';\r\n\t\t\tp.padB.style.top = THIS.padding + 'px';\r\n\t\t\tp.padB.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\tp.padB.style.borderColor = THIS.controlBorderColor;\r\n\r\n\t\t\t// pad mouse area\r\n\t\t\tp.padM.style.position = 'absolute';\r\n\t\t\tp.padM.style.left = 0 + 'px';\r\n\t\t\tp.padM.style.top = 0 + 'px';\r\n\t\t\tp.padM.style.width = (THIS.padding + 2 * THIS.controlBorderWidth + THIS.width + controlPadding) + 'px';\r\n\t\t\tp.padM.style.height = (2 * THIS.controlBorderWidth + 2 * THIS.padding + THIS.height) + 'px';\r\n\t\t\tp.padM.style.cursor = padCursor;\r\n\t\t\tjsc.setData(p.padM, {\r\n\t\t\t\tinstance: THIS,\r\n\t\t\t\tcontrol: 'pad',\r\n\t\t\t})\r\n\r\n\t\t\t// pad cross\r\n\t\t\tp.cross.style.position = 'absolute';\r\n\t\t\tp.cross.style.left =\r\n\t\t\tp.cross.style.top =\r\n\t\t\t\t'0';\r\n\t\t\tp.cross.style.width =\r\n\t\t\tp.cross.style.height =\r\n\t\t\t\tcrossOuterSize + 'px';\r\n\r\n\t\t\t// pad cross border Y and X\r\n\t\t\tp.crossBY.style.position =\r\n\t\t\tp.crossBX.style.position =\r\n\t\t\t\t'absolute';\r\n\t\t\tp.crossBY.style.background =\r\n\t\t\tp.crossBX.style.background =\r\n\t\t\t\tTHIS.pointerBorderColor;\r\n\t\t\tp.crossBY.style.width =\r\n\t\t\tp.crossBX.style.height =\r\n\t\t\t\t(2 * THIS.pointerBorderWidth + THIS.pointerThickness) + 'px';\r\n\t\t\tp.crossBY.style.height =\r\n\t\t\tp.crossBX.style.width =\r\n\t\t\t\tcrossOuterSize + 'px';\r\n\t\t\tp.crossBY.style.left =\r\n\t\t\tp.crossBX.style.top =\r\n\t\t\t\t(Math.floor(crossOuterSize / 2) - Math.floor(THIS.pointerThickness / 2) - THIS.pointerBorderWidth) + 'px';\r\n\t\t\tp.crossBY.style.top =\r\n\t\t\tp.crossBX.style.left =\r\n\t\t\t\t'0';\r\n\r\n\t\t\t// pad cross line Y and X\r\n\t\t\tp.crossLY.style.position =\r\n\t\t\tp.crossLX.style.position =\r\n\t\t\t\t'absolute';\r\n\t\t\tp.crossLY.style.background =\r\n\t\t\tp.crossLX.style.background =\r\n\t\t\t\tTHIS.pointerColor;\r\n\t\t\tp.crossLY.style.height =\r\n\t\t\tp.crossLX.style.width =\r\n\t\t\t\t(crossOuterSize - 2 * THIS.pointerBorderWidth) + 'px';\r\n\t\t\tp.crossLY.style.width =\r\n\t\t\tp.crossLX.style.height =\r\n\t\t\t\tTHIS.pointerThickness + 'px';\r\n\t\t\tp.crossLY.style.left =\r\n\t\t\tp.crossLX.style.top =\r\n\t\t\t\t(Math.floor(crossOuterSize / 2) - Math.floor(THIS.pointerThickness / 2)) + 'px';\r\n\t\t\tp.crossLY.style.top =\r\n\t\t\tp.crossLX.style.left =\r\n\t\t\t\tTHIS.pointerBorderWidth + 'px';\r\n\r\n\r\n\t\t\t// slider\r\n\t\t\tp.sld.style.overflow = 'hidden';\r\n\t\t\tp.sld.style.width = THIS.sliderSize + 'px';\r\n\t\t\tp.sld.style.height = THIS.height + 'px';\r\n\r\n\t\t\t// slider gradient\r\n\t\t\tp.sldGrad.draw(THIS.sliderSize, THIS.height, '#000', '#000');\r\n\r\n\t\t\t// slider border\r\n\t\t\tp.sldB.style.display = displaySlider ? 'block' : 'none';\r\n\t\t\tp.sldB.style.position = 'absolute';\r\n\t\t\tp.sldB.style.left = (THIS.padding + THIS.width + 2 * THIS.controlBorderWidth + 2 * controlPadding) + 'px';\r\n\t\t\tp.sldB.style.top = THIS.padding + 'px';\r\n\t\t\tp.sldB.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\tp.sldB.style.borderColor = THIS.controlBorderColor;\r\n\r\n\t\t\t// slider mouse area\r\n\t\t\tp.sldM.style.display = displaySlider ? 'block' : 'none';\r\n\t\t\tp.sldM.style.position = 'absolute';\r\n\t\t\tp.sldM.style.left = (THIS.padding + THIS.width + 2 * THIS.controlBorderWidth + controlPadding) + 'px';\r\n\t\t\tp.sldM.style.top = 0 + 'px';\r\n\t\t\tp.sldM.style.width = (\r\n\t\t\t\t\t(THIS.sliderSize + 2 * controlPadding + 2 * THIS.controlBorderWidth) +\r\n\t\t\t\t\t(displayAlphaSlider ? 0 : Math.max(0, THIS.padding - controlPadding)) // remaining padding to the right edge\r\n\t\t\t\t) + 'px';\r\n\t\t\tp.sldM.style.height = (2 * THIS.controlBorderWidth + 2 * THIS.padding + THIS.height) + 'px';\r\n\t\t\tp.sldM.style.cursor = 'default';\r\n\t\t\tjsc.setData(p.sldM, {\r\n\t\t\t\tinstance: THIS,\r\n\t\t\t\tcontrol: 'sld',\r\n\t\t\t});\r\n\r\n\t\t\t// slider pointer inner and outer border\r\n\t\t\tp.sldPtrIB.style.border =\r\n\t\t\tp.sldPtrOB.style.border =\r\n\t\t\t\tTHIS.pointerBorderWidth + 'px solid ' + THIS.pointerBorderColor;\r\n\r\n\t\t\t// slider pointer outer border\r\n\t\t\tp.sldPtrOB.style.position = 'absolute';\r\n\t\t\tp.sldPtrOB.style.left = -(2 * THIS.pointerBorderWidth + THIS.pointerThickness) + 'px';\r\n\t\t\tp.sldPtrOB.style.top = '0';\r\n\r\n\t\t\t// slider pointer middle border\r\n\t\t\tp.sldPtrMB.style.border = THIS.pointerThickness + 'px solid ' + THIS.pointerColor;\r\n\r\n\t\t\t// slider pointer spacer\r\n\t\t\tp.sldPtrS.style.width = THIS.sliderSize + 'px';\r\n\t\t\tp.sldPtrS.style.height = jsc.pub.sliderInnerSpace + 'px';\r\n\r\n\r\n\t\t\t// alpha slider\r\n\t\t\tp.asld.style.overflow = 'hidden';\r\n\t\t\tp.asld.style.width = THIS.sliderSize + 'px';\r\n\t\t\tp.asld.style.height = THIS.height + 'px';\r\n\r\n\t\t\t// alpha slider gradient\r\n\t\t\tp.asldGrad.draw(THIS.sliderSize, THIS.height, '#000');\r\n\r\n\t\t\t// alpha slider border\r\n\t\t\tp.asldB.style.display = displayAlphaSlider ? 'block' : 'none';\r\n\t\t\tp.asldB.style.position = 'absolute';\r\n\t\t\tp.asldB.style.left = (\r\n\t\t\t\t\t(THIS.padding + THIS.width + 2 * THIS.controlBorderWidth + controlPadding) +\r\n\t\t\t\t\t(displaySlider ? (THIS.sliderSize + 3 * controlPadding + 2 * THIS.controlBorderWidth) : 0)\r\n\t\t\t\t) + 'px';\r\n\t\t\tp.asldB.style.top = THIS.padding + 'px';\r\n\t\t\tp.asldB.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\tp.asldB.style.borderColor = THIS.controlBorderColor;\r\n\r\n\t\t\t// alpha slider mouse area\r\n\t\t\tp.asldM.style.display = displayAlphaSlider ? 'block' : 'none';\r\n\t\t\tp.asldM.style.position = 'absolute';\r\n\t\t\tp.asldM.style.left = (\r\n\t\t\t\t\t(THIS.padding + THIS.width + 2 * THIS.controlBorderWidth + controlPadding) +\r\n\t\t\t\t\t(displaySlider ? (THIS.sliderSize + 2 * controlPadding + 2 * THIS.controlBorderWidth) : 0)\r\n\t\t\t\t) + 'px';\r\n\t\t\tp.asldM.style.top = 0 + 'px';\r\n\t\t\tp.asldM.style.width = (\r\n\t\t\t\t\t(THIS.sliderSize + 2 * controlPadding + 2 * THIS.controlBorderWidth) +\r\n\t\t\t\t\tMath.max(0, THIS.padding - controlPadding) // remaining padding to the right edge\r\n\t\t\t\t) + 'px';\r\n\t\t\tp.asldM.style.height = (2 * THIS.controlBorderWidth + 2 * THIS.padding + THIS.height) + 'px';\r\n\t\t\tp.asldM.style.cursor = 'default';\r\n\t\t\tjsc.setData(p.asldM, {\r\n\t\t\t\tinstance: THIS,\r\n\t\t\t\tcontrol: 'asld',\r\n\t\t\t})\r\n\r\n\t\t\t// alpha slider pointer inner and outer border\r\n\t\t\tp.asldPtrIB.style.border =\r\n\t\t\tp.asldPtrOB.style.border =\r\n\t\t\t\tTHIS.pointerBorderWidth + 'px solid ' + THIS.pointerBorderColor;\r\n\r\n\t\t\t// alpha slider pointer outer border\r\n\t\t\tp.asldPtrOB.style.position = 'absolute';\r\n\t\t\tp.asldPtrOB.style.left = -(2 * THIS.pointerBorderWidth + THIS.pointerThickness) + 'px';\r\n\t\t\tp.asldPtrOB.style.top = '0';\r\n\r\n\t\t\t// alpha slider pointer middle border\r\n\t\t\tp.asldPtrMB.style.border = THIS.pointerThickness + 'px solid ' + THIS.pointerColor;\r\n\r\n\t\t\t// alpha slider pointer spacer\r\n\t\t\tp.asldPtrS.style.width = THIS.sliderSize + 'px';\r\n\t\t\tp.asldPtrS.style.height = jsc.pub.sliderInnerSpace + 'px';\r\n\r\n\r\n\t\t\t// palette\r\n\t\t\tp.pal.className = 'jscolor-palette';\r\n\t\t\tp.pal.style.display = pickerDims.palette.rows ? 'block' : 'none';\r\n\t\t\tp.pal.style.position = 'absolute';\r\n\t\t\tp.pal.style.left = THIS.padding + 'px';\r\n\t\t\tp.pal.style.top = (2 * THIS.controlBorderWidth + 2 * THIS.padding + THIS.height) + 'px';\r\n\r\n\t\t\t// palette's color samples\r\n\r\n\t\t\tp.pal.innerHTML = '';\r\n\r\n\t\t\tvar chessboard = jsc.genColorPreviewCanvas('rgba(0,0,0,0)');\r\n\r\n\t\t\tvar si = 0; // color sample's index\r\n\t\t\tfor (var r = 0; r < pickerDims.palette.rows; r++) {\r\n\t\t\t\tfor (var c = 0; c < pickerDims.palette.cols && si < THIS._palette.length; c++, si++) {\r\n\t\t\t\t\tvar sampleColor = THIS._palette[si];\r\n\t\t\t\t\tvar sampleCssColor = jsc.rgbaColor.apply(null, sampleColor.rgba);\r\n\r\n\t\t\t\t\tvar sc = jsc.createEl('div'); // color sample's color\r\n\t\t\t\t\tsc.style.width = (pickerDims.palette.cellW - 2 * THIS.controlBorderWidth) + 'px';\r\n\t\t\t\t\tsc.style.height = (pickerDims.palette.cellH - 2 * THIS.controlBorderWidth) + 'px';\r\n\t\t\t\t\tsc.style.backgroundColor = sampleCssColor;\r\n\r\n\t\t\t\t\tvar sw = jsc.createEl('div'); // color sample's wrap\r\n\t\t\t\t\tsw.className = 'jscolor-palette-sample';\r\n\t\t\t\t\tsw.style.display = 'block';\r\n\t\t\t\t\tsw.style.position = 'absolute';\r\n\t\t\t\t\tsw.style.left = (\r\n\t\t\t\t\t\t\tpickerDims.palette.cols <= 1 ? 0 :\r\n\t\t\t\t\t\t\tMath.round(10 * (c * ((pickerDims.contentW - pickerDims.palette.cellW) / (pickerDims.palette.cols - 1)))) / 10\r\n\t\t\t\t\t\t) + 'px';\r\n\t\t\t\t\tsw.style.top = (r * (pickerDims.palette.cellH + THIS.paletteSpacing)) + 'px';\r\n\t\t\t\t\tsw.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\t\t\tsw.style.borderColor = THIS.controlBorderColor;\r\n\t\t\t\t\tsw.style.cursor = 'pointer';\r\n\t\t\t\t\tif (sampleColor.rgba[3] !== null && sampleColor.rgba[3] < 1.0) { // only create chessboard background if the sample has transparency\r\n\t\t\t\t\t\tsw.style.backgroundImage = 'url(\\'' + chessboard.canvas.toDataURL() + '\\')';\r\n\t\t\t\t\t\tsw.style.backgroundRepeat = 'repeat';\r\n\t\t\t\t\t\tsw.style.backgroundPosition = 'center center';\r\n\t\t\t\t\t}\r\n\t\t\t\t\tjsc.setData(sw, {\r\n\t\t\t\t\t\tinstance: THIS,\r\n\t\t\t\t\t\tcontrol: 'palette-sample',\r\n\t\t\t\t\t\tcolor: sampleColor,\r\n\t\t\t\t\t})\r\n\t\t\t\t\tsw.addEventListener('click', jsc.onPaletteSampleClick, false);\r\n\t\t\t\t\tsw.appendChild(sc);\r\n\t\t\t\t\tp.pal.appendChild(sw);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\r\n\t\t\t// the Close button\r\n\t\t\tfunction setBtnBorder () {\r\n\t\t\t\tvar insetColors = THIS.controlBorderColor.split(/\\s+/);\r\n\t\t\t\tvar outsetColor = insetColors.length < 2 ? insetColors[0] : insetColors[1] + ' ' + insetColors[0] + ' ' + insetColors[0] + ' ' + insetColors[1];\r\n\t\t\t\tp.btn.style.borderColor = outsetColor;\r\n\t\t\t}\r\n\t\t\tvar btnPadding = 15; // px\r\n\t\t\tp.btn.className = 'jscolor-btn-close';\r\n\t\t\tp.btn.style.display = THIS.closeButton ? 'block' : 'none';\r\n\t\t\tp.btn.style.position = 'absolute';\r\n\t\t\tp.btn.style.left = THIS.padding + 'px';\r\n\t\t\tp.btn.style.bottom = THIS.padding + 'px';\r\n\t\t\tp.btn.style.padding = '0 ' + btnPadding + 'px';\r\n\t\t\tp.btn.style.maxWidth = (pickerDims.contentW - 2 * THIS.controlBorderWidth - 2 * btnPadding) + 'px';\r\n\t\t\tp.btn.style.overflow = 'hidden';\r\n\t\t\tp.btn.style.height = THIS.buttonHeight + 'px';\r\n\t\t\tp.btn.style.whiteSpace = 'nowrap';\r\n\t\t\tp.btn.style.border = THIS.controlBorderWidth + 'px solid';\r\n\t\t\tsetBtnBorder();\r\n\t\t\tp.btn.style.color = THIS.buttonColor;\r\n\t\t\tp.btn.style.font = '12px sans-serif';\r\n\t\t\tp.btn.style.textAlign = 'center';\r\n\t\t\tp.btn.style.cursor = 'pointer';\r\n\t\t\tp.btn.onmousedown = function () {\r\n\t\t\t\tTHIS.hide();\r\n\t\t\t};\r\n\t\t\tp.btnT.style.lineHeight = THIS.buttonHeight + 'px';\r\n\t\t\tp.btnT.innerHTML = '';\r\n\t\t\tp.btnT.appendChild(window.document.createTextNode(THIS.closeText));\r\n\r\n\t\t\t// reposition the pointers\r\n\t\t\tredrawPad();\r\n\t\t\tredrawSld();\r\n\t\t\tredrawASld();\r\n\r\n\t\t\t// If we are changing the owner without first closing the picker,\r\n\t\t\t// make sure to first deal with the old owner\r\n\t\t\tif (jsc.picker.owner && jsc.picker.owner !== THIS) {\r\n\t\t\t\tjsc.removeClass(jsc.picker.owner.targetElement, jsc.pub.activeClassName);\r\n\t\t\t}\r\n\r\n\t\t\t// Set a new picker owner\r\n\t\t\tjsc.picker.owner = THIS;\r\n\r\n\t\t\t// The redrawPosition() method needs picker.owner to be set, that's why we call it here,\r\n\t\t\t// after setting the owner\r\n\t\t\tif (THIS.container === window.document.body) {\r\n\t\t\t\tjsc.redrawPosition();\r\n\t\t\t} else {\r\n\t\t\t\tjsc._drawPosition(THIS, 0, 0, 'relative', false);\r\n\t\t\t}\r\n\r\n\t\t\tif (p.wrap.parentNode !== THIS.container) {\r\n\t\t\t\tTHIS.container.appendChild(p.wrap);\r\n\t\t\t}\r\n\r\n\t\t\tjsc.addClass(THIS.targetElement, jsc.pub.activeClassName);\r\n\t\t}\r\n\r\n\r\n\t\tfunction redrawPad () {\r\n\t\t\t// redraw the pad pointer\r\n\t\t\tvar yChannel = jsc.getPadYChannel(THIS);\r\n\t\t\tvar x = Math.round((THIS.channels.h / 360) * (THIS.width - 1));\r\n\t\t\tvar y = Math.round((1 - THIS.channels[yChannel] / 100) * (THIS.height - 1));\r\n\t\t\tvar crossOuterSize = (2 * THIS.pointerBorderWidth + THIS.pointerThickness + 2 * THIS.crossSize);\r\n\t\t\tvar ofs = -Math.floor(crossOuterSize / 2);\r\n\t\t\tjsc.picker.cross.style.left = (x + ofs) + 'px';\r\n\t\t\tjsc.picker.cross.style.top = (y + ofs) + 'px';\r\n\r\n\t\t\t// redraw the slider\r\n\t\t\tswitch (jsc.getSliderChannel(THIS)) {\r\n\t\t\tcase 's':\r\n\t\t\t\tvar rgb1 = jsc.HSV_RGB(THIS.channels.h, 100, THIS.channels.v);\r\n\t\t\t\tvar rgb2 = jsc.HSV_RGB(THIS.channels.h, 0, THIS.channels.v);\r\n\t\t\t\tvar color1 = 'rgb(' +\r\n\t\t\t\t\tMath.round(rgb1[0]) + ',' +\r\n\t\t\t\t\tMath.round(rgb1[1]) + ',' +\r\n\t\t\t\t\tMath.round(rgb1[2]) + ')';\r\n\t\t\t\tvar color2 = 'rgb(' +\r\n\t\t\t\t\tMath.round(rgb2[0]) + ',' +\r\n\t\t\t\t\tMath.round(rgb2[1]) + ',' +\r\n\t\t\t\t\tMath.round(rgb2[2]) + ')';\r\n\t\t\t\tjsc.picker.sldGrad.draw(THIS.sliderSize, THIS.height, color1, color2);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'v':\r\n\t\t\t\tvar rgb = jsc.HSV_RGB(THIS.channels.h, THIS.channels.s, 100);\r\n\t\t\t\tvar color1 = 'rgb(' +\r\n\t\t\t\t\tMath.round(rgb[0]) + ',' +\r\n\t\t\t\t\tMath.round(rgb[1]) + ',' +\r\n\t\t\t\t\tMath.round(rgb[2]) + ')';\r\n\t\t\t\tvar color2 = '#000';\r\n\t\t\t\tjsc.picker.sldGrad.draw(THIS.sliderSize, THIS.height, color1, color2);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\t// redraw the alpha slider\r\n\t\t\tjsc.picker.asldGrad.draw(THIS.sliderSize, THIS.height, THIS.toHEXString());\r\n\t\t}\r\n\r\n\r\n\t\tfunction redrawSld () {\r\n\t\t\tvar sldChannel = jsc.getSliderChannel(THIS);\r\n\t\t\tif (sldChannel) {\r\n\t\t\t\t// redraw the slider pointer\r\n\t\t\t\tvar y = Math.round((1 - THIS.channels[sldChannel] / 100) * (THIS.height - 1));\r\n\t\t\t\tjsc.picker.sldPtrOB.style.top = (y - (2 * THIS.pointerBorderWidth + THIS.pointerThickness) - Math.floor(jsc.pub.sliderInnerSpace / 2)) + 'px';\r\n\t\t\t}\r\n\r\n\t\t\t// redraw the alpha slider\r\n\t\t\tjsc.picker.asldGrad.draw(THIS.sliderSize, THIS.height, THIS.toHEXString());\r\n\t\t}\r\n\r\n\r\n\t\tfunction redrawASld () {\r\n\t\t\tvar y = Math.round((1 - THIS.channels.a) * (THIS.height - 1));\r\n\t\t\tjsc.picker.asldPtrOB.style.top = (y - (2 * THIS.pointerBorderWidth + THIS.pointerThickness) - Math.floor(jsc.pub.sliderInnerSpace / 2)) + 'px';\r\n\t\t}\r\n\r\n\r\n\t\tfunction isPickerOwner () {\r\n\t\t\treturn jsc.picker && jsc.picker.owner === THIS;\r\n\t\t}\r\n\r\n\r\n\t\tfunction onValueKeyDown (ev) {\r\n\t\t\tif (jsc.eventKey(ev) === 'Enter') {\r\n\t\t\t\tif (THIS.valueElement) {\r\n\t\t\t\t\tTHIS.processValueInput(THIS.valueElement.value);\r\n\t\t\t\t}\r\n\t\t\t\tTHIS.tryHide();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction onAlphaKeyDown (ev) {\r\n\t\t\tif (jsc.eventKey(ev) === 'Enter') {\r\n\t\t\t\tif (THIS.alphaElement) {\r\n\t\t\t\t\tTHIS.processAlphaInput(THIS.alphaElement.value);\r\n\t\t\t\t}\r\n\t\t\t\tTHIS.tryHide();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction onValueChange (ev) {\r\n\t\t\tif (jsc.getData(ev, 'internal')) {\r\n\t\t\t\treturn; // skip if the event was internally triggered by jscolor\r\n\t\t\t}\r\n\r\n\t\t\tvar oldVal = THIS.valueElement.value;\r\n\r\n\t\t\tTHIS.processValueInput(THIS.valueElement.value); // this might change the value\r\n\r\n\t\t\tjsc.triggerCallback(THIS, 'onChange');\r\n\r\n\t\t\tif (THIS.valueElement.value !== oldVal) {\r\n\t\t\t\t// value was additionally changed -> let's trigger the change event again, even though it was natively dispatched\r\n\t\t\t\tjsc.triggerInputEvent(THIS.valueElement, 'change', true, true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction onAlphaChange (ev) {\r\n\t\t\tif (jsc.getData(ev, 'internal')) {\r\n\t\t\t\treturn; // skip if the event was internally triggered by jscolor\r\n\t\t\t}\r\n\r\n\t\t\tvar oldVal = THIS.alphaElement.value;\r\n\r\n\t\t\tTHIS.processAlphaInput(THIS.alphaElement.value); // this might change the value\r\n\r\n\t\t\tjsc.triggerCallback(THIS, 'onChange');\r\n\r\n\t\t\t// triggering valueElement's onChange (because changing alpha changes the entire color, e.g. with rgba format)\r\n\t\t\tjsc.triggerInputEvent(THIS.valueElement, 'change', true, true);\r\n\r\n\t\t\tif (THIS.alphaElement.value !== oldVal) {\r\n\t\t\t\t// value was additionally changed -> let's trigger the change event again, even though it was natively dispatched\r\n\t\t\t\tjsc.triggerInputEvent(THIS.alphaElement, 'change', true, true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tfunction onValueInput (ev) {\r\n\t\t\tif (jsc.getData(ev, 'internal')) {\r\n\t\t\t\treturn; // skip if the event was internally triggered by jscolor\r\n\t\t\t}\r\n\r\n\t\t\tif (THIS.valueElement) {\r\n\t\t\t\tTHIS.fromString(THIS.valueElement.value, jsc.flags.leaveValue);\r\n\t\t\t}\r\n\r\n\t\t\tjsc.triggerCallback(THIS, 'onInput');\r\n\r\n\t\t\t// triggering valueElement's onInput\r\n\t\t\t// (not needed, it was dispatched normally by the browser)\r\n\t\t}\r\n\r\n\r\n\t\tfunction onAlphaInput (ev) {\r\n\t\t\tif (jsc.getData(ev, 'internal')) {\r\n\t\t\t\treturn; // skip if the event was internally triggered by jscolor\r\n\t\t\t}\r\n\r\n\t\t\tif (THIS.alphaElement) {\r\n\t\t\t\tTHIS.fromHSVA(null, null, null, parseFloat(THIS.alphaElement.value), jsc.flags.leaveAlpha);\r\n\t\t\t}\r\n\r\n\t\t\tjsc.triggerCallback(THIS, 'onInput');\r\n\r\n\t\t\t// triggering valueElement's onInput (because changing alpha changes the entire color, e.g. with rgba format)\r\n\t\t\tjsc.triggerInputEvent(THIS.valueElement, 'input', true, true);\r\n\t\t}\r\n\r\n\r\n\t\t// let's process the DEPRECATED 'options' property (this will be later removed)\r\n\t\tif (jsc.pub.options) {\r\n\t\t\t// let's set custom default options, if specified\r\n\t\t\tfor (var opt in jsc.pub.options) {\r\n\t\t\t\tif (jsc.pub.options.hasOwnProperty(opt)) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tsetOption(opt, jsc.pub.options[opt]);\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\t// let's apply configuration presets\r\n\t\t//\r\n\t\tvar presetsArr = [];\r\n\r\n\t\tif (opts.preset) {\r\n\t\t\tif (typeof opts.preset === 'string') {\r\n\t\t\t\tpresetsArr = opts.preset.split(/\\s+/);\r\n\t\t\t} else if (Array.isArray(opts.preset)) {\r\n\t\t\t\tpresetsArr = opts.preset.slice(); // slice() to clone\r\n\t\t\t} else {\r\n\t\t\t\tconsole.warn('Unrecognized preset value');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// always use the 'default' preset. If it's not listed, append it to the end.\r\n\t\tif (presetsArr.indexOf('default') === -1) {\r\n\t\t\tpresetsArr.push('default');\r\n\t\t}\r\n\r\n\t\t// let's apply the presets in reverse order, so that should there be any overlapping options,\r\n\t\t// the formerly listed preset will override the latter\r\n\t\tfor (var i = presetsArr.length - 1; i >= 0; i -= 1) {\r\n\t\t\tvar pres = presetsArr[i];\r\n\t\t\tif (!pres) {\r\n\t\t\t\tcontinue; // preset is empty string\r\n\t\t\t}\r\n\t\t\tif (!jsc.pub.presets.hasOwnProperty(pres)) {\r\n\t\t\t\tconsole.warn('Unknown preset: %s', pres);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tfor (var opt in jsc.pub.presets[pres]) {\r\n\t\t\t\tif (jsc.pub.presets[pres].hasOwnProperty(opt)) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tsetOption(opt, jsc.pub.presets[pres][opt]);\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\t// let's set specific options for this color picker\r\n\t\tvar nonProperties = [\r\n\t\t\t// these options won't be set as instance properties\r\n\t\t\t'preset',\r\n\t\t];\r\n\t\tfor (var opt in opts) {\r\n\t\t\tif (opts.hasOwnProperty(opt)) {\r\n\t\t\t\tif (nonProperties.indexOf(opt) === -1) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tsetOption(opt, opts[opt]);\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\t//\r\n\t\t// Install the color picker on chosen element(s)\r\n\t\t//\r\n\r\n\r\n\t\t// Determine picker's container element\r\n\t\tif (this.container === undefined) {\r\n\t\t\tthis.container = window.document.body; // default container is BODY element\r\n\r\n\t\t} else { // explicitly set to custom element\r\n\t\t\tthis.container = jsc.node(this.container);\r\n\t\t}\r\n\r\n\t\tif (!this.container) {\r\n\t\t\tthrow new Error('Cannot instantiate color picker without a container element');\r\n\t\t}\r\n\r\n\r\n\t\t// Fetch the target element\r\n\t\tthis.targetElement = jsc.node(targetElement);\r\n\r\n\t\tif (!this.targetElement) {\r\n\t\t\t// temporarily customized error message to help with migrating from versions prior to 2.2\r\n\t\t\tif (typeof targetElement === 'string' && /^[a-zA-Z][\\w:.-]*$/.test(targetElement)) {\r\n\t\t\t\t// targetElement looks like valid ID\r\n\t\t\t\tvar possiblyId = targetElement;\r\n\t\t\t\tthrow new Error('If \\'' + possiblyId + '\\' is supposed to be an ID, please use \\'#' + possiblyId + '\\' or any valid CSS selector.');\r\n\t\t\t}\r\n\r\n\t\t\tthrow new Error('Cannot instantiate color picker without a target element');\r\n\t\t}\r\n\r\n\t\tif (this.targetElement.jscolor && this.targetElement.jscolor instanceof jsc.pub) {\r\n\t\t\tthrow new Error('Color picker already installed on this element');\r\n\t\t}\r\n\r\n\r\n\t\t// link this instance with the target element\r\n\t\tthis.targetElement.jscolor = this;\r\n\t\tjsc.addClass(this.targetElement, jsc.pub.className);\r\n\r\n\t\t// register this instance\r\n\t\tjsc.instances.push(this);\r\n\r\n\r\n\t\t// if target is BUTTON\r\n\t\tif (jsc.isButton(this.targetElement)) {\r\n\r\n\t\t\tif (this.targetElement.type.toLowerCase() !== 'button') {\r\n\t\t\t\t// on buttons, always force type to be 'button', e.g. in situations the target <button> has no type\r\n\t\t\t\t// and thus defaults to 'submit' and would submit the form when clicked\r\n\t\t\t\tthis.targetElement.type = 'button';\r\n\t\t\t}\r\n\r\n\t\t\tif (jsc.isButtonEmpty(this.targetElement)) { // empty button\r\n\t\t\t\t// it is important to clear element's contents first.\r\n\t\t\t\t// if we're re-instantiating color pickers on DOM that has been modified by changing page's innerHTML,\r\n\t\t\t\t// we would keep adding more non-breaking spaces to element's content (because element's contents survive\r\n\t\t\t\t// innerHTML changes, but picker instances don't)\r\n\t\t\t\tjsc.removeChildren(this.targetElement);\r\n\r\n\t\t\t\t// let's insert a non-breaking space\r\n\t\t\t\tthis.targetElement.appendChild(window.document.createTextNode('\\xa0'));\r\n\r\n\t\t\t\t// set min-width = previewSize, if not already greater\r\n\t\t\t\tvar compStyle = jsc.getCompStyle(this.targetElement);\r\n\t\t\t\tvar currMinWidth = parseFloat(compStyle['min-width']) || 0;\r\n\t\t\t\tif (currMinWidth < this.previewSize) {\r\n\t\t\t\t\tjsc.setStyle(this.targetElement, {\r\n\t\t\t\t\t\t'min-width': this.previewSize + 'px',\r\n\t\t\t\t\t}, this.forceStyle);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Determine the value element\r\n\t\tif (this.valueElement === undefined) {\r\n\t\t\tif (jsc.isTextInput(this.targetElement)) {\r\n\t\t\t\t// for text inputs, default valueElement is targetElement\r\n\t\t\t\tthis.valueElement = this.targetElement;\r\n\t\t\t} else {\r\n\t\t\t\t// leave it undefined\r\n\t\t\t}\r\n\r\n\t\t} else if (this.valueElement === null) { // explicitly set to null\r\n\t\t\t// leave it null\r\n\r\n\t\t} else { // explicitly set to custom element\r\n\t\t\tthis.valueElement = jsc.node(this.valueElement);\r\n\t\t}\r\n\r\n\t\t// Determine the alpha element\r\n\t\tif (this.alphaElement) {\r\n\t\t\tthis.alphaElement = jsc.node(this.alphaElement);\r\n\t\t}\r\n\r\n\t\t// Determine the preview element\r\n\t\tif (this.previewElement === undefined) {\r\n\t\t\tthis.previewElement = this.targetElement; // default previewElement is targetElement\r\n\r\n\t\t} else if (this.previewElement === null) { // explicitly set to null\r\n\t\t\t// leave it null\r\n\r\n\t\t} else { // explicitly set to custom element\r\n\t\t\tthis.previewElement = jsc.node(this.previewElement);\r\n\t\t}\r\n\r\n\t\t// valueElement\r\n\t\tif (this.valueElement && jsc.isTextInput(this.valueElement)) {\r\n\r\n\t\t\t// If the value element has onInput event already set, we need to detach it and attach AFTER our listener.\r\n\t\t\t// otherwise the picker instance would still contain the old color when accessed from the onInput handler.\r\n\t\t\tvar valueElementOrigEvents = {\r\n\t\t\t\tonInput: this.valueElement.oninput\r\n\t\t\t};\r\n\t\t\tthis.valueElement.oninput = null;\r\n\r\n\t\t\tthis.valueElement.addEventListener('keydown', onValueKeyDown, false);\r\n\t\t\tthis.valueElement.addEventListener('change', onValueChange, false);\r\n\t\t\tthis.valueElement.addEventListener('input', onValueInput, false);\r\n\t\t\t// the original event listener must be attached AFTER our handler (to let it first set picker's color)\r\n\t\t\tif (valueElementOrigEvents.onInput) {\r\n\t\t\t\tthis.valueElement.addEventListener('input', valueElementOrigEvents.onInput, false);\r\n\t\t\t}\r\n\r\n\t\t\tthis.valueElement.setAttribute('autocomplete', 'off');\r\n\t\t\tthis.valueElement.setAttribute('autocorrect', 'off');\r\n\t\t\tthis.valueElement.setAttribute('autocapitalize', 'off');\r\n\t\t\tthis.valueElement.setAttribute('spellcheck', false);\r\n\t\t}\r\n\r\n\t\t// alphaElement\r\n\t\tif (this.alphaElement && jsc.isTextInput(this.alphaElement)) {\r\n\t\t\tthis.alphaElement.addEventListener('keydown', onAlphaKeyDown, false);\r\n\t\t\tthis.alphaElement.addEventListener('change', onAlphaChange, false);\r\n\t\t\tthis.alphaElement.addEventListener('input', onAlphaInput, false);\r\n\r\n\t\t\tthis.alphaElement.setAttribute('autocomplete', 'off');\r\n\t\t\tthis.alphaElement.setAttribute('autocorrect', 'off');\r\n\t\t\tthis.alphaElement.setAttribute('autocapitalize', 'off');\r\n\t\t\tthis.alphaElement.setAttribute('spellcheck', false);\r\n\t\t}\r\n\r\n\t\t// determine initial color value\r\n\t\t//\r\n\t\tvar initValue = 'FFFFFF';\r\n\r\n\t\tif (this.value !== undefined) {\r\n\t\t\tinitValue = this.value; // get initial color from the 'value' property\r\n\t\t} else if (this.valueElement && this.valueElement.value !== undefined) {\r\n\t\t\tinitValue = this.valueElement.value; // get initial color from valueElement's value\r\n\t\t}\r\n\r\n\t\t// determine initial alpha value\r\n\t\t//\r\n\t\tvar initAlpha = undefined;\r\n\r\n\t\tif (this.alpha !== undefined) {\r\n\t\t\tinitAlpha = (''+this.alpha); // get initial alpha value from the 'alpha' property\r\n\t\t} else if (this.alphaElement && this.alphaElement.value !== undefined) {\r\n\t\t\tinitAlpha = this.alphaElement.value; // get initial color from alphaElement's value\r\n\t\t}\r\n\r\n\t\t// determine current format based on the initial color value\r\n\t\t//\r\n\t\tthis._currentFormat = null;\r\n\r\n\t\tif (['auto', 'any'].indexOf(this.format.toLowerCase()) > -1) {\r\n\t\t\t// format is 'auto' or 'any' -> let's auto-detect current format\r\n\t\t\tvar color = jsc.parseColorString(initValue);\r\n\t\t\tthis._currentFormat = color ? color.format : 'hex';\r\n\t\t} else {\r\n\t\t\t// format is specified\r\n\t\t\tthis._currentFormat = this.format.toLowerCase();\r\n\t\t}\r\n\r\n\r\n\t\t// let's parse the initial color value and expose color's preview\r\n\t\tthis.processValueInput(initValue);\r\n\r\n\t\t// let's also parse and expose the initial alpha value, if any\r\n\t\t//\r\n\t\t// Note: If the initial color value contains alpha value in it (e.g. in rgba format),\r\n\t\t// this will overwrite it. So we should only process alpha input if there was initial\r\n\t\t// alpha explicitly set, otherwise we could needlessly lose initial value's alpha\r\n\t\tif (initAlpha !== undefined) {\r\n\t\t\tthis.processAlphaInput(initAlpha);\r\n\t\t}\r\n\r\n\t\tif (this.random) {\r\n\t\t\t// randomize the initial color value\r\n\t\t\tthis.randomize.apply(this, Array.isArray(this.random) ? this.random : []);\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n\r\n//================================\r\n// Public properties and methods\r\n//================================\r\n\r\n//\r\n// These will be publicly available via jscolor.<name> and JSColor.<name>\r\n//\r\n\r\n\r\n// class that will be set to elements having jscolor installed on them\r\njsc.pub.className = 'jscolor';\r\n\r\n\r\n// class that will be set to elements having jscolor active on them\r\njsc.pub.activeClassName = 'jscolor-active';\r\n\r\n\r\n// whether to try to parse the options string by evaluating it using 'new Function()'\r\n// in case it could not be parsed with JSON.parse()\r\njsc.pub.looseJSON = true;\r\n\r\n\r\n// presets\r\njsc.pub.presets = {};\r\n\r\n// built-in presets\r\njsc.pub.presets['default'] = {}; // baseline for customization\r\n\r\njsc.pub.presets['light'] = { // default color scheme\r\n\tbackgroundColor: 'rgba(255,255,255,1)',\r\n\tcontrolBorderColor: 'rgba(187,187,187,1)',\r\n\tbuttonColor: 'rgba(0,0,0,1)',\r\n};\r\njsc.pub.presets['dark'] = {\r\n\tbackgroundColor: 'rgba(51,51,51,1)',\r\n\tcontrolBorderColor: 'rgba(153,153,153,1)',\r\n\tbuttonColor: 'rgba(240,240,240,1)',\r\n};\r\n\r\njsc.pub.presets['small'] = { width:101, height:101, padding:10, sliderSize:14, paletteCols:8 };\r\njsc.pub.presets['medium'] = { width:181, height:101, padding:12, sliderSize:16, paletteCols:10 }; // default size\r\njsc.pub.presets['large'] = { width:271, height:151, padding:12, sliderSize:24, paletteCols:15 };\r\n\r\njsc.pub.presets['thin'] = { borderWidth:1, controlBorderWidth:1, pointerBorderWidth:1 }; // default thickness\r\njsc.pub.presets['thick'] = { borderWidth:2, controlBorderWidth:2, pointerBorderWidth:2 };\r\n\r\n\r\n// size of space in the sliders\r\njsc.pub.sliderInnerSpace = 3; // px\r\n\r\n// transparency chessboard\r\njsc.pub.chessboardSize = 8; // px\r\njsc.pub.chessboardColor1 = '#666666';\r\njsc.pub.chessboardColor2 = '#999999';\r\n\r\n// preview separator\r\njsc.pub.previewSeparator = ['rgba(255,255,255,.65)', 'rgba(128,128,128,.65)'];\r\n\r\n\r\n// Initializes jscolor\r\njsc.pub.init = function () {\r\n\tif (jsc.initialized) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t// attach some necessary handlers\r\n\twindow.document.addEventListener('mousedown', jsc.onDocumentMouseDown, false);\r\n\twindow.document.addEventListener('keyup', jsc.onDocumentKeyUp, false);\r\n\twindow.addEventListener('resize', jsc.onWindowResize, false);\r\n\twindow.addEventListener('scroll', jsc.onWindowScroll, false);\r\n\r\n\t// install jscolor on current DOM\r\n\tjsc.pub.install();\r\n\r\n\tjsc.initialized = true;\r\n\r\n\t// call functions waiting in the queue\r\n\twhile (jsc.readyQueue.length) {\r\n\t\tvar func = jsc.readyQueue.shift();\r\n\t\tfunc();\r\n\t}\r\n};\r\n\r\n\r\n// Installs jscolor on current DOM tree\r\njsc.pub.install = function (rootNode) {\r\n\tvar success = true;\r\n\r\n\ttry {\r\n\t\tjsc.installBySelector('[data-jscolor]', rootNode);\r\n\t} catch (e) {\r\n\t\tsuccess = false;\r\n\t\tconsole.warn(e);\r\n\t}\r\n\r\n\t// for backward compatibility with DEPRECATED installation using class name\r\n\tif (jsc.pub.lookupClass) {\r\n\t\ttry {\r\n\t\t\tjsc.installBySelector(\r\n\t\t\t\t(\r\n\t\t\t\t\t'input.' + jsc.pub.lookupClass + ', ' +\r\n\t\t\t\t\t'button.' + jsc.pub.lookupClass\r\n\t\t\t\t),\r\n\t\t\t\trootNode\r\n\t\t\t);\r\n\t\t} catch (e) {}\r\n\t}\r\n\r\n\treturn success;\r\n};\r\n\r\n\r\n// Registers function to be called as soon as jscolor is initialized (or immediately, if it already is).\r\n//\r\njsc.pub.ready = function (func) {\r\n\tif (typeof func !== 'function') {\r\n\t\tconsole.warn('Passed value is not a function');\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif (jsc.initialized) {\r\n\t\tfunc();\r\n\t} else {\r\n\t\tjsc.readyQueue.push(func);\r\n\t}\r\n\treturn true;\r\n};\r\n\r\n\r\n// Triggers given input event(s) (e.g. 'input' or 'change') on all color pickers.\r\n//\r\n// It is possible to specify multiple events separated with a space.\r\n// If called before jscolor is initialized, then the events will be triggered after initialization.\r\n//\r\njsc.pub.trigger = function (eventNames) {\r\n\tvar triggerNow = function () {\r\n\t\tjsc.triggerGlobal(eventNames);\r\n\t};\r\n\r\n\tif (jsc.initialized) {\r\n\t\ttriggerNow();\r\n\t} else {\r\n\t\tjsc.pub.ready(triggerNow);\r\n\t}\r\n};\r\n\r\n\r\n// Hides current color picker box\r\njsc.pub.hide = function () {\r\n\tif (jsc.picker && jsc.picker.owner) {\r\n\t\tjsc.picker.owner.hide();\r\n\t}\r\n};\r\n\r\n\r\n// Returns a data URL of a gray chessboard image that indicates transparency\r\njsc.pub.chessboard = function (color) {\r\n\tif (!color) {\r\n\t\tcolor = 'rgba(0,0,0,0)';\r\n\t}\r\n\tvar preview = jsc.genColorPreviewCanvas(color);\r\n\treturn preview.canvas.toDataURL();\r\n};\r\n\r\n\r\n// Returns a data URL of a gray chessboard image that indicates transparency\r\njsc.pub.background = function (color) {\r\n\tvar backgrounds = [];\r\n\r\n\t// CSS gradient for background color preview\r\n\tbackgrounds.push(jsc.genColorPreviewGradient(color));\r\n\r\n\t// data URL of generated PNG image with a gray transparency chessboard\r\n\tvar preview = jsc.genColorPreviewCanvas();\r\n\tbackgrounds.push([\r\n\t\t'url(\\'' + preview.canvas.toDataURL() + '\\')',\r\n\t\t'left top',\r\n\t\t'repeat',\r\n\t].join(' '));\r\n\r\n\treturn backgrounds.join(', ');\r\n};\r\n\r\n\r\n//\r\n// DEPRECATED properties and methods\r\n//\r\n\r\n\r\n// DEPRECATED. Use jscolor.presets.default instead.\r\n//\r\n// Custom default options for all color pickers, e.g. { hash: true, width: 300 }\r\njsc.pub.options = {};\r\n\r\n\r\n// DEPRECATED. Use data-jscolor attribute instead, which installs jscolor on given element.\r\n//\r\n// By default, we'll search for all elements with class=\"jscolor\" and install a color picker on them.\r\n//\r\n// You can change what class name will be looked for by setting the property jscolor.lookupClass\r\n// anywhere in your HTML document. To completely disable the automatic lookup, set it to null.\r\n//\r\njsc.pub.lookupClass = 'jscolor';\r\n\r\n\r\n// DEPRECATED. Use data-jscolor attribute instead, which installs jscolor on given element.\r\n//\r\n// Install jscolor on all elements that have the specified class name\r\njsc.pub.installByClassName = function () {\r\n\tconsole.error('jscolor.installByClassName() is DEPRECATED. Use data-jscolor=\"\" attribute instead of a class name.' + jsc.docsRef);\r\n\treturn false;\r\n};\r\n\r\n\r\njsc.register();\r\n\r\n\r\nreturn jsc.pub;\r\n\r\n\r\n})(); // END jscolor\r\n\r\n\r\nif (typeof window.jscolor === 'undefined') {\r\n\twindow.jscolor = window.JSColor = jscolor;\r\n}\r\n\r\n\r\n// END jscolor code\r\n\r\nreturn jscolor;\r\n\r\n}); // END factory\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/** The basic setting class */\nexport default class Setting {\n constructor(defaultValue, type, group) {\n this.defaultValue = defaultValue;\n this.type = type;\n this.group = group;\n }\n}\n","/** Creates a Prompt similar to the base game fixing some of the stuff breaking them\n * @param \t{string}\tcontent\t The outerHTML of the inputPrompt\n * @param \t{Array}\t\toptions\t An array containing labels and functions for the buttons of the prompt\n */\nexport default function cookieMonsterPrompt(content, options) {\n Game.promptWrapL.className = 'framed';\n Game.promptL.innerHTML = `${content}<div class=\"optionBox\"></div>`;\n Object.keys(options).forEach((i) => {\n const option = document.createElement('a');\n option.id = `promptOption${i}`;\n option.className = 'option';\n option.onclick = function () {\n PlaySound('snd/tick.mp3');\n options[i][1]();\n };\n option.textContent = options[i][0]; // eslint-disable-line prefer-destructuring\n Game.promptL.children[1].appendChild(option);\n });\n Game.promptAnchorL.style.display = 'block';\n Game.darkenL.style.display = 'block';\n Game.promptL.focus();\n Game.promptOn = 1;\n Game.UpdatePrompt();\n}\n","/**\n * This function creates a flash depending on config\n * @param\t{string}\tmodName\t The name of the mod\n * @param\t{number}\tmode\t Sets the intensity of the flash, used to recursively dim flash\n * \t\t\t\t\t\t\t\t All initial calls of function have use mode === 3\n * @param\t{string}\tconfigName\tThe setting that is checked before creating the flash\n * @param\t{bool} forced\t Whether the sound should play regardless of settings, used to test the sound\n */\n\nexport default function createFlash(modName, mode, configName, forced) {\n // The arguments check makes the sound not play upon initialization of the mod\n if (\n ((Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] === 1 || forced) &&\n mode === 3 &&\n window.cookieMonsterFrameworkData.isInitializing === false) ||\n mode === 1\n ) {\n l('CMFlashScreen').style.backgroundColor =\n Game.mods.cookieMonsterFramework.saveData[modName].settings[`Colour${configName}`];\n l('CMFlashScreen').style.opacity = '0.5';\n if (mode === 3) {\n l('CMFlashScreen').style.display = 'inline';\n setTimeout(() => {\n createFlash(modName, 2, configName, true);\n }, 1000 / Game.fps);\n } else {\n setTimeout(() => {\n createFlash(modName, 0, configName, true);\n }, 1000 / Game.fps);\n }\n } else if (mode === 2) {\n l('CMFlashScreen').style.opacity = '1';\n setTimeout(() => {\n createFlash(modName, 1, configName, true);\n }, 1000 / Game.fps);\n } else if (mode === 0) l('CMFlashScreen').style.display = 'none';\n}\n","/**\n * This function saves the settings and headers within the Framework without saving any of the other save-data\n * This allows saving in between the autosave intervals\n */\nexport default function saveFramework() {\n Object.keys(Game.mods.cookieMonsterFramework.saveData).forEach((modName) => {\n const modSaveString = JSON.stringify(Game.mods.cookieMonsterFramework.saveData[modName]);\n\n const cookieClickerSaveString = b64_to_utf8(\n unescape(localStorage.getItem('CookieClickerGame')).split('!END!')[0],\n );\n const pattern = new RegExp(`${modName}.*(;|$)`);\n const modSave = cookieClickerSaveString.match(pattern);\n if (modSave !== null) {\n const newSaveString = cookieClickerSaveString.replace(\n modSave[0],\n `${modName}:${modSaveString}`,\n );\n localStorage.setItem('CookieClickerGame', escape(`${utf8_to_b64(newSaveString)}!END!`));\n }\n });\n}\n","import saveFramework from '../../savingAndLoading/saveFramework';\n\n/**\n * This function toggles header options by incrementing them with 1 and handling changes\n * It is called by the onclick event of the +/- next to headers\n * @param \t{string}\tconfig\tThe name of the header\n */\nexport default function toggleHeader(modName, headerName) {\n if (\n typeof Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName] === 'undefined'\n ) {\n Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName] = 1;\n }\n switch (Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName]) {\n case 0:\n Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName] = 1;\n break;\n default:\n Game.mods.cookieMonsterFramework.saveData[modName].headers[headerName] = 0;\n break;\n }\n saveFramework();\n}\n","/**\n * This function plays a sound depending on config\n * @param\t{string}\tmodName\t The name of the mod\n * @param\t{variable}\turl\t\t\tA variable that gives the url for the sound (e.g., CM.Options.GCSoundURL)\n * @param\t{string}\tsndConfig\tThe setting in CM.Options that is checked before creating the sound\n * @param\t{string}\tvolConfig\tThe setting in CM.Options that is checked to determine volume\n * @param\t{bool} forced\t\tWhether the sound should play regardless of settings, used to test the sound\n */\nexport default function playCMSound(modName, url, sndConfig, volConfig, forced) {\n if (\n (Game.mods.cookieMonsterFramework.saveData[modName].settings[sndConfig] === 1 || forced) &&\n window.cookieMonsterFrameworkData.isInitializing === false\n ) {\n // eslint-disable-next-line new-cap\n const sound = new Audio(url);\n if (Game.mods.cookieMonsterFramework.saveData[modName].settings.GeneralSound)\n sound.volume =\n (Game.mods.cookieMonsterFramework.saveData[modName].settings[volConfig] / 100) *\n (Game.volume / 100);\n else\n sound.volume = Game.mods.cookieMonsterFramework.saveData[modName].settings[volConfig] / 100;\n sound.play();\n }\n}\n","import saveFramework from '../savingAndLoading/saveFramework';\n\n/**\n * This function sets the value of the specified volume-option and updates the display in the options menu\n * It is called by the oninput and onchange event of \"vol\" type options\n * @param \t{string}\tmodName\t The name of the option\n * @param \t{string} configName The name of the option\n */\nexport default function toggleConfigVolume(modName, configName) {\n if (l(`slider${modName}${configName}`) !== null) {\n l(`slider${modName}${configName}right`).innerHTML = `${\n l(`slider${modName}${configName}`).value\n }%`;\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = Math.round(\n l(`slider${modName}${configName}`).value,\n );\n }\n saveFramework();\n}\n","import addInfoMenuSection from './info/addInfoMenuSection';\n// import addOptionsMenuSection from './options/addOptionsMenuSection';\n\n/**\n * Call the function to add a Menu based on the current menu\n * @param {MutationObserver} The observer object that is listening to DOM-changes of id='menu'\n */\nexport default function addMenu(_, observer) {\n // Disconnect observer to avoid infinite loop\n observer.disconnect();\n\n if (Game.onMenu === 'log') {\n addInfoMenuSection();\n } else if (Game.onMenu === 'prefs') {\n // Commented out because this is broken\n // addOptionsMenuSection();\n }\n\n // Reconnect observer to monitor changes\n observer.observe(document.getElementById('menu'), {\n attributes: true,\n childList: true,\n subtree: true,\n });\n}\n","import createFrameworkInfoMenuSection from './createFrameworkInfoMenuSection';\n/**\n * Add things to the Info menu\n * The listeners.infoMenu objects contains functions which create <div>'s to add to the menu section\n */\nexport default function addInfoMenuSection() {\n const menu = l('menu').children[1];\n menu.insertBefore(createFrameworkInfoMenuSection(), menu.children[1]);\n\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu) {\n const listeners = Game.mods.cookieMonsterFramework.listeners.infoMenu;\n for (let i = 0; i < listeners.length; i++) {\n l('cookieMonsterFrameworkMenuSection').appendChild(listeners[i]());\n }\n }\n}\n","import modDescription from '../../data/modInfo';\nimport toggleHeader from '../../../menu/toggles/toggleHeader';\n/**\n * Add things to the Info menu\n * @returns {object} frameworkInfoDiv Subsection to which other mods can add their info sections\n */\nexport default function createFrameworkInfoMenuSection() {\n const frameworkInfoDiv = document.createElement('div');\n frameworkInfoDiv.className = 'subsection';\n frameworkInfoDiv.id = 'cookieMonsterFrameworkMenuSection';\n\n const titleDiv = document.createElement('div');\n titleDiv.className = 'title';\n titleDiv.innerHTML = 'Cookie Monster Mod Family';\n\n const buttonSpan = document.createElement('span');\n buttonSpan.style.cursor = 'pointer';\n buttonSpan.style.display = 'inline-block';\n buttonSpan.style.height = '14px';\n buttonSpan.style.width = '14px';\n buttonSpan.style.borderRadius = '7px';\n buttonSpan.style.textAlign = 'center';\n buttonSpan.style.backgroundColor = '#C0C0C0';\n buttonSpan.style.color = 'black';\n buttonSpan.style.fontSize = '13px';\n buttonSpan.style.verticalAlign = 'middle';\n buttonSpan.textContent = Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers\n .infoMenu\n ? '-'\n : '+';\n buttonSpan.onclick = function () {\n toggleHeader('cookieMonsterFramework', 'infoMenu');\n Game.UpdateMenu();\n };\n titleDiv.appendChild(buttonSpan);\n\n frameworkInfoDiv.appendChild(titleDiv);\n\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework.headers.infoMenu) {\n const descriptionDiv = document.createElement('div');\n descriptionDiv.className = 'listing';\n descriptionDiv.innerHTML = modDescription;\n frameworkInfoDiv.appendChild(descriptionDiv);\n }\n\n return frameworkInfoDiv;\n}\n","/**\n * Short description of the mod\n */\nconst modDescription = `<a href=\"https://github.com/CookieMonsterTeam\" target=\"blank\">Cookie Monster Team</a>\noffers a suite of tools to enhance your game experience.</br>\nOriginally known from our work on the Cookie Monster add-on we are now expanding and working on new tools within the Cookie Monster Mod Family.</br>\nKeep an eye on our GitHub to see future work or use it to report bugs or feature requests!</br>\n`;\n\nexport default modDescription;\n","/**\n * Main draw loop\n */\nexport default function drawLoop() {}\n","/** This includes all headers of the Cookie Monster Framework and their relevant data */\nconst headers = { infoMenu: 1, optionsMenu: 1 };\nexport default headers;\n","import createSaveDataObject from './createSaveDataObject';\nimport saveFramework from './saveFramework';\n\n/**\n * Load the data from a save-file into a mod\n * @param {string} modName The name of the mode to be saved\n * @param {string} saveData JSON-string of the save data\n * @param {object} settingsData The data containing default values of settings\n * @param {object} headersData The data containing default values of headers\n * @param {Function} logicLoop The logic-loop of the mod\n */\nexport default function loadMod(modName, saveData, settingsData, headersData, logicLoop) {\n const saveDataObject = JSON.parse(saveData);\n Game.mods.cookieMonsterFramework.saveData[modName] = createSaveDataObject(\n saveDataObject,\n settingsData,\n headersData,\n );\n saveFramework();\n logicLoop();\n Object.keys(Game.mods.cookieMonsterFramework.saveData[modName].settings).forEach((i) => {\n if (typeof settingsData[i].func !== 'undefined') {\n settingsData[i].func();\n }\n });\n Game.UpdateMenu();\n}\n","/**\n * Creates the save data object to be stored\n * @param {object} saveData The loaded save data\n * @param {object} settingsData The data containing default values of settings\n * @param {object} headersData The data containing default values of headers\n */\nexport default function createSaveDataObject(saveData, settingsData, headersData) {\n const modSaveData = {};\n\n // When a setting is missing (because it is new or modified) these lines add the default value\n const settingsObject = {};\n Object.keys(settingsData).forEach((i) => {\n if (typeof saveData.settings === 'undefined' || typeof saveData.settings[i] === 'undefined') {\n settingsObject[i] = settingsData[i].defaultValue; // eslint-disable-line prefer-destructuring\n } else {\n settingsObject[i] = saveData.settings[i];\n }\n });\n modSaveData.settings = settingsObject;\n\n // When a header is missing (because it is new or modified) these lines add the default value\n const headersObject = {};\n Object.keys(headersData).forEach((i) => {\n if (typeof saveData.headers === 'undefined' || typeof saveData.headers[i] === 'undefined') {\n headersObject[i] = headersData[i];\n } else {\n headersObject[i] = saveData.headers[i];\n }\n });\n modSaveData.headers = headersObject;\n\n Object.keys(saveData).forEach((key) => {\n if (key !== 'settings' && key !== 'headers') {\n modSaveData[key] = saveData[key];\n }\n });\n\n if (typeof modSaveData.favouriteSettings === 'undefined') {\n modSaveData.favouriteSettings = [];\n }\n return modSaveData;\n}\n","/**\n * Main logic loop\n */\nexport default function logicLoop() {}\n","/** This includes all options of the Cookie Monster Framework and their relevant data */\nconst settings = {};\nexport default settings;\n","import headers from './data/headers';\nimport loadMod from '../savingAndLoading/loadMod';\nimport logicLoop from './logic/logicLoop';\nimport settings from './data/settings';\n\n/**\n * This creates a load function to the CM object. Per Game code/comments:\n * \"do stuff with the string data you saved previously\"\n * @param {string} JSON string of save-data\n */\nexport default function load(str) {\n loadMod('cookieMonsterFramework', str, settings, headers, logicLoop);\n}\n","import init from './init';\nimport load from './load';\nimport save from './save';\n\n/** The mod object to be registered with the Modding API */\nconst cookieMonsterFramework = {\n init,\n load,\n save,\n listeners: {\n infoMenu: [],\n optionsMenu: [],\n },\n saveData: { cookieMonsterFramework: { headers: {}, settings: {} } },\n};\n\nexport default cookieMonsterFramework;\n","import addMenu from './menuSections/addMenu';\nimport createFlashScreen from './init/createFlashScreen';\nimport drawLoop from './draw/drawLoop';\nimport load from './load';\n\n/**\n * This creates a init function for the CM object. Per Game code/comments:\n * \"this function is called as soon as the mod is registered\n * declare hooks here\"\n * It starts the further initialization of CookieMonster and registers hooks\n */\nexport default function init() {\n // Create Data object in global scope\n window.cookieMonsterFrameworkData = { isInitializing: true };\n\n // Create MutationObserver for menu sections\n const observer = new MutationObserver(addMenu);\n observer.observe(document.getElementById('menu'), {\n attributes: true,\n childList: true,\n subtree: true,\n });\n\n // Draw initiaization\n createFlashScreen();\n\n // Register hooks\n Game.registerHook('draw', drawLoop);\n\n // Load defaults if there is no previous save\n if (typeof Game.modSaveData.cookieMonsterFramework === 'undefined') {\n load('{}');\n }\n window.cookieMonsterFrameworkData.isInitializing = false;\n}\n","/**\n * This function creates a white square over the full screen and appends it to l('wrapper')\n */\nexport default function createFlashScreen() {\n const WhiteScreen = document.createElement('div');\n WhiteScreen.id = 'CMFlashScreen';\n WhiteScreen.style.width = '100%';\n WhiteScreen.style.height = '100%';\n WhiteScreen.style.backgroundColor = 'white';\n WhiteScreen.style.display = 'none';\n WhiteScreen.style.zIndex = '9999999999';\n WhiteScreen.style.position = 'absolute';\n WhiteScreen.style.pointerEvents = \"none\";\n l('wrapper').appendChild(WhiteScreen);\n}\n","/**\n * This creates a save function to the CM object. Per Game code/comments:\n * \"use this to store persistent data associated with your mod\n * return 'a string to be saved';\"\n * @returns {string} The data to be saved\n */\nexport default function save() {\n return JSON.stringify(Game.mods.cookieMonsterFramework.saveData.cookieMonsterFramework);\n}\n","import SettingColours from './options/settingClasses/settingColours';\nimport SettingInputNumber from './options/settingClasses/settingInputNumber';\nimport SettingKeycode from './options/settingClasses/settingKeycode';\nimport SettingStandard from './options/settingClasses/settingStandard';\nimport SettingStandardWithFunc from './options/settingClasses/settingStandardWithFunc';\nimport SettingVolume from './options/settingClasses/settingVolume';\nimport cookieMonsterPrompt from './notifications/prompt';\nimport createFlash from './notifications/flash';\nimport createInfoListing from './menu/listings/createInfoListing';\nimport createModMenuSection from './menu/createModMenuSection';\nimport createNotification from './notifications/notification';\nimport createOptionsListing from './menu/listings/createOptionListing';\nimport createOptionsSubHeader from './menu/listings/createOptionsSubHeader';\nimport initModFramework from './init/initModFramework';\nimport loadMod from './savingAndLoading/loadMod';\nimport playCMSound from './notifications/sound';\nimport registerMod from './init/registerMod';\nimport saveFramework from './savingAndLoading/saveFramework';\n\nexport const initFunctions = {\n initModFramework,\n registerMod,\n};\nexport const menuFunctions = {\n listings: {\n createInfoListing,\n createOptionsListing,\n createOptionsSubHeader,\n },\n createModMenuSection,\n};\n\nexport const notificationsFunctions = {\n createFlash,\n createNotification,\n cookieMonsterPrompt,\n playCMSound,\n};\n\nexport const optionFunctions = {};\n\nexport const saveAndLoadingFunctions = {\n loadMod,\n saveFramework,\n};\n\nexport const settingClasses = {\n SettingColours,\n SettingInputNumber,\n SettingStandard,\n SettingStandardWithFunc,\n SettingKeycode,\n SettingVolume,\n};\n","import cookieMonsterFramework from '../frameworkDataObject/cookieMonsterFramework';\n\n/** Check if Cookie Monster Mod Framework has been loaded yet and if not, does so */\nexport default function initModFramework() {\n if (typeof cookieMonsterFrameworkData === 'undefined') {\n Game.registerMod('cookieMonsterFramework', cookieMonsterFramework);\n }\n}\n","/**\n * Adds the mod to the saveData object to store (favourite) settings and headers\n */\nexport default function registerMod(modName) {\n Game.mods.cookieMonsterFramework.saveData[modName] = {\n favouriteSettings: [],\n headers: {},\n settings: {},\n };\n}\n","/**\n * Returns a subsection for the mod to add listings/info to\n * @param {string} listingHTML The innerHTML of the listing\n * @returns {object} listingDiv Div of the subseciont\n */\nexport default function createInfoListing(listingHTML) {\n const listingDiv = document.createElement('div');\n listingDiv.className = 'listing';\n listingDiv.innerHTML = listingHTML;\n return listingDiv;\n}\n","import jscolor, * as JsColor from '@eastdesire/jscolor';\n\nimport cookieMonsterPrompt from '../../notifications/prompt';\nimport createFavouriteStar from './createOptionsFavouriteStar';\nimport createFlash from '../../notifications/flash';\nimport playCMSound from '../../notifications/sound';\nimport saveFramework from '../../savingAndLoading/saveFramework';\nimport toggleConfig from '../../options/toggleConfig';\nimport toggleConfigKeycode from '../../options/toggleConfigKeycode';\nimport toggleConfigVolume from '../../options/toggleConfigVolume';\n\n/**\n * This function creates an option listing div-object\n * @param \t{string}\t\tmodName\t The name of the option\n * @param \t{string}\t\tconfigName\t The name of the option\n * @param \t{object}\t\tsettingsData\t Object with data about the settings\n * @param \t{function}\tupdateColoursFunc\tFunction to be called to update colours\n * @param \t{function}\trefreshScaleFunc\tFunction to be called to refresh scale\n * @returns\t{object}\t\tdiv\t\t The option object\n */\nexport default function createOptionsListing(\n modName,\n configName,\n settingsData,\n updateColoursFunc,\n refreshScaleFunc,\n) {\n const div = document.createElement('div');\n div.className = 'listing';\n\n if (Game.mods.cookieMonsterFramework.saveData[modName].settings.FavouriteSettings === 1) {\n div.appendChild(\n createFavouriteStar(\n modName,\n configName,\n Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings,\n ),\n );\n }\n\n if (settingsData[configName].type === 'bool') {\n // Create toggle button\n const a = document.createElement('a');\n if (\n settingsData[configName].toggle &&\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] === 0\n ) {\n a.className = 'option off';\n } else {\n a.className = 'option';\n }\n a.id = `${modName}Options${configName}`;\n a.onclick = function () {\n toggleConfig(modName, configName, settingsData);\n Game.UpdateMenu();\n };\n a.textContent =\n settingsData[configName].label[\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName]\n ];\n div.appendChild(a);\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n div.appendChild(label);\n return div;\n }\n\n if (settingsData[configName].type === 'vol') {\n const volume = document.createElement('div');\n\n // Create slider\n volume.className = 'sliderBox';\n const title = document.createElement('div');\n title.style.float = 'left';\n title.innerHTML = settingsData[configName].desc;\n volume.appendChild(title);\n const percent = document.createElement('div');\n percent.id = `slider${modName}${configName}right`;\n percent.style.float = 'right';\n percent.innerHTML = `${Game.mods.cookieMonsterFramework.saveData[modName].settings[configName]}%`;\n volume.appendChild(percent);\n const slider = document.createElement('input');\n slider.className = 'slider';\n slider.id = `slider${modName}${configName}`;\n slider.style.clear = 'both';\n slider.type = 'range';\n slider.min = '0';\n slider.max = '100';\n slider.step = '1';\n slider.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n slider.oninput = function () {\n toggleConfigVolume(modName, configName);\n Game.UpdateMenu();\n };\n slider.onchange = function () {\n toggleConfigVolume(modName, configName);\n Game.UpdateMenu();\n };\n volume.appendChild(slider);\n div.appendChild(volume);\n\n // Create test sound button\n const a = document.createElement('a');\n a.className = 'option';\n a.onclick = function () {\n playCMSound(\n modName,\n Game.mods.cookieMonsterFramework.saveData[modName].settings[\n configName.replace('Volume', 'SoundURL')\n ],\n configName.replace('Volume', 'Sound'),\n configName,\n true,\n );\n };\n a.textContent = 'Test sound';\n div.appendChild(a);\n return div;\n }\n\n if (settingsData[configName].type === 'url') {\n // Create label\n const span = document.createElement('span');\n span.className = 'option';\n span.textContent = `${settingsData[configName].label} `;\n span.style.lineHeight = '1.6';\n div.appendChild(span);\n\n // Create input\n const input = document.createElement('input');\n input.id = `${modName}Options${configName}`;\n input.className = 'option';\n input.type = 'text';\n input.readOnly = true;\n input.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n input.style.width = '300px';\n div.appendChild(input);\n div.appendChild(document.createTextNode(' '));\n\n // Create prompt\n const inputPrompt = document.createElement('input');\n inputPrompt.id = `${modName}Options${configName}Prompt`;\n inputPrompt.className = 'option';\n inputPrompt.type = 'text';\n inputPrompt.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n\n const a = document.createElement('a');\n a.className = 'option';\n a.onclick = function () {\n cookieMonsterPrompt(inputPrompt.outerHTML, [\n [\n 'Save',\n function () {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = l(\n `${modName}Options${configName}Prompt`,\n ).value;\n saveFramework();\n Game.ClosePrompt();\n Game.UpdateMenu();\n },\n ],\n [\n 'Cancel',\n function () {\n Game.ClosePrompt();\n },\n ],\n ]);\n };\n a.textContent = 'Edit';\n div.appendChild(a);\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n div.appendChild(label);\n return div;\n }\n\n if (settingsData[configName].type === 'colour') {\n const innerSpan = document.createElement('span');\n innerSpan.className = 'option';\n\n // Create input\n const input = document.createElement('input');\n input.id = configName;\n input.style.width = '65px';\n input.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n innerSpan.appendChild(input);\n const change = function () {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[this.targetElement.id] =\n this.toHEXString();\n updateColoursFunc();\n saveFramework();\n Game.UpdateMenu();\n };\n // eslint-disable-next-line no-new\n new JsColor(input, { hash: true, position: 'right', onInput: change });\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n innerSpan.appendChild(label);\n\n // Create test button for flash colour\n if (configName.includes('Flash')) {\n const a = document.createElement('a');\n a.className = 'option';\n a.onclick = function () {\n createFlash(modName, 3, configName.replace('Colour', ''), true);\n };\n a.textContent = 'Test flash';\n innerSpan.appendChild(a);\n }\n div.appendChild(innerSpan);\n jscolor.init();\n return div;\n }\n\n if (settingsData[configName].type === 'numscale') {\n const span = document.createElement('span');\n span.className = 'option';\n span.textContent = `${settingsData[configName].label} `;\n span.style.lineHeight = '1.6';\n div.appendChild(span);\n\n // Create input\n const input = document.createElement('input');\n input.id = `${modName}Options${configName}`;\n input.className = 'option';\n input.type = 'number';\n input.value = Game.mods.cookieMonsterFramework.saveData[modName].settings[configName];\n input.min = settingsData[configName].min;\n input.max = settingsData[configName].max;\n input.oninput = function () {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = this.value;\n saveFramework();\n refreshScaleFunc();\n Game.UpdateMenu();\n };\n div.appendChild(input);\n div.appendChild(document.createTextNode(' '));\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n div.appendChild(label);\n return div;\n }\n\n if (settingsData[configName].type === 'keycode') {\n // Create prompt\n const inputPrompt = document.createElement('input');\n inputPrompt.id = `${modName}Options${configName}Prompt`;\n inputPrompt.className = 'option';\n inputPrompt.type = 'text';\n inputPrompt.value =\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName].displayName;\n\n // Create toggle button\n const a = document.createElement('a');\n a.className = 'option';\n a.id = `${modName}Options${configName}`;\n a.onclick = function () {\n cookieMonsterPrompt(inputPrompt.outerHTML, []);\n l(`${modName}Options${configName}Prompt`).addEventListener('keyup', (e) => {\n toggleConfigKeycode(modName, configName, e);\n Game.ClosePrompt();\n Game.UpdateMenu();\n });\n };\n a.textContent =\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName].displayName;\n div.appendChild(a);\n\n // Create description label\n const label = document.createElement('label');\n label.textContent = settingsData[configName].desc;\n label.style.lineHeight = '1.6';\n div.appendChild(label);\n return div;\n }\n return div;\n}\n","import saveFramework from '../../savingAndLoading/saveFramework';\nimport toggleFavouriteSetting from '../toggles/toggleFavourite';\n/**\n * This function creates the favourite setting star div-object\n * @param \t{string} modName\t The name of the Mod\n * @param \t{string} configName\tThe name of the option\n * @parm {array} favourites An array with the names of all settings that are currently favourited\n * @returns\t{object} div\t\t The option object\n */\nexport default function createFavouriteStar(modName, configName, favourites) {\n const FavStar = document.createElement('a');\n if (favourites.includes(configName)) {\n FavStar.innerText = '★';\n FavStar.style.color = 'yellow';\n } else FavStar.innerText = '☆';\n FavStar.className = 'option';\n FavStar.onclick = function () {\n toggleFavouriteSetting(modName, configName);\n saveFramework();\n Game.UpdateMenu();\n };\n FavStar.onmouseover = function () {\n Game.tooltip.draw(\n this,\n escape(\n '<div style=\"min-width: 250px; margin-bottom: 4px;\"><div style=\"text-align: left;\">Click to set this setting as favourite and show it in \\'favourite\\' settings at the top of the Cookie Monster Settings</div></div>',\n ),\n );\n };\n FavStar.onmouseout = function () {\n Game.tooltip.hide();\n };\n FavStar.appendChild(document.createTextNode(' '));\n return FavStar;\n}\n","import saveFramework from '../../savingAndLoading/saveFramework';\n\n/**\n * This function toggles favourite settings by adding them to an array in the savedata\n * It is called by the onclick event of the favourite stars\n * @param \t{string} modName\t The name of the mod\n * @param \t{string}\tconfigName\tThe name of the setting\n */\nexport default function toggleFavouriteSetting(modName, configName) {\n if (Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings.includes(configName))\n Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings =\n Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings.filter(\n (ele) => ele !== configName,\n );\n else Game.mods.cookieMonsterFramework.saveData[modName].favouriteSettings.push(configName);\n saveFramework();\n}\n","import saveFramework from '../savingAndLoading/saveFramework';\n\n/**\n * This function toggles options by incrementing them with 1 and handling changes\n * It is called by the onclick event of options of the \"bool\" type\n * @param \t{string}\tmodName\t The name of the option\n * @param \t{string}\tconfigName\t The name of the option\n * @param \t{object}\tsettingsData\tObject with data about the settings\n */\nexport default function toggleConfig(modName, configName, settingsData) {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] += 1;\n if (\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] ===\n settingsData[configName].label.length\n ) {\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = 0;\n if (settingsData[configName].toggle)\n l(`${modName}Options${configName}`).className = 'option off';\n } else l(`${modName}Options${configName}`).className = 'option';\n\n if (typeof settingsData[configName].func !== 'undefined') {\n settingsData[configName].func();\n }\n\n saveFramework();\n}\n","import saveFramework from '../savingAndLoading/saveFramework';\n\n/**\n * This function toggles options by deconstructing the KeyboardEvent\n * It is called by the onclick event of prompts of the \"keycode\" type\n * @param \t{string}\tmodName\t The name of the option\n * @param \t{string}\tconfigName\t The name of the option\n * @param {object} event The KeyboardEvent\n */\nexport default function toggleConfigKeycode(modName, configName, event) {\n const saveObject = {\n key: event.key,\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n shiftKey: event.shiftKey,\n displayName: `${event.shiftKey ? `Shift + ` : ''}${event.altKey ? `Alt + ` : ''}${\n event.ctrlKey ? `Ctrl + ` : ''\n }${event.key}`,\n };\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] = saveObject;\n saveFramework();\n}\n","import toggleHeader from '../toggles/toggleHeader';\n\n/**\n * This function creates a header-object for the options page\n * @param \t{string}\t\tmodName\t The name of the mod\n * @param \t{string}\t\tconfigName\tThe name of the Config-group\n * @param \t{string}\t\ttext\t The to-be displayed name of the header\n * @returns\t{object}\t\tdiv\t\t The header object\n */\nexport default function createOptionsSubHeader(modName, configName, text) {\n const div = document.createElement('div');\n div.className = 'title';\n\n div.style.opacity = '0.7';\n div.style.fontSize = '17px';\n div.appendChild(document.createTextNode(`${text} `));\n\n // Creates the +/- button\n const span = document.createElement('span');\n span.style.cursor = 'pointer';\n span.style.display = 'inline-block';\n span.style.height = '14px';\n span.style.width = '14px';\n span.style.borderRadius = '7px';\n span.style.textAlign = 'center';\n span.style.backgroundColor = '#C0C0C0';\n span.style.color = 'black';\n span.style.fontSize = '13px';\n span.style.verticalAlign = 'middle';\n span.textContent = Game.mods.cookieMonsterFramework.saveData[modName].headers[configName]\n ? '-'\n : '+';\n span.onclick = function () {\n toggleHeader(modName, configName);\n Game.UpdateMenu();\n };\n div.appendChild(span);\n return div;\n}\n","import toggleHeader from './toggles/toggleHeader';\n\n/**\n * Returns a subsection for the mod to add listings/info to\n * @param {string} modName The name of the mod (i.e., CookieMonster)\n * @param {string} modDisplayName Display name of the mod (i.e., Cookie Monster)\n * @param {string} menuName Name of the menu (i.e., Info, Options)\n * @returns {object} modSectionDiv Div of the subseciont\n */\nexport default function createModMenuSection(modName, modDisplayName, menuName) {\n const modSectionDiv = document.createElement('div');\n modSectionDiv.className = 'subsection';\n modSectionDiv.id = `${modName}MenuSection`;\n\n const titleDiv = document.createElement('div');\n titleDiv.className = 'title';\n titleDiv.style.fontSize = '18px';\n titleDiv.innerHTML = modDisplayName;\n\n const buttonSpan = document.createElement('span'); // Creates the +/- button\n buttonSpan.style.cursor = 'pointer';\n buttonSpan.style.display = 'inline-block';\n buttonSpan.style.height = '14px';\n buttonSpan.style.width = '14px';\n buttonSpan.style.borderRadius = '7px';\n buttonSpan.style.textAlign = 'center';\n buttonSpan.style.backgroundColor = '#C0C0C0';\n buttonSpan.style.color = 'black';\n buttonSpan.style.fontSize = '13px';\n buttonSpan.style.verticalAlign = 'middle';\n buttonSpan.textContent = Game.mods.cookieMonsterFramework.saveData[modName].headers[menuName]\n ? '-'\n : '+';\n buttonSpan.onclick = function () {\n toggleHeader(modName, menuName);\n Game.UpdateMenu();\n };\n\n titleDiv.appendChild(buttonSpan);\n\n modSectionDiv.appendChild(titleDiv);\n\n return modSectionDiv;\n}\n","/**\n * This function creates a notifcation depending on config\n * @param\t{string}\tmodName\t The name of the mod\n * @param\t{string}\tconfigName\tThe setting in CM.Options that is checked before creating the notification\n * @param\t{string}\ttitle\t\t\t The title of the to-be created notifications\n * @param\t{string}\tmessage\t\t\tThe text of the to-be created notifications\n */\nexport default function createNotification(modName, configName, title, message) {\n if (\n Game.mods.cookieMonsterFramework.saveData[modName].settings[configName] === 1 &&\n document.visibilityState === 'hidden' &&\n window.cookieMonsterFrameworkData.isInitializing === false\n ) {\n // eslint-disable-next-line no-new\n new Notification(title, {\n body: message,\n badge: 'https://orteil.dashnet.org/cookieclicker/favicon.ico',\n });\n }\n}\n","import Setting from './baseSetting';\n\n/** The colour picker setting class */\nexport default class SettingColours extends Setting {\n constructor(defaultValue, type, group, desc) {\n super(defaultValue, type, group);\n this.desc = desc;\n }\n}\n","import Setting from './baseSetting';\n\n/** The number input setting class */\nexport default class SettingInputNumber extends Setting {\n constructor(defaultValue, type, group, label, desc, min, max) {\n super(defaultValue, type, group);\n this.label = label;\n this.desc = desc;\n this.min = min;\n this.max = max;\n }\n}\n","import Setting from './baseSetting';\n\n/** The standard toggle setting class */\nexport default class SettingStandard extends Setting {\n constructor(defaultValue, type, group, label, desc, toggle) {\n super(defaultValue, type, group);\n this.label = label;\n this.desc = desc;\n this.toggle = toggle;\n }\n}\n","import Setting from './baseSetting';\n\n/** The standard toggle setting class with functions */\nexport default class SettingStandardWithFunc extends Setting {\n constructor(defaultValue, type, group, label, desc, toggle, func) {\n super(defaultValue, type, group);\n this.label = label;\n this.desc = desc;\n this.toggle = toggle;\n if (func !== undefined) {\n this.func = func;\n }\n }\n}\n","import Setting from './baseSetting';\n\n/** The volume level setting class */\nexport default class SettingVolume extends Setting {\n constructor(defaultValue, type, group, label, desc) {\n super(defaultValue, type, group);\n this.label = label;\n this.desc = desc;\n for (let i = 0; i < 101; i++) {\n this.label[i] = `${i}%`;\n }\n }\n}\n","/**\r\n * This function updates the display setting of the two objects created by CM.Disp.CreateWrinklerButtons()\r\n * It is called by changes in CM.Options.WrinklerButtons\r\n */\r\nexport default function ToggleWrinklerButtons() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerButtons &&\r\n Game.elderWrath\r\n ) {\r\n l('PopAllNormalWrinklerButton').style.display = '';\r\n l('PopFattestWrinklerButton').style.display = '';\r\n } else {\r\n l('PopAllNormalWrinklerButton').style.display = 'none';\r\n l('PopFattestWrinklerButton').style.display = 'none';\r\n }\r\n}\r\n","/* eslint-disable prefer-const */\r\n\r\nexport let CacheDragonAura = 0;\r\nexport let CacheDragonAura2 = 0;\r\nexport let CacheLastDragonLevel = 0;\r\nexport let CacheCostDragonUpgrade = 0;\r\nexport let CacheLucky = 0;\r\nexport let CacheLuckyReward = 0;\r\nexport let CacheLuckyWrathReward = 0;\r\nexport let CacheLuckyFrenzy = 0;\r\nexport let CacheLuckyRewardFrenzy = 0;\r\nexport let CacheLuckyWrathRewardFrenzy = 0;\r\nexport let CacheConjure = 0;\r\nexport let CacheConjureReward = 0;\r\nexport let CacheEdifice = 0;\r\nexport let CacheEdificeBuilding = 0;\r\nexport let CacheNoGoldSwitchCookiesPS = 0;\r\nexport let CacheDragonsFortuneMultAdjustment = 1;\r\nexport let CacheGoldenCookiesMult = 1;\r\nexport let CacheWrathCookiesMult = 1;\r\n\r\nexport let CacheHCPerSecond = 0;\r\n\r\nexport let CacheCentEgg = 0;\r\nexport let CacheSeaSpec = 0;\r\nexport let CacheLastChoEgg = 0;\r\n\r\nexport let CacheObjects1 = {};\r\nexport let CacheObjects10 = {};\r\nexport let CacheObjects100 = {};\r\nexport let CacheObjectsNextAchievement = {};\r\n\r\nexport let CacheWrinklersTotal = 0;\r\nexport let CacheWrinklersNormal = 0;\r\nexport let CacheWrinklersFattest = [0, null];\r\n\r\nexport let CacheCurrWrinklerCPSMult = 0;\r\nexport let CacheCurrWrinklerCount = 0;\r\n\r\nexport let CacheUpgrades = {};\r\n\r\nexport let CacheAverageClicks = {};\r\nexport let CacheAverageCookiesFromClicks;\r\n\r\nexport let CacheMissingUpgrades = {};\r\nexport let CacheMissingUpgradesPrestige = {};\r\nexport let CacheMissingUpgradesCookies = {};\r\n\r\nexport let CacheChainRequired = 0;\r\nexport let CacheChainRequiredNext = 0;\r\nexport let CacheChainMaxReward = [];\r\nexport let CacheChainWrathRequired = 0;\r\nexport let CacheChainWrathRequiredNext = 0;\r\nexport let CacheChainWrathMaxReward = [];\r\nexport let CacheChainFrenzyRequired = 0;\r\nexport let CacheChainFrenzyRequiredNext = 0;\r\nexport let CacheChainFrenzyMaxReward = [];\r\nexport let CacheChainFrenzyWrathRequired = 0;\r\nexport let CacheChainFrenzyWrathRequiredNext = 0;\r\nexport let CacheChainFrenzyWrathMaxReward = [];\r\n\r\nexport let CacheRealCookiesEarned = 0;\r\nexport let CacheAvgCPSWithChoEgg = 0;\r\n\r\nexport let CacheSpawnedGoldenShimmer = {};\r\nexport let CacheSeasonPopShimmer = {};\r\n\r\nexport let CacheTimeTillNextPrestige = 0;\r\n\r\n/** Stores lowest PP value */\r\nexport let CacheMinPP = 0;\r\n/** Stores lowest PP value category */\r\nexport let CacheMinPPBulk = 0;\r\n/** Stores all PP values of all buildings for all buy settings (1, 10, 100) */\r\nexport let CachePPArray = [];\r\n\r\nexport let CacheGoldenShimmersByID = {};\r\n\r\nexport let CacheSellForChoEgg = 0;\r\n\r\nexport let CookiesDiff;\r\nexport let WrinkDiff;\r\nexport let WrinkFattestDiff;\r\nexport let ChoEggDiff;\r\nexport let ClicksDiff;\r\nexport let HeavenlyChipsDiff;\r\n\r\nexport let CacheLastCPSCheck;\r\nexport let CacheLastCookies;\r\nexport let CacheLastWrinkCookies;\r\nexport let CacheLastWrinkFattestCookies;\r\nexport let CacheLastClicks;\r\n\r\nexport let CacheAverageGainBank;\r\nexport let CacheAverageGainWrink;\r\nexport let CacheAverageGainWrinkFattest;\r\nexport let CacheAverageGainChoEgg;\r\nexport let CacheAverageCPS;\r\n\r\nexport let CacheLastHeavenlyCheck;\r\nexport let CacheLastHeavenlyChips;\r\n\r\nexport let CacheDoRemakeBuildPrices;\r\n\r\nexport let CacheHadBuildAura;\r\n\r\n/** Store the CPS effect of each god if it was put into each slot */\r\nexport let CacheGods = {\r\n 0: [0, 0, 0],\r\n 1: [0, 0, 0],\r\n 2: [0, 0, 0],\r\n 3: [0, 0, 0],\r\n 4: [0, 0, 0],\r\n 5: [0, 0, 0],\r\n 6: [0, 0, 0],\r\n 7: [0, 0, 0],\r\n 8: [0, 0, 0],\r\n 9: [0, 0, 0],\r\n 10: [0, 0, 0],\r\n};\r\n","/** All variables used by simulation functions */\r\n\r\nexport let SimObjects = []; // eslint-disable-line prefer-const\r\nexport let SimUpgrades = []; // eslint-disable-line prefer-const\r\nexport let SimAchievements = []; // eslint-disable-line prefer-const\r\nexport let SimBuildingsOwned;\r\nexport let SimUpgradesOwned;\r\nexport let SimPledges;\r\nexport let SimAchievementsOwned;\r\nexport let SimHeavenlyPower;\r\nexport let SimPrestige;\r\nexport let SimDragonAura;\r\nexport let SimDragonAura2;\r\nexport let SimGod1;\r\nexport let SimGod2;\r\nexport let SimGod3;\r\nexport let SimDoSims;\r\nexport let SimEffs;\r\nexport let SimCookiesPs;\r\nexport let SimCookiesPsRaw;\r\n","import { SimDragonAura, SimDragonAura2 } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.auraMult but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimAuraMult(what) {\r\n let n = 0;\r\n if (\r\n Game.dragonAuras[SimDragonAura].name === what ||\r\n Game.dragonAuras[SimDragonAura2].name === what\r\n )\r\n n = 1;\r\n if (\r\n Game.dragonAuras[SimDragonAura].name === 'Reality Bending' ||\r\n (Game.dragonAuras[SimDragonAura2].name === 'Reality Bending' &&\r\n Game.dragonLevel >= Game.dragonAurasBN[what].id + 4)\r\n )\r\n n += 0.1;\r\n return n;\r\n}\r\n","import SimAuraMult from './SimAuraMult';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.getSellMultiplier but checks Sim Data instead of Game Data\r\n * @returns {number}\tgiveBack\tThe multiplier\r\n */\r\nexport default function SimGetSellMultiplier() {\r\n let giveBack = 0.25;\r\n giveBack *= 1 + SimAuraMult('Earth Shatterer');\r\n return giveBack;\r\n}\r\n","import { SimEffs } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.Eff but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimEff(name, def) {\r\n if (typeof SimEffs[name] === 'undefined') {\r\n return typeof def === 'undefined' ? 1 : def;\r\n }\r\n return SimEffs[name];\r\n}\r\n","import { SimUpgrades } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.Has but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimHas(what) {\r\n const it = SimUpgrades[what];\r\n if (it && Game.ascensionMode === 1 && (it.pool === 'prestige' || it.tier === 'fortune')) return 0;\r\n return it ? it.bought : 0;\r\n}\r\n","import { SimDragonAura, SimDragonAura2 } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.hasAura but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimHasAura(what) {\r\n if (\r\n Game.dragonAuras[SimDragonAura].name === what ||\r\n Game.dragonAuras[SimDragonAura2].name === what\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n","import { SimGod1, SimGod2, SimGod3, SimObjects } from '../VariablesAndData';\r\nimport SimHasAura from './SimHasAura';\r\n\r\n/**\r\n * This function checks for the current God level in the sim data\r\n * It functions similarly to Game.hasGod()\r\n * @param\t{string}\twhat\tName of the achievement\r\n */\r\nexport default function SimHasGod(what) {\r\n if (Game.hasGod) {\r\n if (SimObjects.Temple.minigame === undefined) {\r\n SimObjects.Temple.minigame = Game.Objects.Temple.minigame;\r\n }\r\n const god = SimObjects.Temple.minigame.gods[what];\r\n if (SimGod1 === god.id) {\r\n return 1;\r\n }\r\n if (SimGod2 === god.id) {\r\n if (SimHasAura('Supreme Intellect')) {\r\n return 1;\r\n }\r\n return 2;\r\n }\r\n if (SimGod3 === god.id) {\r\n if (SimHasAura('Supreme Intellect')) {\r\n return 2;\r\n }\r\n return 3;\r\n }\r\n }\r\n return false;\r\n}\r\n","import { SimObjects } from '../VariablesAndData';\r\nimport SimAuraMult from './SimAuraMult';\r\nimport SimEff from './SimEff';\r\nimport SimHas from './SimHas';\r\nimport SimHasGod from './SimHasGod';\r\n\r\n/**\r\n * This function calculates the sell price of a building based on current \"sim data\"\r\n * @param\t{string}\tbuilding\tName of the building\r\n * @param\t{number}\tprice\t\tCurrent price of building\r\n * @returns {number}\tModifiedPrice\t\tThe modified building price\r\n */\r\nexport default function SimModifyBuildingPrice(building, price) {\r\n let ModifiedPrice = price;\r\n if (SimHas('Season savings')) ModifiedPrice *= 0.99;\r\n if (SimHas(\"Santa's dominion\")) ModifiedPrice *= 0.99;\r\n if (SimHas('Faberge egg')) ModifiedPrice *= 0.99;\r\n if (SimHas('Divine discount')) ModifiedPrice *= 0.99;\r\n if (SimHas('Fortune #100')) ModifiedPrice *= 0.99;\r\n // if (SimHasAura('Fierce Hoarder')) ModifiedPrice *= 0.98;\r\n ModifiedPrice *= 1 - SimAuraMult('Fierce Hoarder') * 0.02;\r\n if (Game.hasBuff('Everything must go')) ModifiedPrice *= 0.95;\r\n if (Game.hasBuff('Crafty pixies')) ModifiedPrice *= 0.98;\r\n if (Game.hasBuff('Nasty goblins')) ModifiedPrice *= 1.02;\r\n if (building.fortune && SimHas(building.fortune.name)) ModifiedPrice *= 0.93;\r\n ModifiedPrice *= SimEff('buildingCost');\r\n if (SimObjects.Temple.minigameLoaded) {\r\n const godLvl = SimHasGod('creation');\r\n if (godLvl === 1) ModifiedPrice *= 0.93;\r\n else if (godLvl === 2) ModifiedPrice *= 0.95;\r\n else if (godLvl === 3) ModifiedPrice *= 0.98;\r\n }\r\n return ModifiedPrice;\r\n}\r\n","import SimGetSellMultiplier from '../ReplacedGameFunctions/SimGetSellMultiplier';\r\nimport SimModifyBuildingPrice from '../ReplacedGameFunctions/SimModifyBuidlingPrice';\r\n\r\n/**\r\n * This function calculates the cookies returned for selling a building\r\n * Base Game does not do this correctly\r\n * @param\t{string}\tbuild\t\tName of the building\r\n * @param\t{number}\tbasePrice\tBase Price of building\r\n * @param\t{number}\tstart\t\tStarting amount of building\r\n * @param\t{number}\tfree\t\tFree amount of building\r\n * @param\t{number}\tincrease\tIncrease of building\r\n * @param\t{number}\tnoSim\t\t1 of 0 depending on if function is called from CM.Sim\r\n * @returns {number}\tmoni\t\tTotal price gained\r\n */\r\nexport default function BuildingSell(build, basePrice, start, free, amount, noSim) {\r\n // Calculate money gains from selling buildings\r\n // If noSim is set, use Game methods to compute price instead of Sim ones.\r\n const noSimRes = typeof noSim === 'undefined' ? 0 : noSim;\r\n let toChange = amount;\r\n let startingAmount = start;\r\n let moni = 0;\r\n if (amount === -1) toChange = startingAmount;\r\n if (!amount) toChange = Game.buyBulk;\r\n for (let i = 0; i < toChange; i++) {\r\n let price = basePrice * Game.priceIncrease ** Math.max(0, startingAmount - free);\r\n price = noSimRes\r\n ? Game.modifyBuildingPrice(build, price)\r\n : SimModifyBuildingPrice(build, price);\r\n price = Math.ceil(price);\r\n const giveBack = noSimRes ? build.getSellMultiplier() : SimGetSellMultiplier();\r\n price = Math.floor(price * giveBack);\r\n if (startingAmount > 0) {\r\n moni += price;\r\n startingAmount -= 1;\r\n }\r\n }\r\n return moni;\r\n}\r\n","/** Data related directly to the scales used by Cookie Monster */\r\n\r\n/** Array of abbreviations used in the \"Metric\" scale */\r\nexport const metric = ['', '', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'];\r\n\r\n/** Array of abbreviations used in the \"Short\" scale */\r\nexport const shortScale = [\r\n '',\r\n '',\r\n 'M',\r\n 'B',\r\n 'Tr',\r\n 'Quadr',\r\n 'Quint',\r\n 'Sext',\r\n 'Sept',\r\n 'Oct',\r\n 'Non',\r\n 'Dec',\r\n 'Undec',\r\n 'Duodec',\r\n 'Tredec',\r\n 'Quattuordec',\r\n 'Quindec',\r\n 'Sexdec',\r\n 'Septendec',\r\n 'Octodec',\r\n 'Novemdec',\r\n 'Vigint',\r\n 'Unvigint',\r\n 'Duovigint',\r\n 'Trevigint',\r\n 'Quattuorvigint',\r\n];\r\n\r\n/** Array of abbreviations used in the \"Abbreviated Short\" scale */\r\nexport const shortScaleAbbreviated = [\r\n '',\r\n 'K',\r\n 'M',\r\n 'B',\r\n 'T',\r\n 'Qa',\r\n 'Qi',\r\n 'Sx',\r\n 'Sp',\r\n 'Oc',\r\n 'No',\r\n 'De',\r\n 'UDe',\r\n 'DDe',\r\n 'TDe',\r\n 'QaDe',\r\n 'QiDe',\r\n 'SxDe',\r\n 'SpDe',\r\n 'ODe',\r\n 'NDe',\r\n 'Vi',\r\n 'UVi',\r\n 'DVi',\r\n 'TVi',\r\n 'QaVi',\r\n 'QiVi',\r\n 'SxVi',\r\n 'SpVi',\r\n 'OVi',\r\n 'NVi',\r\n 'Tr',\r\n 'UTr',\r\n 'DTr',\r\n 'TTr',\r\n 'QaTr',\r\n 'QiTr',\r\n 'SxTr',\r\n 'SpTr',\r\n 'OTr',\r\n 'NTr',\r\n 'Qaa',\r\n 'UQa',\r\n 'DQa',\r\n 'TQa',\r\n 'QaQa',\r\n 'QiQa',\r\n 'SxQa',\r\n 'SpQa',\r\n 'OQa',\r\n 'NQa',\r\n 'Qia',\r\n 'UQi',\r\n 'DQi',\r\n 'TQi',\r\n 'QaQi',\r\n 'QiQi',\r\n 'SxQi',\r\n 'SpQi',\r\n 'OQi',\r\n 'NQi',\r\n 'Sxa',\r\n 'USx',\r\n 'DSx',\r\n 'TSx',\r\n 'QaSx',\r\n 'QiSx',\r\n 'SxSx',\r\n 'SpSx',\r\n 'OSx',\r\n 'NSx',\r\n 'Spa',\r\n 'USp',\r\n 'DSp',\r\n 'TSp',\r\n 'QaSp',\r\n 'QiSp',\r\n 'SxSp',\r\n 'SpSp',\r\n 'OSp',\r\n 'NSp',\r\n 'Oco',\r\n 'UOc',\r\n 'DOc',\r\n 'TOc',\r\n 'QaOc',\r\n 'QiOc',\r\n 'SxOc',\r\n 'SpOc',\r\n 'OOc',\r\n 'NOc',\r\n 'Noa',\r\n 'UNo',\r\n 'DNo',\r\n 'TNo',\r\n 'QaNo',\r\n 'QiNo',\r\n 'SxNo',\r\n 'SpNo',\r\n 'ONo',\r\n 'NNo',\r\n 'Ct',\r\n 'UCt',\r\n];\r\n","export let LastModCount;\r\nexport let TooltipBuildBackup = []; // eslint-disable-line prefer-const\r\nexport let TooltipLumpBackup;\r\nexport let TooltipGrimoireBackup = []; // eslint-disable-line prefer-const\r\nexport let TooltipUpgradeBackup = []; // eslint-disable-line prefer-const\r\nexport let BackupGrimoireLaunch;\r\nexport let BackupGrimoireLaunchMod;\r\nexport let BackupGrimoireDraw;\r\nexport let HasReplaceNativeGrimoireLaunch;\r\nexport let HasReplaceNativeGrimoireDraw;\r\nexport let LoadMinigames;\r\nexport let BackupFunctions = {}; // eslint-disable-line prefer-const\r\n\r\nexport let LastSeasonPopupState;\r\nexport let LastTickerFortuneState;\r\nexport let LastGardenNextStep;\r\nexport let LastGoldenCookieState;\r\nexport let LastSpawnedGoldenCookieState;\r\nexport let LastMagicBarFull;\r\nexport let CurrSpawnedGoldenCookieState;\r\nexport let LastWrinklerCount;\r\n\r\n/** Stores the date at Game.CalculateGains for God Cyclius\r\n */\r\nexport let CycliusDateAtBeginLoop = Date.now(); // eslint-disable-line prefer-const\r\n\r\n/** Stores the date at Game.CalculateGains for the Century egg\r\n */\r\nexport let CenturyDateAtBeginLoop = Date.now(); // eslint-disable-line prefer-const\r\n","/**\r\n * Section: Variables used in Disp functions */\r\n\r\nexport let DispCSS;\r\n\r\n/**\r\n * These are variables used to create DOM object names and id (e.g., 'CMTextTooltip)\r\n */\r\nexport const ColourTextPre = 'CMText';\r\nexport const ColourBackPre = 'CMBack';\r\nexport const ColourBorderPre = 'CMBorder';\r\n\r\n/**\r\n * These are variables which can be set in the options by the user to standardize colours throughout CookieMonster\r\n */\r\nexport const ColourBlue = 'Blue';\r\nexport const ColourGreen = 'Green';\r\nexport const ColourYellow = 'Yellow';\r\nexport const ColourOrange = 'Orange';\r\nexport const ColourRed = 'Red';\r\nexport const ColourPurple = 'Purple';\r\nexport const ColourGray = 'Gray';\r\nexport const ColourPink = 'Pink';\r\nexport const ColourBrown = 'Brown';\r\nexport const ColoursOrdering = [\r\n ColourBlue,\r\n ColourGreen,\r\n ColourYellow,\r\n ColourOrange,\r\n ColourRed,\r\n ColourPurple,\r\n ColourPink,\r\n ColourBrown,\r\n ColourGray,\r\n];\r\n\r\n/**\r\n * This list is used to make some very basic tooltips.\r\n * It is used by CM.Main.DelayInit() in the call of CM.Disp.CreateSimpleTooltip()\r\n * @item\t{string}\tplaceholder\r\n * @item\t{string}\ttext\r\n * @item\t{string}\tminWidth\r\n */\r\nexport const TooltipText = [\r\n ['GoldCookTooltipPlaceholder', 'Calculated with Golden Switch off', '200px'],\r\n [\r\n 'GoldCookDragonsFortuneTooltipPlaceholder',\r\n 'Calculated with Golden Switch off and at least one golden cookie on-screen',\r\n '240px',\r\n ],\r\n [\r\n 'PrestMaxTooltipPlaceholder',\r\n 'The MAX prestige is calculated with the cookies gained from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and buying Chocolate egg',\r\n '320px',\r\n ],\r\n [\r\n 'NextPrestTooltipPlaceholder',\r\n 'Calculated with cookies gained from wrinklers and Chocolate egg',\r\n '200px',\r\n ],\r\n [\r\n 'HeavenChipMaxTooltipPlaceholder',\r\n 'The MAX heavenly chips is calculated with the cookies gained from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and buying Chocolate egg',\r\n '330px',\r\n ],\r\n [\r\n 'ResetTooltipPlaceholder',\r\n 'The bonus income you would get from new prestige levels unlocked at 100% of its potential and from ascension achievements if you have the same buildings/upgrades after reset',\r\n '370px',\r\n ],\r\n [\r\n 'ChoEggTooltipPlaceholder',\r\n 'The amount of cookies you would get from popping all wrinklers with Skruuia god in Diamond slot, selling all stock market goods, selling all buildings with Earth Shatterer and Reality Bending auras, and then buying Chocolate egg',\r\n '300px',\r\n ],\r\n ['ChainNextLevelPlaceholder', 'Cheated cookies might break this formula', '250px'],\r\n [\r\n 'FavouriteSettingPlaceholder',\r\n \"Click to set this setting as favourite and show it in 'favourite' settings at the top of the Cookie Monster Settings\",\r\n '250px',\r\n ],\r\n];\r\nexport const SimpleTooltipElements = {};\r\n\r\n/**\r\n * These are variables used by the functions that create tooltips for wrinklers\r\n * See CM.Disp.CheckWrinklerTooltip(), CM.Disp.UpdateWrinklerTooltip() and CM.Main.AddWrinklerAreaDetect()\r\n */\r\nexport let TooltipWrinklerArea = 0; // eslint-disable-line prefer-const\r\nexport let TooltipWrinkler = -1; // eslint-disable-line prefer-const\r\n\r\n/**\r\n * This array is used to store whether a Wrinkler tooltip is being shown or not\r\n * [i] = 1 means tooltip is being shown, [i] = 0 means hidden\r\n * It is used by CM.Disp.CheckWrinklerTooltip() and CM.Main.AddWrinklerAreaDetect()\r\n */\r\nexport let TooltipWrinklerBeingShown = []; // eslint-disable-line prefer-const\r\n\r\nexport let CMLastAscendState;\r\nexport let CMSayTime = function () {}; // eslint-disable-line prefer-const\r\n\r\n/**\r\n * These are variables used to create various displays when the game is loaded on the \"sell all\" screen\r\n */\r\nexport let LastTargetBotBar = 1; // eslint-disable-line prefer-const\r\nexport let LastTargetBuildings = 1; // eslint-disable-line prefer-const\r\nexport let LastTargetTooltipBuilding = 1; // eslint-disable-line prefer-const\r\n\r\n/**\r\n * These arrays are used in the stats page to show\r\n * average cookies per {CM.Disp.cookieTimes/CM.Disp.clickTimes} seconds\r\n */\r\nexport const CookieTimes = [10, 15, 30, 60, 300, 600, 900, 1800];\r\nexport const ClickTimes = [1, 5, 10, 15, 30];\r\n\r\n/**\r\n * This array is used to give certain timers specific colours\r\n */\r\nexport const BuffColours = {\r\n Frenzy: ColourYellow,\r\n 'Dragon Harvest': ColourBrown,\r\n 'Elder frenzy': ColourGreen,\r\n Clot: ColourRed,\r\n 'Click frenzy': ColourBlue,\r\n Dragonflight: ColourPink,\r\n};\r\n\r\n/**\r\n * This array is used to track GC timers\r\n */\r\nexport let GCTimers = {}; // eslint-disable-line prefer-const\r\n\r\n/**\r\n * Used to store the number of cookies to be displayed in the tab-title\r\n */\r\nexport let Title = ''; // eslint-disable-line prefer-const\r\n\r\nexport let TooltipPrice;\r\nexport let TooltipBonusIncome;\r\nexport let TooltipType;\r\nexport let TooltipName;\r\nexport let TooltipBonusMouse;\r\n\r\nexport let LastAscendState;\r\nexport let LastNumberOfTimers;\r\n\r\n/**\r\n * This stores the names of settings shown in the favourites section\r\n */\r\nexport let FavouriteSettings = []; // eslint-disable-line prefer-const\r\n","/** General functions to format or beautify strings */\r\n\r\nimport { metric, shortScale, shortScaleAbbreviated } from '../../Data/Scales';\r\nimport { BackupFunctions } from '../../Main/VariablesAndData';\r\n\r\n/**\r\n * This function returns formats number based on the Scale setting\r\n * @param\t{number}\tnum\t\tNumber to be beautified\r\n * @param \t{any}\t\tfloats \tUsed in some scenario's by CM.Backup.Beautify (Game's original function)\r\n * @param\t{number}\tforced\tUsed to force (type 3) in certains cases\r\n * @returns\t{string}\t\t\tFormatted number\r\n */\r\nexport default function Beautify(num, floats, forced) {\r\n const decimals =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleDecimals + 1;\r\n if (num === Infinity) {\r\n return 'Infinity';\r\n }\r\n if (typeof num === 'undefined') {\r\n return '0';\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 0) {\r\n return BackupFunctions.Beautify(num, floats);\r\n }\r\n if (Number.isFinite(num)) {\r\n if (num < 0) {\r\n return `-${Beautify(Math.abs(num))}`;\r\n }\r\n let answer = '';\r\n if (num === 0) {\r\n return num.toString();\r\n }\r\n if (\r\n num > 0.001 &&\r\n num < Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleCutoff\r\n ) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator)\r\n answer = num.toLocaleString('nl');\r\n else answer = num.toLocaleString('en');\r\n return answer;\r\n }\r\n if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 4 &&\r\n !forced) ||\r\n forced === 4\r\n ) {\r\n // Scientific notation, 123456789 => 1.235E+8\r\n answer = num.toExponential(decimals).toString().replace('e', 'E');\r\n } else {\r\n const exponential = num.toExponential().toString();\r\n const AmountOfTenPowerThree = Math.floor(exponential.slice(exponential.indexOf('e') + 1) / 3);\r\n answer = (num / Number(`1e${AmountOfTenPowerThree * 3}`)).toFixed(decimals);\r\n // answer is now \"xxx.xx\" (e.g., 123456789 would be 123.46)\r\n if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 1 &&\r\n !forced) ||\r\n forced === 1\r\n ) {\r\n // Metric scale, 123456789 => 123.457 M\r\n if (num >= 0.01 && num < Number(`1e${metric.length * 3}`)) {\r\n answer += ` ${metric[AmountOfTenPowerThree]}`;\r\n } else answer = Beautify(num, 0, 4); // If number is too large or little, revert to scientific notation\r\n } else if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 2 &&\r\n !forced) ||\r\n forced === 2\r\n ) {\r\n // Short scale, 123456789 => 123.457 M\r\n if (num >= 0.01 && num < Number(`1e${shortScale.length * 3}`)) {\r\n answer += ` ${shortScale[AmountOfTenPowerThree]}`;\r\n } else answer = Beautify(num, 0, 4); // If number is too large or little, revert to scientific notation\r\n } else if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 3 &&\r\n !forced) ||\r\n forced === 3\r\n ) {\r\n // Short scale, 123456789 => 123.457 M\r\n if (num >= 0.01 && num < Number(`1e${shortScaleAbbreviated.length * 3}`)) {\r\n answer += ` ${shortScaleAbbreviated[AmountOfTenPowerThree]}`;\r\n } else answer = Beautify(num, 0, 4); // If number is too large or little, revert to scientific notation\r\n } else if (\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Scale === 5 &&\r\n !forced) ||\r\n forced === 5\r\n ) {\r\n // Engineering notation, 123456789 => 123.457E+6\r\n answer += `E${AmountOfTenPowerThree * 3}`;\r\n }\r\n }\r\n if (answer === '') {\r\n // eslint-disable-next-line no-console\r\n console.log(`Could not beautify number with Cookie Monster Beautify: ${num}`);\r\n answer = BackupFunctions.Beautify(num, floats);\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator)\r\n answer = answer.replace('.', ',');\r\n return answer;\r\n }\r\n console.log(`Could not beautify number with Cookie Monster Beautify: ${num}`); // eslint-disable-line no-console\r\n return BackupFunctions.Beautify(num, floats);\r\n}\r\n","import {\r\n CacheMinPPBulk,\r\n CacheObjects1,\r\n CacheObjects10,\r\n CacheObjects100,\r\n CacheObjectsNextAchievement,\r\n} from '../../Cache/VariablesAndData';\r\nimport BuildingSell from '../../Sim/SimulationEvents/SellBuilding';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\nimport { ColoursOrdering, LastTargetBuildings } from '../VariablesAndData';\r\n\r\n/**\r\n * Section: Functions related to right column of the screen (buildings/upgrades)\r\n\r\n/**\r\n * This function adjusts some things in the column of buildings.\r\n * It colours them, helps display the correct sell-price and shuffles the order when CM.Options.SortBuildings is set\r\n * The function is called by CM.Disp.Draw(), CM.Disp.UpdateColours() & CM.Disp.RefreshScale()\r\n * And by changes in CM.Options.BuildColour, CM.Options.SortBuild & CM.Data.Config.BulkBuildColour\r\n */\r\nexport default function UpdateBuildings() {\r\n let target = Game.buyBulk;\r\n if (Game.buyMode === 1) {\r\n LastTargetBuildings = target;\r\n } else {\r\n target = LastTargetBuildings;\r\n }\r\n if (target === 1) target = CacheObjects1;\r\n else if (target === 10) target = CacheObjects10;\r\n else if (target === 100) target = CacheObjects100;\r\n\r\n // Remove colour if applied\r\n l(`storeBulk1`).style.removeProperty('color');\r\n l(`storeBulk10`).style.removeProperty('color');\r\n l(`storeBulk100`).style.removeProperty('color');\r\n\r\n if (Game.buyMode === 1) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BuildColour === 1) {\r\n Object.keys(target).forEach((i) => {\r\n l(`productPrice${Game.Objects[i].id}`).style.color =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[\r\n `Colour${target[i].colour}`\r\n ];\r\n });\r\n l(`storeBulk${CacheMinPPBulk}`).style.color =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ColourGreen;\r\n } else {\r\n Object.keys(Game.Objects).forEach((i) => {\r\n l(`productPrice${Game.Objects[i].id}`).style.removeProperty('color');\r\n });\r\n }\r\n } else if (Game.buyMode === -1) {\r\n Object.keys(CacheObjects1).forEach((i) => {\r\n const o = Game.Objects[i];\r\n l(`productPrice${o.id}`).style.color = '';\r\n /*\r\n * Fix sell price displayed in the object in the store.\r\n *\r\n * The buildings sell price displayed by the game itself (without any mod) is incorrect.\r\n * The following line of code fixes this issue, and can be safely removed when the game gets fixed.\r\n *\r\n * This issue is extensively detailed here: https://github.com/Aktanusa/CookieMonster/issues/359#issuecomment-735658262\r\n */\r\n l(`productPrice${o.id}`).innerHTML = Beautify(\r\n BuildingSell(o, o.basePrice, o.amount, o.free, Game.buyBulk, 1),\r\n );\r\n });\r\n }\r\n\r\n // Build array of pointers and sort according to the user's configured sort option.\r\n // This regulates sorting of buildings.\r\n let arr;\r\n if (\r\n Game.buyMode !== 1 ||\r\n !Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings\r\n ) {\r\n arr = Object.keys(CacheObjects1).map((k) => {\r\n const o = {};\r\n o.name = k;\r\n o.id = Game.Objects[k].id;\r\n return o;\r\n });\r\n // Sort using default order.\r\n arr.sort((a, b) => a.id - b.id);\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings === 1\r\n ) {\r\n arr = Object.keys(CacheObjects1).map((k) => {\r\n const o = {};\r\n o.name = k;\r\n o.pp = CacheObjects1[k].pp;\r\n o.colour = CacheObjects1[k].colour;\r\n return o;\r\n });\r\n // Sort by pp colour group, then by pp.\r\n arr.sort((a, b) =>\r\n ColoursOrdering.indexOf(a.colour) === ColoursOrdering.indexOf(b.colour)\r\n ? a.pp - b.pp\r\n : ColoursOrdering.indexOf(a.colour) - ColoursOrdering.indexOf(b.colour),\r\n );\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings === 2\r\n ) {\r\n arr = Object.keys(target).map((k) => {\r\n const o = {};\r\n o.name = k;\r\n o.pp = target[k].pp;\r\n o.colour = target[k].colour;\r\n return o;\r\n });\r\n // Sort by pp colour group, then by pp.\r\n arr.sort((a, b) =>\r\n ColoursOrdering.indexOf(a.colour) === ColoursOrdering.indexOf(b.colour)\r\n ? a.pp - b.pp\r\n : ColoursOrdering.indexOf(a.colour) - ColoursOrdering.indexOf(b.colour),\r\n );\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortBuildings === 3\r\n ) {\r\n arr = Object.keys(CacheObjectsNextAchievement).map((k) => {\r\n const o = {};\r\n o.name = k;\r\n o.id = Game.Objects[k].id;\r\n o.amountUntilNext = CacheObjectsNextAchievement[k].AmountNeeded;\r\n o.priceUntilNext = CacheObjectsNextAchievement[k].price;\r\n return o;\r\n });\r\n // First, sort using default order.\r\n arr.sort((a, b) => a.id - b.id);\r\n // Sort by price until next achievement.\r\n // Buildings that aren't within 100 of an achievement are placed at the end, still in\r\n // default order relative to each other because sort() is guaranteed stable.\r\n arr.sort(\r\n (a, b) =>\r\n (a.amountUntilNext !== 101 ? a.priceUntilNext : Infinity) -\r\n (b.amountUntilNext !== 101 ? b.priceUntilNext : Infinity),\r\n );\r\n }\r\n\r\n // Use array index (+2) as the grid row number.\r\n // (grid rows are 1-based indexing, and row 1 is the bulk buy/sell options)\r\n for (let x = 0; x < arr.length; x++) {\r\n Game.Objects[arr[x].name].l.style.gridRow = `${x + 2}/${x + 2}`;\r\n }\r\n}\r\n","/**\r\n * This function toggles the upgrade to be always expanded\r\n * It is called by a change in CM.Options.ToolWarnPos\r\n * and upon creation of the warning tooltip by CM.Disp.UpdateTooltipWarnings()\r\n */\r\nexport default function UpdateUpgradeSectionsHeight() {\r\n Object.values(document.getElementsByClassName('storeSection')).forEach((section) => {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpgradesNeverCollapse ||\r\n section.id === 'products'\r\n ) {\r\n section.style.height = 'auto'; // eslint-disable-line no-param-reassign\r\n } else if (section.id === 'vaultUpgrades') {\r\n section.style.height = ''; // eslint-disable-line no-param-reassign\r\n section.style.minHeight = '0px'; // eslint-disable-line no-param-reassign\r\n } else if (section.id === 'upgrades') {\r\n section.style.height = ''; // eslint-disable-line no-param-reassign\r\n if (section.className.includes('hasMenu')) {\r\n section.style.minHeight = '82px'; // eslint-disable-line no-param-reassign\r\n } else {\r\n section.style.minHeight = '60px'; // eslint-disable-line no-param-reassign\r\n }\r\n } else {\r\n section.style.height = ''; // eslint-disable-line no-param-reassign\r\n section.style.minHeight = '60px'; // eslint-disable-line no-param-reassign\r\n }\r\n });\r\n}\r\n","import { CacheUpgrades } from '../../Cache/VariablesAndData';\r\nimport {\r\n ColourBackPre,\r\n ColourBlue,\r\n ColourGray,\r\n ColourGreen,\r\n ColourOrange,\r\n ColourPurple,\r\n ColourRed,\r\n ColoursOrdering,\r\n ColourYellow,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function adjusts some things in the upgrades section\r\n * It colours them and shuffles the order when CM.Options.SortBuildings is set\r\n * The function is called by CM.Disp.Draw(), CM.Disp.ToggleUpgradeBarAndColour & CM.Disp.RefreshScale()\r\n * And by changes in CM.Options.SortUpgrades\r\n */\r\nexport default function UpdateUpgrades() {\r\n // This counts the amount of upgrades for each pp group and updates the Upgrade Bar\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour > 0) {\r\n let blue = 0;\r\n let green = 0;\r\n let yellow = 0;\r\n let orange = 0;\r\n let red = 0;\r\n let purple = 0;\r\n let gray = 0;\r\n\r\n Object.keys(Game.UpgradesInStore).forEach((i) => {\r\n const me = Game.UpgradesInStore[i];\r\n let addedColour = false;\r\n for (let j = 0; j < l(`upgrade${i}`).childNodes.length; j += 1) {\r\n if (l(`upgrade${i}`).childNodes[j].className.indexOf(ColourBackPre) !== -1) {\r\n l(`upgrade${i}`).childNodes[j].className = ColourBackPre + CacheUpgrades[me.name].colour;\r\n addedColour = true;\r\n break;\r\n }\r\n }\r\n if (!addedColour) {\r\n const div = document.createElement('div');\r\n div.style.width = '10px';\r\n div.style.height = '10px';\r\n div.className = ColourBackPre + CacheUpgrades[me.name].colour;\r\n l(`upgrade${i}`).appendChild(div);\r\n }\r\n if (CacheUpgrades[me.name].colour === ColourBlue) blue += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourGreen) green += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourYellow) yellow += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourOrange) orange += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourRed) red += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourPurple) purple += 1;\r\n else if (CacheUpgrades[me.name].colour === ColourGray) gray += 1;\r\n });\r\n\r\n l('CMUpgradeBarBlue').textContent = blue;\r\n l('CMUpgradeBarGreen').textContent = green;\r\n l('CMUpgradeBarYellow').textContent = yellow;\r\n l('CMUpgradeBarOrange').textContent = orange;\r\n l('CMUpgradeBarRed').textContent = red;\r\n l('CMUpgradeBarPurple').textContent = purple;\r\n l('CMUpgradeBarGray').textContent = gray;\r\n }\r\n\r\n const arr = [];\r\n // Build array of pointers, sort by pp, set flex positions\r\n // This regulates sorting of upgrades\r\n for (let x = 0; x < Game.UpgradesInStore.length; x += 1) {\r\n const o = {};\r\n o.name = Game.UpgradesInStore[x].name;\r\n o.price = Game.UpgradesInStore[x].basePrice;\r\n o.pp = CacheUpgrades[o.name].pp;\r\n o.colour = CacheUpgrades[o.name].colour;\r\n arr.push(o);\r\n }\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SortUpgrades) {\r\n // Sort by pp colour group, then by pp.\r\n arr.sort((a, b) =>\r\n ColoursOrdering.indexOf(a.colour) === ColoursOrdering.indexOf(b.colour)\r\n ? a.pp - b.pp\r\n : ColoursOrdering.indexOf(a.colour) - ColoursOrdering.indexOf(b.colour),\r\n );\r\n } else {\r\n arr.sort((a, b) => a.price - b.price);\r\n }\r\n\r\n const nameChecker = function (arr2, upgrade) {\r\n return arr2.findIndex((e) => e.name === upgrade.name);\r\n };\r\n for (let x = 0; x < Game.UpgradesInStore.length; x += 1) {\r\n l(`upgrade${x}`).style.order = nameChecker(arr, Game.UpgradesInStore[x]) + 1;\r\n }\r\n}\r\n","/**\r\n * This function returns time as a string depending on TimeFormat setting\r\n * @param \t{number} \ttime\t\tTime to be formatted\r\n * @param \t{number}\tlongFormat \t1 or 0\r\n * @returns\t{string}\t\t\t\tFormatted time\r\n */\r\nexport default function FormatTime(time, longFormat) {\r\n /* eslint-disable no-nested-ternary */\r\n let formattedTime = time;\r\n if (time === Infinity) return time;\r\n if (time < 0) return 'Negative time period';\r\n formattedTime = Math.ceil(time);\r\n const y = Math.floor(formattedTime / 31536000);\r\n const d = Math.floor((formattedTime % 31536000) / 86400);\r\n const h = Math.floor(((formattedTime % 31536000) % 86400) / 3600);\r\n const m = Math.floor((((formattedTime % 31536000) % 86400) % 3600) / 60);\r\n const s = Math.floor((((formattedTime % 31536000) % 86400) % 3600) % 60);\r\n let str = '';\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat === 0) {\r\n if (formattedTime > 777600000) return longFormat ? 'Over 9000 days!' : '>9000d';\r\n str += y > 0 ? `${y + (longFormat ? (y === 1 ? ' year' : ' years') : 'y')}, ` : '';\r\n if (str.length > 0 || d > 0)\r\n str += `${d + (longFormat ? (d === 1 ? ' day' : ' days') : 'd')}, `;\r\n if (str.length > 0 || h > 0)\r\n str += `${h + (longFormat ? (h === 1 ? ' hour' : ' hours') : 'h')}, `;\r\n if (str.length > 0 || m > 0)\r\n str += `${m + (longFormat ? (m === 1 ? ' minute' : ' minutes') : 'm')}, `;\r\n str += s + (longFormat ? (s === 1 ? ' second' : ' seconds') : 's');\r\n } else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat === 1) {\r\n if (formattedTime > 3155760000) return 'XX:XX:XX:XX:XX';\r\n str += `${(y < 10 ? '0' : '') + y}:`;\r\n str += `${(d < 10 ? '0' : '') + d}:`;\r\n str += `${(h < 10 ? '0' : '') + h}:`;\r\n str += `${(m < 10 ? '0' : '') + m}:`;\r\n str += (s < 10 ? '0' : '') + s;\r\n } else {\r\n // Similar to TimeFormat === 0, but only two most significant components are included.\r\n if (formattedTime > 777600000) return longFormat ? 'Over 9000 days!' : '>9000d';\r\n if (y > 0) {\r\n str += `${y + (longFormat ? (y === 1 ? ' year' : ' years') : 'y')}, `;\r\n str += `${d + (longFormat ? (d === 1 ? ' day' : ' days') : 'd')}`;\r\n } else if (d > 0) {\r\n str += `${d + (longFormat ? (d === 1 ? ' day' : ' days') : 'd')}, `;\r\n str += `${h + (longFormat ? (h === 1 ? ' hour' : ' hours') : 'h')}`;\r\n } else if (h > 0) {\r\n str += `${h + (longFormat ? (h === 1 ? ' hour' : ' hours') : 'h')}, `;\r\n str += `${m + (longFormat ? (m === 1 ? ' minute' : ' minutes') : 'm')}`;\r\n } else if (m > 0) {\r\n str += `${m + (longFormat ? (m === 1 ? ' minute' : ' minutes') : 'm')}, `;\r\n str += s + (longFormat ? (s === 1 ? ' second' : ' seconds') : 's');\r\n } else {\r\n str += s + (longFormat ? (s === 1 ? ' second' : ' seconds') : 's');\r\n }\r\n }\r\n return str;\r\n}\r\n","import { ColourGreen, ColourOrange, ColourRed, ColourYellow } from '../VariablesAndData';\r\nimport FormatTime from './FormatTime';\r\n\r\n/**\r\n * This function returns the colour to be used for time-strings\r\n * @param\t{number}\t\t\ttime\t\t\tTime to be coloured\r\n * @returns {{string, string}}\t{text, colour}\tBoth the formatted time and colour as strings in an array\r\n */\r\nexport default function GetTimeColour(time) {\r\n let colour;\r\n let text;\r\n if (time <= 0) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimeFormat === 1)\r\n text = '00:00:00:00:00';\r\n else text = 'Done!';\r\n colour = ColourGreen;\r\n } else {\r\n text = FormatTime(time);\r\n if (time > 300) colour = ColourRed;\r\n else if (time > 60) colour = ColourOrange;\r\n else colour = ColourYellow;\r\n }\r\n return { text, colour };\r\n}\r\n","import {\r\n CacheAverageCPS,\r\n CacheCurrWrinklerCount,\r\n CacheCurrWrinklerCPSMult,\r\n CacheWrinklersFattest,\r\n} from '../../Cache/VariablesAndData';\r\n\r\n/**\r\n * This function returns the cps as either current or average CPS depending on CM.Options.CPSMode\r\n * @returns\t{number}\tThe average or current cps\r\n */\r\nexport default function GetCPS() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CPSMode) {\r\n return CacheAverageCPS;\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 0) {\r\n return Game.cookiesPs * (1 - Game.cpsSucked);\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 1) {\r\n return Game.cookiesPs * (CacheCurrWrinklerCPSMult + (1 - CacheCurrWrinklerCount * 0.05));\r\n }\r\n if (CacheWrinklersFattest[1] !== null)\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 2 &&\r\n Game.wrinklers[CacheWrinklersFattest[1]].type === 1\r\n ) {\r\n return (\r\n Game.cookiesPs *\r\n ((CacheCurrWrinklerCPSMult * 3) / CacheCurrWrinklerCount +\r\n (1 - CacheCurrWrinklerCount * 0.05))\r\n );\r\n }\r\n return (\r\n Game.cookiesPs *\r\n (CacheCurrWrinklerCPSMult / CacheCurrWrinklerCount + (1 - CacheCurrWrinklerCount * 0.05))\r\n );\r\n}\r\n","import { CacheWrinklersFattest, CacheWrinklersTotal } from '../../Cache/VariablesAndData';\r\n\r\n/**\r\n * This function returns the total amount stored in the Wrinkler Bank\r\n * as calculated by CM.Cache.CacheWrinklers() if CM.Options.CalcWrink is set\r\n * @returns\t{number}\t0 or the amount of cookies stored (CM.Cache.WrinklersTotal)\r\n */\r\nexport default function GetWrinkConfigBank() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 1) {\r\n return CacheWrinklersTotal;\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 2) {\r\n return CacheWrinklersFattest[0];\r\n }\r\n return 0;\r\n}\r\n","/** Functions to create various DOM elements used by the Bars */\r\n\r\nimport { ColourBackPre, ColourBlue, ColourTextPre } from '../VariablesAndData';\r\n\r\n/**\r\n * This function creates an indivudual timer for the timer bar\r\n * @param\t{string}\t\t\t\t\tid\t\t\t\t\tAn id to identify the timer\r\n * @param\t{string}\t\t\t\t\tname\t\t\t\tThe title of the timer\r\n * @param\t[{{string}, {string}}, ...]\tbars ([id, colour])\tThe id and colours of individual parts of the timer\r\n */\r\nexport function CreateTimer(id, name, bars) {\r\n const timerBar = document.createElement('div');\r\n timerBar.id = id;\r\n timerBar.style.height = '12px';\r\n timerBar.style.margin = '0px 10px';\r\n timerBar.style.position = 'relative';\r\n\r\n const div = document.createElement('div');\r\n div.style.width = '100%';\r\n div.style.height = '10px';\r\n div.style.margin = 'auto';\r\n div.style.position = 'absolute';\r\n div.style.left = '0px';\r\n div.style.top = '0px';\r\n div.style.right = '0px';\r\n div.style.bottom = '0px';\r\n\r\n const type = document.createElement('span');\r\n type.style.display = 'inline-block';\r\n type.style.textAlign = 'right';\r\n type.style.fontSize = '10px';\r\n type.style.width = '108px';\r\n type.style.marginRight = '5px';\r\n type.style.verticalAlign = 'text-top';\r\n type.textContent = name;\r\n div.appendChild(type);\r\n\r\n for (let i = 0; i < bars.length; i++) {\r\n const colourBar = document.createElement('span');\r\n colourBar.id = bars[i].id;\r\n colourBar.style.display = 'inline-block';\r\n colourBar.style.height = '10px';\r\n colourBar.style.verticalAlign = 'text-top';\r\n colourBar.style.textAlign = 'center';\r\n if (bars.length - 1 === i) {\r\n colourBar.style.borderTopRightRadius = '10px';\r\n colourBar.style.borderBottomRightRadius = '10px';\r\n }\r\n if (typeof bars[i].colour !== 'undefined') {\r\n colourBar.className = ColourBackPre + bars[i].colour;\r\n }\r\n div.appendChild(colourBar);\r\n }\r\n\r\n const timer = document.createElement('span');\r\n timer.id = `${id}Time`;\r\n timer.style.marginLeft = '5px';\r\n timer.style.verticalAlign = 'text-top';\r\n div.appendChild(timer);\r\n\r\n timerBar.appendChild(div);\r\n\r\n return timerBar;\r\n}\r\n\r\n/**\r\n * This function extends the bottom bar (created by CM.Disp.CreateBotBar) with a column for the given building.\r\n * @param\t{string}\tbuildingName\tObjectname to be added (e.g., \"Cursor\")\r\n */\r\nexport function CreateBotBarBuildingColumn(buildingName) {\r\n if (l('CMBotBar') !== null) {\r\n const type = l('CMBotBar').firstChild.firstChild.childNodes[0];\r\n const bonus = l('CMBotBar').firstChild.firstChild.childNodes[1];\r\n const pp = l('CMBotBar').firstChild.firstChild.childNodes[2];\r\n const time = l('CMBotBar').firstChild.firstChild.childNodes[3];\r\n\r\n const i = buildingName;\r\n const header = type.appendChild(document.createElement('td'));\r\n header.appendChild(\r\n document.createTextNode(`${i.indexOf(' ') !== -1 ? i.substring(0, i.indexOf(' ')) : i} (`),\r\n );\r\n\r\n const span = header.appendChild(document.createElement('span'));\r\n span.className = ColourTextPre + ColourBlue;\r\n\r\n header.appendChild(document.createTextNode(')'));\r\n type.lastChild.style.paddingLeft = '8px';\r\n bonus.appendChild(document.createElement('td'));\r\n bonus.lastChild.style.paddingLeft = '8px';\r\n pp.appendChild(document.createElement('td'));\r\n pp.lastChild.style.paddingLeft = '8px';\r\n time.appendChild(document.createElement('td'));\r\n time.lastChild.style.paddingLeft = '2px';\r\n }\r\n}\r\n","/** Functions related to the Bottom Bar */\r\n\r\nimport { CacheObjects1, CacheObjects10, CacheObjects100 } from '../../Cache/VariablesAndData';\r\nimport { VersionMajor, VersionMinor } from '../../Data/Moddata';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../BeautifyAndFormatting/FormatTime';\r\nimport GetTimeColour from '../BeautifyAndFormatting/GetTimeColour';\r\n\r\nimport GetCPS from '../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../HelperFunctions/GetWrinkConfigBank';\r\nimport { ColourBlue, ColourTextPre, ColourYellow, LastTargetBotBar } from '../VariablesAndData';\r\nimport { CreateBotBarBuildingColumn } from './CreateDOMElements';\r\n\r\n/**\r\n * This function creates the bottom bar and appends it to l('wrapper')\r\n */\r\nexport function CreateBotBar() {\r\n const BotBar = document.createElement('div');\r\n BotBar.id = 'CMBotBar';\r\n BotBar.style.height = '69px';\r\n BotBar.style.width = '100%';\r\n BotBar.style.position = 'absolute';\r\n BotBar.style.display = 'none';\r\n BotBar.style.backgroundColor = '#262224';\r\n BotBar.style.backgroundImage = 'linear-gradient(to bottom, #4d4548, #000000)';\r\n BotBar.style.borderTop = '1px solid black';\r\n BotBar.style.overflow = 'auto';\r\n BotBar.style.textShadow = '-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black';\r\n\r\n const table = BotBar.appendChild(document.createElement('table'));\r\n table.style.width = '100%';\r\n table.style.textAlign = 'center';\r\n table.style.whiteSpace = 'nowrap';\r\n const tbody = table.appendChild(document.createElement('tbody'));\r\n\r\n const firstCol = function (text, colour) {\r\n const td = document.createElement('td');\r\n td.style.textAlign = 'right';\r\n td.className = ColourTextPre + colour;\r\n td.textContent = text;\r\n return td;\r\n };\r\n const type = tbody.appendChild(document.createElement('tr'));\r\n type.style.fontWeight = 'bold';\r\n type.appendChild(firstCol(`CM ${VersionMajor}.${VersionMinor}`, ColourYellow));\r\n const bonus = tbody.appendChild(document.createElement('tr'));\r\n bonus.appendChild(firstCol('Bonus Income', ColourBlue));\r\n const pp = tbody.appendChild(document.createElement('tr'));\r\n pp.appendChild(firstCol('Payback Period', ColourBlue));\r\n const time = tbody.appendChild(document.createElement('tr'));\r\n time.appendChild(firstCol('Time Left', ColourBlue));\r\n\r\n l('wrapper').appendChild(BotBar);\r\n\r\n Object.keys(Game.Objects).forEach((i) => {\r\n CreateBotBarBuildingColumn(i);\r\n });\r\n}\r\n\r\n/**\r\n * This function updates the bonus-, pp-, and time-rows in the the bottom bar\r\n */\r\nexport function UpdateBotBar() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1 &&\r\n CacheObjects1 &&\r\n Game.buyMode === 1\r\n ) {\r\n let count = 0;\r\n Object.keys(CacheObjects1).forEach((i) => {\r\n let target = Game.buyBulk;\r\n if (Game.buyMode === 1) {\r\n LastTargetBotBar = target;\r\n } else {\r\n target = LastTargetBotBar;\r\n }\r\n if (target === 1) target = CacheObjects1;\r\n if (target === 10) target = CacheObjects10;\r\n if (target === 100) target = CacheObjects100;\r\n count += 1;\r\n l('CMBotBar').firstChild.firstChild.childNodes[0].childNodes[\r\n count\r\n ].childNodes[1].textContent = Game.Objects[i].amount;\r\n l('CMBotBar').firstChild.firstChild.childNodes[1].childNodes[count].textContent = Beautify(\r\n target[i].bonus,\r\n 2,\r\n );\r\n l('CMBotBar').firstChild.firstChild.childNodes[2].childNodes[count].className =\r\n ColourTextPre + target[i].colour;\r\n let PPString;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime)\r\n PPString = FormatTime(Math.round(target[i].pp));\r\n else PPString = Beautify(Math.round(target[i].pp), 2);\r\n l('CMBotBar').firstChild.firstChild.childNodes[2].childNodes[count].textContent = PPString;\r\n const timeColour = GetTimeColour(\r\n (Game.Objects[i].bulkPrice - (Game.cookies + GetWrinkConfigBank())) / GetCPS(),\r\n );\r\n l('CMBotBar').firstChild.firstChild.childNodes[3].childNodes[count].className =\r\n ColourTextPre + timeColour.colour;\r\n if (timeColour.text === 'Done!' && Game.cookies < Game.Objects[i].bulkPrice) {\r\n l('CMBotBar').firstChild.firstChild.childNodes[3].childNodes[count].textContent =\r\n `${timeColour.text} (with Wrink)`;\r\n } else\r\n l('CMBotBar').firstChild.firstChild.childNodes[3].childNodes[count].textContent =\r\n timeColour.text;\r\n });\r\n }\r\n}\r\n","/**\r\n * This function sets the size of the background of the full game and the left column\r\n * depending on whether certain abrs are activated\r\n * It is called by CM.Disp.UpdateAscendState() and CM.Disp.UpdateBotTimerBarPosition()\r\n */\r\nexport default function UpdateBackground() {\r\n Game.Background.canvas.width = Game.Background.canvas.parentNode.offsetWidth;\r\n Game.Background.canvas.height = Game.Background.canvas.parentNode.offsetHeight;\r\n Game.LeftBackground.canvas.width = Game.LeftBackground.canvas.parentNode.offsetWidth;\r\n Game.LeftBackground.canvas.height = Game.LeftBackground.canvas.parentNode.offsetHeight;\r\n Game.DrawBackground();\r\n}\r\n","/** Called by the \"func\" of individual settings */\r\n\r\nimport UpdateBackground from '../Disp/HelperFunctions/UpdateBackground';\r\n\r\n/**\r\n * This function changes the position of both the bottom and timer bar\r\n */\r\nexport function UpdateBotTimerBarPosition() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 1\r\n ) {\r\n l('CMBotBar').style.bottom = l('CMTimerBar').style.height;\r\n l('game').style.bottom = `${Number(l('CMTimerBar').style.height.replace('px', '')) + 70}px`;\r\n } else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1) {\r\n l('CMBotBar').style.bottom = '0px';\r\n l('game').style.bottom = '70px';\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 1\r\n ) {\r\n l('game').style.bottom = l('CMTimerBar').style.height;\r\n } else {\r\n // No bars\r\n l('game').style.bottom = '0px';\r\n }\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 0\r\n ) {\r\n l('sectionLeft').style.top = l('CMTimerBar').style.height;\r\n } else {\r\n l('sectionLeft').style.top = '';\r\n }\r\n\r\n UpdateBackground();\r\n}\r\n\r\n/**\r\n * This function changes the visibility of the timer bar\r\n */\r\nexport function ToggleTimerBar() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1)\r\n l('CMTimerBar').style.display = '';\r\n else l('CMTimerBar').style.display = 'none';\r\n UpdateBotTimerBarPosition();\r\n}\r\n\r\n/**\r\n * This function changes the position of the timer bar\r\n */\r\nexport function ToggleTimerBarPos() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 0) {\r\n l('CMTimerBar').style.width = '30%';\r\n l('CMTimerBar').style.bottom = '';\r\n l('game').insertBefore(l('CMTimerBar'), l('sectionLeft'));\r\n } else {\r\n l('CMTimerBar').style.width = '100%';\r\n l('CMTimerBar').style.bottom = '0px';\r\n l('wrapper').appendChild(l('CMTimerBar'));\r\n }\r\n UpdateBotTimerBarPosition();\r\n}\r\n","import { CacheDragonAura, CacheDragonAura2 } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This functions caches the currently selected Dragon Auras\r\n */\r\nexport default function CacheDragonAuras() {\r\n CacheDragonAura = Game.dragonAura;\r\n CacheDragonAura2 = Game.dragonAura2;\r\n}\r\n","/**\r\n * This function constructs an object with the static properties of an achievement\r\n * @param\t{string}\tachievementName\tName of the Achievement\r\n * @returns {Object}\tyou\t\t\t\tThe static object\r\n */\r\nexport default function InitAchievement(achievementName) {\r\n const me = Game.Achievements[achievementName];\r\n const you = {};\r\n you.name = me.name;\r\n return you;\r\n}\r\n","import { SimObjects } from '../VariablesAndData';\r\nimport SimHas from './SimHas';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.GetTieredCpsMult but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimGetTieredCpsMult(me) {\r\n let mult = 1;\r\n Object.keys(me.tieredUpgrades).forEach((i) => {\r\n if (!Game.Tiers[me.tieredUpgrades[i].tier].special && SimHas(me.tieredUpgrades[i].name)) {\r\n let tierMult = 2;\r\n // unshackled multipliers\r\n if (\r\n Game.ascensionMode !== 1 &&\r\n SimHas(me.unshackleUpgrade) &&\r\n SimHas(Game.Tiers[me.tieredUpgrades[i].tier].unshackleUpgrade)\r\n )\r\n tierMult += me.id === 1 ? 0.5 : (20 - me.id) * 0.1;\r\n mult *= tierMult;\r\n }\r\n });\r\n Object.keys(me.synergies).forEach((i) => {\r\n if (SimHas(me.synergies[i].name)) {\r\n const syn = me.synergies[i];\r\n if (syn.buildingTie1.name === me.name) mult *= 1 + 0.05 * syn.buildingTie2.amount;\r\n else if (syn.buildingTie2.name === me.name) mult *= 1 + 0.001 * syn.buildingTie1.amount;\r\n }\r\n });\r\n if (me.fortune && SimHas(me.fortune.name)) mult *= 1.07;\r\n if (me.grandma && SimHas(me.grandma.name))\r\n mult *= 1 + SimObjects.Grandma.amount * 0.01 * (1 / (me.id - 1));\r\n if (typeof me.tieredUpgrades.misfortune === 'object') {\r\n if (me.vanilla === 1 && SimHas(me.tieredUpgrades.misfortune.name)) {\r\n switch (Game.elderWrath) {\r\n default:\r\n mult *= 1;\r\n break;\r\n case 1:\r\n mult *= 1.02;\r\n break;\r\n case 2:\r\n mult *= 1.04;\r\n break;\r\n case 3:\r\n mult *= 1.06;\r\n break;\r\n }\r\n }\r\n }\r\n return mult;\r\n}\r\n","import SimAuraMult from '../ReplacedGameFunctions/SimAuraMult';\r\nimport SimEff from '../ReplacedGameFunctions/SimEff';\r\nimport SimGetTieredCpsMult from '../ReplacedGameFunctions/SimGetTieredCpsMult';\r\nimport SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport { SimObjects } from '../VariablesAndData';\r\n\r\n/**\r\n * This function constructs an object with the static properties of a building,\r\n * but with a 'cps' method changed to check sim data\r\n *\r\n * @param\t{string}\tbuildingName\tName of the building\r\n * @returns {Object}\tyou\t\t\t\tThe static object\r\n */\r\nexport default function InitialBuildingData(buildingName) {\r\n const me = Game.Objects[buildingName];\r\n const you = {};\r\n if (me.name === 'Cursor') {\r\n you.cps = function (it) {\r\n let add = 0;\r\n if (SimHas('Thousand fingers')) add += 0.1;\r\n if (SimHas('Million fingers')) add *= 5;\r\n if (SimHas('Billion fingers')) add *= 10;\r\n if (SimHas('Trillion fingers')) add *= 20;\r\n if (SimHas('Quadrillion fingers')) add *= 20;\r\n if (SimHas('Quintillion fingers')) add *= 20;\r\n if (SimHas('Sextillion fingers')) add *= 20;\r\n if (SimHas('Septillion fingers')) add *= 20;\r\n if (SimHas('Octillion fingers')) add *= 20;\r\n if (SimHas('Nonillion fingers')) add *= 20;\r\n if (SimHas('Decillion fingers')) add *= 20;\r\n if (SimHas('Undecillion fingers')) add *= 20;\r\n if (SimHas('Unshackled cursors')) add *= 25;\r\n let mult = 1;\r\n let num = 0;\r\n Object.keys(SimObjects).forEach((i) => {\r\n if (SimObjects[i].name !== 'Cursor') num += SimObjects[i].amount;\r\n });\r\n add *= num;\r\n mult *= SimGetTieredCpsMult(it);\r\n mult *= Game.magicCpS('Cursor');\r\n mult *= SimEff('cursorCps');\r\n return (\r\n Game.ComputeCps(\r\n 0.1,\r\n SimHas('Reinforced index finger') +\r\n SimHas('Carpal tunnel prevention cream') +\r\n SimHas('Ambidextrous'),\r\n add,\r\n ) * mult\r\n );\r\n };\r\n } else if (me.name === 'Grandma') {\r\n you.cps = function (it) {\r\n let mult = 1;\r\n Object.keys(Game.GrandmaSynergies).forEach((i) => {\r\n if (SimHas(Game.GrandmaSynergies[i])) mult *= 2;\r\n });\r\n if (SimHas('Bingo center/Research facility')) mult *= 4;\r\n if (SimHas('Ritual rolling pins')) mult *= 2;\r\n if (SimHas('Naughty list')) mult *= 2;\r\n\r\n if (SimHas('Elderwort biscuits')) mult *= 1.02;\r\n\r\n mult *= SimEff('grandmaCps');\r\n\r\n if (SimHas('Cat ladies')) {\r\n for (let i = 0; i < Game.UpgradesByPool.kitten.length; i++) {\r\n if (SimHas(Game.UpgradesByPool.kitten[i].name)) mult *= 1.29;\r\n }\r\n }\r\n\r\n mult *= SimGetTieredCpsMult(it);\r\n\r\n let add = 0;\r\n if (SimHas('One mind')) add += SimObjects.Grandma.amount * 0.02;\r\n if (SimHas('Communal brainsweep')) add += SimObjects.Grandma.amount * 0.02;\r\n if (SimHas('Elder Pact')) add += SimObjects.Portal.amount * 0.05;\r\n\r\n let num = 0;\r\n Object.keys(SimObjects).forEach((i) => {\r\n if (SimObjects[i].name !== 'Grandma') num += SimObjects[i].amount;\r\n });\r\n // if (Game.hasAura('Elder Battalion')) mult*=1+0.01*num;\r\n mult *= 1 + SimAuraMult('Elder Battalion') * 0.01 * num;\r\n\r\n mult *= Game.magicCpS(me.name);\r\n\r\n return (me.baseCps + add) * mult;\r\n };\r\n } else {\r\n you.cps = function (it) {\r\n let mult = 1;\r\n mult *= SimGetTieredCpsMult(it);\r\n mult *= Game.magicCpS(it.name);\r\n return it.baseCPS * mult;\r\n };\r\n }\r\n\r\n // Below is needed for above eval, specifically for the SimGetTieredCpsMult function\r\n you.baseCps = me.baseCps;\r\n you.name = me.name;\r\n you.tieredUpgrades = me.tieredUpgrades;\r\n you.synergies = me.synergies;\r\n you.fortune = me.fortune;\r\n you.grandma = me.grandma;\r\n you.baseCPS = me.baseCps;\r\n you.id = me.id;\r\n you.vanilla = me.vanilla;\r\n you.unshackleUpgrade = me.unshackleUpgrade;\r\n return you;\r\n}\r\n","import SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport SimHasGod from '../ReplacedGameFunctions/SimHasGod';\r\nimport { SimObjects } from '../VariablesAndData';\r\n\r\n/**\r\n * This function constructs an object with the static properties of an upgrade\r\n * @param\t{string}\tupgradeName\t\tName of the Upgrade\r\n * @returns {Object}\tyou\t\t\t\tThe static object\r\n */\r\nexport default function InitUpgrade(upgradeName) {\r\n const me = Game.Upgrades[upgradeName];\r\n const you = {};\r\n // Some upgrades have a function for .power (notably the valentine cookies)\r\n you.power = me.power;\r\n if (typeof you.power === 'function') {\r\n if (me.name === 'Sugar crystal cookies') {\r\n you.power = function () {\r\n let n = 5;\r\n Object.keys(SimObjects).forEach((i) => {\r\n if (SimObjects[i].level >= 10) n += 1;\r\n });\r\n return n;\r\n };\r\n } else {\r\n you.power = function () {\r\n let pow = 2;\r\n if (SimHas('Starlove')) pow = 3;\r\n if (Game.hasGod) {\r\n const godLvl = SimHasGod('seasons');\r\n if (godLvl === 1) pow *= 1.3;\r\n else if (godLvl === 2) pow *= 1.2;\r\n else if (godLvl === 3) pow *= 1.1;\r\n }\r\n return pow;\r\n };\r\n }\r\n }\r\n you.pool = me.pool;\r\n you.name = me.name;\r\n return you;\r\n}\r\n","import CacheDragonAuras from '../../Cache/Dragon/CacheDragonAuras';\r\nimport { CacheDragonAura, CacheDragonAura2 } from '../../Cache/VariablesAndData';\r\nimport { CreateBotBarBuildingColumn } from '../../Disp/InfoBars/CreateDOMElements';\r\nimport InitAchievement from '../InitializeData/InitAchievement';\r\nimport InitialBuildingData from '../InitializeData/InitialBuildingData';\r\nimport InitUpgrade from '../InitializeData/InitUpgrade';\r\nimport {\r\n SimAchievements,\r\n SimAchievementsOwned, // eslint-disable-line no-unused-vars\r\n SimDragonAura, // eslint-disable-line no-unused-vars\r\n SimDragonAura2, // eslint-disable-line no-unused-vars\r\n SimGod1, // eslint-disable-line no-unused-vars\r\n SimGod2, // eslint-disable-line no-unused-vars\r\n SimGod3, // eslint-disable-line no-unused-vars\r\n SimHeavenlyPower, // eslint-disable-line no-unused-vars\r\n SimObjects,\r\n SimPledges, // eslint-disable-line no-unused-vars\r\n SimPrestige, // eslint-disable-line no-unused-vars\r\n SimUpgrades,\r\n SimUpgradesOwned, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function copies all relevant data and therefore sets a new iteration of the \"sim data\"\r\n * It is called at the start of any function that simulates certain behaviour or actions\r\n */\r\nexport default function CopyData() {\r\n // Other variables\r\n SimUpgradesOwned = Game.UpgradesOwned;\r\n SimPledges = Game.pledges;\r\n SimAchievementsOwned = Game.AchievementsOwned;\r\n SimHeavenlyPower = Game.heavenlyPower;\r\n SimPrestige = Game.prestige;\r\n\r\n // Buildings\r\n Object.keys(Game.Objects).forEach((i) => {\r\n const me = Game.Objects[i];\r\n let you = SimObjects[i];\r\n if (you === undefined) {\r\n // New building!\r\n SimObjects[i] = InitialBuildingData(i);\r\n you = SimObjects[i];\r\n CreateBotBarBuildingColumn(i); // Add new building to the bottom bar\r\n }\r\n you.amount = me.amount;\r\n you.level = me.level;\r\n you.totalCookies = me.totalCookies;\r\n you.basePrice = me.basePrice;\r\n you.free = me.free;\r\n if (me.minigameLoaded) {\r\n if (me.name === 'Temple') {\r\n SimGod1 = me.minigame.slot[0];\r\n SimGod2 = me.minigame.slot[1];\r\n SimGod3 = me.minigame.slot[2];\r\n }\r\n you.minigameLoaded = me.minigameLoaded;\r\n you.minigame = me.minigame;\r\n }\r\n SimObjects[i] = you;\r\n });\r\n\r\n // Upgrades\r\n Object.keys(Game.Upgrades).forEach((i) => {\r\n const me = Game.Upgrades[i];\r\n let you = SimUpgrades[i];\r\n if (you === undefined) {\r\n SimUpgrades[i] = InitUpgrade(i);\r\n you = SimUpgrades[i];\r\n }\r\n you.bought = me.bought;\r\n SimUpgrades[i] = you;\r\n });\r\n\r\n // Achievements\r\n Object.keys(Game.Achievements).forEach((i) => {\r\n const me = Game.Achievements[i];\r\n let you = SimAchievements[i];\r\n if (you === undefined) {\r\n SimAchievements[i] = InitAchievement(i);\r\n you = SimAchievements[i];\r\n }\r\n you.won = me.won;\r\n SimAchievements[i] = you;\r\n });\r\n\r\n // Auras\r\n CacheDragonAuras();\r\n SimDragonAura = CacheDragonAura;\r\n SimDragonAura2 = CacheDragonAura2;\r\n}\r\n","import {\r\n ColourTextPre,\r\n ColourBorderPre,\r\n ColourGray,\r\n ColourBlue,\r\n ColourRed,\r\n ColourYellow,\r\n ColourPurple,\r\n TooltipType,\r\n} from '../VariablesAndData';\r\n\r\n/** Creates various sections of tooltips */\r\n\r\n/**\r\n * This function creates a tooltipBox object which contains all CookieMonster added tooltip information.\r\n * @returns {object}\tdiv\t\tAn object containing the stylized box\r\n */\r\nexport function TooltipCreateTooltipBox() {\r\n l('tooltip').firstChild.style.paddingBottom = '4px'; // Sets padding on base-tooltip\r\n const tooltipBox = document.createElement('div');\r\n tooltipBox.style.border = '1px solid';\r\n tooltipBox.style.padding = '4px';\r\n tooltipBox.style.margin = '0px -4px';\r\n tooltipBox.id = 'CMTooltipBorder';\r\n tooltipBox.className = ColourTextPre + ColourGray;\r\n return tooltipBox;\r\n}\r\n\r\n/**\r\n * This function creates a header object for tooltips.\r\n * @param\t{string}\ttext\tTitle of header\r\n * @returns {object}\tdiv\t\tAn object containing the stylized header\r\n */\r\nexport function TooltipCreateHeader(text) {\r\n const div = document.createElement('div');\r\n div.style.fontWeight = 'bold';\r\n div.id = `${text}Title`;\r\n div.className = ColourTextPre + ColourBlue;\r\n div.textContent = text;\r\n return div;\r\n}\r\n\r\n/**\r\n * This function creates the tooltip objectm for warnings\r\n * The object is also removed by CM.Disp.UpdateTooltipWarnings() when type is 's' or 'g'\r\n * @returns {object}\tTooltipWarn\tThe Warnings-tooltip object\r\n */\r\nexport function TooltipCreateWarningSection() {\r\n const TooltipWarn = document.createElement('div');\r\n TooltipWarn.style.position = 'absolute';\r\n TooltipWarn.style.display = 'block';\r\n TooltipWarn.style.left = 'auto';\r\n TooltipWarn.style.bottom = 'auto';\r\n TooltipWarn.id = 'CMDispTooltipWarningParent';\r\n\r\n const create = function (boxId, colour, labelTextFront, labelTextBack, deficitId) {\r\n const box = document.createElement('div');\r\n box.id = boxId;\r\n box.style.display = 'none';\r\n box.style.transition = 'opacity 0.1s ease-out';\r\n box.className = ColourBorderPre + colour;\r\n box.style.padding = '2px';\r\n box.style.background = '#000 url(img/darkNoise.png)';\r\n const labelDiv = document.createElement('div');\r\n box.appendChild(labelDiv);\r\n const labelSpan = document.createElement('span');\r\n labelSpan.className = ColourTextPre + colour;\r\n labelSpan.style.fontWeight = 'bold';\r\n labelSpan.textContent = labelTextFront;\r\n labelDiv.appendChild(labelSpan);\r\n labelDiv.appendChild(document.createTextNode(labelTextBack));\r\n const deficitDiv = document.createElement('div');\r\n box.appendChild(deficitDiv);\r\n const deficitSpan = document.createElement('span');\r\n deficitSpan.id = deficitId;\r\n deficitDiv.appendChild(document.createTextNode('Deficit: '));\r\n deficitDiv.appendChild(deficitSpan);\r\n return box;\r\n };\r\n\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnLucky',\r\n ColourRed,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies required for \"Lucky!\"',\r\n 'CMDispTooltipWarnLuckyText',\r\n ),\r\n );\r\n TooltipWarn.firstChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnLuckyFrenzy',\r\n ColourYellow,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies required for \"Lucky!\" (Frenzy)',\r\n 'CMDispTooltipWarnLuckyFrenzyText',\r\n ),\r\n );\r\n TooltipWarn.lastChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnConjure',\r\n ColourPurple,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies required for \"Conjure Baked Goods\"',\r\n 'CMDispTooltipWarnConjureText',\r\n ),\r\n );\r\n TooltipWarn.lastChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnConjureFrenzy',\r\n ColourPurple,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies required for \"Conjure Baked Goods\" (Frenzy)',\r\n 'CMDispTooltipWarnConjureFrenzyText',\r\n ),\r\n );\r\n TooltipWarn.lastChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnEdifice',\r\n ColourPurple,\r\n 'Warning: ',\r\n 'Purchase of this item will put you under the number of Cookies needed for \"Spontaneous Edifice\" to possibly give you your most expensive building\"',\r\n 'CMDispTooltipWarnEdificeText',\r\n ),\r\n );\r\n TooltipWarn.lastChild.style.marginBottom = '4px';\r\n TooltipWarn.appendChild(\r\n create(\r\n 'CMDispTooltipWarnUser',\r\n ColourRed,\r\n 'Warning: ',\r\n `Purchase of this item will put you under the number of Cookies equal to ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser} seconds of CPS`,\r\n 'CMDispTooltipWarnUserText',\r\n ),\r\n );\r\n\r\n return TooltipWarn;\r\n}\r\n\r\n/**\r\n * This function appends the sections for Bonus Income, PP and Time left (to achiev) to the tooltip-object\r\n * The actual data is added by the Update-functions themselves\r\n * @param\t{object}\ttooltip\t\tObject of a TooltipBox, normally created by a call to CM.Disp.TooltipCreateTooltipBox()\r\n */\r\nexport function TooltipCreateCalculationSection(tooltip) {\r\n tooltip.appendChild(TooltipCreateHeader('Bonus Income'));\r\n const income = document.createElement('div');\r\n income.style.marginBottom = '4px';\r\n income.style.color = 'white';\r\n income.id = 'CMTooltipIncome';\r\n tooltip.appendChild(income);\r\n\r\n tooltip.appendChild(TooltipCreateHeader('Bonus Cookies per Click'));\r\n tooltip.lastChild.style.display = 'none'; // eslint-disable-line no-param-reassign\r\n const click = document.createElement('div');\r\n click.style.marginBottom = '4px';\r\n click.style.color = 'white';\r\n click.style.display = 'none';\r\n click.id = 'CMTooltipCookiePerClick';\r\n tooltip.appendChild(click);\r\n\r\n tooltip.appendChild(TooltipCreateHeader('Payback Period'));\r\n const pp = document.createElement('div');\r\n pp.style.marginBottom = '4px';\r\n pp.id = 'CMTooltipPP';\r\n tooltip.appendChild(pp);\r\n\r\n tooltip.appendChild(TooltipCreateHeader('Time Left'));\r\n const time = document.createElement('div');\r\n time.id = 'CMTooltipTime';\r\n tooltip.appendChild(time);\r\n\r\n if (TooltipType === 'b') {\r\n tooltip.appendChild(TooltipCreateHeader('Production left till next achievement'));\r\n tooltip.lastChild.id = 'CMTooltipProductionLeftHeader'; // eslint-disable-line no-param-reassign\r\n const production = document.createElement('div');\r\n production.id = 'CMTooltipProductionLeft';\r\n tooltip.appendChild(production);\r\n }\r\n if (TooltipType === 'b') {\r\n tooltip.appendChild(TooltipCreateHeader('Buildings (price / PP) left till next achievement'));\r\n tooltip.lastChild.id = 'CMTooltipNextAchievementHeader'; // eslint-disable-line no-param-reassign\r\n const production = document.createElement('div');\r\n production.id = 'CMTooltipNextAchievement';\r\n tooltip.appendChild(production);\r\n }\r\n}\r\n","import GetCPS from '../../Disp/HelperFunctions/GetCPS';\r\nimport {\r\n ColourBlue,\r\n ColourGray,\r\n ColourGreen,\r\n ColourOrange,\r\n ColourPurple,\r\n ColourRed,\r\n ColourYellow,\r\n} from '../../Disp/VariablesAndData';\r\nimport { CacheMinPP, CachePPArray } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions return the colour assosciated with the given pp value\r\n * It is called by CM.Cache.CacheBuildingsPP(), CM.Cache.CacheBuildingsBulkPP() and CM.Cache.CacheUpgradePP()\r\n * @params\t{object}\tobj\t\tThe obj of which the pp value should be checked\r\n * @params\t{number}\tprice\tThe price of the object\r\n * @returns {string}\tcolour\tThe colour assosciated with the pp value\r\n */\r\nexport default function ColourOfPP(me, price) {\r\n let colour = '';\r\n // Colour based on PP\r\n if (me.pp <= 0 || me.pp === Infinity) colour = ColourGray;\r\n else if (me.pp < CacheMinPP) colour = ColourBlue;\r\n else if (me.pp === CacheMinPP) colour = ColourGreen;\r\n else if (me.pp < CachePPArray[10][0]) colour = ColourYellow;\r\n else if (me.pp < CachePPArray[20][0]) colour = ColourOrange;\r\n else if (me.pp < CachePPArray[30][0]) colour = ColourRed;\r\n else colour = ColourPurple;\r\n\r\n // Colour based on price in terms of CPS\r\n if (\r\n Number(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPSecondsLowerLimit,\r\n ) !== 0\r\n ) {\r\n if (\r\n price / GetCPS() <\r\n Number(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPSecondsLowerLimit,\r\n )\r\n )\r\n colour = ColourBlue;\r\n }\r\n // Colour based on being able to purchase\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPOnlyConsiderBuyable) {\r\n if (price - Game.cookies > 0) colour = ColourRed;\r\n }\r\n return colour;\r\n}\r\n","/**\r\n * This function returns the current CPS buff\r\n * @returns {number}\tmult\tThe multiplier\r\n */\r\nexport default function GetCPSBuffMult() {\r\n let mult = 1;\r\n Object.keys(Game.buffs).forEach((i) => {\r\n if (typeof Game.buffs[i].multCpS !== 'undefined') mult *= Game.buffs[i].multCpS;\r\n });\r\n return mult;\r\n}\r\n","import { SimAchievements, SimAchievementsOwned } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This function \"wins\" an achievement in the current sim data\r\n * It functions similarly to Game.Win()\r\n * It is not created by CM.Sim.CreateSimFunctions() in order to avoid spamming pop-ups upon winning\r\n * @param\t{string}\twhat\tName of the achievement\r\n */\r\nexport default function SimWin(what) {\r\n if (SimAchievements[what]) {\r\n if (SimAchievements[what].won === 0) {\r\n SimAchievements[what].won = 1;\r\n if (Game.Achievements[what].pool !== 'shadow') SimAchievementsOwned += 1;\r\n }\r\n }\r\n}\r\n","import GetCPSBuffMult from '../../Cache/CPS/GetCPSBuffMult';\r\nimport { CacheCentEgg } from '../../Cache/VariablesAndData';\r\nimport { CenturyDateAtBeginLoop, CycliusDateAtBeginLoop } from '../../Main/VariablesAndData';\r\nimport SimAuraMult from '../ReplacedGameFunctions/SimAuraMult';\r\nimport SimEff from '../ReplacedGameFunctions/SimEff';\r\nimport SimGetHeavenlyMultiplier from '../ReplacedGameFunctions/SimGetHeavenlyMultiplier';\r\nimport SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport SimHasGod from '../ReplacedGameFunctions/SimHasGod';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport {\r\n SimAchievementsOwned,\r\n SimCookiesPs,\r\n SimCookiesPsRaw, // eslint-disable-line no-unused-vars\r\n SimEffs, // eslint-disable-line no-unused-vars\r\n SimHeavenlyPower,\r\n SimObjects,\r\n SimPrestige,\r\n SimUpgrades,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates the CPS of the current \"sim data\"\r\n * It is similar to Game.CalculateGains()\r\n * It is called at the start of any function that simulates certain behaviour or actions\r\n * @global\t{number}\tCM.Sim.cookiesPs\tThe CPS of the current sim data\r\n */\r\nexport default function CalculateGains() {\r\n SimCookiesPs = 0;\r\n let mult = 1;\r\n // Include minigame effects\r\n const effs = {};\r\n Object.keys(Game.Objects).forEach((i) => {\r\n if (Game.Objects[i].minigameLoaded && Game.Objects[i].minigame.effs) {\r\n const myEffs = Game.Objects[i].minigame.effs;\r\n Object.keys(myEffs).forEach((ii) => {\r\n if (effs[ii]) effs[ii] *= myEffs[ii];\r\n else effs[ii] = myEffs[ii];\r\n });\r\n }\r\n });\r\n SimEffs = effs;\r\n\r\n if (Game.ascensionMode !== 1)\r\n mult += parseFloat(SimPrestige) * 0.01 * SimHeavenlyPower * SimGetHeavenlyMultiplier();\r\n\r\n mult *= SimEff('cps');\r\n\r\n if (SimHas('Heralds') && Game.ascensionMode !== 1) mult *= 1 + 0.01 * Game.heralds;\r\n\r\n Object.keys(Game.cookieUpgrades).forEach((i) => {\r\n const me = Game.cookieUpgrades[i];\r\n if (SimHas(me.name)) {\r\n // Some upgrades have a function as .power (notably the valentine cookies)\r\n // CM.Sim.InitialBuildingData has changed to use CM.Sim.Has instead of Game.Has etc.\r\n // Therefore this call is to the .power of the Sim.Object\r\n if (typeof me.power === 'function') {\r\n mult *= 1 + SimUpgrades[me.name].power(SimUpgrades[me.name]) * 0.01;\r\n } else mult *= 1 + me.power * 0.01;\r\n }\r\n });\r\n\r\n if (SimHas('Specialized chocolate chips')) mult *= 1.01;\r\n if (SimHas('Designer cocoa beans')) mult *= 1.02;\r\n if (SimHas('Underworld ovens')) mult *= 1.03;\r\n if (SimHas('Exotic nuts')) mult *= 1.04;\r\n if (SimHas('Arcane sugar')) mult *= 1.05;\r\n\r\n if (SimHas('Increased merriness')) mult *= 1.15;\r\n if (SimHas('Improved jolliness')) mult *= 1.15;\r\n if (SimHas('A lump of coal')) mult *= 1.01;\r\n if (SimHas('An itchy sweater')) mult *= 1.01;\r\n if (SimHas(\"Santa's dominion\")) mult *= 1.2;\r\n\r\n if (SimHas('Fortune #100')) mult *= 1.01;\r\n if (SimHas('Fortune #101')) mult *= 1.07;\r\n\r\n if (SimHas('Dragon scale')) mult *= 1.03;\r\n\r\n // Check effect of chosen Gods\r\n let buildMult = 1;\r\n if (SimHasGod) {\r\n let godLvl = SimHasGod('asceticism');\r\n if (godLvl === 1) mult *= 1.15;\r\n else if (godLvl === 2) mult *= 1.1;\r\n else if (godLvl === 3) mult *= 1.05;\r\n\r\n godLvl = SimHasGod('ages');\r\n if (godLvl === 1)\r\n mult *= 1 + 0.15 * Math.sin((CycliusDateAtBeginLoop / 1000 / (60 * 60 * 3)) * Math.PI * 2);\r\n else if (godLvl === 2)\r\n mult *= 1 + 0.15 * Math.sin((CycliusDateAtBeginLoop / 1000 / (60 * 60 * 12)) * Math.PI * 2);\r\n else if (godLvl === 3)\r\n mult *= 1 + 0.15 * Math.sin((CycliusDateAtBeginLoop / 1000 / (60 * 60 * 24)) * Math.PI * 2);\r\n\r\n godLvl = SimHasGod('decadence');\r\n if (godLvl === 1) buildMult *= 0.93;\r\n else if (godLvl === 2) buildMult *= 0.95;\r\n else if (godLvl === 3) buildMult *= 0.98;\r\n\r\n godLvl = SimHasGod('industry');\r\n if (godLvl === 1) buildMult *= 1.1;\r\n else if (godLvl === 2) buildMult *= 1.06;\r\n else if (godLvl === 3) buildMult *= 1.03;\r\n\r\n godLvl = SimHasGod('labor');\r\n if (godLvl === 1) buildMult *= 0.97;\r\n else if (godLvl === 2) buildMult *= 0.98;\r\n else if (godLvl === 3) buildMult *= 0.99;\r\n }\r\n\r\n if (SimHas(\"Santa's legacy\")) mult *= 1 + (Game.santaLevel + 1) * 0.03;\r\n\r\n const milkProgress = SimAchievementsOwned / 25;\r\n let milkMult = 1;\r\n if (SimHas(\"Santa's milk and cookies\")) milkMult *= 1.05;\r\n // if (CM.Sim.hasAura('Breath of Milk')) milkMult *= 1.05;\r\n milkMult *= 1 + SimAuraMult('Breath of Milk') * 0.05;\r\n if (SimHasGod) {\r\n const godLvl = SimHasGod('mother');\r\n if (godLvl === 1) milkMult *= 1.1;\r\n else if (godLvl === 2) milkMult *= 1.05;\r\n else if (godLvl === 3) milkMult *= 1.03;\r\n }\r\n milkMult *= SimEff('milk');\r\n\r\n let catMult = 1;\r\n\r\n if (SimHas('Kitten helpers')) catMult *= 1 + milkProgress * 0.1 * milkMult;\r\n if (SimHas('Kitten workers')) catMult *= 1 + milkProgress * 0.125 * milkMult;\r\n if (SimHas('Kitten engineers')) catMult *= 1 + milkProgress * 0.15 * milkMult;\r\n if (SimHas('Kitten overseers')) catMult *= 1 + milkProgress * 0.175 * milkMult;\r\n if (SimHas('Kitten managers')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten accountants')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten specialists')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten experts')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten consultants')) catMult *= 1 + milkProgress * 0.2 * milkMult;\r\n if (SimHas('Kitten assistants to the regional manager'))\r\n catMult *= 1 + milkProgress * 0.175 * milkMult;\r\n if (SimHas('Kitten marketeers')) catMult *= 1 + milkProgress * 0.15 * milkMult;\r\n if (SimHas('Kitten analysts')) catMult *= 1 + milkProgress * 0.125 * milkMult;\r\n if (SimHas('Kitten executives')) catMult *= 1 + milkProgress * 0.115 * milkMult;\r\n if (SimHas('Kitten admins')) catMult *= 1 + milkProgress * 0.11 * milkMult;\r\n if (SimHas('Kitten strategists')) catMult *= 1 + milkProgress * 0.105 * milkMult;\r\n if (SimHas('Kitten angels')) catMult *= 1 + milkProgress * 0.1 * milkMult;\r\n if (SimHas('Fortune #103')) catMult *= 1 + milkProgress * 0.05 * milkMult;\r\n\r\n Object.keys(SimObjects).forEach((i) => {\r\n const me = SimObjects[i];\r\n let storedCps = me.cps(me);\r\n if (Game.ascensionMode !== 1) storedCps *= (1 + me.level * 0.01) * buildMult;\r\n if (me.name === 'Grandma' && SimHas('Milkhelp® lactose intolerance relief tablets'))\r\n storedCps *= 1 + 0.05 * milkProgress * milkMult;\r\n SimCookiesPs += me.amount * storedCps;\r\n });\r\n\r\n if (SimHas('\"egg\"')) SimCookiesPs += 9; // \"egg\"\r\n\r\n mult *= catMult;\r\n\r\n let eggMult = 1;\r\n if (SimHas('Chicken egg')) eggMult *= 1.01;\r\n if (SimHas('Duck egg')) eggMult *= 1.01;\r\n if (SimHas('Turkey egg')) eggMult *= 1.01;\r\n if (SimHas('Quail egg')) eggMult *= 1.01;\r\n if (SimHas('Robin egg')) eggMult *= 1.01;\r\n if (SimHas('Ostrich egg')) eggMult *= 1.01;\r\n if (SimHas('Cassowary egg')) eggMult *= 1.01;\r\n if (SimHas('Salmon roe')) eggMult *= 1.01;\r\n if (SimHas('Frogspawn')) eggMult *= 1.01;\r\n if (SimHas('Shark egg')) eggMult *= 1.01;\r\n if (SimHas('Turtle egg')) eggMult *= 1.01;\r\n if (SimHas('Ant larva')) eggMult *= 1.01;\r\n if (SimHas('Century egg')) {\r\n // The boost increases a little every day, with diminishing returns up to +10% on the 100th day\r\n let day =\r\n (Math.floor((CenturyDateAtBeginLoop - Game.startDate) / 1000 / 10) * 10) / 60 / 60 / 24;\r\n day = Math.min(day, 100);\r\n // Sets a Cache value to be displayed in the Stats page, could be moved...\r\n CacheCentEgg = 1 + (1 - (1 - day / 100) ** 3) * 0.1;\r\n eggMult *= CacheCentEgg;\r\n }\r\n mult *= eggMult;\r\n\r\n if (SimHas('Sugar baking')) mult *= 1 + Math.min(100, Game.lumps) * 0.01;\r\n\r\n // if (CM.Sim.hasAura('Radiant Appetite')) mult *= 2;\r\n mult *= 1 + SimAuraMult('Radiant Appetite');\r\n\r\n const rawCookiesPs = SimCookiesPs * mult;\r\n Object.keys(Game.CpsAchievements).forEach((i) => {\r\n if (rawCookiesPs >= Game.CpsAchievements[i].threshold) SimWin(Game.CpsAchievements[i].name);\r\n });\r\n\r\n SimCookiesPsRaw = rawCookiesPs;\r\n\r\n const { n } = Game.shimmerTypes.golden;\r\n const auraMult = SimAuraMult(\"Dragon's Fortune\");\r\n for (let i = 0; i < n; i++) {\r\n mult *= 1 + auraMult * 1.23;\r\n }\r\n\r\n const name = Game.bakeryName.toLowerCase();\r\n if (name === 'orteil') mult *= 0.99;\r\n else if (name === 'ortiel') mult *= 0.98;\r\n\r\n if (SimHas('Elder Covenant')) mult *= 0.95;\r\n\r\n if (SimHas('Golden switch [off]')) {\r\n let goldenSwitchMult = 1.5;\r\n if (SimHas('Residual luck')) {\r\n const upgrades = Game.goldenCookieUpgrades;\r\n Object.keys(upgrades).forEach((i) => {\r\n if (SimHas(upgrades[i])) goldenSwitchMult += 0.1;\r\n });\r\n }\r\n mult *= goldenSwitchMult;\r\n }\r\n if (SimHas('Shimmering veil [off]')) {\r\n let veilMult = 0.5;\r\n if (SimHas('Reinforced membrane')) veilMult += 0.1;\r\n if (SimHas('Delicate touch')) veilMult += 0.05;\r\n if (SimHas('Steadfast murmur')) veilMult += 0.05;\r\n if (SimHas('Glittering edge')) veilMult += 0.05;\r\n mult *= 1 + veilMult;\r\n }\r\n\r\n if (SimHas('Magic shenanigans')) mult *= 1000;\r\n if (SimHas('Occult obstruction')) mult *= 0;\r\n\r\n SimCookiesPs = Game.runModHookOnValue('cps', SimCookiesPs);\r\n\r\n mult *= GetCPSBuffMult();\r\n\r\n SimCookiesPs *= mult;\r\n\r\n // if (Game.hasBuff('Cursed finger')) Game.cookiesPs = 0;\r\n}\r\n","import SimAuraMult from './SimAuraMult';\r\nimport SimHas from './SimHas';\r\nimport SimHasGod from './SimHasGod';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.GetHeavenlyMultiplier but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimGetHeavenlyMultiplier() {\r\n let heavenlyMult = 0;\r\n if (SimHas('Heavenly chip secret')) heavenlyMult += 0.05;\r\n if (SimHas('Heavenly cookie stand')) heavenlyMult += 0.2;\r\n if (SimHas('Heavenly bakery')) heavenlyMult += 0.25;\r\n if (SimHas('Heavenly confectionery')) heavenlyMult += 0.25;\r\n if (SimHas('Heavenly key')) heavenlyMult += 0.25;\r\n // if (SimHasAura('Dragon God')) heavenlyMult*=1.05;\r\n heavenlyMult *= 1 + SimAuraMult('Dragon God') * 0.05;\r\n if (SimHas('Lucky digit')) heavenlyMult *= 1.01;\r\n if (SimHas('Lucky number')) heavenlyMult *= 1.01;\r\n if (SimHas('Lucky payout')) heavenlyMult *= 1.01;\r\n if (Game.hasGod) {\r\n const godLvl = SimHasGod('creation');\r\n if (godLvl === 1) heavenlyMult *= 0.7;\r\n else if (godLvl === 2) heavenlyMult *= 0.8;\r\n else if (godLvl === 3) heavenlyMult *= 0.9;\r\n }\r\n return heavenlyMult;\r\n}\r\n","/** Data copied directly from the game */\r\n\r\n/** Array of the names of all fortune cookies obtainable from the ticker */\r\nexport const Fortunes = [\r\n 'Fortune #001',\r\n 'Fortune #002',\r\n 'Fortune #003',\r\n 'Fortune #004',\r\n 'Fortune #005',\r\n 'Fortune #006',\r\n 'Fortune #007',\r\n 'Fortune #008',\r\n 'Fortune #009',\r\n 'Fortune #010',\r\n 'Fortune #011',\r\n 'Fortune #012',\r\n 'Fortune #013',\r\n 'Fortune #014',\r\n 'Fortune #015',\r\n 'Fortune #016',\r\n 'Fortune #017',\r\n 'Fortune #018',\r\n 'Fortune #019',\r\n 'Fortune #020',\r\n 'Fortune #100',\r\n 'Fortune #101',\r\n 'Fortune #102',\r\n 'Fortune #103',\r\n 'Fortune #104',\r\n];\r\n\r\n/** Array of the names of all Halloween cookies */\r\nexport const HalloCookies = [\r\n 'Skull cookies',\r\n 'Ghost cookies',\r\n 'Bat cookies',\r\n 'Slime cookies',\r\n 'Pumpkin cookies',\r\n 'Eyeball cookies',\r\n 'Spider cookies',\r\n];\r\n\r\n/** Array of the names of all Christmas cookies */\r\nexport const ChristCookies = [\r\n 'Christmas tree biscuits',\r\n 'Snowflake biscuits',\r\n 'Snowman biscuits',\r\n 'Holly biscuits',\r\n 'Candy cane biscuits',\r\n 'Bell biscuits',\r\n 'Present biscuits',\r\n];\r\n\r\n/** Array of the names of all Valentine cookies */\r\nexport const ValCookies = [\r\n 'Pure heart biscuits',\r\n 'Ardent heart biscuits',\r\n 'Sour heart biscuits',\r\n 'Weeping heart biscuits',\r\n 'Golden heart biscuits',\r\n 'Eternal heart biscuits',\r\n 'Prism heart biscuits',\r\n];\r\n\r\n/** Array of the names of all plant drops */\r\nexport const PlantDrops = [\r\n 'Elderwort biscuits',\r\n 'Bakeberry cookies',\r\n 'Duketater cookies',\r\n 'Green yeast digestives',\r\n 'Wheat slims',\r\n 'Fern tea',\r\n 'Ichor syrup',\r\n];\r\n\r\n/** All possible effects plants and other items can have with a display-title */\r\nexport const Effects = {\r\n buildingCost: 'Building prices',\r\n click: 'Cookies per click',\r\n cps: 'Total CPS',\r\n cursorCps: 'Cursor CPS',\r\n goldenCookieDur: 'Golden cookie duration',\r\n goldenCookieEffDur: 'Golden cookie effect duration',\r\n goldenCookieFreq: 'Golden cookie frequency',\r\n goldenCookieGain: 'Golden cookie gains',\r\n grandmaCps: 'Grandma CPS',\r\n itemDrops: 'Random item drop chance',\r\n milk: 'Effect from milk',\r\n reindeerDur: 'Reindeer duration',\r\n reindeerFreq: 'Reindeer frequency',\r\n reindeerGain: 'Reindeer gains',\r\n upgradeCost: 'Upgrade prices',\r\n wrathCookieDur: 'Wrath cookie duration',\r\n wrathCookieEffDur: 'Wrath cookie effect duration',\r\n wrathCookieFreq: 'Wrath cookie frequency',\r\n wrathCookieGain: 'Wrath cookie gains',\r\n wrinklerEat: 'Wrinkler ',\r\n wrinklerSpawn: 'Wrinkler spawn frequency',\r\n};\r\n","import { SimAchievements } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions creates functions similarly to Game.HasAchiev but checks Sim Data instead of Game Data\r\n */\r\nexport default function SimHasAchiev(what) {\r\n return SimAchievements[what] ? SimAchievements[what].won : 0;\r\n}\r\n","import { ChristCookies, HalloCookies } from '../../Data/Gamedata';\r\nimport SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport SimHasAchiev from '../ReplacedGameFunctions/SimHasAchiev';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport { SimObjects, SimUpgradesOwned } from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates if any special achievements have been obtained\r\n * If so it SimWin()'s them and the caller function will know to recall CM.Sim.CalculateGains()\r\n * It is called at the end of any functions that simulates certain behaviour\r\n */\r\nexport default function CheckOtherAchiev() {\r\n let grandmas = 0;\r\n Object.keys(Game.GrandmaSynergies).forEach((i) => {\r\n if (SimHas(Game.GrandmaSynergies[i])) grandmas += 1;\r\n });\r\n if (!SimHasAchiev('Elder') && grandmas >= 7) SimWin('Elder');\r\n if (!SimHasAchiev('Veteran') && grandmas >= 14) SimWin('Veteran');\r\n\r\n let buildingsOwned = 0;\r\n let mathematician = 1;\r\n let base10 = 1;\r\n let minAmount = 100000;\r\n Object.keys(SimObjects).forEach((i) => {\r\n buildingsOwned += SimObjects[i].amount;\r\n minAmount = Math.min(SimObjects[i].amount, minAmount);\r\n if (!SimHasAchiev('Mathematician')) {\r\n if (\r\n SimObjects[i].amount <\r\n Math.min(128, 2 ** (Game.ObjectsById.length - Game.Objects[i].id - 1))\r\n )\r\n mathematician = 0;\r\n }\r\n if (!SimHasAchiev('Base 10')) {\r\n if (SimObjects[i].amount < (Game.ObjectsById.length - Game.Objects[i].id) * 10) base10 = 0;\r\n }\r\n });\r\n if (minAmount >= 1) SimWin('One with everything');\r\n if (mathematician === 1) SimWin('Mathematician');\r\n if (base10 === 1) SimWin('Base 10');\r\n if (minAmount >= 100) SimWin('Centennial');\r\n if (minAmount >= 150) SimWin('Centennial and a half');\r\n if (minAmount >= 200) SimWin('Bicentennial');\r\n if (minAmount >= 250) SimWin('Bicentennial and a half');\r\n if (minAmount >= 300) SimWin('Tricentennial');\r\n if (minAmount >= 350) SimWin('Tricentennial and a half');\r\n if (minAmount >= 400) SimWin('Quadricentennial');\r\n if (minAmount >= 450) SimWin('Quadricentennial and a half');\r\n if (minAmount >= 500) SimWin('Quincentennial');\r\n if (minAmount >= 550) SimWin('Quincentennial and a half');\r\n if (minAmount >= 600) SimWin('Sexcentennial');\r\n if (minAmount >= 650) SimWin('Sexcentennial and a half');\r\n if (minAmount >= 700) SimWin('Septcentennial');\r\n\r\n if (buildingsOwned >= 100) SimWin('Builder');\r\n if (buildingsOwned >= 500) SimWin('Architect');\r\n if (buildingsOwned >= 1000) SimWin('Engineer');\r\n if (buildingsOwned >= 2500) SimWin('Lord of Constructs');\r\n if (buildingsOwned >= 5000) SimWin('Grand design');\r\n if (buildingsOwned >= 7500) SimWin('Ecumenopolis');\r\n if (buildingsOwned >= 10000) SimWin('Myriad');\r\n\r\n if (SimUpgradesOwned >= 20) SimWin('Enhancer');\r\n if (SimUpgradesOwned >= 50) SimWin('Augmenter');\r\n if (SimUpgradesOwned >= 100) SimWin('Upgrader');\r\n if (SimUpgradesOwned >= 200) SimWin('Lord of Progress');\r\n if (SimUpgradesOwned >= 300) SimWin('The full picture');\r\n if (SimUpgradesOwned >= 400) SimWin(\"When there's nothing left to add\");\r\n if (SimUpgradesOwned >= 500) SimWin('Kaizen');\r\n if (SimUpgradesOwned >= 600) SimWin('Beyond quality');\r\n if (SimUpgradesOwned >= 700) SimWin(\"Oft we mar what's well\");\r\n\r\n if (buildingsOwned >= 4000 && SimUpgradesOwned >= 300) SimWin('Polymath');\r\n if (buildingsOwned >= 8000 && SimUpgradesOwned >= 400) SimWin('Renaissance baker');\r\n\r\n if (SimObjects.Cursor.amount + SimObjects.Grandma.amount >= 777) SimWin('The elder scrolls');\r\n\r\n let hasAllHalloCook = true;\r\n Object.keys(HalloCookies).forEach((i) => {\r\n if (!SimHas(HalloCookies[i])) hasAllHalloCook = false;\r\n });\r\n if (hasAllHalloCook) SimWin('Spooky cookies');\r\n\r\n let hasAllChristCook = true;\r\n Object.keys(ChristCookies).forEach((i) => {\r\n if (!SimHas(ChristCookies[i])) hasAllChristCook = false;\r\n });\r\n if (hasAllChristCook) SimWin('Let it snow');\r\n\r\n if (SimHas('Fortune cookies')) {\r\n const list = Game.Tiers.fortune.upgrades;\r\n let fortunes = 0;\r\n Object.keys(list).forEach((i) => {\r\n if (SimHas(list[i].name)) fortunes += 1;\r\n });\r\n if (fortunes >= list.length) SimWin('O Fortuna');\r\n }\r\n}\r\n","import CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport { SimAchievementsOwned, SimCookiesPs, SimObjects } from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates the bonus income of buying a building\r\n * It is called by CM.Cache.CacheBuildingIncome()\r\n * @param\t{string}\tbuilding\tThe name of the building to be bought\r\n * @param\t{number}\tamount\t\tThe amount to be bought\r\n * @returns {number}\t\t\t\tThe bonus income of the building\r\n */\r\nexport default function BuyBuildingsBonusIncome(building, amount) {\r\n CopyData();\r\n SimObjects[building].amount += amount;\r\n const me = SimObjects[building];\r\n\r\n if (building === 'Cursor') {\r\n if (me.amount >= 1) SimWin('Click');\r\n if (me.amount >= 2) SimWin('Double-click');\r\n if (me.amount >= 50) SimWin('Mouse wheel');\r\n if (me.amount >= 100) SimWin('Of Mice and Men');\r\n if (me.amount >= 200) SimWin('The Digital');\r\n if (me.amount >= 300) SimWin('Extreme polydactyly');\r\n if (me.amount >= 400) SimWin('Dr. T');\r\n if (me.amount >= 500) SimWin('Thumbs, phalanges, metacarpals');\r\n if (me.amount >= 600) SimWin('With her finger and her thumb');\r\n if (me.amount >= 700) SimWin('Gotta hand it to you');\r\n if (me.amount >= 800) SimWin(\"The devil's workshop\");\r\n if (me.amount >= 900) SimWin('All on deck');\r\n if (me.amount >= 1000) SimWin('A round of applause');\r\n } else {\r\n Object.keys(Game.Objects[me.name].tieredAchievs).forEach((j) => {\r\n if (me.amount >= Game.Tiers[Game.Objects[me.name].tieredAchievs[j].tier].achievUnlock) {\r\n SimWin(Game.Objects[me.name].tieredAchievs[j].name);\r\n }\r\n });\r\n }\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n\r\n return SimCookiesPs - Game.cookiesPs;\r\n}\r\n","/**\r\n * This function calculates the time it takes to reach a certain magic level\r\n * @param\t{number}\tcurrentMagic\t\tThe current magic level\r\n * @param\t{number}\tmaxMagic\t\t\tThe user's max magic level\r\n * @param\t{number}\ttargetMagic\t\t\tThe target magic level\r\n * @returns\t{number}\tcount / Game.fps\tThe time it takes to reach targetMagic\r\n */\r\nexport default function CalculateGrimoireRefillTime(currentMagic, maxMagic, targetMagic) {\r\n let magic = currentMagic;\r\n let count = 0;\r\n while (magic < targetMagic) {\r\n magic += Math.max(0.002, (magic / Math.max(maxMagic, 100)) ** 0.5) * 0.002;\r\n count += 1;\r\n }\r\n return count / Game.fps;\r\n}\r\n","/**\r\n * This function toggles the position of the warnings created by CM.Disp.TooltipCreateWarningSection()\r\n * It is called by a change in CM.Options.ToolWarnPos\r\n * and upon creation of the warning tooltip by CM.Disp.UpdateTooltipWarnings()\r\n */\r\nexport default function ToggleToolWarnPos() {\r\n if (l('CMDispTooltipWarningParent') !== null) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos === 0) {\r\n l('CMDispTooltipWarningParent').style.top = 'auto';\r\n l('CMDispTooltipWarningParent').style.margin = '4px -4px';\r\n l('CMDispTooltipWarningParent').style.padding = '3px 4px';\r\n } else {\r\n l('CMDispTooltipWarningParent').style.right = 'auto';\r\n l('CMDispTooltipWarningParent').style.margin = '4px';\r\n l('CMDispTooltipWarningParent').style.padding = '4px 3px';\r\n }\r\n }\r\n}\r\n","import CopyData from '../../Sim/SimulationData/CopyData';\r\nimport { TooltipName, TooltipType } from '../VariablesAndData';\r\nimport * as Create from './CreateTooltip';\r\nimport Building from './TypesOfTooltips/Building';\r\nimport GardenPlots from './TypesOfTooltips/GardenPlots';\r\nimport StockMarket from './TypesOfTooltips/StockMarket';\r\nimport Grimoire from './TypesOfTooltips/Grimoire';\r\nimport HarvestAll from './TypesOfTooltips/HarvestAll';\r\nimport PantheonGods from './TypesOfTooltips/PantheonGods';\r\nimport SugarLump from './TypesOfTooltips/SugarLump';\r\nimport Upgrade from './TypesOfTooltips/Upgrade';\r\nimport Warnings from './TypesOfTooltips/Warnings';\r\nimport WrinklerButton from './TypesOfTooltips/WrinklerButton';\r\n\r\n/**\r\n * This function updates the sections of the tooltips created by CookieMonster\r\n */\r\nexport default function UpdateTooltips() {\r\n CopyData();\r\n if (l('tooltipAnchor').style.display !== 'none' && l('CMTooltipArea')) {\r\n l('CMTooltipArea').innerHTML = '';\r\n const tooltipBox = Create.TooltipCreateTooltipBox();\r\n l('CMTooltipArea').appendChild(tooltipBox);\r\n\r\n if (TooltipType === 'b') {\r\n Building();\r\n } else if (TooltipType === 'u') {\r\n Upgrade();\r\n } else if (TooltipType === 's') {\r\n SugarLump();\r\n } else if (TooltipType === 'g') {\r\n Grimoire();\r\n } else if (TooltipType === 'p') {\r\n GardenPlots();\r\n } else if (TooltipType === 'ha') {\r\n HarvestAll();\r\n } else if (TooltipType === 'sm') {\r\n StockMarket();\r\n } else if (TooltipType === 'wb') {\r\n WrinklerButton();\r\n } else if (TooltipType === 'pag' || (TooltipType === 'pas' && TooltipName[1] !== -1)) {\r\n PantheonGods();\r\n }\r\n Warnings();\r\n } else if (l('CMTooltipArea') === null) {\r\n // Remove warnings if its a basic tooltip\r\n if (l('CMDispTooltipWarningParent') !== null) {\r\n l('CMDispTooltipWarningParent').remove();\r\n }\r\n }\r\n}\r\n","import ColourOfPP from '../../../Cache/PP/ColourOfPP';\r\nimport {\r\n CacheObjects1,\r\n CacheObjects10,\r\n CacheObjects100,\r\n CacheObjectsNextAchievement,\r\n} from '../../../Cache/VariablesAndData';\r\n\r\nimport BuyBuildingsBonusIncome from '../../../Sim/SimulationEvents/BuyBuildingBonusIncome';\r\nimport { SimObjects } from '../../../Sim/VariablesAndData';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../BeautifyAndFormatting/FormatTime';\r\nimport GetTimeColour from '../../BeautifyAndFormatting/GetTimeColour';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../../HelperFunctions/GetWrinkConfigBank';\r\nimport {\r\n ColourTextPre,\r\n LastTargetTooltipBuilding,\r\n TooltipBonusIncome,\r\n TooltipName,\r\n TooltipPrice,\r\n} from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Building tooltips\r\n */\r\nexport default function Building() {\r\n let target;\r\n if (Game.buyMode === 1) {\r\n LastTargetTooltipBuilding = target;\r\n } else {\r\n target = LastTargetTooltipBuilding;\r\n }\r\n if (Game.buyBulk === 1) target = CacheObjects1;\r\n else if (Game.buyBulk === 10) target = CacheObjects10;\r\n else if (Game.buyBulk === 100) target = CacheObjects100;\r\n\r\n TooltipPrice = Game.Objects[TooltipName].bulkPrice;\r\n TooltipBonusIncome = target[TooltipName].bonus;\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade === 1 &&\r\n Game.buyMode === 1\r\n ) {\r\n const tooltipBox = l('CMTooltipBorder');\r\n Create.TooltipCreateCalculationSection(tooltipBox);\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade ===\r\n 1 &&\r\n Game.buyMode === 1\r\n ) {\r\n l('CMTooltipIncome').textContent = Beautify(TooltipBonusIncome, 2);\r\n const increase = Math.round((TooltipBonusIncome / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n l('CMTooltipIncome').textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n l('CMTooltipIncome').textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n l('CMTooltipBorder').className = ColourTextPre + target[TooltipName].colour;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime)\r\n l('CMTooltipPP').textContent = FormatTime(target[TooltipName].pp);\r\n else l('CMTooltipPP').textContent = Beautify(target[TooltipName].pp, 2);\r\n l('CMTooltipPP').className = ColourTextPre + target[TooltipName].colour;\r\n const timeColour = GetTimeColour(\r\n (TooltipPrice - (Game.cookies + GetWrinkConfigBank())) / GetCPS(),\r\n );\r\n l('CMTooltipTime').textContent = timeColour.text;\r\n if (timeColour.text === 'Done!' && Game.cookies < target[TooltipName].price) {\r\n l('CMTooltipTime').textContent = `${timeColour.text} (with Wrink)`;\r\n } else l('CMTooltipTime').textContent = timeColour.text;\r\n l('CMTooltipTime').className = ColourTextPre + timeColour.colour;\r\n }\r\n\r\n // Add \"production left till next achievement\"-bar\r\n l('CMTooltipProductionLeftHeader').style.display = 'none';\r\n l('CMTooltipTime').style.marginBottom = '0px';\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n for (const i of Object.keys(Game.Objects[TooltipName].productionAchievs)) {\r\n if (!Game.HasAchiev(Game.Objects[TooltipName].productionAchievs[i].achiev.name)) {\r\n const nextProductionAchiev = Game.Objects[TooltipName].productionAchievs[i];\r\n l('CMTooltipTime').style.marginBottom = '4px';\r\n l('CMTooltipProductionLeftHeader').style.display = '';\r\n l('CMTooltipProductionLeft').className = `ProdAchievement${TooltipName}`;\r\n l('CMTooltipProductionLeft').textContent = Beautify(\r\n nextProductionAchiev.pow - SimObjects[TooltipName].totalCookies,\r\n 15,\r\n );\r\n l('CMTooltipProductionLeft').style.color = 'white';\r\n break;\r\n }\r\n }\r\n\r\n const ObjectsTillNext = CacheObjectsNextAchievement[TooltipName];\r\n if (ObjectsTillNext.AmountNeeded < 101) {\r\n l('CMTooltipProductionLeft').style.marginBottom = '4px';\r\n l('CMTooltipNextAchievementHeader').style.display = '';\r\n\r\n let PPOfAmount;\r\n if (Game.cookiesPs) {\r\n PPOfAmount =\r\n Math.max(ObjectsTillNext.price - (Game.cookies + GetWrinkConfigBank()), 0) /\r\n Game.cookiesPs +\r\n ObjectsTillNext.price /\r\n BuyBuildingsBonusIncome(TooltipName, ObjectsTillNext.AmountNeeded);\r\n } else\r\n PPOfAmount =\r\n ObjectsTillNext.price /\r\n BuyBuildingsBonusIncome(TooltipName, ObjectsTillNext.AmountNeeded);\r\n\r\n l('CMTooltipNextAchievement').textContent = `${Beautify(\r\n ObjectsTillNext.AmountNeeded,\r\n )} / ${Beautify(ObjectsTillNext.price)} / `;\r\n l('CMTooltipNextAchievement').style.color = 'white';\r\n const PPFrag = document.createElement('span');\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime)\r\n PPFrag.textContent = FormatTime(PPOfAmount);\r\n else PPFrag.textContent = Beautify(PPOfAmount);\r\n PPFrag.className = ColourTextPre + ColourOfPP({ pp: PPOfAmount }, ObjectsTillNext.price);\r\n l('CMTooltipNextAchievement').appendChild(PPFrag);\r\n } else {\r\n l('CMTooltipNextAchievementHeader').style.display = 'none';\r\n l('CMTooltipProductionLeft').style.marginBottom = '0px';\r\n }\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import { CacheLastChoEgg, CacheUpgrades } from '../../../Cache/VariablesAndData';\r\n\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../BeautifyAndFormatting/FormatTime';\r\nimport GetTimeColour from '../../BeautifyAndFormatting/GetTimeColour';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../../HelperFunctions/GetWrinkConfigBank';\r\nimport {\r\n ColourTextPre,\r\n TooltipBonusIncome,\r\n TooltipBonusMouse,\r\n TooltipName,\r\n TooltipPrice,\r\n} from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Upgrade tooltips\r\n */\r\nexport default function Upgrade() {\r\n const tooltipBox = l('CMTooltipBorder');\r\n Create.TooltipCreateCalculationSection(tooltipBox);\r\n\r\n TooltipBonusIncome = CacheUpgrades[Game.UpgradesInStore[TooltipName].name].bonus;\r\n TooltipPrice = Game.Upgrades[Game.UpgradesInStore[TooltipName].name].getPrice();\r\n TooltipBonusMouse = CacheUpgrades[Game.UpgradesInStore[TooltipName].name].bonusMouse;\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipBuildUpgrade === 1\r\n ) {\r\n l('CMTooltipIncome').textContent = Beautify(TooltipBonusIncome, 2);\r\n const increase = Math.round((TooltipBonusIncome / Game.cookiesPs) * 10000);\r\n // Don't display certain parts of tooltip if not applicable\r\n if (l('CMTooltipIncome').textContent === '0') {\r\n l('Bonus IncomeTitle').style.display = 'none';\r\n l('CMTooltipIncome').style.display = 'none';\r\n l('Payback PeriodTitle').style.display = 'none';\r\n l('CMTooltipPP').style.display = 'none';\r\n } else {\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n l('CMTooltipIncome').textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n l('CMTooltipIncome').textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n l('CMTooltipBorder').className =\r\n ColourTextPre + CacheUpgrades[Game.UpgradesInStore[TooltipName].name].colour;\r\n }\r\n\r\n // If clicking power upgrade\r\n if (TooltipBonusMouse) {\r\n l('CMTooltipCookiePerClick').textContent = Beautify(TooltipBonusMouse);\r\n l('CMTooltipCookiePerClick').style.display = 'block';\r\n l('CMTooltipCookiePerClick').previousSibling.style.display = 'block';\r\n }\r\n // If only a clicking power upgrade change PP to click-based period\r\n if (!TooltipBonusIncome && TooltipBonusMouse) {\r\n l('CMTooltipPP').textContent = `${Beautify(TooltipPrice / TooltipBonusMouse)} Clicks`;\r\n l('CMTooltipPP').style.color = 'white';\r\n l('Payback PeriodTitle').style.display = 'block';\r\n l('CMTooltipPP').style.display = 'block';\r\n } else {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPDisplayTime)\r\n l('CMTooltipPP').textContent = FormatTime(\r\n CacheUpgrades[Game.UpgradesInStore[TooltipName].name].pp,\r\n );\r\n else\r\n l('CMTooltipPP').textContent = Beautify(\r\n CacheUpgrades[Game.UpgradesInStore[TooltipName].name].pp,\r\n 2,\r\n );\r\n l('CMTooltipPP').className =\r\n ColourTextPre + CacheUpgrades[Game.UpgradesInStore[TooltipName].name].colour;\r\n }\r\n const timeColour = GetTimeColour(\r\n (TooltipPrice - (Game.cookies + GetWrinkConfigBank())) / GetCPS(),\r\n );\r\n l('CMTooltipTime').textContent = timeColour.text;\r\n if (\r\n timeColour.text === 'Done!' &&\r\n Game.cookies < Game.UpgradesInStore[TooltipName].getPrice()\r\n ) {\r\n l('CMTooltipTime').textContent = `${timeColour.text} (with Wrink)`;\r\n } else l('CMTooltipTime').textContent = timeColour.text;\r\n l('CMTooltipTime').className = ColourTextPre + timeColour.colour;\r\n\r\n // Add extra info to Chocolate egg tooltip\r\n if (Game.UpgradesInStore[TooltipName].name === 'Chocolate egg') {\r\n l('CMTooltipBorder').lastChild.style.marginBottom = '4px';\r\n l('CMTooltipBorder').appendChild(\r\n Create.TooltipCreateHeader('Cookies to be gained (Currently/Max)'),\r\n );\r\n const chocolate = document.createElement('div');\r\n chocolate.style.color = 'white';\r\n chocolate.textContent = `${Beautify(Game.cookies * 0.05)} / ${Beautify(CacheLastChoEgg)}`;\r\n l('CMTooltipBorder').appendChild(chocolate);\r\n }\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import GetLumpColour from '../../HelperFunctions/GetLumpColour';\r\nimport { ColourTextPre } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n/**\r\n * This function adds extra info to the Sugar Lump tooltip\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function SugarLump() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipLump === 1) {\r\n const tooltipBox = l('CMTooltipBorder');\r\n\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Current Sugar Lump'));\r\n\r\n const lumpType = document.createElement('div');\r\n lumpType.id = 'CMTooltipTime';\r\n tooltipBox.appendChild(lumpType);\r\n const lumpColour = GetLumpColour(Game.lumpCurrentType);\r\n lumpType.textContent = lumpColour.text;\r\n lumpType.className = ColourTextPre + lumpColour.colour;\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import {\r\n ColourGray,\r\n ColourGreen,\r\n ColourOrange,\r\n ColourPurple,\r\n ColourRed,\r\n ColourYellow,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function returns Name and Colour as object for sugar lump type that is given as input param.\r\n * It is called by CM.Disp.UpdateTooltipSugarLump()\r\n * @param \t{string} \t\t\t\ttype \t\t\tSugar Lump Type.\r\n * @returns {{string}, {string}}\ttext, colour\t\tAn array containing the text and display-colour of the sugar lump\r\n */\r\nexport default function GetLumpColour(type) {\r\n if (type === 0) {\r\n return { text: 'Normal', colour: ColourGray };\r\n }\r\n if (type === 1) {\r\n return { text: 'Bifurcated', colour: ColourGreen };\r\n }\r\n if (type === 2) {\r\n return { text: 'Golden', colour: ColourYellow };\r\n }\r\n if (type === 3) {\r\n return { text: 'Meaty', colour: ColourOrange };\r\n }\r\n if (type === 4) {\r\n return { text: 'Caramelized', colour: ColourPurple };\r\n }\r\n return { text: 'Unknown Sugar Lump', colour: ColourRed };\r\n}\r\n","import Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport GetTimeColour from '../../BeautifyAndFormatting/GetTimeColour';\r\nimport CalculateGrimoireRefillTime from '../../HelperFunctions/CalculateGrimoireRefillTime';\r\nimport { ColourTextPre, TooltipName } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Grimoire tooltips\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function Grimoire() {\r\n const { minigame } = Game.Objects['Wizard tower'];\r\n const spellCost = minigame.getSpellCost(minigame.spellsById[TooltipName]);\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipGrim === 1 &&\r\n spellCost <= minigame.magicM\r\n ) {\r\n const tooltipBox = l('CMTooltipBorder');\r\n\r\n // Time left till enough magic for spell\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Time Left'));\r\n const time = document.createElement('div');\r\n time.id = 'CMTooltipTime';\r\n tooltipBox.appendChild(time);\r\n const timeColour = GetTimeColour(\r\n CalculateGrimoireRefillTime(minigame.magic, minigame.magicM, spellCost),\r\n );\r\n time.textContent = timeColour.text;\r\n time.className = ColourTextPre + timeColour.colour;\r\n\r\n // Time left untill magic spent is recovered\r\n if (spellCost <= minigame.magic) {\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Recover Time'));\r\n const recover = document.createElement('div');\r\n recover.id = 'CMTooltipRecover';\r\n tooltipBox.appendChild(recover);\r\n const recoverColour = GetTimeColour(\r\n CalculateGrimoireRefillTime(\r\n Math.max(0, minigame.magic - spellCost),\r\n minigame.magicM,\r\n minigame.magic,\r\n ),\r\n );\r\n recover.textContent = recoverColour.text;\r\n recover.className = ColourTextPre + recoverColour.colour;\r\n }\r\n\r\n // Extra information on cookies gained when spell is Conjure Baked Goods (Name === 0)\r\n if (TooltipName === '0') {\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Cookies to be gained/lost'));\r\n const conjure = document.createElement('div');\r\n conjure.id = 'x';\r\n tooltipBox.appendChild(conjure);\r\n const reward = document.createElement('span');\r\n reward.style.color = '#33FF00';\r\n reward.textContent = Beautify(\r\n Math.max(Math.min(Game.cookies * 0.15, Game.cookiesPs * 60 * 30), 7),\r\n 2,\r\n );\r\n conjure.appendChild(reward);\r\n const seperator = document.createElement('span');\r\n seperator.textContent = ' / ';\r\n conjure.appendChild(seperator);\r\n const loss = document.createElement('span');\r\n loss.style.color = 'red';\r\n loss.textContent = Beautify(\r\n Math.min(Game.cookies, Math.min(Game.cookies * 0.15, Game.cookiesPs * 60 * 15) + 13),\r\n 2,\r\n );\r\n conjure.appendChild(loss);\r\n }\r\n\r\n l('CMTooltipArea').appendChild(tooltipBox);\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport { TooltipName } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Garden plots tooltips\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function GardenPlots() {\r\n const { minigame } = Game.Objects.Farm;\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipPlots &&\r\n minigame.plot[TooltipName[1]][TooltipName[0]][0] !== 0\r\n ) {\r\n const mature =\r\n minigame.plot[TooltipName[1]][TooltipName[0]][1] >\r\n minigame.plantsById[minigame.plot[TooltipName[1]][TooltipName[0]][0] - 1].mature;\r\n const plantName =\r\n minigame.plantsById[minigame.plot[TooltipName[1]][TooltipName[0]][0] - 1].name;\r\n l('CMTooltipBorder').appendChild(Create.TooltipCreateHeader('Reward (Current / Maximum)'));\r\n const reward = document.createElement('div');\r\n reward.id = 'CMTooltipPlantReward';\r\n l('CMTooltipBorder').appendChild(reward);\r\n if (plantName === 'Chocoroot' || plantName === 'White chocoroot') {\r\n l('CMTooltipPlantReward').textContent = `${\r\n mature ? Beautify(Math.min(Game.cookies * 0.03, Game.cookiesPs * 60 * 3)) : '0'\r\n } / ${Beautify(Game.cookiesPs * 60 * 3)}`;\r\n } else if (plantName === 'Bakeberry') {\r\n l('CMTooltipPlantReward').textContent = `${\r\n mature ? Beautify(Math.min(Game.cookies * 0.03, Game.cookiesPs * 60 * 30)) : '0'\r\n } / ${Beautify(Game.cookiesPs * 60 * 30)}`;\r\n } else if (plantName === 'Queenbeet') {\r\n l('CMTooltipPlantReward').textContent = `${\r\n mature ? Beautify(Math.min(Game.cookies * 0.04, Game.cookiesPs * 60 * 60)) : '0'\r\n } / ${Beautify(Game.cookiesPs * 60 * 60)}`;\r\n } else if (plantName === 'Duketater') {\r\n l('CMTooltipPlantReward').textContent = `${\r\n mature ? Beautify(Math.min(Game.cookies * 0.08, Game.cookiesPs * 60 * 120)) : '0'\r\n } / ${Beautify(Game.cookiesPs * 60 * 120)}`;\r\n } else l('CMTooltipArea').style.display = 'none';\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Garden Harvest All tooltip\r\n * It is called when the Harvest All tooltip is created or refreshed by CM.Disp.UpdateTooltip()\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function HarvestAll() {\r\n const { minigame } = Game.Objects.Farm;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipLump) {\r\n l('CMTooltipBorder').appendChild(Create.TooltipCreateHeader('Cookies gained from harvesting:'));\r\n let totalGain = 0;\r\n let mortal = 0;\r\n if (Game.keys[16] && Game.keys[17]) mortal = 1;\r\n for (let y = 0; y < 6; y++) {\r\n for (let x = 0; x < 6; x++) {\r\n if (minigame.plot[y][x][0] >= 1) {\r\n const tile = minigame.plot[y][x];\r\n const me = minigame.plantsById[tile[0] - 1];\r\n const plantName = me.name;\r\n\r\n let count = true;\r\n if (mortal && me.immortal) count = false;\r\n if (tile[1] < me.matureBase) count = false;\r\n if (count && plantName === 'Bakeberry') {\r\n totalGain += Math.min(Game.cookies * 0.03, Game.cookiesPs * 60 * 30);\r\n } else if ((count && plantName === 'Chocoroot') || plantName === 'White chocoroot') {\r\n totalGain += Math.min(Game.cookies * 0.03, Game.cookiesPs * 60 * 3);\r\n } else if (count && plantName === 'Queenbeet') {\r\n totalGain += Math.min(Game.cookies * 0.04, Game.cookiesPs * 60 * 60);\r\n } else if (count && plantName === 'Duketater') {\r\n totalGain += Math.min(Game.cookies * 0.08, Game.cookiesPs * 60 * 120);\r\n }\r\n }\r\n }\r\n }\r\n l('CMTooltipBorder').appendChild(document.createTextNode(Beautify(totalGain)));\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport {\r\n TooltipName,\r\n ColourTextPre,\r\n ColourGreen,\r\n ColourYellow,\r\n ColourOrange,\r\n ColourRed,\r\n ColourPurple,\r\n ColourGray,\r\n} from '../../VariablesAndData';\r\nimport CalculateStockNextExpectedValue from '../../HelperFunctions/CalculateStockNextExpectedValue';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the stock market\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function StockMarket() {\r\n const { minigame } = Game.Objects.Bank;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipStocks) {\r\n const tooltipBox = l('CMTooltipBorder');\r\n const stock = minigame.goodsById[TooltipName];\r\n\r\n // Current stock mode\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Current Mode'));\r\n const stockMode = document.createElement('div');\r\n stockMode.id = 'CMTooltipMode';\r\n tooltipBox.appendChild(stockMode);\r\n const modeIndex = stock.mode;\r\n const modes = ['Stable', 'Slow Rise', 'Slow Fall', 'Fast Rise', 'Fast Fall', 'Chaotic'];\r\n stockMode.textContent = modes[modeIndex];\r\n const colours = [ColourGray, ColourYellow, ColourOrange, ColourGreen, ColourRed, ColourPurple];\r\n stockMode.className = ColourTextPre + colours[modeIndex];\r\n\r\n // Current stock delta value\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Delta'));\r\n const delta = document.createElement('div');\r\n delta.id = 'CMTooltipDelta';\r\n tooltipBox.appendChild(delta);\r\n delta.textContent = Beautify(stock.d);\r\n const deltaColour = stock.d < 0 ? ColourRed : ColourGreen;\r\n delta.className = ColourTextPre + deltaColour;\r\n\r\n // Stock resting value\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Resting Value'));\r\n const restingValue = document.createElement('div');\r\n restingValue.id = 'CMTooltipRestingValue';\r\n tooltipBox.appendChild(restingValue);\r\n restingValue.textContent = `$${Beautify(minigame.getRestingVal(stock.id))}`;\r\n restingValue.style.color = 'white';\r\n\r\n // Next expected value\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Expected Next Value'));\r\n const expectedNextValue = document.createElement('div');\r\n expectedNextValue.id = 'CMTooltipExpectedValue';\r\n tooltipBox.appendChild(expectedNextValue);\r\n const expectedValue = CalculateStockNextExpectedValue(\r\n stock.val,\r\n stock.d,\r\n minigame.getRestingVal(stock.id),\r\n stock.mode,\r\n Game.Objects.Bank.level,\r\n Game.auraMult('Supreme Intellect'),\r\n );\r\n expectedNextValue.textContent = `$${Beautify(expectedValue) + (expectedValue < stock.val ? '\\u25bc' : '\\u25b2')}`;\r\n const expectedNextValueColour = expectedValue < stock.val ? ColourRed : ColourGreen;\r\n expectedNextValue.className = ColourTextPre + expectedNextValueColour;\r\n\r\n l('CMTooltipArea').appendChild(tooltipBox);\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","/**\r\n * This function calculates a stock's next expected value\r\n * @param\t{number}\tvalue\t\t The stock's current value\r\n * @param\t{number}\tdelta\t\t\t The stock's current delta\r\n * @param\t{number}\trestingValue\t\tThe stock's resting value\r\n * @param\t{number}\tmode\t\t The stock's current mode\r\n * @param\t{number}\tbankLevel\t\t The bank building level\r\n * @param\t{number}\tdragonBoost\t\t The current aura multiplier from Supreme Intellect and Reality Bending\r\n * @returns\t{number}\tvalue + delta The stock's next expected value\r\n */\r\nexport default function CalculateStockNextExpectedValue(\r\n pValue,\r\n pDelta,\r\n restingValue,\r\n mode,\r\n bankLevel,\r\n dragonBoost,\r\n) {\r\n let value = pValue;\r\n let delta = pDelta;\r\n delta *= 0.97 + 0.01 * dragonBoost;\r\n switch (mode) {\r\n case 0:\r\n delta *= 0.95;\r\n break;\r\n case 1:\r\n delta *= 0.99;\r\n delta += 0.02;\r\n break;\r\n case 2:\r\n delta *= 0.99;\r\n delta -= 0.02;\r\n break;\r\n case 3:\r\n delta += 0.06;\r\n value += 2.5;\r\n break;\r\n case 4:\r\n delta -= 0.06;\r\n value -= 2.5;\r\n break;\r\n default:\r\n break;\r\n }\r\n value += (restingValue - value) * 0.01;\r\n if (mode === 3) value -= 0.582;\r\n if (mode === 4) value += 0.6;\r\n if (value > 100 + (bankLevel - 1) * 3 && delta > 0) delta *= 0.9;\r\n if (value < 5) value += (5 - value) * 0.5;\r\n if (value < 5 && delta < 0) delta *= 0.95;\r\n return Math.max(value + delta, 1);\r\n}\r\n","import { CacheWrinklersFattest, CacheWrinklersNormal } from '../../../Cache/VariablesAndData';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport { TooltipName } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the wrinkler button tooltip\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function WrinklerButton() {\r\n l('tooltip').innerHTML = '';\r\n l('tooltip').appendChild(Create.TooltipCreateHeader('Reward:'));\r\n\r\n const WrinklerReward = document.createElement('div');\r\n WrinklerReward.id = 'CMWrinklerReward';\r\n if (TooltipName === 'PopAllNormal') {\r\n WrinklerReward.textContent = Beautify(CacheWrinklersNormal);\r\n } else if (TooltipName === 'PopFattest') {\r\n WrinklerReward.textContent = Beautify(CacheWrinklersFattest[0]);\r\n }\r\n\r\n l('tooltip').appendChild(WrinklerReward);\r\n}\r\n","import { CacheGods } from '../../../Cache/VariablesAndData';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport { TooltipName, TooltipType } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function adds extra info to the Pantheon Gods tooltip\r\n * It is called when the Harvest All tooltip is created or refreshed by CM.Disp.UpdateTooltip()\r\n * It adds to the additional information to l('CMTooltipArea')\r\n */\r\nexport default function PantheonGods() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipPantheon === 1) {\r\n const tooltipBox = l('CMTooltipBorder');\r\n let GodID;\r\n if (TooltipType === 'pas') GodID = TooltipName[1];\r\n else GodID = TooltipName;\r\n\r\n // Time left till enough magic for spell\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Effect in position 1:'));\r\n const cps1 = document.createElement('div');\r\n cps1.id = 'CMPantheonTooltipPosition1';\r\n if (CacheGods[GodID][0] !== 0) {\r\n cps1.textContent = Beautify(CacheGods[GodID][0]);\r\n const increase = Math.round((CacheGods[GodID][0] / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n cps1.textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n cps1.textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n } else cps1.textContent = 'No effect to CPS';\r\n tooltipBox.appendChild(cps1);\r\n\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Effect in position 2:'));\r\n const cps2 = document.createElement('div');\r\n cps2.id = 'CMPantheonTooltipPosition2';\r\n if (CacheGods[GodID][1] !== 0) {\r\n cps2.textContent = Beautify(CacheGods[GodID][1]);\r\n const increase = Math.round((CacheGods[GodID][1] / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n cps2.textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n cps2.textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n } else cps2.textContent = 'No effect to CPS';\r\n tooltipBox.appendChild(cps2);\r\n\r\n tooltipBox.appendChild(Create.TooltipCreateHeader('Effect in position 3:'));\r\n const cps3 = document.createElement('div');\r\n cps3.id = 'CMPantheonTooltipPosition2';\r\n if (CacheGods[GodID][2] !== 0) {\r\n cps3.textContent = Beautify(CacheGods[GodID][2]);\r\n const increase = Math.round((CacheGods[GodID][2] / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n cps3.textContent += ` (${increase / 100}% of income)`;\r\n } else {\r\n cps3.textContent += ` (<0${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ScaleSeparator\r\n ? ','\r\n : '.'\r\n }01% of income)`;\r\n }\r\n } else cps3.textContent = 'No effect to CPS';\r\n tooltipBox.appendChild(cps3);\r\n\r\n l('CMTooltipArea').appendChild(tooltipBox);\r\n } else l('CMTooltipArea').style.display = 'none';\r\n}\r\n","import GetCPSBuffMult from '../../../Cache/CPS/GetCPSBuffMult';\r\nimport { CacheEdifice, CacheLucky } from '../../../Cache/VariablesAndData';\r\nimport ToggleToolWarnPos from '../../../Config/Toggles/ToggleToolWarnPos';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../BeautifyAndFormatting/FormatTime';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../../HelperFunctions/GetWrinkConfigBank';\r\nimport { TooltipBonusIncome, TooltipPrice, TooltipType } from '../../VariablesAndData';\r\nimport * as Create from '../CreateTooltip';\r\n\r\n/**\r\n * This function updates the warnings section of the building and upgrade tooltips\r\n */\r\nexport default function Warnings() {\r\n if (TooltipType === 'b' || TooltipType === 'u') {\r\n if (document.getElementById('CMDispTooltipWarningParent') === null) {\r\n l('tooltipAnchor').appendChild(Create.TooltipCreateWarningSection());\r\n ToggleToolWarnPos();\r\n }\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos === 0)\r\n l('CMDispTooltipWarningParent').style.right = '0px';\r\n else l('CMDispTooltipWarningParent').style.top = `${l('tooltip').offsetHeight}px`;\r\n\r\n l('CMDispTooltipWarningParent').style.width = `${l('tooltip').offsetWidth - 6}px`;\r\n\r\n const amount = Game.cookies + GetWrinkConfigBank() - TooltipPrice;\r\n const bonusIncomeUsed = Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings\r\n .ToolWarnBon\r\n ? TooltipBonusIncome\r\n : 0;\r\n let limitLucky = CacheLucky;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnBon === 1) {\r\n let bonusNoFren = TooltipBonusIncome;\r\n bonusNoFren /= GetCPSBuffMult();\r\n limitLucky += (bonusNoFren * 60 * 15) / 0.15;\r\n }\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLucky === 1) {\r\n if (amount < limitLucky && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnLucky').style.display = '';\r\n l('CMDispTooltipWarnLuckyText').textContent = `${Beautify(\r\n limitLucky - amount,\r\n )} (${FormatTime((limitLucky - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnLucky').style.display = 'none';\r\n } else l('CMDispTooltipWarnLucky').style.display = 'none';\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLuckyFrenzy === 1\r\n ) {\r\n const limitLuckyFrenzy = limitLucky * 7;\r\n if (amount < limitLuckyFrenzy && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnLuckyFrenzy').style.display = '';\r\n l('CMDispTooltipWarnLuckyFrenzyText').textContent = `${Beautify(\r\n limitLuckyFrenzy - amount,\r\n )} (${FormatTime((limitLuckyFrenzy - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnLuckyFrenzy').style.display = 'none';\r\n } else l('CMDispTooltipWarnLuckyFrenzy').style.display = 'none';\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnConjure === 1) {\r\n const limitConjure = limitLucky * 2;\r\n if (amount < limitConjure && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnConjure').style.display = '';\r\n l('CMDispTooltipWarnConjureText').textContent = `${Beautify(\r\n limitConjure - amount,\r\n )} (${FormatTime((limitConjure - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnConjure').style.display = 'none';\r\n } else l('CMDispTooltipWarnConjure').style.display = 'none';\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnConjureFrenzy ===\r\n 1\r\n ) {\r\n const limitConjureFrenzy = limitLucky * 2 * 7;\r\n if (amount < limitConjureFrenzy && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnConjureFrenzy').style.display = '';\r\n l('CMDispTooltipWarnConjureFrenzyText').textContent = `${Beautify(\r\n limitConjureFrenzy - amount,\r\n )} (${FormatTime((limitConjureFrenzy - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnConjureFrenzy').style.display = 'none';\r\n } else l('CMDispTooltipWarnConjureFrenzy').style.display = 'none';\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnEdifice === 1 &&\r\n Game.Objects['Wizard tower'].minigameLoaded\r\n ) {\r\n if (CacheEdifice && amount < CacheEdifice && (TooltipType !== 'b' || Game.buyMode === 1)) {\r\n l('CMDispTooltipWarnEdifice').style.display = '';\r\n l('CMDispTooltipWarnEdificeText').textContent = `${Beautify(\r\n CacheEdifice - amount,\r\n )} (${FormatTime((CacheEdifice - amount) / (GetCPS() + bonusIncomeUsed))})`;\r\n } else l('CMDispTooltipWarnEdifice').style.display = 'none';\r\n } else l('CMDispTooltipWarnEdifice').style.display = 'none';\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser > 0) {\r\n if (\r\n amount <\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser *\r\n GetCPS() &&\r\n (TooltipType !== 'b' || Game.buyMode === 1)\r\n ) {\r\n l('CMDispTooltipWarnUser').style.display = '';\r\n // Need to update tooltip text dynamically\r\n l('CMDispTooltipWarnUser').children[0].textContent =\r\n `Purchase of this item will put you under the number of Cookies equal to ${Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser} seconds of CPS`;\r\n l('CMDispTooltipWarnUserText').textContent = `${Beautify(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser *\r\n GetCPS() -\r\n amount,\r\n )} (${FormatTime(\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnUser *\r\n GetCPS() -\r\n amount) /\r\n (GetCPS() + bonusIncomeUsed),\r\n )})`;\r\n } else l('CMDispTooltipWarnUser').style.display = 'none';\r\n } else l('CMDispTooltipWarnUser').style.display = 'none';\r\n } else if (l('CMDispTooltipWarningParent') !== null) {\r\n l('CMDispTooltipWarningParent').remove();\r\n }\r\n}\r\n","import ToggleWrinklerButtons from '../Config/Toggles/ToggleWrinklerButtons';\r\nimport UpdateBuildings from './BuildingsUpgrades/Buildings';\r\nimport UpdateUpgradeSectionsHeight from './BuildingsUpgrades/UpdateUpgradeSectionsHeight';\r\nimport UpdateUpgrades from './BuildingsUpgrades/Upgrades';\r\nimport { UpdateBotBar } from './InfoBars/BottomBar';\r\nimport { UpdateTimerBar } from './InfoBars/TimerBar';\r\nimport RefreshMenu from './MenuSections/Refreshmenu';\r\nimport UpdateTooltips from './Tooltips/UpdateTooltips';\r\nimport { CheckWrinklerTooltip, UpdateWrinklerTooltip } from './Tooltips/WrinklerTooltips';\r\n\r\n/**\r\n * This function handles all custom drawing for the Game.Draw() function.\r\n * It is hooked on 'draw' by CM.RegisterHooks()\r\n */\r\nexport default function CMDrawHook() {\r\n // Draw autosave timer in stats menu, this must be done here to make it count down correctly\r\n if (\r\n Game.prefs.autosave &&\r\n Game.drawT % 10 === 0 && // with autosave ON and every 10 ticks\r\n Game.onMenu === 'stats' &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Stats // while being on the stats menu only\r\n ) {\r\n const timer = document.getElementById('CMStatsAutosaveTimer');\r\n if (timer) {\r\n timer.innerText = Game.sayTime(Game.fps * 60 - (Game.T % (Game.fps * 60)), 4);\r\n }\r\n }\r\n\r\n // Update colours\r\n UpdateBuildings();\r\n UpdateUpgrades();\r\n UpdateUpgradeSectionsHeight();\r\n\r\n // Redraw timers\r\n UpdateTimerBar();\r\n\r\n // Update Bottom Bar\r\n UpdateBotBar();\r\n\r\n // Update Tooltip\r\n UpdateTooltips();\r\n\r\n // Update Wrinkler Tooltip\r\n CheckWrinklerTooltip();\r\n UpdateWrinklerTooltip();\r\n\r\n // Change menu refresh interval\r\n RefreshMenu();\r\n\r\n // Update display of wrinkler buttons, this checks if Elder Pledge has been bought and if they should be disabled\r\n ToggleWrinklerButtons();\r\n}\r\n","/** Functions related to the Timer Bar */\r\n\r\nimport { UpdateBotTimerBarPosition } from '../../Config/SpecificToggles';\r\nimport {\r\n BuffColours,\r\n ColourBackPre,\r\n ColourGray,\r\n ColourOrange,\r\n ColourPurple,\r\n LastNumberOfTimers,\r\n} from '../VariablesAndData';\r\nimport { CreateTimer } from './CreateDOMElements';\r\n\r\n/**\r\n * This function creates the TimerBar and appends it to l('wrapper')\r\n */\r\nexport function CreateTimerBar() {\r\n const TimerBar = document.createElement('div');\r\n TimerBar.id = 'CMTimerBar';\r\n TimerBar.style.position = 'absolute';\r\n TimerBar.style.display = 'none';\r\n TimerBar.style.height = '0px';\r\n TimerBar.style.fontSize = '10px';\r\n TimerBar.style.fontWeight = 'bold';\r\n TimerBar.style.backgroundColor = 'black';\r\n\r\n // Create standard Autosave bar\r\n const CMTimerBarAutosave = CreateTimer('CMTimerBarAutosave', 'Autosave', [\r\n { id: 'CMTimerBarAutosaveBar', colour: ColourPurple },\r\n ]);\r\n TimerBar.appendChild(CMTimerBarAutosave);\r\n\r\n // Create standard Golden Cookie bar\r\n const CMTimerBarGC = CreateTimer('CMTimerBarGC', 'Next Cookie', [\r\n { id: 'CMTimerBarGCMinBar', colour: ColourGray },\r\n { id: 'CMTimerBarGCBar', colour: ColourPurple },\r\n ]);\r\n TimerBar.appendChild(CMTimerBarGC);\r\n\r\n // Create standard Reindeer bar\r\n const CMTimerBarRen = CreateTimer('CMTimerBarRen', 'Next Reindeer', [\r\n { id: 'CMTimerBarRenMinBar', colour: ColourGray },\r\n { id: 'CMTimerBarRenBar', colour: ColourOrange },\r\n ]);\r\n TimerBar.appendChild(CMTimerBarRen);\r\n const TimerBarBuffTimers = document.createElement('div');\r\n TimerBarBuffTimers.id = 'CMTimerBarBuffTimers';\r\n TimerBar.appendChild(TimerBarBuffTimers);\r\n\r\n l('wrapper').appendChild(TimerBar);\r\n}\r\n\r\n/**\r\n * This function updates indivudual timers in the timer bar\r\n */\r\nexport function UpdateTimerBar() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1) {\r\n // label width: 113, timer width: 30, div margin: 20\r\n const maxWidthTwoBar = l('CMTimerBar').offsetWidth - 163;\r\n // label width: 113, div margin: 20, calculate timer width at runtime\r\n const maxWidthOneBar = l('CMTimerBar').offsetWidth - 133;\r\n let numberOfTimers = 0;\r\n\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AutosaveTimerBar &&\r\n Game.prefs.autosave\r\n ) {\r\n const timeTillNextAutosave =\r\n (Game.fps * 60 - (Game.OnAscend ? 0 : Game.T % (Game.fps * 60))) / Game.fps;\r\n l('CMTimerBarAutosave').style.display = '';\r\n l('CMTimerBarAutosaveBar').style.width = `${Math.round(\r\n (timeTillNextAutosave *\r\n (maxWidthOneBar - Math.ceil(timeTillNextAutosave).toString().length * 8)) /\r\n 60,\r\n )}px`;\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1\r\n ) {\r\n l('CMTimerBarAutosaveBar').textContent = Math.ceil(timeTillNextAutosave);\r\n } else l('CMTimerBarAutosaveBar').textContent = '';\r\n l('CMTimerBarAutosaveTime').textContent = Math.ceil(timeTillNextAutosave);\r\n numberOfTimers += 1;\r\n } else l('CMTimerBarAutosave').style.display = 'none';\r\n\r\n // Regulates visibility of Golden Cookie timer\r\n if (Game.shimmerTypes.golden.spawned === 0 && !Game.Has('Golden switch [off]')) {\r\n l('CMTimerBarGC').style.display = '';\r\n l('CMTimerBarGCMinBar').style.width = `${Math.round(\r\n (Math.max(0, Game.shimmerTypes.golden.minTime - Game.shimmerTypes.golden.time) *\r\n maxWidthTwoBar) /\r\n Game.shimmerTypes.golden.maxTime,\r\n )}px`;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1)\r\n l('CMTimerBarGCMinBar').textContent = Math.ceil(\r\n (Game.shimmerTypes.golden.minTime - Game.shimmerTypes.golden.time) / Game.fps,\r\n );\r\n else l('CMTimerBarGCMinBar').textContent = '';\r\n if (Game.shimmerTypes.golden.minTime === Game.shimmerTypes.golden.maxTime) {\r\n l('CMTimerBarGCMinBar').style.borderTopRightRadius = '10px';\r\n l('CMTimerBarGCMinBar').style.borderBottomRightRadius = '10px';\r\n } else {\r\n l('CMTimerBarGCMinBar').style.borderTopRightRadius = '';\r\n l('CMTimerBarGCMinBar').style.borderBottomRightRadius = '';\r\n }\r\n l('CMTimerBarGCBar').style.width = `${Math.round(\r\n (Math.min(\r\n Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.minTime,\r\n Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.time,\r\n ) *\r\n maxWidthTwoBar) /\r\n Game.shimmerTypes.golden.maxTime,\r\n )}px`;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1)\r\n l('CMTimerBarGCBar').textContent = Math.ceil(\r\n Math.min(\r\n Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.minTime,\r\n Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.time,\r\n ) / Game.fps,\r\n );\r\n else l('CMTimerBarGCBar').textContent = '';\r\n const chanceToSpawn =\r\n Math.max(\r\n 0,\r\n (Game.shimmerTypes.golden.time - Game.shimmerTypes.golden.minTime) /\r\n (Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.minTime),\r\n ) ** 5;\r\n l('CMTimerBarGCTime').textContent = `${Math.ceil(\r\n (Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.time) / Game.fps,\r\n )} ${chanceToSpawn < 0.01 ? '<' : ''}${chanceToSpawn.toLocaleString('en', {\r\n style: 'percent',\r\n })}`;\r\n numberOfTimers += 1;\r\n } else l('CMTimerBarGC').style.display = 'none';\r\n\r\n // Regulates visibility of Reindeer timer\r\n if (Game.season === 'christmas' && Game.shimmerTypes.reindeer.spawned === 0) {\r\n l('CMTimerBarRen').style.display = '';\r\n l('CMTimerBarRenMinBar').style.width = `${Math.round(\r\n (Math.max(0, Game.shimmerTypes.reindeer.minTime - Game.shimmerTypes.reindeer.time) *\r\n maxWidthTwoBar) /\r\n Game.shimmerTypes.reindeer.maxTime,\r\n )}px`;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1)\r\n l('CMTimerBarRenMinBar').textContent = Math.ceil(\r\n (Game.shimmerTypes.reindeer.minTime - Game.shimmerTypes.reindeer.time) / Game.fps,\r\n );\r\n else l('CMTimerBarRenMinBar').textContent = '';\r\n l('CMTimerBarRenBar').style.width = `${Math.round(\r\n (Math.min(\r\n Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.minTime,\r\n Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.time,\r\n ) *\r\n maxWidthTwoBar) /\r\n Game.shimmerTypes.reindeer.maxTime,\r\n )}px`;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay >= 1)\r\n l('CMTimerBarRenBar').textContent = Math.ceil(\r\n Math.min(\r\n Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.minTime,\r\n Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.time,\r\n ) / Game.fps,\r\n );\r\n else l('CMTimerBarRenBar').textContent = '';\r\n const chanceToSpawn =\r\n Math.max(\r\n 0,\r\n (Game.shimmerTypes.reindeer.time - Game.shimmerTypes.reindeer.minTime) /\r\n (Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.minTime),\r\n ) ** 5;\r\n l('CMTimerBarRenTime').textContent = `${Math.ceil(\r\n (Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.time) / Game.fps,\r\n )} ${chanceToSpawn < 0.01 ? '<' : ''}${chanceToSpawn.toLocaleString('en', {\r\n style: 'percent',\r\n })}`;\r\n numberOfTimers += 1;\r\n } else {\r\n l('CMTimerBarRen').style.display = 'none';\r\n }\r\n\r\n // On every frame all buff-timers are deleted and re-created\r\n const BuffTimerBars = {};\r\n l('CMTimerBarBuffTimers').innerHTML = '';\r\n Object.keys(Game.buffs).forEach((i) => {\r\n if (Game.buffs[i]) {\r\n const timer = CreateTimer(Game.buffs[i].name, Game.buffs[i].name, [\r\n { id: `${Game.buffs[i].name}Bar` },\r\n ]);\r\n timer.style.display = '';\r\n let classColour = '';\r\n // Gives specific timers specific colours\r\n if (typeof BuffColours[Game.buffs[i].name] !== 'undefined') {\r\n classColour = BuffColours[Game.buffs[i].name];\r\n } else classColour = ColourPurple;\r\n timer.lastChild.children[1].className = ColourBackPre + classColour;\r\n timer.lastChild.children[1].style.color = 'black';\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarOverlay === 2\r\n )\r\n timer.lastChild.children[1].textContent = `${Math.round(\r\n 100 * (Game.buffs[i].time / Game.buffs[i].maxTime),\r\n )}%`;\r\n else timer.lastChild.children[1].textContent = '';\r\n timer.lastChild.children[1].style.width = `${Math.round(\r\n (Game.buffs[i].time *\r\n (maxWidthOneBar - Math.ceil(Game.buffs[i].time / Game.fps).toString().length * 8)) /\r\n Game.buffs[i].maxTime,\r\n )}px`;\r\n timer.lastChild.children[2].textContent = Math.ceil(Game.buffs[i].time / Game.fps);\r\n numberOfTimers += 1;\r\n BuffTimerBars[Game.buffs[i].name] = timer;\r\n }\r\n });\r\n Object.keys(BuffTimerBars).forEach((i) => {\r\n l('CMTimerBarBuffTimers').appendChild(BuffTimerBars[i]);\r\n });\r\n\r\n if (numberOfTimers !== 0) {\r\n l('CMTimerBar').style.height = `${numberOfTimers * 12 + 2}px`;\r\n }\r\n if (LastNumberOfTimers !== numberOfTimers) {\r\n LastNumberOfTimers = numberOfTimers;\r\n UpdateBotTimerBarPosition();\r\n }\r\n }\r\n}\r\n","import { SimObjects } from '../../Sim/VariablesAndData';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\nimport {\r\n TooltipWrinkler,\r\n TooltipWrinklerArea,\r\n TooltipWrinklerBeingShown,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks and create a tooltip for the wrinklers\r\n * It is called by CM.Disp.Draw()\r\n * As wrinklers are not appended to the DOM we us a different system than for other tooltips\r\n */\r\nexport function CheckWrinklerTooltip() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipWrink === 1 &&\r\n TooltipWrinklerArea === 1\r\n ) {\r\n // Latter is set by CM.Main.AddWrinklerAreaDetect\r\n let showingTooltip = false;\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n const me = Game.wrinklers[i];\r\n if (me.phase > 0 && me.selected) {\r\n showingTooltip = true;\r\n if (TooltipWrinklerBeingShown[i] === 0 || TooltipWrinklerBeingShown[i] === undefined) {\r\n const placeholder = document.createElement('div');\r\n const wrinkler = document.createElement('div');\r\n wrinkler.style.minWidth = '120px';\r\n wrinkler.style.marginBottom = '4px';\r\n const div = document.createElement('div');\r\n div.style.textAlign = 'center';\r\n div.id = 'CMTooltipWrinkler';\r\n wrinkler.appendChild(div);\r\n placeholder.appendChild(wrinkler);\r\n Game.tooltip.draw(this, escape(placeholder.innerHTML));\r\n TooltipWrinkler = i;\r\n TooltipWrinklerBeingShown[i] = 1;\r\n }\r\n } else {\r\n TooltipWrinklerBeingShown[i] = 0;\r\n }\r\n });\r\n if (!showingTooltip) {\r\n Game.tooltip.hide();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * This function updates the amount to be displayed by the wrinkler tooltip created by CM.Disp.CheckWrinklerTooltip()\r\n * It is called by CM.Disp.Draw()\r\n * As wrinklers are not appended to the DOM we us a different system than for other tooltips\r\n */\r\nexport function UpdateWrinklerTooltip() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipWrink === 1 &&\r\n l('CMTooltipWrinkler') !== null\r\n ) {\r\n let { sucked } = Game.wrinklers[TooltipWrinkler];\r\n let toSuck = 1.1;\r\n if (Game.Has('Sacrilegious corruption')) toSuck *= 1.05;\r\n if (Game.wrinklers[TooltipWrinkler].type === 1) toSuck *= 3; // Shiny wrinklers\r\n sucked *= toSuck;\r\n if (Game.Has('Wrinklerspawn')) sucked *= 1.05;\r\n if (SimObjects.Temple.minigameLoaded) {\r\n const godLvl = Game.hasGod('scorn');\r\n if (godLvl === 1) sucked *= 1.15;\r\n else if (godLvl === 2) sucked *= 1.1;\r\n else if (godLvl === 3) sucked *= 1.05;\r\n }\r\n l('CMTooltipWrinkler').textContent = Beautify(sucked);\r\n }\r\n}\r\n","/**\r\n * This function refreshes the stats page, CM.Options.UpStats determines the rate at which that happens\r\n * It is called by CM.Disp.Draw()\r\n */\r\nexport default function RefreshMenu() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpStats &&\r\n Game.onMenu === 'stats' &&\r\n (Game.drawT - 1) % (Game.fps * 5) !== 0 &&\r\n (Game.drawT - 1) % Game.fps === 0\r\n )\r\n Game.UpdateMenu();\r\n}\r\n","import { CacheAverageCookiesFromClicks } from '../Cache/VariablesAndData';\r\n\r\nexport default function CMClickHook() {\r\n // Add cookies from click to array that stores average\r\n CacheAverageCookiesFromClicks.addLatest(Game.computedMouseCps);\r\n}\r\n","import { ClickTimes, CookieTimes } from '../../Disp/VariablesAndData';\r\nimport {\r\n ChoEggDiff, // eslint-disable-line no-unused-vars\r\n ClicksDiff, // eslint-disable-line no-unused-vars\r\n CookiesDiff, // eslint-disable-line no-unused-vars\r\n WrinkDiff, // eslint-disable-line no-unused-vars\r\n WrinkFattestDiff, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * @class\r\n * @classdesc \tThis is a class used to store values used to calculate average over time (mostly cps)\r\n * @var\t\t\t{number}\t\t\t\tmaxLength\tThe maximum length of the value-storage\r\n * @var\t\t\t{[]}\t\t\t\t\tqueue\t\tThe values stored\r\n * @method\t\taddLatest(newValue)\t\tAppends newValue to the value storage\r\n * @method\t\tcalcAverage(timePeriod)\tReturns the average over the specified timeperiod\r\n */\r\nexport class CMAvgQueue {\r\n constructor(maxLength) {\r\n this.maxLength = maxLength;\r\n this.queue = [];\r\n }\r\n\r\n addLatest(newValue) {\r\n if (this.queue.push(newValue) > this.maxLength) {\r\n this.queue.shift();\r\n }\r\n }\r\n\r\n /**\r\n * This functions returns the average of the values in the queue\r\n * @param \t{number}\ttimePeriod\tThe period in seconds to computer average over\r\n * @returns {number}\tret\t\t\tThe average\r\n */\r\n calcAverage(timePeriod) {\r\n let time = timePeriod;\r\n if (time > this.maxLength) time = this.maxLength;\r\n if (time > this.queue.length) time = this.queue.length;\r\n let ret = 0;\r\n for (let i = this.queue.length - 1; i >= 0 && i > this.queue.length - 1 - time; i--) {\r\n ret += this.queue[i];\r\n }\r\n if (ret === 0) {\r\n return 0;\r\n }\r\n return ret / time;\r\n }\r\n\r\n calcSum(timePeriod) {\r\n let time = timePeriod;\r\n if (time > this.maxLength) time = this.maxLength;\r\n if (time > this.queue.length) time = this.queue.length;\r\n if (time === 0) return 0;\r\n return this.queue.slice(-time).reduce((a, b) => a + b, 0);\r\n }\r\n}\r\n\r\n/**\r\n * This functions caches creates the CMAvgQueue used by CM.Cache.CacheAvgCPS() to calculate CPS\r\n * Called by CM.Cache.InitCache()\r\n */\r\nexport function InitCookiesDiff() {\r\n CookiesDiff = new CMAvgQueue(CookieTimes[CookieTimes.length - 1]);\r\n WrinkDiff = new CMAvgQueue(CookieTimes[CookieTimes.length - 1]);\r\n WrinkFattestDiff = new CMAvgQueue(CookieTimes[CookieTimes.length - 1]);\r\n ChoEggDiff = new CMAvgQueue(CookieTimes[CookieTimes.length - 1]);\r\n ClicksDiff = new CMAvgQueue(ClickTimes[ClickTimes.length - 1]);\r\n}\r\n","/**\r\n * Insert the provided values into `window.CookieMonsterData.Cache`.\r\n *\r\n * The initial 'Cache' is dropped from the name, so e.g. `CacheWrinklersTotal`\r\n * becomes `window.CookieMonsterData.Cache.WrinklersTotal`.\r\n */\r\nexport default function FillCMDCache(caches) {\r\n if (!('Cache' in window.CookieMonsterData)) {\r\n window.CookieMonsterData.Cache = {};\r\n }\r\n\r\n Object.keys(caches).forEach((name) => {\r\n const exportName = name.replace(/^Cache/, '');\r\n\r\n if (typeof caches[name] === 'undefined') {\r\n window.CookieMonsterData.Cache[exportName] = undefined;\r\n } else {\r\n // Passing through JSON ensures that no references are retained.\r\n window.CookieMonsterData.Cache[exportName] = JSON.parse(JSON.stringify(caches[name]));\r\n }\r\n });\r\n}\r\n","import { ClickTimes, CookieTimes } from '../../Disp/VariablesAndData';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheAverageClicks,\r\n CacheAverageCPS,\r\n CacheAverageGainBank,\r\n CacheAverageGainChoEgg,\r\n CacheAverageGainWrink,\r\n CacheAverageGainWrinkFattest,\r\n CacheAvgCPSWithChoEgg,\r\n CacheLastChoEgg,\r\n CacheLastClicks,\r\n CacheLastCookies,\r\n CacheLastCPSCheck,\r\n CacheLastWrinkCookies,\r\n CacheLastWrinkFattestCookies,\r\n CacheRealCookiesEarned,\r\n CacheSellForChoEgg,\r\n CacheWrinklersFattest,\r\n CacheWrinklersTotal,\r\n ChoEggDiff,\r\n ClicksDiff,\r\n CookiesDiff,\r\n WrinkDiff,\r\n WrinkFattestDiff,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches two variables related average CPS and Clicks\r\n * It is called by CM.Cache.LoopCache()\r\n * @global\t{number}\tCM.Cache.RealCookiesEarned\tCookies earned including the Chocolate Egg\r\n * @global\t{number}\tCM.Cache.AvgCPS\t\t\t\tAverage cookies over time-period as defined by AvgCPSHist\r\n * @global\t{number}\tCM.Cache.AverageClicks\t\tAverage cookies from clicking over time-period as defined by AvgClicksHist\r\n * @global\t{number}\tCM.Cache.AvgCPSChoEgg\t\tAverage cookies from combination of normal CPS and average Chocolate Cookie CPS\r\n */\r\nexport default function CacheAvgCPS() {\r\n const currDate = Math.floor(Date.now() / 1000);\r\n // Only calculate every new second\r\n if ((Game.T / Game.fps) % 1 === 0) {\r\n let choEggTotal = Game.cookies + CacheSellForChoEgg;\r\n if (Game.cpsSucked > 0) choEggTotal += CacheWrinklersTotal;\r\n CacheRealCookiesEarned = Math.max(Game.cookiesEarned, choEggTotal);\r\n choEggTotal *= 0.05;\r\n\r\n // Add recent gains to AvgQueue's\r\n const timeDiff = currDate - CacheLastCPSCheck;\r\n const bankDiffAvg = Math.max(0, Game.cookies - CacheLastCookies) / timeDiff;\r\n const wrinkDiffAvg = Math.max(0, CacheWrinklersTotal - CacheLastWrinkCookies) / timeDiff;\r\n const wrinkFattestDiffAvg =\r\n Math.max(0, CacheWrinklersFattest[0] - CacheLastWrinkFattestCookies) / timeDiff;\r\n const choEggDiffAvg = Math.max(0, choEggTotal - CacheLastChoEgg) / timeDiff;\r\n const clicksDiffAvg = (Game.cookieClicks - CacheLastClicks) / timeDiff;\r\n for (let i = 0; i < timeDiff; i++) {\r\n CookiesDiff.addLatest(bankDiffAvg);\r\n WrinkDiff.addLatest(wrinkDiffAvg);\r\n WrinkFattestDiff.addLatest(wrinkFattestDiffAvg);\r\n ChoEggDiff.addLatest(choEggDiffAvg);\r\n ClicksDiff.addLatest(clicksDiffAvg);\r\n }\r\n\r\n // Store current data for next loop\r\n CacheLastCPSCheck = currDate;\r\n CacheLastCookies = Game.cookies;\r\n CacheLastWrinkCookies = CacheWrinklersTotal;\r\n CacheLastWrinkFattestCookies = CacheWrinklersFattest[0];\r\n CacheLastChoEgg = choEggTotal;\r\n CacheLastClicks = Game.cookieClicks;\r\n\r\n // Get average gain over period of cpsLength seconds\r\n const cpsLength =\r\n CookieTimes[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist];\r\n CacheAverageGainBank = CookiesDiff.calcAverage(cpsLength);\r\n CacheAverageGainWrink = WrinkDiff.calcAverage(cpsLength);\r\n CacheAverageGainWrinkFattest = WrinkFattestDiff.calcAverage(cpsLength);\r\n CacheAverageGainChoEgg = ChoEggDiff.calcAverage(cpsLength);\r\n CacheAverageCPS = CacheAverageGainBank;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 1)\r\n CacheAverageCPS += CacheAverageGainWrink;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 2)\r\n CacheAverageCPS += CacheAverageGainWrinkFattest;\r\n\r\n const choEgg = Game.HasUnlocked('Chocolate egg') && !Game.Has('Chocolate egg');\r\n\r\n if (\r\n choEgg ||\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 0\r\n ) {\r\n CacheAvgCPSWithChoEgg =\r\n CacheAverageGainBank + CacheAverageGainWrink + (choEgg ? CacheAverageGainChoEgg : 0);\r\n } else CacheAvgCPSWithChoEgg = CacheAverageCPS;\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n CacheAverageClicks = ClicksDiff.calcAverage(\r\n ClickTimes[Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist],\r\n );\r\n }\r\n\r\n FillCMDCache({\r\n CacheRealCookiesEarned,\r\n CacheLastCPSCheck,\r\n CacheLastCookies,\r\n CacheLastWrinkCookies,\r\n CacheLastWrinkFattestCookies,\r\n CacheLastChoEgg,\r\n CacheLastClicks,\r\n CacheAverageGainBank,\r\n CacheAverageGainWrink,\r\n CacheAverageGainWrinkFattest,\r\n CacheAverageGainChoEgg,\r\n CacheAverageCPS,\r\n CacheAvgCPSWithChoEgg,\r\n CacheAverageClicks,\r\n });\r\n}\r\n","/**\r\n * This function calculates the total price for buying \"increase\" of a building\r\n * @param\t{string}\tbuild\t\tName of the building\r\n * @param\t{number}\tbasePrice\tBase Price of building\r\n * @param\t{number}\tstart\t\tStarting amount of building\r\n * @param\t{number}\tfree\t\tFree amount of building\r\n * @param\t{number}\tincrease\tIncrease of building\r\n * @returns {number}\tmoni\t\tTotal price\r\n */\r\nexport default function BuildingGetPrice(build, basePrice, start, free, increase) {\r\n let partialPrice = 0;\r\n for (let i = Math.max(0, start); i < Math.max(0, start + increase); i++) {\r\n partialPrice += Game.priceIncrease ** Math.max(0, i - free);\r\n }\r\n let price = basePrice * partialPrice;\r\n price = Game.modifyBuildingPrice(Game.Objects[build], price);\r\n return Math.ceil(price);\r\n}\r\n","import GetWrinkConfigBank from '../../Disp/HelperFunctions/GetWrinkConfigBank';\r\nimport { ColourGray } from '../../Disp/VariablesAndData';\r\nimport BuildingGetPrice from '../../Sim/SimulationEvents/BuyBuilding';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheMinPP,\r\n CacheMinPPBulk,\r\n CacheObjects1,\r\n CacheObjects10,\r\n CacheObjects100,\r\n CachePPArray,\r\n} from '../VariablesAndData';\r\nimport ColourOfPP from './ColourOfPP';\r\n\r\n/**\r\n * This functions caches the buildings of bulk-buy mode when PP is compared against optimal single-purchase building\r\n * It saves all date in CM.Cache.Objects...\r\n * It is called by CM.Cache.CacheBuildingsPP()\r\n */\r\nfunction CacheColour(target, amount) {\r\n Object.keys(target).forEach((i) => {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPRigidelMode &&\r\n amount === 1\r\n ) {\r\n target[i].colour = ColourGray; // eslint-disable-line no-param-reassign\r\n return;\r\n }\r\n // eslint-disable-next-line no-param-reassign\r\n target[i].colour = ColourOfPP(\r\n target[i],\r\n BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n amount,\r\n ),\r\n );\r\n // Colour based on excluding certain top-buildings\r\n for (\r\n let j = 0;\r\n j < Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop;\r\n j++\r\n ) {\r\n if (target[i].pp === CachePPArray[j][0]) target[i].colour = ColourGray; // eslint-disable-line no-param-reassign\r\n }\r\n });\r\n}\r\n\r\nfunction CachePP(target, amount) {\r\n Object.keys(target).forEach((i) => {\r\n const price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n amount,\r\n );\r\n if (Game.cookiesPs) {\r\n target[i].pp = // eslint-disable-line no-param-reassign\r\n Math.max(price - (Game.cookies + GetWrinkConfigBank()), 0) / Game.cookiesPs +\r\n price / target[i].bonus;\r\n } else target[i].pp = price / target[i].bonus; // eslint-disable-line no-param-reassign\r\n if (\r\n !(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPRigidelMode &&\r\n amount === 1\r\n )\r\n )\r\n CachePPArray.push([target[i].pp, amount, price]);\r\n });\r\n}\r\n\r\n/**\r\n * This functions caches the PP of each building it saves all date in CM.Cache.Objects...\r\n * It is called by CM.Cache.CachePP()\r\n */\r\nexport default function CacheBuildingsPP() {\r\n CacheMinPP = Infinity;\r\n CachePPArray = [];\r\n if (\r\n typeof Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop ===\r\n 'undefined'\r\n )\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop = 0; // Otherwise breaks during initialization\r\n\r\n // Calculate PP and colours\r\n CachePP(CacheObjects1, 1);\r\n CachePP(CacheObjects10, 10);\r\n CachePP(CacheObjects100, 100);\r\n\r\n // Set CM.Cache.min to best non-excluded buidliung\r\n CachePPArray.sort((a, b) => a[0] - b[0]);\r\n let indexOfMin = Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPExcludeTop;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.PPOnlyConsiderBuyable) {\r\n while (CachePPArray[indexOfMin][2] > Game.cookies) {\r\n indexOfMin += 1;\r\n if (CachePPArray.length === indexOfMin + 1) {\r\n break;\r\n }\r\n }\r\n }\r\n CacheMinPP = CachePPArray[indexOfMin][0];\r\n CacheMinPPBulk = CachePPArray[indexOfMin][1];\r\n\r\n CacheColour(CacheObjects1, 1);\r\n CacheColour(CacheObjects10, 10);\r\n CacheColour(CacheObjects100, 100);\r\n\r\n FillCMDCache({ CacheMinPP, CacheMinPPBulk, CachePPArray });\r\n}\r\n","/**\r\n * Section: Functions related to caching PP */\r\n\r\nimport { CacheObjects1, CacheObjects10, CacheObjects100, CacheUpgrades } from '../VariablesAndData';\r\nimport CacheBuildingsPP from './Building';\r\nimport CacheUpgradePP from './Upgrade';\r\n\r\n/**\r\n * This functions caches the PP of each building and upgrade and stores it in the cache\r\n * It is called by CM.Cache.LoopCache() and CM.Cache.InitCache()\r\n */\r\nexport default function CachePP() {\r\n CacheBuildingsPP();\r\n CacheUpgradePP();\r\n window.CookieMonsterData.Objects1 = JSON.parse(JSON.stringify(CacheObjects1));\r\n window.CookieMonsterData.Objects10 = JSON.parse(JSON.stringify(CacheObjects10));\r\n window.CookieMonsterData.Objects100 = JSON.parse(JSON.stringify(CacheObjects100));\r\n window.CookieMonsterData.Upgrades = [];\r\n Object.entries(CacheUpgrades).forEach((i) => {\r\n window.CookieMonsterData.Upgrades[i[0]] = JSON.parse(JSON.stringify(i[1]));\r\n });\r\n}\r\n","import GetWrinkConfigBank from '../../Disp/HelperFunctions/GetWrinkConfigBank';\r\nimport { CacheUpgrades } from '../VariablesAndData';\r\nimport ColourOfPP from './ColourOfPP';\r\n\r\n/**\r\n * This functions caches the PP of each building it saves all date in CM.Cache.Upgrades\r\n * It is called by CM.Cache.CachePP()\r\n */\r\nexport default function CacheUpgradePP() {\r\n Object.keys(CacheUpgrades).forEach((i) => {\r\n if (Game.cookiesPs) {\r\n CacheUpgrades[i].pp =\r\n Math.max(Game.Upgrades[i].getPrice() - (Game.cookies + GetWrinkConfigBank()), 0) /\r\n Game.cookiesPs +\r\n Game.Upgrades[i].getPrice() / CacheUpgrades[i].bonus;\r\n } else CacheUpgrades[i].pp = Game.Upgrades[i].getPrice() / CacheUpgrades[i].bonus;\r\n if (Number.isNaN(CacheUpgrades[i].pp)) CacheUpgrades[i].pp = Infinity;\r\n\r\n CacheUpgrades[i].colour = ColourOfPP(CacheUpgrades[i], Game.Upgrades[i].getPrice());\r\n });\r\n}\r\n","import CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport SimAuraMult from '../ReplacedGameFunctions/SimAuraMult';\r\nimport SimEff from '../ReplacedGameFunctions/SimEff';\r\nimport SimHas from '../ReplacedGameFunctions/SimHas';\r\nimport SimHasGod from '../ReplacedGameFunctions/SimHasGod';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport {\r\n SimAchievementsOwned,\r\n SimCookiesPs,\r\n SimObjects,\r\n SimPledges,\r\n SimUpgrades,\r\n SimUpgradesOwned, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates the cookies per click\r\n * It is called by CM.Sim.BuyUpgradesBonusIncome() when an upgrades has no bonus-income (and is thus a clicking-upgrade)\r\n * @returns\t{number}\tout\tThe clicking power\r\n */\r\nfunction MouseCps() {\r\n let add = 0;\r\n if (SimHas('Thousand fingers')) add += 0.1;\r\n if (SimHas('Million fingers')) add *= 5;\r\n if (SimHas('Billion fingers')) add *= 10;\r\n if (SimHas('Trillion fingers')) add *= 20;\r\n if (SimHas('Quadrillion fingers')) add *= 20;\r\n if (SimHas('Quintillion fingers')) add *= 20;\r\n if (SimHas('Sextillion fingers')) add *= 20;\r\n if (SimHas('Septillion fingers')) add *= 20;\r\n if (SimHas('Octillion fingers')) add *= 20;\r\n if (SimHas('Nonillion fingers')) add *= 20;\r\n if (SimHas('Decillion fingers')) add *= 20;\r\n if (SimHas('Undecillion fingers')) add *= 20;\r\n if (SimHas('Unshackled cursors')) add *= 25;\r\n let num = 0;\r\n Object.keys(SimObjects).forEach((i) => {\r\n num += SimObjects[i].amount;\r\n });\r\n num -= SimObjects.Cursor.amount;\r\n add *= num;\r\n\r\n // Can use SimCookiesPs as function is always called after CM.Sim.CalculateGains()\r\n if (SimHas('Plastic mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Iron mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Titanium mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Adamantium mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Unobtainium mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Eludium mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Wishalloy mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Fantasteel mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Nevercrack mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Armythril mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Technobsidian mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Plasmarble mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Miraculite mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Aetherice mouse')) add += SimCookiesPs * 0.01;\r\n if (SimHas('Omniplast mouse')) add += SimCookiesPs * 0.01;\r\n\r\n if (SimHas('Fortune #104')) add += SimCookiesPs * 0.01;\r\n\r\n let mult = 1;\r\n if (SimHas(\"Santa's helpers\")) mult *= 1.1;\r\n if (SimHas('Cookie egg')) mult *= 1.1;\r\n if (SimHas('Halo gloves')) mult *= 1.1;\r\n if (SimHas('Dragon claw')) mult *= 1.03;\r\n\r\n if (SimHas('Aura gloves')) {\r\n mult *= 1 + 0.05 * Math.min(Game.Objects.Cursor.level, SimHas('Luminous gloves') ? 20 : 10);\r\n }\r\n\r\n mult *= SimEff('click');\r\n if (SimObjects.Temple.minigameLoaded) {\r\n if (SimHasGod) {\r\n const godLvl = SimHasGod('labor');\r\n if (godLvl === 1) mult *= 1.15;\r\n else if (godLvl === 2) mult *= 1.1;\r\n else if (godLvl === 3) mult *= 1.05;\r\n }\r\n }\r\n\r\n Object.keys(Game.buffs).forEach((i) => {\r\n if (typeof Game.buffs[i].multClick !== 'undefined') mult *= Game.buffs[i].multClick;\r\n });\r\n\r\n // if (CM.Sim.auraMult('Dragon Cursor')) mult*=1.05;\r\n mult *= 1 + SimAuraMult('Dragon Cursor') * 0.05;\r\n\r\n // No need to make this function a CM function\r\n let out =\r\n mult *\r\n Game.ComputeCps(\r\n 1,\r\n SimHas('Reinforced index finger') +\r\n SimHas('Carpal tunnel prevention cream') +\r\n SimHas('Ambidextrous'),\r\n add,\r\n );\r\n\r\n out = Game.runModHookOnValue('cookiesPerClick', out);\r\n\r\n if (Game.hasBuff('Cursed finger')) out = Game.buffs['Cursed finger'].power;\r\n\r\n return out;\r\n}\r\n\r\n/**\r\n * This function calculates the bonus income of buying a building\r\n * It is called by CM.Cache.CacheBuildingIncome()\r\n * @param\t{string}\t\t\t\tbuilding\tThe name of the upgrade to be bought\r\n * @returns {[{number, number}]}\t\t\t\tThe bonus income of the upgrade and the difference in MouseCPS\r\n */\r\nexport default function BuyUpgradesBonusIncome(upgrade) {\r\n if (\r\n Game.Upgrades[upgrade].pool === 'toggle' ||\r\n (Game.Upgrades[upgrade].bought === 0 &&\r\n Game.Upgrades[upgrade].unlocked &&\r\n Game.Upgrades[upgrade].pool !== 'prestige')\r\n ) {\r\n CopyData();\r\n if (SimUpgrades[upgrade].name === 'Shimmering veil [on]') {\r\n SimUpgrades['Shimmering veil [off]'].bought = 0;\r\n } else if (SimUpgrades[upgrade].name === 'Golden switch [on]') {\r\n SimUpgrades['Golden switch [off]'].bought = 0;\r\n } else {\r\n SimUpgrades[upgrade].bought = (SimUpgrades[upgrade].bought + 1) % 2;\r\n }\r\n if (Game.CountsAsUpgradeOwned(Game.Upgrades[upgrade].pool)) SimUpgradesOwned += 1;\r\n\r\n if (upgrade === 'Elder Pledge') {\r\n SimPledges += 1;\r\n if (SimPledges > 0) SimWin('Elder nap');\r\n if (SimPledges >= 5) SimWin('Elder slumber');\r\n } else if (upgrade === 'Elder Covenant') {\r\n SimWin('Elder calm');\r\n } else if (upgrade === 'Prism heart biscuits') {\r\n SimWin('Lovely cookies');\r\n } else if (upgrade === 'Heavenly key') {\r\n SimWin('Wholesome');\r\n }\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n\r\n const diffMouseCPS = MouseCps() - Game.computedMouseCps;\r\n if (diffMouseCPS) {\r\n return [SimCookiesPs - Game.cookiesPs, diffMouseCPS];\r\n }\r\n return [SimCookiesPs - Game.cookiesPs];\r\n }\r\n return [];\r\n}\r\n","/** Section: Functions related to caching income */\r\n\r\nimport BuildingGetPrice from '../../Sim/SimulationEvents/BuyBuilding';\r\nimport BuyBuildingsBonusIncome from '../../Sim/SimulationEvents/BuyBuildingBonusIncome';\r\nimport BuyUpgradesBonusIncome from '../../Sim/SimulationEvents/BuyUpgrades';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheAverageGainBank,\r\n CacheAverageGainWrink,\r\n CacheAverageGainWrinkFattest,\r\n CacheDoRemakeBuildPrices, // eslint-disable-line no-unused-vars\r\n CacheObjects1,\r\n CacheObjects10,\r\n CacheObjects100,\r\n CacheObjectsNextAchievement,\r\n CacheUpgrades,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions starts the calculation/simulation of the bonus income of buildings\r\n * It is called by CM.Cache.CacheIncome()\r\n * @param\t{amount}\tamount\tAmount to be bought\r\n * @parem\t{string}\ttarget\tThe target Cache object (\"Objects1\", \"Objects10\" or \"Objects100\")\r\n */\r\nfunction CacheBuildingIncome(amount) {\r\n const result = {};\r\n Object.keys(Game.Objects).forEach((i) => {\r\n result[i] = {};\r\n result[i].bonus = BuyBuildingsBonusIncome(i, amount);\r\n if (amount !== 1) {\r\n CacheDoRemakeBuildPrices = 1;\r\n }\r\n });\r\n return result;\r\n}\r\n\r\n/**\r\n * This functions starts the calculation/simulation of the bonus income of upgrades\r\n * It is called by CM.Cache.CacheIncome()\r\n */\r\nfunction CacheUpgradeIncome() {\r\n CacheUpgrades = {};\r\n for (let i = 0; i < Game.UpgradesInStore.length; i++) {\r\n const upgradeName = Game.UpgradesInStore[i].name;\r\n const bonusIncome = BuyUpgradesBonusIncome(upgradeName);\r\n if (upgradeName === 'Elder Pledge') {\r\n CacheUpgrades[upgradeName] = {\r\n bonus: Game.cookiesPs - CacheAverageGainBank,\r\n };\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 1)\r\n CacheUpgrades[upgradeName].bonus -= CacheAverageGainWrink;\r\n else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.CalcWrink === 2)\r\n CacheUpgrades[upgradeName].bonus -= CacheAverageGainWrinkFattest;\r\n if (!Number.isFinite(CacheUpgrades[upgradeName].bonus)) CacheUpgrades[upgradeName].bonus = 0;\r\n } else {\r\n CacheUpgrades[upgradeName] = {};\r\n if (bonusIncome[0]) CacheUpgrades[upgradeName].bonus = bonusIncome[0];\r\n if (bonusIncome[1]) CacheUpgrades[upgradeName].bonusMouse = bonusIncome[1];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * This functions caches the price of each building and stores it in the cache\r\n */\r\nexport function CacheBuildingsPrices() {\r\n Object.keys(Game.Objects).forEach((i) => {\r\n CacheObjects1[i].price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n 1,\r\n );\r\n CacheObjects10[i].price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n 10,\r\n );\r\n CacheObjects100[i].price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n 100,\r\n );\r\n CacheObjectsNextAchievement[i].price = BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n CacheObjectsNextAchievement[i].AmountNeeded,\r\n );\r\n });\r\n\r\n FillCMDCache({ CacheObjectsNextAchievement });\r\n}\r\n\r\n/**\r\n * This functions caches the income gain of each building and upgrade and stores it in the cache\r\n * It is called by CM.Main.Loop() and CM.Cache.InitCache()\r\n */\r\nexport function CacheIncome() {\r\n // Simulate Building Buys for 1, 10 and 100 amount\r\n CacheObjects1 = CacheBuildingIncome(1);\r\n CacheObjects10 = CacheBuildingIncome(10);\r\n CacheObjects100 = CacheBuildingIncome(100);\r\n\r\n // Simulate Upgrade Buys\r\n CacheUpgradeIncome();\r\n}\r\n","import GetCPSBuffMult from '../CPS/GetCPSBuffMult';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheChainFrenzyMaxReward,\r\n CacheChainFrenzyRequired,\r\n CacheChainFrenzyRequiredNext,\r\n CacheChainFrenzyWrathMaxReward,\r\n CacheChainFrenzyWrathRequired,\r\n CacheChainFrenzyWrathRequiredNext,\r\n CacheChainMaxReward,\r\n CacheChainRequired,\r\n CacheChainRequiredNext,\r\n CacheChainWrathMaxReward,\r\n CacheChainWrathRequired,\r\n CacheChainWrathRequiredNext,\r\n CacheDragonsFortuneMultAdjustment,\r\n CacheGoldenCookiesMult,\r\n CacheNoGoldSwitchCookiesPS,\r\n CacheWrathCookiesMult,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions calculates the max possible payout given a set of variables\r\n * It is called by CM.Disp.CreateStatsChainSection() and CM.Cache.CacheChain()\r\n * @param\t{number}\t\t\t\t\tdigit\t\tNumber of Golden Cookies in chain\r\n * @param\t{number}\t\t\t\t\tmaxPayout\tMaximum payout\r\n * @param\t{number}\t\t\t\t\tmult\t\tMultiplier\r\n * @returns\t[{number, number, number}]\t\t\t\tTotal cookies earned, cookie needed for this and next level\r\n */\r\nexport function MaxChainCookieReward(digit, maxPayout, mult) {\r\n let totalFromChain = 0;\r\n let moni = 0;\r\n let nextMoni = 0;\r\n let nextRequired = 0;\r\n let chain = 1 + Math.max(0, Math.ceil(Math.log(Game.cookies) / Math.LN10) - 10);\r\n while (nextMoni < maxPayout * mult) {\r\n moni = Math.max(\r\n digit,\r\n Math.min(Math.floor((1 / 9) * 10 ** chain * digit * mult), maxPayout * mult),\r\n );\r\n nextMoni = Math.max(\r\n digit,\r\n Math.min(Math.floor((1 / 9) * 10 ** (chain + 1) * digit * mult), maxPayout * mult),\r\n );\r\n nextRequired = Math.floor((1 / 9) * 10 ** (chain + 1) * digit * mult);\r\n totalFromChain += moni;\r\n chain += 1;\r\n }\r\n return [totalFromChain, moni, nextRequired];\r\n}\r\n\r\n/**\r\n * This functions caches data related to Chain Cookies reward from Golden Cookioes\r\n * It is called by CM.Main.Loop() upon changes to cps and CM.Cache.InitCache()\r\n * @global\t[{number, number}]\tCM.Cache.ChainMaxReward\t\t\tTotal cookies earned, and cookies needed for next level for normal chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainRequired\t\t\tCookies needed for maximum reward for normal chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainRequiredNext\t\tTotal cookies needed for next level for normal chain\r\n * @global\t[{number, number}]\tCM.Cache.ChainMaxWrathReward\t\t\tTotal cookies earned, and cookies needed for next level for wrath chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainWrathRequired\t\t\tCookies needed for maximum reward for wrath chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainWrathRequiredNext\t\tTotal cookies needed for next level for wrath chain\r\n * @global\t[{number, number}]\tCM.Cache.ChainFrenzyMaxReward\t\t\tTotal cookies earned, and cookies needed for next level for normal frenzy chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainFrenzyRequired\t\t\tCookies needed for maximum reward for normal frenzy chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainFrenzyRequiredNext\t\tTotal cookies needed for next level for normal frenzy chain\r\n * @global\t[{number, number}]\tCM.Cache.ChainFrenzyWrathMaxReward\t\t\tTotal cookies earned, and cookies needed for next level for wrath frenzy chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainFrenzyWrathRequired\t\t\tCookies needed for maximum reward for wrath frenzy chain\r\n * @global\t{number}\t\t\tCM.Cache.ChainFrenzyWrathRequiredNext\t\tTotal cookies needed for next level for wrath frenzy chain\r\n */\r\nexport function CacheChain() {\r\n let maxPayout = CacheNoGoldSwitchCookiesPS * 60 * 60 * 6 * CacheDragonsFortuneMultAdjustment;\r\n // Removes effect of Frenzy etc.\r\n const cpsBuffMult = GetCPSBuffMult();\r\n if (cpsBuffMult > 0) maxPayout /= cpsBuffMult;\r\n else maxPayout = 0;\r\n\r\n CacheChainMaxReward = MaxChainCookieReward(7, maxPayout, CacheGoldenCookiesMult);\r\n CacheChainRequired = (CacheChainMaxReward[1] * 2) / CacheGoldenCookiesMult;\r\n CacheChainRequiredNext = CacheChainMaxReward[2] / 60 / 60 / 6 / CacheDragonsFortuneMultAdjustment;\r\n\r\n CacheChainWrathMaxReward = MaxChainCookieReward(6, maxPayout, CacheWrathCookiesMult);\r\n CacheChainWrathRequired = (CacheChainWrathMaxReward[1] * 2) / CacheWrathCookiesMult;\r\n CacheChainWrathRequiredNext =\r\n CacheChainWrathMaxReward[2] / 60 / 60 / 6 / CacheDragonsFortuneMultAdjustment;\r\n\r\n CacheChainFrenzyMaxReward = MaxChainCookieReward(7, maxPayout * 7, CacheGoldenCookiesMult);\r\n CacheChainFrenzyRequired = (CacheChainFrenzyMaxReward[1] * 2) / CacheGoldenCookiesMult;\r\n CacheChainFrenzyRequiredNext =\r\n CacheChainFrenzyMaxReward[2] / 60 / 60 / 6 / CacheDragonsFortuneMultAdjustment;\r\n\r\n CacheChainFrenzyWrathMaxReward = MaxChainCookieReward(6, maxPayout * 7, CacheWrathCookiesMult);\r\n CacheChainFrenzyWrathRequired = (CacheChainFrenzyWrathMaxReward[1] * 2) / CacheWrathCookiesMult;\r\n CacheChainFrenzyWrathRequiredNext =\r\n CacheChainFrenzyWrathMaxReward[2] / 60 / 60 / 6 / CacheDragonsFortuneMultAdjustment;\r\n\r\n FillCMDCache({\r\n CacheChainMaxReward,\r\n CacheChainRequired,\r\n CacheChainRequiredNext,\r\n CacheChainWrathMaxReward,\r\n CacheChainWrathRequired,\r\n CacheChainWrathRequiredNext,\r\n CacheChainFrenzyMaxReward,\r\n CacheChainFrenzyRequired,\r\n CacheChainFrenzyRequiredNext,\r\n CacheChainFrenzyWrathMaxReward,\r\n CacheChainFrenzyWrathRequired,\r\n CacheChainFrenzyWrathRequiredNext,\r\n });\r\n}\r\n","import FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheHCPerSecond,\r\n CacheLastHeavenlyCheck,\r\n CacheLastHeavenlyChips,\r\n HeavenlyChipsDiff,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the heavenly chips per second in the last five seconds\r\n * It is called by CM.Cache.LoopCache()\r\n * @global\t{number}\tCM.Cache.HCPerSecond\tThe Heavenly Chips per second in the last five seconds\r\n */\r\nexport default function CacheHeavenlyChipsPS() {\r\n const currDate = Math.floor(Date.now() / 1000);\r\n // Only calculate every new second\r\n if ((Game.T / Game.fps) % 1 === 0) {\r\n const chipsOwned = Game.HowMuchPrestige(Game.cookiesReset);\r\n const ascendNowToOwn = Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned));\r\n const ascendNowToGet = ascendNowToOwn - Math.floor(chipsOwned);\r\n\r\n // Add recent gains to AvgQueue's\r\n const timeDiff = currDate - CacheLastHeavenlyCheck;\r\n const heavenlyChipsDiffAvg = Math.max(0, ascendNowToGet - CacheLastHeavenlyChips) / timeDiff;\r\n for (let i = 0; i < timeDiff; i++) {\r\n HeavenlyChipsDiff.addLatest(heavenlyChipsDiffAvg);\r\n }\r\n\r\n // Store current data for next loop\r\n CacheLastHeavenlyCheck = currDate;\r\n CacheLastHeavenlyChips = ascendNowToGet;\r\n\r\n // Get average gain over period of 5 seconds\r\n CacheHCPerSecond = HeavenlyChipsDiff.calcAverage(5);\r\n }\r\n\r\n FillCMDCache({ CacheLastHeavenlyCheck, CacheLastHeavenlyChips, CacheHCPerSecond });\r\n}\r\n","import { crateMissing } from '../../Disp/MenuSections/Statistics/CreateMissingUpgrades';\r\nimport {\r\n CacheMissingUpgrades, // eslint-disable-line no-unused-vars\r\n CacheMissingUpgradesCookies, // eslint-disable-line no-unused-vars\r\n CacheMissingUpgradesPrestige, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches variables related to missing upgrades\r\n * It is called by CM.Main.Loop() and CM.Cache.InitCache()\r\n * @global\t{string}\tCM.Cache.MissingUpgrades\t\t\tString containig the HTML to create the \"crates\" for missing normal upgrades\r\n * @global\t{string}\tCM.Cache.MissingUpgradesCookies\t\tString containig the HTML to create the \"crates\" for missing cookie upgrades\r\n * @global\t{string}\tCM.Cache.MissingUpgradesPrestige\tString containig the HTML to create the \"crates\" for missing prestige upgrades\r\n */\r\nexport default function CacheAllMissingUpgrades() {\r\n CacheMissingUpgrades = '';\r\n CacheMissingUpgradesCookies = '';\r\n CacheMissingUpgradesPrestige = '';\r\n const list = [];\r\n // sort the upgrades\r\n Object.keys(Game.Upgrades).forEach((i) => {\r\n list.push(Game.Upgrades[i]);\r\n });\r\n const sortMap = function (a, b) {\r\n if (a.order > b.order) return 1;\r\n if (a.order < b.order) return -1;\r\n return 0;\r\n };\r\n list.sort(sortMap);\r\n\r\n Object.keys(list).forEach((i) => {\r\n const me = list[i];\r\n\r\n if (me.bought === 0) {\r\n let str = '';\r\n\r\n str += crateMissing(me);\r\n /* eslint-disable no-unused-vars */\r\n if (me.pool === 'prestige') CacheMissingUpgradesPrestige += str;\r\n else if (me.pool === 'cookie') CacheMissingUpgradesCookies += str;\r\n else if (me.pool !== 'toggle' && me.pool !== 'unused' && me.pool !== 'debug')\r\n CacheMissingUpgrades += str;\r\n /* eslint-enable no-unused-vars */\r\n }\r\n });\r\n}\r\n","/** Functions related to displaying the missing upgrades in the Statistics page */\r\n\r\nimport {\r\n CacheMissingUpgrades,\r\n CacheMissingUpgradesCookies,\r\n CacheMissingUpgradesPrestige,\r\n} from '../../../Cache/VariablesAndData';\r\n\r\n/**\r\n * This function creates the missing upgrades sections for prestige, normal and cookie upgrades\r\n */\r\nexport function AddMissingUpgrades() {\r\n l('menu').childNodes.forEach((menuSection) => {\r\n if (menuSection.children[0]) {\r\n if (menuSection.children[0].innerHTML === 'Prestige' && CacheMissingUpgradesPrestige) {\r\n const prestigeUpgradesMissing =\r\n CacheMissingUpgradesPrestige.match(new RegExp('div', 'g') || []).length / 2;\r\n const title = document.createElement('div');\r\n title.id = 'CMMissingUpgradesPrestigeTitle';\r\n title.className = 'listing';\r\n const titlefrag = document.createElement('div');\r\n titlefrag.innerHTML = `<b>Missing Prestige upgrades:</b> ${prestigeUpgradesMissing}/${\r\n Game.PrestigeUpgrades.length\r\n } (${Math.floor((prestigeUpgradesMissing / Game.PrestigeUpgrades.length) * 100)}%)`;\r\n title.appendChild(titlefrag);\r\n menuSection.appendChild(title);\r\n const upgrades = document.createElement('div');\r\n upgrades.className = 'listing crateBox';\r\n upgrades.innerHTML = CacheMissingUpgradesPrestige;\r\n menuSection.appendChild(upgrades);\r\n } else if (menuSection.children[0].innerHTML === 'Upgrades') {\r\n if (CacheMissingUpgrades) {\r\n const normalUpgradesMissing =\r\n CacheMissingUpgrades.match(new RegExp('div', 'g') || []).length / 2;\r\n const title = document.createElement('div');\r\n title.id = 'CMMissingUpgradesTitle';\r\n title.className = 'listing';\r\n const titlefrag = document.createElement('div');\r\n titlefrag.innerHTML = `<b>Missing normal upgrades:</b> ${normalUpgradesMissing}/${\r\n Game.UpgradesByPool[''].length + Game.UpgradesByPool.tech.length\r\n } (${Math.floor(\r\n (normalUpgradesMissing /\r\n (Game.UpgradesByPool[''].length + Game.UpgradesByPool.tech.length)) *\r\n 100,\r\n )}%)`;\r\n title.appendChild(titlefrag);\r\n menuSection.insertBefore(title, menuSection.childNodes[3]);\r\n const upgrades = document.createElement('div');\r\n upgrades.className = 'listing crateBox';\r\n upgrades.innerHTML = CacheMissingUpgrades;\r\n menuSection.insertBefore(\r\n upgrades,\r\n document.getElementById('CMMissingUpgradesTitle').nextSibling,\r\n );\r\n }\r\n if (CacheMissingUpgradesCookies) {\r\n const cookieUpgradesMissing =\r\n CacheMissingUpgradesCookies.match(new RegExp('div', 'g') || []).length / 2;\r\n const title = document.createElement('div');\r\n title.id = 'CMMissingUpgradesCookiesTitle';\r\n title.className = 'listing';\r\n const titlefrag = document.createElement('div');\r\n titlefrag.innerHTML = `<b>Missing Cookie upgrades:</b> ${cookieUpgradesMissing}/${\r\n Game.UpgradesByPool.cookie.length\r\n } (${Math.floor((cookieUpgradesMissing / Game.UpgradesByPool.cookie.length) * 100)}%)`;\r\n title.appendChild(titlefrag);\r\n menuSection.appendChild(title);\r\n const upgrades = document.createElement('div');\r\n upgrades.className = 'listing crateBox';\r\n upgrades.innerHTML = CacheMissingUpgradesCookies;\r\n menuSection.appendChild(upgrades);\r\n }\r\n }\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * This function returns the \"crates\" (icons) for missing upgrades in the stats sections\r\n * It returns a html string that gets appended to the respective CM.Cache.MissingUpgrades-variable by CM.Cache.CacheMissingUpgrades()\r\n * @param\t{object}\tme\tThe upgrade object\r\n * @returns\t{string}\t?\tThe HTML string that creates the icon.\r\n */\r\nexport function crateMissing(me) {\r\n let classes = 'crate upgrade missing';\r\n if (me.pool === 'prestige') classes += ' heavenly';\r\n\r\n let noFrame = 0;\r\n if (!Game.prefs.crates) noFrame = 1;\r\n if (noFrame) classes += ' noFrame';\r\n\r\n let { icon } = me;\r\n if (me.iconFunction) icon = me.iconFunction();\r\n const tooltip = `function() {return Game.crateTooltip(Game.UpgradesById[${me.id}], 'stats');}`;\r\n return `<div class=\"${classes}\"\r\n\t${Game.getDynamicTooltip(tooltip, 'top', true)}\r\n\tstyle = \"${`${icon[2] ? `background-image: url(${icon[2]});` : ''}background-position:${\r\n -icon[0] * 48\r\n }px ${-icon[1] * 48}px`};\">\r\n\t</div>`;\r\n}\r\n","import FillCMDCache from '../FillCMDCache';\r\nimport { CacheSeaSpec } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the reward of popping a reindeer\r\n * It is called by CM.Main.Loop() and CM.Cache.InitCache()\r\n * @global\t{number}\tCM.Cache.SeaSpec\tThe reward for popping a reindeer\r\n */\r\nexport default function CacheSeasonSpec() {\r\n if (Game.season === 'christmas') {\r\n let val = Game.cookiesPs * 60;\r\n if (Game.hasBuff('Elder frenzy')) val *= 0.5;\r\n if (Game.hasBuff('Frenzy')) val *= 0.75;\r\n CacheSeaSpec = Math.max(25, val);\r\n if (Game.Has('Ho ho ho-flavored frosting')) CacheSeaSpec *= 2;\r\n }\r\n\r\n FillCMDCache({ CacheSeaSpec });\r\n}\r\n","/** Functions related to Caching stats */\r\n\r\nimport SimHas from '../../Sim/ReplacedGameFunctions/SimHas';\r\nimport GetCPSBuffMult from '../CPS/GetCPSBuffMult';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheConjure,\r\n CacheConjureReward,\r\n CacheDragonsFortuneMultAdjustment,\r\n CacheEdifice,\r\n CacheEdificeBuilding,\r\n CacheGoldenCookiesMult,\r\n CacheLucky,\r\n CacheLuckyFrenzy,\r\n CacheLuckyReward,\r\n CacheLuckyRewardFrenzy,\r\n CacheLuckyWrathReward,\r\n CacheLuckyWrathRewardFrenzy,\r\n CacheNoGoldSwitchCookiesPS,\r\n CacheWrathCookiesMult,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches variables related to the stats page\r\n */\r\nexport function CacheStatsCookies() {\r\n CacheLucky = (CacheNoGoldSwitchCookiesPS * 900) / 0.15;\r\n CacheLucky *= CacheDragonsFortuneMultAdjustment;\r\n const cpsBuffMult = GetCPSBuffMult();\r\n if (cpsBuffMult > 0) CacheLucky /= cpsBuffMult;\r\n else CacheLucky = 0;\r\n CacheLuckyReward = CacheGoldenCookiesMult * (CacheLucky * 0.15) + 13;\r\n CacheLuckyWrathReward = CacheWrathCookiesMult * (CacheLucky * 0.15) + 13;\r\n CacheLuckyFrenzy = CacheLucky * 7;\r\n CacheLuckyRewardFrenzy = CacheGoldenCookiesMult * (CacheLuckyFrenzy * 0.15) + 13;\r\n CacheLuckyWrathRewardFrenzy = CacheWrathCookiesMult * (CacheLuckyFrenzy * 0.15) + 13;\r\n CacheConjure = CacheLucky * 2;\r\n CacheConjureReward = CacheConjure * 0.15;\r\n\r\n CacheEdifice = 0;\r\n let max = 0;\r\n let n = 0;\r\n Object.keys(Game.Objects).forEach((i) => {\r\n if (Game.Objects[i].amount > max) max = Game.Objects[i].amount;\r\n if (Game.Objects[i].amount > 0) n += 1;\r\n });\r\n Object.keys(Game.Objects).forEach((i) => {\r\n if (\r\n (Game.Objects[i].amount < max || n === 1) &&\r\n Game.Objects[i].amount < 400 &&\r\n Game.Objects[i].price * 2 > CacheEdifice\r\n ) {\r\n CacheEdifice = Game.Objects[i].price * 2;\r\n CacheEdificeBuilding = i;\r\n }\r\n });\r\n\r\n FillCMDCache({\r\n CacheLucky,\r\n CacheLuckyReward,\r\n CacheLuckyWrathReward,\r\n CacheLuckyFrenzy,\r\n CacheLuckyRewardFrenzy,\r\n CacheLuckyWrathRewardFrenzy,\r\n CacheConjure,\r\n CacheConjureReward,\r\n CacheEdifice,\r\n CacheEdificeBuilding,\r\n });\r\n}\r\n\r\n/**\r\n * This functions calculates the multipliers of Golden and Wrath cookie rewards\r\n */\r\nexport function CacheGoldenAndWrathCookiesMults() {\r\n let goldenMult = 1;\r\n let wrathMult = 1;\r\n let mult = 1;\r\n\r\n // Factor auras and upgrade in mults\r\n if (SimHas('Green yeast digestives')) mult *= 1.01;\r\n if (SimHas('Dragon fang')) mult *= 1.03;\r\n\r\n goldenMult *= 1 + Game.auraMult('Ancestral Metamorphosis') * 0.1;\r\n goldenMult *= Game.eff('goldenCookieGain');\r\n wrathMult *= 1 + Game.auraMult('Unholy Dominion') * 0.1;\r\n wrathMult *= Game.eff('wrathCookieGain');\r\n\r\n // Calculate final golden and wrath multipliers\r\n CacheGoldenCookiesMult = mult * goldenMult;\r\n CacheWrathCookiesMult = mult * wrathMult;\r\n\r\n // Calculate Dragon's Fortune multiplier adjustment:\r\n // If Dragon's Fortune (or Reality Bending) aura is active and there are currently no golden cookies,\r\n // compute a multiplier adjustment to apply on the current CPS to simulate 1 golden cookie on screen.\r\n // Otherwise, the aura effect will be factored in the base CPS making the multiplier not requiring adjustment.\r\n CacheDragonsFortuneMultAdjustment = 1;\r\n if (Game.shimmerTypes.golden.n === 0) {\r\n CacheDragonsFortuneMultAdjustment *= 1 + Game.auraMult(\"Dragon's Fortune\") * 1.23;\r\n }\r\n\r\n FillCMDCache({\r\n CacheGoldenCookiesMult,\r\n CacheWrathCookiesMult,\r\n CacheDragonsFortuneMultAdjustment,\r\n });\r\n}\r\n","import BuildingGetPrice from '../../Sim/SimulationEvents/BuyBuilding';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheObjectsNextAchievement } from '../VariablesAndData';\r\nimport IndividualAmountTillNextAchievement from './IndividualAmountTillNextAchievement';\r\n\r\n/**\r\n * This functions caches the amount of buildings needed till next achievement\r\n * @param\t{boolean}\tforceRecalc\tWhether a recalcution should be forced (after CPS change)\r\n */\r\nexport default function AllAmountTillNextAchievement(forceRecalc) {\r\n const result = {};\r\n\r\n Object.keys(Game.Objects).forEach((i) => {\r\n if (\r\n Object.keys(CacheObjectsNextAchievement).length !== 0 &&\r\n CacheObjectsNextAchievement[i].TotalNeeded > Game.Objects[i].amount &&\r\n !forceRecalc\r\n ) {\r\n result[i] = {\r\n AmountNeeded: CacheObjectsNextAchievement[i].TotalNeeded - Game.Objects[i].amount,\r\n TotalNeeded: CacheObjectsNextAchievement[i].TotalNeeded,\r\n price: BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n CacheObjectsNextAchievement[i].TotalNeeded - Game.Objects[i].amount,\r\n ),\r\n };\r\n } else {\r\n const tillNext = IndividualAmountTillNextAchievement(i);\r\n result[i] = {\r\n AmountNeeded: tillNext,\r\n TotalNeeded: Game.Objects[i].amount + tillNext,\r\n price: BuildingGetPrice(\r\n i,\r\n Game.Objects[i].basePrice,\r\n Game.Objects[i].amount,\r\n Game.Objects[i].free,\r\n tillNext,\r\n ),\r\n };\r\n }\r\n });\r\n CacheObjectsNextAchievement = result;\r\n\r\n FillCMDCache({ CacheObjectsNextAchievement });\r\n}\r\n","import BuyBuildingsBonusIncome from '../../Sim/SimulationEvents/BuyBuildingBonusIncome';\r\nimport { SimAchievementsOwned } from '../../Sim/VariablesAndData';\r\n\r\nexport default function IndividualAmountTillNextAchievement(building) {\r\n const AchievementsAtStart = Game.AchievementsOwned;\r\n let index = 100;\r\n let lastIndexWithChange = 100;\r\n while (index > -1) {\r\n BuyBuildingsBonusIncome(building, index);\r\n if (SimAchievementsOwned > AchievementsAtStart) {\r\n lastIndexWithChange = index;\r\n index -= 10;\r\n } else if (index === 100) {\r\n return 101;\r\n } else {\r\n index += 1;\r\n while (index <= lastIndexWithChange) {\r\n BuyBuildingsBonusIncome(building, index);\r\n if (SimAchievementsOwned > AchievementsAtStart) {\r\n return index;\r\n }\r\n index += 1;\r\n }\r\n }\r\n }\r\n return 101;\r\n}\r\n","/** Caches data related to Wrinklers */\r\n\r\nimport { SimObjects } from '../../Sim/VariablesAndData';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport {\r\n CacheWrinklersFattest,\r\n CacheWrinklersNormal,\r\n CacheWrinklersTotal,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches data related to Wrinklers\r\n * It is called by CM.Cache.LoopCache() and CM.Cache.InitCache()\r\n * @global\t{number}\t\t\t\tCM.Cache.WrinklersTotal\t\tThe cookies of all wrinklers\r\n * @global\t{number}\t\t\t\tCM.Cache.WrinklersNormal\tThe cookies of all normal wrinklers\r\n * @global\t{[{number}, {number}]}\tCM.Cache.WrinklersFattest\tA list containing the cookies and the id of the fattest non-shiny wrinkler\r\n */\r\nexport default function CacheWrinklers() {\r\n CacheWrinklersTotal = 0;\r\n CacheWrinklersNormal = 0;\r\n CacheWrinklersFattest = [0, null];\r\n for (let i = 0; i < Game.wrinklers.length; i++) {\r\n let { sucked } = Game.wrinklers[i];\r\n let toSuck = 1.1;\r\n if (Game.Has('Sacrilegious corruption')) toSuck *= 1.05;\r\n if (Game.wrinklers[i].type === 1) toSuck *= 3; // Shiny wrinklers\r\n sucked *= toSuck;\r\n if (Game.Has('Wrinklerspawn')) sucked *= 1.05;\r\n if (SimObjects.Temple.minigameLoaded) {\r\n const godLvl = Game.hasGod('scorn');\r\n if (godLvl === 1) sucked *= 1.15;\r\n else if (godLvl === 2) sucked *= 1.1;\r\n else if (godLvl === 3) sucked *= 1.05;\r\n }\r\n CacheWrinklersTotal += sucked;\r\n if (Game.wrinklers[i].type === 0) {\r\n CacheWrinklersNormal += sucked;\r\n if (sucked > CacheWrinklersFattest[0]) CacheWrinklersFattest = [sucked, i];\r\n }\r\n }\r\n\r\n FillCMDCache({ CacheWrinklersTotal, CacheWrinklersNormal, CacheWrinklersFattest });\r\n}\r\n","import { ClickTimes } from '../Disp/VariablesAndData';\r\nimport { CMAvgQueue, InitCookiesDiff } from './CPS/AverageQueue';\r\nimport CacheAvgCPS from './CPS/CPS';\r\nimport CacheDragonAuras from './Dragon/CacheDragonAuras';\r\nimport CachePP from './PP/PP';\r\nimport { CacheBuildingsPrices, CacheIncome } from './PriceAndIncome/PriceAndIncome';\r\nimport { CacheChain } from './Stats/ChainCookies';\r\nimport CacheHeavenlyChipsPS from './Stats/HeavenlyChips';\r\nimport CacheAllMissingUpgrades from './Stats/MissingUpgrades';\r\nimport CacheSeasonSpec from './Stats/Reindeer';\r\nimport { CacheGoldenAndWrathCookiesMults, CacheStatsCookies } from './Stats/Stats';\r\nimport AllAmountTillNextAchievement from './TillNextAchievement/AllAmountTillNextAchievement';\r\nimport { CacheAverageCookiesFromClicks, HeavenlyChipsDiff } from './VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport CacheWrinklers from './Wrinklers/Wrinklers';\r\n\r\n/**\r\n * This functions runs all cache-functions to generate all \"full\" cache\r\n */\r\nexport default function InitCache() {\r\n CacheDragonAuras();\r\n CacheWrinklers();\r\n CacheStatsCookies();\r\n CacheGoldenAndWrathCookiesMults();\r\n CacheChain();\r\n CacheAllMissingUpgrades();\r\n CacheSeasonSpec();\r\n InitCookiesDiff();\r\n /** Used by CM.Cache.CacheHeavenlyChipsPS() */\r\n HeavenlyChipsDiff = new CMAvgQueue(5);\r\n CacheAverageCookiesFromClicks = new CMAvgQueue(ClickTimes[ClickTimes.length - 1] * 20);\r\n CacheHeavenlyChipsPS();\r\n AllAmountTillNextAchievement();\r\n CacheAvgCPS();\r\n CacheIncome();\r\n CacheBuildingsPrices();\r\n CachePP();\r\n}\r\n","/**\r\n * This function pops all normal wrinklers\r\n * It is called by a click of the 'pop all' button created by CM.Disp.AddMenuStats()\r\n */\r\nexport default function PopAllNormalWrinklers() {\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n if (Game.wrinklers[i].sucked > 0 && Game.wrinklers[i].type === 0) {\r\n Game.wrinklers[i].hp = 0;\r\n }\r\n });\r\n}\r\n","import UpdateTooltips from './UpdateTooltips';\r\nimport { SimpleTooltipElements, TooltipName, TooltipType } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport BuildingGetPrice from '../../Sim/SimulationEvents/BuyBuilding';\r\nimport GetTimeColour from '../BeautifyAndFormatting/GetTimeColour';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\n\r\n/** All general functions related to creating and updating tooltips */\r\n\r\n/**\r\n * This function creates some very basic tooltips, (e.g., the tooltips in the stats page)\r\n * The tooltips are created with CM.Disp[placeholder].appendChild(desc)\r\n * @param\t{string}\tplaceholder\tThe name used to later refer and spawn the tooltip\r\n * @param\t{string}\ttext\t\tThe text of the tooltip\r\n * @param\t{string}\tminWidth\tThe minimum width of the tooltip\r\n */\r\nexport function CreateSimpleTooltip(placeholder, text, minWidth) {\r\n const Tooltip = document.createElement('div');\r\n Tooltip.id = placeholder;\r\n const desc = document.createElement('div');\r\n desc.style.minWidth = minWidth;\r\n desc.style.marginBottom = '4px';\r\n const div = document.createElement('div');\r\n div.style.textAlign = 'left';\r\n div.textContent = text;\r\n desc.appendChild(div);\r\n Tooltip.appendChild(desc);\r\n SimpleTooltipElements[placeholder] = Tooltip;\r\n}\r\n\r\n/**\r\n * This function enhance the standard tooltips by creating and changing l('tooltip')\r\n * The function is called by .onmouseover events that have replaced original code to use CM.Disp.Tooltip()\r\n * @param\t{string}\ttype\t\t\t\t\tType of tooltip (b, u, s or g)\r\n * @param\t{string}\tname\t\t\t\t\tName of the object/item the tooltip relates to\r\n * @returns {string}\tl('tooltip').innerHTML\tThe HTML of the l('tooltip')-object\r\n */\r\nexport function CreateTooltip(type, name) {\r\n if (type === 'b') {\r\n // Buildings\r\n l('tooltip').innerHTML = Game.Objects[name].tooltip();\r\n // Adds amortization info to the list of info per building\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipAmor === 1) {\r\n const buildPrice = BuildingGetPrice(\r\n name,\r\n Game.Objects[name].basePrice,\r\n 0,\r\n Game.Objects[name].free,\r\n Game.Objects[name].amount,\r\n );\r\n const amortizeAmount = buildPrice - Game.Objects[name].totalCookies;\r\n if (amortizeAmount > 0) {\r\n l('tooltip').innerHTML = l('tooltip')\r\n .innerHTML.split('so far</div>')\r\n .join(\r\n `so far<br/>• <b>${Beautify(amortizeAmount)}</b> ${\r\n Math.floor(amortizeAmount) === 1 ? 'cookie' : 'cookies'\r\n } left to amortize (${\r\n GetTimeColour(\r\n (buildPrice - Game.Objects[name].totalCookies) /\r\n (Game.Objects[name].storedTotalCps * Game.globalCpsMult),\r\n ).text\r\n })</div>`,\r\n );\r\n }\r\n }\r\n if (Game.buyMode === -1) {\r\n /*\r\n * Fix sell price displayed in the object tooltip.\r\n *\r\n * The buildings sell price displayed by the game itself (without any mod) is incorrect.\r\n * The following line of code fixes this issue, and can be safely removed when the game gets fixed.\r\n *\r\n * This issue is extensively detailed here: https://github.com/Aktanusa/CookieMonster/issues/359#issuecomment-735658262\r\n */\r\n l('tooltip').innerHTML = l('tooltip')\r\n .innerHTML.split(Beautify(Game.Objects[name].bulkPrice))\r\n .join(\r\n Beautify(\r\n (Game.Objects[name],\r\n Game.Objects[name].basePrice,\r\n Game.Objects[name].amount,\r\n Game.Objects[name].free,\r\n Game.buyBulk,\r\n 1),\r\n ),\r\n );\r\n }\r\n } else if (type === 'u') {\r\n // Upgrades\r\n if (!Game.UpgradesInStore[name]) return '';\r\n l('tooltip').innerHTML = Game.crateTooltip(Game.UpgradesInStore[name], 'store');\r\n } else if (type === 's') l('tooltip').innerHTML = Game.lumpTooltip();\r\n // Sugar Lumps\r\n else if (type === 'g')\r\n l('tooltip').innerHTML = Game.Objects['Wizard tower'].minigame.spellTooltip(name)();\r\n // Grimoire\r\n else if (type === 'p')\r\n l('tooltip').innerHTML = Game.ObjectsById[2].minigame.tileTooltip(name[0], name[1])();\r\n // Harvest all button in garden\r\n else if (type === 'ha') l('tooltip').innerHTML = Game.ObjectsById[2].minigame.toolTooltip(1)();\r\n // Stock market\r\n else if (type === 'sm') l('tooltip').innerHTML = Game.Objects.Bank.minigame.goodTooltip(name)();\r\n else if (type === 'wb') l('tooltip').innerHTML = '';\r\n else if (type === 'pag') l('tooltip').innerHTML = Game.Objects.Temple.minigame.godTooltip(name)();\r\n else if (type === 'pas')\r\n l('tooltip').innerHTML = Game.Objects.Temple.minigame.slotTooltip(name[0])();\r\n\r\n // Adds area for extra tooltip-sections\r\n if (\r\n (type === 'b' && Game.buyMode === 1) ||\r\n type === 'u' ||\r\n type === 's' ||\r\n type === 'g' ||\r\n (type === 'p' && !Game.keys[16]) ||\r\n type === 'ha' ||\r\n type === 'sm' ||\r\n type === 'wb' ||\r\n type === 'pag' ||\r\n (type === 'pas' && name[1] !== -1)\r\n ) {\r\n const area = document.createElement('div');\r\n area.id = 'CMTooltipArea';\r\n l('tooltip').appendChild(area);\r\n }\r\n\r\n // Sets global variables used by CM.Disp.UpdateTooltip()\r\n TooltipType = type;\r\n TooltipName = name;\r\n\r\n UpdateTooltips();\r\n\r\n return l('tooltip').innerHTML;\r\n}\r\n","import { CacheSpawnedGoldenShimmer } from '../../Cache/VariablesAndData';\r\nimport { LastGoldenCookieState } from '../../Main/VariablesAndData';\r\n\r\n/**\r\n * This function creates the Favicon, it is called by CM.Main.DelayInit()\r\n */\r\nexport function CreateFavicon() {\r\n const Favicon = document.createElement('link');\r\n Favicon.id = 'CMFavicon';\r\n Favicon.rel = 'shortcut icon';\r\n Favicon.href = 'https://orteil.dashnet.org/cookieclicker/favicon.ico';\r\n document.getElementsByTagName('head')[0].appendChild(Favicon);\r\n}\r\n\r\n/**\r\n * This function updates the Favicon depending on whether a Golden Cookie has spawned\r\n * By relying on CM.Cache.spawnedGoldenShimmer it only changes for non-user spawned cookie\r\n */\r\nexport function UpdateFavicon() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Favicon === 1 &&\r\n LastGoldenCookieState > 0\r\n ) {\r\n if (CacheSpawnedGoldenShimmer.wrath)\r\n l('CMFavicon').href =\r\n 'https://CookieMonsterTeam.github.io/CookieMonster/favicon/wrathCookie.ico';\r\n else\r\n l('CMFavicon').href =\r\n 'https://CookieMonsterTeam.github.io/CookieMonster/favicon/goldenCookie.ico';\r\n } else l('CMFavicon').href = 'https://orteil.dashnet.org/cookieclicker/favicon.ico';\r\n}\r\n","/** Functions used to create static objects of Buildings, Upgrades and Achievements */\r\n\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport { SimAchievements, SimObjects, SimUpgrades } from '../VariablesAndData';\r\nimport InitAchievement from './InitAchievement';\r\nimport InitialBuildingData from './InitialBuildingData';\r\nimport InitUpgrade from './InitUpgrade';\r\n\r\n/**\r\n * This function creates static objects for Buildings, Upgrades and Achievements\r\n */\r\nexport default function InitData() {\r\n // Buildings\r\n SimObjects = [];\r\n Object.keys(Game.Objects).forEach((i) => {\r\n SimObjects[i] = InitialBuildingData(i);\r\n });\r\n\r\n // Upgrades\r\n SimUpgrades = [];\r\n Object.keys(Game.Upgrades).forEach((i) => {\r\n SimUpgrades[i] = InitUpgrade(i);\r\n });\r\n\r\n // Achievements\r\n SimAchievements = [];\r\n Object.keys(Game.Achievements).forEach((i) => {\r\n SimAchievements[i] = InitAchievement(i);\r\n });\r\n CopyData();\r\n}\r\n","import { CreateTooltip } from '../../Disp/Tooltips/Tooltip';\r\nimport { TooltipGrimoireBackup } from '../VariablesAndData';\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of the Grimoire minigame\r\n */\r\nexport default function ReplaceTooltipGrimoire() {\r\n if (Game.Objects['Wizard tower'].minigameLoaded) {\r\n Object.keys(Game.Objects['Wizard tower'].minigame.spellsById).forEach((i) => {\r\n if (l(`grimoireSpell${i}`).onmouseover !== null) {\r\n TooltipGrimoireBackup[i] = l(`grimoireSpell${i}`).onmouseover;\r\n l(`grimoireSpell${i}`).onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('g', `${i}`), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n });\r\n }\r\n}\r\n","import FormatTime from '../../Disp/BeautifyAndFormatting/FormatTime';\r\nimport CalculateGrimoireRefillTime from '../../Disp/HelperFunctions/CalculateGrimoireRefillTime';\r\nimport {\r\n BackupGrimoireDraw,\r\n BackupGrimoireLaunch, // eslint-disable-line no-unused-vars\r\n BackupGrimoireLaunchMod,\r\n HasReplaceNativeGrimoireDraw,\r\n HasReplaceNativeGrimoireLaunch,\r\n} from '../VariablesAndData';\r\nimport ReplaceTooltipGrimoire from './TooltipGrimoire';\r\n\r\n/**\r\n * This function fixes replaces the .draw function of the Grimoire\r\n */\r\nfunction ReplaceNativeGrimoireDraw() {\r\n if (!HasReplaceNativeGrimoireDraw && Game.Objects['Wizard tower'].minigameLoaded) {\r\n const { minigame } = Game.Objects['Wizard tower'];\r\n BackupGrimoireDraw = minigame.draw;\r\n Game.Objects['Wizard tower'].minigame.draw = function () {\r\n BackupGrimoireDraw();\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GrimoireBar === 1 &&\r\n minigame.magic < minigame.magicM &&\r\n Game.drawT % 5 === 0\r\n ) {\r\n minigame.magicBarTextL.innerHTML += ` (${FormatTime(\r\n CalculateGrimoireRefillTime(minigame.magic, minigame.magicM, minigame.magicM),\r\n )})`;\r\n minigame.magicBarL.style.width = '75%'; // TODO: Fix this after Orteil pushes fix to main game;\r\n }\r\n };\r\n HasReplaceNativeGrimoireDraw = true;\r\n }\r\n}\r\n\r\n/**\r\n * This function fixes replaces the .launch function of the Grimoire\r\n */\r\nfunction ReplaceNativeGrimoireLaunch() {\r\n if (!HasReplaceNativeGrimoireLaunch && Game.Objects['Wizard tower'].minigameLoaded) {\r\n const { minigame } = Game.Objects['Wizard tower'];\r\n BackupGrimoireLaunch = minigame.launch;\r\n BackupGrimoireLaunchMod = new Function( // eslint-disable-line no-new-func\r\n `return ${minigame.launch\r\n .toString()\r\n .split('=this')\r\n .join(\"= Game.Objects['Wizard tower'].minigame\")}`,\r\n );\r\n Game.Objects['Wizard tower'].minigame.launch = function () {\r\n BackupGrimoireLaunchMod();\r\n ReplaceTooltipGrimoire();\r\n HasReplaceNativeGrimoireDraw = false;\r\n ReplaceNativeGrimoireDraw();\r\n\r\n HasReplaceNativeGrimoireLaunch = true;\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * This function fixes replaces the Launch and Draw functions of the Grimoire\r\n */\r\nexport default function ReplaceNativeGrimoire() {\r\n ReplaceNativeGrimoireLaunch();\r\n ReplaceNativeGrimoireDraw();\r\n}\r\n","/** Functions related to the Dragon */\r\n\r\nimport Beautify from '../../Disp/BeautifyAndFormatting/Beautify';\r\nimport CopyData from '../../Sim/SimulationData/CopyData';\r\nimport { SimDoSims, SimObjects } from '../../Sim/VariablesAndData';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheCostDragonUpgrade, CacheLastDragonLevel } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This functions caches the current cost of upgrading the dragon level so it can be displayed in the tooltip\r\n */\r\nexport default function CacheDragonCost() {\r\n if (CacheLastDragonLevel !== Game.dragonLevel || SimDoSims) {\r\n if (\r\n Game.dragonLevel < 25 &&\r\n Game.dragonLevels[Game.dragonLevel].buy.toString().includes('sacrifice')\r\n ) {\r\n const objectMatch = Game.dragonLevels[Game.dragonLevel].buy\r\n .toString()\r\n .match(/Objects\\[(.*)\\]/);\r\n let target =\r\n objectMatch !== null ? objectMatch[1] : Game.ObjectsById[Game.dragonLevel - 5].name;\r\n const amount = Game.dragonLevels[Game.dragonLevel].buy\r\n .toString()\r\n .match(/sacrifice\\((.*?)\\)/)[1];\r\n if (target !== 'i') {\r\n target = target.replaceAll(\"'\", '');\r\n if (Game.Objects[target].amount < amount) {\r\n CacheCostDragonUpgrade = 'Not enough buildings to sell';\r\n } else {\r\n let cost = 0;\r\n CopyData();\r\n for (let i = 0; i < amount; i++) {\r\n let price =\r\n SimObjects[target].basePrice *\r\n Game.priceIncrease **\r\n Math.max(0, SimObjects[target].amount - 1 - SimObjects[target].free);\r\n price = Game.modifyBuildingPrice(SimObjects[target], price);\r\n price = Math.ceil(price);\r\n cost += price;\r\n SimObjects[target].amount -= 1;\r\n }\r\n CacheCostDragonUpgrade = `Cost to rebuy: ${Beautify(cost)}`;\r\n }\r\n } else {\r\n let cost = 0;\r\n CopyData();\r\n Object.keys(Game.Objects).forEach((j) => {\r\n target = j;\r\n if (Game.Objects[target].amount < amount) {\r\n CacheCostDragonUpgrade = 'Not enough buildings to sell';\r\n return;\r\n }\r\n for (let i = 0; i < amount; i++) {\r\n let price =\r\n SimObjects[target].basePrice *\r\n Game.priceIncrease **\r\n Math.max(0, SimObjects[target].amount - 1 - SimObjects[target].free);\r\n price = Game.modifyBuildingPrice(SimObjects[target], price);\r\n price = Math.ceil(price);\r\n cost += price;\r\n SimObjects[target].amount -= 1;\r\n }\r\n CacheCostDragonUpgrade = `Cost to rebuy: ${Beautify(cost)}`;\r\n });\r\n }\r\n }\r\n CacheLastDragonLevel = Game.dragonLevel;\r\n }\r\n\r\n FillCMDCache({ CacheLastDragonLevel });\r\n}\r\n","/** Data related to the display titles of certain sections in menu screens */\r\n\r\n/** Display titles of the headers of the Cookie Monster settings section */\r\nexport const ConfigGroups = {\r\n Favourite: 'Favourite Settings',\r\n Calculation: 'Calculation',\r\n Notation: 'Notation',\r\n Colours: 'Colours and colour coding',\r\n BarsDisplay: 'Infobars and visual settings',\r\n Tooltip: 'Tooltips',\r\n Statistics: 'Statistics',\r\n Notification: 'Notifications',\r\n Miscellaneous: 'Miscellaneous',\r\n};\r\n\r\n/** Display titles of the headers of the notification section of the Cookie Monster settings */\r\nexport const ConfigGroupsNotification = {\r\n NotificationGeneral: 'General Notifications',\r\n NotificationGC: 'Golden Cookie',\r\n NotificationFC: 'Fortune Cookie',\r\n NotificationSea: 'Season Special',\r\n NotificationGard: 'Garden Tick',\r\n NotificationMagi: 'Full Magic Bar',\r\n NotificationWrink: 'Wrinkler',\r\n NotificationWrinkMax: 'Maximum Wrinklers',\r\n};\r\n","/**\r\n * This function checks if the user has given permissions for notifications\r\n * It is called by a change in any of the notification options\r\n * Note that most browsers will stop asking if the user has ignored the prompt around 6 times\r\n * @param \t{number}\tToggleOnOff\t\tA number indicating whether the option has been turned off (0) or on (1)\r\n */\r\nfunction CheckNotificationPermissions(ToggleOnOff) {\r\n if (ToggleOnOff === 1) {\r\n // Check if browser support Promise version of Notification Permissions\r\n const checkNotificationPromise = function () {\r\n try {\r\n Notification.requestPermission().then();\r\n } catch (e) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n // Check if the browser supports notifications and which type\r\n if (!('Notification' in window)) {\r\n console.log('This browser does not support notifications.'); // eslint-disable-line no-console\r\n } else if (checkNotificationPromise()) {\r\n Notification.requestPermission().then();\r\n } else {\r\n Notification.requestPermission();\r\n }\r\n }\r\n}\r\n\r\nexport default CheckNotificationPermissions;\r\n","import UpdateBuildings from '../BuildingsUpgrades/Buildings';\r\nimport UpdateUpgrades from '../BuildingsUpgrades/Upgrades';\r\nimport { UpdateBotBar } from '../InfoBars/BottomBar';\r\n\r\n/**\r\n * This function refreshes all numbers after a change in scale-setting\r\n * It is therefore called by a changes in CM.Options.Scale, CM.Options.ScaleDecimals, CM.Options.ScaleSeparator and CM.Options.ScaleCutoff\r\n */\r\nexport default function RefreshScale() {\r\n BeautifyAll();\r\n Game.RefreshStore();\r\n Game.RebuildUpgrades();\r\n\r\n UpdateBotBar();\r\n UpdateBuildings();\r\n UpdateUpgrades();\r\n}\r\n","import { UpdateBotBar } from '../../Disp/InfoBars/BottomBar';\r\nimport { UpdateBotTimerBarPosition } from '../SpecificToggles';\r\n\r\n/**\r\n * This function toggle the bottom bar\r\n * It is called by CM.Disp.UpdateAscendState() and a change in Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar\r\n */\r\nexport default function ToggleBotBar() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1) {\r\n l('CMBotBar').style.display = '';\r\n UpdateBotBar();\r\n } else {\r\n l('CMBotBar').style.display = 'none';\r\n }\r\n UpdateBotTimerBarPosition();\r\n}\r\n","import { settingClasses } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\n\r\nimport CheckNotificationPermissions from '../Config/CheckNotificationPermissions';\r\nimport RefreshScale from '../Disp/HelperFunctions/RefreshScale';\r\nimport { SimDoSims } from '../Sim/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport ToggleBotBar from '../Config/Toggles/ToggleBotBar';\r\nimport ToggleDetailedTime from '../Config/Toggles/ToggleDetailedTime';\r\nimport ToggleGCTimer from '../Config/Toggles/ToggleGCTimer';\r\nimport ToggleSectionHideButtons from '../Config/Toggles/ToggleSectionHideButtons';\r\nimport ToggleToolWarnPos from '../Config/Toggles/ToggleToolWarnPos';\r\nimport ToggleUpgradeBarAndColour from '../Config/Toggles/ToggleUpgradeBarAndColour';\r\nimport ToggleUpgradeBarFixedPos from '../Config/Toggles/ToggleUpgradeBarFixedPos';\r\nimport ToggleWrinklerButtons from '../Config/Toggles/ToggleWrinklerButtons';\r\nimport UpdateBuildings from '../Disp/BuildingsUpgrades/Buildings';\r\nimport { UpdateFavicon } from '../Disp/TabTitle/FavIcon';\r\nimport UpdateUpgradeSectionsHeight from '../Disp/BuildingsUpgrades/UpdateUpgradeSectionsHeight';\r\nimport UpdateUpgrades from '../Disp/BuildingsUpgrades/Upgrades';\r\nimport { ToggleTimerBar, ToggleTimerBarPos } from '../Config/SpecificToggles';\r\n\r\n/** This includes all options of CookieMonster and their relevant data */\r\nconst settings = {\r\n // Calculation\r\n CPSMode: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Calculation',\r\n ['Current cookies per second', 'Average cookies per second'],\r\n 'Calculate times using current cookies per second or average cookies per second',\r\n false,\r\n ),\r\n AvgCPSHist: new settingClasses.SettingStandard(\r\n 3,\r\n 'bool',\r\n 'Calculation',\r\n [\r\n 'Average CPS in past 10s',\r\n 'Average CPS in past 15s',\r\n 'Average CPS in past 30s',\r\n 'Average CPS in past 1m',\r\n 'Average CPS in past 5m',\r\n 'Average CPS in past 10m',\r\n 'Average CPS in past 15m',\r\n 'Average CPS in past 30m',\r\n ],\r\n 'How much time average Cookies Per Second should consider',\r\n false,\r\n ),\r\n AvgClicksHist: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Calculation',\r\n [\r\n 'Average clicks in past 1s',\r\n 'Average clicks in past 5s',\r\n 'Average clicks in past 10s',\r\n 'Average clicks in past 15s',\r\n 'Average clicks in past 30s',\r\n ],\r\n 'How much time average Cookie Clicks should consider',\r\n false,\r\n ),\r\n CalcWrink: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'Calculation',\r\n [\r\n 'Calculate with wrinklers OFF',\r\n 'Calculate with wrinklers ON',\r\n 'Calculate with single fattest wrinkler ON',\r\n ],\r\n 'Calculate times and average Cookies Per Second with (only the single non-shiny fattest) wrinklers',\r\n true,\r\n () => {\r\n SimDoSims = true;\r\n },\r\n ),\r\n\r\n // Notation\r\n Scale: new settingClasses.SettingStandardWithFunc(\r\n 2,\r\n 'bool',\r\n 'Notation',\r\n [\r\n \"Game's setting scale\",\r\n 'Metric',\r\n 'Short scale',\r\n 'Short scale (Abbreviated)',\r\n 'Scientific notation',\r\n 'Engineering notation',\r\n ],\r\n 'Change how long numbers are formatted',\r\n false,\r\n () => {\r\n RefreshScale();\r\n },\r\n ),\r\n ScaleDecimals: new settingClasses.SettingStandardWithFunc(\r\n 2,\r\n 'bool',\r\n 'Notation',\r\n ['1 decimals', '2 decimals', '3 decimals'],\r\n `Set the number of decimals used when applicable. This only works with Cookie Monster scales and not with \"Game's Setting Scale\"`,\r\n false,\r\n () => {\r\n RefreshScale();\r\n },\r\n ),\r\n ScaleSeparator: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'Notation',\r\n ['. for decimals (standard)', '. for thousands'],\r\n 'Set the separator used for decimals and thousands',\r\n false,\r\n () => {\r\n RefreshScale();\r\n },\r\n ),\r\n ScaleCutoff: new settingClasses.SettingInputNumber(\r\n 999999,\r\n 'numscale',\r\n 'Notation',\r\n 'Notation cut-off point: ',\r\n 'The number from which Cookie Monster will start formatting numbers based on chosen scale. Standard is 999,999. Setting this above 999,999,999 might break certain notations',\r\n 1,\r\n 999999999,\r\n ),\r\n TimeFormat: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Notation',\r\n ['Time XXd, XXh, XXm, XXs', 'Time XX:XX:XX:XX:XX', 'Time XXx, XXx'],\r\n 'Change the time format',\r\n false,\r\n ),\r\n DetailedTime: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'Notation',\r\n ['Detailed time OFF', 'Detailed time ON'],\r\n 'Change how time is displayed in certain statistics and tooltips',\r\n true,\r\n () => {\r\n ToggleDetailedTime();\r\n },\r\n ),\r\n PPDisplayTime: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Notation',\r\n ['PP as value (standard)', 'PP as time unit'],\r\n 'Display PP as calculated value or as approximate time unit. Note that PP does not translate directly into a time unit and this is therefore only an approximation.',\r\n false,\r\n ),\r\n\r\n // Colours\r\n BuildColour: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'Colours',\r\n ['Building colours OFF', 'Building colours ON'],\r\n 'Colour code buildings',\r\n true,\r\n () => {\r\n UpdateBuildings();\r\n },\r\n ),\r\n PPOnlyConsiderBuyable: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Colours',\r\n [\"Don't ignore non-buyable\", 'Ignore non-buyable'],\r\n \"Makes Cookie Monster label buildings and upgrades you can't buy right now red, useful in those situations where you just want to spend your full bank 'most optimally'\",\r\n true,\r\n ),\r\n PPExcludeTop: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Colours',\r\n [\r\n \"Don't ignore any\",\r\n 'Ignore 1st best',\r\n 'Ignore 1st and 2nd best',\r\n 'Ignore 1st, 2nd and 3rd best',\r\n ],\r\n 'Makes Cookie Monster ignore the 1st, 2nd or 3rd best buildings in labeling and colouring PP values',\r\n true,\r\n ),\r\n PPRigidelMode: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Colours',\r\n ['Rigidel mode OFF', 'Rigidel mode ON'],\r\n 'Makes Cookie Monster ignore all \"buy 1\" options when colouring PP in order to stay at a total building count ending in 10 for pantheon god Rigidel',\r\n true,\r\n ),\r\n PPSecondsLowerLimit: new settingClasses.SettingInputNumber(\r\n 0,\r\n 'numscale',\r\n 'Colours',\r\n 'Lower limit for PP (in seconds): ',\r\n 'If a building or upgrade costs less than the specified seconds of CPS it will also be considered optimal and label it as such (\"PP is less than xx seconds of CPS\"); setting to 0 ignores this option',\r\n 0,\r\n Infinity,\r\n ),\r\n ColourBlue: new settingClasses.SettingColours(\r\n '#4bb8f0',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is blue. Used to show upgrades better than best PP building, for Click Frenzy bar, and for various labels',\r\n ),\r\n ColourGreen: new settingClasses.SettingColours(\r\n '#00ff00',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is green. Used to show best PP building, for Blood Frenzy bar, and for various labels',\r\n ),\r\n ColourYellow: new settingClasses.SettingColours(\r\n '#ffff00',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is yellow. Used to show buildings within the top 10 of PP, for Frenzy bar, and for various labels',\r\n ),\r\n ColourOrange: new settingClasses.SettingColours(\r\n '#ff7f00',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is orange. Used to show buildings within the top 20 of PP, for Next Reindeer bar, and for various labels',\r\n ),\r\n ColourRed: new settingClasses.SettingColours(\r\n '#ff0000',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is Red. Used to show buildings within the top 30 of PP, for Clot bar, and for various labels',\r\n ),\r\n ColourPurple: new settingClasses.SettingColours(\r\n '#ff00ff',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is purple. Used to show buildings outside of the top 30 of PP, for Next Cookie bar, and for various labels',\r\n ),\r\n ColourGray: new settingClasses.SettingColours(\r\n '#b3b3b3',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is gray. Used to show negative or infinity PP, and for Next Cookie/Next Reindeer bar',\r\n ),\r\n ColourPink: new settingClasses.SettingColours(\r\n '#ff1493',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is pink. Used for Dragonflight bar',\r\n ),\r\n ColourBrown: new settingClasses.SettingColours(\r\n '#8b4513',\r\n 'colour',\r\n 'Colours',\r\n 'Standard colour is brown. Used for Dragon Harvest bar',\r\n ),\r\n\r\n // BarsDisplay\r\n BotBar: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Bottom bar OFF', 'Bottom bar ON'],\r\n 'Building information',\r\n true,\r\n () => {\r\n ToggleBotBar();\r\n },\r\n ),\r\n TimerBar: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Timer bar OFF', 'Timer bar ON'],\r\n 'Bar with timers for golden cookie, season popup, Frenzy (Normal, Clot, Elder), Click Frenzy',\r\n true,\r\n () => {\r\n ToggleTimerBar();\r\n },\r\n ),\r\n TimerBarPos: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Timer bar position (top left)', 'Timer bar position (bottom)'],\r\n 'Placement of the timer bar',\r\n false,\r\n () => {\r\n ToggleTimerBarPos();\r\n },\r\n ),\r\n TimerBarOverlay: new settingClasses.SettingStandard(\r\n 2,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Timer bar overlay OFF', 'Timer bar overlay only seconds', 'Timer bar overlay full'],\r\n 'Overlay on timers displaying seconds and/or percentage left',\r\n true,\r\n ),\r\n AutosaveTimerBar: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Autosave timer bar OFF', 'Autosave timer bar ON'],\r\n 'Show a timer counting down till next autosave in the timer bar',\r\n true,\r\n ),\r\n UpBarColour: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Upgrade colours/bar OFF', 'Upgrade colours with bar ON', 'Upgrade colours without bar ON'],\r\n 'Colour code upgrades and optionally add a counter bar',\r\n false,\r\n () => {\r\n ToggleUpgradeBarAndColour();\r\n },\r\n ),\r\n UpgradeBarFixedPos: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Upgrade bar fixed position OFF', 'Upgrade bar fixed position ON'],\r\n 'Lock the upgrade bar at top of the screen to prevent it from moving ofscreen when scrolling',\r\n true,\r\n () => {\r\n ToggleUpgradeBarFixedPos();\r\n },\r\n ),\r\n SortBuildings: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n [\r\n 'Sort buildings: default',\r\n 'Sort buildings: PP of x1 purchase',\r\n 'Sort buildings: PP of selected bulk mode',\r\n 'Sort buildings: price until next achievement',\r\n ],\r\n 'Sort the display of buildings in default order, by PP, or until next achievement',\r\n false,\r\n () => {\r\n UpdateBuildings();\r\n },\r\n ),\r\n SortUpgrades: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Sort upgrades: default', 'Sort upgrades: PP'],\r\n 'Sort the display of upgrades in either default order or by PP',\r\n false,\r\n () => {\r\n UpdateUpgrades();\r\n },\r\n ),\r\n UpgradesNeverCollapse: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Upgrades always expanded OFF', 'Upgrades always expanded ON'],\r\n 'Toggle to make the upgrades sections always expanded to the size needed to display all upgrades',\r\n true,\r\n () => {\r\n UpdateUpgradeSectionsHeight();\r\n },\r\n ),\r\n DragonAuraInfo: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Extra dragon aura info OFF', 'Extra dragon aura info ON'],\r\n 'Shows information about changes in CPS and costs in the dragon aura interface.',\r\n true,\r\n ),\r\n GrimoireBar: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Grimoire magic meter timer OFF', 'Grimoire magic meter timer ON'],\r\n 'A timer overlay showing how long till the Grimoire magic meter is full',\r\n true,\r\n ),\r\n GCTimer: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Golden cookie timer OFF', 'Golden cookie timer ON'],\r\n 'A timer on the golden cookie when it has been spawned',\r\n true,\r\n () => {\r\n ToggleGCTimer();\r\n },\r\n ),\r\n Favicon: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Favicon OFF', 'Favicon ON'],\r\n 'Update favicon with golden/wrath cookie',\r\n true,\r\n () => {\r\n UpdateFavicon();\r\n },\r\n ),\r\n WrinklerButtons: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Extra wrinkler buttons OFF', 'Extra wrinkler buttons ON'],\r\n 'Show buttons for popping wrinklers at bottom of cookie section',\r\n true,\r\n () => {\r\n ToggleWrinklerButtons();\r\n },\r\n ),\r\n HideSectionsButtons: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'BarsDisplay',\r\n ['Hide buildings/upgrades button OFF', 'Hide buildings/upgrades button ON'],\r\n 'Show buttons for hiding and showing the buildings and upgrades sections in the right column',\r\n true,\r\n () => {\r\n ToggleSectionHideButtons();\r\n },\r\n ),\r\n\r\n // Tooltip\r\n TooltipBuildUpgrade: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Building/upgrade tooltip information OFF', 'Building/upgrade tooltip information ON'],\r\n 'Extra information in building/upgrade tooltips',\r\n true,\r\n ),\r\n TooltipAmor: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Tooltip',\r\n [\r\n 'Buildings tooltip amortization information OFF',\r\n 'Buildings tooltip amortization information ON',\r\n ],\r\n 'Add amortization information to buildings tooltip',\r\n true,\r\n ),\r\n ToolWarnLucky: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip lucky warning OFF', 'Tooltip lucky warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for max \"Lucky!\" rewards',\r\n true,\r\n ),\r\n ToolWarnLuckyFrenzy: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip lucky frenzy warning OFF', 'Tooltip lucky frenzy warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for max \"Lucky!\" (Frenzy) rewards',\r\n true,\r\n ),\r\n ToolWarnConjure: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip conjure warning OFF', 'Tooltip conjure warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for max \"Conjure Baked Goods\" rewards',\r\n true,\r\n ),\r\n ToolWarnConjureFrenzy: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip conjure frenzy warning OFF', 'Tooltip conjure frenzy warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for max \"Conjure Baked Goods\" rewards with Frenzy active',\r\n true,\r\n ),\r\n ToolWarnEdifice: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip edifice warning OFF', 'Tooltip edifice warning ON'],\r\n 'A warning when buying if it will put the bank under the amount needed for \"Spontaneous Edifice\" to possibly give you your most expensive building',\r\n true,\r\n ),\r\n ToolWarnUser: new settingClasses.SettingInputNumber(\r\n 0,\r\n 'numscale',\r\n 'Tooltip',\r\n 'Tooltip warning at x times CPS: ',\r\n 'Use this to show a customized warning if buying it will put the bank under the amount equal to value times cps; setting to 0 disables the function altogether',\r\n 0,\r\n Infinity,\r\n ),\r\n ToolWarnBon: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Calculate tooltip warning with bonus CPS OFF', 'Calculate tooltip warning with bonus CPS ON'],\r\n 'Calculate the warning with or without the bonus CPS you get from buying',\r\n true,\r\n ),\r\n ToolWarnPos: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Tooltip warning position (left)', 'Tooltip warning position (bottom)'],\r\n 'Placement of the warning boxes',\r\n false,\r\n () => {\r\n ToggleToolWarnPos();\r\n },\r\n ),\r\n TooltipGrim: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Grimoire tooltip information OFF', 'Grimoire tooltip information ON'],\r\n 'Extra information in tooltip for grimoire',\r\n true,\r\n ),\r\n TooltipWrink: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Wrinkler tooltip OFF', 'Wrinkler tooltip ON'],\r\n 'Shows the amount of cookies a wrinkler will give when popping it',\r\n true,\r\n ),\r\n TooltipLump: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Sugar lump tooltip OFF', 'Sugar lump tooltip ON'],\r\n 'Shows the current Sugar Lump type in Sugar lump tooltip.',\r\n true,\r\n ),\r\n TooltipPlots: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Garden plots tooltip OFF', 'Garden plots tooltip ON'],\r\n 'Shows a tooltip for plants that have a cookie reward.',\r\n true,\r\n ),\r\n TooltipStocks: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Stock market tooltips OFF', 'Stock market tooltips ON'],\r\n 'Shows additional info in the stock market tooltips.',\r\n true,\r\n ),\r\n TooltipPantheon: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Pantheon tooltip OFF', 'Pantheon tooltip ON'],\r\n 'Shows additional info in the pantheon tooltip',\r\n true,\r\n ),\r\n TooltipAscendButton: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Tooltip',\r\n ['Show Extra Info Ascend Tooltip OFF', 'Show Extra Info Ascend Tooltip ON'],\r\n 'Shows additional info in the ascend tooltip',\r\n true,\r\n ),\r\n\r\n // Statistics\r\n Stats: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Statistics',\r\n ['Statistics OFF', 'Statistics ON'],\r\n 'Extra Cookie Monster statistics!',\r\n true,\r\n ),\r\n MissingUpgrades: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Statistics',\r\n ['Missing upgrades OFF', 'Missing upgrades ON'],\r\n 'Shows missing upgrades in statistics menu',\r\n true,\r\n ),\r\n MissingAchievements: new settingClasses.SettingStandard(\r\n 0,\r\n 'bool',\r\n 'Statistics',\r\n ['Missing Achievements OFF', 'Missing Normal Achievements ON'],\r\n 'Shows missing normal achievements in statistics menu.',\r\n true,\r\n ),\r\n UpStats: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Statistics',\r\n ['Statistics update rate (default)', 'Statistics update rate (1s)'],\r\n 'Default rate is once every 5 seconds',\r\n false,\r\n ),\r\n HeavenlyChipsTarget: new settingClasses.SettingInputNumber(\r\n 1,\r\n 'numscale',\r\n 'Statistics',\r\n 'Heavenly chips target: ',\r\n 'Use this to set a heavenly chips target that will be counted towards in the \"prestige\" statsistics sections',\r\n 1,\r\n Infinity,\r\n ),\r\n ShowMissedGC: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Statistics',\r\n ['Missed GC OFF', 'Missed GC ON'],\r\n 'Show a stat in the statistics screen that counts how many golden cookies you have missed',\r\n true,\r\n ),\r\n\r\n // Notification\r\n Title: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGeneral',\r\n ['Title OFF', 'Title ON', 'Title pinned tab highlight'],\r\n 'Update title with colden cookie/season popup timers; pinned tab highlight only changes the title when a golden cookie/season popup spawns; \"!\" means that golden cookie/reindeer can spawn',\r\n true,\r\n ),\r\n GeneralSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGeneral',\r\n ['Consider game volume setting OFF', 'Consider game volume setting ON'],\r\n 'Turning this toggle to \"off\" makes Cookie Monster no longer consider the volume setting of the base game, allowing mod notifications to play with base game volume turned down',\r\n true,\r\n ),\r\n GCNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationGC',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when golden cookie spawns',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCNotification,\r\n );\r\n },\r\n ),\r\n GCFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGC',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen on golden cookie',\r\n true,\r\n ),\r\n ColourGCFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationGC',\r\n 'The colour of the GC flash, standard colour is white',\r\n ),\r\n GCSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGC',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound on golden cookie',\r\n true,\r\n ),\r\n GCVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationGC', [], 'Volume'),\r\n GCSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/66/66717_931655-lq.mp3',\r\n 'url',\r\n 'NotificationGC',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when a golden cookie spawns',\r\n ),\r\n FortuneNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationFC',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when fortune cookie is on the ticker',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FortuneNotification,\r\n );\r\n },\r\n ),\r\n FortuneFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationFC',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen on fortune cookie spawn',\r\n true,\r\n ),\r\n ColourFortuneFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationFC',\r\n 'The colour of the fortune flash, standard colour is white',\r\n ),\r\n FortuneSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationFC',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound on fortune cookie spawn',\r\n true,\r\n ),\r\n FortuneVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationFC', [], 'Volume'),\r\n FortuneSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/174/174027_3242494-lq.mp3',\r\n 'url',\r\n 'NotificationFC',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when the ticker has a fortune cookie',\r\n ),\r\n SeaNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationSea',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification on season popup',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SeaNotification,\r\n );\r\n },\r\n ),\r\n SeaFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationSea',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen on season popup',\r\n true,\r\n ),\r\n ColourSeaFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationSea',\r\n 'The colour of the season popup flash, standard colour is white',\r\n ),\r\n SeaSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationSea',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound on season popup',\r\n true,\r\n ),\r\n SeaVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationSea', [], 'Volume'),\r\n SeaSoundURL: new settingClasses.SettingStandard(\r\n 'https://www.freesound.org/data/previews/121/121099_2193266-lq.mp3',\r\n 'url',\r\n 'NotificationSea',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when on season popup spawns',\r\n ),\r\n GardFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGard',\r\n ['Garden Tick Flash OFF', 'Flash ON'],\r\n 'Flash screen on garden tick',\r\n true,\r\n ),\r\n ColourGardFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationGard',\r\n 'The colour of the garden flash, standard colour is white',\r\n ),\r\n GardSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationGard',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound on garden tick',\r\n true,\r\n ),\r\n GardVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationGard', [], 'Volume'),\r\n GardSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/103/103046_861714-lq.mp3',\r\n 'url',\r\n 'NotificationGard',\r\n 'Garden Tick Sound URL:',\r\n 'URL of the sound to be played when the garden ticks',\r\n ),\r\n MagicNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationMagi',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when magic reaches maximum',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MagicNotification,\r\n );\r\n },\r\n ),\r\n MagicFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationMagi',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen when magic reaches maximum',\r\n true,\r\n ),\r\n ColourMagicFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationMagi',\r\n 'The colour of the magic flash, standard colour is white',\r\n ),\r\n MagicSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationMagi',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound when magic reaches maximum',\r\n true,\r\n ),\r\n MagicVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationMagi', [], 'Volume'),\r\n MagicSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/221/221683_1015240-lq.mp3',\r\n 'url',\r\n 'NotificationMagi',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when magic reaches maxium',\r\n ),\r\n WrinklerNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationWrink',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when a wrinkler appears',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerNotification,\r\n );\r\n },\r\n ),\r\n WrinklerFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationWrink',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen when a wrinkler appears',\r\n true,\r\n ),\r\n ColourWrinklerFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationWrink',\r\n 'The colour of the wrinkler flash, standard colour is white',\r\n ),\r\n WrinklerSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationWrink',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound when a wrinkler appears',\r\n true,\r\n ),\r\n WrinklerVolume: new settingClasses.SettingVolume(100, 'vol', 'NotificationWrink', [], 'Volume'),\r\n WrinklerSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/124/124186_8043-lq.mp3',\r\n 'url',\r\n 'NotificationWrink',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when a wrinkler appears',\r\n ),\r\n WrinklerMaxNotification: new settingClasses.SettingStandardWithFunc(\r\n 0,\r\n 'bool',\r\n 'NotificationWrinkMax',\r\n ['Notification OFF', 'Notification ON'],\r\n 'Create a notification when the maximum amount of wrinklers has appeared',\r\n true,\r\n () => {\r\n CheckNotificationPermissions(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxNotification,\r\n );\r\n },\r\n ),\r\n WrinklerMaxFlash: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationWrinkMax',\r\n ['Flash OFF', 'Flash ON'],\r\n 'Flash screen when the maximum amount of Wrinklers has appeared',\r\n true,\r\n ),\r\n ColourWrinklerMaxFlash: new settingClasses.SettingColours(\r\n '#ffffff',\r\n 'colour',\r\n 'NotificationWrinkMax',\r\n 'The colour of the maximum wrinkler flash, standard colour is white',\r\n ),\r\n WrinklerMaxSound: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'NotificationWrinkMax',\r\n ['Sound OFF', 'Sound ON'],\r\n 'Play a sound when the maximum amount of wrinklers has appeared',\r\n true,\r\n ),\r\n WrinklerMaxVolume: new settingClasses.SettingVolume(\r\n 100,\r\n 'vol',\r\n 'NotificationWrinkMax',\r\n [],\r\n 'Volume',\r\n ),\r\n WrinklerMaxSoundURL: new settingClasses.SettingStandard(\r\n 'https://freesound.org/data/previews/152/152743_15663-lq.mp3',\r\n 'url',\r\n 'NotificationWrinkMax',\r\n 'Sound URL:',\r\n 'URL of the sound to be played when the maximum amount of wrinklers has appeared',\r\n ),\r\n\r\n // Miscellaneous\r\n BulkBuyBlock: new settingClasses.SettingStandard(\r\n 1,\r\n 'bool',\r\n 'Miscellaneous',\r\n ['Block bulk buying OFF', 'Block bulk buying ON'],\r\n \"Block clicking bulk buying when you can't buy all. This prevents buying 7 of a building when you are in buy-10 or buy-100 mode.\",\r\n true,\r\n ),\r\n FavouriteSettings: new settingClasses.SettingStandardWithFunc(\r\n 1,\r\n 'bool',\r\n 'Miscellaneous',\r\n [\r\n 'Favourite settings section OFF',\r\n 'Favourite settings section ON',\r\n 'Favourite settings section ON (Locked)',\r\n ],\r\n \"Show stars before each setting which allows selecting it for a 'favourites' section at the top of the Cookie Monster settings. Setting this to Locked removes the stars but shows the 'favourites' section\",\r\n true,\r\n () => {\r\n Game.UpdateMenu();\r\n },\r\n ),\r\n};\r\n\r\nexport default settings;\r\n","import { CMSayTime } from '../../Disp/VariablesAndData';\r\nimport { BackupFunctions } from '../../Main/VariablesAndData';\r\n\r\n/**\r\n * This function changes some of the time-displays in the game to be more detailed\r\n * It is called by a change in CM.Options.DetailedTime\r\n */\r\nexport default function ToggleDetailedTime() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.DetailedTime === 1)\r\n Game.sayTime = CMSayTime;\r\n else Game.sayTime = BackupFunctions.sayTime;\r\n}\r\n","import UpdateUpgrades from '../../Disp/BuildingsUpgrades/Upgrades';\r\n\r\n/**\r\n * This function toggles the upgrade bar and the colours of upgrades\r\n * It is called by a change in CM.Options.UpBarColour\r\n */\r\nexport default function ToggleUpgradeBarAndColour() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour === 1) {\r\n // Colours and bar on\r\n l('CMUpgradeBar').style.display = '';\r\n UpdateUpgrades();\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpBarColour === 2\r\n ) {\r\n // Colours on and bar off\r\n l('CMUpgradeBar').style.display = 'none';\r\n UpdateUpgrades();\r\n } else {\r\n // Colours and bar off\r\n l('CMUpgradeBar').style.display = 'none';\r\n Game.RebuildUpgrades();\r\n }\r\n}\r\n","/**\r\n * This function toggles the position of the upgrade bar from fixed or non-fixed mode\r\n * It is called by a change in CM.Options.UpgradeBarFixedPos\r\n */\r\nexport default function ToggleUpgradeBarFixedPos() {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.UpgradeBarFixedPos === 1\r\n ) {\r\n // Fix to top of screen when scrolling\r\n l('CMUpgradeBar').style.position = 'sticky';\r\n l('CMUpgradeBar').style.top = '0px';\r\n } else {\r\n l('CMUpgradeBar').style.position = ''; // Possible to scroll offscreen\r\n }\r\n}\r\n","import { CacheGoldenShimmersByID } from '../../Cache/VariablesAndData';\r\nimport { GCTimers } from '../../Disp/VariablesAndData';\r\n\r\n/**\r\n * This function toggles GC Timers are visible\r\n * It is called by a change in CM.Options.GCTimer\r\n */\r\nexport default function ToggleGCTimer() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer === 1) {\r\n Object.keys(GCTimers).forEach((i) => {\r\n GCTimers[i].style.display = 'block';\r\n GCTimers[i].style.left = CacheGoldenShimmersByID[i].l.style.left;\r\n GCTimers[i].style.top = CacheGoldenShimmersByID[i].l.style.top;\r\n });\r\n } else {\r\n // eslint-disable-next-line no-return-assign\r\n Object.keys(GCTimers).forEach((i) => (GCTimers[i].style.display = 'none'));\r\n }\r\n}\r\n","/**\r\n * This function updates the display setting of the two objects created by CM.Disp.CreateWrinklerButtons()\r\n * It is called by changes in CM.Options.WrinklerButtons\r\n */\r\nexport default function ToggleSectionHideButtons() {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.HideSectionsButtons) {\r\n l('CMSectionHidButtons').style.display = '';\r\n } else {\r\n l('CMSectionHidButtons').style.display = 'none';\r\n }\r\n}\r\n","import UpdateBuildings from '../BuildingsUpgrades/Buildings';\r\nimport {\r\n ColourBackPre,\r\n ColourBorderPre,\r\n ColoursOrdering,\r\n ColourTextPre,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function changes/refreshes colours if the user has set new standard colours\r\n * The function is therefore called by a change in CM.Options.Colours\r\n */\r\nexport default function UpdateColours() {\r\n let str = '';\r\n for (let i = 0; i < ColoursOrdering.length; i++) {\r\n str += `.${ColourTextPre}${ColoursOrdering[i]} { color: ${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[\r\n `Colour${ColoursOrdering[i]}`\r\n ]\r\n }; }\\n`;\r\n }\r\n for (let i = 0; i < ColoursOrdering.length; i++) {\r\n str += `.${ColourBackPre}${ColoursOrdering[i]} { background-color: ${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[\r\n `Colour${ColoursOrdering[i]}`\r\n ]\r\n }; }\\n`;\r\n }\r\n for (let i = 0; i < ColoursOrdering.length; i++) {\r\n str += `.${ColourBorderPre}${ColoursOrdering[i]} { border: 1px solid ${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings[\r\n `Colour${ColoursOrdering[i]}`\r\n ]\r\n }; }\\n`;\r\n }\r\n l('CMCSS').textContent = str;\r\n UpdateBuildings(); // Class has been already set\r\n}\r\n","import { menuFunctions as mF } from '@cookiemonsterteam/cookiemonsterframework';\r\nimport { ConfigGroups, ConfigGroupsNotification } from '../../Data/Sectionheaders';\r\nimport settings from '../../Data/settings';\r\nimport UpdateColours from '../HelperFunctions/UpdateColours';\r\nimport RefreshScale from '../HelperFunctions/RefreshScale';\r\n\r\n/**\r\n * Creates the <div> to be added to the Options section\r\n * @returns {object} menuDiv\tObject of the <div> of Cookie Monster in options tab\r\n */\r\nexport default function createMenuOptions() {\r\n const menuDiv = mF.createModMenuSection('cookieMonsterMod', 'Cookie Monster', 'optionsMenu');\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.optionsMenu) {\r\n Object.keys(ConfigGroups).forEach((group) => {\r\n if (group === 'Favourite') {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings.length !==\r\n 0 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FavouriteSettings > 0\r\n ) {\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsSubHeader('cookieMonsterMod', group, ConfigGroups[group]),\r\n );\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[group])\r\n for (\r\n let index = 0;\r\n index <\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings.length;\r\n index++\r\n ) {\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsListing(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.favouriteSettings[\r\n index\r\n ],\r\n settings,\r\n UpdateColours,\r\n RefreshScale,\r\n ),\r\n );\r\n }\r\n }\r\n } else {\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsSubHeader('cookieMonsterMod', group, ConfigGroups[group]),\r\n );\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[group]) {\r\n // 0 is show, 1 is collapsed\r\n // Make sub-sections of Notification section\r\n if (group === 'Notification') {\r\n Object.keys(ConfigGroupsNotification).forEach((subGroup) => {\r\n const subGroupObject = mF.listings.createOptionsSubHeader(\r\n 'cookieMonsterMod',\r\n subGroup,\r\n ConfigGroupsNotification[subGroup],\r\n );\r\n subGroupObject.style.fontSize = '15px';\r\n subGroupObject.style.opacity = '0.5';\r\n menuDiv.appendChild(subGroupObject);\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[subGroup]) {\r\n Object.keys(settings).forEach((option) => {\r\n if (settings[option].group === subGroup)\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsListing(\r\n 'cookieMonsterMod',\r\n option,\r\n settings,\r\n UpdateColours,\r\n RefreshScale,\r\n ),\r\n );\r\n });\r\n }\r\n });\r\n } else {\r\n Object.keys(settings).forEach((option) => {\r\n if (settings[option].group === group)\r\n menuDiv.appendChild(\r\n mF.listings.createOptionsListing(\r\n 'cookieMonsterMod',\r\n option,\r\n settings,\r\n UpdateColours,\r\n RefreshScale,\r\n ),\r\n );\r\n });\r\n }\r\n }\r\n }\r\n });\r\n }\r\n return menuDiv;\r\n}\r\n","const SPECIAL_DIGIT = 7;\r\n\r\n/**\r\n * Count the number of 7s in any number\r\n * @param\t{number}\tnumber\tThe number to count sevens for\r\n * @returns\t{number}\tThe number of 7s in the provided number\r\n */\r\nexport function CountSevens(number) {\r\n return String(number).split(String(SPECIAL_DIGIT)).length - 1;\r\n}\r\n\r\n/**\r\n * Calculate the delta for the next number where the given digit is a 7\r\n * @param\t{number}\tnumber\t\t\tThe starting number to calculate the delta for\r\n * @param\t{number}\tdigitPlace\t1 for ones place, 10 for tens place, 100 for hundreds place, etc\r\n * @returns\t{number}\tThe calculated delta\r\n */\r\nexport function CalculateSevenDelta(number, digitPlace) {\r\n const target = SPECIAL_DIGIT * digitPlace;\r\n const modulus = digitPlace * 10;\r\n\r\n let delta = target - (number % modulus) + (number % digitPlace);\r\n if (delta < 0) delta += modulus;\r\n\r\n return delta;\r\n}\r\n\r\n/**\r\n * This function calculates each of the next \"lucky\" prestige levels\r\n * @param\t{number}\tcurrentLevel\tThe user's prestige level, including levels earned since the last ascension\r\n * @returns\t{{number}, {number}, {number}}\tluckyDigit, luckyNumber, luckyPayout\tThe next eligible level for each upgrade\r\n */\r\nexport default function CalculateLuckyLevels(currentLevel) {\r\n const result = {};\r\n let sevenCount = CountSevens(currentLevel);\r\n const numberOfDigits = String(currentLevel).length;\r\n\r\n if (sevenCount >= 1) {\r\n result.luckyDigit = currentLevel;\r\n if (sevenCount >= 2) {\r\n result.luckyNumber = currentLevel;\r\n if (sevenCount >= 4) {\r\n result.luckyPayout = currentLevel;\r\n return result;\r\n }\r\n }\r\n }\r\n\r\n // Consider only top 15 digits if it is big number\r\n let localLevel;\r\n if (numberOfDigits >= 16) {\r\n localLevel = Math.ceil(currentLevel / 10 ** (numberOfDigits - 15));\r\n } else {\r\n localLevel = currentLevel;\r\n }\r\n sevenCount = CountSevens(localLevel);\r\n\r\n if (result.luckyDigit === undefined) {\r\n if (sevenCount < 1) {\r\n const delta = CalculateSevenDelta(localLevel, 1);\r\n\r\n localLevel += delta;\r\n sevenCount = CountSevens(localLevel);\r\n }\r\n\r\n result.luckyDigit = localLevel;\r\n if (numberOfDigits >= 16) {\r\n result.luckyDigit *= 10 ** Number(numberOfDigits - 15);\r\n }\r\n }\r\n\r\n if (result.luckyNumber === undefined) {\r\n while (sevenCount < 2) {\r\n let delta = CalculateSevenDelta(localLevel, 1);\r\n if (delta === 0) delta = CalculateSevenDelta(localLevel, 10);\r\n\r\n localLevel += delta;\r\n sevenCount = CountSevens(localLevel);\r\n }\r\n\r\n result.luckyNumber = localLevel;\r\n if (numberOfDigits >= 16) {\r\n result.luckyNumber *= 10 ** Number(numberOfDigits - 15);\r\n }\r\n }\r\n\r\n let digitPlace = 1;\r\n while (sevenCount < 4) {\r\n const delta = CalculateSevenDelta(localLevel, digitPlace);\r\n if (delta === 0) {\r\n digitPlace *= 10;\r\n } else {\r\n localLevel += delta;\r\n sevenCount = CountSevens(localLevel);\r\n }\r\n }\r\n\r\n result.luckyPayout = localLevel;\r\n if (numberOfDigits >= 16) {\r\n result.luckyPayout *= 10 ** Number(numberOfDigits - 15);\r\n }\r\n\r\n return result;\r\n}\r\n","/** Section: Functions related to the creation of basic DOM elements page */\r\n\r\nimport { ToggleHeader } from '../../../Config/ToggleSetting';\r\n\r\nimport { SimpleTooltipElements } from '../../VariablesAndData';\r\n\r\n/**\r\n * This function creates a header-object for the stats page\r\n * It is called by CM.Disp.AddMenuStats()\r\n * @param \t{string}\t\tconfig\tThe name of the Config-group\r\n * @param \t{string}\t\ttext\tThe to-be displayed name of the header\r\n * @returns\t{object}\t\tdiv\t\tThe header object\r\n */\r\nexport function StatsHeader(text, config) {\r\n const div = document.createElement('div');\r\n div.className = 'title';\r\n div.style.padding = '0px 16px';\r\n div.style.opacity = '0.7';\r\n div.style.fontSize = '17px';\r\n div.style.fontFamily = '\"Kavoon\", Georgia, serif';\r\n div.appendChild(document.createTextNode(`${text} `));\r\n const span = document.createElement('span');\r\n span.style.cursor = 'pointer';\r\n span.style.display = 'inline-block';\r\n span.style.height = '14px';\r\n span.style.width = '14px';\r\n span.style.borderRadius = '7px';\r\n span.style.textAlign = 'center';\r\n span.style.backgroundColor = '#C0C0C0';\r\n span.style.color = 'black';\r\n span.style.fontSize = '13px';\r\n span.style.verticalAlign = 'middle';\r\n span.textContent = Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[config]\r\n ? '-'\r\n : '+';\r\n span.onclick = function () {\r\n ToggleHeader(config);\r\n Game.UpdateMenu();\r\n };\r\n div.appendChild(span);\r\n return div;\r\n}\r\n\r\n/**\r\n * This function creates an stats-listing-object for the stats page\r\n * It is called by CM.Disp.AddMenuStats()\r\n * @param \t{string}\t\ttype\t\tThe type fo the listing\r\n * @param \t{string}\t\tname\t\tThe name of the option\r\n * @param \t{object}\t\ttext\t\tThe text-object of the option\r\n * @param \t{string}\t\tplaceholder\tThe id of the to-be displayed tooltip if applicable\r\n * @returns\t{object}\t\tdiv\t\t\tThe option object\r\n */\r\nexport function StatsListing(type, name, text, placeholder) {\r\n const div = document.createElement('div');\r\n div.className = 'listing';\r\n\r\n const listingName = document.createElement('b');\r\n listingName.textContent = name;\r\n div.appendChild(listingName);\r\n if (type === 'withTooltip') {\r\n div.className = 'listing';\r\n div.appendChild(document.createTextNode(' '));\r\n\r\n const tooltip = document.createElement('span');\r\n tooltip.onmouseout = function () {\r\n Game.tooltip.hide();\r\n };\r\n tooltip.onmouseover = function () {\r\n Game.tooltip.draw(this, escape(SimpleTooltipElements[placeholder].innerHTML));\r\n };\r\n tooltip.style.cursor = 'default';\r\n tooltip.style.display = 'inline-block';\r\n tooltip.style.height = '10px';\r\n tooltip.style.width = '10px';\r\n tooltip.style.borderRadius = '5px';\r\n tooltip.style.textAlign = 'center';\r\n tooltip.style.backgroundColor = '#C0C0C0';\r\n tooltip.style.color = 'black';\r\n tooltip.style.fontSize = '9px';\r\n tooltip.style.verticalAlign = 'bottom';\r\n tooltip.textContent = '?';\r\n div.appendChild(tooltip);\r\n }\r\n div.appendChild(document.createTextNode(': '));\r\n div.appendChild(text);\r\n return div;\r\n}\r\n\r\n/**\r\n * This function creates an stats-listing-object for the stats page for missing items displays\r\n * It is called by CM.Disp.AddMenuStats()\r\n * @param \t{string}\t\ttype\t\tThe type fo the listing\r\n * @param \t{string}\t\tname\t\tThe name of the option\r\n * @param \t{object}\t\ttext\t\tThe text-object of the option\r\n * @param \t{bool}\t\t current Whether the season of the item is the current season\r\n * @returns\t{object}\t\tdiv\t\t\tThe option object\r\n */\r\nexport function StatsMissDispListing(type, name, text, current) {\r\n const div = document.createElement('div');\r\n div.className = 'listing';\r\n\r\n const listingName = document.createElement('b');\r\n listingName.textContent = name;\r\n if (current === true)\r\n listingName.style.color =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ColourGreen;\r\n div.appendChild(listingName);\r\n div.appendChild(document.createTextNode(': '));\r\n div.appendChild(text);\r\n return div;\r\n}\r\n\r\n/**\r\n * This function creates a tooltip containing all missing holiday items contained in the list theMissDisp\r\n * @param \t{list}\t\t\ttheMissDisp\t\tA list of the missing holiday items\r\n * @returns\t{object}\t\tfrag\t\t\tThe tooltip object\r\n */\r\nexport function StatsMissDisp(theMissDisp) {\r\n const frag = document.createDocumentFragment();\r\n frag.appendChild(document.createTextNode(`${theMissDisp.length} `));\r\n const span = document.createElement('span');\r\n span.onmouseout = function () {\r\n Game.tooltip.hide();\r\n };\r\n const placeholder = document.createElement('div');\r\n const missing = document.createElement('div');\r\n missing.style.minWidth = '140px';\r\n missing.style.marginBottom = '4px';\r\n const title = document.createElement('div');\r\n title.className = 'name';\r\n title.style.marginBottom = '4px';\r\n title.style.textAlign = 'center';\r\n title.textContent = 'Missing';\r\n missing.appendChild(title);\r\n Object.keys(theMissDisp).forEach((i) => {\r\n const div = document.createElement('div');\r\n div.style.textAlign = 'center';\r\n div.appendChild(document.createTextNode(theMissDisp[i]));\r\n missing.appendChild(div);\r\n });\r\n placeholder.appendChild(missing);\r\n span.onmouseover = function () {\r\n Game.tooltip.draw(this, escape(placeholder.innerHTML));\r\n };\r\n span.style.cursor = 'default';\r\n span.style.display = 'inline-block';\r\n span.style.height = '10px';\r\n span.style.width = '10px';\r\n span.style.borderRadius = '5px';\r\n span.style.textAlign = 'center';\r\n span.style.backgroundColor = '#C0C0C0';\r\n span.style.color = 'black';\r\n span.style.fontSize = '9px';\r\n span.style.verticalAlign = 'bottom';\r\n span.textContent = '?';\r\n frag.appendChild(span);\r\n return frag;\r\n}\r\n","import { saveAndLoadingFunctions } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\n\r\n/** Functions related to toggling or changing an individual setting */\r\n\r\n/** Used to name certain DOM or outside facing elements and refer to them */\r\nexport const ConfigPrefix = 'CMConfig';\r\n\r\n/**\r\n * This function toggles header options by incrementing them with 1 and handling changes\r\n * It is called by the onclick event of the +/- next to headers\r\n * @param \t{string}\tconfig\tThe name of the header\r\n */\r\nexport function ToggleHeader(config) {\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[config] += 1;\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[config] > 1)\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers[config] = 0;\r\n saveAndLoadingFunctions.saveFramework();\r\n}\r\n","/** Main function to create the sections of Cookie Monster on the Statistics page */\r\n\r\nimport { AddMissingUpgrades } from './CreateMissingUpgrades';\r\nimport * as CreateSections from './CreateStatsSections';\r\nimport * as CreateElements from './CreateDOMElements';\r\nimport * as GameData from '../../../Data/Gamedata';\r\n\r\nimport {\r\n CacheAverageClicks,\r\n CacheAverageCookiesFromClicks,\r\n CacheObjectsNextAchievement,\r\n CacheWrinklersFattest,\r\n CacheWrinklersNormal,\r\n CacheWrinklersTotal,\r\n} from '../../../Cache/VariablesAndData';\r\nimport PopAllNormalWrinklers from '../../HelperFunctions/PopWrinklers';\r\nimport { ClickTimes, CookieTimes } from '../../VariablesAndData';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport AddMissingAchievements from './CreateMissingAchievements';\r\n\r\n/**\r\n * This function adds stats created by CookieMonster to the stats page\r\n * It is called by CM.Disp.AddMenu\r\n * @param {object} title\tOn object that includes the title of the menu\r\n */\r\nexport default function AddMenuStats(title) {\r\n const stats = document.createElement('div');\r\n stats.className = 'subsection';\r\n stats.appendChild(title);\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Lucky Cookies', 'Lucky'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Lucky) {\r\n stats.appendChild(CreateSections.LuckySection());\r\n }\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Chain Cookies', 'Chain'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Chain) {\r\n stats.appendChild(CreateSections.ChainSection());\r\n }\r\n\r\n if (Game.Objects['Wizard tower'].minigameLoaded) {\r\n stats.appendChild(CreateElements.StatsHeader('Spells', 'Spells'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Spells) {\r\n stats.appendChild(CreateSections.SpellsSection());\r\n }\r\n }\r\n\r\n if (Game.Objects.Farm.minigameLoaded) {\r\n stats.appendChild(CreateElements.StatsHeader('Garden', 'Garden'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Garden) {\r\n stats.appendChild(CreateSections.GardenSection());\r\n }\r\n }\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Prestige', 'Prestige'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Prestige) {\r\n stats.appendChild(CreateSections.PrestigeSection());\r\n }\r\n\r\n if (Game.cpsSucked > 0) {\r\n stats.appendChild(CreateElements.StatsHeader('Wrinklers', 'Wrink'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Wrink) {\r\n const popAllFrag = document.createDocumentFragment();\r\n popAllFrag.appendChild(\r\n document.createTextNode(\r\n `${Beautify(CacheWrinklersTotal)} / ${Beautify(CacheWrinklersNormal)} `,\r\n ),\r\n );\r\n const popAllA = document.createElement('a');\r\n popAllA.textContent = 'Pop All Normal';\r\n popAllA.className = 'option';\r\n popAllA.onclick = function () {\r\n PopAllNormalWrinklers();\r\n };\r\n popAllFrag.appendChild(popAllA);\r\n stats.appendChild(\r\n CreateElements.StatsListing('basic', 'Rewards of Popping (All/Normal)', popAllFrag),\r\n );\r\n const popFattestFrag = document.createDocumentFragment();\r\n popFattestFrag.appendChild(document.createTextNode(`${Beautify(CacheWrinklersFattest[0])} `));\r\n const popFattestA = document.createElement('a');\r\n popFattestA.textContent = 'Pop Single Fattest';\r\n popFattestA.className = 'option';\r\n popFattestA.onclick = function () {\r\n if (CacheWrinklersFattest[1] !== null) Game.wrinklers[CacheWrinklersFattest[1]].hp = 0;\r\n };\r\n popFattestFrag.appendChild(popFattestA);\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n `Rewards of Popping Single Fattest Non-Shiny Wrinkler (id: ${\r\n CacheWrinklersFattest[1] !== null ? CacheWrinklersFattest[1] : 'None'\r\n })`,\r\n popFattestFrag,\r\n ),\r\n );\r\n }\r\n }\r\n\r\n stats.appendChild(CreateSections.SeasonSection());\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Achievements', 'Achievs'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Achievs) {\r\n Object.keys(Game.Objects).forEach((i) => {\r\n const ObjectsTillNext = CacheObjectsNextAchievement[i];\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n i,\r\n ObjectsTillNext.AmountNeeded < 101\r\n ? document.createTextNode(\r\n `Next achievement in ${ObjectsTillNext.AmountNeeded}, price: ${Beautify(\r\n ObjectsTillNext.price,\r\n )}`,\r\n )\r\n : document.createTextNode('No new achievement for next 100 buildings'),\r\n ),\r\n );\r\n });\r\n }\r\n\r\n stats.appendChild(CreateElements.StatsHeader('Miscellaneous', 'Misc'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Misc) {\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n `Average cookies per second (past ${\r\n CookieTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist\r\n ] < 60\r\n ? `${\r\n CookieTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist\r\n ]\r\n } seconds`\r\n : CookieTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist\r\n ] /\r\n 60 +\r\n (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgCPSHist === 3\r\n ? ' minute'\r\n : ' minutes')\r\n })`,\r\n document.createTextNode(Beautify(GetCPS(), 3)),\r\n ),\r\n );\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n `Average cookie clicks per second (past ${\r\n ClickTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist\r\n ]\r\n }${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist === 0\r\n ? ' second'\r\n : ' seconds'\r\n })`,\r\n document.createTextNode(Beautify(CacheAverageClicks, 1)),\r\n ),\r\n );\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n `Cookies from clicking (past ${\r\n ClickTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist\r\n ]\r\n }${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist === 0\r\n ? ' second'\r\n : ' seconds'\r\n })`,\r\n document.createTextNode(\r\n Beautify(\r\n CacheAverageCookiesFromClicks.calcSum(\r\n CacheAverageClicks *\r\n ClickTimes[\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.AvgClicksHist\r\n ],\r\n ),\r\n ),\r\n ),\r\n ),\r\n );\r\n if (Game.Has('Fortune cookies')) {\r\n const fortunes = [];\r\n Object.keys(GameData.Fortunes).forEach((i) => {\r\n if (!Game.Has(GameData.Fortunes[i])) {\r\n fortunes.push(GameData.Fortunes[i]);\r\n }\r\n });\r\n if (fortunes.length !== 0)\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n 'Fortune Upgrades Left to Buy',\r\n CreateElements.StatsMissDisp(fortunes),\r\n ),\r\n );\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ShowMissedGC) {\r\n stats.appendChild(\r\n CreateElements.StatsListing(\r\n 'basic',\r\n 'Missed golden cookies',\r\n document.createTextNode(Beautify(Game.missedGoldenClicks)),\r\n ),\r\n );\r\n }\r\n if (Game.prefs.autosave) {\r\n const timer = document.createElement('span');\r\n timer.id = 'CMStatsAutosaveTimer';\r\n timer.innerText = Game.sayTime(\r\n Game.fps * 60 - (Game.OnAscend ? 0 : Game.T % (Game.fps * 60)),\r\n 4,\r\n );\r\n stats.appendChild(CreateElements.StatsListing('basic', 'Time till autosave', timer));\r\n }\r\n }\r\n\r\n l('menu').insertBefore(stats, l('menu').childNodes[2]);\r\n\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingUpgrades) {\r\n AddMissingUpgrades();\r\n }\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingAchievements) {\r\n AddMissingAchievements();\r\n }\r\n}\r\n","/** Functions to create the individual sections of the Statistics page */\r\n\r\nimport * as GameData from '../../../Data/Gamedata';\r\nimport { MaxChainCookieReward } from '../../../Cache/Stats/ChainCookies';\r\nimport {\r\n CacheAvgCPSWithChoEgg,\r\n CacheCentEgg,\r\n CacheChainFrenzyMaxReward,\r\n CacheChainFrenzyRequired,\r\n CacheChainFrenzyRequiredNext,\r\n CacheChainFrenzyWrathRequired,\r\n CacheChainFrenzyWrathRequiredNext,\r\n CacheChainMaxReward,\r\n CacheChainRequired,\r\n CacheChainRequiredNext,\r\n CacheChainWrathMaxReward,\r\n CacheChainWrathRequired,\r\n CacheChainWrathRequiredNext,\r\n CacheConjure,\r\n CacheConjureReward,\r\n CacheDragonsFortuneMultAdjustment,\r\n CacheEdifice,\r\n CacheEdificeBuilding,\r\n CacheGoldenCookiesMult,\r\n CacheHCPerSecond,\r\n CacheLastChoEgg,\r\n CacheLucky,\r\n CacheLuckyFrenzy,\r\n CacheLuckyReward,\r\n CacheLuckyRewardFrenzy,\r\n CacheLuckyWrathReward,\r\n CacheLuckyWrathRewardFrenzy,\r\n CacheNoGoldSwitchCookiesPS,\r\n CacheRealCookiesEarned,\r\n CacheSeaSpec,\r\n CacheWrathCookiesMult,\r\n CacheWrinklersTotal,\r\n} from '../../../Cache/VariablesAndData';\r\nimport ResetBonus from '../../../Sim/SimulationEvents/ResetAscension';\r\nimport CalculateLuckyLevels from '../../HelperFunctions/CalculateLuckyLevels';\r\nimport GetCPS from '../../HelperFunctions/GetCPS';\r\nimport GetWrinkConfigBank from '../../HelperFunctions/GetWrinkConfigBank';\r\nimport { ColourGreen, ColourRed, ColourTextPre } from '../../VariablesAndData';\r\nimport {\r\n StatsListing,\r\n StatsHeader,\r\n StatsMissDisp,\r\n StatsMissDispListing,\r\n} from './CreateDOMElements';\r\nimport Beautify from '../../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../BeautifyAndFormatting/FormatTime';\r\n\r\n/**\r\n * This function creates the \"Lucky\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Lucky section\r\n */\r\nexport function LuckySection() {\r\n // This sets which tooltip to display for certain stats\r\n const goldCookTooltip = Game.auraMult(\"Dragon's Fortune\")\r\n ? 'GoldCookDragonsFortuneTooltipPlaceholder'\r\n : 'GoldCookTooltipPlaceholder';\r\n\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsLuckySection';\r\n\r\n const luckyColour = Game.cookies + GetWrinkConfigBank() < CacheLucky ? ColourRed : ColourGreen;\r\n const luckyTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheLucky\r\n ? FormatTime((CacheLucky - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const luckyReqFrag = document.createDocumentFragment();\r\n const luckyReqSpan = document.createElement('span');\r\n luckyReqSpan.style.fontWeight = 'bold';\r\n luckyReqSpan.className = ColourTextPre + luckyColour;\r\n luckyReqSpan.textContent = Beautify(CacheLucky);\r\n luckyReqFrag.appendChild(luckyReqSpan);\r\n if (luckyTime !== '') {\r\n const luckyReqSmall = document.createElement('small');\r\n luckyReqSmall.textContent = ` (${luckyTime})`;\r\n luckyReqFrag.appendChild(luckyReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing('withTooltip', '\"Lucky!\" cookies required', luckyReqFrag, goldCookTooltip),\r\n );\r\n\r\n const luckyColourFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheLuckyFrenzy ? ColourRed : ColourGreen;\r\n const luckyTimeFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheLuckyFrenzy\r\n ? FormatTime((CacheLuckyFrenzy - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const luckyReqFrenFrag = document.createDocumentFragment();\r\n const luckyReqFrenSpan = document.createElement('span');\r\n luckyReqFrenSpan.style.fontWeight = 'bold';\r\n luckyReqFrenSpan.className = ColourTextPre + luckyColourFrenzy;\r\n luckyReqFrenSpan.textContent = Beautify(CacheLuckyFrenzy);\r\n luckyReqFrenFrag.appendChild(luckyReqFrenSpan);\r\n if (luckyTimeFrenzy !== '') {\r\n const luckyReqFrenSmall = document.createElement('small');\r\n luckyReqFrenSmall.textContent = ` (${luckyTimeFrenzy})`;\r\n luckyReqFrenFrag.appendChild(luckyReqFrenSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Lucky!\" cookies required (frenzy)',\r\n luckyReqFrenFrag,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const luckySplit = CacheLuckyReward !== CacheLuckyWrathReward;\r\n\r\n const luckyRewardMaxSpan = document.createElement('span');\r\n luckyRewardMaxSpan.style.fontWeight = 'bold';\r\n luckyRewardMaxSpan.className = ColourTextPre + CacheLuckyReward;\r\n luckyRewardMaxSpan.textContent =\r\n Beautify(CacheLuckyReward) + (luckySplit ? ` / ${Beautify(CacheLuckyWrathReward)}` : '');\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n `\"Lucky!\" reward (max)${luckySplit ? ' (golden / wrath)' : ''}`,\r\n luckyRewardMaxSpan,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const luckyRewardFrenzyMaxSpan = document.createElement('span');\r\n luckyRewardFrenzyMaxSpan.style.fontWeight = 'bold';\r\n luckyRewardFrenzyMaxSpan.className = ColourTextPre + luckyRewardFrenzyMaxSpan;\r\n luckyRewardFrenzyMaxSpan.textContent =\r\n Beautify(CacheLuckyRewardFrenzy) +\r\n (luckySplit ? ` / ${Beautify(CacheLuckyWrathRewardFrenzy)}` : '');\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n `\"Lucky!\" reward (max) (frenzy)${luckySplit ? ' (golden / wrath)' : ''}`,\r\n luckyRewardFrenzyMaxSpan,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const luckyCurBase =\r\n Math.min(\r\n (Game.cookies + GetWrinkConfigBank()) * 0.15,\r\n CacheNoGoldSwitchCookiesPS * CacheDragonsFortuneMultAdjustment * 60 * 15,\r\n ) + 13;\r\n const luckyCurSpan = document.createElement('span');\r\n luckyCurSpan.style.fontWeight = 'bold';\r\n luckyCurSpan.className = ColourTextPre + luckyCurSpan;\r\n luckyCurSpan.textContent =\r\n Beautify(CacheGoldenCookiesMult * luckyCurBase) +\r\n (luckySplit ? ` / ${Beautify(CacheWrathCookiesMult * luckyCurBase)}` : '');\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n `\"Lucky!\" reward (cur)${luckySplit ? ' (golden / wrath)' : ''}`,\r\n luckyCurSpan,\r\n goldCookTooltip,\r\n ),\r\n );\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Chain\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Chain section\r\n */\r\nexport function ChainSection() {\r\n // This sets which tooltip to display for certain stats\r\n const goldCookTooltip = Game.auraMult(\"Dragon's Fortune\")\r\n ? 'GoldCookDragonsFortuneTooltipPlaceholder'\r\n : 'GoldCookTooltipPlaceholder';\r\n\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsChainSection';\r\n\r\n const chainColour =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainRequired ? ColourRed : ColourGreen;\r\n const chainTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainRequired\r\n ? FormatTime((CacheChainRequired - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const chainReqFrag = document.createDocumentFragment();\r\n const chainReqSpan = document.createElement('span');\r\n chainReqSpan.style.fontWeight = 'bold';\r\n chainReqSpan.className = ColourTextPre + chainColour;\r\n chainReqSpan.textContent = Beautify(CacheChainRequired);\r\n chainReqFrag.appendChild(chainReqSpan);\r\n if (chainTime !== '') {\r\n const chainReqSmall = document.createElement('small');\r\n chainReqSmall.textContent = ` (${chainTime})`;\r\n chainReqFrag.appendChild(chainReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing('withTooltip', '\"Chain\" cookies required', chainReqFrag, goldCookTooltip),\r\n );\r\n\r\n const chainWrathColour =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainWrathRequired ? ColourRed : ColourGreen;\r\n const chainWrathTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainWrathRequired\r\n ? FormatTime((CacheChainWrathRequired - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const chainWrathReqFrag = document.createDocumentFragment();\r\n const chainWrathReqSpan = document.createElement('span');\r\n chainWrathReqSpan.style.fontWeight = 'bold';\r\n chainWrathReqSpan.className = ColourTextPre + chainWrathColour;\r\n chainWrathReqSpan.textContent = Beautify(CacheChainWrathRequired);\r\n chainWrathReqFrag.appendChild(chainWrathReqSpan);\r\n if (chainWrathTime !== '') {\r\n const chainWrathReqSmall = document.createElement('small');\r\n chainWrathReqSmall.textContent = ` (${chainWrathTime})`;\r\n chainWrathReqFrag.appendChild(chainWrathReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" cookies required (Wrath)',\r\n chainWrathReqFrag,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const chainColourFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainFrenzyRequired ? ColourRed : ColourGreen;\r\n const chainTimeFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainFrenzyRequired\r\n ? FormatTime((CacheChainFrenzyRequired - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n const chainReqFrenFrag = document.createDocumentFragment();\r\n const chainReqFrenSpan = document.createElement('span');\r\n chainReqFrenSpan.style.fontWeight = 'bold';\r\n chainReqFrenSpan.className = ColourTextPre + chainColourFrenzy;\r\n chainReqFrenSpan.textContent = Beautify(CacheChainFrenzyRequired);\r\n chainReqFrenFrag.appendChild(chainReqFrenSpan);\r\n if (chainTimeFrenzy !== '') {\r\n const chainReqFrenSmall = document.createElement('small');\r\n chainReqFrenSmall.textContent = ` (${chainTimeFrenzy})`;\r\n chainReqFrenFrag.appendChild(chainReqFrenSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" cookies required (Frenzy)',\r\n chainReqFrenFrag,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const chainWrathColourFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainFrenzyWrathRequired ? ColourRed : ColourGreen;\r\n const chainWrathTimeFrenzy =\r\n Game.cookies + GetWrinkConfigBank() < CacheChainFrenzyWrathRequired\r\n ? FormatTime(\r\n (CacheChainFrenzyWrathRequired - (Game.cookies + GetWrinkConfigBank())) / GetCPS(),\r\n )\r\n : '';\r\n const chainWrathReqFrenFrag = document.createDocumentFragment();\r\n const chainWrathReqFrenSpan = document.createElement('span');\r\n chainWrathReqFrenSpan.style.fontWeight = 'bold';\r\n chainWrathReqFrenSpan.className = ColourTextPre + chainWrathColourFrenzy;\r\n chainWrathReqFrenSpan.textContent = Beautify(CacheChainFrenzyWrathRequired);\r\n chainWrathReqFrenFrag.appendChild(chainWrathReqFrenSpan);\r\n if (chainWrathTimeFrenzy !== '') {\r\n const chainWrathReqFrenSmall = document.createElement('small');\r\n chainWrathReqFrenSmall.textContent = ` (${chainWrathTimeFrenzy})`;\r\n chainWrathReqFrenFrag.appendChild(chainWrathReqFrenSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" cookies required (frenzy) (Wrath)',\r\n chainWrathReqFrenFrag,\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" reward (max) (golden / wrath)',\r\n document.createTextNode(\r\n `${Beautify(CacheChainMaxReward[0])} / ${Beautify(CacheChainWrathMaxReward[0])}`,\r\n ),\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" reward (max) (frenzy) (golden / wrath)',\r\n document.createTextNode(\r\n `${Beautify(CacheChainFrenzyMaxReward[0])} / ${Beautify(CacheChainFrenzyMaxReward[0])}`,\r\n ),\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n const chainCurMax = Math.min(\r\n Game.cookiesPs * 60 * 60 * 6 * CacheDragonsFortuneMultAdjustment,\r\n Game.cookies * 0.5,\r\n );\r\n const chainCur = MaxChainCookieReward(7, chainCurMax, CacheGoldenCookiesMult)[0];\r\n const chainCurWrath = MaxChainCookieReward(6, chainCurMax, CacheWrathCookiesMult)[0];\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Chain\" reward (cur) (golden / wrath)',\r\n document.createTextNode(`${Beautify(chainCur)} / ${Beautify(chainCurWrath)}`),\r\n goldCookTooltip,\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'CPS needed for next level (g / w)',\r\n document.createTextNode(\r\n `${Beautify(CacheChainRequiredNext)} / ${Beautify(CacheChainWrathRequiredNext)}`,\r\n ),\r\n 'ChainNextLevelPlaceholder',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'CPS needed for next level (frenzy) (g / w)',\r\n document.createTextNode(\r\n `${Beautify(CacheChainFrenzyRequiredNext)} / ${Beautify(\r\n CacheChainFrenzyWrathRequiredNext,\r\n )}`,\r\n ),\r\n 'ChainNextLevelPlaceholder',\r\n ),\r\n );\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Spells\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Spells section\r\n */\r\nexport function SpellsSection() {\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsSpellsSection';\r\n\r\n const conjureColour =\r\n Game.cookies + GetWrinkConfigBank() < CacheConjure ? ColourRed : ColourGreen;\r\n const conjureTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheConjure\r\n ? FormatTime((CacheConjure - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n\r\n const conjureReqFrag = document.createDocumentFragment();\r\n const conjureReqSpan = document.createElement('span');\r\n conjureReqSpan.style.fontWeight = 'bold';\r\n conjureReqSpan.className = ColourTextPre + conjureColour;\r\n conjureReqSpan.textContent = Beautify(CacheConjure);\r\n conjureReqFrag.appendChild(conjureReqSpan);\r\n if (conjureTime !== '') {\r\n const conjureReqSmall = document.createElement('small');\r\n conjureReqSmall.textContent = ` (${conjureTime})`;\r\n conjureReqFrag.appendChild(conjureReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" cookies required',\r\n conjureReqFrag,\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" reward (max)',\r\n document.createTextNode(Beautify(CacheConjureReward)),\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n\r\n const conjureFrenzyColour =\r\n Game.cookies + GetWrinkConfigBank() < CacheConjure * 7 ? ColourRed : ColourGreen;\r\n const conjureFrenzyCur = Math.min(\r\n (Game.cookies + GetWrinkConfigBank()) * 0.15,\r\n CacheNoGoldSwitchCookiesPS * 60 * 30,\r\n );\r\n const conjureFrenzyTime =\r\n Game.cookies + GetWrinkConfigBank() < CacheConjure * 7\r\n ? FormatTime((CacheConjure * 7 - (Game.cookies + GetWrinkConfigBank())) / GetCPS())\r\n : '';\r\n\r\n const conjureFrenzyReqFrag = document.createDocumentFragment();\r\n const conjureFrenzyReqSpan = document.createElement('span');\r\n conjureFrenzyReqSpan.style.fontWeight = 'bold';\r\n conjureFrenzyReqSpan.className = ColourTextPre + conjureFrenzyColour;\r\n conjureFrenzyReqSpan.textContent = Beautify(CacheConjure * 7);\r\n conjureFrenzyReqFrag.appendChild(conjureFrenzyReqSpan);\r\n if (conjureFrenzyTime !== '') {\r\n const conjureFrenzyReqSmall = document.createElement('small');\r\n conjureFrenzyReqSmall.textContent = ` (${conjureFrenzyTime})`;\r\n conjureFrenzyReqFrag.appendChild(conjureFrenzyReqSmall);\r\n }\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" cookies required (frenzy)',\r\n conjureFrenzyReqFrag,\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" reward (max) (frenzy)',\r\n document.createTextNode(Beautify(CacheConjureReward * 7)),\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Conjure Baked Goods\" reward (cur)',\r\n document.createTextNode(Beautify(conjureFrenzyCur)),\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n if (CacheEdifice) {\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n '\"Spontaneous Edifice\" cookies required (most expensive building)',\r\n document.createTextNode(`${Beautify(CacheEdifice)} (${CacheEdificeBuilding})`),\r\n 'GoldCookTooltipPlaceholder',\r\n ),\r\n );\r\n }\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Garden\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Spells section\r\n */\r\nexport function GardenSection() {\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsGardenSection';\r\n\r\n const bakeberryColour = Game.cookies < Game.cookiesPs * 60 * 10 * 100 ? ColourRed : ColourGreen;\r\n const bakeberryFrag = document.createElement('span');\r\n bakeberryFrag.style.fontWeight = 'bold';\r\n bakeberryFrag.className = ColourTextPre + bakeberryColour;\r\n bakeberryFrag.textContent = Beautify(Game.cookiesPs * 60 * 10 * 100);\r\n section.appendChild(\r\n StatsListing('basic', 'Cookies required for max reward of Bakeberry: ', bakeberryFrag),\r\n );\r\n\r\n const chocorootColour = Game.cookies < Game.cookiesPs * 60 * 100 ? ColourRed : ColourGreen;\r\n const chocorootFrag = document.createElement('span');\r\n chocorootFrag.style.fontWeight = 'bold';\r\n chocorootFrag.className = ColourTextPre + chocorootColour;\r\n chocorootFrag.textContent = Beautify(Game.cookiesPs * 60 * 100);\r\n section.appendChild(\r\n StatsListing('basic', 'Cookies required for max reward of Chocoroot: ', chocorootFrag),\r\n );\r\n\r\n const queenbeetColour = Game.cookies < Game.cookiesPs * 60 * 60 * 25 ? ColourRed : ColourGreen;\r\n const queenbeetFrag = document.createElement('span');\r\n queenbeetFrag.style.fontWeight = 'bold';\r\n queenbeetFrag.className = ColourTextPre + queenbeetColour;\r\n queenbeetFrag.textContent = Beautify(Game.cookiesPs * 60 * 60 * 25);\r\n section.appendChild(\r\n StatsListing('basic', 'Cookies required for max reward of Queenbeet: ', queenbeetFrag),\r\n );\r\n\r\n const duketaterColour = Game.cookies < Game.cookiesPs * 60 * 15 * 100 ? ColourRed : ColourGreen;\r\n const duketaterFrag = document.createElement('span');\r\n duketaterFrag.style.fontWeight = 'bold';\r\n duketaterFrag.className = ColourTextPre + duketaterColour;\r\n duketaterFrag.textContent = Beautify(Game.cookiesPs * 60 * 15 * 100);\r\n section.appendChild(\r\n StatsListing('basic', 'Cookies required for max reward of Duketater: ', duketaterFrag),\r\n );\r\n const missingPlantDrops = [];\r\n Object.keys(GameData.PlantDrops).forEach((i) => {\r\n if (!Game.HasUnlocked(GameData.PlantDrops[i])) {\r\n missingPlantDrops.push(GameData.PlantDrops[i]);\r\n }\r\n });\r\n if (missingPlantDrops.length !== 0) {\r\n section.appendChild(\r\n StatsListing('basic', 'Rare plant drops left to unlock', StatsMissDisp(missingPlantDrops)),\r\n );\r\n }\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Prestige\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Prestige section\r\n */\r\nexport function PrestigeSection() {\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsPrestigeSection';\r\n\r\n const possiblePresMax = Math.floor(\r\n Game.HowMuchPrestige(\r\n CacheRealCookiesEarned +\r\n Game.cookiesReset +\r\n CacheWrinklersTotal +\r\n (Game.HasUnlocked('Chocolate egg') && !Game.Has('Chocolate egg') ? CacheLastChoEgg : 0),\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'Prestige level (cur / max)',\r\n document.createTextNode(`${Beautify(Game.prestige)} / ${Beautify(possiblePresMax)}`),\r\n 'PrestMaxTooltipPlaceholder',\r\n ),\r\n );\r\n\r\n const neededCook = Math.max(\r\n 0,\r\n Game.HowManyCookiesReset(possiblePresMax + 1) -\r\n (CacheRealCookiesEarned +\r\n Game.cookiesReset +\r\n CacheWrinklersTotal +\r\n ((Game.HasUnlocked('Chocolate egg') && !Game.Has('Chocolate egg') ? CacheLastChoEgg : 0)\r\n ? CacheLastChoEgg\r\n : 0)),\r\n );\r\n const cookiesNextFrag = document.createDocumentFragment();\r\n cookiesNextFrag.appendChild(document.createTextNode(Beautify(neededCook)));\r\n const cookiesNextSmall = document.createElement('small');\r\n cookiesNextSmall.textContent = ` (${FormatTime(neededCook / CacheAvgCPSWithChoEgg, 1)})`;\r\n cookiesNextFrag.appendChild(cookiesNextSmall);\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'Cookies to next level',\r\n cookiesNextFrag,\r\n 'NextPrestTooltipPlaceholder',\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'Heavenly chips (cur / max)',\r\n document.createTextNode(\r\n `${Beautify(Game.heavenlyChips)} / ${Beautify(\r\n possiblePresMax - Game.prestige + Game.heavenlyChips,\r\n )}`,\r\n ),\r\n 'HeavenChipMaxTooltipPlaceholder',\r\n ),\r\n );\r\n\r\n section.appendChild(\r\n StatsListing(\r\n 'basic',\r\n 'Heavenly chips per second (last 5 seconds)',\r\n document.createTextNode(Beautify(CacheHCPerSecond, 2)),\r\n ),\r\n );\r\n\r\n const HCTarget = Number(\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.HeavenlyChipsTarget,\r\n );\r\n if (!Number.isNaN(HCTarget)) {\r\n const CookiesTillTarget =\r\n HCTarget - Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned));\r\n if (CookiesTillTarget > 0) {\r\n section.appendChild(\r\n StatsListing(\r\n 'basic',\r\n 'Heavenly chips to target set in settings (cur)',\r\n document.createTextNode(Beautify(CookiesTillTarget)),\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing(\r\n 'basic',\r\n 'Time till target (cur, current 5 second average)',\r\n document.createTextNode(FormatTime(CookiesTillTarget / CacheHCPerSecond)),\r\n ),\r\n );\r\n }\r\n }\r\n\r\n const resetBonus = ResetBonus(possiblePresMax);\r\n const resetFrag = document.createDocumentFragment();\r\n resetFrag.appendChild(document.createTextNode(Beautify(resetBonus)));\r\n const increase = Math.round((resetBonus / Game.cookiesPs) * 10000);\r\n if (Number.isFinite(increase) && increase !== 0) {\r\n const resetSmall = document.createElement('small');\r\n resetSmall.textContent = ` (${increase / 100}% of income)`;\r\n resetFrag.appendChild(resetSmall);\r\n }\r\n section.appendChild(\r\n StatsListing('withTooltip', 'Reset bonus income', resetFrag, 'ResetTooltipPlaceholder'),\r\n );\r\n\r\n const currentPrestige = Math.floor(Game.HowMuchPrestige(Game.cookiesReset));\r\n const willHave = Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned));\r\n const willGet = willHave - currentPrestige;\r\n const { luckyDigit, luckyNumber, luckyPayout } = CalculateLuckyLevels(willHave);\r\n if (!Game.Has('Lucky digit')) {\r\n const luckyDigitDelta = luckyDigit - willHave;\r\n const luckyDigitReset = willGet + luckyDigitDelta;\r\n const fragLuckyDigit = document.createDocumentFragment();\r\n fragLuckyDigit.appendChild(\r\n document.createTextNode(\r\n `${luckyDigit.toLocaleString()} / ${luckyDigitReset.toLocaleString()} (+${luckyDigitDelta})`,\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing('basic', 'Next \"Lucky Digit\" (total / reset)', fragLuckyDigit),\r\n );\r\n }\r\n\r\n if (!Game.Has('Lucky number')) {\r\n const luckyNumberDelta = luckyNumber - willHave;\r\n const luckyNumberReset = willGet + luckyNumberDelta;\r\n const fragLuckyNumber = document.createDocumentFragment();\r\n fragLuckyNumber.appendChild(\r\n document.createTextNode(\r\n `${luckyNumber.toLocaleString()} / ${luckyNumberReset.toLocaleString()} (+${luckyNumberDelta})`,\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing('basic', 'Next \"Lucky Number\" (total / reset)', fragLuckyNumber),\r\n );\r\n }\r\n\r\n if (!Game.Has('Lucky payout')) {\r\n const luckyPayoutDelta = luckyPayout - willHave;\r\n const luckyPayoutReset = willGet + luckyPayoutDelta;\r\n const fragLuckyPayout = document.createDocumentFragment();\r\n fragLuckyPayout.appendChild(\r\n document.createTextNode(\r\n `${luckyPayout.toLocaleString()} / ${luckyPayoutReset.toLocaleString()} (+${luckyPayoutDelta})`,\r\n ),\r\n );\r\n section.appendChild(\r\n StatsListing('basic', 'Next \"Lucky Payout\" (total / reset)', fragLuckyPayout),\r\n );\r\n }\r\n\r\n return section;\r\n}\r\n\r\n/**\r\n * This function creates the \"Season Specials\" section of the stats page\r\n * @returns\t{object}\tsection\t\tThe object contating the Season Specials section\r\n */\r\nexport function SeasonSection() {\r\n const section = document.createElement('div');\r\n section.className = 'CMStatsSeasonSection';\r\n\r\n let specDisp = false;\r\n const missingHalloweenCookies = [];\r\n Object.keys(GameData.HalloCookies).forEach((i) => {\r\n if (!Game.Has(GameData.HalloCookies[i])) {\r\n missingHalloweenCookies.push(GameData.HalloCookies[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const missingChristmasCookies = [];\r\n Object.keys(GameData.ChristCookies).forEach((i) => {\r\n if (!Game.Has(GameData.ChristCookies[i])) {\r\n missingChristmasCookies.push(GameData.ChristCookies[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const missingValentineCookies = [];\r\n Object.keys(GameData.ValCookies).forEach((i) => {\r\n if (!Game.Has(GameData.ValCookies[i])) {\r\n missingValentineCookies.push(GameData.ValCookies[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const missingNormalEggs = [];\r\n Object.keys(Game.eggDrops).forEach((i) => {\r\n if (!Game.HasUnlocked(Game.eggDrops[i])) {\r\n missingNormalEggs.push(Game.eggDrops[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const missingRareEggs = [];\r\n Object.keys(Game.rareEggDrops).forEach((i) => {\r\n if (!Game.HasUnlocked(Game.rareEggDrops[i])) {\r\n missingRareEggs.push(Game.rareEggDrops[i]);\r\n specDisp = true;\r\n }\r\n });\r\n const choEgg = Game.HasUnlocked('Chocolate egg') && !Game.Has('Chocolate egg');\r\n const centEgg = Game.Has('Century egg');\r\n\r\n if (Game.season === 'christmas' || specDisp || choEgg || centEgg) {\r\n section.appendChild(StatsHeader('Season Specials', 'Sea'));\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.headers.Sea) {\r\n if (missingHalloweenCookies.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Halloween cookies left to buy',\r\n StatsMissDisp(missingHalloweenCookies),\r\n Game.season === 'halloween',\r\n ),\r\n );\r\n let failRateHalloween = 0.95;\r\n if (Game.HasAchiev('Spooky cookies')) failRateHalloween = 0.8;\r\n if (Game.Has('Starterror')) failRateHalloween *= 0.9;\r\n failRateHalloween *= 1 / Game.dropRateMult();\r\n if (Game.hasGod) {\r\n const godLvl = Game.hasGod('seasons');\r\n if (godLvl === 1) failRateHalloween *= 0.9;\r\n else if (godLvl === 2) failRateHalloween *= 0.95;\r\n else if (godLvl === 3) failRateHalloween *= 0.97;\r\n }\r\n const obtainedCookiesChance = missingHalloweenCookies.length / 7;\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Chance of receiving a cookie from wrinkler/shiny wrinkler',\r\n document.createTextNode(\r\n `${Beautify((1 - failRateHalloween) * obtainedCookiesChance * 100)}% / ${Beautify(\r\n (1 - failRateHalloween * 0.9) * obtainedCookiesChance * 100,\r\n )}%`,\r\n ),\r\n Game.season === 'halloween',\r\n ),\r\n );\r\n }\r\n if (missingChristmasCookies.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Christmas cookies left to buy',\r\n StatsMissDisp(missingChristmasCookies),\r\n Game.season === 'christmas',\r\n ),\r\n );\r\n let failRateChristmas = 0.8;\r\n if (Game.HasAchiev('Let it snow')) failRateChristmas = 0.6;\r\n failRateChristmas *= 1 / Game.dropRateMult();\r\n if (Game.Has('Starsnow')) failRateChristmas *= 0.95;\r\n if (Game.hasGod) {\r\n const godLvl = Game.hasGod('seasons');\r\n if (godLvl === 1) failRateChristmas *= 0.9;\r\n else if (godLvl === 2) failRateChristmas *= 0.95;\r\n else if (godLvl === 3) failRateChristmas *= 0.97;\r\n }\r\n const obtainedCookiesChance = missingChristmasCookies.length / 7;\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Chance of receiving a cookie from reindeer',\r\n document.createTextNode(\r\n `${Beautify((1 - failRateChristmas) * obtainedCookiesChance * 100)}%`,\r\n ),\r\n Game.season === 'christmas',\r\n ),\r\n );\r\n }\r\n if (missingValentineCookies.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Valentine cookies left to buy',\r\n StatsMissDisp(missingValentineCookies),\r\n Game.season === 'valentines',\r\n ),\r\n );\r\n }\r\n const dropRateEgg = function (StartingFailRate) {\r\n let failRateEgg = StartingFailRate * (1 / Game.dropRateMult());\r\n if (Game.HasAchiev('Hide & seek champion')) failRateEgg *= 0.7;\r\n if (Game.Has('Omelette')) failRateEgg *= 0.9;\r\n if (Game.Has('Starspawn')) failRateEgg *= 0.9;\r\n if (Game.hasGod) {\r\n const godLvl = Game.hasGod('seasons');\r\n if (godLvl === 1) failRateEgg *= 0.9;\r\n else if (godLvl === 2) failRateEgg *= 0.95;\r\n else if (godLvl === 3) failRateEgg *= 0.97;\r\n }\r\n // Calculations courtesy of @svschouw, at https://github.com/Aktanusa/CookieMonster/issues/25\r\n const succesRateEgg = 1 - failRateEgg;\r\n const obtainedEggs = Game.eggDrops.length - missingNormalEggs.length;\r\n const obtainedRareEggs = Game.rareEggDrops.length - missingRareEggs.length;\r\n const pNormal1 = succesRateEgg * 0.9 * (1 - obtainedEggs / Game.eggDrops.length);\r\n const pRare1 = succesRateEgg * 0.1 * (1 - obtainedRareEggs / Game.rareEggDrops.length);\r\n const pRedropNormal = succesRateEgg * 0.9 * (obtainedEggs / Game.eggDrops.length);\r\n const pRedropRare = succesRateEgg * 0.1 * (obtainedRareEggs / Game.rareEggDrops.length);\r\n const pRedrop = pRedropNormal + pRedropRare;\r\n const pNormal2 = pRedrop * 0.9 * (1 - obtainedEggs / Game.eggDrops.length);\r\n const pRare2 = pRedrop * 0.1 * (1 - obtainedRareEggs / Game.rareEggDrops.length);\r\n return [pNormal1 + pNormal2, pRare1 + pRare2];\r\n };\r\n if (missingNormalEggs.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Normal easter eggs left to unlock',\r\n StatsMissDisp(missingNormalEggs),\r\n Game.season === 'easter',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Chance of receiving an egg from wrinkler/golden cookie',\r\n document.createTextNode(\r\n `${Beautify(dropRateEgg(0.98)[0] * 100)}% / ${Beautify(dropRateEgg(0.9)[0] * 100)}%`,\r\n ),\r\n Game.season === 'easter',\r\n ),\r\n );\r\n }\r\n if (missingRareEggs.length !== 0) {\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Rare easter eggs left to unlock',\r\n StatsMissDisp(missingRareEggs),\r\n Game.season === 'easter',\r\n ),\r\n );\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Chance of receiving a rare egg from wrinkler/golden cookie',\r\n document.createTextNode(\r\n `${Beautify(dropRateEgg(0.98)[1] * 100)}% / ${Beautify(dropRateEgg(0.9)[1] * 100)}%`,\r\n ),\r\n Game.season === 'easter',\r\n ),\r\n );\r\n }\r\n\r\n if (Game.season === 'christmas')\r\n section.appendChild(\r\n StatsMissDispListing(\r\n 'basic',\r\n 'Reindeer reward',\r\n document.createTextNode(Beautify(CacheSeaSpec)),\r\n true,\r\n ),\r\n );\r\n if (choEgg) {\r\n section.appendChild(\r\n StatsListing(\r\n 'withTooltip',\r\n 'Chocolate egg cookies',\r\n document.createTextNode(Beautify(CacheLastChoEgg)),\r\n 'ChoEggTooltipPlaceholder',\r\n ),\r\n );\r\n }\r\n if (centEgg) {\r\n section.appendChild(\r\n StatsListing(\r\n 'basic',\r\n 'Century egg multiplier',\r\n document.createTextNode(`${Math.round((CacheCentEgg - 1) * 10000) / 100}%`),\r\n ),\r\n );\r\n }\r\n }\r\n }\r\n return section;\r\n}\r\n","import { CacheRealCookiesEarned } from '../../Cache/VariablesAndData';\r\nimport CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport SimWin from '../SimulationData/SimWin';\r\nimport { SimAchievementsOwned, SimCookiesPs, SimPrestige, SimUpgrades } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This function calculates the cookies per click difference betwene current and after a ascension\r\n * It is called by CM.Disp.CreateStatsPrestigeSection()\r\n * @param\t{number}\tnewHeavenlyChips\tThe total heavenly chips after ascension\r\n * @returns\t{number}\tResetCPS\t\t\tThe CPS difference after reset\r\n */\r\nexport default function ResetBonus(newHeavenlyChips) {\r\n // Calculate CPS with all Heavenly upgrades\r\n let curCPS = Game.cookiesPs;\r\n\r\n CopyData();\r\n\r\n if (SimUpgrades['Heavenly key'].bought === 0) {\r\n SimUpgrades['Heavenly chip secret'].bought = 1;\r\n SimUpgrades['Heavenly cookie stand'].bought = 1;\r\n SimUpgrades['Heavenly bakery'].bought = 1;\r\n SimUpgrades['Heavenly confectionery'].bought = 1;\r\n SimUpgrades['Heavenly key'].bought = 1;\r\n\r\n CalculateGains();\r\n\r\n curCPS = SimCookiesPs;\r\n\r\n CopyData();\r\n }\r\n\r\n if (CacheRealCookiesEarned >= 1000000) SimWin('Sacrifice');\r\n if (CacheRealCookiesEarned >= 1000000000) SimWin('Oblivion');\r\n if (CacheRealCookiesEarned >= 1000000000000) SimWin('From scratch');\r\n if (CacheRealCookiesEarned >= 1000000000000000) SimWin('Nihilism');\r\n if (CacheRealCookiesEarned >= 1000000000000000000) SimWin('Dematerialize');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000) SimWin('Nil zero zilch');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000) SimWin('Transcendence');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000) SimWin('Obliterate');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000) SimWin('Negative void');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000) SimWin('To crumbs, you say?');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000) SimWin('You get nothing');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000)\r\n SimWin('Humble rebeginnings');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000)\r\n SimWin('The end of the world');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000000)\r\n SimWin(\"Oh, you're back\");\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000000000)\r\n SimWin('Lazarus');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000000000000)\r\n SimWin('Smurf account');\r\n if (CacheRealCookiesEarned >= 1000000000000000000000000000000000000000000000000000000)\r\n SimWin(\"If at first you don't succeed\");\r\n\r\n SimUpgrades['Heavenly chip secret'].bought = 1;\r\n SimUpgrades['Heavenly cookie stand'].bought = 1;\r\n SimUpgrades['Heavenly bakery'].bought = 1;\r\n SimUpgrades['Heavenly confectionery'].bought = 1;\r\n SimUpgrades['Heavenly key'].bought = 1;\r\n\r\n SimPrestige = newHeavenlyChips;\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n\r\n const ResetCPS = SimCookiesPs - curCPS;\r\n\r\n // Reset Pretige level after calculation as it is used in CM.Sim.CalculateGains() so can't be local\r\n SimPrestige = Game.prestige;\r\n\r\n return ResetCPS;\r\n}\r\n","function CrateTooltipLockedAchievements(me) {\r\n const tags = [];\r\n if (me.pool === 'shadow') tags.push('Shadow Achievement', '#9700cf');\r\n else tags.push('Achievement', 0);\r\n tags.push('Locked', 0);\r\n\r\n let neuromancy = 0;\r\n if (Game.Has('Neuromancy') || (Game.sesame && me.pool === 'debug')) neuromancy = 1;\r\n if (neuromancy && me.won === 0) tags.push('Click to win!', '#00c462');\r\n else if (neuromancy && me.won > 0) tags.push('Click to lose!', '#00c462');\r\n\r\n let { icon } = me;\r\n if (me.iconFunction) icon = me.iconFunction();\r\n\r\n let { desc } = me;\r\n if (me.descFunc) desc = me.descFunc('stats');\r\n\r\n let tagsStr = '';\r\n for (let i = 0; i < tags.length; i += 2) {\r\n if (i % 2 === 0)\r\n tagsStr += ` <div class=\"tag\" style=\"color:${tags[i + 1] === 0 ? '#fff' : tags[i + 1]};\">[${\r\n tags[i]\r\n }]</div>`;\r\n }\r\n tagsStr = tagsStr.substring(1);\r\n\r\n return `<div style=\"padding:8px 4px;min-width:350px;opacity:0.5\">\r\n <div class=\"icon\" style=\"float:left;margin-left:-8px;margin-top:-8px;background-position:${\r\n -icon[0] * 48\r\n }px ${-icon[1] * 48}px;\"></div>\r\n <div class=\"name\">${me.name}</div>\r\n ${tagsStr}<div class=\"line\"></div><div class=\"description\">${desc}</div></div>\r\n ${\r\n Game.sesame\r\n ? `<div style=\"font-size:9px;\">Id : ${me.id} | Order : ${Math.floor(me.order)}${\r\n me.tier ? ` | Tier : ${me.tier}` : ''\r\n }</div>`\r\n : ''\r\n }`;\r\n}\r\n\r\n/**\r\n * This function overwrites the crates of missing achievements\r\n */\r\nexport default function AddMissingAchievements() {\r\n let achievs;\r\n Object.values(document.querySelectorAll('div.title')).forEach((i) => {\r\n if (i.textContent.includes('Achievements')) {\r\n achievs = i.parentElement.querySelectorAll('div.listing.crateBox')[0];\r\n }\r\n });\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MissingAchievements) {\r\n Object.values(achievs.children).forEach((achievsCrate) => {\r\n if (!achievsCrate.className.includes('enabled')) {\r\n const id = achievsCrate.onclick.toString().split(/\\[(.*)\\]/gi)[1];\r\n const { icon } = Game.AchievementsById[id];\r\n // eslint-disable-next-line no-param-reassign\r\n achievsCrate.style.backgroundPosition = `${-icon[0] * 48}px ${-icon[1] * 48}px`;\r\n // eslint-disable-next-line no-param-reassign\r\n achievsCrate.onmouseover = function () {\r\n if (!Game.mouseDown) {\r\n Game.setOnCrate(this);\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(\r\n this,\r\n () =>\r\n (function () {\r\n return CrateTooltipLockedAchievements(Game.AchievementsById[id]);\r\n })(),\r\n 'top',\r\n );\r\n Game.tooltip.wobble();\r\n }\r\n };\r\n }\r\n });\r\n }\r\n}\r\n","/**\r\n * This function fixes Game.mouseY as a result of bars that are added by CookieMonster\r\n * It is called by Game.UpdateWrinklers(), Game.UpdateSpecial() and the .onmousover of the BigCookie\r\n * before execution of their actual function\r\n */\r\nexport default function FixMouseY(target) {\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBarPos === 0\r\n ) {\r\n const timerBarHeight = parseInt(l('CMTimerBar').style.height, 10);\r\n Game.mouseY -= timerBarHeight;\r\n target();\r\n Game.mouseY += timerBarHeight;\r\n } else {\r\n target();\r\n }\r\n}\r\n","import jscolor from '@eastdesire/jscolor';\r\n\r\nimport CMBeautify from '../../Disp/BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../../Disp/BeautifyAndFormatting/FormatTime';\r\nimport { AddAuraInfo, AddDragonLevelUpTooltip } from '../../Disp/Dragon/Dragon';\r\nimport AddMenu from '../../Disp/MenuSections/AddMenus';\r\nimport UpdateTitle from '../../Disp/TabTitle/TabTitle';\r\nimport ReplaceAscendTooltip from '../../Disp/Tooltips/AscendButton';\r\nimport UpdateTooltipLocation from '../../Disp/Tooltips/PositionLocation';\r\nimport { CMSayTime, Title } from '../../Disp/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport { SimDoSims } from '../../Sim/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport ReplaceTooltipUpgrade from '../ReplaceGameElements/TooltipUpgrades';\r\nimport {\r\n BackupFunctions,\r\n CenturyDateAtBeginLoop, // eslint-disable-line no-unused-vars\r\n CycliusDateAtBeginLoop, // eslint-disable-line no-unused-vars\r\n} from '../VariablesAndData';\r\nimport FixMouseY from './FixMouse';\r\n\r\n/**\r\n * This function replaces certain native (from the base-game) functions\r\n */\r\nexport default function ReplaceNative() {\r\n // eslint-disable-next-line no-undef\r\n BackupFunctions.Beautify = Beautify;\r\n // eslint-disable-next-line no-undef\r\n Beautify = CMBeautify;\r\n\r\n BackupFunctions.CalculateGains = Game.CalculateGains;\r\n Game.CalculateGains = function () {\r\n BackupFunctions.CalculateGains();\r\n SimDoSims = 1;\r\n CycliusDateAtBeginLoop = Date.now();\r\n CenturyDateAtBeginLoop = Date.now();\r\n };\r\n\r\n BackupFunctions.tooltip = {};\r\n BackupFunctions.tooltip.draw = Game.tooltip.draw;\r\n BackupFunctions.tooltip.drawMod = new Function( // eslint-disable-line no-new-func\r\n `return ${Game.tooltip.draw.toString().split('this').join('Game.tooltip')}`,\r\n )();\r\n Game.tooltip.draw = function (from, text, origin) {\r\n BackupFunctions.tooltip.drawMod(from, text, origin);\r\n };\r\n\r\n BackupFunctions.tooltip.update = Game.tooltip.update;\r\n BackupFunctions.tooltip.updateMod = new Function( // eslint-disable-line no-new-func\r\n `return ${Game.tooltip.update.toString().split('this.').join('Game.tooltip.')}`,\r\n )();\r\n Game.tooltip.update = function () {\r\n BackupFunctions.tooltip.updateMod();\r\n UpdateTooltipLocation();\r\n };\r\n\r\n BackupFunctions.UpdateWrinklers = Game.UpdateWrinklers;\r\n Game.UpdateWrinklers = function () {\r\n FixMouseY(BackupFunctions.UpdateWrinklers);\r\n };\r\n\r\n BackupFunctions.UpdateSpecial = Game.UpdateSpecial;\r\n Game.UpdateSpecial = function () {\r\n FixMouseY(BackupFunctions.UpdateSpecial);\r\n };\r\n\r\n // Assumes newer browsers\r\n l('bigCookie').removeEventListener('click', Game.ClickCookie, false);\r\n l('bigCookie').addEventListener(\r\n 'click',\r\n (event) => {\r\n FixMouseY(() => Game.ClickCookie(event, 0));\r\n },\r\n false,\r\n );\r\n\r\n BackupFunctions.RebuildUpgrades = Game.RebuildUpgrades;\r\n Game.RebuildUpgrades = function () {\r\n BackupFunctions.RebuildUpgrades();\r\n ReplaceTooltipUpgrade();\r\n Game.CalculateGains();\r\n };\r\n\r\n BackupFunctions.ClickProduct = Game.ClickProduct;\r\n /**\r\n * This function adds a check to the purchase of a building to allow BulkBuyBlock to work.\r\n * If the options is 1 (on) bulkPrice is under cookies you can't buy the building.\r\n */\r\n Game.ClickProduct = function (what) {\r\n if (\r\n !Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BulkBuyBlock ||\r\n Game.ObjectsById[what].bulkPrice <= Game.cookies ||\r\n Game.buyMode === -1\r\n ) {\r\n BackupFunctions.ClickProduct(what);\r\n }\r\n };\r\n\r\n BackupFunctions.DescribeDragonAura = Game.DescribeDragonAura;\r\n /**\r\n * This function adds the function CM.Disp.AddAuraInfo() to Game.DescribeDragonAura()\r\n * This adds information about CPS differences and costs to the aura choosing interface\r\n * @param\t{number}\taura\tThe number of the aura currently selected by the mouse/user\r\n */\r\n Game.DescribeDragonAura = function (aura) {\r\n BackupFunctions.DescribeDragonAura(aura);\r\n AddAuraInfo(aura);\r\n };\r\n\r\n BackupFunctions.ToggleSpecialMenu = Game.ToggleSpecialMenu;\r\n /**\r\n * This function adds the code to display the tooltips for the levelUp button of the dragon\r\n */\r\n Game.ToggleSpecialMenu = function (on) {\r\n BackupFunctions.ToggleSpecialMenu(on);\r\n AddDragonLevelUpTooltip();\r\n };\r\n\r\n BackupFunctions.UpdateMenu = Game.UpdateMenu;\r\n Game.UpdateMenu = function () {\r\n if (typeof jscolor.picker === 'undefined' || typeof jscolor.picker.owner === 'undefined') {\r\n BackupFunctions.UpdateMenu();\r\n AddMenu();\r\n }\r\n };\r\n\r\n BackupFunctions.sayTime = Game.sayTime;\r\n // eslint-disable-next-line no-unused-vars\r\n CMSayTime = function (time, detail) {\r\n if (Number.isNaN(time) || time <= 0) return BackupFunctions.sayTime(time, detail);\r\n return FormatTime(time / Game.fps, 1);\r\n };\r\n\r\n BackupFunctions.Logic = Game.Logic;\r\n Game.Logic = function () {\r\n BackupFunctions.Logic();\r\n\r\n // Update tab title\r\n let title = 'Cookie Clicker';\r\n if (Game.season === 'fools') title = 'Cookie Baker';\r\n // eslint-disable-next-line no-unused-vars\r\n Title = `${Game.OnAscend ? 'Ascending! ' : ''}${CMBeautify(Game.cookies)} ${\r\n Game.cookies === 1 ? 'cookie' : 'cookies'\r\n } - ${title}`;\r\n UpdateTitle();\r\n\r\n // Since the Ascend Tooltip is not actually a tooltip we need to add our additional info here...\r\n ReplaceAscendTooltip();\r\n };\r\n}\r\n","/**\r\n * This function updates the location of the tooltip\r\n * It is called by Game.tooltip.update() because of CM.Main.ReplaceNative()\r\n */\r\nexport default function UpdateTooltipLocation() {\r\n if (Game.tooltip.origin === 'store') {\r\n let warnOffset = 0;\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnLucky === 1 &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.ToolWarnPos === 1 &&\r\n l('CMDispTooltipWarningParent') !== null\r\n ) {\r\n warnOffset = l('CMDispTooltipWarningParent').clientHeight - 4;\r\n }\r\n Game.tooltip.tta.style.top = `${Math.min(\r\n parseInt(Game.tooltip.tta.style.top, 10),\r\n l('game').clientHeight +\r\n l('topBar').clientHeight -\r\n Game.tooltip.tt.clientHeight -\r\n warnOffset -\r\n 46,\r\n )}px`;\r\n }\r\n // Kept for future possible use if the code changes again\r\n /* else if (!Game.onCrate && !Game.OnAscend && CM.Options.TimerBar === 1 && CM.Options.TimerBarPos === 0) {\r\n\t\tGame.tooltip.tta.style.top = (parseInt(Game.tooltip.tta.style.top) + parseInt(CM.Disp.TimerBar.style.height)) + 'px';\r\n\t} */\r\n}\r\n","import { CreateTooltip } from '../../Disp/Tooltips/Tooltip';\r\nimport { TooltipUpgradeBackup } from '../VariablesAndData';\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of upgrades so that it calls CM.Disp.Tooltip()\r\n * CM.Disp.Tooltip() sets the tooltip type to 'u'\r\n * It is called by Game.RebuildUpgrades() through CM.Main.ReplaceNative() and is therefore not permanent like the other ReplaceTooltip functions\r\n */\r\nexport default function ReplaceTooltipUpgrade() {\r\n TooltipUpgradeBackup = [];\r\n Object.keys(Game.UpgradesInStore).forEach((i) => {\r\n if (l(`upgrade${i}`).onmouseover !== null) {\r\n TooltipUpgradeBackup[i] = l(`upgrade${i}`).onmouseover;\r\n l(`upgrade${i}`).onmouseover = function () {\r\n if (!Game.mouseDown) {\r\n Game.setOnCrate(this);\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('u', `${i}`), 'store');\r\n Game.tooltip.wobble();\r\n }\r\n };\r\n }\r\n });\r\n}\r\n","/** Functions related to the Dragon */\r\n\r\nimport CacheDragonCost from '../../Cache/Dragon/Dragon';\r\nimport { CacheCostDragonUpgrade } from '../../Cache/VariablesAndData';\r\nimport CalculateChangeAura from '../../Sim/SimulationEvents/AuraChange';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\nimport FormatTime from '../BeautifyAndFormatting/FormatTime';\r\n\r\n/**\r\n * This functions adds the two extra lines about CPS and time to recover to the aura picker infoscreen\r\n * @param\t{number}\taura\tThe number of the aura currently selected by the mouse/user\r\n */\r\nexport function AddAuraInfo(aura) {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.DragonAuraInfo === 1) {\r\n const [bonusCPS, priceOfChange] = CalculateChangeAura(aura);\r\n const timeToRecover = FormatTime(priceOfChange / (bonusCPS + Game.cookiesPs));\r\n let bonusCPSPercentage;\r\n if (Game.cookiesPs === 0) bonusCPSPercentage = Beautify(Infinity);\r\n else bonusCPSPercentage = Beautify((bonusCPS / Game.cookiesPs) * 100);\r\n\r\n l('dragonAuraInfo').style.minHeight = '60px';\r\n l('dragonAuraInfo').style.margin = '8px';\r\n l('dragonAuraInfo').appendChild(document.createElement('div')).className = 'line';\r\n const div = document.createElement('div');\r\n div.style.minWidth = '200px';\r\n div.style.textAlign = 'center';\r\n div.textContent = `Picking this aura will change CPS by ${Beautify(\r\n bonusCPS,\r\n )} (${bonusCPSPercentage}% of current CPS).`;\r\n l('dragonAuraInfo').appendChild(div);\r\n const div2 = document.createElement('div');\r\n div2.style.minWidth = '200px';\r\n div2.style.textAlign = 'center';\r\n div2.textContent = `It will take ${timeToRecover} to recover the cost.`;\r\n l('dragonAuraInfo').appendChild(div2);\r\n }\r\n}\r\n\r\n/**\r\n * This functions adds a tooltip to the level up button displaying the cost of rebuying all\r\n * It is called by Game.ToggleSpecialMenu() after CM.Main.ReplaceNative()\r\n */\r\nexport function AddDragonLevelUpTooltip() {\r\n // Check if it is the dragon popup that is on screen\r\n if (\r\n (l('specialPopup').className.match(/onScreen/) &&\r\n l('specialPopup').children[0].style.background.match(/dragon/)) !== null\r\n ) {\r\n for (let i = 0; i < l('specialPopup').childNodes.length; i++) {\r\n if (l('specialPopup').childNodes[i].className === 'optionBox') {\r\n l('specialPopup').children[i].onmouseover = function () {\r\n CacheDragonCost();\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(\r\n l('specialPopup'),\r\n `<div style=\"min-width:200px;text-align:center;\">${CacheCostDragonUpgrade}</div>`,\r\n 'this',\r\n );\r\n Game.tooltip.wobble();\r\n };\r\n l('specialPopup').children[i].onmouseout = function () {\r\n Game.tooltip.shouldHide = 1;\r\n };\r\n }\r\n }\r\n }\r\n}\r\n","import { CacheDragonAura, CacheDragonAura2 } from '../../Cache/VariablesAndData';\r\nimport CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport {\r\n SimAchievementsOwned,\r\n SimBuildingsOwned, // eslint-disable-line no-unused-vars\r\n SimCookiesPs,\r\n SimDragonAura,\r\n SimDragonAura2,\r\n SimObjects,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This functions calculates the cps and cost of changing a Dragon Aura\r\n * It is called by CM.Disp.AddAuraInfo()\r\n * @param\t{number}\t\t\taura\t\t\t\t\t\t\t\t\t\tThe number of the aura currently selected by the mouse/user\r\n * @returns {[number, number]} \t[CM.Sim.cookiesPs - Game.cookiesPs, price]\tThe bonus cps and the price of the change\r\n */\r\nexport default function CalculateChangeAura(aura) {\r\n CopyData();\r\n\r\n // Check if aura being changed is first or second aura\r\n const auraToBeChanged = l('promptContent').children[0].innerHTML.includes('secondary');\r\n if (auraToBeChanged) SimDragonAura2 = aura;\r\n else SimDragonAura = aura;\r\n\r\n // Sell highest building but only if aura is different\r\n let price = 0;\r\n if (SimDragonAura !== CacheDragonAura || SimDragonAura2 !== CacheDragonAura2) {\r\n for (let i = Game.ObjectsById.length - 1; i > -1; --i) {\r\n if (Game.ObjectsById[i].amount > 0) {\r\n const highestBuilding = SimObjects[Game.ObjectsById[i].name].name;\r\n SimObjects[highestBuilding].amount -= 1;\r\n SimBuildingsOwned -= 1;\r\n price =\r\n SimObjects[highestBuilding].basePrice *\r\n Game.priceIncrease **\r\n Math.max(0, SimObjects[highestBuilding].amount - 1 - SimObjects[highestBuilding].free);\r\n price = Game.modifyBuildingPrice(SimObjects[highestBuilding], price);\r\n price = Math.ceil(price);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n return [SimCookiesPs - Game.cookiesPs, price];\r\n}\r\n","import createMenuOptions from './createMenuOptions';\r\nimport AddMenuStats from './Statistics/AddStatsPage';\r\n\r\n/**\r\n * This function adds the calll the functions to add extra info to the stats and options pages\r\n */\r\nexport default function AddMenu() {\r\n const title = document.createElement('div');\r\n title.className = 'title';\r\n\r\n if (Game.onMenu === 'stats') {\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Stats) {\r\n title.textContent = 'Cookie Monster Statistics';\r\n AddMenuStats(title);\r\n }\r\n } else if (Game.onMenu === 'prefs') {\r\n // Added because Framework is broken\r\n l('menu').childNodes[2].insertBefore(\r\n createMenuOptions(),\r\n l('menu').childNodes[2].childNodes[l('menu').childNodes[2].childNodes.length - 1],\r\n );\r\n }\r\n}\r\n","/** Functions related to updating the tab in the browser's tab-bar */\r\n\r\nimport { CacheSeasonPopShimmer, CacheSpawnedGoldenShimmer } from '../../Cache/VariablesAndData';\r\n\r\nimport { LastSeasonPopupState, LastTickerFortuneState } from '../../Main/VariablesAndData';\r\nimport { Title } from '../VariablesAndData';\r\n\r\n/**\r\n * This function updates the tab title\r\n * It is called on every loop by Game.Logic() which also sets CM.Disp.Title to Game.cookies\r\n */\r\nexport default function UpdateTitle() {\r\n if (\r\n Game.OnAscend ||\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title === 0\r\n ) {\r\n document.title = Title;\r\n } else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title === 1) {\r\n let addFC = false;\r\n let addSP = false;\r\n let titleGC;\r\n let titleFC;\r\n let titleSP;\r\n\r\n if (CacheSpawnedGoldenShimmer) {\r\n if (CacheSpawnedGoldenShimmer.wrath)\r\n titleGC = `[W${Math.ceil(CacheSpawnedGoldenShimmer.life / Game.fps)}]`;\r\n else titleGC = `[G${Math.ceil(CacheSpawnedGoldenShimmer.life / Game.fps)}]`;\r\n } else if (!Game.Has('Golden switch [off]')) {\r\n titleGC = `[${Number(l('CMTimerBarGCMinBar').textContent) < 0 ? '!' : ''}${Math.ceil(\r\n (Game.shimmerTypes.golden.maxTime - Game.shimmerTypes.golden.time) / Game.fps,\r\n )}]`;\r\n } else titleGC = '[GS]';\r\n\r\n if (LastTickerFortuneState) {\r\n addFC = true;\r\n titleFC = '[F]';\r\n }\r\n\r\n if (Game.season === 'christmas') {\r\n addSP = true;\r\n if (LastSeasonPopupState) titleSP = `[R${Math.ceil(CacheSeasonPopShimmer.life / Game.fps)}]`;\r\n else {\r\n titleSP = `[${Number(l('CMTimerBarRenMinBar').textContent) < 0 ? '!' : ''}${Math.ceil(\r\n (Game.shimmerTypes.reindeer.maxTime - Game.shimmerTypes.reindeer.time) / Game.fps,\r\n )}]`;\r\n }\r\n }\r\n\r\n // Remove previous timers and add current cookies\r\n let str = Title;\r\n if (str.charAt(0) === '[') {\r\n str = str.substring(str.lastIndexOf(']') + 1);\r\n }\r\n document.title = `${titleGC + (addFC ? titleFC : '') + (addSP ? titleSP : '')} ${str}`;\r\n } else if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.Title === 2) {\r\n let str = '';\r\n let spawn = false;\r\n if (CacheSpawnedGoldenShimmer) {\r\n spawn = true;\r\n if (CacheSpawnedGoldenShimmer.wrath)\r\n str += `[W${Math.ceil(CacheSpawnedGoldenShimmer.life / Game.fps)}]`;\r\n else str += `[G${Math.ceil(CacheSpawnedGoldenShimmer.life / Game.fps)}]`;\r\n }\r\n if (LastTickerFortuneState) {\r\n spawn = true;\r\n str += '[F]';\r\n }\r\n if (Game.season === 'christmas' && LastSeasonPopupState) {\r\n str += `[R${Math.ceil(CacheSeasonPopShimmer.life / Game.fps)}]`;\r\n spawn = true;\r\n }\r\n if (spawn) str += ' - ';\r\n let title = 'Cookie Clicker';\r\n if (Game.season === 'fools') title = 'Cookie Baker';\r\n str += title;\r\n document.title = str;\r\n }\r\n}\r\n","import {\r\n CacheHCPerSecond,\r\n CacheLastHeavenlyChips,\r\n CacheTimeTillNextPrestige,\r\n} from '../../Cache/VariablesAndData';\r\nimport Beautify from '../BeautifyAndFormatting/Beautify';\r\n\r\n/**\r\n * This function creates a header object for tooltips.\r\n * @param\t{string}\ttext\tTitle of header\r\n * @returns {object}\tdiv\t\tAn object containing the stylized header\r\n */\r\nexport default function ReplaceAscendTooltip() {\r\n const cookiesToNext = Math.max(\r\n 0,\r\n Game.HowManyCookiesReset(\r\n Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned)) + 1,\r\n ) -\r\n (Game.cookiesEarned + Game.cookiesReset),\r\n );\r\n\r\n const startDate = Game.sayTime(((Date.now() - Game.startDate) / 1000) * Game.fps, -1);\r\n let str = `You've been on this run for <b>${\r\n startDate === '' ? 'not very long' : startDate\r\n }</b>.<br>\r\n <div class=\"line\"></div>`;\r\n if (Game.prestige > 0) {\r\n str += `Your prestige level is currently <b>${Beautify(Game.prestige)}</b>.<br>(CpS +${Beautify(\r\n Game.prestige,\r\n )}%)\r\n <div class=\"line\"></div>`;\r\n }\r\n if (CacheLastHeavenlyChips < 1) str += 'Ascending now would grant you no prestige.';\r\n else if (CacheLastHeavenlyChips < 2)\r\n str +=\r\n 'Ascending now would grant you<br><b>1 prestige level</b> (+1% CpS)<br>and <b>1 heavenly chip</b> to spend.';\r\n else\r\n str += `Ascending now would grant you<br><b>${Beautify(\r\n CacheLastHeavenlyChips,\r\n )} prestige levels</b> (+${Beautify(CacheLastHeavenlyChips)}% CpS)<br>and <b>${Beautify(\r\n CacheLastHeavenlyChips,\r\n )} heavenly chips</b> to spend.`;\r\n str += `<div class=\"line\"></div>\r\n You need <b>${Beautify(cookiesToNext)} more cookies</b> for the next level.<br>\r\n ${\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipAscendButton\r\n ? `<div class='line'></div>It takes ${CacheTimeTillNextPrestige} to reach the next level and you were making ${Beautify(\r\n CacheHCPerSecond,\r\n 2,\r\n )} chips on average in the last 5 seconds.<br>`\r\n : ''\r\n }`;\r\n l('ascendTooltip').innerHTML = str;\r\n}\r\n","import InitCache from '../Cache/CacheInit';\r\nimport { CacheStatsCookies } from '../Cache/Stats/Stats';\r\nimport { VersionMajor, VersionMinor } from '../Data/Moddata';\r\nimport CreateUpgradeBar from '../Disp/BuildingsUpgrades/UpgradeBar';\r\nimport { CreateBotBar } from '../Disp/InfoBars/BottomBar';\r\nimport { CreateTimerBar } from '../Disp/InfoBars/TimerBar';\r\nimport CreateSectionHideButtons from '../Disp/Initialization/CreateSectionHideButtons';\r\nimport CreateWrinklerButtons from '../Disp/Initialization/CreateWrinklerButton';\r\nimport CreateCssArea from '../Disp/Initialization/CssArea';\r\nimport UpdateBuildingUpgradeStyle from '../Disp/Initialization/UpdateBuildingUpgradeStyle';\r\nimport { CreateFavicon } from '../Disp/TabTitle/FavIcon';\r\nimport { CreateSimpleTooltip } from '../Disp/Tooltips/Tooltip';\r\nimport { CMLastAscendState, TooltipText } from '../Disp/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport InitData from '../Sim/InitializeData/InitData';\r\nimport ReplaceNativeGrimoire from './ReplaceGameElements/NativeGrimoire';\r\nimport ReplaceTooltips from './ReplaceGameElements/Tooltips';\r\nimport ReplaceNative from './ReplaceGameFunctions/ReplaceNative';\r\nimport { LastModCount } from './VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport AddWrinklerAreaDetect from './WrinklerArea/AddDetectArea';\r\nimport createBuildingLockButtons from '../Disp/buildingTiles/createBuildingLockButtons';\r\n// import createMenuInfo from '../Disp/MenuSections/createMenuInfo';\r\nimport createMenuOptions from '../Disp/MenuSections/createMenuOptions';\r\n\r\n/**\r\n * Initialization loop of Cookie Monster\r\n */\r\nexport default function InitializeCookieMonster() {\r\n // Create global data object\r\n window.CookieMonsterData = {};\r\n\r\n // Register listeners in Cookie Monster Mod Framework\r\n // Commented because Framework is currently broken\r\n // Game.mods.cookieMonsterFramework.listeners.infoMenu.push(createMenuInfo);\r\n Game.mods.cookieMonsterFramework.listeners.optionsMenu.push(createMenuOptions);\r\n\r\n InitData();\r\n CacheStatsCookies();\r\n InitCache();\r\n\r\n // Stored to check if we need to re-initiliaze data\r\n LastModCount = Object.keys(Game.mods).length;\r\n\r\n // Creating visual elements\r\n CreateCssArea();\r\n CreateBotBar();\r\n CreateTimerBar();\r\n CreateUpgradeBar();\r\n CreateSectionHideButtons();\r\n CreateFavicon();\r\n Object.keys(TooltipText).forEach((i) => {\r\n CreateSimpleTooltip(TooltipText[i][0], TooltipText[i][1], TooltipText[i][2]);\r\n });\r\n CreateWrinklerButtons();\r\n UpdateBuildingUpgradeStyle();\r\n createBuildingLockButtons();\r\n\r\n ReplaceTooltips();\r\n AddWrinklerAreaDetect();\r\n\r\n // Replace native functions\r\n ReplaceNative();\r\n ReplaceNativeGrimoire();\r\n Game.CalculateGains();\r\n\r\n CMLastAscendState = Game.OnAscend;\r\n\r\n if (Game.prefs.popups)\r\n Game.Popup(`Cookie Monster version ${VersionMajor}.${VersionMinor} loaded!`);\r\n else Game.Notify(`Cookie Monster version ${VersionMajor}.${VersionMinor} loaded!`, '', '', 1, 1);\r\n\r\n Game.Win('Third-party');\r\n}\r\n","import { DispCSS } from '../VariablesAndData';\r\n\r\n/**\r\n * This function creates a CSS style that stores certain standard CSS classes used by CookieMonster\r\n\r\n */\r\nexport default function CreateCssArea() {\r\n DispCSS = document.createElement('style');\r\n DispCSS.type = 'text/css';\r\n DispCSS.id = 'CMCSS';\r\n\r\n document.head.appendChild(DispCSS);\r\n}\r\n","import {\r\n ColourBackPre,\r\n ColourBlue,\r\n ColourGray,\r\n ColourGreen,\r\n ColourOrange,\r\n ColourPurple,\r\n ColourRed,\r\n ColourTextPre,\r\n ColourYellow,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * This function creates the legend for the upgrade bar\r\n * @returns\t{object}\tlegend\tThe legend-object to be added\r\n */\r\nfunction CreateUpgradeBarLegend() {\r\n const legend = document.createElement('div');\r\n legend.style.minWidth = '330px';\r\n legend.style.marginBottom = '4px';\r\n const title = document.createElement('div');\r\n title.className = 'name';\r\n title.style.marginBottom = '4px';\r\n title.textContent = 'Legend';\r\n legend.appendChild(title);\r\n\r\n const legendLine = function (colour, text) {\r\n const div = document.createElement('div');\r\n div.style.verticalAlign = 'middle';\r\n const span = document.createElement('span');\r\n span.className = ColourBackPre + colour;\r\n span.style.display = 'inline-block';\r\n span.style.height = '10px';\r\n span.style.width = '10px';\r\n span.style.marginRight = '4px';\r\n div.appendChild(span);\r\n div.appendChild(document.createTextNode(text));\r\n return div;\r\n };\r\n\r\n legend.appendChild(legendLine(ColourBlue, 'Better than the best PP of a building option'));\r\n legend.appendChild(legendLine(ColourGreen, 'Same as the best PP building option'));\r\n legend.appendChild(legendLine(ColourYellow, 'Within the top 10 of PP for buildings'));\r\n legend.appendChild(legendLine(ColourOrange, 'Within the top 20 of PP for buildings'));\r\n legend.appendChild(legendLine(ColourRed, 'Within the top 30 of PP for buildings'));\r\n legend.appendChild(legendLine(ColourPurple, 'Outside of the top 30 of PP for buildings'));\r\n legend.appendChild(legendLine(ColourGray, 'Negative or infinity PP'));\r\n return legend;\r\n}\r\n\r\n/**\r\n * This function creates the upgrade bar above the upgrade-section in the right section of the screen\r\n */\r\nexport default function CreateUpgradeBar() {\r\n const UpgradeBar = document.createElement('div');\r\n UpgradeBar.id = 'CMUpgradeBar';\r\n UpgradeBar.style.width = '100%';\r\n UpgradeBar.style.backgroundColor = 'black';\r\n UpgradeBar.style.textAlign = 'center';\r\n UpgradeBar.style.fontWeight = 'bold';\r\n UpgradeBar.style.display = 'none';\r\n UpgradeBar.style.zIndex = '21';\r\n UpgradeBar.onmouseout = function () {\r\n Game.tooltip.hide();\r\n };\r\n\r\n const placeholder = document.createElement('div');\r\n placeholder.appendChild(CreateUpgradeBarLegend());\r\n UpgradeBar.onmouseover = function () {\r\n Game.tooltip.draw(this, escape(placeholder.innerHTML), 'store');\r\n };\r\n\r\n const upgradeNumber = function (id, colour) {\r\n const span = document.createElement('span');\r\n span.id = id;\r\n span.className = ColourTextPre + colour;\r\n span.style.width = '14.28571428571429%';\r\n span.style.display = 'inline-block';\r\n span.textContent = '0';\r\n return span;\r\n };\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarBlue', ColourBlue));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarGreen', ColourGreen));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarYellow', ColourYellow));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarOrange', ColourOrange));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarRed', ColourRed));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarPurple', ColourPurple));\r\n UpgradeBar.appendChild(upgradeNumber('CMUpgradeBarGray', ColourGray));\r\n\r\n l('upgrades').parentNode.insertBefore(UpgradeBar, l('upgrades').parentNode.childNodes[3]);\r\n}\r\n","/**\r\n * This function creates two objects at the top of the right column that allowing hiding the upgrade and building section\r\n */\r\nexport default function CreateSectionHideButtons() {\r\n const div = document.createElement('div');\r\n div.id = 'CMSectionHidButtons';\r\n div.style.textAlign = 'center';\r\n const a = document.createElement('a');\r\n a.className = 'option';\r\n a.onclick = function () {\r\n if (l('upgrades').style.display === 'flex') {\r\n l('upgrades').style.display = 'none';\r\n l('toggleUpgrades').style.display = 'none';\r\n l('techUpgrades').style.display = 'none';\r\n l('vaultUpgrades').style.display = 'none';\r\n } else {\r\n l('upgrades').style.display = 'flex';\r\n if (l('toggleUpgrades').children.length !== 0) l('toggleUpgrades').style.display = 'block';\r\n if (l('techUpgrades').children.length !== 0) l('techUpgrades').style.display = 'block';\r\n if (l('vaultUpgrades').children.length !== 0) l('vaultUpgrades').style.display = 'block';\r\n }\r\n };\r\n a.textContent = 'Hide/Show Upgrades';\r\n div.appendChild(a);\r\n const b = document.createElement('a');\r\n b.className = 'option';\r\n b.onclick = function () {\r\n if (l('products').style.display === 'grid') l('products').style.display = 'none';\r\n else l('products').style.display = 'grid';\r\n };\r\n b.textContent = 'Hide/Show Buildings';\r\n div.appendChild(b);\r\n l('store').insertBefore(div, l('store').childNodes[2]);\r\n}\r\n","import { CacheWrinklersFattest } from '../../Cache/VariablesAndData';\r\nimport PopAllNormalWrinklers from '../HelperFunctions/PopWrinklers';\r\nimport { CreateTooltip } from '../Tooltips/Tooltip';\r\n\r\n/**\r\n * This function creates two objects at the bottom of the left column that allowing popping of wrinklers\r\n */\r\nexport default function CreateWrinklerButtons() {\r\n const popAllA = document.createElement('a');\r\n popAllA.id = 'PopAllNormalWrinklerButton';\r\n popAllA.textContent = 'Pop All Normal';\r\n popAllA.className = 'option';\r\n popAllA.onclick = function () {\r\n PopAllNormalWrinklers();\r\n };\r\n popAllA.onmouseout = function () {\r\n Game.tooltip.shouldHide = 1;\r\n };\r\n popAllA.onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('wb', 'PopAllNormal'), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n l('sectionLeftExtra').children[0].append(popAllA);\r\n const popFattestA = document.createElement('a');\r\n popFattestA.id = 'PopFattestWrinklerButton';\r\n popFattestA.textContent = 'Pop Single Fattest';\r\n popFattestA.className = 'option';\r\n popFattestA.onclick = function () {\r\n if (CacheWrinklersFattest[1] !== null) Game.wrinklers[CacheWrinklersFattest[1]].hp = 0;\r\n };\r\n popFattestA.onmouseout = function () {\r\n Game.tooltip.shouldHide = 1;\r\n };\r\n popFattestA.onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('wb', 'PopFattest'), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n l('sectionLeftExtra').children[0].append(popFattestA);\r\n}\r\n","/**\r\n * This function updates the style of the building and upgrade sections to make these sortable\r\n */\r\nexport default function UpdateBuildingUpgradeStyle() {\r\n l('products').style.display = 'grid';\r\n l('storeBulk').style.gridRow = '1/1';\r\n\r\n l('upgrades').style.display = 'flex';\r\n l('upgrades').style['flex-wrap'] = 'wrap';\r\n}\r\n","import toggleBuildingLock from './toggleBuildingLock';\r\n\r\n/**\r\n * This function adds a lock button to the \"building view\" in the middle section\r\n */\r\nexport default function createBuildingLockButtons() {\r\n Object.keys(l('rows').children).forEach((index) => {\r\n const productButtons = l('rows').children[index].children[1];\r\n const button = document.createElement('div');\r\n button.id = `productLock${Number(index) + 1}`;\r\n button.className = 'productButton';\r\n button.innerHTML = 'Lock';\r\n button.onclick = function () {\r\n toggleBuildingLock(Number(index) + 1);\r\n };\r\n productButtons.appendChild(button);\r\n });\r\n}\r\n","/**\r\n * This function toggle the locked state of a building\r\n * @param\t{number}\tindex\tIndex of the row to change\r\n */\r\nexport default function toggleBuildingLock(index) {\r\n if (l(`productLock${index}`).innerHTML === 'Lock') {\r\n // Add to storing array\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.push(\r\n index.toString(),\r\n );\r\n\r\n // Update styles\r\n l(`row${index}`).style.pointerEvents = 'none';\r\n l(`row${index}`).style.opacity = '0.4';\r\n l(`productLock${index}`).innerHTML = 'Unlock';\r\n l(`productLock${index}`).style.pointerEvents = 'auto';\r\n } else {\r\n // Remove from storing array\r\n if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.includes(\r\n index.toString(),\r\n )\r\n ) {\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.filter(\r\n (value) => value !== index.toString(),\r\n );\r\n }\r\n\r\n // Update styles\r\n l(`productLock${index}`).innerHTML = 'Lock';\r\n l(`row${index}`).style.pointerEvents = 'auto';\r\n l(`row${index}`).style.opacity = '1';\r\n }\r\n}\r\n","/** Functions related to replacing tooltips */\r\n\r\nimport { CreateTooltip } from '../../Disp/Tooltips/Tooltip';\r\nimport { LoadMinigames, TooltipBuildBackup, TooltipLumpBackup } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport ReplaceNativeGrimoire from './NativeGrimoire';\r\nimport ReplaceTooltipGrimoire from './TooltipGrimoire';\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of buildings\r\n */\r\nfunction ReplaceTooltipBuild() {\r\n Object.keys(Game.Objects).forEach((i) => {\r\n const me = Game.Objects[i];\r\n if (l(`product${me.id}`).onmouseover !== null) {\r\n TooltipBuildBackup[i] = l(`product${me.id}`).onmouseover;\r\n l(`product${me.id}`).onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('b', `${i}`), 'store');\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of sugar lumps\r\n */\r\nfunction ReplaceTooltipLump() {\r\n if (Game.canLumps()) {\r\n TooltipLumpBackup = l('lumps').onmouseover;\r\n l('lumps').onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('s', 'Lump'), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of all garden plants\r\n */\r\nfunction ReplaceTooltipGarden() {\r\n if (Game.Objects.Farm.minigameLoaded) {\r\n l('gardenTool-1').onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('ha', 'HarvestAllButton'), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n Array.from(l('gardenPlot').children).forEach((child) => {\r\n const coords = child.id.slice(-3);\r\n // eslint-disable-next-line no-param-reassign\r\n child.onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('p', [`${coords[0]}`, `${coords[2]}`]), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * This function replaces the original .onmouseover functions of all stocks\r\n */\r\nfunction ReplaceTooltipMarket() {\r\n if (Game.Objects.Bank.minigameLoaded) {\r\n for (let i = 0; i < Game.Objects.Bank.minigame.goodsById.length; i++) {\r\n l(`bankGood-${i}`).firstChild.onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('sm', i), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n }\r\n}\r\n\r\nfunction ReplaceTooltipPantheon() {\r\n if (Game.Objects.Temple.minigameLoaded) {\r\n for (let i = 0; i < 11; i += 1) {\r\n l(`templeGod${i}`).onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(this, () => CreateTooltip('pag', i), 'this');\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n for (let i = 0; i < 3; i += 1) {\r\n l(`templeSlot${i}`).onmouseover = function () {\r\n Game.tooltip.dynamic = 1;\r\n Game.tooltip.draw(\r\n this,\r\n () => CreateTooltip('pas', [i, Game.Objects.Temple.minigame.slot[i]]),\r\n 'this',\r\n );\r\n Game.tooltip.wobble();\r\n };\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * This function call all functions that replace Game-tooltips with Cookie Monster enhanced tooltips\r\n */\r\nexport default function ReplaceTooltips() {\r\n ReplaceTooltipBuild();\r\n ReplaceTooltipLump();\r\n\r\n // Replace Tooltips of Minigames. Nesting it in LoadMinigames makes sure to replace them even if\r\n // they were not loaded initially\r\n // eslint-disable-next-line prefer-destructuring\r\n LoadMinigames = Game.LoadMinigames;\r\n Game.LoadMinigames = function () {\r\n LoadMinigames();\r\n ReplaceTooltipGarden();\r\n ReplaceTooltipGrimoire();\r\n ReplaceTooltipMarket();\r\n ReplaceTooltipPantheon();\r\n ReplaceNativeGrimoire();\r\n };\r\n Game.LoadMinigames();\r\n}\r\n","import { TooltipWrinklerArea, TooltipWrinklerBeingShown } from '../../Disp/VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This function creates .onmouseover/out events that determine if the mouse is hovering-over a Wrinkler\r\n * As wrinklers are not appended to the DOM we us a different system than for other tooltips\r\n */\r\nexport default function AddWrinklerAreaDetect() {\r\n l('backgroundLeftCanvas').onmouseover = function () {\r\n TooltipWrinklerArea = 1;\r\n };\r\n l('backgroundLeftCanvas').onmouseout = function () {\r\n TooltipWrinklerArea = 0;\r\n Game.tooltip.hide();\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n TooltipWrinklerBeingShown[i] = 0;\r\n });\r\n };\r\n}\r\n","import CalculateGains from '../Calculations/CalculateGains';\r\nimport CheckOtherAchiev from '../Calculations/CheckOtherAchiev';\r\nimport CopyData from '../SimulationData/CopyData';\r\nimport { SimAchievementsOwned, SimCookiesPs, SimGod1, SimGod2, SimGod3 } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\n\r\n/**\r\n * This functions calculates the cps and cost of changing a Dragon Aura\r\n * It is called by CM.Disp.AddAuraInfo()\r\n * @param\t{number}\tgod\t\tThe number of the slot to be swapped in\r\n * @param\t{number slot\tThe slot the god will go to\r\n * @returns {number} \tCM.Sim.cookiesPs - Game.cookiesPs The bonus cps and the price of the change\r\n */\r\nexport default function CalculateChangeGod(god, slot) {\r\n if (!Game.Objects.Temple.minigameLoaded) return 0;\r\n CopyData();\r\n const { minigame } = Game.Objects.Temple;\r\n const CurrentSlot = minigame.godsById[god].slot;\r\n if (CurrentSlot === '0') SimGod1 = minigame.slot[slot];\r\n else if (CurrentSlot === '1') SimGod2 = minigame.slot[slot];\r\n else if (CurrentSlot === '2') SimGod3 = minigame.slot[slot];\r\n /* eslint-disable no-unused-vars */\r\n if (slot === 0) SimGod1 = god;\r\n else if (slot === 1) SimGod2 = god;\r\n else if (slot === 2) SimGod3 = god;\r\n /* eslint-enable no-unused-vars */\r\n\r\n const lastAchievementsOwned = SimAchievementsOwned;\r\n CalculateGains();\r\n\r\n CheckOtherAchiev();\r\n if (lastAchievementsOwned !== SimAchievementsOwned) {\r\n CalculateGains();\r\n }\r\n return SimCookiesPs - Game.cookiesPs;\r\n}\r\n","import InitCache from '../Cache/CacheInit';\r\nimport LoopCache from '../Cache/CacheLoop';\r\nimport CacheNoGoldSwitchCPS from '../Cache/CPS/NoGoldSwitchCPS';\r\nimport CacheSellAllForChoEgg from '../Cache/CPS/SellChoEgg';\r\nimport CacheDragonCost from '../Cache/Dragon/Dragon';\r\nimport CachePantheonGods from '../Cache/PantheonGods/CacheGods';\r\nimport { CacheBuildingsPrices, CacheIncome } from '../Cache/PriceAndIncome/PriceAndIncome';\r\nimport { CacheChain } from '../Cache/Stats/ChainCookies';\r\nimport CacheAllMissingUpgrades from '../Cache/Stats/MissingUpgrades';\r\nimport CacheSeasonSpec from '../Cache/Stats/Reindeer';\r\nimport { CacheGoldenAndWrathCookiesMults, CacheStatsCookies } from '../Cache/Stats/Stats';\r\nimport AllAmountTillNextAchievement from '../Cache/TillNextAchievement/AllAmountTillNextAchievement';\r\nimport { CacheDoRemakeBuildPrices, CacheHadBuildAura } from '../Cache/VariablesAndData';\r\nimport UpdateAscendState from '../Disp/HelperFunctions/UpdateAscendState';\r\nimport { LastAscendState } from '../Disp/VariablesAndData';\r\nimport InitData from '../Sim/InitializeData/InitData';\r\nimport { SimDoSims } from '../Sim/VariablesAndData';\r\nimport CheckGardenTick from './CheckStates/Garden';\r\nimport CheckGoldenCookie from './CheckStates/GoldenCookie';\r\nimport CheckMagicMeter from './CheckStates/Grimoire';\r\nimport CheckSeasonPopup from './CheckStates/Season';\r\nimport CheckTickerFortune from './CheckStates/Ticker';\r\nimport CheckWrinklerCount from './CheckStates/Wrinkler';\r\nimport { LastModCount } from './VariablesAndData';\r\n\r\n/**\r\n * Main loop of Cookie Monster\r\n * CM.init registers it to the \"logic\" hook provided by the modding api\r\n */\r\nexport default function CMLoopHook() {\r\n if (LastAscendState !== Game.OnAscend) {\r\n LastAscendState = Game.OnAscend;\r\n UpdateAscendState();\r\n }\r\n if (!Game.OnAscend && Game.AscendTimer === 0) {\r\n // Check if any other mods have been loaded\r\n if (LastModCount !== Object.keys(Game.mods).length) {\r\n InitData();\r\n InitCache();\r\n LastModCount = Object.keys(Game.mods).length;\r\n }\r\n\r\n // CM.Sim.DoSims is set whenever CPS has changed\r\n if (SimDoSims) {\r\n AllAmountTillNextAchievement(true);\r\n CacheIncome();\r\n\r\n CacheNoGoldSwitchCPS(); // Needed first\r\n CacheGoldenAndWrathCookiesMults();\r\n CacheStatsCookies();\r\n CacheAllMissingUpgrades();\r\n CacheChain();\r\n CacheDragonCost();\r\n CachePantheonGods();\r\n\r\n CacheSeasonSpec();\r\n CacheSellAllForChoEgg();\r\n\r\n SimDoSims = 0;\r\n }\r\n\r\n // Check for aura change to recalculate buildings prices\r\n const hasBuildAura = Game.auraMult('Fierce Hoarder') > 0;\r\n if (!CacheHadBuildAura && hasBuildAura) {\r\n CacheHadBuildAura = true;\r\n CacheDoRemakeBuildPrices = 1;\r\n } else if (CacheHadBuildAura && !hasBuildAura) {\r\n CacheHadBuildAura = false;\r\n CacheDoRemakeBuildPrices = 1;\r\n }\r\n\r\n if (CacheDoRemakeBuildPrices) {\r\n CacheBuildingsPrices();\r\n CacheDoRemakeBuildPrices = 0;\r\n }\r\n\r\n LoopCache();\r\n\r\n // Check all changing minigames and game-states\r\n CheckTickerFortune();\r\n CheckSeasonPopup();\r\n CheckGardenTick();\r\n CheckMagicMeter();\r\n CheckWrinklerCount();\r\n }\r\n // To remove Timers when ascending\r\n CheckGoldenCookie();\r\n}\r\n","import { ToggleTimerBar } from '../../Config/SpecificToggles';\r\nimport ToggleBotBar from '../../Config/Toggles/ToggleBotBar';\r\n\r\nimport UpdateBackground from './UpdateBackground';\r\n\r\n/**\r\n * This function disables and shows the bars created by CookieMonster when the game is \"ascending\"\r\n * It is called by CM.Disp.Draw()\r\n */\r\nexport default function UpdateAscendState() {\r\n if (Game.OnAscend) {\r\n l('game').style.bottom = '0px';\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.BotBar === 1)\r\n l('CMBotBar').style.display = 'none';\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TimerBar === 1)\r\n l('CMTimerBar').style.display = 'none';\r\n } else {\r\n ToggleBotBar();\r\n ToggleTimerBar();\r\n }\r\n UpdateBackground();\r\n}\r\n","import CalcNoGoldSwitchCPS from '../../Sim/Calculations/NoGoldenSwitchCalc';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheNoGoldSwitchCookiesPS } from '../VariablesAndData';\r\n\r\n/**\r\n * This function calculates CPS without the Golden Switch as it might be needed in other functions\r\n * If so it CM.Sim.Win()'s them and the caller function will know to recall CM.Sim.CalculateGains()\r\n * It is called at the end of any functions that simulates certain behaviour\r\n */\r\nexport default function CacheNoGoldSwitchCPS() {\r\n if (Game.Has('Golden switch [off]')) {\r\n CacheNoGoldSwitchCookiesPS = CalcNoGoldSwitchCPS();\r\n } else CacheNoGoldSwitchCookiesPS = Game.cookiesPs;\r\n\r\n FillCMDCache({ CacheNoGoldSwitchCookiesPS });\r\n}\r\n","import CopyData from '../SimulationData/CopyData';\r\nimport { SimCookiesPs, SimUpgrades } from '../VariablesAndData';\r\nimport CalculateGains from './CalculateGains';\r\n\r\n/**\r\n * This function calculates CPS without the Golden Switch\r\n * It is called by CM.Cache.NoGoldSwitchCPS()\r\n */\r\nexport default function CalcNoGoldSwitchCPS() {\r\n CopyData();\r\n SimUpgrades['Golden switch [off]'].bought = 0;\r\n CalculateGains();\r\n return SimCookiesPs;\r\n}\r\n","import CalculateChangeGod from '../../Sim/SimulationEvents/GodChange';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheGods } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the cps effect of each God in slot 1, 2 or 3\r\n */\r\nexport default function CachePantheonGods() {\r\n for (let god = 0; god < 11; god += 1) {\r\n for (let slot = 0; slot < 3; slot += 1) {\r\n CacheGods[god][slot] = CalculateChangeGod(god, slot);\r\n }\r\n }\r\n\r\n FillCMDCache({ CacheGods });\r\n}\r\n","import SellBuildingsForChoEgg from '../../Sim/SimulationEvents/SellBuildingForChoEgg';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheSellForChoEgg } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the reward for selling the Chocolate egg\r\n * It is called by CM.Main.Loop()\r\n * @global\t{number}\tCM.Cache.SellForChoEgg\tTotal cookies to be gained from selling Chocolate egg\r\n */\r\nexport default function CacheSellAllForChoEgg() {\r\n let sellTotal = 0;\r\n // Compute cookies earned by selling stock market goods\r\n if (Game.Objects.Bank.minigameLoaded) {\r\n const marketGoods = Game.Objects.Bank.minigame.goods;\r\n let goodsVal = 0;\r\n Object.keys(marketGoods).forEach((i) => {\r\n const marketGood = marketGoods[i];\r\n goodsVal += marketGood.stock * marketGood.val;\r\n });\r\n sellTotal += goodsVal * Game.cookiesPsRawHighest;\r\n }\r\n // Compute cookies earned by selling all buildings with optimal auras (ES + RB)\r\n sellTotal += SellBuildingsForChoEgg();\r\n CacheSellForChoEgg = sellTotal;\r\n\r\n FillCMDCache({ CacheSellForChoEgg });\r\n}\r\n","import CopyData from '../SimulationData/CopyData';\r\nimport { SimBuildingsOwned, SimDragonAura, SimDragonAura2, SimObjects } from '../VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport BuildingSell from './SellBuilding';\r\n\r\n/**\r\n * This function calculates the maximum cookies obtained from selling buildings just before purchasing the chocolate egg\r\n * It is called by CM.Cache.CacheSellForChoEgg()\r\n * @returns\t{number}\tsellTotal\tThe maximum cookies to be earned\r\n */\r\nexport default function SellBuildingsForChoEgg() {\r\n let sellTotal = 0;\r\n\r\n CopyData();\r\n\r\n // Change auras to Earth Shatterer + Reality bending to optimize money made by selling\r\n let buildingsToSacrifice = 2;\r\n if (SimDragonAura === 5 || SimDragonAura === 18) {\r\n buildingsToSacrifice -= 1;\r\n }\r\n if (SimDragonAura2 === 5 || SimDragonAura2 === 18) {\r\n buildingsToSacrifice -= 1;\r\n }\r\n SimDragonAura = 5;\r\n SimDragonAura2 = 18;\r\n\r\n // Sacrifice highest buildings for the aura switch\r\n for (let i = 0; i < buildingsToSacrifice; ++i) {\r\n let highestBuilding = 'Cursor';\r\n Object.keys(SimObjects).forEach((j) => {\r\n if (SimObjects[j].amount > 0) {\r\n highestBuilding = j;\r\n }\r\n });\r\n SimObjects[highestBuilding].amount -= 1;\r\n SimBuildingsOwned -= 1;\r\n }\r\n\r\n // Get money made by selling all remaining buildings\r\n Object.keys(SimObjects).forEach((i) => {\r\n const me = SimObjects[i];\r\n sellTotal += BuildingSell(\r\n Game.Objects[me.name],\r\n Game.Objects[i].basePrice,\r\n me.amount,\r\n Game.Objects[i].free,\r\n me.amount,\r\n );\r\n });\r\n\r\n return sellTotal;\r\n}\r\n","import FormatTime from '../Disp/BeautifyAndFormatting/FormatTime';\r\nimport GetCPS from '../Disp/HelperFunctions/GetCPS';\r\nimport CacheAvgCPS from './CPS/CPS';\r\nimport CacheCurrWrinklerCPS from './CPS/CurrWrinklerCPS';\r\nimport CachePP from './PP/PP';\r\nimport CacheHeavenlyChipsPS from './Stats/HeavenlyChips';\r\nimport AllAmountTillNextAchievement from './TillNextAchievement/AllAmountTillNextAchievement';\r\nimport { CacheTimeTillNextPrestige } from './VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport CacheWrinklers from './Wrinklers/Wrinklers';\r\n\r\n/**\r\n * This functions caches variables that are needed every loop\r\n * @global\t{string}\tCM.Cache.TimeTillNextPrestige\tTime requried till next prestige level\r\n */\r\nexport default function LoopCache() {\r\n // Update Wrinkler Bank\r\n CacheWrinklers();\r\n\r\n CachePP();\r\n AllAmountTillNextAchievement(false);\r\n CacheCurrWrinklerCPS();\r\n CacheAvgCPS();\r\n CacheHeavenlyChipsPS();\r\n\r\n const cookiesToNext =\r\n Game.HowManyCookiesReset(\r\n Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned)) + 1,\r\n ) -\r\n (Game.cookiesEarned + Game.cookiesReset);\r\n CacheTimeTillNextPrestige = FormatTime(cookiesToNext / GetCPS());\r\n}\r\n","import { SimObjects } from '../../Sim/VariablesAndData';\r\nimport FillCMDCache from '../FillCMDCache';\r\nimport { CacheCurrWrinklerCount, CacheCurrWrinklerCPSMult } from '../VariablesAndData';\r\n\r\n/**\r\n * This functions caches the current Wrinkler CPS multiplier\r\n * @global\t{number}\tCM.Cache.CurrWrinklerCount\t\tCurrent number of wrinklers\r\n * @global\t{number}\tCM.Cache.CurrWrinklerCPSMult\tCurrent multiplier of CPS because of wrinklers (excluding their negative sucking effect)\r\n */\r\nexport default function CacheCurrWrinklerCPS() {\r\n CacheCurrWrinklerCPSMult = 0;\r\n let count = 0;\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n if (Game.wrinklers[i].phase === 2) count += 1;\r\n });\r\n let godMult = 1;\r\n if (SimObjects.Temple.minigameLoaded) {\r\n const godLvl = Game.hasGod('scorn');\r\n if (godLvl === 1) godMult *= 1.15;\r\n else if (godLvl === 2) godMult *= 1.1;\r\n else if (godLvl === 3) godMult *= 1.05;\r\n }\r\n CacheCurrWrinklerCount = count;\r\n CacheCurrWrinklerCPSMult =\r\n count *\r\n (count * 0.05 * 1.1) *\r\n (Game.Has('Sacrilegious corruption') * 0.05 + 1) *\r\n (Game.Has('Wrinklerspawn') * 0.05 + 1) *\r\n godMult;\r\n\r\n FillCMDCache({ CacheCurrWrinklerCount, CacheCurrWrinklerCPSMult });\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { LastTickerFortuneState } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if there is a fortune cookie on the ticker\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckTickerFortune() {\r\n if (LastTickerFortuneState !== (Game.TickerEffect && Game.TickerEffect.type === 'fortune')) {\r\n LastTickerFortuneState = Game.TickerEffect && Game.TickerEffect.type === 'fortune';\r\n if (LastTickerFortuneState) {\r\n nF.createFlash('cookieMonsterMod', 3, 'FortuneFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.FortuneSoundURL,\r\n 'FortuneSound',\r\n 'FortuneVolume',\r\n false,\r\n );\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'FortuneNotification',\r\n 'Fortune Cookie found',\r\n 'A Fortune Cookie has appeared on the Ticker.',\r\n );\r\n }\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { CacheSeasonPopShimmer } from '../../Cache/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport { LastSeasonPopupState } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if there is reindeer that has spawned\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckSeasonPopup() {\r\n if (LastSeasonPopupState !== Game.shimmerTypes.reindeer.spawned) {\r\n LastSeasonPopupState = Game.shimmerTypes.reindeer.spawned;\r\n Object.keys(Game.shimmers).forEach((i) => {\r\n if (Game.shimmers[i].spawnLead && Game.shimmers[i].type === 'reindeer') {\r\n CacheSeasonPopShimmer = Game.shimmers[i];\r\n }\r\n });\r\n nF.createFlash('cookieMonsterMod', 3, 'SeaFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.SeaSoundURL,\r\n 'SeaSound',\r\n 'SeaVolume',\r\n false,\r\n );\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'SeaNotification',\r\n 'Reindeer sighted!',\r\n 'A Reindeer has spawned. Click it now!',\r\n );\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { LastGardenNextStep } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if a garden tick has happened\r\n */\r\nexport default function CheckGardenTick() {\r\n if (\r\n Game.Objects.Farm.minigameLoaded &&\r\n LastGardenNextStep !== Game.Objects.Farm.minigame.nextStep\r\n ) {\r\n if (LastGardenNextStep !== 0 && LastGardenNextStep < Date.now()) {\r\n nF.createFlash('cookieMonsterMod', 3, 'GardFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GardSoundURL,\r\n 'GardSound',\r\n 'GardVolume',\r\n false,\r\n );\r\n }\r\n LastGardenNextStep = Game.Objects.Farm.minigame.nextStep;\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { LastMagicBarFull } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if the magic meter is full\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckMagicMeter() {\r\n if (\r\n Game.Objects['Wizard tower'].minigameLoaded &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GrimoireBar === 1\r\n ) {\r\n const { minigame } = Game.Objects['Wizard tower'];\r\n if (minigame.magic < minigame.magicM) LastMagicBarFull = false;\r\n else if (!LastMagicBarFull) {\r\n LastMagicBarFull = true;\r\n nF.createFlash('cookieMonsterMod', 3, 'MagicFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.MagicSoundURL,\r\n 'MagicSound',\r\n 'MagicVolume',\r\n false,\r\n );\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'MagicNotification',\r\n 'Magic Meter full',\r\n 'Your Magic Meter is full. Cast a spell!',\r\n );\r\n }\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { LastWrinklerCount } from '../VariablesAndData';\r\n\r\n/**\r\n * This function checks if any new Wrinklers have popped up\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckWrinklerCount() {\r\n if (Game.elderWrath > 0) {\r\n let CurrentWrinklers = 0;\r\n Object.keys(Game.wrinklers).forEach((i) => {\r\n if (Game.wrinklers[i].phase === 2) CurrentWrinklers += 1;\r\n });\r\n if (CurrentWrinklers > LastWrinklerCount) {\r\n LastWrinklerCount = CurrentWrinklers;\r\n if (\r\n CurrentWrinklers === Game.getWrinklersMax() &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxFlash\r\n ) {\r\n nF.createFlash('cookieMonsterMod', 3, 'WrinklerMaxFlash', false);\r\n } else {\r\n nF.createFlash('cookieMonsterMod', 3, 'WrinklerFlash', false);\r\n }\r\n if (\r\n CurrentWrinklers === Game.getWrinklersMax() &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxSound\r\n ) {\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxSoundURL,\r\n 'WrinklerMaxSound',\r\n 'WrinklerMaxVolume',\r\n false,\r\n );\r\n } else {\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerSoundURL,\r\n 'WrinklerSound',\r\n 'WrinklerVolume',\r\n false,\r\n );\r\n }\r\n if (\r\n CurrentWrinklers === Game.getWrinklersMax() &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.WrinklerMaxNotification\r\n ) {\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'WrinklerMaxNotification',\r\n 'Maximum Wrinklers Reached',\r\n 'You have reached your maximum ammount of wrinklers',\r\n );\r\n } else {\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'WrinklerNotification',\r\n 'A Wrinkler appeared',\r\n 'A new wrinkler has appeared',\r\n );\r\n }\r\n } else {\r\n LastWrinklerCount = CurrentWrinklers;\r\n }\r\n }\r\n}\r\n","import { notificationsFunctions as nF } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\nimport { CacheSpawnedGoldenShimmer, CacheGoldenShimmersByID } from '../../Cache/VariablesAndData'; // eslint-disable-line no-unused-vars\r\nimport CreateGCTimer from '../../Disp/GoldenCookieTimers/GoldenCookieTimers';\r\nimport { UpdateFavicon } from '../../Disp/TabTitle/FavIcon';\r\nimport { GCTimers } from '../../Disp/VariablesAndData';\r\nimport {\r\n CurrSpawnedGoldenCookieState,\r\n LastGoldenCookieState,\r\n LastSpawnedGoldenCookieState,\r\n} from '../VariablesAndData';\r\n\r\n/**\r\n * Auxilirary function that finds all currently spawned shimmers.\r\n * CM.Cache.spawnedGoldenShimmer stores the non-user spawned cookie to later determine data for the favicon and tab-title\r\n * It is called by CM.CM.Main.CheckGoldenCookie\r\n */\r\nfunction FindShimmer() {\r\n CurrSpawnedGoldenCookieState = 0;\r\n CacheGoldenShimmersByID = {};\r\n Object.keys(Game.shimmers).forEach((i) => {\r\n CacheGoldenShimmersByID[Game.shimmers[i].id] = Game.shimmers[i];\r\n if (Game.shimmers[i].spawnLead && Game.shimmers[i].type === 'golden') {\r\n CacheSpawnedGoldenShimmer = Game.shimmers[i];\r\n CurrSpawnedGoldenCookieState += 1;\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * This function checks for changes in the amount of Golden Cookies\r\n * It is called by CM.Main.Loop\r\n */\r\nexport default function CheckGoldenCookie() {\r\n FindShimmer();\r\n Object.keys(GCTimers).forEach((i) => {\r\n if (typeof CacheGoldenShimmersByID[i] === 'undefined') {\r\n GCTimers[i].parentNode.removeChild(GCTimers[i]);\r\n delete GCTimers[i];\r\n }\r\n });\r\n if (LastGoldenCookieState !== Game.shimmerTypes.golden.n) {\r\n LastGoldenCookieState = Game.shimmerTypes.golden.n;\r\n if (LastGoldenCookieState) {\r\n if (LastSpawnedGoldenCookieState < CurrSpawnedGoldenCookieState) {\r\n nF.createFlash('cookieMonsterMod', 3, 'GCFlash', false);\r\n nF.playCMSound(\r\n 'cookieMonsterMod',\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCSoundURL,\r\n 'GCSound',\r\n 'GCVolume',\r\n false,\r\n );\r\n nF.createNotification(\r\n 'cookieMonsterMod',\r\n 'GCNotification',\r\n 'Golden Cookie Spawned',\r\n 'A Golden Cookie has spawned. Click it now!',\r\n );\r\n }\r\n\r\n Object.keys(Game.shimmers).forEach((i) => {\r\n if (typeof GCTimers[Game.shimmers[i].id] === 'undefined') {\r\n CreateGCTimer(Game.shimmers[i]);\r\n }\r\n });\r\n }\r\n UpdateFavicon();\r\n LastSpawnedGoldenCookieState = CurrSpawnedGoldenCookieState;\r\n if (CurrSpawnedGoldenCookieState === 0) CacheSpawnedGoldenShimmer = 0;\r\n } else if (\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer === 1 &&\r\n LastGoldenCookieState\r\n ) {\r\n Object.keys(GCTimers).forEach((i) => {\r\n GCTimers[i].style.opacity = CacheGoldenShimmersByID[i].l.style.opacity;\r\n GCTimers[i].style.transform = CacheGoldenShimmersByID[i].l.style.transform;\r\n GCTimers[i].textContent = Math.ceil(CacheGoldenShimmersByID[i].life / Game.fps);\r\n });\r\n }\r\n}\r\n","/** Section: Functions related to the Golden Cookie Timers */\r\n\r\nimport { GCTimers } from '../VariablesAndData';\r\n\r\n/**\r\n * This function creates a new Golden Cookie Timer and appends it CM.Disp.GCTimers based on the id of the cookie\r\n * @param\t{object}\tcookie\tA Golden Cookie object\r\n */\r\nexport default function CreateGCTimer(cookie) {\r\n const GCTimer = document.createElement('div');\r\n GCTimer.id = `GCTimer${cookie.id}`;\r\n GCTimer.style.width = '96px';\r\n GCTimer.style.height = '96px';\r\n GCTimer.style.position = 'absolute';\r\n GCTimer.style.zIndex = '10000000001';\r\n GCTimer.style.textAlign = 'center';\r\n GCTimer.style.lineHeight = '96px';\r\n GCTimer.style.fontFamily = '\"Kavoon\", Georgia, serif';\r\n GCTimer.style.fontSize = '35px';\r\n GCTimer.style.cursor = 'pointer';\r\n GCTimer.style.display = 'block';\r\n GCTimer.style.pointerEvents = 'none';\r\n if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.GCTimer === 0)\r\n GCTimer.style.display = 'none';\r\n GCTimer.style.left = cookie.l.style.left;\r\n GCTimer.style.top = cookie.l.style.top;\r\n GCTimer.onclick = function () {\r\n cookie.pop();\r\n };\r\n GCTimer.onmouseover = function () {\r\n cookie.l.style.filter = 'brightness(125%) drop-shadow(0px 0px 3px rgba(255,255,255,1))'; // eslint-disable-line no-param-reassign\r\n cookie.l.style.webkitFilter = 'brightness(125%) drop-shadow(0px 0px 3px rgba(255,255,255,1))'; // eslint-disable-line no-param-reassign\r\n };\r\n GCTimer.onmouseout = function () {\r\n cookie.l.style.filter = ''; // eslint-disable-line no-param-reassign\r\n cookie.l.style.webkitFilter = ''; // eslint-disable-line no-param-reassign\r\n };\r\n\r\n GCTimers[cookie.id] = GCTimer;\r\n l('shimmers').appendChild(GCTimer);\r\n}\r\n","/** This includes all headers of Cookie Monster and their relevant data */\r\nconst headers = {\r\n Favourite: 1,\r\n Calculation: 1,\r\n Notation: 1,\r\n Colours: 1,\r\n BarsDisplay: 1,\r\n Tooltip: 1,\r\n Statistics: 1,\r\n Notification: 1,\r\n NotificationGeneral: 1,\r\n NotificationGC: 1,\r\n NotificationFC: 1,\r\n NotificationSea: 1,\r\n NotificationGard: 1,\r\n NotificationMagi: 1,\r\n NotificationWrink: 1,\r\n NotificationWrinkMax: 1,\r\n Miscellaneous: 1,\r\n Lucky: 1,\r\n Chain: 1,\r\n Spells: 1,\r\n Garden: 1,\r\n Prestige: 1,\r\n Wrink: 1,\r\n Sea: 1,\r\n Achievs: 1,\r\n Misc: 1,\r\n infoMenu: 1,\r\n optionsMenu: 1,\r\n};\r\n\r\nexport default headers;\r\n","import { saveAndLoadingFunctions } from '@cookiemonsterteam/cookiemonsterframework/src/index';\r\n\r\nimport headers from '../Data/headers';\r\nimport { VersionMajor, VersionMinor } from '../Data/Moddata';\r\nimport settings from '../Data/settings';\r\nimport UpdateColours from '../Disp/HelperFunctions/UpdateColours';\r\nimport CMLoopHook from '../Main/LoopHook';\r\nimport InitData from '../Sim/InitializeData/InitData';\r\n\r\n/**\r\n * This creates a load function to the CM object. Per Game code/comments:\r\n * \"do stuff with the string data you saved previously\"\r\n */\r\nexport default function load(str) {\r\n InitData();\r\n\r\n // Load saveData\r\n saveAndLoadingFunctions.loadMod('cookieMonsterMod', str, settings, headers, CMLoopHook);\r\n if (\r\n typeof Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames ===\r\n 'undefined'\r\n ) {\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames = [];\r\n }\r\n\r\n // Update display with colours and locking of minigames\r\n UpdateColours();\r\n for (\r\n let index = 0;\r\n index < Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames.length;\r\n index++\r\n ) {\r\n const buildingIndex =\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.lockedMinigames[index];\r\n l(`row${buildingIndex}`).style.pointerEvents = 'none';\r\n l(`row${buildingIndex}`).style.opacity = '0.4';\r\n l(`productLock${buildingIndex}`).innerHTML = 'Unlock';\r\n l(`productLock${buildingIndex}`).style.pointerEvents = 'auto';\r\n }\r\n\r\n // Notify of update\r\n if (\r\n typeof Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.version !== 'undefined' &&\r\n Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.version !==\r\n `${VersionMajor}.${VersionMinor}`\r\n ) {\r\n if (Game.prefs.popups)\r\n Game.Popup(\r\n 'A new version of Cookie Monster has been loaded, check out the release notes in the info tab!',\r\n );\r\n else\r\n Game.Notify(\r\n 'A new version of Cookie Monster has been loaded, check out the release notes in the info tab!',\r\n '',\r\n '',\r\n 0,\r\n 1,\r\n );\r\n }\r\n}\r\n","import init from './InitSaveLoad/init';\r\nimport load from './InitSaveLoad/load';\r\nimport save from './InitSaveLoad/save';\r\n\r\nconst CM = {\r\n init,\r\n load,\r\n save,\r\n};\r\n\r\nif (typeof Steam !== 'undefined') {\r\n // Need to add a delay for steam\r\n setTimeout(function () {\r\n Game.registerMod('CookieMonster', CM);\r\n\r\n // Game.registerMod also calls CM.load() which calls the loop hook\r\n // Thus sounds normally play at start up as Season and Garden states are checked\r\n window.cookieMonsterFrameworkData.isInitializing = false;\r\n }, 2000);\r\n} else {\r\n Game.registerMod('CookieMonster', CM);\r\n window.cookieMonsterFrameworkData.isInitializing = false;\r\n}\r\n","import { initFunctions } from '@cookiemonsterteam/cookiemonsterframework';\r\nimport { VersionMajor, VersionMinor } from '../Data/Moddata';\r\nimport CMDrawHook from '../Disp/DrawHook';\r\nimport CMClickHook from '../Main/ClickHook';\r\nimport InitializeCookieMonster from '../Main/Initialization';\r\nimport CMLoopHook from '../Main/LoopHook';\r\nimport load from './load';\r\n\r\n/**\r\n * This creates a init function for the CM object. Per Game code/comments:\r\n * \"this function is called as soon as the mod is registered\r\n * declare hooks here\"\r\n * It starts the further initialization of CookieMonster and registers hooks\r\n */\r\nexport default function init() {\r\n let proceed = true;\r\n\r\n // Load Cookie Monster Mod Framework and register mod\r\n initFunctions.initModFramework();\r\n window.cookieMonsterFrameworkData.isInitializing = true;\r\n initFunctions.registerMod('cookieMonsterMod');\r\n\r\n if (Game.version !== Number(VersionMajor)) {\r\n // eslint-disable-next-line no-restricted-globals, no-alert\r\n proceed = confirm(\r\n `Cookie Monster version ${VersionMajor}.${VersionMinor} is meant for Game version ${VersionMajor}. Loading a different version may cause errors. Do you still want to load Cookie Monster?`,\r\n );\r\n }\r\n if (proceed) {\r\n InitializeCookieMonster();\r\n Game.registerHook('click', CMClickHook);\r\n Game.registerHook('draw', CMDrawHook);\r\n Game.registerHook('logic', CMLoopHook);\r\n\r\n // Load default settings if no previous saveData is found\r\n if (typeof Game.modSaveData.cookieMonsterMod === 'undefined') {\r\n load('{}');\r\n }\r\n }\r\n}\r\n","/** Data related directly to Cookie Monster */\r\n\r\nexport const VersionMajor = '2.052';\r\nexport const VersionMinor = '10';\r\n\r\n/** Information about Cookie Monster to be displayed in the info section */\r\nexport const ModDescription = `<a href=\"https://github.com/CookieMonsterTeam/CookieMonster\" target=\"blank\">Cookie Monster</a>\r\n offers a wide range of tools and statistics to enhance your game experience.\r\n It is not a cheat interface – although it does offer helpers for golden cookies and such, everything can be toggled off at will to only leave how much information you want.</br>\r\n Progess on new updates and all previous release notes can be found on the GitHub page linked above!</br>\r\n Please also report any bugs you may find over there!</br>\r\n `;\r\n\r\n/** Latest releasenotes of Cookie Monster to be displayed in the info section */\r\nexport const LatestReleaseNotes = `This update adds support for some parts of cookie clicker 2.048</br>\r\n- added support for Dragon Aura 'Supreme Intellect' in the pantheon calculations</br>\r\n- added support for new tiers of Shimmering veil</br>\r\n- added support for unshackled upgrades</br>\r\n- updated some simulator logic to more cloesly match updated cookie clicker logic</br>\r\n- Bugfix: conjure backed goods tooltip used cached no gold switch raw cps instead of live cps</br>\r\n- Bugfix: negative calculations due to glucosimium upgrades, kittens, unshackled, and achievements</br>`;\r\n","import { VersionMajor, VersionMinor } from '../Data/Moddata';\r\n\r\n/**\r\n * This creates a save function to the CM object. Per Game code/comments:\r\n * \"use this to store persistent data associated with your mod\r\n * return 'a string to be saved';\"\r\n */\r\nexport default function save() {\r\n const saveObject = Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod;\r\n saveObject.version = `${VersionMajor}.${VersionMinor}`;\r\n return JSON.stringify(saveObject);\r\n}\r\n"],"names":["global","factory","module","exports","document","win","Error","window","this","BoxShadow","funcName","elm","jsc","jscolor","initialized","instances","readyQueue","register","addEventListener","pub","init","installBySelector","selector","rootNode","node","elms","querySelectorAll","matchClass","RegExp","lookupClass","i","length","dataOpts","m","undefined","type","toLowerCase","isColorAttrSupported","getDataAttr","className","match","targetElm","optsStr","console","warn","docsRef","opts","trim","parseOptionsStr","e","str","JSON","parse","eParse","looseJSON","Function","eEval","getInstances","inst","targetElement","push","createEl","tagName","el","createElement","setData","nodeOrSelector","sel","querySelector","isNode","val","Node","nodeType","nodeName","removeChildren","firstChild","removeChild","isTextInput","isButton","n","indexOf","isButtonEmpty","value","textContent","isPassiveEventSupported","supported","Object","defineProperty","get","removeEventListener","setAttribute","dataProp","obj","arguments","data","hasOwnProperty","prop","map","removeData","getData","setDefault","name","attrName","getAttribute","setDataAttr","_attachedGroupEvents","attachGroupEvent","groupName","evnt","func","detachGroupEvents","evt","preventDefault","returnValue","captureTarget","target","setCapture","_capturedTarget","releaseTarget","releaseCapture","triggerEvent","eventName","bubbles","cancelable","ev","Event","createEvent","initEvent","dispatchEvent","triggerInputEvent","eventKey","keys","code","keyCode","strList","replace","split","hasClass","classList","contains","addClass","classNames","add","removeClass","repl","remove","getCompStyle","getComputedStyle","currentStyle","setStyle","styles","important","reversible","priority","origStyle","setVal","style","setProperty","hexColor","r","g","b","Math","round","toString","substr","toUpperCase","hexaColor","a","rgbColor","rgbaColor","linearGradient","stdName","prefixes","helper","tryFunc","tryVal","background","getFuncName","Array","prototype","join","call","setBorderRadius","setBoxShadow","getElementPos","relativeToViewport","x","y","rect","getBoundingClientRect","left","top","viewPos","getViewPos","getElementSize","offsetWidth","offsetHeight","getAbsPointerPos","changedTouches","clientX","clientY","getRelPointerPos","targetRect","srcElement","doc","documentElement","pageXOffset","scrollLeft","clientLeft","pageYOffset","scrollTop","clientTop","getViewSize","innerWidth","clientWidth","innerHeight","clientHeight","RGB_HSV","min","v","max","h","HSV_RGB","s","u","floor","parseColorString","ret","rgba","format","parseInt","charAt","mR","mG","mB","mA","par","re","parseFloat","parsePaletteValue","mixed","vals","isArray","colors","color","containsTranparentColor","isAlphaFormat","scaleCanvasForHighDPR","canvas","dpr","devicePixelRatio","width","height","getContext","scale","genColorPreviewCanvas","separatorPos","specWidth","scaleForHighDPR","sepW","previewSeparator","sqSize","chessboardSize","sqColor1","chessboardColor1","sqColor2","chessboardColor2","cWidth","cHeight","ctx","fillStyle","fillRect","start","clearRect","lineWidth","beginPath","strokeStyle","moveTo","lineTo","stroke","genColorPreviewGradient","position","params","apply","redrawPosition","picker","owner","tp","vp","thisObj","fixed","c","ts","vs","pd","getPickerDims","ps","borderW","borderH","l","smartPosition","pp","positionValue","contractShadow","_drawPosition","vShadow","shadowBlur","wrap","boxS","shadow","shadowColor","w","controlBorderWidth","sliderSpace","getControlPadding","sliderSize","getSliderChannel","hasAlphaChannel","pal","getPaletteDims","padding","closeButton","buttonHeight","pW","pH","contentW","contentH","paddedW","paddedH","borderWidth","palette","cols","rows","cellW","cellH","sampleCount","_palette","paletteCols","ceil","paletteSpacing","paletteHeight","pointerBorderWidth","pointerThickness","getPadYChannel","mode","triggerCallback","callback","error","triggerGlobal","eventNames","trigger","_pointerMoveEvent","mouse","touch","_pointerEndEvent","_pointerOrigin","onDocumentKeyUp","tryHide","onWindowResize","onWindowScroll","onParentScroll","onDocumentMouseDown","showOnClick","disabled","show","onControlPointerStart","onPickerTouchStart","controlName","pointerType","registerDragEvents","offset","onDocumentPointerMove","onDocumentPointerEnd","parent","frameElement","ofs","abs","rel","channels","fromHSVA","setPad","setSld","setASld","onPaletteSampleClick","currentTarget","_setFormat","getFormat","paletteSetsAlpha","_paletteHasTransparency","fromRGBA","hideOnPaletteClick","hide","ofsX","ofsY","pointerAbs","xVal","yVal","fmt","createPadCanvas","draw","hGrad","createLinearGradient","addColorStop","vGrad","createSliderGradient","color1","color2","grad","createASliderGradient","hShadow","blur","spread","inset","flags","leaveValue","leaveAlpha","leavePreview","enumOpts","previewPosition","alphaChannel","deprecatedOpts","THIS","setOption","option","oldOpt","newOpt","setter","getOption","getter","drawPicker","_processParentElementsInDOM","box","boxB","pad","padB","padM","padCanvas","cross","crossBY","crossBX","crossLY","crossLX","sld","sldB","sldM","sldGrad","sldPtrS","sldPtrIB","sldPtrMB","sldPtrOB","asld","asldB","asldM","asldGrad","asldPtrS","asldPtrIB","asldPtrMB","asldPtrOB","btn","btnT","appendChild","passive","insetColors","outsetColor","p","displaySlider","displayAlphaSlider","pickerDims","crossOuterSize","crossSize","controlPadding","borderRadius","PI","clear","zIndex","border","borderColor","backgroundColor","opacity","controlBorderColor","cursor","instance","control","pointerBorderColor","pointerColor","overflow","display","sliderInnerSpace","innerHTML","chessboard","si","sampleColor","sampleCssColor","sc","sw","backgroundImage","toDataURL","backgroundRepeat","backgroundPosition","bottom","maxWidth","whiteSpace","buttonColor","font","textAlign","onmousedown","lineHeight","createTextNode","closeText","redrawPad","redrawSld","redrawASld","activeClassName","container","body","parentNode","yChannel","rgb1","rgb2","rgb","toHEXString","sldChannel","isPickerOwner","alpha","random","onChange","onInput","valueElement","alphaElement","previewElement","previewSize","previewPadding","required","hash","uppercase","forceStyle","hideOnLeave","minS","maxS","minV","maxV","minA","maxA","redraw","exposeColor","success","opt","channel","res","evs","callbackProp","isNaN","hsv","fromHSV","fromRGB","fromString","setPreviewElementBg","setValueElementValue","randomize","minH","maxH","toHEXAString","toRGBString","toRGBAString","toGrayscale","toCanvas","toBackground","isLight","_currentFormat","processValueInput","processAlphaInput","colorStr","alphaVal","setAlphaElementValue","backgrounds","image","size","repeat","origin","preview","bg","sty","right","_parentElementsProcessed","compStyle","set__palette","options","presetsArr","preset","slice","pres","presets","nonProperties","test","valueElementOrigEvents","oninput","oldVal","initValue","initAlpha","install","shift","ready","triggerNow","installByClassName","JSColor","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","__esModule","d","definition","key","o","enumerable","Setting","constructor","defaultValue","group","cookieMonsterPrompt","content","Game","promptWrapL","promptL","forEach","id","onclick","PlaySound","children","promptAnchorL","darkenL","focus","promptOn","UpdatePrompt","createFlash","modName","configName","forced","mods","cookieMonsterFramework","saveData","settings","cookieMonsterFrameworkData","isInitializing","setTimeout","fps","saveFramework","modSaveString","stringify","cookieClickerSaveString","b64_to_utf8","unescape","localStorage","getItem","pattern","modSave","newSaveString","setItem","escape","utf8_to_b64","toggleHeader","headerName","headers","playCMSound","url","sndConfig","volConfig","sound","Audio","GeneralSound","volume","play","toggleConfigVolume","addMenu","_","observer","disconnect","onMenu","menu","insertBefore","frameworkInfoDiv","titleDiv","buttonSpan","fontSize","verticalAlign","infoMenu","UpdateMenu","descriptionDiv","createFrameworkInfoMenuSection","listeners","addInfoMenuSection","observe","getElementById","attributes","childList","subtree","drawLoop","optionsMenu","loadMod","settingsData","headersData","logicLoop","saveDataObject","modSaveData","settingsObject","headersObject","favouriteSettings","createSaveDataObject","load","MutationObserver","WhiteScreen","pointerEvents","createFlashScreen","registerHook","save","initFunctions","registerMod","menuFunctions","createInfoListing","listingHTML","listingDiv","createOptionsListing","updateColoursFunc","refreshScaleFunc","div","FavouriteSettings","favourites","FavStar","includes","innerText","filter","ele","toggleFavouriteSetting","onmouseover","tooltip","onmouseout","createFavouriteStar","toggle","label","toggleConfig","desc","title","float","percent","slider","step","onchange","span","input","readOnly","inputPrompt","outerHTML","ClosePrompt","innerSpan","displayName","event","saveObject","altKey","ctrlKey","shiftKey","toggleConfigKeycode","createOptionsSubHeader","text","modDisplayName","menuName","modSectionDiv","notificationsFunctions","createNotification","message","visibilityState","Notification","badge","saveAndLoadingFunctions","settingClasses","super","ToggleWrinklerButtons","cookieMonsterMod","WrinklerButtons","elderWrath","CacheAverageCookiesFromClicks","CookiesDiff","WrinkDiff","WrinkFattestDiff","ChoEggDiff","ClicksDiff","HeavenlyChipsDiff","CacheLastCPSCheck","CacheLastCookies","CacheLastWrinkCookies","CacheLastWrinkFattestCookies","CacheLastClicks","CacheAverageGainBank","CacheAverageGainWrink","CacheAverageGainWrinkFattest","CacheAverageGainChoEgg","CacheAverageCPS","CacheLastHeavenlyCheck","CacheLastHeavenlyChips","CacheDoRemakeBuildPrices","CacheHadBuildAura","SimBuildingsOwned","SimUpgradesOwned","SimPledges","SimAchievementsOwned","SimHeavenlyPower","SimPrestige","SimDragonAura","SimDragonAura2","SimGod1","SimGod2","SimGod3","SimDoSims","SimEffs","SimCookiesPs","SimCookiesPsRaw","CacheDragonAura","CacheDragonAura2","CacheLastDragonLevel","CacheCostDragonUpgrade","CacheLucky","CacheLuckyReward","CacheLuckyWrathReward","CacheLuckyFrenzy","CacheLuckyRewardFrenzy","CacheLuckyWrathRewardFrenzy","CacheConjure","CacheConjureReward","CacheEdifice","CacheEdificeBuilding","CacheNoGoldSwitchCookiesPS","CacheDragonsFortuneMultAdjustment","CacheGoldenCookiesMult","CacheWrathCookiesMult","CacheHCPerSecond","CacheCentEgg","CacheSeaSpec","CacheLastChoEgg","CacheObjects1","CacheObjects10","CacheObjects100","CacheObjectsNextAchievement","CacheWrinklersTotal","CacheWrinklersNormal","CacheWrinklersFattest","CacheCurrWrinklerCPSMult","CacheCurrWrinklerCount","CacheUpgrades","CacheAverageClicks","CacheMissingUpgrades","CacheMissingUpgradesPrestige","CacheMissingUpgradesCookies","CacheChainRequired","CacheChainRequiredNext","CacheChainMaxReward","CacheChainWrathRequired","CacheChainWrathRequiredNext","CacheChainWrathMaxReward","CacheChainFrenzyRequired","CacheChainFrenzyRequiredNext","CacheChainFrenzyMaxReward","CacheChainFrenzyWrathRequired","CacheChainFrenzyWrathRequiredNext","CacheChainFrenzyWrathMaxReward","CacheRealCookiesEarned","CacheAvgCPSWithChoEgg","CacheSpawnedGoldenShimmer","CacheSeasonPopShimmer","CacheTimeTillNextPrestige","CacheMinPP","CacheMinPPBulk","CachePPArray","CacheGoldenShimmersByID","CacheSellForChoEgg","CacheGods","SimObjects","SimUpgrades","SimAchievements","SimAuraMult","what","dragonAuras","dragonLevel","dragonAurasBN","SimGetSellMultiplier","giveBack","SimEff","def","SimHas","it","ascensionMode","pool","tier","bought","SimHasAura","SimHasGod","hasGod","Temple","minigame","Objects","god","gods","SimModifyBuildingPrice","building","price","ModifiedPrice","hasBuff","fortune","minigameLoaded","godLvl","BuildingSell","build","basePrice","free","amount","noSim","noSimRes","toChange","startingAmount","moni","buyBulk","priceIncrease","modifyBuildingPrice","getSellMultiplier","metric","shortScale","shortScaleAbbreviated","LastModCount","TooltipLumpBackup","BackupGrimoireLaunch","BackupGrimoireLaunchMod","BackupGrimoireDraw","HasReplaceNativeGrimoireLaunch","HasReplaceNativeGrimoireDraw","LoadMinigames","LastSeasonPopupState","LastTickerFortuneState","LastGardenNextStep","LastGoldenCookieState","LastSpawnedGoldenCookieState","LastMagicBarFull","CurrSpawnedGoldenCookieState","LastWrinklerCount","DispCSS","TooltipBuildBackup","TooltipGrimoireBackup","TooltipUpgradeBackup","BackupFunctions","CycliusDateAtBeginLoop","Date","now","CenturyDateAtBeginLoop","num","floats","decimals","ScaleDecimals","Infinity","Scale","Beautify","Number","isFinite","answer","ScaleCutoff","ScaleSeparator","toLocaleString","toExponential","exponential","AmountOfTenPowerThree","toFixed","log","ColourTextPre","ColourBackPre","ColourBlue","ColourGreen","ColourYellow","ColourOrange","ColourRed","ColourPurple","ColourGray","ColourPink","ColourBrown","ColoursOrdering","TooltipText","SimpleTooltipElements","CMLastAscendState","TooltipWrinklerArea","TooltipWrinkler","TooltipWrinklerBeingShown","CMSayTime","LastTargetBotBar","LastTargetBuildings","LastTargetTooltipBuilding","CookieTimes","ClickTimes","BuffColours","Frenzy","Clot","Dragonflight","TooltipPrice","TooltipBonusIncome","TooltipType","TooltipName","TooltipBonusMouse","LastAscendState","LastNumberOfTimers","GCTimers","Title","UpdateBuildings","arr","buyMode","removeProperty","BuildColour","colour","SortBuildings","k","sort","amountUntilNext","AmountNeeded","priceUntilNext","gridRow","UpdateUpgradeSectionsHeight","values","getElementsByClassName","section","UpgradesNeverCollapse","minHeight","UpdateUpgrades","UpBarColour","blue","green","yellow","orange","red","purple","gray","UpgradesInStore","me","addedColour","j","childNodes","SortUpgrades","nameChecker","arr2","upgrade","findIndex","order","FormatTime","time","longFormat","formattedTime","TimeFormat","GetTimeColour","GetCPS","CPSMode","CalcWrink","cookiesPs","cpsSucked","wrinklers","GetWrinkConfigBank","CreateTimer","bars","timerBar","margin","marginRight","colourBar","borderTopRightRadius","borderBottomRightRadius","timer","marginLeft","CreateBotBarBuildingColumn","buildingName","bonus","header","substring","lastChild","paddingLeft","UpdateBotBar","BotBar","count","PPString","PPDisplayTime","timeColour","bulkPrice","cookies","UpdateBackground","Background","LeftBackground","DrawBackground","UpdateBotTimerBarPosition","TimerBar","TimerBarPos","ToggleTimerBar","CacheDragonAuras","dragonAura","dragonAura2","InitAchievement","achievementName","Achievements","you","SimGetTieredCpsMult","mult","tieredUpgrades","Tiers","special","tierMult","unshackleUpgrade","synergies","syn","buildingTie1","buildingTie2","grandma","Grandma","misfortune","vanilla","InitialBuildingData","cps","magicCpS","ComputeCps","GrandmaSynergies","UpgradesByPool","kitten","Portal","baseCps","baseCPS","InitUpgrade","upgradeName","Upgrades","power","level","pow","CopyData","UpgradesOwned","pledges","AchievementsOwned","heavenlyPower","prestige","totalCookies","slot","won","TooltipCreateHeader","fontWeight","TooltipCreateCalculationSection","income","marginBottom","click","production","ColourOfPP","PPSecondsLowerLimit","PPOnlyConsiderBuyable","GetCPSBuffMult","buffs","multCpS","SimWin","CalculateGains","effs","myEffs","ii","heavenlyMult","SimGetHeavenlyMultiplier","heralds","cookieUpgrades","buildMult","sin","santaLevel","milkProgress","milkMult","catMult","storedCps","eggMult","day","startDate","lumps","rawCookiesPs","CpsAchievements","threshold","shimmerTypes","golden","auraMult","bakeryName","goldenSwitchMult","upgrades","goldenCookieUpgrades","veilMult","runModHookOnValue","Fortunes","HalloCookies","ChristCookies","ValCookies","PlantDrops","SimHasAchiev","CheckOtherAchiev","grandmas","buildingsOwned","mathematician","base10","minAmount","ObjectsById","Cursor","hasAllHalloCook","hasAllChristCook","list","fortunes","BuyBuildingsBonusIncome","tieredAchievs","achievUnlock","lastAchievementsOwned","CalculateGrimoireRefillTime","currentMagic","maxMagic","targetMagic","magic","ToggleToolWarnPos","ToolWarnPos","UpdateTooltips","tooltipBox","paddingBottom","TooltipBuildUpgrade","increase","productionAchievs","HasAchiev","achiev","nextProductionAchiev","ObjectsTillNext","PPOfAmount","PPFrag","Building","getPrice","bonusMouse","previousSibling","chocolate","Upgrade","TooltipLump","lumpType","lumpColour","lumpCurrentType","SugarLump","spellCost","getSpellCost","spellsById","TooltipGrim","magicM","recover","recoverColour","conjure","reward","seperator","loss","Grimoire","Farm","TooltipPlots","plot","mature","plantsById","plantName","GardenPlots","totalGain","mortal","tile","immortal","matureBase","HarvestAll","Bank","TooltipStocks","stock","goodsById","stockMode","modeIndex","modes","colours","delta","deltaColour","restingValue","getRestingVal","expectedNextValue","expectedValue","pValue","pDelta","bankLevel","dragonBoost","CalculateStockNextExpectedValue","expectedNextValueColour","StockMarket","WrinklerReward","WrinklerButton","TooltipPantheon","GodID","cps1","cps2","cps3","PantheonGods","TooltipWarn","create","boxId","labelTextFront","labelTextBack","deficitId","transition","labelDiv","labelSpan","deficitDiv","deficitSpan","ToolWarnUser","bonusIncomeUsed","ToolWarnBon","limitLucky","bonusNoFren","ToolWarnLucky","ToolWarnLuckyFrenzy","limitLuckyFrenzy","ToolWarnConjure","limitConjure","ToolWarnConjureFrenzy","limitConjureFrenzy","ToolWarnEdifice","Warnings","CMDrawHook","prefs","autosave","drawT","Stats","sayTime","T","maxWidthTwoBar","maxWidthOneBar","numberOfTimers","AutosaveTimerBar","timeTillNextAutosave","OnAscend","TimerBarOverlay","spawned","Has","minTime","maxTime","chanceToSpawn","season","reindeer","BuffTimerBars","classColour","UpdateTimerBar","TooltipWrink","showingTooltip","phase","selected","placeholder","wrinkler","minWidth","CheckWrinklerTooltip","sucked","toSuck","UpdateWrinklerTooltip","UpStats","CMClickHook","addLatest","computedMouseCps","CMAvgQueue","maxLength","queue","newValue","calcAverage","timePeriod","calcSum","reduce","FillCMDCache","caches","CookieMonsterData","Cache","exportName","CacheAvgCPS","currDate","choEggTotal","cookiesEarned","timeDiff","bankDiffAvg","wrinkDiffAvg","wrinkFattestDiffAvg","choEggDiffAvg","clicksDiffAvg","cookieClicks","cpsLength","AvgCPSHist","choEgg","HasUnlocked","AvgClicksHist","BuildingGetPrice","partialPrice","CacheColour","PPRigidelMode","PPExcludeTop","CachePP","indexOfMin","CacheBuildingsPP","Objects1","Objects10","Objects100","entries","BuyUpgradesBonusIncome","unlocked","CountsAsUpgradeOwned","diffMouseCPS","multClick","out","MouseCps","CacheBuildingIncome","result","CacheBuildingsPrices","CacheIncome","bonusIncome","CacheUpgradeIncome","MaxChainCookieReward","digit","maxPayout","totalFromChain","nextMoni","nextRequired","chain","LN10","CacheChain","cpsBuffMult","CacheHeavenlyChipsPS","chipsOwned","HowMuchPrestige","cookiesReset","ascendNowToGet","heavenlyChipsDiffAvg","CacheAllMissingUpgrades","classes","noFrame","crates","icon","iconFunction","getDynamicTooltip","crateMissing","CacheSeasonSpec","CacheStatsCookies","CacheGoldenAndWrathCookiesMults","goldenMult","wrathMult","eff","AllAmountTillNextAchievement","forceRecalc","TotalNeeded","tillNext","AchievementsAtStart","index","lastIndexWithChange","IndividualAmountTillNextAchievement","CacheWrinklers","InitCache","PopAllNormalWrinklers","hp","CreateTooltip","TooltipAmor","buildPrice","amortizeAmount","storedTotalCps","globalCpsMult","crateTooltip","lumpTooltip","spellTooltip","tileTooltip","toolTooltip","goodTooltip","godTooltip","slotTooltip","area","UpdateFavicon","Favicon","wrath","href","InitData","ReplaceTooltipGrimoire","dynamic","wobble","ReplaceNativeGrimoireDraw","GrimoireBar","magicBarTextL","magicBarL","ReplaceNativeGrimoire","launch","ReplaceNativeGrimoireLaunch","CacheDragonCost","dragonLevels","buy","objectMatch","replaceAll","cost","ConfigGroups","Favourite","Calculation","Notation","Colours","BarsDisplay","Tooltip","Statistics","Miscellaneous","ConfigGroupsNotification","NotificationGeneral","NotificationGC","NotificationFC","NotificationSea","NotificationGard","NotificationMagi","NotificationWrink","NotificationWrinkMax","ToggleOnOff","checkNotificationPromise","requestPermission","then","RefreshScale","BeautifyAll","RefreshStore","RebuildUpgrades","ToggleBotBar","DetailedTime","UpgradeBarFixedPos","DragonAuraInfo","GCTimer","HideSectionsButtons","TooltipAscendButton","MissingUpgrades","MissingAchievements","HeavenlyChipsTarget","ShowMissedGC","GCNotification","GCFlash","ColourGCFlash","GCSound","GCVolume","GCSoundURL","FortuneNotification","FortuneFlash","ColourFortuneFlash","FortuneSound","FortuneVolume","FortuneSoundURL","SeaNotification","SeaFlash","ColourSeaFlash","SeaSound","SeaVolume","SeaSoundURL","GardFlash","ColourGardFlash","GardSound","GardVolume","GardSoundURL","MagicNotification","MagicFlash","ColourMagicFlash","MagicSound","MagicVolume","MagicSoundURL","WrinklerNotification","WrinklerFlash","ColourWrinklerFlash","WrinklerSound","WrinklerVolume","WrinklerSoundURL","WrinklerMaxNotification","WrinklerMaxFlash","ColourWrinklerMaxFlash","WrinklerMaxSound","WrinklerMaxVolume","WrinklerMaxSoundURL","BulkBuyBlock","UpdateColours","createMenuOptions","menuDiv","subGroup","subGroupObject","CountSevens","number","String","CalculateSevenDelta","digitPlace","modulus","StatsHeader","config","fontFamily","ToggleHeader","StatsListing","listingName","StatsMissDispListing","current","StatsMissDisp","theMissDisp","frag","createDocumentFragment","missing","AddMenuStats","stats","Lucky","goldCookTooltip","luckyColour","luckyTime","luckyReqFrag","luckyReqSpan","luckyReqSmall","luckyColourFrenzy","luckyTimeFrenzy","luckyReqFrenFrag","luckyReqFrenSpan","luckyReqFrenSmall","luckySplit","luckyRewardMaxSpan","luckyRewardFrenzyMaxSpan","luckyCurBase","luckyCurSpan","Chain","chainColour","chainTime","chainReqFrag","chainReqSpan","chainReqSmall","chainWrathColour","chainWrathTime","chainWrathReqFrag","chainWrathReqSpan","chainWrathReqSmall","chainColourFrenzy","chainTimeFrenzy","chainReqFrenFrag","chainReqFrenSpan","chainReqFrenSmall","chainWrathColourFrenzy","chainWrathTimeFrenzy","chainWrathReqFrenFrag","chainWrathReqFrenSpan","chainWrathReqFrenSmall","chainCurMax","chainCur","chainCurWrath","Spells","conjureColour","conjureTime","conjureReqFrag","conjureReqSpan","conjureReqSmall","conjureFrenzyColour","conjureFrenzyCur","conjureFrenzyTime","conjureFrenzyReqFrag","conjureFrenzyReqSpan","conjureFrenzyReqSmall","Garden","bakeberryColour","bakeberryFrag","chocorootColour","chocorootFrag","queenbeetColour","queenbeetFrag","duketaterColour","duketaterFrag","missingPlantDrops","Prestige","possiblePresMax","neededCook","HowManyCookiesReset","cookiesNextFrag","cookiesNextSmall","heavenlyChips","HCTarget","CookiesTillTarget","resetBonus","newHeavenlyChips","curCPS","ResetCPS","ResetBonus","resetFrag","resetSmall","currentPrestige","willHave","willGet","luckyDigit","luckyNumber","luckyPayout","currentLevel","sevenCount","numberOfDigits","localLevel","CalculateLuckyLevels","luckyDigitDelta","luckyDigitReset","fragLuckyDigit","luckyNumberDelta","luckyNumberReset","fragLuckyNumber","luckyPayoutDelta","luckyPayoutReset","fragLuckyPayout","Wrink","popAllFrag","popAllA","popFattestFrag","popFattestA","specDisp","missingHalloweenCookies","missingChristmasCookies","missingValentineCookies","missingNormalEggs","eggDrops","missingRareEggs","rareEggDrops","centEgg","Sea","failRateHalloween","dropRateMult","obtainedCookiesChance","failRateChristmas","dropRateEgg","StartingFailRate","failRateEgg","succesRateEgg","obtainedEggs","obtainedRareEggs","pNormal1","pRare1","pRedrop","Achievs","Misc","missedGoldenClicks","menuSection","prestigeUpgradesMissing","titlefrag","PrestigeUpgrades","normalUpgradesMissing","tech","nextSibling","cookieUpgradesMissing","cookie","achievs","parentElement","achievsCrate","AchievementsById","mouseDown","setOnCrate","tags","neuromancy","sesame","descFunc","tagsStr","CrateTooltipLockedAchievements","AddMissingAchievements","FixMouseY","timerBarHeight","mouseY","ReplaceNative","drawMod","from","update","updateMod","warnOffset","tta","tt","UpdateTooltipLocation","UpdateWrinklers","UpdateSpecial","ClickCookie","ClickProduct","DescribeDragonAura","aura","bonusCPS","priceOfChange","highestBuilding","CalculateChangeAura","timeToRecover","bonusCPSPercentage","div2","AddAuraInfo","ToggleSpecialMenu","on","shouldHide","AddDragonLevelUpTooltip","AddMenu","detail","Logic","titleGC","titleFC","titleSP","addFC","addSP","life","lastIndexOf","spawn","UpdateTitle","cookiesToNext","ReplaceAscendTooltip","InitializeCookieMonster","head","borderTop","textShadow","table","tbody","firstCol","td","CreateBotBar","CMTimerBarAutosave","CMTimerBarGC","CMTimerBarRen","TimerBarBuffTimers","CreateTimerBar","UpgradeBar","legend","legendLine","CreateUpgradeBarLegend","upgradeNumber","CreateUpgradeBar","CreateSectionHideButtons","getElementsByTagName","CreateFavicon","CreateSimpleTooltip","append","CreateWrinklerButtons","productButtons","button","lockedMinigames","toggleBuildingLock","canLumps","child","coords","ReplaceTooltipMarket","ReplaceTooltipPantheon","popups","Popup","Notify","Win","CalculateChangeGod","CurrentSlot","godsById","CMLoopHook","AscendTimer","CachePantheonGods","sellTotal","marketGoods","goods","goodsVal","marketGood","cookiesPsRawHighest","buildingsToSacrifice","SellBuildingsForChoEgg","CacheSellAllForChoEgg","hasBuildAura","godMult","CacheCurrWrinklerCPS","LoopCache","TickerEffect","shimmers","spawnLead","nextStep","CheckMagicMeter","CurrentWrinklers","getWrinklersMax","CheckWrinklerCount","pop","webkitFilter","CreateGCTimer","transform","buildingIndex","version","CM","proceed","confirm","Steam"],"sourceRoot":""} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c4d9b526..1bdb36ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4799,8 +4799,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "requires": {} + "dev": true }, "@webpack-cli/info": { "version": "1.5.0", @@ -4815,8 +4814,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "requires": {} + "dev": true }, "@xtuc/ieee754": { "version": "1.2.0", @@ -4840,8 +4838,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "ajv": { "version": "6.12.6", @@ -4859,8 +4856,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "ansi-colors": { "version": "4.1.1", @@ -5492,8 +5488,7 @@ "version": "8.8.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", - "dev": true, - "requires": {} + "dev": true }, "eslint-import-resolver-node": { "version": "0.3.7", @@ -7455,8 +7450,7 @@ "version": "1.7.6", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz", "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==", - "dev": true, - "requires": {} + "dev": true } } }, diff --git a/src/Data/settings.js b/src/Data/settings.js index d359b926..423e7205 100644 --- a/src/Data/settings.js +++ b/src/Data/settings.js @@ -549,6 +549,14 @@ const settings = { 'Shows a tooltip for plants that have a cookie reward.', true, ), + TooltipStocks: new settingClasses.SettingStandard( + 1, + 'bool', + 'Tooltip', + ['Stock market tooltips OFF', 'Stock market tooltips ON'], + 'Shows additional info in the stock market tooltips.', + true, + ), TooltipPantheon: new settingClasses.SettingStandard( 1, 'bool', diff --git a/src/Disp/HelperFunctions/CalculateStockNextExpectedValue.js b/src/Disp/HelperFunctions/CalculateStockNextExpectedValue.js new file mode 100644 index 00000000..bd6a188c --- /dev/null +++ b/src/Disp/HelperFunctions/CalculateStockNextExpectedValue.js @@ -0,0 +1,52 @@ +/** + * This function calculates a stock's next expected value + * @param {number} value The stock's current value + * @param {number} delta The stock's current delta + * @param {number} restingValue The stock's resting value + * @param {number} mode The stock's current mode + * @param {number} bankLevel The bank building level + * @param {number} dragonBoost The current aura multiplier from Supreme Intellect and Reality Bending + * @returns {number} value + delta The stock's next expected value + */ +export default function CalculateStockNextExpectedValue( + pValue, + pDelta, + restingValue, + mode, + bankLevel, + dragonBoost, +) { + let value = pValue; + let delta = pDelta; + delta *= 0.97 + 0.01 * dragonBoost; + switch (mode) { + case 0: + delta *= 0.95; + break; + case 1: + delta *= 0.99; + delta += 0.02; + break; + case 2: + delta *= 0.99; + delta -= 0.02; + break; + case 3: + delta += 0.06; + value += 2.5; + break; + case 4: + delta -= 0.06; + value -= 2.5; + break; + default: + break; + } + value += (restingValue - value) * 0.01; + if (mode === 3) value -= 0.582; + if (mode === 4) value += 0.6; + if (value > 100 + (bankLevel - 1) * 3 && delta > 0) delta *= 0.9; + if (value < 5) value += (5 - value) * 0.5; + if (value < 5 && delta < 0) delta *= 0.95; + return Math.max(value + delta, 1); +} diff --git a/src/Disp/Tooltips/Tooltip.js b/src/Disp/Tooltips/Tooltip.js index e5510369..e4b404ec 100644 --- a/src/Disp/Tooltips/Tooltip.js +++ b/src/Disp/Tooltips/Tooltip.js @@ -98,6 +98,8 @@ export function CreateTooltip(type, name) { l('tooltip').innerHTML = Game.ObjectsById[2].minigame.tileTooltip(name[0], name[1])(); // Harvest all button in garden else if (type === 'ha') l('tooltip').innerHTML = Game.ObjectsById[2].minigame.toolTooltip(1)(); + // Stock market + else if (type === 'sm') l('tooltip').innerHTML = Game.Objects.Bank.minigame.goodTooltip(name)(); else if (type === 'wb') l('tooltip').innerHTML = ''; else if (type === 'pag') l('tooltip').innerHTML = Game.Objects.Temple.minigame.godTooltip(name)(); else if (type === 'pas') @@ -111,6 +113,7 @@ export function CreateTooltip(type, name) { type === 'g' || (type === 'p' && !Game.keys[16]) || type === 'ha' || + type === 'sm' || type === 'wb' || type === 'pag' || (type === 'pas' && name[1] !== -1) diff --git a/src/Disp/Tooltips/TypesOfTooltips/StockMarket.js b/src/Disp/Tooltips/TypesOfTooltips/StockMarket.js new file mode 100644 index 00000000..92630b8b --- /dev/null +++ b/src/Disp/Tooltips/TypesOfTooltips/StockMarket.js @@ -0,0 +1,72 @@ +import Beautify from '../../BeautifyAndFormatting/Beautify'; +import { + TooltipName, + ColourTextPre, + ColourGreen, + ColourYellow, + ColourOrange, + ColourRed, + ColourPurple, + ColourGray, +} from '../../VariablesAndData'; +import CalculateStockNextExpectedValue from '../../HelperFunctions/CalculateStockNextExpectedValue'; +import * as Create from '../CreateTooltip'; + +/** + * This function adds extra info to the stock market + * It adds to the additional information to l('CMTooltipArea') + */ +export default function StockMarket() { + const { minigame } = Game.Objects.Bank; + if (Game.mods.cookieMonsterFramework.saveData.cookieMonsterMod.settings.TooltipStocks) { + const tooltipBox = l('CMTooltipBorder'); + const stock = minigame.goodsById[TooltipName]; + + // Current stock mode + tooltipBox.appendChild(Create.TooltipCreateHeader('Current Mode')); + const stockMode = document.createElement('div'); + stockMode.id = 'CMTooltipMode'; + tooltipBox.appendChild(stockMode); + const modeIndex = stock.mode; + const modes = ['Stable', 'Slow Rise', 'Slow Fall', 'Fast Rise', 'Fast Fall', 'Chaotic']; + stockMode.textContent = modes[modeIndex]; + const colours = [ColourGray, ColourYellow, ColourOrange, ColourGreen, ColourRed, ColourPurple]; + stockMode.className = ColourTextPre + colours[modeIndex]; + + // Current stock delta value + tooltipBox.appendChild(Create.TooltipCreateHeader('Delta')); + const delta = document.createElement('div'); + delta.id = 'CMTooltipDelta'; + tooltipBox.appendChild(delta); + delta.textContent = Beautify(stock.d); + const deltaColour = stock.d < 0 ? ColourRed : ColourGreen; + delta.className = ColourTextPre + deltaColour; + + // Stock resting value + tooltipBox.appendChild(Create.TooltipCreateHeader('Resting Value')); + const restingValue = document.createElement('div'); + restingValue.id = 'CMTooltipRestingValue'; + tooltipBox.appendChild(restingValue); + restingValue.textContent = `$${Beautify(minigame.getRestingVal(stock.id))}`; + restingValue.style.color = 'white'; + + // Next expected value + tooltipBox.appendChild(Create.TooltipCreateHeader('Expected Next Value')); + const expectedNextValue = document.createElement('div'); + expectedNextValue.id = 'CMTooltipExpectedValue'; + tooltipBox.appendChild(expectedNextValue); + const expectedValue = CalculateStockNextExpectedValue( + stock.val, + stock.d, + minigame.getRestingVal(stock.id), + stock.mode, + Game.Objects.Bank.level, + Game.auraMult('Supreme Intellect'), + ); + expectedNextValue.textContent = `$${Beautify(expectedValue) + (expectedValue < stock.val ? '\u25bc' : '\u25b2')}`; + const expectedNextValueColour = expectedValue < stock.val ? ColourRed : ColourGreen; + expectedNextValue.className = ColourTextPre + expectedNextValueColour; + + l('CMTooltipArea').appendChild(tooltipBox); + } else l('CMTooltipArea').style.display = 'none'; +} diff --git a/src/Disp/Tooltips/UpdateTooltips.js b/src/Disp/Tooltips/UpdateTooltips.js index a1d7c412..d851dde5 100644 --- a/src/Disp/Tooltips/UpdateTooltips.js +++ b/src/Disp/Tooltips/UpdateTooltips.js @@ -3,6 +3,7 @@ import { TooltipName, TooltipType } from '../VariablesAndData'; import * as Create from './CreateTooltip'; import Building from './TypesOfTooltips/Building'; import GardenPlots from './TypesOfTooltips/GardenPlots'; +import StockMarket from './TypesOfTooltips/StockMarket'; import Grimoire from './TypesOfTooltips/Grimoire'; import HarvestAll from './TypesOfTooltips/HarvestAll'; import PantheonGods from './TypesOfTooltips/PantheonGods'; @@ -33,6 +34,8 @@ export default function UpdateTooltips() { GardenPlots(); } else if (TooltipType === 'ha') { HarvestAll(); + } else if (TooltipType === 'sm') { + StockMarket(); } else if (TooltipType === 'wb') { WrinklerButton(); } else if (TooltipType === 'pag' || (TooltipType === 'pas' && TooltipName[1] !== -1)) { diff --git a/src/Main/ReplaceGameElements/Tooltips.js b/src/Main/ReplaceGameElements/Tooltips.js index d35e6616..bd606a70 100644 --- a/src/Main/ReplaceGameElements/Tooltips.js +++ b/src/Main/ReplaceGameElements/Tooltips.js @@ -58,6 +58,21 @@ function ReplaceTooltipGarden() { } } +/** + * This function replaces the original .onmouseover functions of all stocks + */ +function ReplaceTooltipMarket() { + if (Game.Objects.Bank.minigameLoaded) { + for (let i = 0; i < Game.Objects.Bank.minigame.goodsById.length; i++) { + l(`bankGood-${i}`).firstChild.onmouseover = function () { + Game.tooltip.dynamic = 1; + Game.tooltip.draw(this, () => CreateTooltip('sm', i), 'this'); + Game.tooltip.wobble(); + }; + } + } +} + function ReplaceTooltipPantheon() { if (Game.Objects.Temple.minigameLoaded) { for (let i = 0; i < 11; i += 1) { @@ -96,6 +111,7 @@ export default function ReplaceTooltips() { LoadMinigames(); ReplaceTooltipGarden(); ReplaceTooltipGrimoire(); + ReplaceTooltipMarket(); ReplaceTooltipPantheon(); ReplaceNativeGrimoire(); };