1<!DOCTYPE html> 2<html lang="en-US" 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://www.craftymind.com/wordpress_49/xmlrpc.php"> 8
8<script> 9(function(html){html.className = html.className.replace(/\bno-js\b/,'js')})(document.documentElement); 10//# sourceURL=twentyfifteen_javascript_detection 11</script>
11 12<title>Cocoa – Craftymind</title> 13<meta name='robots' content='max-image-preview:large' /> 14<link rel="alternate" type="application/rss+xml" title="Craftymind » Feed" href="https://www.craftymind.com/feed/" /> 15<link rel="alternate" type="application/rss+xml" title="Craftymind » Comments Feed" href="https://www.craftymind.com/comments/feed/" /> 16<link rel="alternate" type="application/rss+xml" title="Craftymind » Cocoa Category Feed" href="https://www.craftymind.com/category/cocoa/feed/" /> 17<style id="wp-img-auto-sizes-contain-inline-css"> 18img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px} 19/*# sourceURL=wp-img-auto-sizes-contain-inline-css */ 20</style> 21<style id="wp-emoji-styles-inline-css"> 22 23 img.wp-smiley, img.emoji { 24 display: inline !important; 25 border: none !important; 26 box-shadow: none !important; 27 height: 1em !important; 28 width: 1em !important; 29 margin: 0 0.07em !important; 30 vertical-align: -0.1em !important; 31 background: none !important; 32 padding: 0 !important; 33 } 34/*# sourceURL=wp-emoji-styles-inline-css */ 35</style> 36<style id="wp-block-library-inline-css"> 37: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;
37--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}.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]){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-right-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-left-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-right-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([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}} 38 39/*# sourceURL=/wp-includes/css/dist/block-library/common.min.css */ 40</style> 41<style id="classic-theme-styles-inline-css"> 42/*! This file is auto-generated */ 43.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} 44/*# sourceURL=/wp-includes/css/classic-themes.min.css */ 45</style> 46 47<style id="global-styles-inline-css"> 48: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,
480) 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--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);}: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;}
48.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;} 49/*# sourceURL=global-styles-inline-css */ 50</style> 51 52<link rel='stylesheet' id='twentyfifteen-fonts-css' href='https://www.craftymind.com/wordpress_49/wp-content/themes/twentyfifteen/assets/fonts/noto-sans-plus-noto-serif-plus-inconsolata.css?ver=20230328' media='all' /> 53<link rel='stylesheet' id='genericons-css' href='https://www.craftymind.com/wordpress_49/wp-content/themes/twentyfifteen/genericons/genericons.css?ver=20251101' media='all' /> 54<link rel='stylesheet' id='twentyfifteen-style-css' href='https://www.craftymind.com/wordpress_49/wp-content/themes/twentyfifteen/style.css?ver=20260520' media='all' /> 55<link rel='stylesheet' id='twentyfifteen-block-style-css' href='https://www.craftymind.com/wordpress_49/wp-content/themes/twentyfifteen/css/blocks.css?ver=20240715' media='all' />
56<script id="jquery-core-js" src="https://www.craftymind.com/wordpress_49/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>
vendor: 1 bytes, line 56
56
57<script id="jquery-migrate-js" src="https://www.craftymind.com/wordpress_49/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1"></script>
vendor: 1 bytes, line 57
57
58<script id="twentyfifteen-script-js-extra"> 59var 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"}; 60//# sourceURL=twentyfifteen-script-js-extra 61</script>
vendor: 1 bytes, line 61
61
62<script data-wp-strategy="defer" defer id="twentyfifteen-script-js" src="https://www.craftymind.com/wordpress_49/wp-content/themes/twentyfifteen/js/functions.js?ver=20250729"></script>
62 63<link rel="https://api.w.org/" href="https://www.craftymind.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://www.craftymind.com/wp-json/wp/v2/categories/13" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://www.craftymind.com/wordpress_49/xmlrpc.php?rsd" /> 64<meta name="generator" content="WordPress 7.0.6" /> 65</head> 66 67<body class="archive category category-cocoa category-13 wp-embed-responsive wp-theme-twentyfifteen"> 68<div id="page" class="hfeed site"> 69 <a class="skip-link screen-reader-text" href="#content"> 70 Skip to content </a> 71 72 <div id="sidebar" class="sidebar"> 73 <header id="masthead" class="site-header"> 74 <div class="site-branding"> 75 <p class="site-title"><a href="https://www.craftymind.com/" rel="home" >Craftymind</a></p> 76 <p class="site-description">Hacking away at UI development</p> 77 78 <button class="secondary-toggle">Menu and widgets</button> 79 </div><!-- .site-branding --> 80 </header><!-- .site-header --> 81 82 <div id="secondary" class="secondary"> 83 84 <nav id="site-navigation" class="main-navigation"> 85 <div class="menu-about-container"><ul id="menu-about" class="nav-menu"><li id="menu-item-466" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-466"><a href="https://www.craftymind.com/about/">About</a></li> 86</ul></div> </nav><!-- .main-navigation --> 87 88 89 90 </div><!-- .secondary --> 91 92 </div><!-- .sidebar --> 93 94 <div id="content" class="site-content"> 95 96 <section id="primary" class="content-area"> 97 <main id="main" class="site-main"> 98 99 100 <header class="page-header"> 101 <h1 class="page-title">Category: <span>Cocoa</span></h1> </header><!-- .page-header --> 102 103 104<article id="post-445" class="post-445 post type-post status-publish format-standard hentry category-cocoa category-html category-javascript"> 105 106 <header class="entry-header"> 107 <h2 class="entry-title"><a href="https://www.craftymind.com/adrift/" rel="bookmark">Adrift Released</a></h2> </header><!-- .entry-header --> 108 109 <div class="entry-content"> 110 <p>Today we’re announcing the release of Adrift for iOS. I built this with some excellent design and sound work from <a title="Tack Mobile" href="http://tackmobile.com/">Tack Mobile</a>. You can play an online demo at <a title="Adrift Game" href="http://www.playadrift.com">http://www.playadrift.com</a>Â and download the game from there. The game was built with Cocos2d for the phone, and the site is built using html5 technologies. I’m hoping to write up more posts soon discussing the code and process of building the game.</p> 111 </div><!-- .entry-content --> 112 113 114 <footer class="entry-footer"> 115 <span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://www.craftymind.com/adrift/" rel="bookmark"><time class="entry-date published" datetime="2013-03-06T16:07:48+00:00">March 6, 2013</time><time class="updated" datetime="2013-03-06T16:08:51+00:00">March 6, 2013</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://www.craftymind.com/category/cocoa/" rel="category tag">Cocoa</a>, <a href="https://www.craftymind.com/category/html/" rel="category tag">Html</a>, <a href="https://www.craftymind.com/category/javascript/" rel="category tag">Javascript</a></span> </footer><!-- .entry-footer --> 116 117</article><!-- #post-445 --> 118 119<article id="post-215" class="post-215 post type-post status-publish format-standard hentry category-cocoa tag-apps tag-mac tag-osx"> 120 121 <header class="entry-header"> 122 <h2 class="entry-title"><a href="https://www.craftymind.com/launching-space-gremlin-to-the-mac-app-store/" rel="bookmark">Launching Space Gremlin to the Mac App store</a></h2> </header><!-- .entry-header --> 123 124 <div class="entry-content"> 125 <p style="text-align: left;">Lately I’ve been on a kick…instead of wishing for software to work the way I want, I’m just gonna build it the way I want instead.</p> 126<p style="text-align: left;">Today one of those ideas has come to fruition and I’m happy to announce it’s launch in the new Mac App Store. <a title="Space Gremlin" href="http://www.spacegremlinapp.com">Space Gremlin</a> is an app I wrote over the course of Christmas to visualize disk usage on a hard drive to help find and delete “gremlins” taking up too much space. It features a top down view of a disks folder structure and the relational sizes between other objects. It’s easy to drill in to folders or slice up the view to focus on important areas. While there are other apps out there on the Mac platform that address this concept, I’ve never found those other visualizations very usable or readable.</p> 127<p style="text-align: center;"><img fetchpriority="high" decoding="async" title="Space Gremlin Sample" src="http://www.spacegremlinapp.com/intro.png" alt="" width="578" height="433" /></p> 128<p>I’m hoping other people out there find Space Gremlin as usable as I do, so I’ve added it to the new Mac App Store to handle the distribution end. Since this is the launch and I’m still new to the whole Mac App ecosystem, I’m setting a launch price of only $3.99 but it will probably settle at a higher price soon after. I’ve also decided to go exclusive to the Mac App Store to avoid setting up my own purchasing and validation system.</p> 129<p>Give it a try and let me know what you think. Big thanks to all the fellow developers and designers at <a href="http://www.effectiveui.com">
129EffectiveUI </a>who helped me test this app. If you’re interested there is also a free demo available on the website <a href="http://www.spacegremlinapp.com">http://www.spacegremlinapp.com</a></p> 130 </div><!-- .entry-content --> 131 132 133 <footer class="entry-footer"> 134 <span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://www.craftymind.com/launching-space-gremlin-to-the-mac-app-store/" rel="bookmark"><time class="entry-date published" datetime="2011-02-07T09:04:10+00:00">February 7, 2011</time><time class="updated" datetime="2014-10-16T19:31:13+01:00">October 16, 2014</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://www.craftymind.com/category/cocoa/" rel="category tag">Cocoa</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://www.craftymind.com/tag/apps/" rel="tag">apps</a>, <a href="https://www.craftymind.com/tag/mac/" rel="tag">mac</a>, <a href="https://www.craftymind.com/tag/osx/" rel="tag">osx</a></span><span class="comments-link"><a href="https://www.craftymind.com/launching-space-gremlin-to-the-mac-app-store/#comments">2 Comments<span class="screen-reader-text"> on Launching Space Gremlin to the Mac App store</span></a></span> </footer><!-- .entry-footer --> 135 136</article><!-- #post-215 --> 137 138<article id="post-203" class="post-203 post type-post status-publish format-standard hentry category-cocoa"> 139 140 <header class="entry-header"> 141 <h2 class="entry-title"><a href="https://www.craftymind.com/mac-app-store-hacked-how-developers-can-better-protect-themselves/" rel="bookmark">Mac app store hacked, how developers can better protect themselves</a></h2> </header><!-- .entry-header --> 142 143 <div class="entry-content"> 144 <p>Crude instructions have started showing up online with ways to circumvent Apples Mac App store receipt validation. By simply copying receipt and info.plist data from a free app and pasting it into a paid app, you can run apps copied from friends computers or bittorrent. I myself have a copy of a paid app (not angry birds, but one with stronger protection) running on my system that was purchased by a friend. This is a massive failure in the implementation of Apples receipt system.</p> 145<p>So why are all of the app store developers in this position? Apples current documentation on how to validate receipts is fairly complex, but the sample code and Apple own instructions ask developers to validate against data that is entirely external to the binary itself. Worse yet, it instructs developers to validate against plain text data easily editable with any text editor.</p> 146<p>If you are an app store developer and you are using apples default security logic, you need to review these validation steps in your code</p> 147<ul> 148<li>Verify that the receipt bundle identifier matches the value for CFBundleIdentifier in the Info.plist file. If they do not match, verification fails.</li> 149<li>Verify that the version identifier string in the receipt matches the value for CFBundleShortVersionString in the Info.plist file. If they do not match, verification fails.</li> 150</ul> 151<p>And change them to be more in line with this</p> 152<ul> 153<li>Verify that the receipt bundle identifier matches the value for CFBundleIdentifier that you <strong>hard code</strong> into your application.</li> 154<li>Verify that the version identifier string in the receipt matches the value for CFBundleShortVersionString <strong>hard coded</strong> into your application. If they do not match, verification fails.</li> 155</ul> 156<p>At the end of the day, if your app is popular enough it’s going to end up on a pirated site, but for the time being, by following the instructions above, you can avoid having your app easily cracked with TextEdit. For those interested, Angry Birds only implemented 2 of Apples suggested validation steps, so the pastebin instructions will only work for Angry Birds, you need to do a little bit more for apps that handle all 5 validation steps.</p> 157<p>Update, if you are using <a href="https://github.com/roddi/ValidateStoreReceipt/blob/master/validatereceipt.m">roddi’s receipt checking code</a> from github, here are the offending lines you need to change.</p> 158<pre>BOOL validateReceiptAtPath(NSString * path) 159{ 160 ... 161 bundleVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; 162 bundleIdentifer = [[NSBundle mainBundle] bundleIdentifier]; 163 ... 164} 165</pre> 166 </div><!-- .entry-content --> 167 168 169 <footer class="entry-footer"> 170 <span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://www.craftymind.com/mac-app-store-hacked-how-developers-can-better-protect-themselves/" rel="bookmark"><time class="entry-date published" datetime="2011-01-06T19:13:34+00:00">January 6, 2011</time><time class="updated" datetime="2011-01-07T06:44:41+00:00">January 7, 2011</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://www.craftymind.com/category/cocoa/" rel="category tag">Cocoa</a></span><span class="comments-link"><a href="https://www.craftymind.com/mac-app-store-hacked-how-developers-can-better-protect-themselves/#comments">22 Comments<span class="screen-reader-text"> on Mac app store hacked, how developers can better protect themselves</span></a></span> </footer><!-- .entry-footer --> 171 172</article><!-- #post-203 --> 173 174 <nav class="navigation pagination" aria-label="Posts pagination"> 175 <h2 class="screen-reader-text">Posts pagination</h2> 176 <div class="nav-links"><span aria-current="page" class="page-numbers current"><span class="meta-nav screen-reader-text">Page </span>1</span> 177<a class="page-numbers" href="https://www.craftymind.com/category/cocoa/page/2/"><span class="meta-nav screen-reader-text">Page </span>2</a> 178<a class="page-numbers" href="https://www.craftymind.com/category/cocoa/page/3/"><span class="meta-nav screen-reader-text">Page </span>3</a> 179<a class="next page-numbers" href="https://www.craftymind.com/category/cocoa/page/2/">Next page</a></div> 180 </nav> 181 </main><!-- .site-main --> 182 </section><!-- .content-area --> 183 184 185 </div><!-- .site-content --> 186 187 <footer id="colophon" class="site-footer"> 188 <div class="site-info"> 189 <a href="https://wordpress.org/" class="imprint"> 190 Proudly powered by WordPress </a> 191 </div><!-- .site-info --> 192 </footer><!-- .site-footer --> 193 194</div><!-- .site --> 195
196<script type="speculationrules"> 197{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wordpress_49/wp-*.php","/wordpress_49/wp-admin/*","/wordpress_49/wp-content/uploads/*","/wordpress_49/wp-content/*","/wordpress_49/wp-content/plugins/*","/wordpress_49/wp-content/themes/twentyfifteen/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} 198</script>
vendor: 1 bytes, line 198
198
199<script id="wp-emoji-settings" type="application/json"> 200{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://www.craftymind.com/wordpress_49/wp-includes/js/wp-emoji-release.min.js?ver=7.0.6"}} 201</script>
vendor: 1 bytes, line 201
201
202<script type="module"> 203/*! This file is auto-generated */ 204var 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)))}); 205//# sourceURL=https://www.craftymind.com/wordpress_49/wp-includes/js/wp-emoji-loader.min.js 206</script>
206 207 208</body> 209</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.