PageSourceSearch

https://hillel.dev/category/javascript/

html hillel.dev collected 2026-10-02 05:17:02 UTC 147,149 bytes, 1,615 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en" class="no-js">
3<head>
4	<meta charset="UTF-8">
5	<meta name="viewport" content="width=device-width, initial-scale=1.0">
6	<link rel="profile" href="https://gmpg.org/xfn/11">
7	<link rel="pingback" href="https://hillel.dev/xmlrpc.php">
8	
8<script>(function(html){html.className = html.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script>
8
9<title>JavaScript &#8211; Hillel Coren</title>
10<meta name='robots' content='max-image-preview:large' />
11
12<!-- Async WordPress.com Remote Login -->
13<script id="wpcom_remote_login_js">
14var wpcom_remote_login_extra_auth = '';
15function wpcom_remote_login_remove_dom_node_id( element_id ) {
16	var dom_node = document.getElementById( element_id );
17	if ( dom_node ) { dom_node.parentNode.removeChild( dom_node ); }
18}
19function wpcom_remote_login_remove_dom_node_classes( class_name ) {
20	var dom_nodes = document.querySelectorAll( '.' + class_name );
21	for ( var i = 0; i < dom_nodes.length; i++ ) {
22		dom_nodes[ i ].parentNode.removeChild( dom_nodes[ i ] );
23	}
24}
25function wpcom_remote_login_final_cleanup() {
26	wpcom_remote_login_remove_dom_node_classes( "wpcom_remote_login_msg" );
27	wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_key" );
28	wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_validate" );
29	wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_js" );
30	wpcom_remote_login_remove_dom_node_id( "wpcom_request_access_iframe" );
31	wpcom_remote_login_remove_dom_node_id( "wpcom_request_access_styles" );
32}
33
34// Watch for messages back from the remote login
35window.addEventListener( "message", function( e ) {
36	if ( e.origin === "https://r-login.wordpress.com" ) {
37		var data = {};
38		try {
39			data = JSON.parse( e.data );
40		} catch( e ) {
41			wpcom_remote_login_final_cleanup();
42			return;
43		}
44
45		if ( data.msg === 'LOGIN' ) {
46			// Clean up the login check iframe
47			wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_key" );
48
49			var id_regex = new RegExp( /^[0-9]+$/ );
50			var token_regex = new RegExp( /^.*|.*|.*$/ );
51			if (
52				token_regex.test( data.token )
53				&& id_regex.test( data.wpcomid )
54			) {
55				// We have everything we need to ask for a login
56				var script = document.createElement( "script" );
57				script.setAttribute( "id", "wpcom_remote_login_validate" );
58				script.src = '/remote-login.php?wpcom_remote_login=validate'
59					+ '&wpcomid=' + data.wpcomid
60					+ '&token=' + encodeURIComponent( data.token )
61					+ '&host=' + window.location.protocol
62					+ '//' + window.location.hostname
63					+ '&postid=2274'
64					+ '&is_singular=';
65				document.body.appendChild( script );
66			}
67
68			return;
69		}
70
71		// Safari ITP, not logged in, so redirect
72		if ( data.msg === 'LOGIN-REDIRECT' ) {
73			window.location = 'https://wordpress.com/log-in?redirect_to=' + window.location.href;
74			return;
75		}
76
77		// Safari ITP, storage access failed, remove the request
78		if ( data.msg === 'LOGIN-REMOVE' ) {
79			var css_zap = 'html { -webkit-transition: margin-top 1s; transition: margin-top 1s; } /* 9001 */ html { margin-top: 0 !important; } * html body { margin-top: 0 !important; } @media screen and ( max-width: 782px ) { html { margin-top: 0 !important; } * html body { margin-top: 0 !important; } }';
80			var style_zap = document.createElement( 'style' );
81			style_zap.type = 'text/css';
82			style_zap.appendChild( document.createTextNode( css_zap ) );
83			document.body.appendChild( style_zap );
84
85			var e = document.getElementById( 'wpcom_request_access_iframe' );
86			e.parentNode.removeChild( e );
87
88			document.cookie = 'wordpress_com_login_access=denied; path=/; max-age=31536000';
89
90			return;
91		}
92
93		// Safari ITP
94		if ( data.msg === 'REQUEST_ACCESS' ) {
95			console.log( 'request access: safari' );
96
97			// Check ITP iframe enable/disable knob
98			if ( wpcom_remote_login_extra_auth !== 'safari_itp_iframe' ) {
99				return;
100			}
101
102			// If we are in a "private window" there is no ITP.
103			var private_window = false;
104			try {
105				var opendb = window.openDatabase( null, null, null, null );
106			} catch( e ) {
107				private_window = true;
108			}
109
110			if ( private_window ) {
111				console.log( 'private window' );
112				return;
113			}
114
115			var iframe = document.createElement( 'iframe' );
116			iframe.id = 'wpcom_request_access_iframe';
117			iframe.setAttribute( 'scrolling', 'no' );
118			iframe.setAttribute( 'sandbox', 'allow-storage-access-by-user-activation allow-scripts allow-same-origin allow-top-navigation-by-user-activation' );
119			iframe.src = 'https://r-login.wordpress.com/remote-login.php?wpcom_remote_login=request_access&origin=' + encodeURIComponent( data.origin ) + '&wpcomid=' + encodeURIComponent( data.wpcomid );
120
121			var css = 'html { -webkit-transition: margin-top 1s; transition: margin-top 1s; } /* 9001 */ html { margin-top: 46px !important; } * html body { margin-top: 46px !important; } @media screen and ( max-width: 660px ) { html { margin-top: 71px !important; } * html body { margin-top: 71px !important; } #wpcom_request_access_iframe { display: block; height: 71px !important; } } #wpcom_request_access_iframe { border: 0px; height: 46px; position: fixed; top: 0; left: 0; width: 100%; min-width: 100%; z-index: 99999; background: #23282d; } ';
122
123			var style = document.createElement( 'style' );
124			style.type = 'text/css';
125			style.id = 'wpcom_request_access_styles';
126			style.appendChild( document.createTextNode( css ) );
127			document.body.appendChild( style );
128
129			document.body.appendChild( iframe );
130		}
131
132		if ( data.msg === 'DONE' ) {
133			wpcom_remote_login_final_cleanup();
134		}
135	}
136}, false );
137
138// Inject the remote login iframe after the page has had a chance to load
139// more critical resources
140window.addEventListener( "DOMContentLoaded", function( e ) {
141	var iframe = document.createElement( "iframe" );
142	iframe.style.display = "none";
143	iframe.setAttribute( "scrolling", "no" );
144	iframe.setAttribute( "id", "wpcom_remote_login_key" );
145	iframe.src = "https://r-login.wordpress.com/remote-login.php"
146		+ "?wpcom_remote_login=key"
147		+ "&origin=aHR0cHM6Ly9oaWxsZWwuZGV2"
148		+ "&wpcomid=4721641"
149		+ "&time=" + Math.floor( Date.now() / 1000 );
150	document.body.appendChild( iframe );
151}, false );
152</script>
152
153<link rel='dns-prefetch' href='//s1.wp.com' />
154<link rel='dns-prefetch' href='//s2.wp.com' />
155<link rel='dns-prefetch' href='//s0.wp.com' />
156<link rel='dns-prefetch' href='//af.pubmine.com' />
157<link rel="alternate" type="application/rss+xml" title="Hillel Coren &raquo; Feed" href="https://hillel.dev/feed/" />
158<link rel="alternate" type="application/rss+xml" title="Hillel Coren &raquo; Comments Feed" href="https://hillel.dev/comments/feed/" />
159<link rel="alternate" type="application/rss+xml" title="Hillel Coren &raquo; JavaScript Category Feed" href="https://hillel.dev/category/javascript/feed/" />
160	
160<script type="text/javascript">
161		/* <![CDATA[ */
162		function addLoadEvent(func) {
163			var oldonload = window.onload;
164			if (typeof window.onload != 'function') {
165				window.onload = func;
166			} else {
167				window.onload = function () {
168					oldonload();
169					func();
170				}
171			}
172		}
173		/* ]]> */
174	</script>
174
175	<style id="wp-img-auto-sizes-contain-inline-css">
176img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
177/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
178</style>
179<link crossorigin='anonymous' rel='stylesheet' id='all-css-2-1' href='/_static/??-eJx9jtsKwjAQRH/IuHipxQfxW0I6rWk2F9gNoX9vFMEX8fEwM4ehVozLSZGUYjWF6+KT0Aot1oUPk9REMU+VIaQPRBjNmYVcjsUqaevzbfazAmnvRHb0W9v8tECFUHuag4dh20gRC1vtbtGN8U/APuD77k2v+j3eDuNwOo7Xy3lYn9xFT2Y=&cssminify=yes' type='text/css' media='all' />
180<style id="wp-emoji-styles-inline-css">
181
182	img.wp-smiley, img.emoji {
183		display: inline !important;
184		border: none !important;
185		box-shadow: none !important;
186		height: 1em !important;
187		width: 1em !important;
188		margin: 0 0.07em !important;
189		vertical-align: -0.1em !important;
190		background: none !important;
191		padding: 0 !important;
192	}
193/*# sourceURL=wp-emoji-styles-inline-css */
194</style>
195<style id="wp-block-library-inline-css">
196:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;
196--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style^=border-color],[style*=";border-color"],[style*="; border-color"]){border-style:solid}html :where([style^=border-top-color],[style*=";border-top-color"],[style*="; border-top-color"]){border-top-style:solid}html :where([style^=border-right-color],[style*=";border-right-color"],[style*="; border-right-color"]){border-right-style:solid}html :where([style^=border-bottom-color],[style*=";border-bottom-color"],[style*="; border-bottom-color"]){border-bottom-style:solid}html :where([style^=border-left-color],[style*=";border-left-color"],[style*="; border-left-color"]){border-left-style:solid}html :where([style^=border-width],[style*=";border-width"],[style*="; border-width"]){border-style:solid}html :where([style^=border-top-width],[style*=";border-top-width"],[style*="; border-top-width"]){border-top-style:solid}html :where([style^=border-right-width],[style*=";border-right-width"],[style*="; border-right-width"]){border-right-style:solid}html :where([style^=border-bottom-width],[style*=";border-bottom-width"],[style*="; border-bottom-width"]){border-bottom-style:solid}html :where([style^=border-left-width],[style*=";border-left-width"],[style*="; border-left-width"]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}
197
198/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/common.min.css */
199</style>
200<style id="wp-block-embed-inline-css">
201.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{max-width:360px;width:100%}.wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{min-width:280px}.wp-block-cover .wp-block-embed{min-height:240px;min-width:320px}.wp-block-group.is-layout-flex .wp-block-embed{flex:1 1 0%;min-width:0}.wp-block-embed{overflow-wrap:break-word}.wp-block-embed :where(figcaption){margin-bottom:1em;margin-top:.5em}.wp-block-embed iframe{max-width:100%}.wp-block-embed__wrapper{position:relative}.wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{content:"";display:block;padding-top:50%}.wp-embed-responsive .wp-has-aspect-ratio iframe{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{padding-top:42.85%}.wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{padding-top:50%}.wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{padding-top:56.25%}.wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{padding-top:75%}.wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{padding-top:100%}.wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{padding-top:177.77%}.wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{padding-top:200%}
202/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/embed/style.min.css */
203</style>
204<style id="wp-block-embed-theme-inline-css">
205.wp-block-embed :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed :where(figcaption){color:hsla(0,0%,100%,.65)}.wp-block-embed{margin:0 0 1em}
206/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/embed/theme.min.css */
207</style>
208<style id="wp-block-quote-inline-css">
209.wp-block-quote{box-sizing:border-box;overflow-wrap:break-word}
209.wp-block-quote.is-large:where(:not(.is-style-plain)),.wp-block-quote.is-style-large:where(:not(.is-style-plain)){margin-bottom:1em;padding:0 1em}.wp-block-quote.is-large:where(:not(.is-style-plain)) p,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) p{font-size:1.5em;font-style:italic;line-height:1.6}.wp-block-quote.is-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-large:where(:not(.is-style-plain)) footer,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) footer{font-size:1.125em;text-align:right}.wp-block-quote>cite{display:block}
210/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/quote/style.min.css */
211</style>
212<style id="wp-block-quote-theme-inline-css">
213.wp-block-quote{border-left:.25em solid;margin:0 0 1.75em;padding-left:1em}.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;font-style:normal;position:relative}.wp-block-quote:where(.has-text-align-right){border-left:none;border-right:.25em solid;padding-left:0;padding-right:1em}.wp-block-quote:where(.has-text-align-center){border:none;padding-left:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote:where(.is-style-plain){border:none}
214/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/quote/theme.min.css */
215</style>
216<style id="wp-block-heading-inline-css">
217h1:where(.wp-block-heading).has-background,h2:where(.wp-block-heading).has-background,h3:where(.wp-block-heading).has-background,h4:where(.wp-block-heading).has-background,h5:where(.wp-block-heading).has-background,h6:where(.wp-block-heading).has-background{padding:var(--wp--style--block-background-padding,1.25em 2.375em)}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg}
218/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/heading/style.min.css */
219</style>
220<style id="wp-block-image-inline-css">
221.wp-block-image>a,.wp-block-image>figure>a{display:inline-block}.wp-block-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom}@media not (prefers-reduced-motion){.wp-block-image img.hide{visibility:hidden}.wp-block-image img.show{animation:show-content-image .4s}}.wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{border-radius:inherit}.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-image.aligncenter{text-align:center}.wp-block-image.alignfull>a,.wp-block-image.alignwide>a{width:100%}.wp-block-image.alignfull img,.wp-block-image.alignwide img{height:auto;width:100%}.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{display:table}.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{caption-side:bottom;display:table-caption}.wp-block-image .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-image .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-image .aligncenter{margin-left:auto;margin-right:auto}.wp-block-image :where(figcaption){margin-bottom:1em;margin-top:.5em}.wp-block-image.is-style-circle-mask img{border-radius:9999px}@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){.wp-block-image.is-style-circle-mask img{border-radius:0;-webkit-mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-mode:alpha;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}}:root :where(.wp-block-image.is-style-rounded img,.wp-block-image .is-style-rounded img){border-radius:9999px}.wp-block-image figure{margin:0}.wp-lightbox-container{display:flex;flex-direction:column;position:relative}.wp-lightbox-container img{cursor:zoom-in}.wp-lightbox-container img:hover+button{opacity:1}.wp-lightbox-container button{align-items:center;backdrop-filter:blur(16px) saturate(180%);background-color:rgba(90,90,90,.25);border:none;border-radius:4px;cursor:zoom-in;display:flex;height:20px;justify-content:center;opacity:0;padding:0;position:absolute;right:16px;text-align:center;top:16px;width:20px;z-index:100}@media not (prefers-reduced-motion){.wp-lightbox-container button{transition:opacity .2s ease}}.wp-lightbox-container button:focus-visible{outline:3px auto rgba(90,90,90,.25);outline:3px auto -webkit-focus-ring-color;outline-offset:3px}.wp-lightbox-container button:hover{cursor:pointer;opacity:1}.wp-lightbox-container button:focus{opacity:1}.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){background-color:rgba(90,90,90,.25);border:none}.wp-lightbox-overlay{box-sizing:border-box;
221cursor:zoom-out;height:100vh;left:0;overflow:hidden;position:fixed;top:0;visibility:hidden;width:100%;z-index:100000}.wp-lightbox-overlay .wp-lightbox-close-button{align-items:center;cursor:pointer;display:flex;font-family:inherit;gap:8px;justify-content:center;line-height:1;min-height:40px;min-width:40px;padding:0 4px;position:absolute;right:calc(env(safe-area-inset-right) + 16px);top:calc(env(safe-area-inset-top) + 16px);z-index:5000000}.wp-lightbox-overlay .wp-lightbox-close-button:focus,.wp-lightbox-overlay .wp-lightbox-close-button:hover,.wp-lightbox-overlay .wp-lightbox-close-button:not(:hover):not(:active):not(.has-background){background:none;border:none}.wp-lightbox-overlay .wp-lightbox-close-button:has(.wp-lightbox-close-text:not([hidden])) .wp-lightbox-close-icon svg{height:1em;width:1em}.wp-lightbox-overlay .wp-lightbox-close-icon svg{display:block}.wp-lightbox-overlay .wp-lightbox-navigation-button-next,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev{align-items:center;bottom:16px;cursor:pointer;display:flex;font-family:inherit;gap:4px;justify-content:center;line-height:1;min-height:40px;min-width:40px;padding:0 8px;position:absolute;z-index:2000002}.wp-lightbox-overlay .wp-lightbox-navigation-button-next[hidden],.wp-lightbox-overlay .wp-lightbox-navigation-button-prev[hidden]{display:none}@media (min-width:960px){.wp-lightbox-overlay .wp-lightbox-navigation-button-next,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev{bottom:50%;transform:translateY(-50%)}}.wp-lightbox-overlay .wp-lightbox-navigation-button-next:focus,.wp-lightbox-overlay .wp-lightbox-navigation-button-next:hover,.wp-lightbox-overlay .wp-lightbox-navigation-button-next:not(:hover):not(:active):not(.has-background),.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:focus,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:hover,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:not(:hover):not(:active):not(.has-background){background:none;border:none;padding:0 8px}.wp-lightbox-overlay .wp-lightbox-navigation-button-next:has(.wp-lightbox-navigation-text:not([hidden])) .wp-lightbox-navigation-icon svg,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:has(.wp-lightbox-navigation-text:not([hidden])) .wp-lightbox-navigation-icon svg{display:block;height:1.5em;width:1.5em}.wp-lightbox-overlay .wp-lightbox-navigation-button-prev{left:calc(env(safe-area-inset-left) + 16px)}.wp-lightbox-overlay .wp-lightbox-navigation-button-next{right:calc(env(safe-area-inset-right) + 16px)}.wp-lightbox-overlay .wp-lightbox-navigation-icon svg{vertical-align:middle}.wp-lightbox-overlay .lightbox-image-container{height:var(--wp--lightbox-container-height);left:50%;overflow:hidden;position:absolute;top:50%;transform:translate(-50%,-50%);transform-origin:top left;width:var(--wp--lightbox-container-width);z-index:2000001}.wp-lightbox-overlay .wp-block-image{align-items:center;box-sizing:border-box;display:flex;height:100%;justify-content:center;margin:0;position:relative;transform-origin:0 0;width:100%;z-index:3000000}.wp-lightbox-overlay .wp-block-image img{height:var(--wp--lightbox-image-height);min-height:var(--wp--lightbox-image-height);min-width:var(--wp--lightbox-image-width);width:var(--wp--lightbox-image-width)}.wp-lightbox-overlay .wp-block-image figcaption{display:none}.wp-lightbox-overlay button{background:none;border:none}.wp-lightbox-overlay .scrim{background-color:#fff;height:100%;opacity:.9;position:absolute;width:100%;z-index:2000000}.wp-lightbox-overlay.active{visibility:visible}@media not (prefers-reduced-motion){.wp-lightbox-overlay.active{animation:turn-on-visibility .25s both}.wp-lightbox-overlay.active img{animation:turn-on-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active){animation:turn-off-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active) img{animation:turn-off-visibility .25s both}.wp-lightbox-overlay.zoom.active{animation:none;opacity:1;visibility:visible}.wp-lightbox-overlay.zoom.active .lightbox-image-container{animation:lightbox-zoom-in .4s}.wp-lightbox-overlay.zoom.active .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.active .scrim{animation:turn-on-visibility .4s forwards}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active){animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container{animation:lightbox-zoom-out .4s}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .scrim{animation:turn-off-visibility .4s forwards}}
221@keyframes show-content-image{0%{visibility:hidden}99%{visibility:hidden}to{visibility:visible}}@keyframes turn-on-visibility{0%{opacity:0}to{opacity:1}}@keyframes turn-off-visibility{0%{opacity:1;visibility:visible}99%{opacity:0;visibility:visible}to{opacity:0;visibility:hidden}}@keyframes lightbox-zoom-in{0%{transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale))}to{transform:translate(-50%,-50%) scale(1)}}@keyframes lightbox-zoom-out{0%{transform:translate(-50%,-50%) scale(1);visibility:visible}99%{visibility:visible}to{transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));visibility:hidden}}
222/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/image/style.min.css */
223</style>
224<style id="wp-block-image-theme-inline-css">
225:root :where(.wp-block-image figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme :root :where(.wp-block-image figcaption){color:hsla(0,0%,100%,.65)}.wp-block-image{margin:0 0 1em}
226/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/image/theme.min.css */
227</style>
228<style id="wp-block-list-inline-css">
229ol,ul{box-sizing:border-box}:root :where(.wp-block-list.has-background){padding:var(--wp--style--block-background-padding,1.25em 2.375em)}
230/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/list/style.min.css */
231</style>
232<style id="wp-block-paragraph-inline-css">
233.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em .1em 0 0;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-left:.1em}p.has-drop-cap.has-background{overflow:hidden}:root :where(p.has-background){padding:var(--wp--style--block-background-padding,1.25em 2.375em)}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg}
234/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/paragraph/style.min.css */
235</style>
236<style id="wp-block-library-inline-css-extra">
237.has-text-align-justify {
238	text-align:justify;
239}
240.has-text-align-justify{text-align:justify;}
241/*# sourceURL=wp-block-library-inline-css */
242</style>
243
244<style id="classic-theme-styles-inline-css">
245.wp-block-button__link{background-color:#32373c;border-radius:9999px;box-shadow:none;color:#fff;font-size:1.125em;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-file__button{background:#32373c;color:#fff}.wp-block-accordion-heading{margin:0}.wp-block-accordion-heading__toggle{background-color:inherit!important;color:inherit!important}.wp-block-accordion-heading__toggle:not(:focus-visible){outline:none}.wp-block-accordion-heading__toggle:focus,.wp-block-accordion-heading__toggle:hover{background-color:inherit!important;border:none;box-shadow:none;color:inherit;padding:var(--wp--preset--spacing--20,1em) 0;text-decoration:none}.wp-block-accordion-heading__toggle:focus-visible{outline:auto;outline-offset:0}.wp-block-tab:not(.has-text-color){color:inherit!important}.wp-block-tab:not(.has-background){background-color:inherit!important}.wp-block-tab:focus,.wp-block-tab:hover{text-decoration:none}.wp-block-tab:focus-visible{outline:auto;outline-offset:0}
246/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/classic.min.css */
247</style>
248
249<style id="coblocks-inline-format-inline-css">
250.uppercase{text-transform:uppercase}
251/*# sourceURL=coblocks-inline-format-inline-css */
252</style>
253<link crossorigin='anonymous' rel='stylesheet' id='all-css-12-1' href='/_static/??-eJx9jEEOAiEQBD/kQECjeDC+ZWEnijIwYWA3/l72op689KFTVXplCCU3zE1z6reYRYfiUwlP0VYZpwxIJE4IFRd10HOU9iFA2iuhCiI7/ROiDt9WxfETT20jCOc4YUIa2D9t5eGA91xRBMZS7ATtPkTZvCtdzNEZt7f2fHq8Afl7R7w=&cssminify=yes' type='text/css' media='all' />
254<style id="global-styles-inline-css">
255:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #fff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--dark-gray: #111;--wp--preset--color--light-gray: #f1f1f1;--wp--preset--color--yellow: #f4ca16;--wp--preset--color--dark-brown: #352712;--wp--preset--color--medium-pink: #e53b51;--wp--preset--color--light-pink: #ffe5d1;--wp--preset--color--dark-purple: #2e2256;--wp--preset--color--purple: #674970;--wp--preset--color--blue-gray: #22313f;--wp--preset--color--bright-blue: #55c3dc;--wp--preset--color--light-blue: #e9f2f9;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,
2550) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--gradient--dark-gray-gradient-gradient: linear-gradient(90deg, rgba(17,17,17,1) 0%, rgba(42,42,42,1) 100%);--wp--preset--gradient--light-gray-gradient: linear-gradient(90deg, rgba(241,241,241,1) 0%, rgba(215,215,215,1) 100%);--wp--preset--gradient--white-gradient: linear-gradient(90deg, rgba(255,255,255,1) 0%, rgba(230,230,230,1) 100%);--wp--preset--gradient--yellow-gradient: linear-gradient(90deg, rgba(244,202,22,1) 0%, rgba(205,168,10,1) 100%);--wp--preset--gradient--dark-brown-gradient: linear-gradient(90deg, rgba(53,39,18,1) 0%, rgba(91,67,31,1) 100%);--wp--preset--gradient--medium-pink-gradient: linear-gradient(90deg, rgba(229,59,81,1) 0%, rgba(209,28,51,1) 100%);--wp--preset--gradient--light-pink-gradient: linear-gradient(90deg, rgba(255,229,209,1) 0%, rgba(255,200,158,1) 100%);--wp--preset--gradient--dark-purple-gradient: linear-gradient(90deg, rgba(46,34,86,1) 0%, rgba(66,48,123,1) 100%);--wp--preset--gradient--purple-gradient: linear-gradient(90deg, rgba(103,73,112,1) 0%, rgba(131,93,143,1) 100%);--wp--preset--gradient--blue-gray-gradient: linear-gradient(90deg, rgba(34,49,63,1) 0%, rgba(52,75,96,1) 100%);--wp--preset--gradient--bright-blue-gradient: linear-gradient(90deg, rgba(85,195,220,1) 0%, rgba(43,180,211,1) 100%);--wp--preset--gradient--light-blue-gradient: linear-gradient(90deg, rgba(233,242,249,1) 0%, rgba(193,218,238,1) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--font-family--albert-sans: 'Albert Sans', sans-serif;--wp--preset--font-family--alegreya: Alegreya, serif;--wp--preset--font-family--arvo: Arvo, serif;--wp--preset--font-family--bodoni-moda: 'Bodoni Moda', serif;--wp--preset--font-family--bricolage-grotesque: 'Bricolage Grotesque', sans-serif;--wp--preset--font-family--cabin: Cabin, sans-serif;--wp--preset--font-family--chivo: Chivo, sans-serif;--wp--preset--font-family--commissioner: Commissioner, sans-serif;--wp--preset--font-family--cormorant: Cormorant, serif;--wp--preset--font-family--courier-prime: 'Courier Prime', monospace;--wp--preset--font-family--crimson-pro: 'Crimson Pro', serif;--wp--preset--font-family--dm-mono: 'DM Mono', monospace;--wp--preset--font-family--dm-sans: 'DM Sans', sans-serif;--wp--preset--font-family--dm-serif-display: 'DM Serif Display', serif;--wp--preset--font-family--domine: Domine, serif;--wp--preset--font-family--eb-garamond: 'EB Garamond', serif;--wp--preset--font-family--epilogue: Epilogue, sans-serif;--wp--preset--font-family--fahkwang: Fahkwang, sans-serif;--wp--preset--font-family--figtree: Figtree, sans-serif;--wp--preset--font-family--fira-sans: 'Fira Sans', sans-serif;--wp--preset--font-family--fjalla-one: 'Fjalla One', sans-serif;--wp--preset--font-family--fraunces: Fraunces, serif;--wp--preset--font-family--gabarito: Gabarito, system-ui;--wp--preset--font-family--ibm-plex-mono: 'IBM Plex Mono', monospace;--wp--preset--font-family--ibm-plex-sans: 'IBM Plex Sans', sans-serif;--wp--preset--font-family--ibarra-real-nova: 'Ibarra Real Nova', serif;--wp--preset--font-family--instrument-serif: 'Instrument Serif', serif;--wp--preset--font-family--inter: Inter, sans-serif;--wp--preset--font-family--josefin-sans: 'Josefin Sans', sans-serif;--wp--preset--font-family--jost: Jost, sans-serif;--wp--preset--font-family--libre-baskerville: 'Libre Baskerville', serif;--wp--preset--font-family--libre-franklin: 'Libre Franklin', sans-serif;--wp--preset--font-family--literata: Literata, serif;--wp--preset--font-family--lora: Lora, serif;--wp--preset--font-family--merriweather: Merriweather, serif;--wp--preset--font-family--montserrat: Montserrat, sans-serif;--wp--preset--font-family--newsreader: Newsreader, serif;--wp--preset--font-family--noto-sans-mono: 'Noto Sans Mono', sans-serif;--wp--preset--font-family--nunito: Nunito, sans-serif;--wp--preset--font-family--open-sans: 'Open Sans', sans-serif;--wp--preset--font-family--overpass: Overpass, sans-serif;--wp--preset--font-family--pt-serif: 'PT Serif', serif;--wp--preset--font-family--petrona: Petrona, serif;--wp--preset--font-family--piazzolla: Piazzolla, serif;--wp--preset--font-family--playfair-display: 'Playfair Display', serif;--wp--preset--font-family--plus-jakarta-sans: 'Plus Jakarta Sans', sans-serif;--wp--preset--font-family--poppins: Poppins, sans-serif;--wp--preset--font-family--raleway: Raleway, sans-serif;--wp--preset--font-family--roboto: Roboto, sans-serif;--wp--preset--font-family--roboto-slab: 'Roboto Slab', serif;--wp--preset--font-family--rubik: Rubik, sans-serif;--wp--preset--font-family--rufina: Rufina, serif;--wp--preset--font-family--sora: Sora, sans-serif;--wp--preset--font-family--source-sans-3: 'Source Sans 3', sans-serif;--wp--preset--font-family--source-serif-4: 'Source Serif 4', serif;--wp--preset--font-family--space-mono: 'Space Mono', monospace;--wp--preset--font-family--syne: Syne, sans-serif;--wp--preset--font-family--texturina: Texturina, serif;--wp--preset--font-family--urbanist: Urbanist, sans-serif;--wp--preset--font-family--work-sans: 'Work Sans', sans-serif;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-dark-gray-color{color: var(--wp--preset--color--dark-gray) !important;}.has-light-gray-color{color: var(--wp--preset--color--light-gray) !important;}.has-yellow-color{color: var(--wp--preset--color--yellow) !important;}.has-dark-brown-color{color: var(--wp--preset--color--dark-brown) !important;}.has-medium-pink-color{color: var(--wp--preset--color--medium-pink) !important;}.has-light-pink-color{color: var(--wp--preset--color--light-pink) !important;}.has-dark-purple-color{color: var(--wp--preset--color--dark-purple) !important;}.has-purple-color{color: var(--wp--preset--color--purple) !important;}.has-blue-gray-color{color: var(--wp--preset--color--blue-gray) !important;}.has-bright-blue-color{color: var(--wp--preset--color--bright-blue) !important;}.has-light-blue-color{color: var(--wp--preset--color--light-blue) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-dark-gray-background-color{background-color: var(--wp--preset--color--dark-gray) !important;}.has-light-gray-background-color{background-color: var(--wp--preset--color--light-gray) !important;}.has-yellow-background-color{background-color: var(--wp--preset--color--yellow) !important;}.has-dark-brown-background-color{background-color: var(--wp--preset--color--dark-brown) !important;}.has-medium-pink-background-color{background-color: var(--wp--preset--color--medium-pink) !important;}.has-light-pink-background-color{background-color: var(--wp--preset--color--light-pink) !important;}.has-dark-purple-background-color{background-color: var(--wp--preset--color--dark-purple) !important;}.has-purple-background-color{background-color: var(--wp--preset--color--purple) !important;}.has-blue-gray-background-color{background-color: var(--wp--preset--color--blue-gray) !important;}.has-bright-blue-background-color{background-color: var(--wp--preset--color--bright-blue) !important;}.has-light-blue-background-color{background-color: var(--wp--preset--color--light-blue) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-dark-gray-border-color{border-color: var(--wp--preset--color--dark-gray) !important;}.has-light-gray-border-color{border-color: var(--wp--preset--color--light-gray) !important;}.has-yellow-border-color{border-color: var(--wp--preset--color--yellow) !important;}.has-dark-brown-border-color{border-color: var(--wp--preset--color--dark-brown) !important;}.has-medium-pink-border-color{border-color: var(--wp--preset--color--medium-pink) !important;}.has-light-pink-border-color{border-color: var(--wp--preset--color--light-pink) !important;}.has-dark-purple-border-color{border-color: var(--wp--preset--color--dark-purple) !important;}.has-purple-border-color{border-color: var(--wp--preset--color--purple) !important;}.has-blue-gray-border-color{border-color: var(--wp--preset--color--blue-gray) !important;}.has-bright-blue-border-color{border-color: var(--wp--preset--color--bright-blue) !important;}.has-light-blue-border-color{border-color: var(--wp--preset--color--light-blue) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
255.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-dark-gray-gradient-gradient-gradient-background{background: var(--wp--preset--gradient--dark-gray-gradient-gradient) !important;}.has-light-gray-gradient-gradient-background{background: var(--wp--preset--gradient--light-gray-gradient) !important;}.has-white-gradient-gradient-background{background: var(--wp--preset--gradient--white-gradient) !important;}.has-yellow-gradient-gradient-background{background: var(--wp--preset--gradient--yellow-gradient) !important;}.has-dark-brown-gradient-gradient-background{background: var(--wp--preset--gradient--dark-brown-gradient) !important;}.has-medium-pink-gradient-gradient-background{background: var(--wp--preset--gradient--medium-pink-gradient) !important;}.has-light-pink-gradient-gradient-background{background: var(--wp--preset--gradient--light-pink-gradient) !important;}.has-dark-purple-gradient-gradient-background{background: var(--wp--preset--gradient--dark-purple-gradient) !important;}.has-purple-gradient-gradient-background{background: var(--wp--preset--gradient--purple-gradient) !important;}.has-blue-gray-gradient-gradient-background{background: var(--wp--preset--gradient--blue-gray-gradient) !important;}.has-bright-blue-gradient-gradient-background{background: var(--wp--preset--gradient--bright-blue-gradient) !important;}.has-light-blue-gradient-gradient-background{background: var(--wp--preset--gradient--light-blue-gradient) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}.has-albert-sans-font-family{font-family: var(--wp--preset--font-family--albert-sans) !important;}.has-alegreya-font-family{font-family: var(--wp--preset--font-family--alegreya) !important;}.has-arvo-font-family{font-family: var(--wp--preset--font-family--arvo) !important;}.has-bodoni-moda-font-family{font-family: var(--wp--preset--font-family--bodoni-moda) !important;}.has-bricolage-grotesque-font-family{font-family: var(--wp--preset--font-family--bricolage-grotesque) !important;}.has-cabin-font-family{font-family: var(--wp--preset--font-family--cabin) !important;}.has-chivo-font-family{font-family: var(--wp--preset--font-family--chivo) !important;}.has-commissioner-font-family{font-family: var(--wp--preset--font-family--commissioner) !important;}.has-cormorant-font-family{font-family: var(--wp--preset--font-family--cormorant) !important;}.has-courier-prime-font-family{font-family: var(--wp--preset--font-family--courier-prime) !important;}.has-crimson-pro-font-family{font-family: var(--wp--preset--font-family--crimson-pro) !important;}.has-dm-mono-font-family{font-family: var(--wp--preset--font-family--dm-mono) !important;}.has-dm-sans-font-family{font-family: var(--wp--preset--font-family--dm-sans) !important;}.has-dm-serif-display-font-family{font-family: var(--wp--preset--font-family--dm-serif-display) !important;}.has-domine-font-family{font-family: var(--wp--preset--font-family--domine) !important;}.has-eb-garamond-font-family{font-family: var(--wp--preset--font-family--eb-garamond) !important;}.has-epilogue-font-family{font-family: var(--wp--preset--font-family--epilogue) !important;}.has-fahkwang-font-family{font-family: var(--wp--preset--font-family--fahkwang) !important;}.has-figtree-font-family{font-family: var(--wp--preset--font-family--figtree) !important;}.has-fira-sans-font-family{font-family: var(--wp--preset--font-family--fira-sans) !important;}.has-fjalla-one-font-family{font-family: var(--wp--preset--font-family--fjalla-one) !important;}.has-fraunces-font-family{font-family: var(--wp--preset--font-family--fraunces) !important;}.has-gabarito-font-family{font-family: var(--wp--preset--font-family--gabarito) !important;}.has-ibm-plex-mono-font-family{font-family: var(--wp--preset--font-family--ibm-plex-mono) !important;}.has-ibm-plex-sans-font-family{font-family: var(--wp--preset--font-family--ibm-plex-sans) !important;}.has-ibarra-real-nova-font-family{font-family: var(--wp--preset--font-family--ibarra-real-nova) !important;}.has-instrument-serif-font-family{font-family: var(--wp--preset--font-family--instrument-serif) !important;}.has-inter-font-family{font-family: var(--wp--preset--font-family--inter) !important;}.has-josefin-sans-font-family{font-family: var(--wp--preset--font-family--josefin-sans) !important;}.has-jost-font-family{font-family: var(--wp--preset--font-family--jost) !important;}.has-libre-baskerville-font-family{font-family: var(--wp--preset--font-family--libre-baskerville) !important;}.has-libre-franklin-font-family{font-family: var(--wp--preset--font-family--libre-franklin) !important;}.has-literata-font-family{font-family: var(--wp--preset--font-family--literata) !important;}.has-lora-font-family{font-family: var(--wp--preset--font-family--lora) !important;}.has-merriweather-font-family{font-family: var(--wp--preset--font-family--merriweather) !important;}.has-montserrat-font-family{font-family: var(--wp--preset--font-family--montserrat) !important;}.has-newsreader-font-family{font-family: var(--wp--preset--font-family--newsreader) !important;}.has-noto-sans-mono-font-family{font-family: var(--wp--preset--font-family--noto-sans-mono) !important;}.has-nunito-font-family{font-family: var(--wp--preset--font-family--nunito) !important;}.has-open-sans-font-family{font-family: var(--wp--preset--font-family--open-sans) !important;}.has-overpass-font-family{font-family: var(--wp--preset--font-family--overpass) !important;}.has-pt-serif-font-family{font-family: var(--wp--preset--font-family--pt-serif) !important;}.has-petrona-font-family{font-family: var(--wp--preset--font-family--petrona) !important;}.has-piazzolla-font-family{font-family: var(--wp--preset--font-family--piazzolla) !important;}.has-playfair-display-font-family{font-family: var(--wp--preset--font-family--playfair-display) !important;}.has-plus-jakarta-sans-font-family{font-family: var(--wp--preset--font-family--plus-jakarta-sans) !important;}.has-poppins-font-family{font-family: var(--wp--preset--font-family--poppins) !important;}.has-raleway-font-family{font-family: var(--wp--preset--font-family--raleway) !important;}.has-roboto-font-family{font-family: var(--wp--preset--font-family--roboto) !important;}.has-roboto-slab-font-family{font-family: var(--wp--preset--font-family--roboto-slab) !important;}.has-rubik-font-family{font-family: var(--wp--preset--font-family--rubik) !important;}.has-rufina-font-family{font-family: var(--wp--preset--font-family--rufina) !important;}.has-sora-font-family{font-family: var(--wp--preset--font-family--sora) !important;}.has-source-sans-3-font-family{font-family: var(--wp--preset--font-family--source-sans-3) !important;}.has-source-serif-4-font-family{font-family: var(--wp--preset--font-family--source-serif-4) !important;}.has-space-mono-font-family{font-family: var(--wp--preset--font-family--space-mono) !important;}.has-syne-font-family{font-family: var(--wp--preset--font-family--syne) !important;}.has-texturina-font-family{font-family: var(--wp--preset--font-family--texturina) !important;}.has-urbanist-font-family{font-family: var(--wp--preset--font-family--urbanist) !important;}.has-work-sans-font-family{font-family: var(--wp--preset--font-family--work-sans) !important;}
256/*# sourceURL=global-styles-inline-css */
257</style>
258
259<link crossorigin='anonymous' rel='stylesheet' id='all-css-14-1' href='/_static/??-eJyVj9sOgjAMhl/IWblQroyPYsbSzenoFlpCeHsLmKjxEL3r1/yHFoZiXCZBEpATtshQ+gZk0MXooxdEAsuMwuBVx0BZsmFLbErq2SyIXfQLR9I4zsmKXTvmFTwUtP2kCZEYzijFusuNgXuCo1ohIGnWFPF+fMn8eDTLmPB3uQqhSdld/qiYPHONGYrL7bd/O9TwoGOYXXf8ZgqYjZ5kJWZ6AuOTjd1kPbT7qq6r3abebrbnK/3Rr4Y=&cssminify=yes' type='text/css' media='all' />
260<style id="jetpack-global-styles-frontend-style-inline-css">
261:root { --font-headings: unset; --font-base: unset; --font-headings-default: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif; --font-base-default: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;}
262/*# sourceURL=jetpack-global-styles-frontend-style-inline-css */
263</style>
264<link crossorigin='anonymous' rel='stylesheet' id='all-css-16-1' href='/_static/??-eJyNjcsKAjEMRX/ImhmUURfip0inLW3GNCmmQfx7H7gRN+7ugcs5cGsuCPfEHaq5RpaRFZbUmw+XD4MaQ5VolBS0+GuKPsb7eyLndVBdwd+iM3KA2ZAiqAT05Eiy6Bf8KHtJ9RkvW8gks6fX4VSP426/mQ7TMA7LA38FSqA=&cssminify=yes' type='text/css' media='all' />
265<script id="wpcom-actionbar-placeholder-js-extra">
266var actionbardata = {"siteID":"4721641","postID":"0","siteURL":"https://hillel.dev","xhrURL":"https://hillel.dev/wp-admin/admin-ajax.php","nonce":"ba836f7ed5","isLoggedIn":"","statusMessage":"","subsEmailDefault":"instantly","proxyScriptUrl":"https://s0.wp.com/wp-content/js/wpcom-proxy-request.js?m=1513050504i&amp;ver=20211021","i18n":{"followedText":"New posts from this site will now appear in your \u003Ca href=\"https://wordpress.com/reader\"\u003EReader\u003C/a\u003E","foldBar":"Collapse this bar","unfoldBar":"Expand this bar","shortLinkCopied":"Copied to clipboard."}};
267//# sourceURL=wpcom-actionbar-placeholder-js-extra
268</script>
vendor: 1 bytes, line 268
268
269<script id="jetpack-mu-wpcom-settings-js-before">
270var JETPACK_MU_WPCOM_SETTINGS = {"assetsUrl":"https://s1.wp.com/wp-content/mu-plugins/jetpack-mu-wpcom-plugin/sun/jetpack_vendor/automattic/jetpack-mu-wpcom/src/build/"};
271//# sourceURL=jetpack-mu-wpcom-settings-js-before
272</script>
vendor: 1 bytes, line 272
272
273<script crossorigin='anonymous' type='text/javascript'  src='/_static/??-eJyFjUEOwiAQRS/kdFSidWM8CwIhEBhwBlp7e9uoiTtXb/Ff3se5ginUHDWMgpwaVC7PZYiyw3ULZFK3TrYxPrrj5YMhB/orQQ6edXO/8vftnoqHmroPJDgXttoKmKRF3iGTK07HDUCFwNvKa+KWr4fxsj+dR6VUfAGZHkVc'></script>
vendor: 1 bytes, line 273
273
274<script id="rlt-proxy-js-after">
275	rltInitialize( {"token":null,"iframeOrigins":["https:\/\/widgets.wp.com"]} );
276//# sourceURL=rlt-proxy-js-after
277</script>
277
278<link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://hillelcoren.wordpress.com/xmlrpc.php?rsd" />
279<meta name="generator" content="WordPress.com" />
280
281<!-- Jetpack Open Graph Tags -->
282<meta property="og:type" content="website" />
283<meta property="og:title" content="JavaScript &#8211; Hillel Coren" />
284<meta property="og:url" content="https://hillel.dev/category/javascript/" />
285<meta property="og:site_name" content="Hillel Coren" />
286<meta property="og:image" content="https://s0.wp.com/i/blank.jpg?m=1383295312i" />
287<meta property="og:image:width" content="200" />
288<meta property="og:image:height" content="200" />
289<meta property="og:image:alt" content="" />
290<meta property="og:locale" content="en_US" />
291
292<!-- End Jetpack Open Graph Tags -->
293<link rel="shortcut icon" type="image/x-icon" href="https://s1.wp.com/i/favicon.ico?m=1713425267i" sizes="16x16 24x24 32x32 48x48" />
294<link rel="icon" type="image/x-icon" href="https://s1.wp.com/i/favicon.ico?m=1713425267i" sizes="16x16 24x24 32x32 48x48" />
295<link rel="apple-touch-icon" href="https://s2.wp.com/i/webclip.png?m=1713868326i" />
296<link rel='openid.server' href='https://hillel.dev/?openidserver=1' />
297<link rel='openid.delegate' href='https://hillel.dev/' />
298<link rel="search" type="application/opensearchdescription+xml" href="https://hillel.dev/osd.xml" title="Hillel Coren" />
299<link rel="search" type="application/opensearchdescription+xml" href="https://s1.wp.com/opensearch.xml" title="WordPress.com" />
300<meta name="description" content="Posts about JavaScript written by Hillel" />
301<script>
302var wa_client = {}; wa_client.cmd = []; wa_client.config = { 'blog_id': 4721641, 'blog_language': 'en', 'is_wordads': false, 'hosting_type': 0, 'afp_account_id': null, 'afp_host_id': 5038568878849053, 'theme': 'pub/twentyfifteen', '_': { 'title': 'Advertisement', 'privacy_settings': 'Privacy Settings' }, 'formats': [ 'belowpost', 'bottom_sticky', 'sidebar_sticky_right', 'sidebar', 'gutenberg_rectangle', 'gutenberg_leaderboard', 'gutenberg_mobile_leaderboard', 'gutenberg_skyscraper' ] };
303</script>
303
304		
304<script type="text/javascript">
305
306			window.doNotSellCallback = function() {
307
308				var linkElements = [
309					'a[href="https://wordpress.com/?ref=footer_blog"]',
310					'a[href="https://wordpress.com/?ref=footer_website"]',
311					'a[href="https://wordpress.com/?ref=vertical_footer"]',
312					'a[href^="https://wordpress.com/?ref=footer_segment_"]',
313				].join(',');
314
315				var dnsLink = document.createElement( 'a' );
316				dnsLink.href = 'https://wordpress.com/advertising-program-optout/';
317				dnsLink.classList.add( 'do-not-sell-link' );
318				dnsLink.rel = 'nofollow';
319				dnsLink.style.marginLeft = '0.5em';
320				dnsLink.textContent = 'Do Not Sell or Share My Personal Information';
321
322				var creditLinks = document.querySelectorAll( linkElements );
323
324				if ( 0 === creditLinks.length ) {
325					return false;
326				}
327
328				Array.prototype.forEach.call( creditLinks, function( el ) {
329					el.insertAdjacentElement( 'afterend', dnsLink );
330				});
331
332				return true;
333			};
334
335		</script>
335
336		
336<script type="text/javascript">
337	window.google_analytics_uacct = "UA-52447-2";
338</script>
338
339
340<script type="text/javascript">
341	var _gaq = _gaq || [];
342	_gaq.push(['_setAccount', 'UA-52447-2']);
343	_gaq.push(['_gat._anonymizeIp']);
344	_gaq.push(['_setDomainName', 'none']);
345	_gaq.push(['_setAllowLinker', true]);
346	_gaq.push(['_initData']);
347	_gaq.push(['_trackPageview']);
348
349	(function() {
350		var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
351		ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
352		(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga);
353	})();
354</script>
354
355<link crossorigin='anonymous' rel='stylesheet' id='all-css-0-5' href='/_static/??-eJyVj9kKwjAQRX/IOFZc+iJ+isTJYKdNMiGTtL9vhbqAIPh6LneDKRmUWCgWCNUkX28cFXoqyeJgZjQllLAIoDU+tctI0UkGW4sEWwrjy4XeqjKa0lEg05FPlMGxFsikSaLySGZkR6LfZI2qK/g962PNhSPC1QsOCjrx3PRnQBBXPSmgzVKV/PvFAh5553Bqju1+2+w27aG/Ay24dTw=&cssminify=yes' type='text/css' media='all' />
356
357</head>
358
359<body class="archive category category-javascript category-457 wp-embed-responsive wp-theme-pubtwentyfifteen customizer-styles-applied jetpack-reblog-enabled">
360<div id="page" class="hfeed site">
361	<a class="skip-link screen-reader-text" href="#content">
362		Skip to content	</a>
363
364	<div id="sidebar" class="sidebar">
365		<header id="masthead" class="site-header" role="banner">
366			<div class="site-branding">
367				<a href="https://hillel.dev/" class="site-logo-link" rel="home" itemprop="url"></a>
368										<p class="site-title"><a href="https://hillel.dev/" rel="home">Hillel Coren</a></p>
369												<p class="site-description">Just another coding weblog</p>
370										<button class="secondary-toggle">Menu and widgets</button>
371			</div><!-- .site-branding -->
372		</header><!-- .site-header -->
373
374			<div id="secondary" class="secondary">
375
376		
377		
378					<div id="widget-area" class="widget-area" role="complementary">
379				<aside id="linkcat-86506315" class="widget widget_links"><h2 class="widget-title">Projects</h2>
380	<ul class='xoxo blogroll'>
381<li><a href="https://www.eventschedule.com" rel="noopener" title="Event Schedule" target="_blank">Event Schedule</a></li>
382<li><a href="https://www.invoiceninja.com" rel="noopener" title="Invoice Ninja" target="_blank">Invoice Ninja</a></li>
383<li><a href="https://itsallwidgets.com" rel="noopener" title="An open list of apps built with Google Flutter" target="_blank">It&#039;s All Widgets!</a></li>
384
385	</ul>
386</aside>
387<aside id="twitter-2" class="widget widget_twitter"><h2 class="widget-title"><a href='http://twitter.com/hillelcoren'> Tweets</a></h2><a class="twitter-timeline" data-height="600" data-dnt="true" href="https://twitter.com/hillelcoren">
387Tweets by hillelcoren</a></aside><aside id="archives-2" class="widget widget_archive"><h2 class="widget-title">Archives</h2><nav aria-label="Archives">
388			<ul>
389					<li><a href='https://hillel.dev/2026/01/'>January 2026</a></li>
390	<li><a href='https://hillel.dev/2023/07/'>July 2023</a></li>
391	<li><a href='https://hillel.dev/2021/03/'>March 2021</a></li>
392	<li><a href='https://hillel.dev/2020/02/'>February 2020</a></li>
393	<li><a href='https://hillel.dev/2019/12/'>December 2019</a></li>
394	<li><a href='https://hillel.dev/2019/01/'>January 2019</a></li>
395	<li><a href='https://hillel.dev/2018/08/'>August 2018</a></li>
396	<li><a href='https://hillel.dev/2018/07/'>July 2018</a></li>
397	<li><a href='https://hillel.dev/2018/06/'>June 2018</a></li>
398	<li><a href='https://hillel.dev/2018/05/'>May 2018</a></li>
399	<li><a href='https://hillel.dev/2017/05/'>May 2017</a></li>
400	<li><a href='https://hillel.dev/2016/08/'>August 2016</a></li>
401	<li><a href='https://hillel.dev/2016/03/'>March 2016</a></li>
402	<li><a href='https://hillel.dev/2015/11/'>November 2015</a></li>
403	<li><a href='https://hillel.dev/2015/09/'>September 2015</a></li>
404	<li><a href='https://hillel.dev/2015/01/'>January 2015</a></li>
405	<li><a href='https://hillel.dev/2014/08/'>August 2014</a></li>
406	<li><a href='https://hillel.dev/2014/06/'>June 2014</a></li>
407	<li><a href='https://hillel.dev/2014/02/'>February 2014</a></li>
408	<li><a href='https://hillel.dev/2013/11/'>November 2013</a></li>
409	<li><a href='https://hillel.dev/2013/10/'>October 2013</a></li>
410	<li><a href='https://hillel.dev/2013/09/'>September 2013</a></li>
411	<li><a href='https://hillel.dev/2013/08/'>August 2013</a></li>
412	<li><a href='https://hillel.dev/2013/07/'>July 2013</a></li>
413	<li><a href='https://hillel.dev/2013/01/'>January 2013</a></li>
414	<li><a href='https://hillel.dev/2012/12/'>December 2012</a></li>
415	<li><a href='https://hillel.dev/2012/06/'>June 2012</a></li>
416	<li><a href='https://hillel.dev/2012/05/'>May 2012</a></li>
417	<li><a href='https://hillel.dev/2012/03/'>March 2012</a></li>
418	<li><a href='https://hillel.dev/2011/08/'>August 2011</a></li>
419	<li><a href='https://hillel.dev/2011/07/'>July 2011</a></li>
420	<li><a href='https://hillel.dev/2011/03/'>March 2011</a></li>
421	<li><a href='https://hillel.dev/2010/12/'>December 2010</a></li>
422	<li><a href='https://hillel.dev/2010/10/'>October 2010</a></li>
423	<li><a href='https://hillel.dev/2010/09/'>September 2010</a></li>
424	<li><a href='https://hillel.dev/2010/04/'>April 2010</a></li>
425	<li><a href='https://hillel.dev/2010/03/'>March 2010</a></li>
426	<li><a href='https://hillel.dev/2009/12/'>December 2009</a></li>
427	<li><a href='https://hillel.dev/2009/09/'>September 2009</a></li>
428	<li><a href='https://hillel.dev/2009/07/'>July 2009</a></li>
429	<li><a href='https://hillel.dev/2009/06/'>June 2009</a></li>
430	<li><a href='https://hillel.dev/2009/05/'>May 2009</a></li>
431	<li><a href='https://hillel.dev/2009/04/'>April 2009</a></li>
432	<li><a href='https://hillel.dev/2009/03/'>March 2009</a></li>
433	<li><a href='https://hillel.dev/2009/02/'>February 2009</a></li>
434	<li><a href='https://hillel.dev/2009/01/'>January 2009</a></li>
435	<li><a href='https://hillel.dev/2008/11/'>November 2008</a></li>
436	<li><a href='https://hillel.dev/2008/10/'>October 2008</a></li>
437	<li><a href='https://hillel.dev/2008/09/'>September 2008</a></li>
438			</ul>
439
440			</nav></aside>			</div><!-- .widget-area -->
441		
442	</div><!-- .secondary -->
443
444	</div><!-- .sidebar -->
445
446	<div id="content" class="site-content">
447
448	<section id="primary" class="content-area">
449		<main id="main" class="site-main" role="main">
450
451		
452			<header class="page-header">
453				<h1 class="page-title">Category: <span>JavaScript</span></h1>			</header><!-- .page-header -->
454
455			
456<article id="post-2274" class="post-2274 post type-post status-publish format-standard hentry category-html5 category-javascript category-laravel tag-ai tag-business tag-laravel tag-marketing tag-opensource tag-productivity tag-saas tag-technology">
457	
458	<header class="entry-header">
459		<h2 class="entry-title"><a href="https://hillel.dev/2026/01/02/why-event-schedule/" rel="bookmark">Why Event Schedule?</a></h2>	</header><!-- .entry-header -->
460
461	<div class="entry-content">
462		
463<p class="wp-block-paragraph">After working on <a href="https://invoiceninja.com" target="_blank" rel="noreferrer noopener">Invoice Ninja</a> with my amazing partners Shalom and David for <a href="https://github.com/invoiceninja/invoiceninja/commit/fd521114e8b1bbb16738355086db335ef7cb94e2" target="_blank" rel="noreferrer noopener">over a decade</a>, I started thinking about what comes next. As developers often do, I ended up working on software to try to 
463solve some of my own problems.</p>
464
465
466
467<figure class="wp-block-embed aligncenter is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
468<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">Technology doesn’t always make sense.<br>We tried to build something that does.<br><br>Event Schedule: An open-source platform to share events, sell tickets and bring communities together.<a href="https://twitter.com/marclou?ref_src=twsrc%5Etfw">@marclou</a> <a href="https://twitter.com/taylorotwell?ref_src=twsrc%5Etfw">@taylorotwell</a><br><br>Full story 👇 <a href="https://t.co/LSjNxOSRAW">pic.twitter.com/LSjNxOSRAW</a></p>&mdash; Hillel Coren (@hillelcoren) <a href="https://twitter.com/hillelcoren/status/2006974387862516137?ref_src=twsrc%5Etfw">January 2, 2026</a></blockquote>
468<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
468</div>
469</div></figure>
470
471
472
473<h2 class="wp-block-heading">Problems</h2>
474
475
476
477<ol class="wp-block-list">
478<li>I play bass in a Grateful Dead/70’s cover band. Sharing our schedule was harder than it should have been.</li>
479
480
481
482<li>Local shows were scattered across WhatsApp groups instead of a single, public calendar.</li>
483
484
485
486<li>The local farmers’ market is full of great vendors, but I’m too shy to ask about their products.</li>
487</ol>
488
489
490
491<p class="wp-block-paragraph">I wasn’t sure if I wanted to start yet another side project, but a strange thing happened when searching for a domain: one of my first .com choices was shockingly available. Clearly this was a sign.</p>
492
493
494
495<p class="wp-block-paragraph">We started working on Invoice Ninja because we saw the rise of the freelancer economy. With AI likely replacing jobs, people will start looking for new ways to make money. One option will be charging for local and online events. We can also leverage the many <a href="https://invoiceninja.com/payments/" target="_blank" rel="noreferrer noopener">payment gateways</a> supported by Invoice Ninja using a direct integration with the app. </p>
496
497
498<div class="wp-block-image">
499<figure class="aligncenter size-large"><a href="https://www.eventschedule.com/" target="_blank" rel=" noreferrer noopener"><img data-attachment-id="2320" data-permalink="https://hillel.dev/2026/01/02/why-event-schedule/image-7/" data-orig-file="https://hillel.dev/wp-content/uploads/2025/12/image-5.png" data-orig-size="193,193" data-comments-opened="1" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://hillel.dev/wp-content/uploads/2025/12/image-5.png?w=193" width="193" height="193" src="https://hillel.dev/wp-content/uploads/2025/12/image-5.png?w=193" alt="" class="wp-image-2320" srcset="https://hillel.dev/wp-content/uploads/2025/12/image-5.png 193w, https://hillel.dev/wp-content/uploads/2025/12/image-5.png?w=150 150w" sizes="(max-width: 193px) 100vw, 193px" /></a></figure>
500</div>
501
502
503<blockquote class="wp-block-quote is-style-plain is-layout-flow wp-block-quote-is-layout-flow">
504<p class="wp-block-paragraph">Event Schedule is an open-source platform to share events, sell tickets and bring communities together.</p>
505
506
507
508<ul class="wp-block-list">
509<li>Hosted: <a href="https://www.eventschedule.com/" target="_blank" rel="noreferrer noopener">eventschedule.com</a></li>
510</ul>
511
512
513
514<ul class="wp-block-list">
515<li>Selfhosted: <a href="https://github.com/eventschedule/eventschedule/" target="_blank" rel="noreferrer noopener">github.com/eventschedule</a></li>
516</ul>
517</blockquote>
518
519
520
521<h2 class="wp-block-heading">Development Process</h2>
522
523
524
525<p class="wp-block-paragraph">We&#8217;ve followed the same process we used for Invoice Ninja. Over the past year, we’ve slowly added users while developing the <a href="https://github.com/eventschedule/eventschedule/?tab=readme-ov-file#features" target="_blank" rel="noreferrer noopener">features they’ve requested</a>. I&#8217;ve loved seeing the various schedules getting created. One of the highest traffic events was the <a href="https://cyborx-festival.eventschedule.com/cyborx-kunstausstellung-cyborx-exhibit?date=2025-08-01" target="_blank" rel="noreferrer noopener">Cyborx Festival</a> in Germany. Another fascinating schedule is <a href="https://reinstate.eventschedule.com/?year=2025&amp;month=12&amp;embed=0" target="_blank" rel="noreferrer noopener">REinsTate &#8211; The Tate Institute</a>, a Victorian community hub currently being restored in London. </p>
526
527
528
529<p class="wp-block-paragraph">A major milestone was our first organic testimonial. </p>
530
531
532
533<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
534<p class="wp-block-paragraph">As a seasoned business owner, and starting a Sound Healing venture that I require a booking calendar to be part of, Event Schedule has been great. </p>
535
536
537
538<p class="wp-block-paragraph">The ease of set up, attractive format, and most important &#8211; the support has been fast and effective &#8211; very important to any business owner. </p>
539
540
541
542<p class="wp-block-paragraph">I would HIGHLY RECOMMEND Event Schedule to others and look forward to seeing this app and company grow.</p>
543
544
545
546<p class="wp-block-paragraph">Kim Zacaruk, owner, <a href="https://soulzen.ca/" target="_blank" rel="noreferrer noopener">Soul Zen Sound Baths</a></p>
547</blockquote>
548
549
550
551<p class="wp-block-paragraph"></p>
552
553
554
555<p class="wp-block-paragraph">SEO is an ongoing challenge. Compared to Invoice Ninja, there’s a major advantage: the events are public. One area we&#8217;ve experimented with is an <a href="https://blog.eventschedule.com/" target="_blank" rel="noreferrer noopener">AI-generated blog</a>. Over the past year, we&#8217;ve managed to start to gain some traction, but we still have a ways to go. </p>
556
557
558
559<figure class="wp-block-image size-large"><a href="https://hillel.dev/wp-content/uploads/2025/12/image-2.png"><img data-attachment-id="2284" data-permalink="https://hillel.dev/2026/01/02/why-event-schedule/image-4/" data-orig-file="https://hillel.dev/wp-content/uploads/2025/12/image-2.png" data-orig-size="1503,475" data-comments-opened="1" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://hillel.dev/wp-content/uploads/2025/12/image-2.png?w=660" width="1024" height="323" src="https://hillel.dev/wp-content/uploads/2025/12/image-2.png?w=1024" alt="" class="wp-image-2284" srcset="https://hillel.dev/wp-content/uploads/2025/12/image-2.png?w=1024 1024
559w, https://hillel.dev/wp-content/uploads/2025/12/image-2.png?w=150 150w, https://hillel.dev/wp-content/uploads/2025/12/image-2.png?w=300 300w, https://hillel.dev/wp-content/uploads/2025/12/image-2.png?w=768 768w, https://hillel.dev/wp-content/uploads/2025/12/image-2.png?w=1440 1440w, https://hillel.dev/wp-content/uploads/2025/12/image-2.png 1503w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
560
561
562
563<p class="wp-block-paragraph">That said we&#8217;re playing the long game. We&#8217;re running our hosted platform on <a href="https://www.digitalocean.com/products/app-platform" target="_blank" rel="noreferrer noopener">Digital Ocean&#8217;s App Platform</a>, our total monthly running cost is currently $32, Digital Ocean charges $5 for the app and $15 for the database, while Gmail provides us two email addresses, each for $6. Using Gmail to send our emails limits us to 100 per day. Once traffic picks up, we’ll need to add $20 a month to support email, bringing the total running cost to $52. Not bad, if you ask me.</p>
564
565
566
567<p class="wp-block-paragraph">Although vibe coding is crazy fun, I’d hate to ship an app to production without knowing how to code. It seems like trying to drive a car while holding tennis rackets; you don’t have the control you need. At the same time, it makes a lot of sense for people with less coding experience to take a pre-existing <a href="https://github.com/eventschedule/eventschedule/" target="_blank" rel="noreferrer noopener">open-source app</a> and use AI to implement the specific changes they need.</p>
568
569
570<div class="wp-block-image">
571<figure class="aligncenter size-large"><a href="https://hillel.dev/wp-content/uploads/2025/12/demo.gif"><img data-attachment-id="2364" data-permalink="https://hillel.dev/2026/01/02/why-event-schedule/demo/" data-orig-file="https://hillel.dev/wp-content/uploads/2025/12/demo.gif" data-orig-size="800,457" data-comments-opened="1" data-image-title="demo" data-image-description="" data-image-caption="" data-large-file="https://hillel.dev/wp-content/uploads/2025/12/demo.gif?w=660" width="800" height="457" src="https://hillel.dev/wp-content/uploads/2025/12/demo.gif?w=800" alt="" class="wp-image-2364" srcset="https://hillel.dev/wp-content/uploads/2025/12/demo.gif 800w, https://hillel.dev/wp-content/uploads/2025/12/demo.gif?w=150 150w, https://hillel.dev/wp-content/uploads/2025/12/demo.gif?w=300 300w, https://hillel.dev/wp-content/uploads/2025/12/demo.gif?w=768 768w" sizes="(max-width: 800px) 100vw, 800px" /></a><figcaption class="wp-element-caption">Google Calendar Sync</figcaption></figure>
572</div>
573
574
575<p class="wp-block-paragraph">The app is built with <a href="https://laravel.com/" target="_blank" rel="noreferrer noopener">Laravel</a>, a framework that has been quite literally life-changing. It&#8217;s enabled me to support my wife and five children while being a work-from-home dad. I can&#8217;t thank <a href="https://x.com/taylorotwell" target="_blank" rel="noreferrer noopener">Taylor Otwell</a> enough for his work on it. For now we&#8217;re using a responsive web app to support mobile, but hope to build a dedicated <a href="https://flutter.dev/" target="_blank" rel="noreferrer noopener">Flutter</a> mobile app in the future. </p>
576
577
578
579<p class="wp-block-paragraph">The platform supports both in-person as well as online events. With global events, it’s hard to have enough coverage to make in-person events useful, but we plan to provide a public listing of online events, enabling hosts to reach even larger audiences. </p>
580
581
582
583<h2 class="wp-block-heading">Marketing Strategy</h2>
584
585
586
587<p class="wp-block-paragraph">Starting a new year, I’ve decided to take off my developer hat and switch to marketing mode (hence the video and blog post). I&#8217;ve been <a href="https://www.reddit.com/r/laravel/comments/1itszkd/just_wanted_to_share_my_new_opensource_laravel_app/" target="_blank" rel="noreferrer noopener">posting to Reddit</a> from early on but my general plan moving forward was formulated after watching this great video from <a href="https://x.com/marclou" target="_blank" rel="noreferrer noopener">Marc Lou</a>. There are three basic steps:</p>
588
589
590
591<ul class="wp-block-list">
592<li>Short video leading to this post</li>
593
594
595
596<li>Short video to announce Product Hunt launch and Q&amp;A</li>
597
598
599
600<li>Long video to showcase the product</li>
601</ul>
602
603
604
605<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
606<span class="embed-youtube" style="text-align:center; display: block;"><iframe loading="lazy" class="youtube-player" width="660" height="372" src="https://www.youtube.com/embed/40zozi-rGQM?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe></span>
607</div></figure>
608
609
610
611<h2 class="wp-block-heading">Wrapping Up</h2>
612
613
614
615<p class="wp-block-paragraph">Working in tech for 25 years, I&#8217;ve had the chance to experience many different developer roles, from working in a small startup to a large public company. I&#8217;m confident that developing a second bootstrapped SaaS is the best possible position to have. The income from the first SaaS pays the rent, enabling you to devote significant time to a second project. </p>
616
617
618
619<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
620<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">Switching from backend to frontend development has a very strong &#39;warrior in a garden&#39; feel to it. My day-to-day activities have changed from fending off spammers and hackers to deciding which shade of blue looks nicer.</p>&mdash; Hillel Coren (@hillelcoren) <a href="https://twitter.com/hillelcoren/status/1490594616193601537?ref_src=twsrc%5Etfw">February 7, 2022</a></blockquote>
620<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
620</div>
621</div></figure>
622
623
624
625<p class="wp-block-paragraph">I mention this because I believe developer satisfaction directly leads to developer success; a happy developer is a productive developer. Event Schedule isn’t about growth hacks or blitzscaling. It’s about building something useful and open, the same way we did with Invoice Ninja.</p>
626
627
628
629<p class="wp-block-paragraph">If you’re curious to follow along, I’d love for you to join us. Follow <a href="https://x.com/ScheduleEvent" target="_blank" rel="noreferrer noopener">@ScheduleEvent</a> and <a href="https://x.com/hillelcoren" target="_blank" rel="noreferrer noopener">@HillelCoren</a> for updates, and check out my personal schedule at <a href="https://hillel.eventschedule.com/" target="_blank" rel="noreferrer noopener">hillel.eventschedule.com</a> to see the upcoming Product Hunt launch and Q&amp;A when it’s added. </p>
630
631
632
633<p class="wp-block-paragraph"></p>
634<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing"><h3 class="sd-title">Share this:</h3><div class="sd-content"><ul><li class="share-facebook"><a rel="nofollow noopener noreferrer"
635				data-shared="sharing-facebook-2274"
636				class="share-facebook sd-button share-icon"
637				href="https://hillel.dev/2026/01/02/why-event-schedule/?share=facebook"
638				target="_blank"
639				aria-labelledby="sharing-facebook-2274"
640				>
641				<span id="sharing-facebook-2274" hidden>Share on Facebook (Opens in new window)</span>
642				<span>Facebook</span>
643			</a></li><li class="share-twitter"><a rel="nofollow noopener noreferrer"
644				data-shared="sharing-twitter-2274"
645				class="share-twitter sd-button share-icon"
646				href="https://hillel.dev/2026/01/02/why-event-schedule/?share=twitter"
647				target="_blank"
648				aria-labelledby="sharing-twitter-2274"
649				>
650				<span id="sharing-twitter-2274" hidden>Share on X (Opens in new window)</span>
651				<span>X</span>
652			</a></li><li><a href="#" class="sharing-anchor sd-button share-more"><span>More</span></a></li><li class="share-end"></li></ul><div class="sharing-hidden"><div class="inner" style="display: none;"><ul><li class="share-linkedin"><a rel="nofollow noopener noreferrer"
653				data-shared="sharing-linkedin-2274"
654				class="share-linkedin sd-button share-icon"
655				href="https://hillel.dev/2026/01/02/why-event-schedule/?share=linkedin"
656				target="_blank"
657				aria-labelledby="sharing-linkedin-2274"
658				>
659				<span id="sharing-linkedin-2274" hidden>Share on LinkedIn (Opens in new window)</span>
660				<span>LinkedIn</span>
661			</a></li><li class="share-reddit"><a rel="nofollow noopener noreferrer"
662				data-shared="sharing-reddit-2274"
663				class="share-reddit sd-button share-icon"
664				href="https://hillel.dev/2026/01/02/why-event-schedule/?share=reddit"
665				target="_blank"
666				aria-labelledby="sharing-reddit-2274"
667				>
668				<span id="sharing-reddit-2274" hidden>Share on Reddit (Opens in new window)</span>
669				<span>Reddit</span>
670			</a></li><li class="share-email"><a rel="nofollow noopener noreferrer"
671				data-shared="sharing-email-2274"
672				class="share-email sd-button share-icon"
673				href="mailto:?subject=%5BShared%20Post%5D%20Why%20Event%20Schedule%3F&#038;body=https%3A%2F%2Fhillel.dev%2F2026%2F01%2F02%2Fwhy-event-schedule%2F&#038;share=email"
674				target="_blank"
675				aria-labelledby="sharing-email-2274"
676				data-email-share-error-title="Do you have email set up?" data-email-share-error-text="If you&#039;re having problems sharing via email, you might not have email set up for your browser. You may need to create a new email yourself." data-email-share-nonce="6f0f05cc75" data-email-share-track-url="https://hillel.dev/2026/01/02/why-event-schedule/?share=email">
677				<span id="sharing-email-2274" hidden>Email a link to a friend (Opens in new window)</span>
678				<span>Email</span>
679			</a></li><li class="share-end"></li></ul></div></div></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-4721641-2274-6ab5
6797639cdf36' data-src='//widgets.wp.com/likes/index.html?ver=20260924#blog_id=4721641&amp;post_id=2274&amp;origin=hillelcoren.wordpress.com&amp;obj_id=4721641-2274-6ab57639cdf36&amp;domain=hillel.dev' data-name='like-post-frame-4721641-2274-6ab57639cdf36' data-title='Like or Reblog'><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height: 55px;'><span class='button'><span>Like</span></span> <span class='loading'>Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div>	</div><!-- .entry-content -->
680
681	
682	<footer class="entry-footer">
683		<span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://hillel.dev/2026/01/02/why-event-schedule/" rel="bookmark"><time class="entry-date published" datetime="2026-01-02T01:39:50+02:00">January 2, 2026</time><time class="updated" datetime="2026-01-15T12:25:29+02:00">January 15, 2026</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://hillel.dev/category/html5/" rel="category tag">HTML5</a>, <a href="https://hillel.dev/category/javascript/" rel="category tag">JavaScript</a>, <a href="https://hillel.dev/category/laravel/" rel="category tag">Laravel</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://hillel.dev/tag/ai/" rel="tag">ai</a>, <a href="https://hillel.dev/tag/business/" rel="tag">business</a>, <a href="https://hillel.dev/tag/laravel/" rel="tag">Laravel</a>, <a href="https://hillel.dev/tag/marketing/" rel="tag">marketing</a>, <a href="https://hillel.dev/tag/opensource/" rel="tag">opensource</a>, <a href="https://hillel.dev/tag/productivity/" rel="tag">productivity</a>, <a href="https://hillel.dev/tag/saas/" rel="tag">saas</a>, <a href="https://hillel.dev/tag/technology/" rel="tag">technology</a></span><span class="comments-link"><a href="https://hillel.dev/2026/01/02/why-event-schedule/#comments">1 Comment<span class="screen-reader-text"> on Why Event Schedule?</span></a></span>			</footer><!-- .entry-footer -->
684
685</article><!-- #post-2274 -->
686
687<article id="post-1751" class="post-1751 post type-post status-publish format-standard hentry category-html5 category-javascript">
688	
689	<header class="entry-header">
690		<h2 class="entry-title"><a href="https://hillel.dev/2014/06/24/create-object-in-javascript-using-named-parameters/" rel="bookmark">Create object in JavaScript using named&nbsp;parameters</a></h2>	</header><!-- .entry-header -->
691
692	<div class="entry-content">
693		<p>The following code should look familiar, we&#8217;re creating an object and assigning a property. </p>
694<pre class="brush: jscript; title: ; notranslate" title="">
695function Person(id) {
696	var self = this;
697	self.id = id;
698}
699
700var instance = new Person(1);
701</pre>
702<p>One challenge with this approach is that as you add properties remembering their order can become a mental task.</p>
703<pre class="brush: jscript; title: ; notranslate" title="">
704function Person(id, firstName, lastName, phoneNumber) {
705	var self = this;
706	self.id = id;
707	self.firstName = firstName;
708	self.lastName = lastName;
709	self.phoneNumber = phoneNumber;
710}
711
712var instance = new Person(1, 'Bill', 'Gates', '212-555-1234');
713</pre>
714<p>An alternate approach to consider is to use <a href="http://api.jquery.com/jquery.extend/" target="_blank">jQuery&#8217;s extend</a> function (or <a href="http://underscorejs.org/#extend" target="_blank">Underscore</a>, <a href="https://docs.angularjs.org/api/ng/function/angular.extend" target="_blank">AngularJS</a>, etc) which enables passing named parameters.</p>
715<pre class="brush: jscript; title: ; notranslate" title="">
716function Person(data) {
717	var self = this;
718	$.extend(self, data);
719}
720
721var instance = new Person({
722	id: 1,
723	firstName: 'Bill',
724	lastName: 'Gates',
725	phoneNumber: '212-555-1234'
726});
727</pre>
728<p>A nice by-product of this approach is that it makes it simple to serialize/de-serialize the object, for example to store it to Local Storage.</p>
729<pre class="brush: jscript; title: ; notranslate" title="">
730var jsonString = JSON.stringify(instance);
731// write to storage
732// ...
733// read from storage
734var instance = new Person(JSON.parse(jsonString));
735</pre>
736<div id="atatags-370373-6ab57639cf03f">
737		
737<script type="text/javascript">
738			__ATA = window.__ATA || {};
739			__ATA.cmd = window.__ATA.cmd || [];
740			__ATA.cmd.push(function() {
741				__ATA.initVideoSlot('atatags-370373-6ab57639cf03f', {
742					sectionId: '370373',
743					format: 'inread'
744				});
745			});
746		</script>
746
747	</div>
748<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing"><h3 class="sd-title">Share this:</h3><div class="sd-content"><ul><li class="share-facebook"><a rel="nofollow noopener noreferrer"
749				data-shared="sharing-facebook-1751"
750				class="share-facebook sd-button share-icon"
751				href="https://hillel.dev/2014/06/24/create-object-in-javascript-using-named-parameters/?share=facebook"
752				target="_blank"
753				aria-labelledby="sharing-facebook-1751"
754				>
755				<span id="sharing-facebook-1751" hidden>Share on Facebook (Opens in new window)</span>
756				<span>Facebook</span>
757			</a></li><li class="share-twitter"><a rel="nofollow noopener noreferrer"
758				data-shared="sharing-twitter-1751"
759				class="share-twitter sd-button share-icon"
760				href="https://hillel.dev/2014/06/24/create-object-in-javascript-using-named-parameters/?share=twitter"
761				target="_blank"
762				aria-labelledby="sharing-twitter-1751"
763				>
764				<span id="sharing-twitter-1751" hidden>Share on X (Opens in new window)</span>
765				<span>X</span>
766			</a></li><li><a href="#" class="sharing-anchor sd-button share-more"><span>More</span></a></li><li class="share-end"></li></ul><div class="sharing-hidden"><div class="inner" style="display: none;"><ul><li class="share-linkedin"><a rel="nofollow noopener noreferrer"
767				data-shared="sharing-linkedin-1751"
768				class="share-linkedin sd-button share-icon"
769				href="https://hillel.dev/2014/06/24/create-object-in-javascript-using-named-parameters/?share=linkedin"
770				target="_blank"
771				aria-labelledby="sharing-linkedin-1751"
772				>
773				<span id="sharing-linkedin-1751" hidden>Share on LinkedIn (Opens in new window)</span>
774				<span>LinkedIn</span>
775			</a></li><li class="share-reddit"><a rel="nofollow noopener noreferrer"
776				data-shared="sharing-reddit-1751"
777				class="share-reddit sd-button share-icon"
778				href="https://hillel.dev/2014/06/24/create-object-in-javascript-using-named-parameters/?share=reddit"
779				target="_blank"
780				aria-labelledby="sharing-reddit-1751"
781				>
782				<span id="sharing-reddit-1751" hidden>Share on Reddit (Opens in new window)</span>
783				<span>Reddit</span>
784			</a></li><li class="share-email"><a rel="nofollow noopener noreferrer"
785				data-shared="sharing-email-1751"
786				class="share-email sd-button share-icon"
787				href="mailto:?subject=%5BShared%20Post%5D%20Create%20object%20in%20JavaScript%20using%20named%20parameters&#038;body=https%3A%2F%2Fhillel.dev%2F2014%2F06%2F24%2Fcreate-object-in-javascript-using-named-parameters%2F&#038;share=email"
788				target="_blank"
789				aria-labelledby="sharing-email-1751"
790				data-email-share-error-title="Do you have email set up?" data-email-share-error-text="If you&#039;re having problems sharing via email, you might not have email set up for your browser. You may need to create a new email yourself." data-email-share-nonce="c0f2bfaaa2" data-email-share-track-url="https://hillel.dev/2014/06/24/create-object-in-javascript-using-named-parameters/?share=email">
791				<span id="sharing-email-1751" hidden>Email a link to a friend (Opens in new window)</span>
792				<span>Email</span>
793			</a></li><li class="share-end"></li></ul></div></div></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-4721641-1751-6ab57639cf83f' data-src='//widgets.wp.com/likes/index.html?ver=20260924#blog_id=4721641&amp;post_id=1751&amp;origin=hillelcoren.wordpress.com&amp;obj_id=4721641-1751-6ab57639cf83f&amp;domain=hillel.dev' data-name='like-post-frame-4721641-1751-6ab57639cf83f' data-title='Like or Reblog'><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height: 55px;'><span class='button'><span>Like</span></span> <span class='loading'>Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div>	</div><!-- .entry-content -->
794
795	
796	<footer class="entry-footer">
797		<span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://hillel.dev/2014/06/24/create-object-in-javascript-using-named-parameters/" rel="bookmark"><time class="entry-date published" datetime="2014-06-24T21:42:03+02:00">June 24, 2014</time><time class="updated" datetime="2014-06-24T21:59:34+02:00">June 24, 2014</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://hillel.dev/category/html5/" rel="category tag">HTML5</a>, <a href="https://hillel.dev/category/javascript/" rel="category tag">JavaScript</a></span><span class="comments-link"><a href="https://hillel.dev/2014/06/24/create-object-in-javascript-using-named-parameters/#respond">Leave a comment<span class="screen-reader-text"> on Create object in JavaScript using named&nbsp;parameters</span></a></span>			</footer><!-- .entry-footer -->
798
799</article><!-- #post-1751 -->
800
801<article id="post-1635" class="post-1635 post type-post status-publish format-standard hentry category-javascript category-laravel">
802	
803	<header class="entry-header">
804		<h2 class="entry-title"><a href="https://hillel.dev/2014/02/11/logging-errors-in-laravel/" rel="bookmark">Logging errors in&nbsp;Laravel</a></h2>	</header><!-- .entry-header -->
805
806	<div class="entry-content">
807		<p>Laravel comes with a really helpful <code><a href="http://laravel.com/docs/errors#logging" target="_blank">Log::error()</a></code> function to write messages to the log file. Here&#8217;
807s how you can use it to track PHP and JavaScript errors along with useful contextual information to help troubleshoot problems.</p>
808<p>The <code>Log::error()</code> function accepts a second optional parameter allowing you to specify additional info. To make setting this easier create a <code>logError()</code> function in a <code>Utils</code> class.</p>
809<pre class="brush: php; title: ; notranslate" title="">
810public static function logError($error, $code = '', $context = 'PHP')
811{
812	$count = Session::get('error_count', 0);
813	Session::put('error_count', ++$count);
814
815	$data = [
816		'context' =&gt; $context,
817		'user_id' =&gt; Auth::check() ? Auth::user()-&gt;id : 0,
818		'user_name' =&gt; Auth::check() ? Auth::user()-&gt;getDisplayName() : '',
819		'url' =&gt; Request::url(),
820		'user_agent' =&gt; isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '',
821		'ip' =&gt; Request::getClientIp(),
822		'count' =&gt; $count,
823		'code' =&gt; $code
824	];
825
826	Log::error($error, $data);
827}
828</pre>
829<p>Most of the code should be self explanatory. <code>getDisplayName()</code> is a function I add to the User class (as well as other classes) where there is logic involved in determining the name. In this case it may be the user&#8217;s full name or email address.</p>
830<p>To configure Laravel to use this function by default change the <code>App::error()</code> function in <code>app/start/global.php</code> to the following.</p>
831<pre class="brush: php; title: ; notranslate" title="">
832App::error(function(Exception $exception, $code)
833{
834	Utils::logError($exception, $code);
835});
836</pre>
837<p>To catch all JavaScript errors enable accessing the Utils::logError() function by adding this to your <code>routes.php</code> file.</p>
838<pre class="brush: php; title: ; notranslate" title="">
839Route::get('/log_error', function() 
840{
841	return Utils::logError(Input::get('error'), '', 'JavaScript');
842});
843</pre>
844<p>And finally, add the following to function to your master template file.</p>
845<pre class="brush: jscript; title: ; notranslate" title="">
846window.onerror = function(e) {
847	try {
848		$.ajax({
849			type: 'GET',
850			url: '{{ URL::to('log_error') }}',
851			data: 'error='+e
852		});     
853	} catch(err) {}
854	return false;
855}
856
857</pre>
858<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing"><h3 class="sd-title">Share this:</h3><div class="sd-content"><ul><li class="share-facebook"><a rel="nofollow noopener noreferrer"
859				data-shared="sharing-facebook-1635"
860				class="share-facebook sd-button share-icon"
861				href="https://hillel.dev/2014/02/11/logging-errors-in-laravel/?share=facebook"
862				target="_blank"
863				aria-labelledby="sharing-facebook-1635"
864				>
865				<span id="sharing-facebook-1635" hidden>Share on Facebook (Opens in new window)</span>
866				<span>Facebook</span>
867			</a></li><li class="share-twitter"><a rel="nofollow noopener noreferrer"
868				data-shared="sharing-twitter-1635"
869				class="share-twitter sd-button share-icon"
870				href="https://hillel.dev/2014/02/11/logging-errors-in-laravel/?share=twitter"
871				target="_blank"
872				aria-labelledby="sharing-twitter-1635"
873				>
874				<span id="sharing-twitter-1635" hidden>Share on X (Opens in new window)</span>
875				<span>X</span>
876			</a></li><li><a href="#" class="sharing-anchor sd-button share-more"><span>More</span></a></li><li class="share-end"></li></ul><div class="sharing-hidden"><div class="inner" style="display: none;"><ul><li class="share-linkedin"><a rel="nofollow noopener noreferrer"
877				data-shared="sharing-linkedin-1635"
878				class="share-linkedin sd-button share-icon"
879				href="https://hillel.dev/2014/02/11/logging-errors-in-laravel/?share=linkedin"
880				target="_blank"
881				aria-labelledby="sharing-linkedin-1635"
882				>
883				<span id="sharing-linkedin-1635" hidden>Share on LinkedIn (Opens in new window)</span>
884				<span>LinkedIn</span>
885			</a></li><li class="share-reddit"><a rel="nofollow noopener noreferrer"
886				data-shared="sharing-reddit-1635"
887				class="share-reddit sd-button share-icon"
888				href="https://hillel.dev/2014/02/11/logging-errors-in-laravel/?share=reddit"
889				target="_blank"
890				aria-labelledby="sharing-reddit-1635"
891				>
892				<span id="sharing-reddit-1635" hidden>Share on Reddit (Opens in new window)</span>
893				<span>Reddit</span>
894			</a></li><li class="share-email"><a rel="nofollow noopener noreferrer"
895				data-shared="sharing-email-1635"
896				class="share-email sd-button share-icon"
897				href="mailto:?subject=%5BShared%20Post%5D%20Logging%20errors%20in%20Laravel&#038;body=https%3A%2F%2Fhillel.dev%2F2014%2F02%2F11%2Flogging-errors-in-laravel%2F&#038;share=email"
898				target="_blank"
899				aria-labelledby="sharing-email-1635"
900				data-email-share-error-title="Do you have email set up?" data-email-share-error-text="If you&#039;re having problems sharing via email, you might not have email set up for your browser. You may need to create a new email yourself." data-email-share-nonce="97960a57f1" data-email-share-track-url="https://hillel.dev/2014/02/11/logging-errors-in-laravel/?share=email">
901				<span id="sharing-email-1635" hidden>Email a link to a friend (Opens in new window)</span>
902				<span>Email</span>
903			</a></li><li class="share-end"></li></ul></div></div></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-4721641-1635-6ab57639d0a33' data-src='//widgets.wp.com/likes/index.html?ver=20260924#blog_id=4721641&amp;post_id=1635&amp;origin=hillelcoren.wordpress.com&amp;obj_id=4721641-1635-6ab57639d0a33&amp;domain=hillel.dev' data-name='like-post-frame-4721641-1635-6ab57639d0a33' data-title='Like or Reblog'><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height: 55px;'><span class='button'><span>Like</span></span> <span class='loading'>Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div>	</div><!-- .entry-content -->
904
905	
906	<footer class="entry-footer">
907		<span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://hillel.dev/2014/02/11/logging-errors-in-laravel/" rel="bookmark"><time class="entry-date published updated" datetime="2014-02-11T14:32:18+02:00">February 11, 2014</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://hillel.dev/category/javascript/" rel="category tag">JavaScript</a>, <a href="https://hillel.dev/category/laravel/" rel="category tag">Laravel</a></span><span class="comments-link"><a href="https://hillel.dev/2014/02/11/logging-errors-in-laravel/#comments">1 Comment<span class="screen-reader-text"> on Logging errors in&nbsp;Laravel</span></a></span>			</footer><!-- .entry-footer -->
908
909</article><!-- #post-1635 -->
910
911<article id="post-1379" class="post-1379 post type-post status-publish format-standard hentry category-javascript">
912	
913	<header class="entry-header">
914		<h2 class="entry-title"><a href="https://hillel.dev/2013/01/03/wrapper-for-javascript-console-log/" rel="bookmark">Wrapper for JavaScript&nbsp;console.log</a></h2>	</header><!-- .entry-header -->
915
916	<div class="entry-content">
917		<p>One of the best ways to debug web applications is to use the console.log() function. The catch is while it works in Chrome as well as Firefox (with the Firebug plugin) it causes errors in IE.</p>
918<p>Here&#8217;s my version of a very simple wrapper function which:<br />
919&#8211; Prevents errors in IE<br />
920&#8211; Supports the console functions I regularly use (log, info, warn and error)<br />
921&#8211; Allows using %s to substitute parameters. ie, log(&#8220;length is %s&#8221;, foo.length)</p>
922<pre class="brush: jscript; title: ; notranslate" title="">
923window.M5 = window.M5 || {};
924
925$.each([&quot;log&quot;,&quot;info&quot;,&quot;warn&quot;,&quot;error&quot;], function() {
926	var name = this;
927	M5[name] = function () {
928		if(!window.console) return; // prevents errors on IE
929		console[name].apply(console, arguments);
930	};        
931});
932
933// sample usage
934M5.log(&quot;My test log message&quot;);
935</pre>
936<p>Note: this requires jQuery and uses the M5 namespace (which you may wish to change for your own application).</p>
937<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing"><h3 class="sd-title">Share this:</h3><div class="sd-content"><ul><li class="share-facebook"><a rel="nofollow noopener noreferrer"
938				data-shared="sharing-facebook-1379"
939				class="share-facebook sd-button share-icon"
940				href="https://hillel.dev/2013/01/03/wrapper-for-javascript-console-log/?share=facebook"
941				target="_blank"
942				aria-labelledby="sharing-facebook-1379"
943				>
944				<span id="sharing-facebook-1379" hidden>Share on Facebook (Opens in new window)</span>
945				<span>Facebook</span>
946			</a></li><li class="share-twitter"><a rel="nofollow noopener noreferrer"
947				data-shared="sharing-twitter-1379"
948				class="share-twitter sd-button share-icon"
949				href="https://hillel.dev/2013/01/03/wrapper-for-javascript-console-log/?share=twitter"
950				target="_blank"
951				aria-labelledby="sharing-twitter-1379"
952				>
953				<span id="sharing-twitter-1379" hidden>Share on X (Opens in new window)</span>
954				<span>X</span>
955			</a></li><li><a href="#" class="sharing-anchor sd-button share-more"><span>More</span></a></li><li class="share-end"></li></ul><div class="sharing-hidden"><div class="inner" style="display: none;"><ul><li class="share-linkedin"><a rel="nofollow noopener noreferrer"
956				data-shared="sharing-linkedin-1379"
957				class="share-linkedin sd-button share-icon"
958				href="https://hillel.dev/2013/01/03/wrapper-for-javascript-console-log/?share=linkedin"
959				target="_blank"
960				aria-labelledby="sharing-linkedin-1379"
961				>
962				<span id="sharing-linkedin-1379" hidden>Share on LinkedIn (Opens in new window)</span>
963				<span>LinkedIn</span>
964			</a></li><li class="share-reddit"><a rel="nofollow noopener noreferrer"
965				data-shared="sharing-reddit-1379"
966				class="share-reddit sd-button share-icon"
967				href="https://hillel.dev/2013/01/03/wrapper-for-javascript-console-log/?share=reddit"
968				target="_blank"
969				aria-labelledby="sharing-reddit-1379"
970				>
971				<span id="sharing-reddit-1379" hidden>Share on Reddit (Opens in new window)</span>
972				<span>Reddit</span>
973			</a></li><li class="share-email"><a rel="nofollow noopener noreferrer"
974				data-shared="sharing-email-1379"
975				class="share-email sd-button share-icon"
976				href="mailto:?subject=%5BShared%20Post%5D%20Wrapper%20for%20JavaScript%20console.log&#038;body=https%3A%2F%2Fhillel.dev%2F2013%2F01%2F03%2Fwrapper-for-javascript-console-log%2F&#038;share=email"
977				target="_blank"
978				aria-labelledby="sharing-email-1379"
979				data-email-share-error-title="Do you have email set up?" data-email-share-error-text="If you&#039;re having problems sharing via email, you might not have email set up for your browser. You may need to create a new email yourself." data-email-share-nonce="90a373590e" data-email-share-track-url="https://hillel.dev/2013/01/03/wrapper-for-javascript-console-log/?share=email">
980				<span id="sharing-email-1379" hidden>Email a link to a friend (Opens in new window)</span>
981				<span>Email</span>
982			</a></li><li class="share-end"></li></ul></div></div></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-4721641-1379-6ab57639d1af5' data-src='//widgets.wp.com/likes/index.html?ver=20260924#blog_id=4721641&amp;post_id=1379&amp;origin=hillelcoren.wordpress.com&amp;obj_id=4721641-1379-6ab57639d1af5&amp;domain=hillel.dev' data-name='like-post-frame-4721641-1379-6ab57639d1af5' data-title='Like or Reblog'><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height: 55px;'><span class='button'><span>Like</span></span> <span class='loading'>Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div>	</div><!-- .entry-content -->
983
984	
985	<footer class="entry-footer">
986		<span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://hillel.dev/2013/01/03/wrapper-for-javascript-console-log/" rel="bookmark"><time class="entry-date published updated" datetime="2013-01-03T11:48:46+02:00">January 3, 2013</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://hillel.dev/category/javascript/" rel="category tag">JavaScript</a></span><span class="comments-link"><a href="https://hillel.dev/2013/01/03/wrapper-for-javascript-console-log/#respond">Leave a comment<span class="screen-reader-text"> on Wrapper for JavaScript&nbsp;console.log</span></a></span>			</footer><!-- .entry-footer -->
987
988</article><!-- #post-1379 -->
989
990		</main><!-- .site-main -->
991	</section><!-- .content-area -->
992
993
994	</div><!-- .site-content -->
995
996	<footer id="colophon" class="site-footer" role="contentinfo">
997		<div class="site-info">
998									<a href="https://wordpress.com/?ref=footer_blog" rel="nofollow">Blog at WordPress.com.</a>
999		</div><!-- .site-info -->
1000	</footer><!-- .site-footer -->
1001
1002</div><!-- .site -->
1003
1004<!--  -->
1005<script type="speculationrules">
1006{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/files/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/pub/twentyfifteen/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
1007</script>
vendor: 1 bytes, line 1007
1007
1008<script id="grofiles-cards-js" src="//0.gravatar.com/js/hovercards/hovercards.min.js?ver=202639d1133547e8a1f2801609f51cef12522abe7f6647d869e9fbc974fe356a37e613"></script>
vendor: 1 bytes, line 1008
1008
1009<script id="wpgroho-js-extra">
1010var WPGroHo = {"my_hash":""};
1011//# sourceURL=wpgroho-js-extra
1012</script>
vendor: 1 bytes, line 1012
1012
1013<script crossorigin='anonymous' type='text/javascript'  src='/wp-content/mu-plugins/gravatar-hovercards/wpgroho.js?m=1610363240i'></script>
1013
1014
1015	
1015<script>
1016		// Initialize and attach hovercards to all gravatars
1017		( function() {
1018			function init() {
1019				if ( typeof Gravatar === 'undefined' ) {
1020					return;
1021				}
1022
1023				if ( typeof Gravatar.init !== 'function' ) {
1024					return;
1025				}
1026
1027				Gravatar.profile_cb = function ( hash, id ) {
1028					WPGroHo.syncProfileData( hash, id );
1029				};
1030
1031				Gravatar.my_hash = WPGroHo.my_hash;
1032				Gravatar.init(
1033					'body',
1034					'#wp-admin-bar-my-account',
1035					{
1036						i18n: {
1037							'Edit your profile →': 'Edit your profile →',
1038							'View profile →': 'View profile →',
1039							'Contact': 'Contact',
1040							'Send money': 'Send money',
1041							'Sorry, we are unable to load this Gravatar profile.': 'Sorry, we are unable to load this Gravatar profile.',
1042							'Gravatar not found.': 'Gravatar not found.',
1043							'Too Many Requests.': 'Too Many Requests.',
1044							'Internal Server Error.': 'Internal Server Error.',
1045							'Is this you?': 'Is this you?',
1046							'Claim your free profile.': 'Claim your free profile.',
1047							'Email': 'Email',
1048							'Home Phone': 'Home Phone',
1049							'Work Phone': 'Work Phone',
1050							'Cell Phone': 'Cell Phone',
1051							'Contact Form': 'Contact Form',
1052							'Calendar': 'Calendar',
1053						},
1054					}
1055				);
1056			}
1057
1058			if ( document.readyState !== 'loading' ) {
1059				init();
1060			} else {
1061				document.addEventListener( 'DOMContentLoaded', init );
1062			}
1063		} )();
1064	</script>
1064
1065
1066		<div style="display:none">
1067	</div>
1068		<!-- CCPA [start] -->
1069		
1069<script type="text/javascript">
1070			( function () {
1071
1072				var setupPrivacy = function() {
1073
1074					// Minimal Mozilla Cookie library
1075					// https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie/Simple_document.cookie_framework
1076					var cookieLib = window.cookieLib = {getItem:function(e){return e&&decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*"+encodeURIComponent(e).replace(/[\-\.\+\*]/g,"\\$&")+"\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"))||null},setItem:function(e,o,n,t,r,i){if(!e||/^(?:expires|max\-age|path|domain|secure)$/i.test(e))return!1;var c="";if(n)switch(n.constructor){case Number:c=n===1/0?"; expires=Fri, 31 Dec 9999 23:59:59 GMT":"; max-age="+n;break;case String:c="; expires="+n;break;case Date:c="; expires="+n.toUTCString()}return"rootDomain"!==r&&".rootDomain"!==r||(r=(".rootDomain"===r?".":"")+document.location.hostname.split(".").slice(-2).join(".")),document.cookie=encodeURIComponent(e)+"="+encodeURIComponent(o)+c+(r?"; domain="+r:"")+(t?"; path="+t:"")+(i?"; secure":""),!0}};
1077
1078					// Implement IAB USP API.
1079					window.__uspapi = function( command, version, callback ) {
1080
1081						// Validate callback.
1082						if ( typeof callback !== 'function' ) {
1083							return;
1084						}
1085
1086						// Validate the given command.
1087						if ( command !== 'getUSPData' || version !== 1 ) {
1088							callback( null, false );
1089							return;
1090						}
1091
1092						// Check for GPC. If set, override any stored cookie.
1093						if ( navigator.globalPrivacyControl ) {
1094							callback( { version: 1, uspString: '1YYN' }, true );
1095							return;
1096						}
1097
1098						// Check for cookie.
1099						var consent = cookieLib.getItem( 'usprivacy' );
1100
1101						// Invalid cookie.
1102						if ( null === consent ) {
1103							callback( null, false );
1104							return;
1105						}
1106
1107						// Everything checks out. Fire the provided callback with the consent data.
1108						callback( { version: 1, uspString: consent }, true );
1109					};
1110
1111					// Initialization.
1112					document.addEventListener( 'DOMContentLoaded', function() {
1113
1114						// Internal functions.
1115						var setDefaultOptInCookie = function() {
1116							var value = '1YNN';
1117							var domain = '.wordpress.com' === location.hostname.slice( -14 ) ? '.rootDomain' : location.hostname;
1118							cookieLib.setItem( 'usprivacy', value, 365 * 24 * 60 * 60, '/', domain );
1119						};
1120
1121						var setDefaultOptOutCookie = function() {
1122							var value = '1YYN';
1123							var domain = '.wordpress.com' === location.hostname.slice( -14 ) ? '.rootDomain' : location.hostname;
1124							cookieLib.setItem( 'usprivacy', value, 24 * 60 * 60, '/', domain );
1125						};
1126
1127						var setDefaultNotApplicableCookie = function() {
1128							var value = '1---';
1129							var domain = '.wordpress.com' === location.hostname.slice( -14 ) ? '.rootDomain' : location.hostname;
1130							cookieLib.setItem( 'usprivacy', value, 24 * 60 * 60, '/', domain );
1131						};
1132
1133						var setCcpaAppliesCookie = function( applies ) {
1134							var domain = '.wordpress.com' === location.hostname.slice( -14 ) ? '.rootDomain' : location.hostname;
1135							cookieLib.setItem( 'ccpa_applies', applies, 24 * 60 * 60, '/', domain );
1136						}
1137
1138						var maybeCallDoNotSellCallback = function() {
1139							if ( 'function' === typeof window.doNotSellCallback ) {
1140								return window.doNotSellCallback();
1141							}
1142
1143							return false;
1144						}
1145
1146						// Look for usprivacy cookie first.
1147						var usprivacyCookie = cookieLib.getItem( 'usprivacy' );
1148
1149						// Found a usprivacy cookie.
1150						if ( null !== usprivacyCookie ) {
1151
1152							// If the cookie indicates that CCPA does not apply, then bail.
1153							if ( '1---' === usprivacyCookie ) {
1154								return;
1155							}
1156
1157							// CCPA applies, so call our callback to add Do Not Sell link to the page.
1158							maybeCallDoNotSellCallback();
1159
1160							// We're all done, no more processing needed.
1161							return;
1162						}
1163
1164						// We don't have a usprivacy cookie, so check to see if we have a CCPA applies cookie.
1165						var ccpaCookie = cookieLib.getItem( 'ccpa_applies' );
1166
1167						// No CCPA applies cookie found, so we'll need to geolocate if this visitor is from California.
1168						// This needs to happen client side because we do not have region geo data in our $SERVER headers,
1169						// only country data -- therefore we can't vary cache on the region.
1170						if ( null === ccpaCookie ) {
1171
1172							var request = new XMLHttpRequest();
1173							request.open( 'GET', 'https://public-api.wordpress.com/geo/', true );
1174
1175							request.onreadystatechange = function () {
1176								if ( 4 === this.readyState ) {
1177									if ( 200 === this.status ) {
1178
1179										// Got a geo response. Parse out the region data.
1180										var data = JSON.parse( this.response );
1181										var region      = data.region ? data.region.toLowerCase() : '';
1182										var ccpa_applies = ['california', 'colorado', 'connecticut', 'delaware', 'indiana', 'iowa', 'montana', 'new jersey', 'oregon', 'tennessee', 'texas', 'utah', 'virginia'].indexOf( region ) > -1;
1183										// Set CCPA applies cookie. This keeps us from having to make a geo request too frequently.
1184										setCcpaAppliesCookie( ccpa_applies );
1185
1186										// Check if CCPA applies to set the proper usprivacy cookie.
1187										if ( ccpa_applies ) {
1188											if ( maybeCallDoNotSellCallback() ) {
1189												// Do Not Sell link added, so set default opt-in.
1190												setDefaultOptInCookie();
1191											} else {
1192												// Failed showing Do Not Sell link as required, so default to opt-OUT just to be safe.
1193												setDefaultOptOutCookie();
1194											}
1195										} else {
1196											// CCPA does not apply.
1197											setDefaultNotApplicableCookie();
1198										}
1199									} else {
1200										// Could not geo, so let's assume for now that CCPA applies to be safe.
1201										setCcpaAppliesCookie( true );
1202										if ( maybeCallDoNotSellCallback() ) {
1203											// Do Not Sell link added, so set default opt-in.
1204											setDefaultOptInCookie();
1205										} else {
1206											// Failed showing Do Not Sell link as required, so default to opt-OUT just to be safe.
1207											setDefaultOptOutCookie();
1208										}
1209									}
1210								}
1211							};
1212
1213							// Send the geo request.
1214							request.send();
1215						} else {
1216							// We found a CCPA applies cookie.
1217							if ( ccpaCookie === 'true' ) {
1218								if ( maybeCallDoNotSellCallback() ) {
1219									// Do Not Sell link added, so set default opt-in.
1220									setDefaultOptInCookie();
1221								} else {
1222									// Failed showing Do Not Sell link as required, so default to opt-OUT just to be safe.
1223									setDefaultOptOutCookie();
1224								}
1225							} else {
1226								// CCPA does not apply.
1227								setDefaultNotApplicableCookie();
1228							}
1229						}
1230					} );
1231				};
1232
1233				// Kickoff initialization.
1234				if ( window.defQueue && defQueue.isLOHP && defQueue.isLOHP === 2020 ) {
1235					defQueue.items.push( setupPrivacy );
1236				} else {
1237					setupPrivacy();
1238				}
1239
1240			} )();
1241		</script>
1241
1242
1243		<!-- CCPA [end] -->
1244		<div class="widget widget_eu_cookie_law_widget">
1245<div
1246	class="hide-on-button ads-active"
1247	data-hide-timeout="30"
1248	data-consent-expiration="180"
1249	id="eu-cookie-law"
1250	style="display: none"
1251>
1252	<form method="post">
1253		<input type="submit" value="Close and accept" class="accept" />
1254
1255		Privacy &amp; Cookies: This site uses cookies. By continuing to use this website, you agree to their use. <br />
1256To find out more, including how to control cookies, see here:
1257				<a href="https://automattic.com/cookies/" rel="nofollow">
1258			Cookie Policy		</a>
1259 </form>
1260</div>
1261</div>			<div id="actionbar" dir="ltr" style="display: none;"
1262				class="actnbr-pub-twentyfifteen" role="region" aria-label="Site actions">
1263			<span class="actnbr-live" aria-live="polite"></span>
1264			<ul>
1265										<li class="actnbr-btn actnbr-hidden">
1266										<a class="actnbr-action actnbr-actn-follow " href="" role="button" aria-haspopup="dialog" aria-expanded="false">
1267				<svg class="actnbr-icon actnbr-icon-bell" width="20" height="20" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" fill="currentColor"><path fill-rule="evenodd" clip-rule="evenodd" d="M17 11.5c0 1.353.17 2.368.976 3 .266.209.602.376 1.024.5v1H5v-1c.422-.124.757-.291 1.024-.5.806-.632.976-1.647.976-3V9c0-2.8 2.2-5 5-5s5 2.2 5 5v2.5ZM15.5 9v2.5c0 .93.066 1.98.515 2.897l.053.103H7.932a4.018 4.018 0 0 0 .053-.103c.449-.917.515-1.967.515-2.897V9c0-1.972 1.528-3.5 3.5-3.5s3.5 1.528 3.5 3.5Zm-5.492 9.008c0-.176.023-.346.065-.508h3.854A1.996 1.996 0 0 1 12 20c-1.1 0-1.992-.892-1.992-1.992Z"/></svg>				<span>Subscribe</span>
1268			</a>
1269			<a class="actnbr-action actnbr-actn-following  no-display" href="" role="button">
1270				<svg class="actnbr-icon actnbr-icon-check" width="20" height="20" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" style="fill: none" stroke="currentColor" stroke-width="1.5"><path d="M7 12L10 15L17 8" vector-effect="non-scaling-stroke"/></svg>				<span>Subscribed</span>
1271			</a>
1272									<div class="actnbr-popover actnbr-panel actnbr-notice" id="follow-bubble" role="dialog" aria-label="Subscribe to Hillel Coren">
1273								<div class="actnbr-follow-bubble">
1274								<div class="actnbr-panel__group"><a class="actnbr-menu__item actnbr-sitename" href="https://hillel.dev"><img loading='lazy' alt='' src='https://s-ssl.wordpress.com/i/logo/wpcom-gray-white.png?m=1479929237i' srcset='https://s-ssl.wordpress.com/i/logo/wpcom-gray-white.png 1x' class='avatar avatar-50' height='50' width='50' /><span class="actnbr-menu__label">Hillel Coren</span></a></div>																	<div class="actnbr-panel__group">
1275										<div class="actnbr-message no-display" aria-live="polite"></div>
1276										<form method="post" action="https://subscribe.wordpress.com" accept-charset="utf-8" class="no-display">
1277																							<div class="actnbr-follow-count">Join 113 other subscribers</div>
1278																							<input type="email" name="email" placeholder="Want updates? Enter your email" class="actnbr-email-field" aria-label="Email address" />
1279											<input type="hidden" name="action" value="subscribe" />
1280											<input type="hidden" name="blog_id" value="4721641" />
1281											<input type="hidden" name="source" value="https://hillel.dev/category/javascript/" />
1282											<input type="hidden" name="sub-type" value="actionbar-follow" />
1283											<input type="hidden" id="_wpnonce" name="_wpnonce" value="86646c087f" />											<button type="submit" class="actnbr-button">Sign me up</button>
1284										</form>
1285										<p class="actnbr-login-nudge">
1286											Have a WordPress.com account? <a href="https://wordpress.com/log-in?redirect_to=https%3A%2F%2Fr-login.wordpress.com%2Fremote-login.php%3Faction%3Dlink%26back%3Dhttps%253A%252F%252Fhillel.dev%252F2026%252F01%252F02%252Fwhy-event-schedule%252F">Log in now.</a>										</p>
1287									</div>
1288																	</div>
1289							</div>
1290						</li>
1291									<li class="actnbr-ellipsis actnbr-hidden">
1292					<button type="button" class="actnbr-more-toggle" aria-haspopup="true" aria-expanded="false" aria-label="More options">
1293						<svg class="actnbr-icon actnbr-icon-more-horizontal" width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" fill="currentColor"><path d="M11 13h2v-2h-2v2zm-6 0h2v-2H5v2zm12-2v2h2v-2h-2z"/></svg>					</button>
1294					<div class="actnbr-popover actnbr-menu" role="menu" aria-label="Site options">
1295						<div class="actnbr-menu__group" role="group"><a role="menuitem" class="actnbr-menu__item actnbr-sitename" href="https://hillel.dev"><img loading='lazy' alt='' src='https://s-ssl.wordpress.com/i/logo/wpcom-gray-white.png?m=1479929237i' srcset='https://s-ssl.wordpress.com/i/logo/wpcom-gray-white.png 1x' class='avatar avatar-50' height='50' width='50' /><span class="actnbr-menu__label">Hillel Coren</span></a></div><div class="actnbr-menu__group" role="group"><a role="menuitem" class="actnbr-menu__item actnbr-reader" href="https://wordpress.com/reader/feeds/94246706"><span class="actnbr-menu__label">View site in Reader</span></a></div><div class="actnbr-menu__group" role="group"><a role="menuitem" class="actnbr-menu__item actnbr-subs" href="https://subscribe.wordpress.com/"><span class="actnbr-menu__label">Manage subscriptions</span></a><a role="menuitem" class="actnbr-menu__item actnbr-signup" href="https://wordpress.com/start/"><span class="actnbr-menu__label">Sign up</span></a><a role="menuitem" class="actnbr-menu__item actnbr-login" href="https://wordpress.com/log-in?redirect_to=https%3A%2F%2Fr-login.wordpress.com%2Fremote-login.php%3Faction%3Dlink%26back%3Dhttps%253A%252F%252Fhillel.dev%252F2026%252F01%252F02%252Fwhy-event-schedule%252F"><span class="actnbr-menu__label">Log in</span></a></div><div class="actnbr-menu__group" role="group"><a role="menuitem" class="actnbr-menu__item flb-report" href="https://wordpress.com/abuse/?report_url=https://hillel.dev" target="_blank" rel="noopener noreferrer"><span class="actnbr-menu__label">Report this content</span><span class="actnbr-menu__icon"><svg class="actnbr-icon actnbr-icon-external" width="18" height="18" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" fill="currentColor"><path d="M19.5 4.5h-7V6h4.44l-5.97 5.97 1.06 1.06L18 7.06v4.44h1.5v-7Zm-13 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-3H17v3a.5.5 0 0 1-.5.5h-10a.5.5 0 0 1-.5-.5v-10a.5.5 0 0 1 .5-.5h3V5.5h-3Z"/></svg></span></a></div><div class="actnbr-menu__group" role="group"><a role="menuitem" class="actnbr-menu__item actnbr-fold" href=""><span class="actnbr-menu__label">Collapse this bar</span></a></div>					</div>
1296				</li>
1297			</ul>
1298		</div>
1299		
1299<script>
1300window.addEventListener( "DOMContentLoaded", function () {
1301				var link = document.createElement( "link" );
1302				link.href = "\/wp-content\/mu-plugins\/jetpack-plugin\/sun\/jetpack_vendor\/automattic\/jetpack-newsletter\/src\/..\/build\/action-bar.css?ver=9e2715140ce0af99d983";
1303				link.rel = "stylesheet";
1304				document.head.appendChild( link );
1305
1306				var script = document.createElement( "script" );
1307				script.src = "\/wp-content\/mu-plugins\/jetpack-plugin\/sun\/jetpack_vendor\/automattic\/jetpack-newsletter\/src\/..\/build\/action-bar.js?ver=9e2715140ce0af99d983";
1308				document.body.appendChild( script );
1309			} );
1310</script>
1310
1311<link rel="prefetch" href="/wp-content/mu-plugins/jetpack-plugin/sun/_inc/blocks/swiper.js" as="script" />
1312		<div id="jp-carousel-loading-overlay" style="display: none;">
1313			<div id="jp-carousel-loading-wrapper">
1314				<span id="jp-carousel-library-loading"><svg class="jetpack-spinner" width="40" height="40" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><circle cx="50" cy="50" r="46" fill="none" stroke="#ddd" stroke-width="8"/><path d="M 50 4 A 46 46 0 0 1 96 50" fill="none" stroke="currentColor" stroke-width="8" stroke-linecap="round"><animateTransform attributeName="transform" type="rotate" dur="1.4s" from="0 50 50" to="360 50 50" repeatCount="indefinite"/></path></svg></span>
1315			</div>
1316		</div>
1317		<div class="jp-carousel-overlay" style="display: none;">
1318
1319		<div class="jp-carousel-container">
1320			<!-- The Carousel Swiper -->
1321			<div
1322				class="jp-carousel-wrap swiper jp-carousel-swiper-container jp-carousel-transitions"
1323				itemscope
1324				itemtype="https://schema.org/ImageGallery">
1325				<div class="jp-carousel swiper-wrapper"></div>
1326				<div class="jp-swiper-button-prev swiper-button-prev">
1327					<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1328						<mask id="maskPrev" mask-type="alpha" maskUnits="userSpaceOnUse" x="8" y="6" width="9" height="12">
1329							<path d="M16.2072 16.59L11.6496 12L16.2072 7.41L14.8041 6L8.8335 12L14.8041 18L16.2072 16.59Z" fill="white"/>
1330						</mask>
1331						<g mask="url(#maskPrev)">
1332							<rect x="0.579102" width="23.8823" height="24" fill="#FFFFFF"/>
1333						</g>
1334					</svg>
1335				</div>
1336				<div class="jp-swiper-button-next swiper-button-next">
1337					<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1338						<mask id="maskNext" mask-type="alpha" maskUnits="userSpaceOnUse" x="8" y="6" width="8" height="12">
1339							<path d="M8.59814 16.59L13.1557 12L8.59814 7.41L10.0012 6L15.9718 12L10.0012 18L8.59814 16.59Z" fill="white"/>
1340						</mask>
1341						<g mask="url(#maskNext)">
1342							<rect x="0.34375" width="23.8822" height="24" fill="#FFFFFF"/>
1343						</g>
1344					</svg>
1345				</div>
1346			</div>
1347			<!-- The main close buton -->
1348			<div class="jp-carousel-close-hint">
1349				<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1350					<mask id="maskClose" mask-type="alpha" maskUnits="userSpaceOnUse" x="5" y="5" width="15" height="14">
1351						<path d="M19.3166 6.41L17.9135 5L12.3509 10.59L6.78834 5L5.38525 6.41L10.9478 12L5.38525 17.59L6.78834 19L12.3509 13.41L17.9135 19L19.3166 17.59L13.754 12L19.3166 6.41Z" fill="white"/>
1352					</mask>
1353					<g mask="url(#maskClose)">
1354						<rect x="0.409668" width="23.8823" height="24" fill="#FFFFFF"/>
1355					</g>
1356				</svg>
1357			</div>
1358			<!-- Image info, comments and meta -->
1359			<div class="jp-carousel-info">
1360				<div class="jp-carousel-info-footer">
1361					<div class="jp-carousel-pagination-container">
1362						<div class="jp-swiper-pagination swiper-pagination"></div>
1363						<div class="jp-carousel-pagination"></div>
1364					</div>
1365					<div class="jp-carousel-photo-title-container">
1366						<div class="jp-carousel-photo-caption"></div>
1367					</div>
1368					<div class="jp-carousel-photo-icons-container">
1369						<a href="#" class="jp-carousel-icon-btn jp-carousel-icon-info" aria-label="Toggle photo metadata visibility">
1370							<span class="jp-carousel-icon">
1371								<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1372									<mask id="maskInfo" mask-type="alpha" maskUnits="userSpaceOnUse" x="2" y="2" width="21" height="20">
1373										<path fill-rule="evenodd" clip-rule="evenodd" d="M12.7537 2C7.26076 2 2.80273 6.48 2.80273 12C2.80273 17.52 7.26076 22 12.7537 22C18.2466 22 22.7046 17.52 22.7046 12C22.7046 6.48 18.2466 2 12.7537 2ZM11.7586 7V9H13.7488V7H11.7586ZM11.7586 11V17H13.7488V11H11.7586ZM4.79292 12C4.79292 16.41 8.36531 20 12.7537 20C17.142 20 20.7144 16.41 20.7144 12C20.7144 7.59 17.142 4 12.7537 4C8.36531 4 4.79292 7.59 4.79292 12Z" fill="white"/>
1374									</mask>
1375									<g mask="url(#maskInfo)">
1376										<rect x="0.8125" width="23.8823" height="24" fill="#FFFFFF"/>
1377									</g>
1378								</svg>
1379							</span>
1380						</a>
1381												<a href="#" class="jp-carousel-icon-btn jp-carousel-icon-comments" aria-label="Toggle photo comments visibility">
1382							<span class="jp-carousel-icon">
1383								<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1384									<mask id="maskComments" mask-type="alpha" maskUnits="userSpaceOnUse" x="2" y="2" width="21" height="20">
1385										<path fill-rule="evenodd" clip-rule="evenodd" d="M4.3271 2H20.2486C21.3432 2 22.2388 2.9 22.2388 4V16C22.2388 17.1 21.3432 18 20.2486 18H6.31729L2.33691 22V4C2.33691 2.9 3.2325 2 4.3271 2ZM6.31729 16H20.2486V4H4.3271V18L6.31729 16Z" fill="white"/>
1386									</mask>
1387									<g mask="url(#maskComments)">
1388										<rect x="0.34668" width="23.8823" height="24" fill="#FFFFFF"/>
1389									</g>
1390								</svg>
1391
1392								<span class="jp-carousel-has-comments-indicator" aria-label="This image has comments."></span>
1393							</span>
1394						</a>
1395											</div>
1396				</div>
1397				<div class="jp-carousel-info-extra">
1398					<div class="jp-carousel-info-content-wrapper">
1399						<div class="jp-carousel-photo-title-container">
1400							<div class="jp-carousel-photo-title"></div>
1401						</div>
1402						<div class="jp-carousel-comments-wrapper">
1403															<div id="jp-carousel-comments-loading">
1404									<span>Loading Comments...</span>
1405								</div>
1406								<div class="jp-carousel-comments"></div>
1407								<div id="jp-carousel-comment-form-container">
1408									<span id="jp-carousel-comment-form-spinner"><svg class="jetpack-spinner" width="20" height="20" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><circle cx="50" cy="50" r="46" fill="none" stroke="#ddd" stroke-width="8"/><path d="M 50 4 A 46 46 0 0 1 96 50" fill="none" stroke="currentColor" stroke-width="8" stroke-linecap="round"><animateTransform attributeName="transform" type="rotate" dur="1.4s" from="0 50 50" to="360 50 50" repeatCount="indefinite"/></path></svg></span>
1409									<div id="jp-carousel-comment-post-results"></div>
1410																														<form id="jp-carousel-comment-form">
1411												<label for="jp-carousel-comment-form-comment-field" class="screen-reader-text">Write a Comment...</label>
1412												<textarea
1413													name="comment"
1414													class="jp-carousel-comment-form-field jp-carousel-comment-form-textarea"
1415													id="jp-carousel-comment-form-comment-field"
1416													placeholder="Write a Comment..."
1417												></textarea>
1418												<div id="jp-carousel-comment-form-submit-and-info-wrapper">
1419													<div id="jp-carousel-comment-form-commenting-as">
1420																													<fieldset>
1421																<label for="jp-carousel-comment-form-email-field">Email (Required)</label>
1422																<input type="text" name="email" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-email-field" />
1423															</fieldset>
1424															<fieldset>
1425																<label for="jp-carousel-comment-form-author-field">Name (Required)</label>
1426																<input type="text" name="author" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-author-field" />
1427															</fieldset>
1428															<fieldset>
1429																<label for="jp-carousel-comment-form-url-field">Website</label>
1430																<input type="text" name="url" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-url-field" />
1431															</fieldset>
1432																											</div>
1433													<input
1434														type="submit"
1435														name="submit"
1436														class="jp-carousel-comment-form-button"
1437														id="jp-carousel-comment-form-button-submit"
1438														value="Post Comment" />
1439												</div>
1440											</form>
1441																											</div>
1442													</div>
1443						<div class="jp-carousel-image-meta">
1444							<div class="jp-carousel-title-and-caption">
1445								<div class="jp-carousel-photo-info">
1446									<div class="jp-carousel-caption" itemprop="caption description"></div>
1447								</div>
1448
1449								<div class="jp-carousel-photo-description"></div>
1450							</div>
1451							<a class="jp-carousel-image-download" href="#" aria-label="Download image" target="_blank" style="display: none;">
1452								<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1453									<mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="3" y="3" width="19" height="18">
1454										<path fill-rule="evenodd" clip-rule="evenodd" d="M5.84615 5V19H19.7775V12H21.7677V19C21.7677 20.1 20.8721 21 19.7775 21H5.84615C4.74159 21 3.85596 20.1 3.85596 19V5C3.85596 3.9 4.74159 3 5.84615 3H12.8118V5H5.84615ZM14.802 5V3H21.7677V10H19.7775V6.41L9.99569 16.24L8.59261 14.83L18.3744 5H14.802Z" fill="white"/>
1455									</mask>
1456									<g mask="url(#mask0)">
1457										<rect x="0.870605" width="23.8823" height="24" fill="#FFFFFF"/>
1458									</g>
1459								</svg>
1460								<span class="jp-carousel-download-text"></span>
1461							</a>
1462							<div class="jp-carousel-image-map" style="display: none;"></div>
1463						</div>
1464					</div>
1465				</div>
1466			</div>
1467		</div>
1468
1469		</div>
1470		
1471	
1471<script type="text/javascript">
1472		window.WPCOM_sharing_counts = {"https://hillel.dev/2026/01/02/why-event-schedule/":2274,"https://hillel.dev/2014/06/24/create-object-in-javascript-using-named-parameters/":1751,"https://hillel.dev/2014/02/11/logging-errors-in-laravel/":1635,"https://hillel.dev/2013/01/03/wrapper-for-javascript-console-log/":1379};
1473	</script>
1473
1474				
1474<script crossorigin='anonymous' type='text/javascript'  src='/_static/??-eJzTLy/QTc7PK0nNK9EvyClNz8wr1i+uzCtJrMjITM/IAeKS1CJMEWP94uSizIISoOIM5/yiVL2sYh19yo1yKiotzvAKBvOpaWRARgHQOPtcW0NTcwMjAxNLC9MsAD6AYFU='></script>
vendor: 1 bytes, line 1474
1474
1475<script type='text/javascript'>
1476	(function(){
1477		var corecss = document.createElement('link');
1478		var themecss = document.createElement('link');
1479		var corecssurl = "/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shCore.css?ver=3.0.9b";
1480		if ( corecss.setAttribute ) {
1481				corecss.setAttribute( "rel", "stylesheet" );
1482				corecss.setAttribute( "type", "text/css" );
1483				corecss.setAttribute( "href", corecssurl );
1484		} else {
1485				corecss.rel = "stylesheet";
1486				corecss.href = corecssurl;
1487		}
1488		document.head.appendChild( corecss );
1489		var themecssurl = "/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shThemeDefault.css?m=1363304414i&amp;ver=3.0.9b";
1490		if ( themecss.setAttribute ) {
1491				themecss.setAttribute( "rel", "stylesheet" );
1492				themecss.setAttribute( "type", "text/css" );
1493				themecss.setAttribute( "href", themecssurl );
1494		} else {
1495				themecss.rel = "stylesheet";
1496				themecss.href = themecssurl;
1497		}
1498		document.head.appendChild( themecss );
1499	})();
1500	SyntaxHighlighter.config.strings.expandSource = '+ expand source';
1501	SyntaxHighlighter.config.strings.help = '?';
1502	SyntaxHighlighter.config.strings.alert = 'SyntaxHighlighter\n\n';
1503	SyntaxHighlighter.config.strings.noBrush = 'Can\'t find brush for: ';
1504	SyntaxHighlighter.config.strings.brushNotHtmlScript = 'Brush wasn\'t configured for html-script option: ';
1505	SyntaxHighlighter.defaults['pad-line-numbers'] = false;
1506	SyntaxHighlighter.defaults['toolbar'] = false;
1507	SyntaxHighlighter.all();
1508
1509	// Infinite scroll support
1510	document.addEventListener( 'is.post-load', function () {
1511		SyntaxHighlighter.highlight();
1512	} );
1513</script>
1513
1514
1515	
1515<script type="text/javascript">
1516		(function () {
1517			var wpcom_reblog = {
1518				source: 'toolbar',
1519
1520				toggle_reblog_box_flair: function (obj_id, post_id) {
1521
1522					// Go to site selector. This will redirect to their blog if they only have one.
1523					const postEndpoint = `https://wordpress.com/post`;
1524
1525					// Ideally we would use the permalink here, but fortunately this will be replaced with the 
1526					// post permalink in the editor.
1527					const originalURL = `${ document.location.href }?page_id=${ post_id }`; 
1528					
1529					const url =
1530						postEndpoint +
1531						'?url=' +
1532						encodeURIComponent( originalURL ) +
1533						'&is_post_share=true' +
1534						'&v=5';
1535
1536					const redirect = function () {
1537						if (
1538							! window.open( url, '_blank' )
1539						) {
1540							location.href = url;
1541						}
1542					};
1543
1544					if ( /Firefox/.test( navigator.userAgent ) ) {
1545						setTimeout( redirect, 0 );
1546					} else {
1547						redirect();
1548					}
1549				},
1550			};
1551
1552			window.wpcom_reblog = wpcom_reblog;
1553		})();
1554	</script>
vendor: 1 bytes, line 1554
1554
1555<script id="coblocks-loader-js-extra">
1556var wpcom_coblocks_js = {"coblocks_masonry_js":"https://s2.wp.com/wp-content/plugins/coblocks/2.18.1-simple-rev.4/dist/js/coblocks-masonry.min.js?m=1681832297i","coblocks_lightbox_js":"https://s2.wp.com/wp-content/plugins/coblocks/2.18.1-simple-rev.4/dist/js/coblocks-lightbox.min.js?m=1681832297i","jquery_core_js":"/wp-includes/js/jquery/jquery.min.js","jquery_migrate_js":"/wp-includes/js/jquery/jquery-migrate.min.js","masonry_js":"/wp-includes/js/masonry.min.js","imagesloaded_js":"/wp-includes/js/imagesloaded.min.js"};
1557var coblocksLigthboxData = {"closeLabel":"Close Gallery","leftLabel":"Previous","rightLabel":"Next"};
1558//# sourceURL=coblocks-loader-js-extra
1559</script>
vendor: 1 bytes, line 1559
1559
1560<script id="twentyfifteen-script-js-extra">
1561var screenReaderText = {"expand":"\u003Cspan class=\"screen-reader-text\"\u003Eexpand child menu\u003C/span\u003E","collapse":"\u003Cspan class=\"screen-reader-text\"\u003Ecollapse child menu\u003C/span\u003E"};
1562//# sourceURL=twentyfifteen-script-js-extra
1563</script>
vendor: 1 bytes, line 1563
1563
1564<script crossorigin='anonymous' type='text/javascript'  src='/_static/??-eJyVjsuOwjAMRX+I1BRVMBvEt4TELW6dB7VDxN9PWKBBXSDN9vqcew01G5eiYlS4cppM5jJRFKhp9daLcWxFUGBukVU2j0M3yw4+tFD+JPITqgCWdk0LoWFbQTFktoqb/EsP09Loe8GCNxs947qF36RL7Wu3CBy6/qfrjVDbQrPioxvAk+jr8TdkOFnfugLFbZ/eMLTJXK6gtQXPkUZFjC99LNEppSj/kWp2KTThEs796bgfhuO+P82/lNqHsA=='></script>
vendor: 1 bytes, line 1564
1564
1565<script id="twitter-widgets-js" src="https://platform.twitter.com/widgets.js?ver=20111117"></script>
vendor: 1 bytes, line 1565
1565
1566<script crossorigin='anonymous' type='text/javascript'  src='/wp-includes/js/dist/vendor/wp-polyfill.min.js?m=1786440387i'></script>
vendor: 1 bytes, line 1566
1566
1567<script id="wp-hooks-js" src="/wp-content/plugins/gutenberg-core/v24.0.0/build/scripts/hooks/index.min.js?m=1789650619i&#038;ver=f0f188028580e8dc1255"></script>
vendor: 1 bytes, line 1567
1567
1568<script id="wp-i18n-js" src="/wp-content/plugins/gutenberg-core/v24.0.0/build/scripts/i18n/index.min.js?m=1789650619i&#038;ver=1dfe7db3940c23ea9216"></script>
vendor: 1 bytes, line 1568
1568
1569<script id="wp-i18n-js-after">
1570wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } );
1571//# sourceURL=wp-i18n-js-after
1572</script>
vendor: 1 bytes, line 1572
1572
1573<script id="jetpack-carousel-js-extra">
1574var jetpackSwiperLibraryPath = {"url":"/wp-content/mu-plugins/jetpack-plugin/sun/_inc/blocks/swiper.js"};
1575var jetpackCarouselStrings = {"widths":[370,700,1000,1200,1400,2000],"is_logged_in":"","lang":"en","ajaxurl":"https://hillel.dev/wp-admin/admin-ajax.php","nonce":"0ce444d1dd","display_exif":"1","display_comments":"1","single_image_gallery":"1","single_image_gallery_media_file":"","background_color":"black","comment":"Comment","post_comment":"Post Comment","write_comment":"Write a Comment...","loading_comments":"Loading Comments...","image_label":"Open image in full-screen.","download_original":"View full size \u003Cspan class=\"photo-size\"\u003E{0}\u003Cspan class=\"photo-size-times\"\u003E\u00d7\u003C/span\u003E{1}\u003C/span\u003E","no_comment_text":"Please be sure to submit some text with your comment.","no_comment_email":"Please provide an email address to comment.","no_comment_author":"Please provide your name to comment.","comment_post_error":"Sorry, but there was an error posting your comment. Please try again later.","comment_approved":"Your comment was approved.","comment_unapproved":"Your comment is in moderation.","camera":"Camera","aperture":"Aperture","shutter_speed":"Shutter Speed","focal_length":"Focal Length","copyright":"Copyright","comment_registration":"0","require_name_email":"1","login_url":"https://hillelcoren.wordpress.com/wp-login.php?redirect_to=https%3A%2F%2Fhillel.dev%2F2026%2F01%2F02%2Fwhy-event-schedule%2F","blog_id":"4721641","meta_data":["camera","aperture","shutter_speed","focal_length","copyright"],"stats_query_args":"blog=4721641&v=wpcom&tz=2&user_id=0&arch_cat=javascript&arch_results=4&subd=hillelcoren","is_public":"1"};
1576//# sourceURL=jetpack-carousel-js-extra
1577</script>
vendor: 1 bytes, line 1577
1577
1578<script id="sharing-js-js-extra">
1579var sharing_js_options = {"lang":"en","counts":"1","is_stats_active":"1"};
1580//# sourceURL=sharing-js-js-extra
1581</script>
vendor: 1 bytes, line 1581
1581
1582<script crossorigin='anonymous' type='text/javascript'  src='/_static/??-eJydj9EKwjAMRX/ImomD4YP4KaO2Ycts09K0G/69opuKwh58S85NwglMUZnAGTmDLyq60hELDJijNhd1R1M0wc8BSOEla0dkGxLokoPXOZN5bRmnRcio3KNH1aOLmMCSZEgoMbDQiGoki0F+yXaQDaxbfci0xAbOhZwFo1Mogu6tMYOtJ165uow9P/1q/7aRXie02trroyTuZo2TP+6aQ1U11b6uhxsmfZFV'></script>
vendor: 1 bytes, line 1582
1582
1583<script id="sharing-js-js-after">
1584window.WPCOM_sharing_popups = window.WPCOM_sharing_popups || {};
1585window.WPCOM_sharing_popups[ "facebook" ] = "menubar=1,resizable=1,width=600,height=400";
1586window.WPCOM_sharing_popups = window.WPCOM_sharing_popups || {};
1587window.WPCOM_sharing_popups[ "twitter" ] = "menubar=1,resizable=1,width=600,height=350";
1588window.WPCOM_sharing_popups = window.WPCOM_sharing_popups || {};
1589window.WPCOM_sharing_popups[ "linkedin" ] = "menubar=1,resizable=1,width=580,height=450";
1590//# sourceURL=sharing-js-js-after
1591</script>
vendor: 1 bytes, line 1591
1591
1592<script id="wp-emoji-settings" type="application/json">
1593{"baseUrl":"https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/","ext":".png","svgUrl":"https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/svg/","svgExt":".svg","source":{"concatemoji":"/wp-includes/js/wp-emoji-release.min.js?m=1783090810i&ver=7.1.1-alpha-63587"}}
1594</script>
vendor: 1 bytes, line 1594
1594
1595<script type="module">
1596/*! This file is auto-generated */
1597var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))});
1598//# sourceURL=/wp-includes/js/wp-emoji-loader.min.js
1599</script>
1599
1600	<iframe src='https://widgets.wp.com/likes/master.html?ver=20260924#ver=20260924' scrolling='no' id='likes-master' name='likes-master' style='display:none;'></iframe>
1601	<div id='likes-other-gravatars' role="dialog" aria-hidden="true" tabindex="-1"><div class="likes-text"><span>%d</span></div><ul class="wpl-avatars sd-like-gravatars"></ul></div>
1602	
1602<script src="//stats.wp.com/w.js?69" defer></script>
1602 
1602<script type="text/javascript">
1603_tkq = window._tkq || [];
1604_stq = window._stq || [];
1605_tkq.push(['storeContext', {'blog_id':'4721641','blog_tz':'2','user_lang':'en','blog_lang':'en','user_id':'0'}]);
1606		// Prevent sending pageview tracking from WP-Admin pages.
1607		_stq.push(['view', {'blog':'4721641','v':'wpcom','tz':'2','user_id':'0','arch_cat':'javascript','arch_results':'4','subd':'hillelcoren'}]);
1608		_stq.push(['extra', {'crypt':'UE5XaGUuOTlwaD85flAmcm1mcmZsaDhkV11YdWtpP0NsWnVkPS9sL0ViLndld3BuVT01Uj14Ti1yYTBnX3xuYUQ3Qz1oblZbVHV3MTZ6aj0wcy01aFV6Y1RhRDhuPzkwMncsNm1ad0EldTZtNXh1JSxyYW44MzAxMFBndmg2Wy16eVsyMS1CX1JPYl9SVWNkciYwLUNkU3VqUzVZVmJNKzRGRE9meGR6X0I4fEVBNUdKND1EOEhQXU9SWUMtRmd2RG5jSl9lNWovTn4ya1EyUkdhP1NkZ2VXYjUzN1tsMD1bPWhZTD1IJjUzWFkuTUhaP0cvTVkubURnWT1oalE/em40N3cwYmwwTjdrVSU/LldOMUNIc1V8W0hndG9xUVZhQzNfM29SPVV4VEV2fjJxTnphW2QsNC9NMzkrflJJcDdhbF8rTWRaPXFRJW4xOWxiY2Q0PSVrN1UzZjFpPW5T'}]);
1609_stq.push([ 'clickTrackerInit', '4721641', '0' ]);
1610</script>
1610
1611<noscript><img src="https://pixel.wp.com/b.gif?v=noscript" style="height:1px;width:1px;overflow:hidden;position:absolute;bottom:1px;" alt="" /></noscript>
1612<meta id="bilmur" property="bilmur:data" content="" data-provider="wordpress.com" data-service="simple" data-site-tz="Etc/GMT-2" data-custom-props="{&quot;enq_jquery&quot;:&quot;1&quot;,&quot;enq_wp-polyfill&quot;:&quot;1&quot;,&quot;logged_in&quot;:&quot;0&quot;,&quot;wptheme&quot;:&quot;pub\/twentyfifteen&quot;,&quot;wptheme_is_block&quot;:&quot;0&quot;}"   >
1613		
1613<script defer src="/wp-content/js/bilmur.min.js?i=19&amp;m=202639"></script>
1613 	
1614</body>
1615</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.