{"id":16713,"date":"2025-09-12T13:47:47","date_gmt":"2025-09-12T13:47:47","guid":{"rendered":"https:\/\/oschk.org\/?page_id=16713"},"modified":"2026-06-25T05:46:01","modified_gmt":"2026-06-25T05:46:01","slug":"citywide-fundraising-events","status":"publish","type":"page","link":"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/","title":{"rendered":"Citywide Fundraising Events"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"16713\" class=\"elementor elementor-16713\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-91c8262 e-flex e-con-boxed e-con e-parent\" data-id=\"91c8262\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-a2c8843 e-con-full e-flex e-con e-child\" data-id=\"a2c8843\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-6d7101c e-con-full e-flex e-con e-child\" data-id=\"6d7101c\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ba1bb3d elementor-widget elementor-widget-heading\" data-id=\"ba1bb3d\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><span data-metadata=\"&lt;!--(figmeta)eyJmaWxlS2V5IjoiZnNuYkl1c0xBYkszdWdCTjF1ajJtYiIsInBhc3RlSUQiOjYwNjQ1Nzc0NywiZGF0YVR5cGUiOiJzY2VuZSJ9Cg==(\/figmeta)--&gt;\"><\/span>Citywide<br>Fundraising Events<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a01aff2 elementor-widget__width-initial corporate-title-text elementor-widget elementor-widget-text-editor\" data-id=\"a01aff2\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Each year, Operation Santa Claus launches its public fundraising campaign ahead of Christmas, celebrating a season of caring, sharing, and giving. Here is a range of donor-led fundraising events welcoming public participation to support those in need across Hong Kong.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e653d3f e-con-full featured-events-warpper e-flex e-con e-child\" data-id=\"e653d3f\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2e66b1c elementor-widget elementor-widget-heading\" data-id=\"2e66b1c\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Featured Events<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f458e75 e-con-full fundraise-slider e-flex e-con e-child\" data-id=\"f458e75\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-bf6951e e-con-full e-flex e-con e-child\" data-id=\"bf6951e\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-01b6ce9 elementor-widget elementor-widget-shortcode\" data-id=\"01b6ce9\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><div id=\"metaslider-id-9000\" style=\"max-width: 900px; margin: 0 auto;\" class=\"ml-slider-3-100-1 metaslider metaslider-flex metaslider-9000 ml-slider ms-theme-default\" role=\"region\" aria-label=\"Citywide Fundraising Events Slideshow\" data-height=\"600\" data-width=\"900\">\n    <div id=\"metaslider_container_9000\">\n        <div id=\"metaslider_9000\">\n            <ul aria-live='polite' class='slides'>\n                <li style=\"display: block; width: 100%;\" class=\"slide-9001 ms-image \" aria-roledescription=\"slide\" data-date=\"2025-08-26 07:33:35\"><a href=\"\/event-details\/5-a-side-footballtournament\/\" target=\"_self\" aria-label=\"View Slide Details\" class=\"metaslider_image_link\"><img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/carousel-img-desktop-3-1-789x526.png\" height=\"600\" width=\"900\" alt=\"\" class=\"slider-9000 slide-9001 msDefaultImage\" title=\"carousel-img-desktop (3) 1\" \/><\/a><div class=\"caption-wrap\"><div class=\"caption\"><div class=\"caption-wrapper\"><img decoding=\"async\" class=\"caption-icon\" style=\"width:320px;height:200px;\" src=\"\/wp-content\/uploads\/2025\/11\/Ellipse-1.svg\" alt=\"\" \/> <div class=\"slider-text\"><a style=\"color:#FFFFFF;\" href=\"\/event-details\/5-a-side-footballtournament\/\"> 5-A-Side Football Tournament <\/a><\/div> <\/div><\/div><\/div><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-9002 ms-image \" aria-roledescription=\"slide\" data-date=\"2025-08-26 07:33:49\"><a href=\"\/event-details\/tabletennistournament\/\" target=\"_self\" aria-label=\"View Slide Details\" class=\"metaslider_image_link\"><img decoding=\"async\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/Frame-18-608x405.png\" height=\"600\" width=\"900\" alt=\"\" class=\"slider-9000 slide-9002 msDefaultImage\" title=\"Frame (18)\" \/><\/a><div class=\"caption-wrap\"><div class=\"caption\"><div class=\"caption-wrapper\"><img decoding=\"async\" class=\"caption-icon\" style=\"width:320px;height:200px;\" src=\"\/wp-content\/uploads\/2025\/11\/Ellipse-1.svg\" alt=\"\" \/> <div class=\"slider-text\"><a style=\"color:#FFFFFF;\" href=\"\/event-details\/tabletennistournament\/\"> OSC Charity Table Tennis Tournament <\/a><\/div> <\/div><\/div><\/div><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-12476 ms-image \" aria-roledescription=\"slide\" data-date=\"2025-09-05 05:54:23\"><a href=\"\/event-details\/wingdingcharitytournament\/\" target=\"_self\" aria-label=\"View Slide Details\" class=\"metaslider_image_link\"><img decoding=\"async\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/4-Wing-Ding-Squash_2-900x600.jpg\" height=\"600\" width=\"900\" alt=\"\" class=\"slider-9000 slide-12476 msDefaultImage\" title=\"4 Wing Ding Squash_2\" \/><\/a><div class=\"caption-wrap\"><div class=\"caption\"><div class=\"caption-wrapper\"><img decoding=\"async\" class=\"caption-icon\" style=\"width:320px;height:200px;\" src=\"\/wp-content\/uploads\/2025\/11\/Ellipse-1.svg\" alt=\"\" \/> <div class=\"slider-text\"><a style=\"color:#FFFFFF;\" href=\"\/event-details\/wingdingcharitytournament\/\"> The 27th Wing Ding Charity Tournament <\/a><\/div> <\/div><\/div><\/div><\/li>\n            <\/ul>\n        <\/div>\n        \n    <\/div>\n<\/div><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c51704f elementor-widget elementor-widget-html\" data-id=\"c51704f\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\n\/* title red ball*\/\n.metaslider .caption-wrap{\n    text-align: center;\n    place-items: center;\n    opacity: 1 !important;\n    background: transparent !important;\n}\n.metaslider .caption-wrap .caption-wrapper{\n    position: absolute;\n    bottom: 0;\n    right: 0;\n}\n\n.metaslider .caption-wrap .caption .slider-text{\n    font-family: Montserrat Alternates;\n    font-weight: 700;\n    font-style: Bold;\n    font-size: 32px;\n    line-height: 120%;\n    text-align: center;\n    max-width: 219px;\n    position: absolute;\n    top: 57%;\n    transform: translateY(-50%);\n    text-align: center;\n    right: 56px;\n}\n\n\/* Hide play\/pause button *\/\n.flex-pauseplay{ display:none; }\n\n\/* fundraise-slider *\/\n.fundraise-slider{\n    gap: 0;\n}\n\/* Dots wrapper: center align + spacing from image *\/\n#metaslider_9000 .flex-control-nav{\n  position: initial !important;\n  margin: 32px 0 0 0 !important;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  gap: 8px; \n  line-height: 0;\n  list-style: none;\n  padding: 0;\n}\n\n\/* Fixed size container for each dot to avoid shifting when active state changes size *\/\n#metaslider_9000 .flex-control-nav li{\n  width: 12px;\n  height: 12px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n\/* Dot styles (square) *\/\n.metaslider .flex-control-nav li a{\n  width: 4px !important;\n  height: 4px !important;\n  background: #BAB4B4 !important;\n  border-radius: 0 !important;\n  margin: 0 !important;    \/* Use gap above for spacing *\/\n  display: block;\n}\n.metaslider .flex-control-nav li a.flex-active{\n  width: 6px !important;\n  height: 6px !important;\n  background: #DE3340 !important;\n}\n\n\/* Outer container: max width 1200px, center align; hide initially to avoid flash before positioning *\/\n#metaslider_9000{\n  max-width: 1200px;\n  margin: 0 auto;\n}\n\n\/* Allow partial slides to show on the sides *\/\n#metaslider_9000 .flex-viewport{ overflow: visible !important; }\n\n\/* Each slide fixed at 900px wide, no margin\/padding on li (keeps FlexSlider math correct) *\/\n#metaslider_9000 .slides > li{\n  width: 900px !important;\n  margin: 0 !important;\n  box-sizing: border-box;\n  overflow: hidden;\n}\n\n\/* Apply 16px horizontal visual spacing inside the image itself (does not affect li width) *\/\n#metaslider_9000 .slides img{\n  width: calc(100% - 16px); \n  margin: 0 8px; \n  display: block;\n  height: auto;\n  object-fit: cover;\n}\n\n\/* Below 1024px: slide width becomes 600px (JS will recalc so dots stay aligned) *\/\n@media (max-width: 1024px){\n  #metaslider_9000 .slides > li{\n    max-width: 600px !important;\n  }\n  .metaslider{\n      max-width: 600px !important;\n  }\n  \/* Adjust dots margin for smaller layout *\/\n  #metaslider_9000 .flex-control-nav{\n    margin: 24px 0 0 0 !important;\n  }\n  .caption-icon {\n      width: auto !important;\n      max-width: 220px!important;\n      height: auto !important;\n  }\n  .metaslider .caption-wrap .caption .slider-text{\n      font-size: 22px;\n      width: 157px;\n      bottom: 27px;\n      right: 39px;\n  }\n}\n\n\/* Below 767px: slide width becomes 320px *\/\n@media (max-width: 767px){\n  #metaslider_9000 .slides > li{\n    max-width: 320px !important;\n  }\n  .metaslider{\n      max-width: 320px !important;\n  }\n  #metaslider_9000 .slides img{\n      width: calc(100% - 8px);\n      margin: 0 4px; \n    }\n  \/* Adjust dots margin for smaller layout *\/\n  #metaslider_9000 .flex-control-nav{\n    margin: 16px 0 0 0 !important;\n  }\n.caption-icon {\n      max-width: 140px!important;\n  }\n  .metaslider .caption-wrap .caption .slider-text{\n      font-size: 13px;\n      width: 94.5px;\n      bottom: 13px;\n      right: 27px;\n  }\n}\n#metaslider_9000 .slides > li .caption-wrapper{\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  transform: translateY(100%); \n  z-index: 5;\n  transition: transform 1.5s cubic-bezier(.2,.8,.2,1);\n  will-change: transform;\n}\n\n#metaslider_9000 .slides > li.flex-active-slide:not(.clone) .caption-wrapper{\n  transform: translateY(0); \n  transition-delay: .2s;\n}\n\n#metaslider_9000 .slides > li[aria-hidden=\"true\"] .caption-wrapper,\n#metaslider_9000 .slides > li.clone .caption-wrapper{\n  transform: translateY(100%);\n}\n.metaslider .caption-wrap .caption-wrapper{\n  position:absolute;\n  bottom:0;\n  right:0;\n}\n\n.caption-icon{\n  display:block;\n}\n\n.metaslider .caption-wrap .caption .slider-text{\n  position:absolute;\n  top:57%;\n  left:50%;\n  transform:translate(-50%,-50%);\n  bottom:auto;\n  right:auto;\n  z-index:1;\n  margin:0;\n  text-align:center;\n  font-family:Montserrat Alternates;\n  font-weight:700;\n  font-size:32px;\n  line-height:120%;\n  width:219px;\n  max-width:219px;\n}\n\n\/* \u22641024px *\/\n@media (max-width:1024px){\n  .metaslider .caption-wrap .caption .slider-text{\n    font-size:22px;\n    width:157px;\n    max-width:157px;\n      top:57%;\n  }\n}\n\n\/* \u2264767px *\/\n@media (max-width:767px){\n  .metaslider .caption-wrap .caption .slider-text{\n    font-size:13px;\n    width:94.5px;\n    max-width:94.5px;\n      top:57%;\n  }\n}\n<\/style>\n\n<script>\n\n(function($){\n  var ID    = 9000;\n  var TICK  = 5000;\n  var DEBUG = true;\n  var timer = null; \n  var ro    = null; \n  var tries = 0, maxTries = 100;\n  var lastVPWidth = null;\n  var rafPending  = false; \n  function log(){ if (!DEBUG) return; console.log('[MS'+ID+']', ...arguments); }\n\n  function $slider(){ return $('#metaslider_' + ID); }\n  function inst(){ var s=$slider(); return s.length ? s.data('flexslider') : null; }\n\n  \/\/ ---- Layout helper ----\n  function centerByPadding(){\n    var $fs = $slider();\n    var $vp = $fs.find('.flex-viewport');\n    var $li = $fs.find('.slides > li').first();\n    if(!$vp.length || !$li.length) return;\n\n    var vw = Math.round($vp.innerWidth());\n    var sw = Math.round($li.outerWidth());\n    if (!sw) return;\n\n    var pad = Math.max(0, Math.round((vw - sw)\/2));\n    $fs.find('.slides').css({ paddingLeft: pad+'px', paddingRight: pad+'px' });\n  }\n\n  \/\/ ---- Resync ----\n  function resync(){\n    var i = inst();\n    if (!i) return;\n    var idx   = i.currentSlide;\n    var speed = i.vars.animationSpeed || 600;\n    i.vars.animationSpeed = 0;\n    if (typeof i.resize === 'function')    i.resize();\n    if (typeof i.doMath === 'function')    i.doMath();\n    if (typeof i.flexAnimate === 'function') i.flexAnimate(idx);\n    i.vars.animationSpeed = speed;\n    centerByPadding();\n  }\n\n  \/\/ ---- Autoplay ----\n  function startLoop(){\n    stopLoop();\n    timer = setInterval(function(){\n      var i = inst();\n      if (!i || i.animating) return;\n      var count = i.count || (i.slides ? i.slides.length : 0);\n      if (!count) return;\n      var next = (typeof i.getTarget === 'function')\n                  ? i.getTarget('next')\n                  : ((i.currentSlide + 1) % count);\n      i.flexAnimate && i.flexAnimate(next);\n    }, TICK);\n    log('autoplay started');\n  }\n  function stopLoop(){\n    if (timer){ clearInterval(timer); timer = null; log('autoplay stopped'); }\n  }\n  function restartLoop(){\n    stopLoop();\n    startLoop();\n    log('autoplay restarted');\n  }\n\n  \/\/ ---- Resize observer ----\n  function bindResizeObserver(){\n    var $fs = $slider();\n    var vp = $fs.find('.flex-viewport').get(0);\n    if (ro) { ro.disconnect(); ro = null; }\n\n    if (vp && 'ResizeObserver' in window){\n      ro = new ResizeObserver(function(entries){\n        var rect = entries[0].contentRect;\n        var vw = Math.round(rect.width);\n        if (vw === lastVPWidth) return;\n        lastVPWidth = vw;\n        if (rafPending) return;\n        rafPending = true;\n        requestAnimationFrame(function(){ resync(); rafPending = false; });\n      });\n      ro.observe(vp);\n    }else{\n      $(window).off('.ms'+ID).on('resize.ms'+ID+' orientationchange.ms'+ID, function(){\n        var $vp = $slider().find('.flex-viewport');\n        if (!$vp.length) return;\n        var vw = Math.round($vp.innerWidth());\n        if (vw === lastVPWidth) return;\n        lastVPWidth = vw;\n        if (rafPending) return;\n        rafPending = true;\n        requestAnimationFrame(function(){ resync(); rafPending = false; });\n      });\n    }\n  }\n\n  \/\/ ---- Init ----\n  function init(){\n    var $fs = $slider();\n    if (!$fs.length) return false;\n    var i = inst();\n    if (!i){\n      if (++tries <= maxTries) return false;\n      return false;\n    }\n    if ($fs.data('msPatched')) return true;\n\n    i.vars.slideshow = false;\n    i.pause && i.pause();\n    i.paused = true;\n    i.manualPause = false;\n\n    \/\/ baseline layout\n    centerByPadding();\n    $fs.css('visibility','visible');\n\n    var S = i.vars.start, B = i.vars.before, A = i.vars.after;\n    i.vars.start  = function(){ centerByPadding(); S && S.apply(this, arguments); };\n    i.vars.before = function(){ centerByPadding(); B && B.apply(this, arguments); };\n    i.vars.after  = function(){ centerByPadding(); A && A.apply(this, arguments); };\n\n\n    $fs.off('.keepAlive')\n       .on('click.keepAlive touchend.keepAlive', '.flex-control-nav a, .flex-direction-nav a', function(){\n          setTimeout(function(){ \n            resync();\n            restartLoop(); \n          }, 0);\n       });\n\n    bindResizeObserver();\n    startLoop();\n\n    $fs.data('msPatched', true);\n    return true;\n  }\n\n  $(function(){\n    var iv = setInterval(function(){ if (init()) clearInterval(iv); }, 120);\n    $(window).on('load', function(){ if (!$slider().data('msPatched')) init(); });\n  });\n})(jQuery);\ndocument.addEventListener('DOMContentLoaded', () => {\n  const map = {\n    'OSC Charity Table Tennis Tournament': '\/event-details\/tabletennistournament\/',\n    'The 27th Wing Ding Charity Tournament': '\/event-details\/wingdingcharitytournament\/'\n  };\n\n  document.querySelectorAll('.slider-text').forEach(el => {\n    const text = el.textContent.trim();\n\n    if (map[text] && !el.querySelector('a')) {\n      el.innerHTML = `<a style=\"color:#FFFFFF;\" href=\"${map[text]}\">${text}<\/a>`;\n    }\n  });\n});\n\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-07d26d6 e-con-full e-flex e-con e-child\" data-id=\"07d26d6\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-4646a87 e-con-full events-wrapper e-flex e-con e-child\" data-id=\"4646a87\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-f29cbaa e-con-full filter_sort_wrapper e-flex e-con e-child\" data-id=\"f29cbaa\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-228b2ce e-con-full elementor-hidden-desktop elementor-hidden-tablet e-flex e-con e-child\" data-id=\"228b2ce\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9f7ee79 elementor-widget elementor-widget-image\" data-id=\"9f7ee79\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"28\" height=\"24\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/Vector-1.png\" class=\"attachment-full size-full wp-image-26478\" alt=\"\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-eda8559 selector-title elementor-widget elementor-widget-heading\" data-id=\"eda8559\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Filters<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9e8f6aa e-con-full e-flex e-con e-child\" data-id=\"9e8f6aa\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-5dc87b2 e-con-full elementor-hidden-mobile event-type-selector e-flex e-con e-child\" data-id=\"5dc87b2\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7b1d437 selector-title elementor-widget__width-initial elementor-widget elementor-widget-heading\" data-id=\"7b1d437\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Event Type<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-edeb1e6 elementor-widget elementor-widget-image\" data-id=\"edeb1e6\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"32\" height=\"32\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/icon_arrow3_24x24.png\" class=\"attachment-full size-full wp-image-26479\" alt=\"\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-78fe0a0 e-con-full selector-wrapper e-flex e-con e-child\" data-id=\"78fe0a0\" data-element_type=\"container\" data-settings=\"{&quot;position&quot;:&quot;absolute&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-aaea47c todo-list elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"aaea47c\" data-element_type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Art & Music<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"http:\/\/Special%20events\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Special Events<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"http:\/\/Christmas%20bazaars\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-times\" viewBox=\"0 0 352 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Christmas Bazaars<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"http:\/\/Sports\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-dot-circle\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm80 248c0 44.112-35.888 80-80 80s-80-35.888-80-80 35.888-80 80-80 80 35.888 80 80z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Sports<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-17f2e9c e-con-full elementor-hidden-mobile date-selector e-flex e-con e-child\" data-id=\"17f2e9c\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-37f3dc8 selector-title elementor-widget elementor-widget-heading\" data-id=\"37f3dc8\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Year<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-38bc502 elementor-widget elementor-widget-image\" data-id=\"38bc502\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"32\" height=\"32\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/icon_arrow3_24x24.png\" class=\"attachment-full size-full wp-image-26479\" alt=\"\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3b46ea7 e-con-full selector-wrapper e-flex e-con e-child\" data-id=\"3b46ea7\" data-element_type=\"container\" data-settings=\"{&quot;position&quot;:&quot;absolute&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-40faf78 todo-list elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"40faf78\" data-element_type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">2025<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">2024<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-times\" viewBox=\"0 0 352 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">2023<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-dot-circle\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm80 248c0 44.112-35.888 80-80 80s-80-35.888-80-80 35.888-80 80-80 80 35.888 80 80z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">2022<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-dcdddb4 e-con-full elementor-hidden-mobile e-flex e-con e-child\" data-id=\"dcdddb4\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-4e11e11 e-con-full e-flex e-con e-child\" data-id=\"4e11e11\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e27e00d elementor-widget__width-initial elementor-widget elementor-widget-heading\" data-id=\"e27e00d\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Sort by:<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-026686a e-con-full event-toggle e-flex e-con e-child\" data-id=\"026686a\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ba11c0d elementor-widget__width-initial elementor-widget elementor-widget-heading\" data-id=\"ba11c0d\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Oldest<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fa1ef88 elementor-widget elementor-widget-image\" data-id=\"fa1ef88\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"32\" height=\"32\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/icon_arrow3_24x24.png\" class=\"attachment-full size-full wp-image-26479\" alt=\"\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-eb4f54a e-con-full selector-wrapper e-flex e-con e-child\" data-id=\"eb4f54a\" data-element_type=\"container\" data-settings=\"{&quot;position&quot;:&quot;absolute&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bce6dab todo-list elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"bce6dab\" data-element_type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Newest<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-times\" viewBox=\"0 0 352 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Oldest<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c7692a1 elementor-widget elementor-widget-shortcode\" data-id=\"c7692a1\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><div class='mc-event-list-container'><ul id='upcoming-events-12b38fcdbcc2faa615cb7dc7725c5537' class='mc-event-list upcoming-events list-events'>\n<li class=\"mc-mc_upcoming_206 upcoming-event mc_sports mc_no-location past-event mc_primary_sports nonrecurring mc-4-days mc-start-00-00 ungrouped mc-event-30 mc-events multidate mc_rel_eventsen mc_rel_sports\"><div class=\"mc-card\" data-mc-id=\"30\" data-title=\"Link Hong Kong Open\" data-start=\"{dtstart format='c'}\" data-end=\"{dtend format='c'}\" data-location=\"\" data-presented=\"Hong Kong Golf Club\" data-tickets=\"https:\/\/thehongkongopen.com\/\">\r\n  <div class=\"mc-desc mc-desc-source\" hidden aria-hidden=\"true\"><div class=\"what-event\">\n<p>The inaugural Hong Kong Open took place in 1959, and the Club has played host to it every year since. Indeed, along with the Masters Tournament at Augusta National, the Hong Kong Open is one of only two professional golf tournaments that have been held at the same venue every year for more than half a century.<\/p>\n<div class=\"space\"><\/div>\n<p>Since 1987, the Hong Kong Golf Club has hosted its own charity golf event \u2013 the annual Cup of Kindness. Traditionally held in the latter months of the year and involving the participation of hundreds of the Club\u2019s members, the Cup of Kindness draws sponsorship from a broad spectrum of Hong Kong companies to help raise much-needed funds for Operation Santa Claus.<\/p>\n<\/div>\n<div class=\"venue\">Hong Kong Golf Club, Fanling<\/div>\n<\/div>\r\n\r\n  <a class=\"mc-card__thumb osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/link-hong-kong-open\/?mc_id=206\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/link-hong-kong-open\/?mc_id=206\">\r\n    <img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"534\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/2-OSC_Golf-Club_1-1024x683.jpg\" class=\"mc-image wp-post-image\" alt=\"\" srcset=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/2-OSC_Golf-Club_1-1024x683.jpg 1024w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/2-OSC_Golf-Club_1-300x200.jpg 300w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/2-OSC_Golf-Club_1-768x512.jpg 768w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/2-OSC_Golf-Club_1.jpg 1500w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\r\n  <\/a>\r\n\r\n  <div class=\"mc-card-wrapper\">\r\n<div class=\"mc-card__presented\" data-presented=\"Hong Kong Golf Club\">\r\n  <span class=\"i18n-en\">Presented by Hong Kong Golf Club<\/span>\r\n\r\n<\/div>\r\n    <h3 class=\"mc-card__title\">\r\n      <a href=\"https:\/\/oschk.org\/zh\/mc-events\/link-hong-kong-open\/?mc_id=206\">Link Hong Kong Open<\/a>\r\n    <\/h3>\r\n\r\n    <dl class=\"mc-card__meta\">\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"date\">Date\r\n<\/dt>\r\n<dd class=\"mc-card__date\">12:00am, 30 Oct 2025 - 12:00am, 3 Nov 2025<\/dd>\r\n\r\n\r\n      <\/div>\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"venue\">Venue\r\n<\/dt>\r\n        <dd class=\"mc-card__venue\"><\/dd>\r\n      <\/div>\r\n    <\/dl>\r\n  <\/div>\r\n\r\n<p class=\"mc-card__cta\">\r\n  <a class=\"mc-btn osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/link-hong-kong-open\/?mc_id=206\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/link-hong-kong-open\/?mc_id=206\">\r\n    <span class=\"i18n-en\">Learn More<\/span>\r\n    <span class=\"i18n-zh\">\u4e86\u89e3\u66f4\u591a<\/span>\r\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/09\/learn_more_arrow.png\" alt=\"icon\" style=\"width:16px;height:16px\" \/>\r\n  <\/a>\r\n<\/p>\r\n<\/div><\/li>\n\n<li class=\"mc-mc_upcoming_228 upcoming-event mc_sports mc_no-location past-event mc_primary_sports nonrecurring mc-1-month mc-start-00-00 ungrouped mc-event-25 mc-events multidate mc_rel_eventsen mc_rel_sports\"><div class=\"mc-card\" data-mc-id=\"25\" data-title=\"CRC OPEN\" data-start=\"{dtstart format='c'}\" data-end=\"{dtend format='c'}\" data-location=\"\" data-presented=\"Chinese Recreation Club, Hong Kong\" data-tickets=\"http:\/\/www.crcopen.com\/\">\r\n  <div class=\"mc-desc mc-desc-source\" hidden aria-hidden=\"true\"><div class=\"what-event\">The CRC Open is an annual tennis tournament hosted by the Chinese Recreation Club in Hong Kong, which serves as a major local tennis event that awards ranking points. This year, the CRC Open is the 77th edition of the tournament. The CRC Open also represents a chance to show how much the CRC cares for the community. This year, the tournament continues its partnership with Operation Santa Claus as one of the beneficiary organisations, donating HK$250 for every ace hit during main draw matches officiated by chair umpires to these two charity partners in support of the underprivileged.<\/div>\n<div class=\"venue\">Chinese Recreation Club, Tai Hang<\/div>\n<\/div>\r\n\r\n  <a class=\"mc-card__thumb osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/crc-open\/?mc_id=228\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/crc-open\/?mc_id=228\">\r\n    <img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"534\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/1-OSC_Chinese-Recreation-Club_Tennis-Open-1024x683.jpg\" class=\"mc-image wp-post-image\" alt=\"\" srcset=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/1-OSC_Chinese-Recreation-Club_Tennis-Open-1024x683.jpg 1024w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/1-OSC_Chinese-Recreation-Club_Tennis-Open-300x200.jpg 300w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/1-OSC_Chinese-Recreation-Club_Tennis-Open-768x512.jpg 768w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/1-OSC_Chinese-Recreation-Club_Tennis-Open.jpg 1500w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\r\n  <\/a>\r\n\r\n  <div class=\"mc-card-wrapper\">\r\n<div class=\"mc-card__presented\" data-presented=\"Chinese Recreation Club, Hong Kong\">\r\n  <span class=\"i18n-en\">Presented by Chinese Recreation Club, Hong Kong<\/span>\r\n\r\n<\/div>\r\n    <h3 class=\"mc-card__title\">\r\n      <a href=\"https:\/\/oschk.org\/zh\/mc-events\/crc-open\/?mc_id=228\">CRC OPEN<\/a>\r\n    <\/h3>\r\n\r\n    <dl class=\"mc-card__meta\">\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"date\">Date\r\n<\/dt>\r\n<dd class=\"mc-card__date\">12:00am, 1 Nov 2025 - 12:00am, 8 Dec 2025<\/dd>\r\n\r\n\r\n      <\/div>\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"venue\">Venue\r\n<\/dt>\r\n        <dd class=\"mc-card__venue\"><\/dd>\r\n      <\/div>\r\n    <\/dl>\r\n  <\/div>\r\n\r\n<p class=\"mc-card__cta\">\r\n  <a class=\"mc-btn osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/crc-open\/?mc_id=228\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/crc-open\/?mc_id=228\">\r\n    <span class=\"i18n-en\">Learn More<\/span>\r\n    <span class=\"i18n-zh\">\u4e86\u89e3\u66f4\u591a<\/span>\r\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/09\/learn_more_arrow.png\" alt=\"icon\" style=\"width:16px;height:16px\" \/>\r\n  <\/a>\r\n<\/p>\r\n<\/div><\/li>\n\n<li class=\"mc-mc_upcoming_49 upcoming-event mc_sports mc_no-location past-event mc_primary_sports nonrecurring mc-11-hours mc-start-09-30 ungrouped mc-event-14 mc-events mc_rel_eventsen mc_rel_sports\"><div class=\"mc-card\" data-mc-id=\"14\" data-title=\"OSC X Hong Kong Football Club 5-a-side Football Tournament\" data-start=\"{dtstart format='c'}\" data-end=\"{dtend format='c'}\" data-location=\"\" data-presented=\"OSC and Hong Kong Football Club\" data-tickets=\"https:\/\/pre-dev-osc.scmp.work\/event-details\/5-a-side-footballtournament\">\r\n  <div class=\"mc-desc mc-desc-source\" hidden aria-hidden=\"true\"><div class=\"featured-events\">Featured Events-1<\/div>\n<div class=\"venue\">Pitch 8, Happy Valley Sportsground<\/div>\n<\/div>\r\n\r\n  <a class=\"mc-card__thumb osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/osc-x-hong-kong-football-club-5-a-side-football-tournament\/?mc_id=49\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/osc-x-hong-kong-football-club-5-a-side-football-tournament\/?mc_id=49\">\r\n    <img loading=\"lazy\" decoding=\"async\" width=\"790\" height=\"526\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/carousel-img-desktop-3-1.png\" class=\"mc-image wp-post-image\" alt=\"\" srcset=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/carousel-img-desktop-3-1.png 790w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/carousel-img-desktop-3-1-300x200.png 300w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/carousel-img-desktop-3-1-768x511.png 768w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/carousel-img-desktop-3-1-620x413.png 620w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/carousel-img-desktop-3-1-400x267.png 400w\" sizes=\"(max-width: 790px) 100vw, 790px\" \/>\r\n  <\/a>\r\n\r\n  <div class=\"mc-card-wrapper\">\r\n<div class=\"mc-card__presented\" data-presented=\"OSC and Hong Kong Football Club\">\r\n  <span class=\"i18n-en\">Presented by OSC and Hong Kong Football Club<\/span>\r\n\r\n<\/div>\r\n    <h3 class=\"mc-card__title\">\r\n      <a href=\"https:\/\/oschk.org\/zh\/mc-events\/osc-x-hong-kong-football-club-5-a-side-football-tournament\/?mc_id=49\">OSC X Hong Kong Football Club 5-a-side Football Tournament<\/a>\r\n    <\/h3>\r\n\r\n    <dl class=\"mc-card__meta\">\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"date\">Date\r\n<\/dt>\r\n<dd class=\"mc-card__date\">9:30am, 9 Nov 2025 - 8:00pm, 9 Nov 2025<\/dd>\r\n\r\n\r\n      <\/div>\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"venue\">Venue\r\n<\/dt>\r\n        <dd class=\"mc-card__venue\"><\/dd>\r\n      <\/div>\r\n    <\/dl>\r\n  <\/div>\r\n\r\n<p class=\"mc-card__cta\">\r\n  <a class=\"mc-btn osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/osc-x-hong-kong-football-club-5-a-side-football-tournament\/?mc_id=49\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/osc-x-hong-kong-football-club-5-a-side-football-tournament\/?mc_id=49\">\r\n    <span class=\"i18n-en\">Learn More<\/span>\r\n    <span class=\"i18n-zh\">\u4e86\u89e3\u66f4\u591a<\/span>\r\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/09\/learn_more_arrow.png\" alt=\"icon\" style=\"width:16px;height:16px\" \/>\r\n  <\/a>\r\n<\/p>\r\n<\/div><\/li>\n\n<li class=\"mc-mc_upcoming_264 upcoming-event mc_sports mc_no-location past-event mc_primary_sports nonrecurring mc-2-months mc-start-00-00 ungrouped mc-event-71 mc-events multidate mc_rel_eventsen mc_rel_sports\"><div class=\"mc-card\" data-mc-id=\"71\" data-title=\"Pickle &amp; Club x Operation Santa Claus - all in the spirit of a caring Christmas\" data-start=\"{dtstart format='c'}\" data-end=\"{dtend format='c'}\" data-location=\"\" data-presented=\"Pickle &amp; Club\" data-tickets=\"https:\/\/pickleand.club\/products\/book-court?variant=50271079923998\">\r\n  <div class=\"mc-desc mc-desc-source\" hidden aria-hidden=\"true\"><div class=\"what-event\">Let\u2019s come together and turn every game into a meaningful act of kindness. Starting from 10 Nov until 19 Jan, every Monday and Wednesday between 10am to 2pm, the rental revenue of our Pink Court* will be donated in full Operation Santa Claus to help those in need. Every dollar goes directly to the cause. <em>*24 Dec and 31 Dec are excluded.<\/em><\/div>\n<div class=\"space\"><\/div>\n<div class=\"what-event\">Stay tuned for a Fun Day in Jan to help raise even more for those in need. With the generous support of the Hong Kong Pickleball Association, come enjoy the pickleball energy sweeping across the city.<\/div>\n<div class=\"venue\">Pickle &amp; Club, UG01, The Westwood, Belcher's St, Kennedy Town<\/div>\n<\/div>\r\n\r\n  <a class=\"mc-card__thumb osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/pickle-club-x-operation-santa-claus-all-in-the-spirit-of-a-caring-christmas\/?mc_id=264\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/pickle-club-x-operation-santa-claus-all-in-the-spirit-of-a-caring-christmas\/?mc_id=264\">\r\n    <img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"476\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/10\/7-1024x609.jpeg\" class=\"mc-image wp-post-image\" alt=\"\" srcset=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/10\/7-1024x609.jpeg 1024w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/10\/7-300x179.jpeg 300w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/10\/7-768x457.jpeg 768w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/10\/7-1536x914.jpeg 1536w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/10\/7.jpeg 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\r\n  <\/a>\r\n\r\n  <div class=\"mc-card-wrapper\">\r\n<div class=\"mc-card__presented\" data-presented=\"Pickle &amp; Club\">\r\n  <span class=\"i18n-en\">Presented by Pickle &amp; Club<\/span>\r\n\r\n<\/div>\r\n    <h3 class=\"mc-card__title\">\r\n      <a href=\"https:\/\/oschk.org\/zh\/mc-events\/pickle-club-x-operation-santa-claus-all-in-the-spirit-of-a-caring-christmas\/?mc_id=264\">Pickle &amp; Club x Operation Santa Claus - all in the spirit of a caring Christmas<\/a>\r\n    <\/h3>\r\n\r\n    <dl class=\"mc-card__meta\">\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"date\">Date\r\n<\/dt>\r\n<dd class=\"mc-card__date\">12:00am, 10 Nov 2025 - 12:00am, 20 Jan 2026<\/dd>\r\n\r\n\r\n      <\/div>\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"venue\">Venue\r\n<\/dt>\r\n        <dd class=\"mc-card__venue\"><\/dd>\r\n      <\/div>\r\n    <\/dl>\r\n  <\/div>\r\n\r\n<p class=\"mc-card__cta\">\r\n  <a class=\"mc-btn osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/pickle-club-x-operation-santa-claus-all-in-the-spirit-of-a-caring-christmas\/?mc_id=264\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/pickle-club-x-operation-santa-claus-all-in-the-spirit-of-a-caring-christmas\/?mc_id=264\">\r\n    <span class=\"i18n-en\">Learn More<\/span>\r\n    <span class=\"i18n-zh\">\u4e86\u89e3\u66f4\u591a<\/span>\r\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/09\/learn_more_arrow.png\" alt=\"icon\" style=\"width:16px;height:16px\" \/>\r\n  <\/a>\r\n<\/p>\r\n<\/div><\/li>\n\n<li class=\"mc-mc_upcoming_225 upcoming-event mc_special-events mc_no-location past-event mc_primary_special-events nonrecurring mc-4-weeks mc-start-00-00 ungrouped mc-event-31 mc-events multidate mc_rel_eventsen mc_rel_specialevents\"><div class=\"mc-card\" data-mc-id=\"31\" data-title=\"OSC Month\" data-start=\"{dtstart format='c'}\" data-end=\"{dtend format='c'}\" data-location=\"\" data-presented=\"HKSH Medical Group\" data-tickets=\"https:\/\/www.scmp.com\/news\/hong-kong\/society\/article\/3292283\/operation-santa-claus-hong-kong-healthcare-workers-cook-charity\">\r\n  <div class=\"mc-desc mc-desc-source\" hidden aria-hidden=\"true\"><div class=\"what-event\">This year will mark the 14th consecutive year that the HKSH Medical Group hosts its annual month-long series of fundraising activities and a special Christmas party, featuring food stalls, competitions, performances, charity sales, and a lucky draw, to raise funds for Operation Santa Claus, making the festive season a special time for us to share love, care, and support with people in need.<\/div>\n<div class=\"venue\">Hong Kong Sanatorium &amp; Hospital, Happy Valley<\/div>\n<\/div>\r\n\r\n  <a class=\"mc-card__thumb osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/osc-month\/?mc_id=225\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/osc-month\/?mc_id=225\">\r\n    <img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"534\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/3-OSC_Donors_Hong-Kong-Sanatorium-Hospitals-1024x683.jpg\" class=\"mc-image wp-post-image\" alt=\"\" srcset=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/3-OSC_Donors_Hong-Kong-Sanatorium-Hospitals-1024x683.jpg 1024w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/3-OSC_Donors_Hong-Kong-Sanatorium-Hospitals-300x200.jpg 300w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/3-OSC_Donors_Hong-Kong-Sanatorium-Hospitals-768x512.jpg 768w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/3-OSC_Donors_Hong-Kong-Sanatorium-Hospitals.jpg 1500w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\r\n  <\/a>\r\n\r\n  <div class=\"mc-card-wrapper\">\r\n<div class=\"mc-card__presented\" data-presented=\"HKSH Medical Group\">\r\n  <span class=\"i18n-en\">Presented by HKSH Medical Group<\/span>\r\n\r\n<\/div>\r\n    <h3 class=\"mc-card__title\">\r\n      <a href=\"https:\/\/oschk.org\/zh\/mc-events\/osc-month\/?mc_id=225\">OSC Month<\/a>\r\n    <\/h3>\r\n\r\n    <dl class=\"mc-card__meta\">\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"date\">Date\r\n<\/dt>\r\n<dd class=\"mc-card__date\">12:00am, 17 Nov 2025 - 12:00am, 16 Dec 2025<\/dd>\r\n\r\n\r\n      <\/div>\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"venue\">Venue\r\n<\/dt>\r\n        <dd class=\"mc-card__venue\"><\/dd>\r\n      <\/div>\r\n    <\/dl>\r\n  <\/div>\r\n\r\n<p class=\"mc-card__cta\">\r\n  <a class=\"mc-btn osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/osc-month\/?mc_id=225\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/osc-month\/?mc_id=225\">\r\n    <span class=\"i18n-en\">Learn More<\/span>\r\n    <span class=\"i18n-zh\">\u4e86\u89e3\u66f4\u591a<\/span>\r\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/09\/learn_more_arrow.png\" alt=\"icon\" style=\"width:16px;height:16px\" \/>\r\n  <\/a>\r\n<\/p>\r\n<\/div><\/li>\n\n<li class=\"mc-mc_upcoming_283 upcoming-event mc_events--en mc_no-location past-event mc_primary_events-en nonrecurring mc-1-month mc-start-00-00 ungrouped mc-event-81 mc-events multidate mc_rel_eventsen mc_rel_specialevents\"><div class=\"mc-card\" data-mc-id=\"81\" data-title=\"Pacific Place Santa Express\" data-start=\"{dtstart format='c'}\" data-end=\"{dtend format='c'}\" data-location=\"\" data-presented=\"Pacific Place\" data-tickets=\"https:\/\/christmas2025.pacificplace.com.hk\/en\/\">\r\n  <div class=\"mc-desc mc-desc-source\" hidden aria-hidden=\"true\"><div class=\"what-event\">Seats aboard the Santa Express lead into a Christmas adventure at Santa\u2019s travelling grotto. Clarence the Crocodile is busy calibrating the clocks before departure. Step inside and snap a magical framed photo with Santa, enjoy sweet treats, and meet Felix the Fox, Santa\u2019s cheerful butler who\u2019s been keeping track of who\u2019s been naughty or nice. Best of all, every ticket helps spread the joy, with all proceeds going to Operation Santa Claus to support those in need this holiday season.<\/div>\n<div class=\"venue\"> Garden Court, Level LG1, Pacific Place <\/div>\n<\/div>\r\n\r\n  <a class=\"mc-card__thumb osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/pacific-place-santa-express\/?mc_id=283\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/pacific-place-santa-express\/?mc_id=283\">\r\n    <img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"534\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/christmas-grand-central-1024x683.jpg\" class=\"mc-image wp-post-image\" alt=\"\" srcset=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/christmas-grand-central-1024x683.jpg 1024w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/christmas-grand-central-300x200.jpg 300w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/christmas-grand-central-768x512.jpg 768w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/christmas-grand-central-1536x1024.jpg 1536w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/christmas-grand-central-2048x1365.jpg 2048w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\r\n  <\/a>\r\n\r\n  <div class=\"mc-card-wrapper\">\r\n<div class=\"mc-card__presented\" data-presented=\"Pacific Place\">\r\n  <span class=\"i18n-en\">Presented by Pacific Place<\/span>\r\n\r\n<\/div>\r\n    <h3 class=\"mc-card__title\">\r\n      <a href=\"https:\/\/oschk.org\/zh\/mc-events\/pacific-place-santa-express\/?mc_id=283\">Pacific Place Santa Express<\/a>\r\n    <\/h3>\r\n\r\n    <dl class=\"mc-card__meta\">\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"date\">Date\r\n<\/dt>\r\n<dd class=\"mc-card__date\">12:00am, 19 Nov 2025 - 12:00am, 3 Jan 2026<\/dd>\r\n\r\n\r\n      <\/div>\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"venue\">Venue\r\n<\/dt>\r\n        <dd class=\"mc-card__venue\"><\/dd>\r\n      <\/div>\r\n    <\/dl>\r\n  <\/div>\r\n\r\n<p class=\"mc-card__cta\">\r\n  <a class=\"mc-btn osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/pacific-place-santa-express\/?mc_id=283\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/pacific-place-santa-express\/?mc_id=283\">\r\n    <span class=\"i18n-en\">Learn More<\/span>\r\n    <span class=\"i18n-zh\">\u4e86\u89e3\u66f4\u591a<\/span>\r\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/09\/learn_more_arrow.png\" alt=\"icon\" style=\"width:16px;height:16px\" \/>\r\n  <\/a>\r\n<\/p>\r\n<\/div><\/li>\n\n<li class=\"mc-mc_upcoming_270 upcoming-event mc_sports mc_no-location past-event mc_primary_sports nonrecurring mc-24-hours mc-start-00-00 ungrouped mc-event-32 mc-events mc_rel_eventsen mc_rel_sports\"><div class=\"mc-card\" data-mc-id=\"32\" data-title=\"The 27th Wing Ding Charity Tournament\" data-start=\"{dtstart format='c'}\" data-end=\"{dtend format='c'}\" data-location=\"\" data-presented=\"Hong Kong Football Club\" data-tickets=\"https:\/\/oschk.org\/event-details\/wingdingcharitytournament\/\">\r\n  <div class=\"mc-desc mc-desc-source\" hidden aria-hidden=\"true\"><div class=\"featured-events\">Featured Events-3<\/div>\n<div class=\"venue\">Hong Kong Football Club, Happy Valley<\/div>\n<\/div>\r\n\r\n  <a class=\"mc-card__thumb osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/the-27th-wing-ding-charity-tournament\/?mc_id=270\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/the-27th-wing-ding-charity-tournament\/?mc_id=270\">\r\n    <img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"534\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/4-Wing-Ding-Squash_2-1024x683.jpg\" class=\"mc-image wp-post-image\" alt=\"\" srcset=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/4-Wing-Ding-Squash_2-1024x683.jpg 1024w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/4-Wing-Ding-Squash_2-300x200.jpg 300w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/4-Wing-Ding-Squash_2-768x512.jpg 768w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/4-Wing-Ding-Squash_2-900x600.jpg 900w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/4-Wing-Ding-Squash_2-620x413.jpg 620w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/4-Wing-Ding-Squash_2-400x267.jpg 400w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/4-Wing-Ding-Squash_2.jpg 1500w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\r\n  <\/a>\r\n\r\n  <div class=\"mc-card-wrapper\">\r\n<div class=\"mc-card__presented\" data-presented=\"Hong Kong Football Club\">\r\n  <span class=\"i18n-en\">Presented by Hong Kong Football Club<\/span>\r\n\r\n<\/div>\r\n    <h3 class=\"mc-card__title\">\r\n      <a href=\"https:\/\/oschk.org\/zh\/mc-events\/the-27th-wing-ding-charity-tournament\/?mc_id=270\">The 27th Wing Ding Charity Tournament<\/a>\r\n    <\/h3>\r\n\r\n    <dl class=\"mc-card__meta\">\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"date\">Date\r\n<\/dt>\r\n<dd class=\"mc-card__date\">12:00am, 22 Nov 2025 - 12:00am, 23 Nov 2025<\/dd>\r\n\r\n\r\n      <\/div>\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"venue\">Venue\r\n<\/dt>\r\n        <dd class=\"mc-card__venue\"><\/dd>\r\n      <\/div>\r\n    <\/dl>\r\n  <\/div>\r\n\r\n<p class=\"mc-card__cta\">\r\n  <a class=\"mc-btn osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/the-27th-wing-ding-charity-tournament\/?mc_id=270\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/the-27th-wing-ding-charity-tournament\/?mc_id=270\">\r\n    <span class=\"i18n-en\">Learn More<\/span>\r\n    <span class=\"i18n-zh\">\u4e86\u89e3\u66f4\u591a<\/span>\r\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/09\/learn_more_arrow.png\" alt=\"icon\" style=\"width:16px;height:16px\" \/>\r\n  <\/a>\r\n<\/p>\r\n<\/div><\/li>\n\n<li class=\"mc-mc_upcoming_211 upcoming-event mc_christmas-bazaars mc_no-location past-event mc_primary_christmas-bazaars nonrecurring mc-5-days mc-start-00-00 ungrouped mc-event-33 mc-events multidate mc_rel_christmasbazaars mc_rel_eventsen\"><div class=\"mc-card\" data-mc-id=\"33\" data-title=\"White Christmas Street Fair 2025\" data-start=\"{dtstart format='c'}\" data-end=\"{dtend format='c'}\" data-location=\"\" data-presented=\"Swire Properties and Placemaking Academy\" data-tickets=\"https:\/\/www.swireproperties.com\/en\/sustainable-development\/places\/community-programmes\/white-christmas-street-fair\/\">\r\n  <div class=\"mc-desc mc-desc-source\" hidden aria-hidden=\"true\"><div class=\"what-event\">\n<p>Christmas time at Swire Properties is now synonymous with the annual White Christmas Street Fair, which has been held each December since 2013. Beginning in 2016, we expanded the fair from our home base in Taikoo Place to Starstreet Precinct to spread extra Christmas cheer.<\/p>\n<div class=\"space\"><\/div>\n<p>The fair is a celebration for our colleagues and their families and friends, and especially for the wider community, as it allows for everyone to come together to celebrate the holiday season with food and drink, live entertainment, workshops and Christmas shopping for the whole family. And the best part is, the event raises funds for Operation Santa Claus, an annual fundraising campaign which supports local and regional non-profit organisations.<\/p>\n<div class=\"space\"><\/div>\n<p>While the fair adopts a different theme each year, it remains a uniquely community event, involving not only our Community Ambassador team but also other Swire group companies, tenants, business partners and residents, who all volunteer their time and resources to raise funds for this worthy cause.<\/p>\n<\/div>\n<div class=\"venue\">Taikoo Place, Taikoo Park &amp; Quarryside<\/div>\n<\/div>\r\n\r\n  <a class=\"mc-card__thumb osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/white-christmas-street-fair-2025\/?mc_id=211\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/white-christmas-street-fair-2025\/?mc_id=211\">\r\n    <img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"534\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/5-OSC_Donors_Swire-Properties-White-Christmas-Street-Fair-1024x683.jpg\" class=\"mc-image wp-post-image\" alt=\"\" srcset=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/5-OSC_Donors_Swire-Properties-White-Christmas-Street-Fair-1024x683.jpg 1024w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/5-OSC_Donors_Swire-Properties-White-Christmas-Street-Fair-300x200.jpg 300w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/5-OSC_Donors_Swire-Properties-White-Christmas-Street-Fair-768x512.jpg 768w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/5-OSC_Donors_Swire-Properties-White-Christmas-Street-Fair.jpg 1500w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\r\n  <\/a>\r\n\r\n  <div class=\"mc-card-wrapper\">\r\n<div class=\"mc-card__presented\" data-presented=\"Swire Properties and Placemaking Academy\">\r\n  <span class=\"i18n-en\">Presented by Swire Properties and Placemaking Academy<\/span>\r\n\r\n<\/div>\r\n    <h3 class=\"mc-card__title\">\r\n      <a href=\"https:\/\/oschk.org\/zh\/mc-events\/white-christmas-street-fair-2025\/?mc_id=211\">White Christmas Street Fair 2025<\/a>\r\n    <\/h3>\r\n\r\n    <dl class=\"mc-card__meta\">\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"date\">Date\r\n<\/dt>\r\n<dd class=\"mc-card__date\">12:00am, 4 Dec 2025 - 12:00am, 9 Dec 2025<\/dd>\r\n\r\n\r\n      <\/div>\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"venue\">Venue\r\n<\/dt>\r\n        <dd class=\"mc-card__venue\"><\/dd>\r\n      <\/div>\r\n    <\/dl>\r\n  <\/div>\r\n\r\n<p class=\"mc-card__cta\">\r\n  <a class=\"mc-btn osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/white-christmas-street-fair-2025\/?mc_id=211\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/white-christmas-street-fair-2025\/?mc_id=211\">\r\n    <span class=\"i18n-en\">Learn More<\/span>\r\n    <span class=\"i18n-zh\">\u4e86\u89e3\u66f4\u591a<\/span>\r\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/09\/learn_more_arrow.png\" alt=\"icon\" style=\"width:16px;height:16px\" \/>\r\n  <\/a>\r\n<\/p>\r\n<\/div><\/li>\n\n<li class=\"mc-mc_upcoming_50 upcoming-event mc_sports mc_no-location past-event mc_primary_sports nonrecurring mc-12-hours mc-start-09-00 ungrouped mc-event-29 mc-events mc_rel_eventsen mc_rel_sports\"><div class=\"mc-card\" data-mc-id=\"29\" data-title=\"OSC Charity Table Tennis Tournament\" data-start=\"{dtstart format='c'}\" data-end=\"{dtend format='c'}\" data-location=\"\" data-presented=\"HKTTF.com\" data-tickets=\"https:\/\/oschk.org\/event-details\/tabletennistournament\/\">\r\n  <div class=\"mc-desc mc-desc-source\" hidden aria-hidden=\"true\"><div class=\"featured-events\">Featured Events-2<\/div>\n<div class=\"venue\">LCSD Luen Wo Hui Sports Centre, Fanling<\/div>\n<\/div>\r\n\r\n  <a class=\"mc-card__thumb osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/osc-charity-table-tennis-tournament\/?mc_id=50\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/osc-charity-table-tennis-tournament\/?mc_id=50\">\r\n    <img loading=\"lazy\" decoding=\"async\" width=\"608\" height=\"416\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/Frame-18.png\" class=\"mc-image wp-post-image\" alt=\"\" srcset=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/Frame-18.png 608w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/Frame-18-300x205.png 300w\" sizes=\"(max-width: 608px) 100vw, 608px\" \/>\r\n  <\/a>\r\n\r\n  <div class=\"mc-card-wrapper\">\r\n<div class=\"mc-card__presented\" data-presented=\"HKTTF.com\">\r\n  <span class=\"i18n-en\">Presented by HKTTF.com<\/span>\r\n\r\n<\/div>\r\n    <h3 class=\"mc-card__title\">\r\n      <a href=\"https:\/\/oschk.org\/zh\/mc-events\/osc-charity-table-tennis-tournament\/?mc_id=50\">OSC Charity Table Tennis Tournament<\/a>\r\n    <\/h3>\r\n\r\n    <dl class=\"mc-card__meta\">\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"date\">Date\r\n<\/dt>\r\n<dd class=\"mc-card__date\">9:00am, 7 Dec 2025 - 9:00pm, 7 Dec 2025<\/dd>\r\n\r\n\r\n      <\/div>\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"venue\">Venue\r\n<\/dt>\r\n        <dd class=\"mc-card__venue\"><\/dd>\r\n      <\/div>\r\n    <\/dl>\r\n  <\/div>\r\n\r\n<p class=\"mc-card__cta\">\r\n  <a class=\"mc-btn osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/osc-charity-table-tennis-tournament\/?mc_id=50\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/osc-charity-table-tennis-tournament\/?mc_id=50\">\r\n    <span class=\"i18n-en\">Learn More<\/span>\r\n    <span class=\"i18n-zh\">\u4e86\u89e3\u66f4\u591a<\/span>\r\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/09\/learn_more_arrow.png\" alt=\"icon\" style=\"width:16px;height:16px\" \/>\r\n  <\/a>\r\n<\/p>\r\n<\/div><\/li>\n\n<li class=\"mc-mc_upcoming_261 upcoming-event mc_art-amp-music mc_no-location past-event mc_primary_art-music nonrecurring mc-24-hours mc-start-00-00 ungrouped mc-event-35 mc-events mc_rel_artampmusic mc_rel_eventsen\"><div class=\"mc-card\" data-mc-id=\"35\" data-title=\"Solictors' Carol Service\" data-start=\"{dtstart format='c'}\" data-end=\"{dtend format='c'}\" data-location=\"\" data-presented=\"Linklaters\" data-tickets=\"https:\/\/www.instagram.com\/p\/DCqyW2KhTJt\/\">\r\n  <div class=\"mc-desc mc-desc-source\" hidden aria-hidden=\"true\"><div class=\"what-event\">This year, law firms will join together again to sponsor the event, and a choir of solicitors across the firms will be singing at the service. There will also be a reception after the service, with festive food and drinks served. Collections will be taken on the day, and proceeds will go to Operation Santa Claus.<\/div>\n<div class=\"venue\">St. John\u2019s Cathedral<\/div>\n<\/div>\r\n\r\n  <a class=\"mc-card__thumb osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/solictors-carol-service\/?mc_id=261\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/solictors-carol-service\/?mc_id=261\">\r\n    <img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"531\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/10\/Solicitors-Carol-Service-1024x680.jpg\" class=\"mc-image wp-post-image\" alt=\"\" srcset=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/10\/Solicitors-Carol-Service-1024x680.jpg 1024w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/10\/Solicitors-Carol-Service-300x199.jpg 300w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/10\/Solicitors-Carol-Service-768x510.jpg 768w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/10\/Solicitors-Carol-Service-1536x1020.jpg 1536w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/10\/Solicitors-Carol-Service-2048x1360.jpg 2048w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\r\n  <\/a>\r\n\r\n  <div class=\"mc-card-wrapper\">\r\n<div class=\"mc-card__presented\" data-presented=\"Linklaters\">\r\n  <span class=\"i18n-en\">Presented by Linklaters<\/span>\r\n\r\n<\/div>\r\n    <h3 class=\"mc-card__title\">\r\n      <a href=\"https:\/\/oschk.org\/zh\/mc-events\/solictors-carol-service\/?mc_id=261\">Solictors' Carol Service<\/a>\r\n    <\/h3>\r\n\r\n    <dl class=\"mc-card__meta\">\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"date\">Date\r\n<\/dt>\r\n<dd class=\"mc-card__date\">12:00am, 8 Dec 2025 - 12:00am, 9 Dec 2025<\/dd>\r\n\r\n\r\n      <\/div>\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"venue\">Venue\r\n<\/dt>\r\n        <dd class=\"mc-card__venue\"><\/dd>\r\n      <\/div>\r\n    <\/dl>\r\n  <\/div>\r\n\r\n<p class=\"mc-card__cta\">\r\n  <a class=\"mc-btn osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/solictors-carol-service\/?mc_id=261\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/solictors-carol-service\/?mc_id=261\">\r\n    <span class=\"i18n-en\">Learn More<\/span>\r\n    <span class=\"i18n-zh\">\u4e86\u89e3\u66f4\u591a<\/span>\r\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/09\/learn_more_arrow.png\" alt=\"icon\" style=\"width:16px;height:16px\" \/>\r\n  <\/a>\r\n<\/p>\r\n<\/div><\/li>\n\n<li class=\"mc-mc_upcoming_208 upcoming-event mc_sports mc_no-location past-event mc_primary_sports nonrecurring mc-24-hours mc-start-00-00 ungrouped mc-event-34 mc-events mc_rel_eventsen mc_rel_sports\"><div class=\"mc-card\" data-mc-id=\"34\" data-title=\"Dah Sing Charity Score Challenge 2025\" data-start=\"{dtstart format='c'}\" data-end=\"{dtend format='c'}\" data-location=\"\" data-presented=\"Dah Sing Financial Group\" data-tickets=\"https:\/\/www.dahsing.com\">\r\n  <div class=\"mc-desc mc-desc-source\" hidden aria-hidden=\"true\"><div class=\"what-event\">The Dah Sing Charity Score Challenge basketball match is in support of Operation Santa Claus (OSC) for the 13th consecutive year in 2025. The event featured basketball matches and a series of challenge games. It was well attended by more than 100 of the Bank\u2019s staff, their families and friends, and teenagers. All funds generated by the \"Dah Sing Charity Score Challenge\" will be donated to OSC to support a broad spectrum of charitable projects in the community.<\/div>\n<div class=\"venue\">Chinese YMCA of Kowloon Centre, Yau Ma Tei<\/div>\n<\/div>\r\n\r\n  <a class=\"mc-card__thumb osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/dah-sing-charity-score-challenge-2025\/?mc_id=208\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/dah-sing-charity-score-challenge-2025\/?mc_id=208\">\r\n    <img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"534\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/6-OSC_Dah-Sing-Bank-1024x683.jpg\" class=\"mc-image wp-post-image\" alt=\"\" srcset=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/6-OSC_Dah-Sing-Bank-1024x683.jpg 1024w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/6-OSC_Dah-Sing-Bank-300x200.jpg 300w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/6-OSC_Dah-Sing-Bank-768x512.jpg 768w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/6-OSC_Dah-Sing-Bank.jpg 1500w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\r\n  <\/a>\r\n\r\n  <div class=\"mc-card-wrapper\">\r\n<div class=\"mc-card__presented\" data-presented=\"Dah Sing Financial Group\">\r\n  <span class=\"i18n-en\">Presented by Dah Sing Financial Group<\/span>\r\n\r\n<\/div>\r\n    <h3 class=\"mc-card__title\">\r\n      <a href=\"https:\/\/oschk.org\/zh\/mc-events\/dah-sing-charity-score-challenge-2025\/?mc_id=208\">Dah Sing Charity Score Challenge 2025<\/a>\r\n    <\/h3>\r\n\r\n    <dl class=\"mc-card__meta\">\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"date\">Date\r\n<\/dt>\r\n<dd class=\"mc-card__date\">12:00am, 13 Dec 2025 - 12:00am, 14 Dec 2025<\/dd>\r\n\r\n\r\n      <\/div>\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"venue\">Venue\r\n<\/dt>\r\n        <dd class=\"mc-card__venue\"><\/dd>\r\n      <\/div>\r\n    <\/dl>\r\n  <\/div>\r\n\r\n<p class=\"mc-card__cta\">\r\n  <a class=\"mc-btn osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/dah-sing-charity-score-challenge-2025\/?mc_id=208\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/dah-sing-charity-score-challenge-2025\/?mc_id=208\">\r\n    <span class=\"i18n-en\">Learn More<\/span>\r\n    <span class=\"i18n-zh\">\u4e86\u89e3\u66f4\u591a<\/span>\r\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/09\/learn_more_arrow.png\" alt=\"icon\" style=\"width:16px;height:16px\" \/>\r\n  <\/a>\r\n<\/p>\r\n<\/div><\/li>\n\n<li class=\"mc-mc_upcoming_280 upcoming-event mc_christmas-bazaars mc_no-location past-event mc_primary_christmas-bazaars nonrecurring mc-2-weeks mc-start-00-00 ungrouped mc-event-79 mc-events multidate mc_rel_christmasbazaars mc_rel_eventsen\"><div class=\"mc-card\" data-mc-id=\"79\" data-title=\"WestK Forest Santa Claus Meet &amp; Greet and special Christmas workshops\" data-start=\"{dtstart format='c'}\" data-end=\"{dtend format='c'}\" data-location=\"\" data-presented=\"West Kowloon\" data-tickets=\"https:\/\/www.westk.hk\/en\/event\/christmas-town#highlights\">\r\n  <div class=\"mc-desc mc-desc-source\" hidden aria-hidden=\"true\"><div class=\"what-event\">Santa is making special appearances at Art Park. Gather your family and furry friends for a cherished moment together. From 24 to 26 December, present a digital screenshot showing a donation of HK$200 or above to SCMP Charities Limited - Operation Santa Claus to redeem one ticket for the Santa Claus Meet &amp; Greet or special Christmas workshops (one redemption per receipt).<\/div>\n<div class=\"venue\"> Art Park, West Kowloon, Austin<\/div>\n<\/div>\r\n\r\n  <a class=\"mc-card__thumb osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/westk-forest-santa-claus-meet-greet-and-special-christmas-workshops\/?mc_id=280\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/westk-forest-santa-claus-meet-greet-and-special-christmas-workshops\/?mc_id=280\">\r\n    <img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"600\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/christmastown-main-20251211-1024x768.png\" class=\"mc-image wp-post-image\" alt=\"\" srcset=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/christmastown-main-20251211-1024x768.png 1024w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/christmastown-main-20251211-300x225.png 300w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/christmastown-main-20251211-768x576.png 768w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/christmastown-main-20251211-1536x1152.png 1536w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/christmastown-main-20251211.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\r\n  <\/a>\r\n\r\n  <div class=\"mc-card-wrapper\">\r\n<div class=\"mc-card__presented\" data-presented=\"West Kowloon\">\r\n  <span class=\"i18n-en\">Presented by West Kowloon<\/span>\r\n\r\n<\/div>\r\n    <h3 class=\"mc-card__title\">\r\n      <a href=\"https:\/\/oschk.org\/zh\/mc-events\/westk-forest-santa-claus-meet-greet-and-special-christmas-workshops\/?mc_id=280\">WestK Forest Santa Claus Meet &amp; Greet and special Christmas workshops<\/a>\r\n    <\/h3>\r\n\r\n    <dl class=\"mc-card__meta\">\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"date\">Date\r\n<\/dt>\r\n<dd class=\"mc-card__date\">12:00am, 19 Dec 2025 - 12:00am, 1 Jan 2026<\/dd>\r\n\r\n\r\n      <\/div>\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"venue\">Venue\r\n<\/dt>\r\n        <dd class=\"mc-card__venue\"><\/dd>\r\n      <\/div>\r\n    <\/dl>\r\n  <\/div>\r\n\r\n<p class=\"mc-card__cta\">\r\n  <a class=\"mc-btn osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/westk-forest-santa-claus-meet-greet-and-special-christmas-workshops\/?mc_id=280\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/westk-forest-santa-claus-meet-greet-and-special-christmas-workshops\/?mc_id=280\">\r\n    <span class=\"i18n-en\">Learn More<\/span>\r\n    <span class=\"i18n-zh\">\u4e86\u89e3\u66f4\u591a<\/span>\r\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/09\/learn_more_arrow.png\" alt=\"icon\" style=\"width:16px;height:16px\" \/>\r\n  <\/a>\r\n<\/p>\r\n<\/div><\/li>\n\n<li class=\"mc-mc_upcoming_275 upcoming-event mc_art-amp-music mc_no-location past-event mc_primary_art-music nonrecurring mc-1-hour mc-start-14-00 ungrouped mc-event-77 mc-events mc_rel_artampmusic mc_rel_eventsen\"><div class=\"mc-card\" data-mc-id=\"77\" data-title=\"McGill Songbirds x Nicole Chan at WestK Christmas Fest\" data-start=\"{dtstart format='c'}\" data-end=\"{dtend format='c'}\" data-location=\"\" data-presented=\"McGill Songbirds\" data-tickets=\"https:\/\/www.westk.hk\/en\/event\/christmas-town\">\r\n  <div class=\"mc-desc mc-desc-source\" hidden aria-hidden=\"true\"><div class=\"what-event\">Under the direction of Dr. Andrew Hon (DMus in Choral Conducting, McGill University), the McGill Songbirds\u2014featuring soprano Nicole Chan (DMus Candidate in Vocal Performance, McGill University) and resident pianist Pandora Cheung (BCom, McGill University)\u2014will perform at the WestK Christmas Fest. <\/p>\n<p>Members Becky Lau, Ada Yu, Jacqueline Lo, Carol Kwok, Tammy Kwok, Ivan Ho, and Keip Ip are proud to perform in support of Operation Santa Claus. Support the McGill Songbirds fundraiser here: <a href=\"https:\/\/donation.oschk.org\/fundraiser-donations\/home\/mcgillsongbirds2025\">https:\/\/donation.oschk.org\/fundraiser-donations\/home\/mcgillsongbirds2025<\/a><\/div>\n<div class=\"venue\">Art Park, West Kowloon, Austin<\/div>\n<\/div>\r\n\r\n  <a class=\"mc-card__thumb osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/mcgill-songbirds-x-nicole-chan-at-westk-christmas-fest-2\/?mc_id=275\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/mcgill-songbirds-x-nicole-chan-at-westk-christmas-fest-2\/?mc_id=275\">\r\n    <img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"534\" src=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/WhatsApp-Image-2025-12-22-at-14.38.50-1024x683.jpeg\" class=\"mc-image wp-post-image\" alt=\"\" srcset=\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/WhatsApp-Image-2025-12-22-at-14.38.50-1024x683.jpeg 1024w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/WhatsApp-Image-2025-12-22-at-14.38.50-300x200.jpeg 300w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/WhatsApp-Image-2025-12-22-at-14.38.50-768x512.jpeg 768w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/WhatsApp-Image-2025-12-22-at-14.38.50-1536x1025.jpeg 1536w, https:\/\/oschk.org\/wp-content\/uploads\/2025\/12\/WhatsApp-Image-2025-12-22-at-14.38.50.jpeg 2048w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\r\n  <\/a>\r\n\r\n  <div class=\"mc-card-wrapper\">\r\n<div class=\"mc-card__presented\" data-presented=\"McGill Songbirds\">\r\n  <span class=\"i18n-en\">Presented by McGill Songbirds<\/span>\r\n\r\n<\/div>\r\n    <h3 class=\"mc-card__title\">\r\n      <a href=\"https:\/\/oschk.org\/zh\/mc-events\/mcgill-songbirds-x-nicole-chan-at-westk-christmas-fest-2\/?mc_id=275\">McGill Songbirds x Nicole Chan at WestK Christmas Fest<\/a>\r\n    <\/h3>\r\n\r\n    <dl class=\"mc-card__meta\">\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"date\">Date\r\n<\/dt>\r\n<dd class=\"mc-card__date\">2:00pm, 24 Dec 2025 - 3:00pm, 24 Dec 2025<\/dd>\r\n\r\n\r\n      <\/div>\r\n      <div class=\"mc-card__row\">\r\n<dt data-label=\"venue\">Venue\r\n<\/dt>\r\n        <dd class=\"mc-card__venue\"><\/dd>\r\n      <\/div>\r\n    <\/dl>\r\n  <\/div>\r\n\r\n<p class=\"mc-card__cta\">\r\n  <a class=\"mc-btn osc-mc-popup\" href=\"https:\/\/oschk.org\/zh\/mc-events\/mcgill-songbirds-x-nicole-chan-at-westk-christmas-fest-2\/?mc_id=275\" data-url=\"https:\/\/oschk.org\/zh\/mc-events\/mcgill-songbirds-x-nicole-chan-at-westk-christmas-fest-2\/?mc_id=275\">\r\n    <span class=\"i18n-en\">Learn More<\/span>\r\n    <span class=\"i18n-zh\">\u4e86\u89e3\u66f4\u591a<\/span>\r\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/09\/learn_more_arrow.png\" alt=\"icon\" style=\"width:16px;height:16px\" \/>\r\n  <\/a>\r\n<\/p>\r\n<\/div><\/li>\n<\/ul><\/div>\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-145b38c elementor-widget elementor-widget-html\" data-id=\"145b38c\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<html>\n  <head>\n    <meta charset=\"UTF-8\" \/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n    <title>WordPress Event Pagination<\/title>\n\n    <script>\n      document.documentElement.classList.add(\"js\");\n    <\/script>\n\n    <style>\n      \/* ===================== PAGINATION (DESKTOP BASE) ===================== *\/\n\n      .osc-pagination-wrapper {\n        width: 100%;\n        max-width: 1040px;\n        margin: 40px auto 0 auto;\n      }\n      .osc-pagination-controls {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        gap: 0;\n        user-select: none;\n      }\n\n      \/* Prev\/Next buttons *\/\n      .pagination-btn {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        padding: 8px 12px;\n        background: transparent;\n        border: none;\n        font-family: Roboto Condensed, system-ui, -apple-system, Segoe UI, Arial;\n        font-weight: 600;\n        font-size: 16px;\n        line-height: 100%;\n        color: #b22933;\n        cursor: pointer;\n      }\n      .pagination-btn:hover,\n      .pagination-btn:focus {\n        background-color: transparent;\n        color: #b22933;\n      }\n      .pagination-btn:disabled {\n        opacity: 0.3;\n        cursor: not-allowed;\n      }\n      .pagination-btn img {\n        width: 5.83px;\n        height: 10.08px;\n      }\n\n      \/* Numbers strip (desktop) *\/\n      .pagination-numbers {\n        display: flex;\n        align-items: center;\n        gap: 24px;\n        margin: 0 24px;\n      }\n      .page-number {\n        width: 24px;\n        height: 24px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        background: #fff;\n        border: 0;\n        color: #222;\n        cursor: pointer;\n        font-family: Roboto, system-ui, -apple-system, Segoe UI, Arial;\n        font-weight: 400;\n        font-size: 12px;\n        line-height: 100%;\n        letter-spacing: 2%;\n        text-align: center;\n        padding: 0;\n      }\n      .page-number.default {\n        background: transparent;\n      }\n      .page-number:hover:not(.active):not(.page-ellipsis) {\n        background: #e7e7e7 !important;\n        color: #222 !important;\n        font-weight: 700;\n        border-radius: 999px;\n      }\n      .page-number.active {\n        background: #de3340 !important;\n        color: #fff !important;\n        font-weight: 700;\n        border-radius: 999px;\n        cursor: default;\n      }\n      .page-ellipsis {\n        min-width: auto;\n        padding: 0 8px;\n        border: none;\n        background: transparent;\n        color: #999;\n        cursor: default;\n      }\n\n      \/* Hide list items that are not on the current page *\/\n      .ecs-event-list li.pagination-hidden,\n      .mc-event-list li.pagination-hidden {\n        display: none !important;\n      }\n\n      \/* No-flash: hide all items until JS marks the list ready *\/\n      .js .ecs-event-list:not(.pg-ready) > li,\n      .js .mc-event-list:not(.pg-ready) > li {\n        display: none !important;\n      }\n\n      \/* Hide pagination bar until JS finishes *\/\n      .js #pagination-wrapper:not(.pg-ready) {\n        display: none !important;\n      }\n      .js #pagination-wrapper.pg-ready:not(.is-hidden) {\n        display: block !important;\n      }\n      .js #pagination-wrapper.pg-ready.is-hidden {\n        display: none !important;\n      }\n\n      \/* ===================== RESPONSIVE ===================== *\/\n      @media (max-width: 1024px) {\n        .osc-pagination-wrapper {\n          margin: 32px auto 0;\n        }\n      }\n\n      \/* ---------- MOBILE RULES (\u2264767px) ---------- *\/\n      @media (max-width: 767px) {\n        .osc-pagination-wrapper {\n          margin: 24px auto 0;\n        }\n\n        .pagination-btn span {\n          display: inline !important;\n        }\n\n        .pagination-numbers {\n          margin: 0 12px;\n          min-width: 72px;\n          justify-content: center;\n        }\n\n        .pagination-numbers .page-number,\n        .pagination-numbers .page-ellipsis {\n          display: none !important;\n        }\n\n        .pagination-count {\n          display: inline-flex;\n          align-items: center;\n          margin: 0;\n          font-family: Roboto;\n          font-weight: 400;\n          font-size: 12px;\n          line-height: 100%;\n          text-align: center;\n          vertical-align: middle;\n          color: #222222;\n        }\n        .pagination-count .box {\n          width: 24px;\n          height: 24px;\n          display: inline-flex;\n          align-items: center;\n          justify-content: center;\n          font-size: 12px;\n          line-height: 1;\n          pointer-events: none;\n        }\n        .pagination-count .sep {\n          font-style: italic;\n        }\n      }\n    <\/style>\n  <\/head>\n\n  <body>\n    <div\n      class=\"osc-pagination-wrapper\"\n      id=\"pagination-wrapper\"\n      style=\"display: none\"\n    >\n      <div class=\"osc-pagination-controls\">\n        <button\n          class=\"pagination-btn pagination-prev\"\n          aria-label=\"Previous page\"\n        >\n          <img decoding=\"async\"\n            src=\"\/wp-content\/uploads\/2025\/09\/Vector-5.png\"\n            alt=\"prev arrow\"\n          \/>\n          <span>Prev<\/span>\n        <\/button>\n\n        <div class=\"pagination-numbers\"><\/div>\n\n        <button class=\"pagination-btn pagination-next\" aria-label=\"Next page\">\n          <span>Next<\/span>\n          <img decoding=\"async\"\n            src=\"\/wp-content\/uploads\/2025\/09\/Vector-6.png\"\n            alt=\"next arrow\"\n          \/>\n        <\/button>\n      <\/div>\n    <\/div>\n\n    <script>\n      (function () {\n        const ITEMS_PER_PAGE = 12;\n        const SCROLL_ON_PAGE_CHANGE = true;\n        const MOBILE_Q = \"(max-width: 767px)\";\n        const LIST_SELECTOR = \".ecs-event-list, .mc-event-list\";\n\n        let currentPage = 1;\n        let totalPages = 0;\n        let allEventItems = [];\n        let visibleEventItems = [];\n        let eventListContainer = null;\n\n        function isMobile() {\n          return window.matchMedia(MOBILE_Q).matches;\n        }\n\n        if (document.readyState === \"loading\") {\n          document.addEventListener(\"DOMContentLoaded\", initPagination);\n        } else {\n          setTimeout(initPagination, 100);\n        }\n\n        function initPagination() {\n          eventListContainer = document.querySelector(LIST_SELECTOR);\n          if (!eventListContainer) return;\n\n          eventListContainer.classList.remove(\"pg-ready\");\n\n          allEventItems = Array.from(\n            eventListContainer.querySelectorAll(\":scope > li\")\n          );\n          if (!allEventItems.length) return;\n\n          document.addEventListener(\"osc:filters-applied\", handleFilterChange);\n          document.addEventListener(\n            \"osc:year-filter-changed\",\n            handleFilterChange\n          );\n          document.addEventListener(\n            \"osc:type-filter-changed\",\n            handleFilterChange\n          );\n\n          \/\/ Add sort change listener\n          document.addEventListener(\"osc:sort-changed\", handleSortChange);\n\n          updateVisibleItems();\n          showPage(1);\n          bindPaginationEvents();\n          window.addEventListener(\"resize\", updatePaginationControls);\n        }\n        function handleSortChange() {\n          setTimeout(function () {\n            \/\/ Re-sort all items before pagination\n            if (window.sortAll) {\n              var sortWrap = document.querySelector(\".event-toggle\");\n              var order = sortWrap ? sortWrap.dataset.order : \"desc\";\n              window.sortAll(order);\n            }\n            updateVisibleItems();\n            showPage(currentPage);\n          }, 100);\n        }\n        function updateVisibleItems() {\n          \/\/ Get fresh list after sorting\n          allEventItems = Array.from(\n            eventListContainer.querySelectorAll(\":scope > li\")\n          );\n\n          visibleEventItems = allEventItems.filter(function (item) {\n            return (\n              !item.classList.contains(\"is-hidden-by-filter\") &&\n              !item.classList.contains(\"is-hidden-by-year\") &&\n              !item.classList.contains(\"is-hidden-by-type\")\n            );\n          });\n\n          totalPages = Math.ceil(visibleEventItems.length \/ ITEMS_PER_PAGE);\n\n          if (currentPage > totalPages && totalPages > 0) {\n            currentPage = 1;\n          }\n        }\n\n        function handleFilterChange() {\n          setTimeout(function () {\n            updateVisibleItems();\n            currentPage = 1; \/\/ Reset to first page after filtering\n            showPage(1);\n          }, 50); \/\/ Increase delay to ensure filters are applied first\n        }\n\n        function showPage(pageNum) {\n          if (totalPages === 0) {\n            allEventItems.forEach(function (item) {\n              item.classList.add(\"pagination-hidden\");\n            });\n            updatePaginationControls();\n            eventListContainer.classList.add(\"pg-ready\");\n            const wrap = document.getElementById(\"pagination-wrapper\");\n            if (wrap) {\n              wrap.classList.add(\"pg-ready\");\n              wrap.classList.add(\"is-hidden\");\n            }\n            return;\n          }\n\n          currentPage = Math.min(Math.max(1, pageNum), totalPages);\n\n          const start = (currentPage - 1) * ITEMS_PER_PAGE;\n          const end = start + ITEMS_PER_PAGE;\n\n          allEventItems.forEach(function (item) {\n            item.classList.remove(\"pagination-hidden\");\n          });\n\n          allEventItems.forEach(function (item) {\n            if (\n              item.classList.contains(\"is-hidden-by-filter\") ||\n              item.classList.contains(\"is-hidden-by-year\") ||\n              item.classList.contains(\"is-hidden-by-type\")\n            ) {\n              item.classList.add(\"pagination-hidden\");\n            } else {\n              var indexInVisible = visibleEventItems.indexOf(item);\n              if (indexInVisible < start || indexInVisible >= end) {\n                item.classList.add(\"pagination-hidden\");\n              }\n            }\n          });\n\n          updatePaginationControls();\n\n            if (SCROLL_ON_PAGE_CHANGE) {\n              var doScrollTop = function () {\n            \n                try {\n                  window.scrollTo({ top: 0, left: 0, behavior: \"smooth\" });\n                } catch (e) {\n                  window.scrollTo(0, 0);\n                }\n              };\n              if (window.requestAnimationFrame) {\n            \n                requestAnimationFrame(function () {\n                  requestAnimationFrame(doScrollTop);\n                });\n              } else {\n                setTimeout(doScrollTop, 0);\n              }\n            }\n\n\n          eventListContainer.classList.add(\"pg-ready\");\n          const wrap = document.getElementById(\"pagination-wrapper\");\n          if (wrap) {\n            wrap.classList.add(\"pg-ready\");\n            const hide = visibleEventItems.length === 0 || totalPages <= 1;\n            wrap.classList.toggle(\"is-hidden\", hide);\n            wrap.setAttribute(\"aria-hidden\", hide ? \"true\" : \"false\");\n          }\n        }\n        function updatePaginationControls() {\n          const prevBtn = document.querySelector(\".pagination-prev\");\n          const nextBtn = document.querySelector(\".pagination-next\");\n          const numbers = document.querySelector(\".pagination-numbers\");\n          if (!prevBtn || !nextBtn || !numbers) return;\n\n          prevBtn.disabled =\n            currentPage === 1 || visibleEventItems.length === 0;\n          nextBtn.disabled =\n            currentPage === totalPages || visibleEventItems.length === 0;\n\n          if (!isMobile()) {\n            numbers.innerHTML = generatePageNumbers();\n\n            numbers\n              .querySelectorAll(\".page-number:not(.page-ellipsis)\")\n              .forEach((btn) => {\n                if (!btn.classList.contains(\"active\")) {\n                  btn.addEventListener(\"click\", function () {\n                    const n = parseInt(this.getAttribute(\"data-page\"), 10);\n                    showPage(n);\n                  });\n                }\n              });\n          } else {\n            numbers.innerHTML = buildMobileCount();\n          }\n        }\n\n        function buildMobileCount() {\n          const displayCurrent = visibleEventItems.length > 0 ? currentPage : 0;\n          const displayTotal = visibleEventItems.length > 0 ? totalPages : 0;\n\n          return (\n            '<span class=\"pagination-count\" aria-live=\"polite\" aria-atomic=\"true\">' +\n            '<span class=\"box current\">' +\n            displayCurrent +\n            \"<\/span>\" +\n            '<span class=\"box sep\">\/<\/span>' +\n            '<span class=\"box total\">' +\n            displayTotal +\n            \"<\/span>\" +\n            \"<\/span>\"\n          );\n        }\n\n        function generatePageNumbers() {\n          let html = \"\";\n\n          if (totalPages === 0) {\n            return '<span class=\"no-results\">No results<\/span>';\n          }\n\n          if (totalPages <= 7) {\n            for (let i = 1; i <= totalPages; i++) html += pageBtn(i);\n          } else {\n            html += pageBtn(1);\n\n            if (currentPage > 3)\n              html += '<span class=\"page-number page-ellipsis\">...<\/span>';\n\n            let start = Math.max(2, currentPage - 1);\n            let end = Math.min(totalPages - 1, currentPage + 1);\n\n            if (currentPage <= 3) end = 4;\n            if (currentPage >= totalPages - 2) start = totalPages - 3;\n\n            for (let i = start; i <= end; i++) html += pageBtn(i);\n\n            if (currentPage < totalPages - 2)\n              html += '<span class=\"page-number page-ellipsis\">...<\/span>';\n\n            html += pageBtn(totalPages);\n          }\n          return html;\n        }\n\n        function pageBtn(n) {\n          const active = n === currentPage ? \"active\" : \"default\";\n          const aria =\n            n === currentPage ? `Current page, page ${n}` : `Go to page ${n}`;\n          return `<button class=\"page-number ${active}\" data-page=\"${n}\" aria-label=\"${aria}\">${n}<\/button>`;\n        }\n\n        function bindPaginationEvents() {\n          document.addEventListener(\"click\", function (e) {\n            if (e.target.closest(\".pagination-prev\") && currentPage > 1) {\n              showPage(currentPage - 1);\n            }\n            if (\n              e.target.closest(\".pagination-next\") &&\n              currentPage < totalPages\n            ) {\n              showPage(currentPage + 1);\n            }\n          });\n        }\n      })();\n    <\/script>\n  <\/body>\n<\/html>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ef09404 elementor-widget elementor-widget-html\" data-id=\"ef09404\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\n  :lang(zh) .mc-card__presented .i18n-en,\n  html[lang*=\"zh\"] .mc-card__presented .i18n-en {\n    display: inline !important;\n  }\n  .events-wrapper {\n    max-width: 1040px;\n  }\n  .mc-card-wrapper {\n    margin-top: 20px;\n    margin-bottom: 16.39px;\n    padding: 0 8px;\n  }\n\n  .mc-event-list-container .mc-event-list {\n    list-style: none;\n    margin: 0;\n    padding: 0;\n    display: grid;\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n    gap: 16px;\n  }\n\n  .mc-event-list-container .mc-event-list > li {\n    list-style: none;\n    height: 100%;\n  }\n\n  .mc-event-list-container .mc-card {\n    position: relative;\n    padding: 16px;\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n    background: #fff;\n    border-radius: 16px;\n    overflow: hidden;\n    min-height: 472px;\n  }\n\n  .mc-event-list-container .mc-card__thumb {\n    display: block;\n    line-height: 0;\n  }\n  .mc-event-list-container .mc-card__thumb img {\n    display: block;\n    width: 304px;\n    border-radius: 8px;\n    object-fit: cover;\n  }\n\n  .mc-event-list-container .mc-card__presented {\n    color: #b22933;\n    font-family: Roboto Condensed;\n    font-weight: 600;\n    font-size: 14px;\n    line-height: 100%;\n    margin-bottom: 12px;\n  }\n\n  .mc-event-list-container .mc-card__title {\n    font-family: Roboto;\n    font-weight: 600;\n    font-size: 20px;\n    line-height: 120%;\n    color: #222222;\n    margin-bottom: 12px;\n  }\n  .mc-event-list-container .mc-card__title a {\n    color: inherit;\n    text-decoration: none;\n  }\n\n  .mc-event-list-container .mc-card__meta .mc-card__row {\n    display: flex;\n    gap: 24px;\n  }\n  .mc-event-list-container .mc-card__meta dt {\n    min-width: 48px;\n    font-family: Roboto Condensed;\n    font-weight: 600;\n    color: #999999;\n    font-size: 14px;\n    line-height: 140%;\n  }\n  .mc-event-list-container .mc-card__meta dd {\n    font-family: Roboto;\n    font-weight: 400;\n    font-style: Regular;\n    font-size: 14px;\n    line-height: 140%;\n    color: #222222;\n    max-width: 216px;\n  }\n\n  .mc-event-list-container .mc-card__cta {\n    margin-top: auto;\n  }\n  .mc-event-list-container .mc-card__cta .mc-btn {\n    display: flex;\n    width: 100%;\n    text-align: center;\n    padding: 12px 0;\n    background: #de3340;\n    color: #fff;\n    text-decoration: none;\n    font-weight: 700;\n    border-radius: 4px;\n    font-family: Roboto Condensed;\n    font-weight: 600;\n    font-size: 16px;\n    line-height: 100%;\n    color: #ffffff;\n    justify-content: center;\n    gap: 8px;\n    height: 43px;\n  }\n  .mc-event-list-container .mc-card__cta .mc-btn:hover {\n    background: #b22933;\n  }\n  .mc-event-list-container .mc-card__cta .mc-btn:active {\n    transform: translateY(1px);\n  }\n  .metaslider .caption-wrap .caption .slider-text:hover {\n    text-decoration: underline;\n    cursor: pointer;\n  }\n  .event-toggle .todo-list .elementor-icon-list-icon {\n    display: none !important;\n  }\n  .event-toggle\n    .todo-list\n    .elementor-icon-list-items\n    .elementor-icon-list-item::before {\n    content: none !important;\n    display: none !important;\n  }\n\n  .event-toggle\n    .todo-list\n    .elementor-icon-list-items\n    .elementor-icon-list-item {\n    gap: 12px;\n    height: 38px;\n    padding: 8px 12px !important;\n    border-radius: 8px;\n    background: transparent;\n    cursor: pointer;\n  }\n\n  .event-toggle\n    .todo-list\n    .elementor-icon-list-items\n    .elementor-icon-list-item:hover,\n  .event-toggle\n    .todo-list\n    .elementor-icon-list-items\n    .elementor-icon-list-item:focus,\n  .event-toggle\n    .todo-list\n    .elementor-icon-list-items\n    .elementor-icon-list-item.is-checked {\n    background: #fcebec !important;\n  }\n  .event-toggle .selector-wrapper,\n  .event-toggle .elementor-widget-container {\n    padding: 0px !important;\n  }\n  .elementor-icon-list-item {\n    border-radius: 0px !important;\n  }\n  .elementor-icon-list-item:first-child {\n    border-radius: 8px 8px 0px 0px !important;\n  }\n  .elementor-icon-list-item:last-child {\n    border-radius: 0px 0px 8px 8px !important;\n  }\n\n  .events-wrapper > .e-flex.e-con:has(.date-selector, .event-toggle) {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    gap: 0 !important;\n  }\n  .events-wrapper\n    > .e-flex.e-con:has(.date-selector, .event-toggle)\n    > .elementor-element {\n    flex: 0 1 auto !important;\n    width: auto !important;\n  }\n  .events-wrapper\n    > .e-flex.e-con:has(.date-selector, .event-toggle)\n    > .date-selector {\n    flex: 0 0 auto !important;\n  }\n  .events-wrapper\n    > .e-flex.e-con:has(.date-selector, .event-toggle)\n    > .event-type-selector {\n    flex: 1 1 0% !important;\n    min-width: 0 !important;\n    position: relative !important;\n  }\n  .events-wrapper\n    > .e-flex.e-con:has(.date-selector, .event-toggle)\n    > :has(.event-toggle) {\n    margin-left: auto !important;\n    flex: 0 0 auto !important;\n  }\n\n  .date-selector {\n    position: relative;\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    margin-right: 20px;\n    cursor: pointer;\n    text-align: left !important;\n  }\n  .date-selector .selector-title .elementor-widget-container {\n    text-align: left !important;\n  }\n  .date-selector .elementor-widget-image {\n    flex: 0 0 auto;\n  }\n\n  .event-toggle {\n    display: flex;\n    align-items: center;\n    justify-content: flex-end;\n    gap: 8px;\n    margin-left: auto;\n    min-width: max-content;\n    cursor: pointer;\n  }\n  .event-toggle .elementor-widget-heading .elementor-widget-container {\n    text-align: right !important;\n  }\n\n  .date-selector .selector-wrapper,\n  .event-type-selector .selector-wrapper,\n  .event-toggle .selector-wrapper {\n    position: absolute;\n    left: 0;\n    top: 100%;\n    z-index: 1000;\n    min-width: 160px;\n    background: #fff;\n    border: 1px solid #e6e6e6;\n    border-radius: 8px;\n    padding: 6px;\n    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);\n    visibility: hidden;\n    opacity: 0;\n    pointer-events: none;\n    transform: translateY(4px);\n    transition: opacity 0.18s ease, transform 0.18s ease,\n      visibility 0s linear 0.18s;\n  }\n  .event-type-selector:hover .selector-wrapper,\n  .event-type-selector .selector-wrapper:hover,\n  .date-selector:hover .selector-wrapper,\n  .date-selector .selector-wrapper:hover,\n  .event-toggle:hover .selector-wrapper,\n  .event-toggle .selector-wrapper:hover {\n    visibility: visible;\n    opacity: 1;\n    pointer-events: auto;\n    transform: translateY(0);\n    transition: opacity 0.18s ease, transform 0.18s ease, visibility 0s;\n  }\n\n  .todo-list {\n    --cb-unchecked: url(\"\/wp-content\/uploads\/2025\/09\/Checkbox.png\");\n    --cb-checked: url(\"\/wp-content\/uploads\/2025\/09\/Checkbox-1.png\");\n    --cb-size: 16px;\n    --cb-hover-bg: #fcebec;\n  }\n  .todo-list .elementor-icon-list-icon {\n    display: none;\n  }\n  .todo-list .elementor-icon-list-items .elementor-icon-list-item {\n    display: flex;\n    align-items: center;\n    gap: 12px;\n    cursor: pointer;\n    line-height: 140%;\n    border-radius: 8px;\n    background: transparent;\n    height: 36px;\n    padding: 6px 8px !important;\n  }\n  .todo-list .elementor-icon-list-items .elementor-icon-list-item:hover,\n  .todo-list .elementor-icon-list-items .elementor-icon-list-item:focus {\n    background: var(--cb-hover-bg);\n    outline: none;\n  }\n  .todo-list .elementor-icon-list-items .elementor-icon-list-item::before {\n    content: \"\";\n    display: block;\n    width: var(--cb-size);\n    height: var(--cb-size);\n    flex: 0 0 var(--cb-size);\n    background-image: var(--cb-unchecked);\n    background-size: 100% 100%;\n    background-repeat: no-repeat;\n    background-position: center;\n  }\n  .todo-list\n    .elementor-icon-list-items\n    .elementor-icon-list-item.is-checked::before {\n    background-image: var(--cb-checked);\n  }\n  .todo-list .elementor-icon-list-items .elementor-icon-list-text {\n    font-size: 16px;\n    font-family: Roboto;\n    font-weight: 400;\n    line-height: 140%;\n    color: #222;\n    margin: 0;\n  }\n  .elementor-widget .elementor-icon-list-icon + .elementor-icon-list-text {\n    padding-inline-start: 0;\n  }\n\n  [id=\"#sort_by\"]\n    .todo-list\n    .elementor-icon-list-items\n    .elementor-icon-list-item::before,\n  [id=\"#sort_by\"]\n    .todo-list\n    .elementor-icon-list-items\n    .elementor-icon-list-item.is-checked::before {\n    content: none !important;\n    display: none !important;\n  }\n  [id=\"#sort_by\"]\n    .todo-list\n    .elementor-icon-list-items\n    .elementor-icon-list-item {\n    gap: 0 !important;\n    padding: 8px 24px 8px 12px !important;\n  }\n  [id=\"#sort_by\"] .elementor-widget-container {\n    padding: 0 !important;\n  }\n  #sort_by\n    .todo-list\n    .elementor-icon-list-items\n    .elementor-icon-list-item:first-child {\n    border-bottom-left-radius: 0 !important;\n    border-bottom-right-radius: 0 !important;\n  }\n  #sort_by\n    .todo-list\n    .elementor-icon-list-items\n    .elementor-icon-list-item:nth-child(2) {\n    border-top-left-radius: 0 !important;\n    border-top-right-radius: 0 !important;\n  }\n\n  .mc-card__thumb {\n    position: relative;\n    display: block;\n    border-radius: 12px;\n    background: #f2f2f2;\n    width: 100%;\n    max-width: 100%;\n  }\n  .mc-card__thumb img {\n    display: block;\n    width: 100%;\n    height: auto;\n    max-width: 100%;\n    object-fit: cover;\n    object-position: top center;\n    aspect-ratio: 3\/2;\n  }\n\n  .mc-badge-featured {\n    position: absolute;\n    left: 0;\n    top: 0;\n    z-index: 2;\n    padding: 8px 12px;\n    background: #de3340;\n    color: #fff;\n    font-family: Roboto Condensed;\n    font-weight: 600;\n    font-size: 14px;\n    line-height: 140%;\n    border-top-left-radius: 8px;\n    pointer-events: none;\n  }\n\n  .space {\n    margin-top: 20px;\n  }\n\n  #osc-mc-modal {\n    position: fixed;\n    inset: 0;\n    display: none;\n    z-index: 99999;\n    background-color: rgba(0, 0, 0, 0.5);\n  }\n  #osc-mc-modal.is-open {\n    display: block;\n  }\n  #osc-mc-modal .osc-box {\n    position: absolute;\n    left: 50%;\n    top: 50%;\n    transform: translate(-50%, -50%);\n    box-sizing: border-box;\n    width: 1120px;\n    max-width: calc(100vw - 96px);\n    max-height: calc(100vh - 13px);\n    background-color: #f0f0f0;\n    border-radius: 24px;\n    padding: 24px 48px 48px 48px;\n  }\n  #osc-mc-modal .osc-content {\n    max-height: calc(100vh - 160px);\n    overflow: auto;\n    -ms-overflow-style: none;\n    scrollbar-width: none;\n    -webkit-overflow-scrolling: touch;\n    padding: 0;\n    display: block;\n  }\n  #osc-mc-modal .osc-content::-webkit-scrollbar,\n  .date-selector .selector-wrapper::-webkit-scrollbar,\n  .event-toggle .selector-wrapper::-webkit-scrollbar {\n    width: 0;\n    height: 0;\n    display: none;\n  }\n  #osc-mc-modal .red-decoration-line {\n    position: relative;\n    left: 50%;\n    top: 12px;\n    transform: translateX(-50%);\n    width: 560px;\n    height: 24px;\n    background-color: #de3340;\n    z-index: 1;\n    content: \"\";\n  }\n  #osc-mc-modal .osc-close {\n    position: absolute;\n    right: -42px;\n    top: 0;\n    padding: 0;\n    border: 0;\n    background: transparent;\n    width: 40px;\n    height: 40px;\n    line-height: 1;\n    cursor: pointer;\n    z-index: 2;\n    color: #001246;\n  }\n\n  .mc-popup {\n    display: flex;\n    flex-direction: column;\n  }\n  .mc-popup__image-wrap {\n    position: relative;\n    width: 100%;\n    overflow: hidden;\n    max-width: 100%;\n  }\n  .mc-popup__image {\n    display: block;\n    width: 100%;\n    height: auto;\n    max-width: 100%;\n    object-fit: cover;\n    object-position: center;\n    border-radius: 24px;\n    aspect-ratio: 5\/2;\n  }\n  .mc-popup__body {\n    padding-top: 40px;\n  }\n  .mc-popup__grid {\n    display: grid;\n    grid-template-columns: 352px 1fr;\n    gap: 0 48px;\n    align-items: start;\n  }\n  .mc-popup__presented {\n    font: 600 20px\/1.2 \"Roboto Condensed\";\n    color: #b22933;\n    margin: 0 0 8px;\n  }\n  .mc-popup__title {\n    margin: 0;\n    font-family: \"Montserrat Alternates\";\n    font-weight: 700 !important;\n    font-size: 32px !important;\n    line-height: 120%;\n    color: #222 !important;\n  }\n  .mc-popup__meta {\n    margin: 0 0 24px;\n    display: grid;\n    grid-template-columns: 80px 1fr;\n    gap: 4px 16px;\n  }\n  .mc-popup__label {\n    font-family: Roboto condensed;\n    margin: 0;\n    color: #b22933;\n    font-weight: 600;\n    font-size: 16px;\n    line-height: 140%;\n    width: 80px;\n  }\n  .mc-popup__value {\n    margin: 0;\n    color: #222;\n    font-family: Roboto;\n    font-weight: 400;\n    font-size: 16px;\n    line-height: 140%;\n  }\n  .mc-popup__divider {\n    height: 2px;\n    background: #de3340;\n    margin: 16px 0;\n  }\n  .mc-popup__desc {\n    color: #222;\n    font-family: Roboto;\n    font-weight: 400;\n    font-size: 20px;\n    line-height: 150%;\n    margin-bottom: 32px;\n  }\n  .mc-popup__note {\n    font-weight: 700;\n  }\n  .mc-popup__cta {\n    margin-top: 4px;\n  }\n  #osc-mc-modal .osc-go {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    padding: 12px 24px;\n    border: 1px solid #b22933;\n    background: transparent;\n    color: #b22933;\n    font: 600 16px\/100% Roboto Condensed;\n    text-decoration: none;\n    border-radius: 4px;\n  }\n  #osc-mc-modal .osc-go:hover {\n    border: 2px solid #b22933;\n  }\n\n  .is-hidden-by-year {\n    display: none !important;\n  }\n  .is-hidden-by-type {\n    display: none !important;\n  }\n  .is-hidden-by-filter {\n    display: none !important;\n  }\n\n  .event-type-selector .elementor-icon-list-items .elementor-icon-list-item {\n    position: relative;\n  }\n  .event-type-selector\n    .elementor-icon-list-items\n    .elementor-icon-list-item\n    > a {\n    display: flex;\n    align-items: center;\n    gap: 12px;\n    width: 100%;\n  }\n\n  .date-selector .selector-wrapper,\n  .event-type-selector .selector-wrapper,\n  .event-toggle .selector-wrapper {\n    width: max-content;\n    min-width: 160px;\n  }\n  .selector-wrapper {\n    padding: 0px !important;\n  }\n\n  .todo-list .elementor-icon-list-items,\n  .todo-list .elementor-icon-list-items .elementor-icon-list-item,\n  .todo-list .elementor-icon-list-items .elementor-icon-list-item > a,\n  .todo-list .elementor-icon-list-items .elementor-icon-list-text {\n    white-space: nowrap;\n  }\n  .event-type-selector [data-slug=\"charitybazaars\"],\n  #osc-filter-modal .type-list [data-slug=\"charitybazaars\"],\n  .event-type-selector [data-slug=\"specialevents\"],\n  #osc-filter-modal .type-list [data-slug=\"specialevents\"] {\n    display: none !important;\n  }\n\n  .events-wrapper > .e-flex.e-con:has(.date-selector, .event-toggle) {\n    flex-wrap: nowrap;\n  }\n\n  .events-wrapper\n    > .e-flex.e-con:has(.date-selector, .event-toggle)\n    > .event-type-selector {\n    flex: 0 0 auto !important;\n    min-width: max-content !important;\n    position: relative !important;\n  }\n\n  .date-selector .selector-title .elementor-heading-title,\n  .event-type-selector .selector-title .elementor-heading-title,\n  .event-toggle .elementor-heading-title {\n    white-space: nowrap;\n  }\n\n  .date-selector,\n  .event-type-selector,\n  .event-toggle {\n    min-width: max-content;\n  }\n\n  #osc-filter-modal {\n    position: fixed;\n    inset: 0;\n    display: none;\n    z-index: 99999;\n    background: rgba(0, 0, 0, 0.5);\n  }\n  #osc-filter-modal.is-open {\n    display: block;\n  }\n  #osc-filter-modal .box {\n    position: absolute;\n    box-sizing: border-box;\n    width: 100vw;\n    max-height: calc(100vh - 80px);\n    overflow: hidden;\n    background: #fff;\n    border-radius: 16px 16px 0 0;\n    padding: 24px 32px 83px;\n    top: 100px !important;\n    bottom: 0 !important;\n    left: 50% !important;\n    transform: translateX(-50%) !important;\n    height: auto !important;\n    max-height: none !important;\n    max-width: 767px;\n  }\n  #osc-filter-modal .content {\n    scrollbar-width: thin;\n    scrollbar-color: #e7e7e7 transparent;\n    margin-right: -42px;\n    padding-right: 42px;\n  }\n\n  #osc-filter-modal .content::-webkit-scrollbar {\n    width: 8px;\n  }\n  #osc-filter-modal .content::-webkit-scrollbar-track {\n    background: transparent;\n  }\n  #osc-filter-modal .content::-webkit-scrollbar-thumb {\n    background-color: #e7e7e7;\n    border-radius: 8px;\n    border: 2px solid transparent;\n    background-clip: content-box;\n  }\n  #osc-filter-modal .content::-webkit-scrollbar-thumb:hover {\n    background-color: #c4c4c4;\n  }\n  #osc-filter-modal .header {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n  }\n  #osc-filter-modal .title {\n    font-family: Roboto;\n    font-weight: 600;\n    font-size: 20px;\n    line-height: 150%;\n    color: #000;\n  }\n  #osc-filter-modal .filter-popup-close,\n  #osc-filter-modal .filter-popup-close:focus,\n  #osc-filter-modal .filter-popup-close:active {\n    outline: none !important;\n    box-shadow: none !important;\n    border: 0 !important;\n    background: transparent !important;\n  }\n  #osc-filter-modal .box:focus {\n    outline: none !important;\n  }\n  #osc-filter-modal .filter-popup-close {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    cursor: pointer;\n    padding: 0;\n  }\n  #osc-filter-modal .content {\n    overflow: auto;\n    max-height: calc(100% - 52px);\n  }\n  #osc-filter-modal .section-title {\n    font-family: Roboto;\n    font-weight: 600;\n    font-size: 14px;\n    line-height: 150%;\n    color: #000;\n    text-transform: none;\n  }\n  #osc-filter-modal .year-list .elementor-icon-list-items,\n  #osc-filter-modal .type-list .elementor-icon-list-items {\n    margin: 0;\n    padding: 0;\n    list-style: none;\n    display: flex;\n    flex-direction: column;\n    gap: 8px;\n  }\n  #osc-filter-modal\n    .todo-list\n    .elementor-icon-list-items\n    .elementor-icon-list-item,\n  #osc-filter-modal .radio {\n    display: flex;\n    align-items: center;\n    gap: 12px;\n    justify-content: space-between;\n    padding: 0 0 0 12px !important;\n    height: 17px;\n  }\n  #osc-filter-modal .radio {\n    flex-direction: row-reverse;\n  }\n  #osc-filter-modal\n    .todo-list\n    .elementor-icon-list-items\n    .elementor-icon-list-item:hover,\n  .todo-list .elementor-icon-list-items .elementor-icon-list-item:focus {\n    background: transparent;\n  }\n  #osc-filter-modal .sort-group {\n    display: grid;\n    gap: 8px;\n  }\n  #osc-filter-modal .radio input {\n    appearance: none;\n    width: 16px;\n    height: 16px;\n    border: 1px solid #b7b7b7;\n    border-radius: 50%;\n    display: inline-block;\n    position: relative;\n    cursor: pointer;\n  }\n  #osc-active-filters .clear-all {\n    background: transparent;\n    border: 0;\n    color: #666;\n    text-decoration: underline;\n    cursor: pointer;\n    font-family: Roboto Condensed;\n    font-weight: 400;\n    font-size: 12px;\n    line-height: 140%;\n    height: auto;\n    padding: 0;\n  }\n  #osc-filter-modal .radio input:checked {\n    border-color: #de3340;\n  }\n  #osc-filter-modal .radio input:checked::after {\n    content: \"\";\n    position: absolute;\n    left: 50%;\n    top: 50%;\n    width: 8px;\n    height: 8px;\n    border-radius: 50%;\n    transform: translate(-50%, -50%);\n    background: #de3340;\n  }\n  #osc-filter-modal .radio span {\n    font-family: Roboto;\n    font-weight: 400;\n    font-size: 12px;\n    line-height: 140%;\n    color: #222;\n  }\n  #osc-filter-modal .actions {\n    position: absolute;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    display: flex;\n    justify-content: center;\n    gap: 8px;\n    padding: 16px 0 24px;\n    background: #fff;\n    border-top: 1px solid #e7e7e7;\n    margin: 0 30px;\n    width: auto;\n  }\n  #osc-filter-modal .btn {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    height: 43px;\n    border-radius: 4px;\n    font-family: Roboto Condensed;\n    font-weight: 600;\n    font-size: 16px;\n    line-height: 100%;\n    cursor: pointer;\n    border: 0;\n    text-decoration: none;\n    padding: 12px 0 !important;\n    width: 100%;\n  }\n  #osc-filter-modal .btn-clear {\n    background: #fff;\n    color: #b22933 !important;\n    border: #b22933 1px solid;\n  }\n  #osc-filter-modal .btn-apply {\n    background: #de3340;\n    color: #fff;\n  }\n\n  #osc-filter-modal\n    .todo-list\n    .elementor-icon-list-items\n    .elementor-icon-list-item::before {\n    content: none !important;\n    display: none !important;\n  }\n  #osc-filter-modal\n    .todo-list\n    .elementor-icon-list-items\n    .elementor-icon-list-item.is-checked::after,\n  #osc-filter-modal\n    .todo-list\n    .elementor-icon-list-items\n    .elementor-icon-list-item[aria-checked=\"true\"]::after {\n    background-image: var(--cb-checked);\n  }\n  #osc-filter-modal .elementor-icon-list-items .elementor-icon-list-item {\n    white-space: normal !important;\n  }\n  #osc-filter-modal\n    .todo-list\n    .elementor-icon-list-items\n    .elementor-icon-list-item::after {\n    content: \"\";\n    width: var(--cb-size);\n    height: var(--cb-size);\n    flex: 0 0 var(--cb-size);\n    background-image: var(--cb-unchecked);\n    background-size: 100% 100%;\n    background-repeat: no-repeat;\n    background-position: center;\n    margin-left: auto;\n  }\n  #osc-filter-modal\n    .todo-list\n    .elementor-icon-list-items\n    .elementor-icon-list-text {\n    font-size: 12px;\n  }\n\n  #osc-filter-modal .section-title.accordion-toggle {\n    width: 100%;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    padding: 16px 0 8px 0;\n    background: transparent;\n    border: 0;\n    cursor: pointer;\n    font-family: Roboto;\n    font-weight: 600;\n    font-size: 14px;\n    color: #000;\n    text-align: left;\n  }\n\n  #osc-filter-modal .accordion-icon {\n    width: 16px;\n    height: 16px;\n    background-image: url(\"\/wp-content\/uploads\/2025\/10\/icon_arrow3_24x24-1.png\");\n    background-size: contain;\n    background-repeat: no-repeat;\n  }\n\n  #osc-filter-modal .accordion-toggle[aria-expanded=\"true\"] .accordion-icon {\n    background-image: url(\"\/wp-content\/uploads\/2025\/10\/icon_arrow3_24x24.png\");\n  }\n\n  #osc-filter-modal .year-buttons {\n    display: grid;\n    grid-template-columns: repeat(5, 1fr);\n    gap: 4px;\n  }\n\n  #osc-filter-modal .year-btn {\n    padding: 8px 18px;\n    border: 1px solid #bab4b4;\n    border-radius: 4px;\n    background: #fff;\n    font-weight: 400;\n    font-size: 10px;\n    color: #222;\n    cursor: pointer;\n    font-family: Roboto Condensed;\n    line-height: 100%;\n  }\n\n  #osc-filter-modal .year-btn.is-active {\n    background: #de3340;\n    color: #fff;\n    border-color: #de3340;\n  }\n\n  #osc-active-filters {\n    display: none;\n    align-items: center;\n    gap: 8px;\n    margin-top: 12px;\n  }\n  #osc-active-filters.has-items {\n    display: flex;\n  }\n  #osc-active-filters .chips {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 10px;\n  }\n  #osc-active-filters .chip {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    border-radius: 4px;\n    background: #fff;\n    font-family: Roboto Condensed;\n    font-weight: 600;\n    font-size: 14px;\n    line-height: 140%;\n    color: #b22933;\n    border: 0;\n    height: 28px;\n    padding: 4px 6px;\n  }\n  #osc-active-filters .chip .x {\n    display: inline-block;\n    line-height: 1;\n    cursor: pointer;\n    font-weight: 700;\n    width: 8px;\n  }\n  #osc-active-filters .chip--reset {\n    background: transparent;\n    border: 0;\n    color: #666;\n    text-decoration: underline;\n    cursor: pointer;\n    font-family: Roboto Condensed;\n    font-weight: 400;\n    font-size: 12px;\n    line-height: 140%;\n    height: auto;\n    padding: 0;\n  }\n  #osc-active-filters .chip--reset:hover {\n    text-decoration: none;\n  }\n\n  @media (max-width: 1024px) {\n    .mc-event-list-container .mc-event-list {\n      grid-template-columns: repeat(2, minmax(0, 1fr));\n    }\n    .mc-event-list-container .mc-card {\n      min-height: auto;\n    }\n    .mc-event-list-container .mc-card__thumb img {\n      width: 408px;\n    }\n    .mc-card-wrapper {\n      margin-top: 16px;\n    }\n    .mc-event-list-container .mc-card__presented {\n      font-size: 12px;\n      margin-bottom: 8px;\n    }\n    .mc-event-list-container .mc-card__title {\n      font-size: 18px;\n      margin-bottom: 8px;\n    }\n    .mc-event-list-container .mc-card__meta dt,\n    .mc-event-list-container .mc-card__meta dd {\n      font-size: 12px;\n    }\n    .event-toggle {\n      gap: 20px !important;\n    }\n    #osc-mc-modal .red-decoration-line {\n      width: 426px;\n      height: 16px;\n    }\n\n    #osc-mc-modal .osc-box {\n      width: 1024px;\n      max-height: calc(100vw - 42px);\n      border-radius: 16px;\n      padding: 20px 36px 36px 36px;\n    }\n    #osc-mc-modal .osc-box {\n      left: 50%;\n      transform: translateX(-50%);\n      top: 42px;\n      bottom: 42px;\n      width: min(1024px, calc(100vw - 96px));\n      max-height: none;\n      border-radius: 16px;\n      padding: 20px 36px 36px 36px;\n    }\n\n    #osc-mc-modal .osc-content {\n      height: 100%;\n      max-height: calc(100dvh - 84px - 56px);\n      overflow: auto;\n    }\n    .mc-popup__image {\n      border-radius: 16px;\n    }\n    .mc-popup__presented {\n      font-size: 16px;\n      margin-bottom: 6px;\n    }\n    .mc-popup__title {\n      font-size: 28px !important;\n    }\n    .mc-popup__divider {\n      margin: 12px 0;\n    }\n    .mc-popup__meta {\n      gap: 2px 16px;\n      margin-bottom: 20px;\n    }\n    .mc-popup__label {\n      font-size: 16px;\n    }\n    .mc-popup__value {\n      font-size: 14px;\n    }\n    .mc-popup__grid {\n      grid-template-columns: auto;\n    }\n    .mc-popup__desc {\n      font-size: 16px;\n      margin-bottom: 24px;\n      margin-top: 24px;\n    }\n  }\n  @media (max-width: 768px) {\n    #osc-mc-modal .red-decoration-line {\n      width: 296px;\n      height: 16px;\n    }\n  }\n\n  @media (max-width: 767px) {\n    .mc-event-list-container .mc-event-list {\n      grid-template-columns: 1fr;\n    }\n    .mc-event-list-container .mc-card {\n      min-height: auto;\n      border-radius: 8px;\n      max-width: 767px;\n      padding: 8px;\n    }\n    .mc-event-list-container .mc-card__thumb img {\n      width: 100%;\n      border-radius: 4px;\n    }\n    .mc-event-list-container .mc-card__presented {\n      margin-bottom: 6px;\n    }\n    .mc-event-list-container .mc-card__title {\n      font-size: 16px;\n      margin-bottom: 6px;\n    }\n    .mc-card-wrapper {\n      margin-top: 12px;\n      margin-bottom: 12px;\n    }\n    .mc-event-list-container .mc-event-list > li {\n      margin: 0 auto;\n    }\n    .elementor-element-91c8262 > .e-con-inner {\n      overflow: visible !important;\n    }\n\n    .elementor-element-36a8232,\n    .elementor-element-0924bf3,\n    .elementor-element-bac377b {\n      overflow: visible !important;\n    }\n    .e-con.e-flex {\n      --flex-wrap: none;\n    }\n    .events-wrapper .elementor-hidden-desktop.elementor-hidden-tablet {\n      cursor: pointer;\n    }\n    .space {\n      margin-top: 14px;\n    }\n    .mc-badge-featured {\n      left: 0;\n      top: 0;\n      padding: 6px 10px;\n      font-size: 12px;\n      border-top-left-radius: 4px;\n    }\n    #osc-mc-modal .osc-go {\n      padding: 8px 12px;\n    }\n    #osc-mc-modal .osc-close {\n      right: 0;\n      top: -41px;\n    }\n\n    #osc-mc-modal {\n      --safe-top: max(52px, env(safe-area-inset-top));\n    }\n    #osc-mc-modal .osc-box {\n      position: absolute;\n      left: 0;\n      right: 0;\n      top: var(--safe-top);\n      bottom: 0;\n      transform: none;\n      width: auto;\n      max-width: none;\n      height: auto;\n      max-height: none;\n      border-radius: 0;\n      padding: 0;\n      overflow: unset;\n    }\n    #osc-mc-modal .osc-content {\n      height: 100%;\n      max-height: none;\n      overflow: auto;\n      -webkit-overflow-scrolling: touch;\n    }\n    .mc-popup__body {\n      padding-top: 0;\n    }\n    .mc-popup__image {\n      border-radius: 0;\n      aspect-ratio: 2\/1;\n    }\n    #osc-mc-modal .red-decoration-line {\n      display: none;\n    }\n    .mc-popup__presented {\n      font-size: 14px;\n      margin-bottom: 4px;\n    }\n    .mc-popup__grid {\n      padding: 32px;\n      gap: 0 20px;\n    }\n    .mc-popup__title {\n      font-size: 24px !important;\n    }\n    .mc-popup__divider {\n      margin: 8px 0;\n    }\n    .mc-popup__meta {\n      gap: 2px 12px;\n      margin-bottom: 8px;\n    }\n    .mc-popup__label {\n      min-width: 64px;\n      font-size: 14px;\n    }\n    .mc-popup__value {\n      font-size: 14px;\n    }\n    .mc-event-list-container .mc-card {\n      height: auto;\n      overflow: visible;\n    }\n    .mc-event-list-container .mc-event-list {\n      grid-template-columns: 1fr;\n      justify-items: stretch;\n    }\n    .mc-event-list-container .mc-event-list > li {\n      margin: 0;\n      width: 100%;\n      justify-self: stretch;\n    }\n\n    .mc-event-list-container .mc-card {\n      height: auto;\n      overflow: visible;\n    }\n    .mc-event-list-container .mc-event-list > li {\n      height: auto;\n    }\n  }\n\n  @media (max-width: 1025px) {\n    #osc-mc-modal .red-decoration-line {\n      width: 425px;\n    }\n  }\n<\/style>\n\n<script>\n  (function () {\n    \/* =========================\n           CONSTANTS & SELECTORS\n           ========================= *\/\n    var BASE_DETAIL = \"\/event-details\";\n    var DETAIL_PARAM = \"osc_event\";\n    var POPUP_REDIRECT = \"\/citywide-fundraising-events\/\";\n    var ICON_OPEN = \"\/wp-content\/uploads\/2025\/09\/icon_arrow3_24x24-1.png\";\n\n    var SEL = {\n      row: \".events-wrapper > .e-flex.e-con:has(.date-selector, .event-toggle)\",\n      yearList: \".date-selector .todo-list .elementor-icon-list-items\",\n      typeList: \".event-type-selector .todo-list .elementor-icon-list-items\",\n      sortWrap: \".event-toggle\",\n      sortText:\n        \".event-toggle .elementor-widget-heading .elementor-heading-title\",\n      sortIcon: \".event-toggle .elementor-widget-image img\",\n      sortMenu:\n        '.event-toggle .selector-wrapper, .event-toggle [id=\"#sort_by\"], .event-toggle #sort_by',\n      sortMenuItem: \".todo-list .elementor-icon-list-item\",\n      cards: \".mc-card\",\n      cardContainerLi: 'li[class*=\"mc-event-\"]',\n      mobileTrigger:\n        \"#filter-mobile, [data-osc-filter-trigger], .events-wrapper .elementor-hidden-desktop.elementor-hidden-tablet .selector-title\",\n    };\n\n    \/* =========================\n           UTILS\n           ========================= *\/\n    function qs(s, r) {\n      return (r || document).querySelector(s);\n    }\n    function qsa(s, r) {\n      return Array.from((r || document).querySelectorAll(s));\n    }\n    function cleanText(s) {\n      return String(s || \"\")\n        .replace(\/\\u00a0\/g, \" \")\n        .replace(\/\\s+\/g, \" \")\n        .trim();\n    }\n    function hasContent(s) {\n      return !!String(s || \"\").replace(\/&nbsp;|\\s+\/g, \"\").length;\n    }\n    function esc(s) {\n      return (s || \"\").replace(\n        \/[&<>\"']\/g,\n        (m) =>\n          ({\n            \"&\": \"&amp;\",\n            \"<\": \"&lt;\",\n            \">\": \"&gt;\",\n            '\"': \"&quot;\",\n            \"'\": \"&#39;\",\n          }[m])\n      );\n    }\n\n    \/* =========================\n           MODAL (Tickets popup)\n           ========================= *\/\n    function ensureModal() {\n      var el = document.getElementById(\"osc-mc-modal\");\n      if (el) return el;\n      el = document.createElement(\"div\");\n      el.id = \"osc-mc-modal\";\n      el.innerHTML =\n        '<div class=\"osc-box\">' +\n        '<button class=\"osc-close\" aria-label=\"Close\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/09\/Fab_.png\" alt=\"icon\" \/><\/button>' +\n        '<div class=\"osc-content\"><\/div>' +\n        \"<\/div>\";\n      document.body.appendChild(el);\n      el.addEventListener(\"click\", function (e) {\n        if (e.target.id === \"osc-mc-modal\" || e.target.closest(\".osc-close\"))\n          el.classList.remove(\"is-open\");\n      });\n      document.addEventListener(\"keydown\", function (e) {\n        if (e.key === \"Escape\") el.classList.remove(\"is-open\");\n      });\n      return el;\n    }\n\n    \/* =========================\n           EVENT DETAIL URL HELPERS\n           ========================= *\/\n    function getMcIdFromHref(href) {\n      if (!href) return \"\";\n      function pickNumParam(s, key) {\n        var i = s.indexOf(key + \"=\");\n        if (i === -1) return \"\";\n        i += key.length + 1;\n        var j = i;\n        while (j < s.length) {\n          var c = s.charCodeAt(j);\n          if (c < 48 || c > 57) break;\n          j++;\n        }\n        return s.slice(i, j);\n      }\n      try {\n        var u = new URL(href, window.location.origin);\n        var v =\n          u.searchParams.get(\"mc_id\") ||\n          u.searchParams.get(\"osc_event\") ||\n          u.searchParams.get(DETAIL_PARAM);\n        return v && \/^\\d+$\/.test(v) ? v : \"\";\n      } catch (_) {\n        var s = String(href || \"\");\n        return (\n          pickNumParam(s, \"mc_id\") ||\n          pickNumParam(s, \"osc_event\") ||\n          pickNumParam(s, DETAIL_PARAM) ||\n          \"\"\n        );\n      }\n    }\n    function getCardMcId(a) {\n      var card = a.closest(\".mc-card\");\n      var urls = [];\n      if (a) {\n        urls.push(a.getAttribute(\"href\"), a.getAttribute(\"data-url\"));\n      }\n      if (card) {\n        var aTitle = card.querySelector(\".mc-card__title a\");\n        var aThumb = card.querySelector(\".mc-card__thumb\");\n        var aBtn = card.querySelector(\".mc-card__cta .mc-btn\");\n        urls.push(\n          aTitle && aTitle.getAttribute(\"href\"),\n          aTitle && aTitle.getAttribute(\"data-url\"),\n          aThumb && aThumb.getAttribute(\"href\"),\n          aThumb && aThumb.getAttribute(\"data-url\"),\n          aBtn && aBtn.getAttribute(\"href\"),\n          aBtn && aBtn.getAttribute(\"data-url\")\n        );\n      }\n      urls = urls.filter(Boolean);\n      for (var i = 0; i < urls.length; i++) {\n        var id = getMcIdFromHref(urls[i]);\n        if (id) return id;\n      }\n      var ds =\n        card && card.dataset\n          ? card.dataset.mcId || card.dataset.mcid || \"\"\n          : \"\";\n      if (ds && \/^\\d+$\/.test(ds)) return ds;\n      var li = card && card.closest('li[class*=\"mc-event-\"]');\n      if (li) {\n        var m = (li.className || \"\").match(\/mc-event-(\\d+)\/);\n        if (m && m[1]) return m[1];\n      }\n      var alt = _getCardEventId(card);\n      if (alt) return alt;\n      return \"\";\n    }\n    function buildEventDetailsUrl(id) {\n      if (!id) return \"#\";\n      try {\n        var u = new URL(BASE_DETAIL, window.location.origin);\n        u.searchParams.set(DETAIL_PARAM, id);\n        return u.toString();\n      } catch (_) {\n        return (\n          BASE_DETAIL +\n          (BASE_DETAIL.indexOf(\"?\") === -1 ? \"?\" : \"&\") +\n          encodeURIComponent(DETAIL_PARAM) +\n          \"=\" +\n          encodeURIComponent(id)\n        );\n      }\n    }\n\n    function _getTicketsUrl(card) {\n      if (!card) return \"\";\n\n      var tRaw = (\n        card.getAttribute(\"data-tickets\") ||\n        (card.dataset && card.dataset.tickets) ||\n        \"\"\n      ).trim();\n      function looksLikeUrl(s) {\n        return \/^https?:\\\/\\\/\/i.test(s) || s.charAt(0) === \"\/\";\n      }\n      if (tRaw) {\n        if (!(tRaw.charAt(0) === \"{\" || tRaw.charAt(0) === \"[\")) {\n          if (looksLikeUrl(tRaw)) return tRaw;\n        } else {\n          try {\n            var obj = JSON.parse(tRaw);\n            var picked = \"\";\n\n            function pickFrom(o, depth) {\n              if (!o || depth > 3 || picked) return;\n              if (typeof o === \"string\") {\n                if (looksLikeUrl(o)) {\n                  picked = o;\n                  return;\n                }\n                return;\n              }\n              if (Array.isArray(o)) {\n                for (var i = 0; i < o.length && !picked; i++)\n                  pickFrom(o[i], depth + 1);\n                return;\n              }\n              if (typeof o === \"object\") {\n                var priority = [\n                  \"tickets_url\",\n                  \"ticket_url\",\n                  \"registration_url\",\n                  \"register_url\",\n                  \"tickets\",\n                  \"registration\",\n                  \"url\",\n                  \"link\",\n                  \"href\",\n                ];\n                for (var p = 0; p < priority.length && !picked; p++) {\n                  var k = priority[p];\n                  if (\n                    o.hasOwnProperty(k) &&\n                    typeof o[k] === \"string\" &&\n                    looksLikeUrl(o[k])\n                  ) {\n                    picked = o[k];\n                    break;\n                  }\n                }\n\n                if (!picked) {\n                  for (var k2 in o) {\n                    if (!o.hasOwnProperty(k2)) continue;\n                    pickFrom(o[k2], depth + 1);\n                    if (picked) break;\n                  }\n                }\n              }\n            }\n\n            pickFrom(obj, 0);\n            if (picked) return picked;\n          } catch (e) {}\n        }\n      }\n\n      var descEl = card.querySelector(\".mc-desc\");\n      var rawHtml = descEl\n        ? (descEl.dataset && (descEl.dataset.raw || descEl.dataset.html)) ||\n          descEl.innerHTML\n        : \"\";\n      if (rawHtml) {\n        var tmp = document.createElement(\"div\");\n        tmp.innerHTML = rawHtml;\n\n        var a = tmp.querySelector(\n          'a.tickets, a.ticket, a.buy-tickets, a.register, a.registration, a[href*=\"ticket\"], a[href*=\"register\"]'\n        );\n        var href = a && a.getAttribute(\"href\");\n        if (looksLikeUrl(href || \"\")) return href;\n      }\n\n      var root = card.closest(\"li\") || card;\n      var a2 = root.querySelector(\n        'a.tickets, a.ticket, a.buy-tickets, a.register, a.registration, a[href*=\"ticket\"], a[href*=\"register\"]'\n      );\n      var href2 = a2 && a2.getAttribute(\"href\");\n      if (looksLikeUrl(href2 || \"\")) return href2;\n\n      return \"\";\n    }\n\n    \/* =========================\n           CARD ID (alt path for rewrite)\n           ========================= *\/\n    function _getIdFromLiClass(cls) {\n      if (!cls) return \"\";\n      var key = \"mc-mc_upcoming_\";\n      var i = cls.indexOf(key);\n      if (i === -1) return \"\";\n      i += key.length;\n      var j = i;\n      while (j < cls.length) {\n        var c = cls.charCodeAt(j);\n        if (c < 48 || c > 57) break;\n        j++;\n      }\n      return cls.slice(i, j);\n    }\n    function _getIdFromHrefSimple(href) {\n      if (!href) return \"\";\n      var s = String(href),\n        k = \"mc_id=\",\n        i = s.indexOf(k);\n      if (i === -1) return \"\";\n      i += k.length;\n      var j = i;\n      while (j < s.length) {\n        var c = s.charCodeAt(j);\n        if (c < 48 || c > 57) break;\n        j++;\n      }\n      return s.slice(i, j);\n    }\n    function _getCardEventId(card) {\n      if (!card) return \"\";\n      var li = card.closest(\"li\");\n      var id = _getIdFromLiClass(li ? li.className : \"\");\n      if (id) return id;\n      var anchors = [];\n      var aTitle = card.querySelector(\".mc-card__title a\");\n      if (aTitle) anchors.push(aTitle);\n      var aThumbWrap = card.querySelector(\".mc-card__thumb\");\n      if (aThumbWrap) {\n        if (aThumbWrap.tagName && aThumbWrap.tagName.toUpperCase() === \"A\") {\n          anchors.push(aThumbWrap);\n        } else {\n          var innerA = aThumbWrap.querySelector(\"a\");\n          if (innerA) anchors.push(innerA);\n        }\n      }\n      var aBtn = card.querySelector(\".mc-card__cta .mc-btn\");\n      if (aBtn) anchors.push(aBtn);\n      for (var i = 0; i < anchors.length; i++) {\n        var a = anchors[i];\n        var id1 = _getIdFromHrefSimple(a.getAttribute(\"href\") || \"\");\n        if (id1) return id1;\n        var id2 = _getIdFromHrefSimple(a.getAttribute(\"data-url\") || \"\");\n        if (id2) return id2;\n      }\n      return \"\";\n    }\n\n    function localizeUrl(url) {\n      if (!url) return \"\";\n      if (!isZhPage()) return url;\n\n      var origin = window.location.origin;\n      if (url.indexOf(origin) === 0) {\n        var path = url.replace(origin, \"\");\n        if (path.indexOf(\"\/zh\") !== 0) {\n          return origin + \"\/zh\" + (path.charAt(0) === \"\/\" ? \"\" : \"\/\") + path;\n        }\n      } else if (url.charAt(0) === \"\/\" && url.indexOf(\"\/zh\") !== 0) {\n        return \"\/zh\" + url;\n      }\n      return url;\n    }\n    function _rewriteOneAnchor(a, newUrl) {\n      if (!a) return;\n\n      a.setAttribute(\"href\", \"\");\n      a.setAttribute(\"data-url\", \"\");\n\n      if (newUrl) {\n        newUrl = localizeUrl(newUrl);\n        a.setAttribute(\"href\", newUrl);\n        a.setAttribute(\"data-url\", newUrl);\n      }\n    }\n    function _rewriteAllAnchorsForEventId(id, newUrl) {\n      if (!id || !newUrl) return;\n      var as = document.querySelectorAll(\"a[href], a[data-url]\");\n      for (var i = 0; i < as.length; i++) {\n        var a = as[i];\n        var href = a.getAttribute(\"href\") || a.getAttribute(\"data-url\") || \"\";\n        if (!href) continue;\n\n        var aid = getMcIdFromHref(href);\n        if (aid && aid === String(id)) {\n          a.classList && a.classList.remove(\"osc-mc-popup\");\n          a.setAttribute(\"href\", \"\");\n          a.setAttribute(\"data-url\", \"\");\n          a.setAttribute(\"href\", newUrl);\n          a.setAttribute(\"data-url\", newUrl);\n        }\n      }\n    }\n    \/* =========================\n           REWRITE LINKS ON CARDS\n           ========================= *\/\n    function rewriteAllEventLinks() {\n      var cards = qsa(SEL.cards);\n      for (var i = 0; i < cards.length; i++) {\n        var card = cards[i];\n        var id = _getCardEventId(card);\n        if (!id) continue;\n\n        \/\/ Check for data-tickets URL first\n        var ticketsUrl = _getTicketsUrl(card);\n        var detailUrl = buildEventDetailsUrl(id);\n        var isFeatured = hasFeaturedFlag(card);\n\n        \/\/ Determine the target URL based on whether we have a tickets URL\n        var targetUrl = ticketsUrl || detailUrl;\n\n        var aTitle = card.querySelector(\".mc-card__title a\");\n        var aThumb = null;\n        var thumbWrap = card.querySelector(\".mc-card__thumb\");\n        if (thumbWrap) {\n          if (thumbWrap.tagName && thumbWrap.tagName.toUpperCase() === \"A\") {\n            aThumb = thumbWrap;\n          } else {\n            var inner = thumbWrap.querySelector(\"a\");\n            if (inner) aThumb = inner;\n          }\n        }\n        var aBtn = card.querySelector(\".mc-card__cta .mc-btn\");\n\n        \/\/ For featured events with tickets URL, use the tickets URL for all links\n        if (isFeatured && ticketsUrl) {\n          if (aTitle) _rewriteOneAnchor(aTitle, ticketsUrl);\n          if (aThumb) _rewriteOneAnchor(aThumb, ticketsUrl);\n          if (aBtn) _rewriteOneAnchor(aBtn, ticketsUrl);\n\n          \/\/ Remove popup class from featured items\n          if (aThumb) aThumb.classList.remove(\"osc-mc-popup\");\n          if (aBtn) aBtn.classList.remove(\"osc-mc-popup\");\n        }\n        \/\/ For featured events without tickets URL, use detail URL\n        else if (isFeatured) {\n          if (aTitle) _rewriteOneAnchor(aTitle, detailUrl);\n          if (aThumb) _rewriteOneAnchor(aThumb, detailUrl);\n          if (aBtn) _rewriteOneAnchor(aBtn, detailUrl);\n\n          \/\/ Remove popup class from featured items\n          if (aThumb) aThumb.classList.remove(\"osc-mc-popup\");\n          if (aBtn) aBtn.classList.remove(\"osc-mc-popup\");\n        } else {\n          if (aTitle) {\n            _rewriteOneAnchor(aTitle, \"\");\n            if (!aTitle.classList.contains(\"osc-mc-popup\")) {\n              aTitle.classList.add(\"osc-mc-popup\");\n            }\n          }\n\n          var arr = [aThumb, aBtn];\n          for (var j = 0; j < arr.length; j++) {\n            var a = arr[j];\n            if (!a) continue;\n            if (!a.classList.contains(\"osc-mc-popup\")) {\n              a.classList.add(\"osc-mc-popup\");\n            }\n            _rewriteOneAnchor(a, POPUP_REDIRECT);\n          }\n        }\n      }\n    }\n    \/* =========================\n           CARD DATA EXTRACTION & HYDRATION\n           ========================= *\/\n    function findDdByLabel(card, label1, label2) {\n      label1 = String(label1 || \"\").toLowerCase();\n      label2 = String(label2 || \"\").toLowerCase();\n      var row = Array.from(card.querySelectorAll(\".mc-card__row\")).find(\n        function (r) {\n          var dt = (r.querySelector(\"dt\")?.textContent || \"\")\n            .trim()\n            .toLowerCase();\n          return dt === label1 || (label2 && dt === label2);\n        }\n      );\n      return row ? row.querySelector(\"dd\") : null;\n    }\n    function hasFeaturedFlag(card) {\n      var desc = card.querySelector(\".mc-desc\");\n      var raw = desc ? desc.dataset.raw || desc.innerHTML : \"\";\n      if (!hasContent(raw)) return false;\n      var tmp = document.createElement(\"div\");\n      tmp.innerHTML = raw;\n      var f = tmp.querySelector(\".featured-events\");\n      return !!(f && hasContent(f.textContent));\n    }\n    function getFeaturedRank(card) {\n      var desc = card.querySelector(\".mc-desc\");\n      var raw = desc ? desc.dataset.raw || desc.innerHTML : \"\";\n      if (!hasContent(raw)) return Number.POSITIVE_INFINITY;\n      var tmp = document.createElement(\"div\");\n      tmp.innerHTML = raw;\n      var el = tmp.querySelector(\".featured-events\");\n      if (!el) return Number.POSITIVE_INFINITY;\n      var t = cleanText(el.textContent);\n      var m =\n        t.match(\/featured\\s*events\\s*[-\u2013\u2014]?\\s*(\\d+)\/i) || t.match(\/(\\d+)\\s*$\/);\n      var n = m ? parseInt(m[1], 10) : NaN;\n      return isFinite(n) ? n : Number.POSITIVE_INFINITY;\n    }\n    function updateFeaturedBadge(card) {\n      var wrap = card.querySelector(\".mc-card__thumb\");\n      if (!wrap) return;\n      var old = wrap.querySelector(\".mc-badge-featured\");\n      if (old) old.remove();\n      if (hasFeaturedFlag(card)) {\n        var badge = document.createElement(\"div\");\n        badge.className = \"mc-badge-featured\";\n        badge.textContent = \"Featured\";\n        badge.setAttribute(\"aria-label\", \"Featured\");\n        wrap.appendChild(badge);\n      }\n    }\n    function hydrateCard(card) {\n      updateFeaturedBadge(card);\n      var venueDD = findDdByLabel(card, \"venue\", \"\u5730\u9ede\");\n      var needVenue = venueDD && !hasContent(venueDD.textContent);\n      if (needVenue) {\n        var v = cleanText(card?.dataset?.location || \"\");\n        if (!v) {\n          var desc = card.querySelector(\".mc-desc\");\n          var raw = desc ? desc.dataset.raw || desc.innerHTML : \"\";\n          if (hasContent(raw)) {\n            var tmp = document.createElement(\"div\");\n            tmp.innerHTML = raw;\n            var venueEl = tmp.querySelector(\".venue\");\n            if (venueEl && hasContent(venueEl.textContent))\n              v = cleanText(venueEl.textContent);\n          }\n        }\n        if (v) venueDD.textContent = v;\n      }\n    }\n    function hydrateAll() {\n      qsa(SEL.cards).forEach(hydrateCard);\n    }\n\n    \/* =========================\n           DATE PARSING & NORMALIZATION\n           ========================= *\/\n    var MONTHS = {\n      jan: 0,\n      january: 0,\n      feb: 1,\n      february: 1,\n      mar: 2,\n      march: 2,\n      apr: 3,\n      april: 3,\n      may: 4,\n      jun: 5,\n      june: 5,\n      jul: 6,\n      july: 6,\n      aug: 7,\n      august: 7,\n      sep: 8,\n      sept: 8,\n      september: 8,\n      oct: 9,\n      october: 9,\n      nov: 10,\n      november: 10,\n      dec: 11,\n      december: 11,\n    };\n    var MONTH_ABBR = [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\",\n    ];\n\n    function sameDay(a, b) {\n      return (\n        a.getFullYear() === b.getFullYear() &&\n        a.getMonth() === b.getMonth() &&\n        a.getDate() === b.getDate()\n      );\n    }\n    function parseDMY(s) {\n      var m = s && s.match(\/(\\d{1,2})\\s+([A-Za-z]{3,9})\\s+(\\d{4})\/);\n      if (!m) return null;\n      var d = parseInt(m[1], 10);\n      var mon = MONTHS[(m[2] || \"\").toLowerCase()];\n      var y = parseInt(m[3], 10);\n      if (!isFinite(d) || mon == null || !isFinite(y)) return null;\n      return new Date(y, mon, d);\n    }\n    function extractTokens(s) {\n      if (!s) return [];\n      s = s\n        .replace(\/$begin:math:text$[^)]*$end:math:text$\/g, \" \")\n        .replace(\/\u2013|\u2014\/g, \"-\");\n      var re =\n        \/(?:(\\d{1,2}):(\\d{2})\\s*(am|pm)\\s*,\\s*)?(\\d{1,2})\\s+([A-Za-z]{3,9})(?:\\s+(\\d{4}))?\/gi;\n      var out = [],\n        m;\n      while ((m = re.exec(s)) !== null) {\n        var mon = MONTHS[(m[5] || \"\").toLowerCase()];\n        if (mon == null) continue;\n        out.push({\n          h: m[1] != null ? +m[1] : null,\n          mi: m[2] != null ? +m[2] : null,\n          ap: m[3] ? m[3].toLowerCase() : null,\n          d: +m[4],\n          mon: mon,\n          y: m[6] != null ? +m[6] : null,\n        });\n      }\n      return out;\n    }\n    function tokenToMs(tok, inferredY) {\n      if (!tok) return NaN;\n      var hh = tok.h == null ? 0 : tok.h,\n        mm = tok.mi == null ? 0 : tok.mi;\n      if (tok.ap) {\n        if (tok.ap === \"pm\" && hh < 12) hh += 12;\n        if (tok.ap === \"am\" && hh === 12) hh = 0;\n      }\n      var y = tok.y != null ? tok.y : inferredY;\n      if (!isFinite(y)) return NaN;\n      return new Date(y, tok.mon, tok.d, hh, mm).getTime();\n    }\n    function buildRangeFromText(txt, isoFallback) {\n      txt = cleanText(txt || \"\");\n      var toks = extractTokens(txt);\n      var startTok = toks[0] || null,\n        endTok = toks[1] || null;\n\n      var startY = startTok && startTok.y != null ? startTok.y : null;\n      if (startTok && startY == null && endTok && endTok.y != null)\n        startY = endTok.mon < startTok.mon ? endTok.y - 1 : endTok.y;\n      if (startTok && startY == null && isoFallback) {\n        var d = new Date(isoFallback);\n        if (isFinite(d)) startY = d.getFullYear();\n      }\n      var endY = endTok && endTok.y != null ? endTok.y : null;\n      if (endTok && endY == null && startY != null)\n        endY = endTok.mon < (startTok ? startTok.mon : 0) ? startY + 1 : startY;\n\n      var startMs = startTok ? tokenToMs(startTok, startY) : NaN;\n      var endMs = endTok ? tokenToMs(endTok, endY) : NaN;\n\n      var startYear = isFinite(startMs) ? new Date(startMs).getFullYear() : NaN;\n      var endYear = isFinite(endMs) ? new Date(endMs).getFullYear() : NaN;\n\n      var primaryYear = isFinite(endYear) ? endYear : startYear;\n      var primaryMs = NaN;\n      if (isFinite(endMs) && isFinite(endYear) && endYear === primaryYear)\n        primaryMs = endMs;\n      else if (\n        isFinite(startMs) &&\n        isFinite(startYear) &&\n        startYear === primaryYear\n      )\n        primaryMs = startMs;\n      else primaryMs = isFinite(endMs) ? endMs : startMs;\n\n      return { startMs, endMs, primaryYear, primaryMs };\n    }\n    function readISO(card, key) {\n      return (\n        card.getAttribute(key) ||\n        card.dataset?.[key.replace(\/^data-\/, \"\")] ||\n        \"\"\n      );\n    }\n    function isoMetricsFromCard(card) {\n      var startIso =\n        readISO(card, \"data-dtstart\") || readISO(card, \"data-start\") || \"\";\n      var endIso =\n        readISO(card, \"data-dtend\") || readISO(card, \"data-end\") || \"\";\n      var startMs =\n        startIso && !isNaN(new Date(startIso)) ? +new Date(startIso) : NaN;\n      var endMs = endIso && !isNaN(new Date(endIso)) ? +new Date(endIso) : NaN;\n      var primaryMs = isFinite(endMs) ? endMs : startMs;\n      var primaryYear = isFinite(primaryMs)\n        ? new Date(primaryMs).getFullYear()\n        : NaN;\n      return { startMs, endMs, primaryMs, primaryYear };\n    }\n    function metricsValid(m) {\n      return (\n        m &&\n        (isFinite(m.primaryYear) || isFinite(m.startMs) || isFinite(m.endMs))\n      );\n    }\n    function metricsFromCard(card) {\n      var dateText = cleanText(\n        card.querySelector(\".mc-card__date\")?.textContent || \"\"\n      );\n      var iso = isoMetricsFromCard(card);\n      if (\n        hasContent(dateText) &&\n        (dateText.indexOf(\"\u5e74\") > -1 || dateText.indexOf(\"\u6708\") > -1)\n      ) {\n        try {\n          var dateMatches = [];\n          var dateRx = \/(20\\d{2})\u5e74\\s*(\\d{1,2})\u6708\\s*(\\d{1,2})\u65e5\/g;\n          var match;\n          while ((match = dateRx.exec(dateText)) !== null) {\n            dateMatches.push({\n              y: parseInt(match[1], 10),\n              m: parseInt(match[2], 10) - 1,\n              d: parseInt(match[3], 10),\n            });\n          }\n\n          var timeMatches = [];\n          var timeRx = \/(\u4e0a\u5348|\u4e0b\u5348)\\s*(\\d{1,2}):(\\d{2})\/g;\n          while ((match = timeRx.exec(dateText)) !== null) {\n            var isPm = match[1] === \"\u4e0b\u5348\";\n            var hh = parseInt(match[2], 10);\n            var mm = parseInt(match[3], 10);\n            if (isPm && hh < 12) hh += 12;\n            if (!isPm && hh === 12) hh = 0;\n            timeMatches.push({ h: hh, mi: mm });\n          }\n\n          if (dateMatches.length > 0) {\n            var startD = dateMatches[0];\n            var startT = timeMatches[0] || { h: 0, mi: 0 };\n            var startMs = new Date(\n              startD.y,\n              startD.m,\n              startD.d,\n              startT.h,\n              startT.mi\n            ).getTime();\n\n            var endMs = startMs;\n            var primaryYear = startD.y;\n\n            if (dateMatches.length > 1) {\n              var endD = dateMatches[1];\n              var endT = timeMatches[1] || { h: 23, mi: 59 };\n              endMs = new Date(\n                endD.y,\n                endD.m,\n                endD.d,\n                endT.h,\n                endT.mi\n              ).getTime();\n              primaryYear = endD.y;\n            }\n\n            var primaryMs = isFinite(endMs) ? endMs : startMs;\n\n            return {\n              startMs: startMs,\n              endMs: endMs,\n              primaryYear: primaryYear,\n              primaryMs: primaryMs,\n            };\n          }\n        } catch (err) {\n          console.error(err);\n        }\n      }\n\n      if (hasContent(dateText)) {\n        var m1 = buildRangeFromText(\n          dateText,\n          isFinite(iso.startMs) ? new Date(iso.startMs).toISOString() : \"\"\n        );\n        if (metricsValid(m1)) return m1;\n      }\n      if (metricsValid(iso)) return iso;\n\n      var desc = card.querySelector(\".mc-desc\");\n      var raw = desc ? desc.dataset?.raw || desc.innerHTML : \"\";\n      if (hasContent(raw)) {\n        var tmp = document.createElement(\"div\");\n        tmp.innerHTML = raw;\n        var src = tmp.querySelector(\".date\") || tmp.querySelector(\".time\");\n        if (src) {\n          var m2 = buildRangeFromText(\n            src.textContent,\n            isFinite(iso.startMs) ? new Date(iso.startMs).toISOString() : \"\"\n          );\n          if (metricsValid(m2)) return m2;\n        }\n      }\n      return { startMs: NaN, endMs: NaN, primaryYear: NaN, primaryMs: NaN };\n    }\n    function yearsBetween(startMs, endMs) {\n      var out = new Set();\n      if (isFinite(startMs) || isFinite(endMs)) {\n        var s = isFinite(startMs)\n          ? new Date(startMs).getFullYear()\n          : new Date(endMs).getFullYear();\n        var e = isFinite(endMs)\n          ? new Date(endMs).getFullYear()\n          : new Date(startMs).getFullYear();\n        if (isFinite(s) && isFinite(e)) {\n          if (e < s) {\n            var t = s;\n            s = e;\n            e = t;\n          }\n          for (var y = s; y <= e; y++) out.add(y);\n        }\n      }\n      return Array.from(out);\n    }\n    function yearsFromCard(card) {\n      var set = new Set();\n      var txt = cleanText(\n        card.querySelector(\".mc-card__date\")?.textContent || \"\"\n      );\n      if (hasContent(txt)) {\n        (txt.match(\/\\b(20\\d{2})\\b\/g) || []).forEach(function (y) {\n          set.add(parseInt(y, 10));\n        });\n      }\n      if (set.size === 0) {\n        var iso = isoMetricsFromCard(card);\n        yearsBetween(iso.startMs, iso.endMs).forEach(function (y) {\n          set.add(y);\n        });\n      }\n      if (set.size === 0) {\n        var desc = card.querySelector(\".mc-desc\");\n        var raw = desc ? desc.dataset?.raw || desc.innerHTML : \"\";\n        if (hasContent(raw)) {\n          var tmp = document.createElement(\"div\");\n          tmp.innerHTML = raw;\n          var src = tmp.querySelector(\".date\") || tmp.querySelector(\".time\");\n          if (src) {\n            var m = buildRangeFromText(src.textContent, \"\");\n            yearsBetween(m.startMs, m.endMs).forEach(function (y) {\n              set.add(y);\n            });\n            if (set.size === 0 && isFinite(m.primaryYear))\n              set.add(m.primaryYear);\n          }\n        }\n      }\n      return Array.from(set);\n    }\n    function normalizeAllDayDisplays() {\n      var isZh = (function () {\n        var lang = (\n          document.documentElement.getAttribute(\"lang\") || \"\"\n        ).toLowerCase();\n        if (lang.indexOf(\"zh\") === 0) return true;\n        try {\n          if (\/\\\/zh(\\\/|$)\/i.test(location.pathname)) return true;\n        } catch (e) {}\n        return false;\n      })();\n\n      function zhDateStr(d) {\n        return (\n          d.getFullYear() +\n          \"\u5e74\" +\n          (d.getMonth() + 1) +\n          \"\u6708\" +\n          d.getDate() +\n          \"\u65e5\"\n        );\n      }\n      function zhTimeStr(h, m, ap) {\n        h = parseInt(h, 10);\n        m = (\"0\" + m).slice(-2);\n        ap = String(ap || \"\").toLowerCase();\n        var prefix = ap === \"pm\" ? \"\u4e0b\u5348\" : \"\u4e0a\u5348\";\n        return prefix + h + \":\" + m;\n      }\n\n      qsa(SEL.cards).forEach(function (card) {\n        var dd = card.querySelector(\".mc-card__date\");\n        if (!dd) return;\n        var txt = cleanText(dd.textContent || \"\");\n        if (!txt) return;\n\n        \/\/ All-day pattern: both times are 12:00am, dates are provided twice\n        var times = txt.match(\/\\b(\\d{1,2}):(\\d{2})\\s*(am|pm)\\b\/gi) || [];\n        var isAllDayByDisplay =\n          times.length >= 2 &&\n          times.every(function (t) {\n            return \/^12:00\\s*am$\/i.test(cleanText(t));\n          });\n\n        if (isAllDayByDisplay) {\n          var datePieces =\n            txt.match(\/(\\d{1,2}\\s+[A-Za-z]{3,9}\\s+\\d{4})\/g) || [];\n          if (datePieces.length) {\n            var startDate = parseDMY(datePieces[0]);\n            var endDate = datePieces[1] ? parseDMY(datePieces[1]) : null;\n            if (endDate) endDate.setDate(endDate.getDate() - 1);\n\n            if (startDate) {\n              if (isZh) {\n                var outZh = zhDateStr(startDate);\n                if (endDate && !sameDay(startDate, endDate))\n                  outZh += \" - \" + zhDateStr(endDate);\n                dd.textContent = outZh;\n                return;\n              } else {\n                function fmtEn(d) {\n                  return (\n                    d.getDate() +\n                    \" \" +\n                    MONTH_ABBR[d.getMonth()] +\n                    \" \" +\n                    d.getFullYear()\n                  );\n                }\n                var outEn = fmtEn(startDate);\n                if (endDate && !sameDay(startDate, endDate))\n                  outEn += \" - \" + fmtEn(endDate);\n                dd.textContent = outEn;\n                return;\n              }\n            }\n          }\n        }\n\n        \/\/ For non-all-day entries, only localize on zh pages\n        if (!isZh) return;\n\n        \/\/ Replace time tokens: \"9:30am\" -> \"\u4e0a\u53489:30\"\n        var replaced = txt.replace(\n          \/\\b(\\d{1,2}):(\\d{2})\\s*(am|pm)\\b\/gi,\n          function (_m, h, mi, ap) {\n            return zhTimeStr(h, mi, ap);\n          }\n        );\n\n        replaced = replaced.replace(\n          \/(\\d{1,2})\\s+([A-Za-z]{3,9})\\s+(\\d{4})\/g,\n          function (_m, d, monName, y) {\n            var monIdx = MONTHS[String(monName).toLowerCase()];\n            if (monIdx == null) return _m;\n            var dt = new Date(parseInt(y, 10), monIdx, parseInt(d, 10));\n            return zhDateStr(dt);\n          }\n        );\n\n        dd.textContent = replaced;\n      });\n    }\n    \/* =========================\n           EVENT DATA FOR POPUP\n           ========================= *\/\n    function getEventData(a) {\n      var card = a.closest(\".mc-card\");\n      var data = {};\n      data.id = getCardMcId(a);\n\n      var ticketsUrl = _getTicketsUrl(card);\n      data.tickets = cleanText(ticketsUrl || \"\");\n\n      data.title = cleanText(\n        card?.dataset?.title ||\n          card?.querySelector(\".mc-card__title a\")?.textContent ||\n          card?.querySelector(\".mc-card__title\")?.textContent ||\n          \"\"\n      );\n      data.image = card?.querySelector(\".mc-card__thumb img\")?.src || \"\";\n      data.presented = cleanText(\n        (\n          card?.dataset?.presented ||\n          card?.querySelector(\".mc-card__presented\")?.textContent ||\n          \"\"\n        ).replace(\/^Presented by\\s*\/i, \"\")\n      );\n\n      var venueFallback = cleanText(\n        card?.dataset?.location ||\n          Array.from(card?.querySelectorAll(\".mc-card__row\") || [])\n            .find(function (r) {\n              var dtText = (r.querySelector(\"dt\")?.textContent || \"\")\n                .trim()\n                .toLowerCase();\n              return dtText === \"venue\" || dtText === \"\u5730\u9ede\";\n            })\n            ?.querySelector(\"dd\")?.textContent ||\n          \"\"\n      );\n\n      var descEl = card.querySelector(\".mc-desc\");\n      var rawHtml = descEl ? descEl.dataset.raw || descEl.innerHTML : \"\";\n      data.descHTML = rawHtml;\n\n      var dateStr = cleanText(\n        card.querySelector(\".mc-card__date\")?.textContent || \"\"\n      );\n      var venueStr = venueFallback;\n      if (!venueStr && hasContent(rawHtml)) {\n        var tmp = document.createElement(\"div\");\n        tmp.innerHTML = rawHtml;\n        var venueEl = tmp.querySelector(\".venue\");\n        if (venueEl && hasContent(venueEl.textContent))\n          venueStr = cleanText(venueEl.textContent);\n      }\n      data.dateStr = dateStr;\n      data.venueStr = venueStr;\n      data.url = buildEventDetailsUrl(data.id);\n      return data;\n    }\n\n    function openPopup(targetUrl, data) {\n      var m = ensureModal();\n      var c = m.querySelector(\".osc-content\");\n      var safe = targetUrl || \"#\";\n      safe = localizeUrl(safe);\n      var dateStr = data.dateStr || \"\";\n      var venueStr = data.venueStr || \"\";\n      c.innerHTML =\n        '<div class=\"mc-popup\">' +\n        '<div class=\"red-decoration-line\"><\/div>' +\n        '<div class=\"mc-popup__image-wrap\">' +\n        (data.image\n          ? '<img decoding=\"async\" class=\"mc-popup__image\" src=\"' + esc(data.image) + '\" alt=\"\">'\n          : \"\") +\n        \"<\/div>\" +\n        '<div class=\"mc-popup__body\">' +\n        '<div class=\"mc-popup__grid\">' +\n        '<div class=\"mc-popup__left\">' +\n        (data.presented\n          ? '<div class=\"mc-popup__presented\">Presented by ' +\n            esc(data.presented) +\n            \"<\/div>\"\n          : \"\") +\n        (data.title\n          ? '<h3 class=\"mc-popup__title\">' + esc(data.title) + \"<\/h3>\"\n          : \"\") +\n        '<div class=\"mc-popup__divider\"><\/div>' +\n        '<dl class=\"mc-popup__meta\">' +\n        (dateStr\n          ? '<dt class=\"mc-popup__label\">Date<\/dt><dd class=\"mc-popup__value\">' +\n            esc(dateStr) +\n            \"<\/dd>\"\n          : \"\") +\n        (venueStr\n          ? '<dt class=\"mc-popup__label\">Venue<\/dt><dd class=\"mc-popup__value\">' +\n            esc(venueStr) +\n            \"<\/dd>\"\n          : \"\") +\n        \"<\/dl>\" +\n        \"<\/div>\" +\n        '<div class=\"mc-popup__right\">' +\n        (data.descHTML\n          ? '<div class=\"mc-popup__desc\">' + data.descHTML + \"<\/div>\"\n          : \"\") +\n        '<div class=\"mc-popup__cta\">' +\n        '<a class=\"osc-go\" href=\"' +\n        esc(safe) +\n        '\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More <img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/09\/Icon-1.png\" alt=\"icon\" style=\"width:12px;height:12px\" \/><\/a>' +\n        \"<\/div>\" +\n        \"<\/div>\" +\n        \"<\/div>\" +\n        \"<\/div>\" +\n        \"<\/div>\";\n      var leftCol = c.querySelector(\".mc-popup__left\");\n      var cta = c.querySelector(\".mc-popup__cta\");\n      if (leftCol && cta) leftCol.appendChild(cta);\n\n      var descRight = c.querySelector(\".mc-popup__desc\");\n      if (descRight) {\n        descRight.querySelectorAll(\".date, .venue\").forEach(function (el) {\n          el.remove();\n        });\n        if (\n          !descRight.textContent.replace(\/\\s+\/g, \"\").length &&\n          descRight.children.length === 0\n        ) {\n          descRight.remove();\n        }\n      }\n      m.classList.add(\"is-open\");\n    }\n\n    function onPopupClick(e) {\n      var a = e.target.closest(\"a.osc-mc-popup\");\n      if (!a) return;\n\n      var card = a.closest(\".mc-card\");\n      if (card && hasFeaturedFlag(card)) {\n        return;\n      }\n\n      e.preventDefault();\n      var data = getEventData(a);\n      var target = data.tickets || data.url;\n      openPopup(target, data);\n    }\n\n    \/* =========================\n           TYPE SLUG\/LABEL HELPERS\n           ========================= *\/\n    function slugifyType(s) {\n      s = String(s || \"\").toLowerCase();\n      if (s.normalize) s = s.normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g, \"\");\n      s = s.replace(\/&\/g, \"and\");\n      return s\n        .replace(\/[^a-z0-9]+\/g, \"-\")\n        .replace(\/^-+|-+$\/g, \"\")\n        .replace(\/-+\/g, \"-\");\n    }\n    function labelFromSlug(slug) {\n      \/\/ Convert slug back to a nice label.\n      \/\/ 1) \"-\" -> space\n      \/\/ 2) \"and\" or \"amp\" -> \"&\"\n      \/\/ 3) Title Case\n      return String(slug || \"\")\n        .replace(\/-\/g, \" \")\n        .replace(\/\\b(?:and|amp)\\b\/gi, \"&\")\n        .replace(\/\\b([a-z])\/g, function (m, c) {\n          return c.toUpperCase();\n        });\n    }\n\n    \/* =========================\n           COLLECT & STAMP EVENT TYPES ON CARDS\n           ========================= *\/\n    function collectTypesFromClasses(el) {\n      var out = [];\n      (el.className || \"\").split(\/\\s+\/).forEach(function (c) {\n        var m =\n          c.match(\/^mc_(?:primary_|rel_)?([a-z0-9-]+)$\/i) ||\n          c.match(\/^mcat_([a-z0-9-]+)$\/i);\n        if (!m || !m[1]) return;\n        var slug = m[1].toLowerCase();\n        slug = normalizeTypeSlug(slug);\n        if (\n          \/^(?:no-location|start|events?|event|upcoming|future|multidate|nonrecurring|ungrouped|on-now)$\/i.test(\n            slug\n          )\n        )\n          return;\n        if (\/\\d\/.test(slug)) return;\n        if (slug === \"artampmusic\" || slug === \"art-music\")\n          slug = \"art-amp-music\";\n        out.push(slug);\n      });\n      return out;\n    }\n    function splitTypeList(s) {\n      s = cleanText(s || \"\");\n      if (!s) return [];\n      s = s.replace(\/[\\\/|\u00b7\u2022;]+\/g, \",\").replace(\/\\s*&\\s*\/g, \" & \");\n      return s\n        .split(\/\\s*,\\s*|\\s+\\band\\b\\s+\/i)\n        .map(cleanText)\n        .filter(Boolean);\n    }\n    function readTypesFromDataset(card) {\n      var ds = card.dataset || {};\n      var raw =\n        ds.types ||\n        ds.type ||\n        ds.categories ||\n        ds.category ||\n        card.getAttribute(\"data-types\") ||\n        card.getAttribute(\"data-category\") ||\n        \"\";\n      return splitTypeList(raw);\n    }\n    function readTypesFromRows(card) {\n      var labels = [\"event type\", \"type\", \"category\", \"categories\"];\n      for (var i = 0; i < labels.length; i++) {\n        var dd = findDdByLabel(card, labels[i]);\n        if (dd && hasContent(dd.textContent))\n          return splitTypeList(dd.textContent);\n      }\n      return [];\n    }\n    function readTypesFromDesc(card) {\n      var desc = card.querySelector(\".mc-desc\");\n      var raw = desc ? desc.dataset?.types || desc.dataset?.category || \"\" : \"\";\n      if (!raw) {\n        var html = desc\n          ? desc.dataset && desc.dataset.raw\n            ? desc.dataset.raw\n            : desc.innerHTML\n          : \"\";\n        if (hasContent(html)) {\n          var tmp = document.createElement(\"div\");\n          tmp.innerHTML = html;\n          var src = tmp.querySelector(\n            \".event-type, .event-types, .category, .categories, .type\"\n          );\n          if (src && hasContent(src.textContent))\n            return splitTypeList(src.textContent);\n        }\n      }\n      return splitTypeList(raw);\n    }\n    \/* ===== i18n for Event Types (slug <-> label) ===== *\/\n    \/\/ i18n for event types\n    var TYPE_I18N = {\n      \"art-amp-music\": { zh: \"\u85dd\u8853\u97f3\u6a02\", en: \"Art & Music\" },\n\n      charitybazaars: { zh: \"\u6148\u5584\u7fa9\u8ce3\", en: \"Charity Bazaars\" },\n      \"charity-bazaars\": { zh: \"\u6148\u5584\u7fa9\u8ce3\", en: \"Charity Bazaars\" },\n      christmasbazaars: { zh: \"\u6148\u5584\u7fa9\u8ce3\", en: \"Christmas Bazaars\" },\n      \"christmas-bazaars\": { zh: \"\u6148\u5584\u7fa9\u8ce3\", en: \"Christmas Bazaars\" },\n\n      specialevents: { zh: \"\u7279\u5225\u6d3b\u52d5\", en: \"Special Events\" },\n      \"special-events\": { zh: \"\u7279\u5225\u6d3b\u52d5\", en: \"Special Events\" },\n      sports: { zh: \"\u9ad4\u80b2\u6d3b\u52d5\", en: \"Sports\" },\n    };\n    var TYPE_ALIAS = {\n      charitybazaars: \"charity-bazaars\",\n      \"charity-bazaars\": \"charity-bazaars\",\n      christmasbazaars: \"charity-bazaars\",\n      \"christmas-bazaars\": \"charity-bazaars\",\n    };\n    var TYPE_BLOCKLIST = new Set([\"eventsen\"]);\n    function normalizeTypeSlug(slug) {\n      slug = String(slug || \"\").toLowerCase();\n\n      if (TYPE_BLOCKLIST.has(slug)) return \"\";\n      if (slug === \"specialevents\") return \"special-events\";\n      if (\n        slug === \"christmasbazaars\" ||\n        slug === \"christmas-bazaars\" ||\n        slug === \"charitybazaars\" ||\n        slug === \"charity-bazaars\"\n      ) {\n        return \"christmas-bazaars\";\n      }\n      return slug;\n    }\n    function isZhPage() {\n      var lang = (\n        document.documentElement.getAttribute(\"lang\") || \"\"\n      ).toLowerCase();\n      if (lang.indexOf(\"zh\") === 0) return true;\n      try {\n        if (\/\\\/zh(\\\/|$)\/i.test(location.pathname)) return true;\n      } catch (_) {}\n      return false;\n    }\n\n    function i18nLabelFromSlug(slug) {\n      slug = String(slug || \"\").toLowerCase();\n      if (isZhPage() && TYPE_I18N[slug] && TYPE_I18N[slug].zh)\n        return TYPE_I18N[slug].zh;\n      if (TYPE_I18N[slug] && TYPE_I18N[slug].en) return TYPE_I18N[slug].en;\n      return labelFromSlug(slug);\n    }\n\n    function i18nSlugFromLabel(label) {\n      var L = String(label || \"\")\n        .replace(\/\\u00a0\/g, \" \")\n        .trim()\n        .toLowerCase();\n\n      for (var k in TYPE_I18N) {\n        var row = TYPE_I18N[k];\n        if (!row) continue;\n        if (\n          (row.zh && row.zh.toLowerCase() === L) ||\n          (row.en && row.en.toLowerCase() === L)\n        ) {\n          return normalizeTypeSlug(k);\n        }\n      }\n\n      if (\/\u85dd\u8853\\s*&?\\s*\u97f3\u6a02\/.test(L)) return normalizeTypeSlug(\"art-amp-music\");\n      return normalizeTypeSlug(slugifyType(label));\n    }\n    function getCategoriesFromCard(card) {\n      var set = new Map(); \/* slug -> label *\/\n      var li = card.closest(\"li\");\n      var container = li ? li.querySelector('div[id^=\"mc_\"].vevent') : null;\n\n      []\n        .concat(collectTypesFromClasses(li || { className: \"\" }))\n        .concat(collectTypesFromClasses(container || { className: \"\" }))\n        .concat(readTypesFromDataset(card))\n        .concat(readTypesFromRows(card))\n        .concat(readTypesFromDesc(card))\n        .forEach(function (raw) {\n          var slug = slugifyType(raw);\n          slug = normalizeTypeSlug(slug);\n          if (!slug) return;\n          var label = i18nLabelFromSlug(slug);\n          if (!set.has(slug)) set.set(slug, label);\n        });\n\n      var arr = Array.from(set, function (e) {\n        return e[0];\n      });\n      if (arr.length) card.setAttribute(\"data-event-types\", arr.join(\"|\"));\n      else card.removeAttribute(\"data-event-types\");\n\n      return Array.from(set, function (e) {\n        return { slug: e[0], label: e[1] };\n      });\n    }\n    function collectAllCategories(logIt) {\n      var set = new Map();\n      qsa(SEL.cards).forEach(function (card) {\n        getCategoriesFromCard(card).forEach(function (o) {\n          if (!set.has(o.slug)) set.set(o.slug, o.label);\n        });\n      });\n      var all = Array.from(set, function (e) {\n        return { slug: e[0], label: e[1] };\n      });\n      if (logIt) {\n        console.groupCollapsed(\n          \"[mc] Event types collected (\" + all.length + \")\"\n        );\n        all.forEach(function (o) {\n          console.log(o.slug, \"=>\", o.label);\n        });\n        console.groupEnd();\n      }\n      return all;\n    }\n\n    \/* =========================\n           SORTING (Featured first, then by date)\n           ========================= *\/\n    function sortAll(order) {\n      order = order === \"asc\" ? \"asc\" : \"desc\";\n      var groups = new Map();\n      var index = 0;\n\n      qsa(SEL.cards).forEach(function (card) {\n        var item = card.closest(SEL.cardContainerLi) || card;\n        var parent = item.parentElement;\n        if (!parent) return;\n        if (!groups.has(parent)) groups.set(parent, []);\n        var m = metricsFromCard(card);\n\n        var featured = hasFeaturedFlag(card);\n        var rank = featured ? getFeaturedRank(card) : Number.POSITIVE_INFINITY;\n        groups.get(parent).push({ item, m, featured, rank, idx: index++ });\n      });\n\n      groups.forEach(function (arr, parent) {\n        var featuredArr = arr\n          .filter(function (x) {\n            return x.featured;\n          })\n          .sort(function (a, b) {\n            if (a.rank !== b.rank) return a.rank - b.rank;\n            return a.idx - b.idx;\n          });\n        var regularArr = arr\n          .filter(function (x) {\n            return !x.featured;\n          })\n          .sort(function (a, b) {\n            var ay = a.m.primaryYear,\n              by = b.m.primaryYear;\n            var aBad = !isFinite(ay),\n              bBad = !isFinite(by);\n            if (aBad && bBad) return a.idx - b.idx;\n            if (aBad) return 1;\n            if (bBad) return -1;\n            if (ay !== by) return order === \"desc\" ? by - ay : ay - by;\n\n            var ap = a.m.primaryMs,\n              bp = b.m.primaryMs;\n            var apBad = !isFinite(ap),\n              bpBad = !isFinite(bp);\n            if (apBad && bpBad) return a.idx - b.idx;\n            if (apBad) return 1;\n            if (bpBad) return -1;\n            if (ap !== bp) return order === \"desc\" ? bp - ap : ap - bp;\n\n            var as = a.m.startMs,\n              bs = b.m.startMs;\n            if (isFinite(as) && isFinite(bs))\n              return order === \"desc\" ? bs - as : as - bs;\n            return a.idx - b.idx;\n          });\n        featuredArr.concat(regularArr).forEach(function (o) {\n          parent.appendChild(o.item);\n        });\n      });\n    }\n    window.sortAll = sortAll;\n\n    function applyOrder(order) {\n      var wrap = qs(SEL.sortWrap);\n      var text = qs(SEL.sortText);\n      if (wrap) wrap.dataset.order = order;\n      if (text) text.textContent = order === \"asc\" ? \"Oldest\" : \"Newest\";\n      sortAll(order);\n    }\n\n    function bindSortUI() {\n      var menu = qs(SEL.sortMenu);\n      if (menu) {\n        menu.addEventListener(\"click\", function (e) {\n          var li = e.target.closest(SEL.sortMenuItem);\n          if (!li || !menu.contains(li)) return;\n          e.preventDefault();\n\n          var label = cleanText(\n            li.querySelector(\".elementor-icon-list-text\")?.textContent || \"\"\n          ).toLowerCase();\n          var order =\n            label.indexOf(\"oldest\") > -1 || label.indexOf(\"\u6700\u820a\") > -1\n              ? \"asc\"\n              : \"desc\";\n\n          applyOrder(order);\n\n          qsa(SEL.sortMenuItem, menu).forEach(function (x) {\n            var xLabel = cleanText(\n              x.querySelector(\".elementor-icon-list-text\")?.textContent || \"\"\n            ).toLowerCase();\n            var xIsOldest =\n              xLabel.indexOf(\"oldest\") > -1 || xLabel.indexOf(\"\u6700\u820a\") > -1;\n            var checked = xIsOldest ? order === \"asc\" : order === \"desc\";\n\n            x.classList.toggle(\"is-checked\", checked);\n            x.setAttribute(\"aria-checked\", checked ? \"true\" : \"false\");\n          });\n        });\n\n        \/\/ (\u5e95\u4e0b\u7684 hover \u52d5\u6548 img \u76e3\u807d\u4fdd\u6301\u539f\u6a23\u4e0d\u8b8a)\n        var img = qs(SEL.sortIcon);\n        var closed = img ? img.getAttribute(\"src\") || \"\" : \"\";\n        var wrap = qs(SEL.sortWrap);\n        if (wrap && img) {\n          wrap.addEventListener(\"mouseenter\", function () {\n            img.setAttribute(\"src\", ICON_OPEN);\n          });\n          wrap.addEventListener(\"mouseleave\", function () {\n            if (qs(SEL.sortMenu)?.matches(\":hover\")) return;\n            img.setAttribute(\"src\", closed);\n          });\n          qs(SEL.sortMenu)?.addEventListener(\"mouseleave\", function () {\n            if (wrap.matches(\":hover\")) return;\n            img.setAttribute(\"src\", closed);\n          });\n        }\n      }\n    }\n    \/* =========================\n           FEATURED PIN TO TOP (defensive)\n           ========================= *\/\n    function findCardRoot(el) {\n      return el.closest(SEL.cardContainerLi + \", .mc-card\");\n    }\n    function pinFeaturedFirst() {\n      var badges = document.querySelectorAll(\".featured-events\");\n      var buckets = new Map();\n      badges.forEach(function (b) {\n        var card = findCardRoot(b);\n        if (!card || !card.parentElement) return;\n        card.hidden = false;\n        card.style.removeProperty(\"display\");\n        card.classList.remove(\n          \"is-hidden\",\n          \"hidden\",\n          \"elementor-hidden\",\n          \"e-hide\"\n        );\n        card.classList.add(\"osc-featured-card\");\n        var parent = card.parentElement;\n        var list = buckets.get(parent) || [];\n        list.push(card);\n        buckets.set(parent, list);\n      });\n      buckets.forEach(function (cards, parent) {\n        cards.forEach(function (card) {\n          if (parent.firstChild !== card)\n            parent.insertBefore(card, parent.firstChild);\n        });\n      });\n    }\n\n    \/* =========================\n           FILTER STATE (years\/types\/order) + Active chips bar\n           ========================= *\/\n    var oscFilters = (function () {\n      function isOn(li) {\n        return (\n          li.classList.contains(\"is-checked\") ||\n          String(li.getAttribute(\"aria-checked\") || \"\").toLowerCase() === \"true\"\n        );\n      }\n      function extractYearFromNode(li) {\n        var txt = cleanText(\n          li.querySelector(\".elementor-icon-list-text\")?.textContent ||\n            li.textContent ||\n            \"\"\n        );\n        var m = txt.match(\/\\b(20\\d{2})\\b\/);\n        return m ? parseInt(m[1], 10) : NaN;\n      }\n      function getAvailableYearsFromDesktop() {\n        var root = qs(SEL.yearList);\n        var out = [];\n        if (root) {\n          root\n            .querySelectorAll(\".elementor-icon-list-item\")\n            .forEach(function (li) {\n              var y = extractYearFromNode(li);\n              if (isFinite(y) && out.indexOf(y) === -1) out.push(y);\n            });\n        }\n        return out.length ? out : [2025, 2024, 2023, 2022];\n      }\n      function getAvailableTypesMap() {\n        var map = new Map();\n        document.querySelectorAll(SEL.cards).forEach(function (card) {\n          var s =\n            card.getAttribute(\"data-event-types\") ||\n            card.dataset?.eventTypes ||\n            \"\";\n          s.split(\"|\")\n            .filter(Boolean)\n            .forEach(function (slug) {\n              if (!map.has(slug)) map.set(slug, i18nLabelFromSlug(slug));\n            });\n        });\n        return map;\n      }\n      function getLiLabel(li) {\n        return cleanText(\n          li.querySelector(\".elementor-icon-list-text\")?.textContent ||\n            li.textContent ||\n            \"\"\n        );\n      }\n      function labelToSlug(label) {\n        var norm = cleanText(label).toLowerCase();\n        var map = oscFilters.getAvailableTypesMap();\n\n        for (var pair of map.entries()) {\n          var slug = normalizeTypeSlug(pair[0]);\n          var enFromMap = cleanText(pair[1]).toLowerCase();\n          var meta = TYPE_I18N[slug] || {};\n          var en = cleanText(meta.en || \"\").toLowerCase();\n          var zh = cleanText(meta.zh || \"\").toLowerCase();\n\n          if ([enFromMap, en, zh].filter(Boolean).includes(norm)) {\n            return slug;\n          }\n        }\n\n        return normalizeTypeSlug(slugifyType(label));\n      }\n\n      function readDesktopYears() {\n        var years = [];\n        var root = qs(SEL.yearList);\n        if (!root) return years;\n        root\n          .querySelectorAll(\".elementor-icon-list-item\")\n          .forEach(function (li) {\n            if (!isOn(li)) return;\n            var y = extractYearFromNode(li);\n            if (isFinite(y)) years.push(y);\n          });\n        return years;\n      }\n      function writeDesktopYears(selectedYears) {\n        var root = qs(SEL.yearList);\n        if (!root) return;\n        root\n          .querySelectorAll(\".elementor-icon-list-item\")\n          .forEach(function (li) {\n            var y = extractYearFromNode(li);\n            var on = isFinite(y) && selectedYears.indexOf(y) !== -1;\n            li.classList.toggle(\"is-checked\", on);\n            li.setAttribute(\"aria-checked\", on ? \"true\" : \"false\");\n          });\n        applyYearFilter();\n        setTimeout(pinFeaturedFirst, 0);\n      }\n\n      function readDesktopTypes() {\n        var root = qs(SEL.typeList);\n        var out = [];\n        if (!root) return out;\n        root\n          .querySelectorAll(\".elementor-icon-list-item\")\n          .forEach(function (li) {\n            if (!isOn(li)) return;\n            var slug =\n              li.getAttribute(\"data-slug\") || i18nSlugFromLabel(getLiLabel(li));\n            if (slug && out.indexOf(slug) === -1) out.push(slug);\n          });\n        return out;\n      }\n      function writeDesktopTypes(selectedSlugs) {\n        var root = qs(SEL.typeList);\n        if (!root) return;\n        root\n          .querySelectorAll(\".elementor-icon-list-item\")\n          .forEach(function (li) {\n            var slug =\n              li.getAttribute(\"data-slug\") || i18nSlugFromLabel(getLiLabel(li));\n            var on = selectedSlugs.indexOf(slug) !== -1;\n            li.classList.toggle(\"is-checked\", on);\n            li.setAttribute(\"aria-checked\", on ? \"true\" : \"false\");\n          });\n        applyTypeFilter();\n        setTimeout(pinFeaturedFirst, 0);\n      }\n\n      function readDesktopSort() {\n        var wrap = qs(SEL.sortWrap);\n        var order = String(wrap?.dataset?.order || \"\").toLowerCase();\n        if (order === \"asc\" || order === \"desc\") return order;\n        var label = cleanText(\n          qs(SEL.sortText)?.textContent || \"\"\n        ).toLowerCase();\n        if (label.indexOf(\"oldest\") > -1) return \"asc\";\n        if (label.indexOf(\"most\") > -1 || label.indexOf(\"recent\") > -1)\n          return \"desc\";\n        return \"asc\";\n      }\n      function writeDesktopSort(order) {\n        order = order === \"desc\" ? \"desc\" : \"asc\";\n        var wrap = qs(SEL.sortWrap),\n          text = qs(SEL.sortText);\n        if (wrap) wrap.dataset.order = order;\n        if (text) {\n          if (isZhPage()) {\n            text.textContent = order === \"asc\" ? \"\u6700\u820a\" : \"\u6700\u65b0\";\n          } else {\n            text.textContent = order === \"asc\" ? \"Oldest\" : \"Newest\";\n          }\n        }\n        sortAll(order);\n        setTimeout(pinFeaturedFirst, 0);\n      }\n\n      var state = {\n        years: [],\n        types: [],\n        order: \"desc\",\n      };\n      function clone(s) {\n        return {\n          years: (s.years || []).slice(),\n          types: (s.types || []).slice(),\n          order: s.order,\n        };\n      }\n      function equalSet(a, b) {\n        return (\n          JSON.stringify(a.slice().sort()) === JSON.stringify(b.slice().sort())\n        );\n      }\n\n      function ensureActiveFiltersBar() {\n        if (document.getElementById(\"osc-active-filters\")) return;\n        var row = qs(SEL.row);\n        if (!row) return;\n        var bar = document.createElement(\"div\");\n        bar.id = \"osc-active-filters\";\n        row.parentNode.insertBefore(bar, row.nextSibling);\n        document\n          .querySelectorAll(\".filter_sort_wrapper\")\n          .forEach(function (el) {\n            el.style.marginBottom = \"0px\";\n          });\n\n        bar.addEventListener(\"click\", function (e) {\n          var chip = e.target.closest(\".chip\");\n          if (\n            chip &&\n            bar.contains(chip) &&\n            !chip.classList.contains(\"chip--reset\")\n          ) {\n            e.preventDefault();\n            var t = chip.getAttribute(\"data-type\");\n            var v = chip.getAttribute(\"data-value\");\n            var keepOrder = readDesktopSort();\n            if (t === \"year\") {\n              set({\n                years: (state.years || []).filter(function (y) {\n                  return String(y) !== String(v);\n                }),\n                order: keepOrder,\n              });\n            } else if (t === \"type\") {\n              set({\n                types: (state.types || []).filter(function (s) {\n                  return s !== v;\n                }),\n                order: keepOrder,\n              });\n            }\n            return;\n          }\n          if (e.target.closest(\".chip--reset\")) {\n            e.preventDefault();\n            var keep = readDesktopSort();\n            set({ years: [], types: [], order: keep });\n          }\n        });\n      }\n\n      function renderActiveFiltersBar() {\n        ensureActiveFiltersBar();\n        var host = document.getElementById(\"osc-active-filters\");\n        if (!host) return;\n\n        var yearChips = (state.years || [])\n          .slice()\n          .sort(function (a, b) {\n            return b - a;\n          })\n          .map(function (y) {\n            return (\n              '<button class=\"chip\" data-type=\"year\" data-value=\"' +\n              y +\n              '\" aria-label=\"Remove ' +\n              y +\n              '\">' +\n              y +\n              ' <span class=\"x\" aria-hidden=\"true\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/09\/icon_close_24x24-1.png\" alt=\"\"><\/span><\/button>'\n            );\n          })\n          .join(\"\");\n\n        var typeChips = (state.types || [])\n          .slice()\n          .map(function (slug) {\n            var label = i18nLabelFromSlug(slug);\n            return (\n              '<button class=\"chip\" data-type=\"type\" data-value=\"' +\n              slug +\n              '\" aria-label=\"Remove ' +\n              label +\n              '\">' +\n              label +\n              ' <span class=\"x\" aria-hidden=\"true\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/09\/icon_close_24x24-1.png\" alt=\"\"><\/span><\/button>'\n            );\n          })\n          .join(\"\");\n\n        var resetChip =\n          '<button class=\"chip chip--reset\" aria-label=\"Reset filters\">Reset<\/button>';\n\n        var has = !!yearChips || !!typeChips;\n        host.classList.toggle(\"has-items\", has);\n        host.innerHTML = has\n          ? '<div class=\"chips\" role=\"list\">' +\n            yearChips +\n            typeChips +\n            resetChip +\n            \"<\/div>\"\n          : \"\";\n      }\n\n      function applyToDesktop() {\n        writeDesktopTypes(state.types);\n        writeDesktopYears(state.years);\n        writeDesktopSort(state.order);\n      }\n\n      function set(next, opts) {\n        opts = opts || {};\n        var changed = false;\n\n        if (\"years\" in next) {\n          var a = next.years || [],\n            b = state.years || [];\n          if (!equalSet(a, b)) {\n            state.years = a.slice();\n            changed = true;\n          }\n        }\n        if (\"types\" in next) {\n          var aT = next.types || [],\n            bT = state.types || [];\n          if (!equalSet(aT, bT)) {\n            state.types = aT.slice();\n            changed = true;\n          }\n        }\n        if (\"order\" in next && next.order && next.order !== state.order) {\n          state.order = next.order;\n          changed = true;\n        }\n        if (!changed) return clone(state);\n\n        if (opts.source !== \"desktop\") applyToDesktop();\n        renderActiveFiltersBar();\n\n        document.dispatchEvent(\n          new CustomEvent(\"osc:filters-applied\", { detail: clone(state) })\n        );\n        setTimeout(pinFeaturedFirst, 0);\n        return clone(state);\n      }\n\n      function get() {\n        return clone(state);\n      }\n      function resetYears(opts) {\n        set({ years: [] }, opts);\n      }\n      function resetTypes(opts) {\n        set({ types: [] }, opts);\n      }\n\n      \/* initialize from desktop UI *\/\n      state.years = readDesktopYears();\n      state.types = readDesktopTypes();\n      state.order = readDesktopSort();\n\n      return {\n        get,\n        set,\n        resetYears,\n        resetTypes,\n        getAvailableYearsFromDesktop,\n        getAvailableTypesMap,\n      };\n    })();\n    window.oscFilters = oscFilters;\n\n    \/* =========================\n           YEAR FILTER APPLY\n           ========================= *\/\n    function getCheckedYears() {\n      var years = new Set();\n      qsa(\".date-selector .todo-list .elementor-icon-list-item\").forEach(\n        function (li) {\n          var checked =\n            li.classList.contains(\"is-checked\") ||\n            String(li.getAttribute(\"aria-checked\") || \"\").toLowerCase() ===\n              \"true\";\n          if (!checked) return;\n          var txt = cleanText(\n            li.querySelector(\".elementor-icon-list-text\")?.textContent ||\n              li.textContent ||\n              \"\"\n          );\n          var m = txt.match(\/\\b(20\\d{2})\\b\/g);\n          if (m) {\n            m.forEach(function (y) {\n              years.add(parseInt(y, 10));\n            });\n          }\n        }\n      );\n      return Array.from(years);\n    }\n    function applyYearFilter() {\n      var selected = getCheckedYears();\n      var hasFilter = selected.length > 0;\n      qsa(SEL.cards).forEach(function (card) {\n        var item = card.closest(SEL.cardContainerLi) || card;\n        if (!hasFilter) {\n          item.classList.remove(\"is-hidden-by-year\", \"is-hidden-by-filter\");\n          return;\n        }\n        var years = yearsFromCard(card);\n        var show = years.some(function (y) {\n          return selected.indexOf(y) !== -1;\n        });\n        if (show) {\n          item.classList.remove(\"is-hidden-by-year\", \"is-hidden-by-filter\");\n        } else {\n          item.classList.add(\"is-hidden-by-year\", \"is-hidden-by-filter\");\n        }\n      });\n    }\n\n    \/* =========================\n           TYPE FILTER APPLY\n           ========================= *\/\n    function buildTypesMapFromCards() {\n      var map = new Map();\n      qsa(SEL.cards).forEach(function (card) {\n        var s =\n          card.getAttribute(\"data-event-types\") ||\n          card.dataset?.eventTypes ||\n          \"\";\n        s.split(\"|\")\n          .filter(Boolean)\n          .forEach(function (slug) {\n            var label = i18nLabelFromSlug(slug);\n            if (!map.has(slug)) map.set(slug, label);\n          });\n      });\n      return map;\n    }\n    function labelToSlugWithMap(label, map) {\n      var norm = String(label || \"\")\n        .replace(\/\\u00a0\/g, \" \")\n        .replace(\/\\s+\/g, \" \")\n        .trim()\n        .toLowerCase();\n      for (var pair of map.entries()) {\n        if (String(pair[1] || \"\").toLowerCase() === norm) return pair[0];\n      }\n      var sAnd = slugifyType(label);\n      var sAmp = slugifyType(String(label).replace(\/&\/g, \"amp\"));\n      if (map.has(sAnd)) return sAnd;\n      if (map.has(sAmp)) return sAmp;\n      return sAnd;\n    }\n    function getSelectedTypeSlugs() {\n      var root = qs(SEL.typeList);\n      if (!root) return [];\n      var out = [];\n      root.querySelectorAll(\".elementor-icon-list-item\").forEach(function (li) {\n        var on =\n          li.classList.contains(\"is-checked\") ||\n          String(li.getAttribute(\"aria-checked\") || \"\").toLowerCase() ===\n            \"true\";\n        if (!on) return;\n\n        var slug = li.getAttribute(\"data-slug\");\n        if (!slug) {\n          var label = cleanText(\n            li.querySelector(\".elementor-icon-list-text\")?.textContent ||\n              li.textContent ||\n              \"\"\n          );\n          slug = i18nSlugFromLabel(label);\n        }\n        if (slug && !out.includes(slug)) out.push(slug);\n      });\n      return out;\n    }\n    function applyTypeFilter() {\n      var selected = getSelectedTypeSlugs();\n      var hasFilter = selected.length > 0;\n      qsa(SEL.cards).forEach(function (card) {\n        var item = card.closest(SEL.cardContainerLi) || card;\n        if (!hasFilter) {\n          item.classList.remove(\"is-hidden-by-type\", \"is-hidden-by-filter\");\n          return;\n        }\n        var slugs = (\n          card.getAttribute(\"data-event-types\") ||\n          card.dataset?.eventTypes ||\n          \"\"\n        )\n          .split(\"|\")\n          .filter(Boolean);\n        var match = slugs.some(function (s) {\n          return selected.includes(s);\n        });\n        if (match) {\n          item.classList.remove(\"is-hidden-by-type\", \"is-hidden-by-filter\");\n        } else {\n          item.classList.add(\"is-hidden-by-type\", \"is-hidden-by-filter\");\n        }\n      });\n    }\n    window.applyTypeFilter = function () {\n      try {\n        applyTypeFilter();\n      } catch (e) {}\n    };\n    window.applyYearFilter = function () {\n      try {\n        applyYearFilter();\n      } catch (e) {}\n    };\n\n    \/* =========================\n           DESKTOP BINDINGS (Year\/Type\/SORT)\n           ========================= *\/\n    function bindYearCheckboxes() {\n      var root = qs(SEL.yearList);\n      if (!root) return;\n      root.querySelectorAll(\".elementor-icon-list-item\").forEach(function (li) {\n        if (!li.hasAttribute(\"role\")) li.setAttribute(\"role\", \"checkbox\");\n        if (!li.hasAttribute(\"tabindex\")) li.setAttribute(\"tabindex\", \"0\");\n        li.setAttribute(\n          \"aria-checked\",\n          li.classList.contains(\"is-checked\") ? \"true\" : \"false\"\n        );\n        li.addEventListener(\"keydown\", function (e) {\n          if (e.key === \" \" || e.key === \"Enter\") {\n            e.preventDefault();\n            var on = !(\n              li.classList.contains(\"is-checked\") ||\n              String(li.getAttribute(\"aria-checked\") || \"\") === \"true\"\n            );\n            li.classList.toggle(\"is-checked\", on);\n            li.setAttribute(\"aria-checked\", on ? \"true\" : \"false\");\n            oscFilters.set({ years: getCheckedYears() }, { source: \"desktop\" });\n            document.dispatchEvent(\n              new CustomEvent(\"osc:year-filter-changed\", {\n                detail: { years: getCheckedYears() },\n              })\n            );\n          }\n        });\n      });\n      root.addEventListener(\"click\", function (e) {\n        var li = e.target.closest(\".elementor-icon-list-item\");\n        if (!li || !root.contains(li)) return;\n        e.preventDefault();\n        var on = !(\n          li.classList.contains(\"is-checked\") ||\n          String(li.getAttribute(\"aria-checked\") || \"\") === \"true\"\n        );\n        li.classList.toggle(\"is-checked\", on);\n        li.setAttribute(\"aria-checked\", on ? \"true\" : \"false\");\n        oscFilters.set({ years: getCheckedYears() }, { source: \"desktop\" });\n        document.dispatchEvent(\n          new CustomEvent(\"osc:year-filter-changed\", {\n            detail: { years: getCheckedYears() },\n          })\n        );\n      });\n    }\n    function bindTypeCheckboxes() {\n      var root = qs(SEL.typeList);\n      if (!root) return;\n      root.querySelectorAll(\".elementor-icon-list-item\").forEach(function (li) {\n        if (!li.hasAttribute(\"role\")) li.setAttribute(\"role\", \"checkbox\");\n        if (!li.hasAttribute(\"tabindex\")) li.setAttribute(\"tabindex\", \"0\");\n        li.setAttribute(\n          \"aria-checked\",\n          li.classList.contains(\"is-checked\") ? \"true\" : \"false\"\n        );\n      });\n      root.addEventListener(\"click\", function (e) {\n        var li = e.target.closest(\".elementor-icon-list-item\");\n        if (!li || !root.contains(li)) return;\n        var a = e.target.closest(\"a\");\n        if (a) e.preventDefault();\n        var on = !(\n          li.classList.contains(\"is-checked\") ||\n          String(li.getAttribute(\"aria-checked\") || \"\") === \"true\"\n        );\n        li.classList.toggle(\"is-checked\", on);\n        li.setAttribute(\"aria-checked\", on ? \"true\" : \"false\");\n        oscFilters.set(\n          { types: getSelectedTypeSlugs() },\n          { source: \"desktop\" }\n        );\n        document.dispatchEvent(\n          new CustomEvent(\"osc:type-filter-changed\", {\n            detail: { types: getSelectedTypeSlugs() },\n          })\n        );\n      });\n      root.addEventListener(\"keydown\", function (e) {\n        if (e.key === \" \" || e.key === \"Enter\") {\n          var li =\n            document.activeElement &&\n            document.activeElement.closest(\".elementor-icon-list-item\");\n          if (!li || !root.contains(li)) return;\n          e.preventDefault();\n          var on = !(\n            li.classList.contains(\"is-checked\") ||\n            String(li.getAttribute(\"aria-checked\") || \"\") === \"true\"\n          );\n          li.classList.toggle(\"is-checked\", on);\n          li.setAttribute(\"aria-checked\", on ? \"true\" : \"false\");\n          oscFilters.set(\n            { types: getSelectedTypeSlugs() },\n            { source: \"desktop\" }\n          );\n          document.dispatchEvent(\n            new CustomEvent(\"osc:type-filter-changed\", {\n              detail: { types: getSelectedTypeSlugs() },\n            })\n          );\n        }\n      });\n    }\n\n    \/* =========================\n           MOBILE FILTER MODAL (Years + Types + Sort)\n           ========================= *\/\n    function ensureFilterModal() {\n      var modal = document.getElementById(\"osc-filter-modal\");\n      var applied = oscFilters.get();\n      var liveOrder = (function () {\n        var o = String(qs(SEL.sortWrap)?.dataset?.order || \"\").toLowerCase();\n        if (o === \"name-asc\" || o === \"name-desc\") return o;\n        return o === \"asc\" || o === \"desc\" ? o : \"desc\";\n      })();\n\n      var typesMap = oscFilters.getAvailableTypesMap();\n      var typesArr = Array.from(typesMap, function (e) {\n        return { slug: e[0], label: e[1] };\n      }).sort(function (a, b) {\n        return a.label.localeCompare(b.label);\n      });\n\n      var availableYears = new Set();\n      qsa(\".mc-card\").forEach(function (card) {\n        var years = yearsFromCard(card);\n        years.forEach(function (y) {\n          availableYears.add(y);\n        });\n      });\n      var yearsArr = Array.from(availableYears).sort(function (a, b) {\n        return b - a;\n      });\n\n      function listHTML(items) {\n        return items\n          .map(function (t) {\n            var on = applied.types.indexOf(t.slug) !== -1;\n            return (\n              '<li class=\"elementor-icon-list-item' +\n              (on ? \" is-checked\" : \"\") +\n              '\" data-slug=\"' +\n              esc(t.slug) +\n              '\" aria-checked=\"' +\n              (on ? \"true\" : \"false\") +\n              '\"><span class=\"elementor-icon-list-text\">' +\n              esc(t.label) +\n              \"<\/span><\/li>\"\n            );\n          })\n          .join(\"\");\n      }\n\n      function yearButtonsHTML(years) {\n        return years\n          .map(function (y) {\n            var on = applied.years.indexOf(y) !== -1;\n            return (\n              '<button type=\"button\" class=\"year-btn' +\n              (on ? \" is-active\" : \"\") +\n              '\" data-year=\"' +\n              y +\n              '\">' +\n              y +\n              \"<\/button>\"\n            );\n          })\n          .join(\"\");\n      }\n\n      if (!modal) {\n        modal = document.createElement(\"div\");\n        modal.id = \"osc-filter-modal\";\n\n        var typesHTML = listHTML(typesArr);\n        var yearsHTML = yearButtonsHTML(yearsArr);\n\n        modal.innerHTML =\n          '<div class=\"box\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"osc-filter-title\" tabindex=\"-1\">' +\n          '<div class=\"header\"><h3 id=\"osc-filter-title\" class=\"title\">Filter<\/h3><button type=\"button\" class=\"filter-popup-close\" aria-label=\"Close\"><img loading=\"lazy\" loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/09\/icon_close_24x24.png\" alt=\"\" width=\"20\" height=\"20\"><\/button><\/div>' +\n          '<div class=\"content\">' +\n          '<div class=\"section accordion-section\">' +\n          '<button type=\"button\" class=\"section-title accordion-toggle\" aria-expanded=\"false\">' +\n          'Event Type<span class=\"accordion-icon\"><\/span>' +\n          \"<\/button>\" +\n          '<div class=\"accordion-content\" style=\"display:none;\"><div class=\"type-list todo-list\"><ul class=\"elementor-icon-list-items\">' +\n          typesHTML +\n          \"<\/ul><\/div><\/div><\/div>\" +\n          '<div class=\"section accordion-section\">' +\n          '<button type=\"button\" class=\"section-title accordion-toggle\" aria-expanded=\"false\">' +\n          'Year<span class=\"accordion-icon\"><\/span>' +\n          \"<\/button>\" +\n          '<div class=\"accordion-content\" style=\"display:none;\"><div class=\"year-buttons\">' +\n          yearsHTML +\n          \"<\/div><\/div><\/div>\" +\n          '<div class=\"section accordion-section\">' +\n          '<button type=\"button\" class=\"section-title accordion-toggle\" aria-expanded=\"false\">' +\n          'Sort by<span class=\"accordion-icon\"><\/span>' +\n          \"<\/button>\" +\n          '<div class=\"accordion-content\" style=\"display:none;\">' +\n          '<div class=\"sort-group\" role=\"radiogroup\" aria-label=\"Sort by\">' +\n          '<label class=\"radio\"><input type=\"radio\" name=\"osc-sort\" value=\"desc\"' +\n          (liveOrder === \"desc\" ? \" checked\" : \"\") +\n          \"><span>Newest<\/span><\/label>\" +\n          '<label class=\"radio\"><input type=\"radio\" name=\"osc-sort\" value=\"asc\"' +\n          (liveOrder === \"asc\" ? \" checked\" : \"\") +\n          \"><span>Oldest<\/span><\/label>\" +\n          \"<\/div><\/div><\/div>\" +\n          \"<\/div>\" +\n          '<div class=\"actions\"><button type=\"button\" class=\"btn btn-clear\" data-action=\"clear\">Clear all<\/button><button type=\"button\" class=\"btn btn-apply\" data-action=\"apply\">Apply<\/button><\/div>' +\n          \"<\/div>\";\n\n        document.body.appendChild(modal);\n\n        modal.querySelectorAll(\".accordion-toggle\").forEach(function (btn) {\n          btn.addEventListener(\"click\", function () {\n            var content = btn.nextElementSibling;\n            var isOpen = btn.getAttribute(\"aria-expanded\") === \"true\";\n            btn.setAttribute(\"aria-expanded\", !isOpen);\n            content.style.display = isOpen ? \"none\" : \"block\";\n          });\n        });\n\n        modal.addEventListener(\"click\", function (e) {\n          if (e.target === modal || e.target.closest(\".filter-popup-close\"))\n            closeFilterModal();\n          var btn = e.target.closest(\"button[data-action]\");\n          if (btn) {\n            var action = btn.getAttribute(\"data-action\");\n            if (action === \"clear\") clearAllInModal(modal);\n            if (action === \"apply\") applyFromModal(modal);\n          }\n        });\n        document.addEventListener(\"keydown\", function (e) {\n          if (e.key === \"Escape\") closeFilterModal();\n        });\n\n        var yearBtns = modal.querySelector(\".year-buttons\");\n        if (yearBtns) {\n          yearBtns.addEventListener(\"click\", function (e) {\n            var btn = e.target.closest(\".year-btn\");\n            if (!btn || !yearBtns.contains(btn)) return;\n            btn.classList.toggle(\"is-active\");\n          });\n        }\n\n        var typeList = modal.querySelector(\".type-list\");\n        if (typeList) {\n          typeList.addEventListener(\"click\", function (e) {\n            var li = e.target.closest(\".elementor-icon-list-item\");\n            if (!li || !typeList.contains(li)) return;\n            li.classList.toggle(\"is-checked\");\n            li.setAttribute(\n              \"aria-checked\",\n              li.classList.contains(\"is-checked\") ? \"true\" : \"false\"\n            );\n          });\n        }\n\n        modal.dataset.bound = \"1\";\n      } else {\n        syncModalFromApplied(modal);\n      }\n      return modal;\n    }\n\n    function syncModalFromApplied(modal) {\n      var applied = oscFilters.get();\n      var liveOrder = (function () {\n        var o = String(qs(SEL.sortWrap)?.dataset?.order || \"\").toLowerCase();\n        if (o === \"name-asc\" || o === \"name-desc\") return o;\n        return o === \"asc\" || o === \"desc\" ? o : \"desc\";\n      })();\n\n      modal.querySelectorAll(\".year-btn\").forEach(function (btn) {\n        var y = parseInt(btn.getAttribute(\"data-year\") || \"0\", 10);\n        var on = Number.isFinite(y) && applied.years.indexOf(y) !== -1;\n        btn.classList.toggle(\"is-active\", on);\n      });\n\n      modal\n        .querySelectorAll(\".type-list .elementor-icon-list-item\")\n        .forEach(function (li) {\n          var slug = li.getAttribute(\"data-slug\") || \"\";\n          var on = slug && applied.types.indexOf(slug) !== -1;\n          li.classList.toggle(\"is-checked\", on);\n          li.setAttribute(\"aria-checked\", on ? \"true\" : \"false\");\n        });\n\n      modal.querySelectorAll('input[name=\"osc-sort\"]').forEach(function (r) {\n        r.checked = r.value === liveOrder;\n      });\n    }\n\n    function clearAllInModal(modal) {\n      modal.querySelectorAll(\".year-btn\").forEach(function (btn) {\n        btn.classList.remove(\"is-active\");\n      });\n\n      modal\n        .querySelectorAll(\".type-list .elementor-icon-list-item\")\n        .forEach(function (li) {\n          li.classList.remove(\"is-checked\");\n          li.setAttribute(\"aria-checked\", \"false\");\n        });\n      var oldest = modal.querySelector('input[name=\"osc-sort\"][value=\"asc\"]');\n      if (oldest) oldest.checked = true;\n\n      modal.querySelectorAll(\".accordion-section\").forEach(function (sec) {\n        var btn = sec.querySelector(\".accordion-toggle\");\n        var content = sec.querySelector(\".accordion-content\");\n        if (!btn || !content) return;\n        btn.setAttribute(\"aria-expanded\", \"false\");\n        content.style.display = \"none\";\n      });\n\n      var firstSec = modal.querySelector(\".accordion-section\");\n      if (firstSec) {\n        var firstBtn = firstSec.querySelector(\".accordion-toggle\");\n        var firstContent = firstSec.querySelector(\".accordion-content\");\n        if (firstBtn && firstContent) {\n          firstBtn.setAttribute(\"aria-expanded\", \"true\");\n          firstContent.style.display = \"block\";\n        }\n      }\n\n      var sortSec = Array.from(\n        modal.querySelectorAll(\".accordion-section\")\n      ).find(function (sec) {\n        var t = (sec.querySelector(\".section-title\") || {}).textContent || \"\";\n        return \/sort by\/i.test(t);\n      });\n      if (sortSec) {\n        var sBtn = sortSec.querySelector(\".accordion-toggle\");\n        var sContent = sortSec.querySelector(\".accordion-content\");\n        if (sBtn && sContent) {\n          sBtn.setAttribute(\"aria-expanded\", \"false\");\n          sContent.style.display = \"none\";\n        }\n      }\n    }\n\n    function applyFromModal(modal) {\n      var years = [];\n      modal.querySelectorAll(\".year-btn.is-active\").forEach(function (btn) {\n        var year = parseInt(btn.getAttribute(\"data-year\") || \"0\", 10);\n        if (year && years.indexOf(year) === -1) years.push(year);\n      });\n\n      var types = [];\n      modal\n        .querySelectorAll(\".type-list .elementor-icon-list-item.is-checked\")\n        .forEach(function (li) {\n          var slug = li.getAttribute(\"data-slug\") || \"\";\n          if (slug && types.indexOf(slug) === -1) types.push(slug);\n        });\n\n      var order =\n        modal.querySelector('input[name=\"osc-sort\"]:checked')?.value || \"asc\";\n\n      oscFilters.set({ years: years, types: types, order: order });\n\n      if (typeof applyOrder === \"function\") {\n        applyOrder(order);\n      } else {\n        sortAll(order);\n      }\n\n      var menu = qs(SEL.sortMenu);\n      if (menu) {\n        qsa(SEL.sortMenuItem, menu).forEach(function (x) {\n          var xLabel = cleanText(\n            x.querySelector(\".elementor-icon-list-text\")?.textContent || \"\"\n          ).toLowerCase();\n          var xIsOldest =\n            xLabel.indexOf(\"oldest\") > -1 || xLabel.indexOf(\"\u6700\u820a\") > -1;\n          var checked = xIsOldest ? order === \"asc\" : order === \"desc\";\n          x.classList.toggle(\"is-checked\", checked);\n          x.setAttribute(\"aria-checked\", checked ? \"true\" : \"false\");\n        });\n      }\n\n      closeFilterModal();\n    }\n\n    function openFilterModal() {\n      var modal = ensureFilterModal();\n      syncModalFromApplied(modal);\n\n      var applied = oscFilters.get();\n      var nothingSelected =\n        (!applied.years || applied.years.length === 0) &&\n        (!applied.types || applied.types.length === 0);\n\n      if (nothingSelected) {\n        modal.querySelectorAll(\".accordion-section\").forEach(function (sec) {\n          var btn = sec.querySelector(\".accordion-toggle\");\n          var content = sec.querySelector(\".accordion-content\");\n          if (btn && content) {\n            btn.setAttribute(\"aria-expanded\", \"false\");\n            content.style.display = \"none\";\n          }\n        });\n\n        var firstSec = modal.querySelector(\".accordion-section\");\n        if (firstSec) {\n          var firstBtn = firstSec.querySelector(\".accordion-toggle\");\n          var firstContent = firstSec.querySelector(\".accordion-content\");\n          if (firstBtn && firstContent) {\n            firstBtn.setAttribute(\"aria-expanded\", \"true\");\n            firstContent.style.display = \"block\";\n          }\n        }\n\n        var sortSec = Array.from(\n          modal.querySelectorAll(\".accordion-section\")\n        ).find(function (sec) {\n          var t = (sec.querySelector(\".section-title\") || {}).textContent || \"\";\n          return \/sort by\/i.test(t);\n        });\n        if (sortSec) {\n          var sBtn = sortSec.querySelector(\".accordion-toggle\");\n          var sContent = sortSec.querySelector(\".accordion-content\");\n          if (sBtn && sContent) {\n            sBtn.setAttribute(\"aria-expanded\", \"false\");\n            sContent.style.display = \"none\";\n          }\n        }\n      } else {\n        expandSelectedSections(modal);\n      }\n\n      modal.classList.add(\"is-open\");\n      setTimeout(function () {\n        modal.querySelector(\".box\")?.focus();\n      }, 0);\n    }\n\n    function closeFilterModal() {\n      var modal = document.getElementById(\"osc-filter-modal\");\n      if (modal) modal.classList.remove(\"is-open\");\n    }\n\n    function setAccordionOpen(btn, open) {\n      if (!btn) return;\n      btn.setAttribute(\"aria-expanded\", open ? \"true\" : \"false\");\n      var content = btn.nextElementSibling;\n      if (content) content.style.display = open ? \"block\" : \"none\";\n    }\n\n    function expandSelectedSections(modal) {\n      if (!modal) return;\n\n      var typesSec = modal.querySelector(\".type-list\");\n      var typesBtn =\n        typesSec &&\n        typesSec\n          .closest(\".accordion-section\")\n          ?.querySelector(\".accordion-toggle\");\n      var hasTypesChecked = !!modal.querySelector(\n        \".type-list .elementor-icon-list-item.is-checked\"\n      );\n      setAccordionOpen(typesBtn, hasTypesChecked);\n\n      var yearsSec = modal.querySelector(\".year-buttons\");\n      var yearsBtn =\n        yearsSec &&\n        yearsSec\n          .closest(\".accordion-section\")\n          ?.querySelector(\".accordion-toggle\");\n      var hasYearsChecked = !!modal.querySelector(\n        \".year-buttons .year-btn.is-active\"\n      );\n      setAccordionOpen(yearsBtn, hasYearsChecked);\n    }\n    (function () {\n      var YEAR_LIST_SEL =\n        \".date-selector .todo-list .elementor-icon-list-items\";\n\n      function clean(s) {\n        return String(s || \"\").replace(\/\\u00a0\/g, \" \");\n      }\n      function yearsFromText(t) {\n        var out = new Set(),\n          m,\n          re = \/\\b(20\\d{2})\/g;\n        t = clean(t || \"\");\n        while ((m = re.exec(t)) !== null) {\n          out.add(parseInt(m[1], 10));\n        }\n        return out;\n      }\n      function yearFromISO(iso) {\n        if (!iso) return NaN;\n        var d = new Date(iso);\n        return isNaN(d) ? NaN : d.getFullYear();\n      }\n\n      function collectYears() {\n        var set = new Set();\n        var cards = document.querySelectorAll(\".mc-card\");\n        for (var i = 0; i < cards.length; i++) {\n          var card = cards[i];\n\n          var dd = card.querySelector(\".mc-card__date\");\n          yearsFromText((dd && dd.textContent) || \"\").forEach(function (y) {\n            set.add(y);\n          });\n\n          var desc = card.querySelector(\".mc-desc\");\n          if (desc) {\n            var tmp = document.createElement(\"div\");\n            tmp.innerHTML = desc.innerHTML;\n            var de = tmp.querySelector(\".date\") || tmp.querySelector(\".time\");\n            if (de)\n              yearsFromText(de.textContent).forEach(function (y) {\n                set.add(y);\n              });\n          }\n\n          var attrs = [\"data-start\", \"data-end\", \"data-dtstart\", \"data-dtend\"];\n          for (var k = 0; k < attrs.length; k++) {\n            var v =\n              card.getAttribute(attrs[k]) ||\n              (card.dataset && card.dataset[attrs[k].replace(\/^data-\/, \"\")]) ||\n              \"\";\n            var y = yearFromISO(v);\n            if (isFinite(y)) set.add(y);\n          }\n        }\n        return Array.from(set)\n          .filter(function (y) {\n            return isFinite(y);\n          })\n          .sort(function (a, b) {\n            return b - a;\n          });\n      }\n\n      function currentSelectedYears(root) {\n        var sel = [];\n        root\n          .querySelectorAll(\".elementor-icon-list-item\")\n          .forEach(function (li) {\n            var on =\n              li.classList.contains(\"is-checked\") ||\n              String(li.getAttribute(\"aria-checked\") || \"\").toLowerCase() ===\n                \"true\";\n            if (!on) return;\n            var m = clean(li.textContent).match(\/(20\\d{2})\/);\n            if (m) sel.push(parseInt(m[1], 10));\n          });\n        return sel;\n      }\n\n      function rebuildYearList() {\n        var root = document.querySelector(YEAR_LIST_SEL);\n        if (!root) return;\n\n        var years = collectYears();\n        if (!years.length) return;\n\n        var prevSel = currentSelectedYears(root);\n\n        while (root.firstChild) root.removeChild(root.firstChild);\n\n        years.forEach(function (y) {\n          var li = document.createElement(\"li\");\n          li.className = \"elementor-icon-list-item\";\n          li.setAttribute(\"role\", \"checkbox\");\n          li.setAttribute(\"tabindex\", \"0\");\n\n          var checked = prevSel.indexOf(y) !== -1;\n          if (checked) li.classList.add(\"is-checked\");\n          li.setAttribute(\"aria-checked\", checked ? \"true\" : \"false\");\n\n          var span = document.createElement(\"span\");\n          span.className = \"elementor-icon-list-text\";\n          span.textContent = String(y);\n          li.appendChild(span);\n          root.appendChild(li);\n        });\n\n        var validSel = prevSel.filter(function (y) {\n          return years.indexOf(y) !== -1;\n        });\n        if (window.oscFilters && typeof window.oscFilters.set === \"function\") {\n          window.oscFilters.set({ years: validSel }, { source: \"desktop\" });\n        } else {\n          document.dispatchEvent(\n            new CustomEvent(\"osc:year-filter-changed\", {\n              detail: { years: validSel },\n            })\n          );\n        }\n      }\n\n      if (document.readyState === \"loading\") {\n        document.addEventListener(\"DOMContentLoaded\", rebuildYearList);\n      } else {\n        rebuildYearList();\n      }\n    })();\n    function init() {\n      hydrateAll();\n      try {\n        rebuildYearList();\n      } catch (err) {}\n      qsa(SEL.cards).forEach(getCategoriesFromCard);\n      rewriteAllEventLinks();\n      normalizeAllDayDisplays();\n\n      var wrap = qs(SEL.sortWrap);\n      var initial = \"desc\";\n\n      if (wrap && cleanText(wrap.dataset.order).toLowerCase() === \"asc\")\n        initial = \"asc\";\n\n      var headerTxt = cleanText(qs(SEL.sortText)?.textContent || \"\");\n\n      if (\/^oldest$\/i.test(headerTxt) || headerTxt.indexOf(\"\u6700\u820a\") > -1) {\n        initial = \"asc\";\n      }\n\n      if (\/^newest$\/i.test(headerTxt) || headerTxt.indexOf(\"\u6700\u65b0\") > -1) {\n        initial = \"desc\";\n      }\n      applyOrder(initial);\n      bindSortUI();\n\n      document.addEventListener(\"click\", onPopupClick, { passive: false });\n\n      collectAllCategories(true);\n\n      bindYearCheckboxes();\n      bindTypeCheckboxes();\n\n      document.addEventListener(\"osc:type-filter-changed\", function () {\n        try {\n          applyTypeFilter();\n        } catch (e) {}\n      });\n      document.addEventListener(\"osc:year-filter-changed\", function () {\n        try {\n          applyYearFilter();\n        } catch (e) {}\n      });\n\n      var trigger = qs(SEL.mobileTrigger);\n      if (trigger) trigger.addEventListener(\"click\", openFilterModal);\n\n      pinFeaturedFirst();\n    }\n\n    if (document.readyState === \"loading\")\n      document.addEventListener(\"DOMContentLoaded\", init);\n    else init();\n  })();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-39b56ca elementor-widget elementor-widget-html\" data-id=\"39b56ca\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\n(function hidePhpWarnings() {\n  if (document.body.classList.contains('wp-admin')) return;\n\n  function purge(node) {\n    if (node.nodeType === Node.TEXT_NODE) {\n      const t = node.nodeValue.trim();\n      if (\/^Warning:\/i.test(t)) node.nodeValue = '';\n      return;\n    }\n    if (node.nodeType === Node.ELEMENT_NODE) {\n      if (node.textContent && \/^Warning:\/i.test(node.textContent.trim())) {\n        \/\/ fallback cleanup\n      }\n      for (const child of Array.from(node.childNodes)) purge(child);\n    }\n  }\n\n  purge(document.body);\n\n  const mo = new MutationObserver(mutations => {\n    for (const m of mutations) {\n      for (const n of m.addedNodes) purge(n);\n    }\n  });\n  mo.observe(document.body, { childList: true, subtree: true });\n})();\n\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>CitywideFundraising Events Each year, Operation Santa Claus launches its public fundraising campaign ahead of Christmas, celebrating a season of caring, sharing, and giving. Here is a range of donor-led fundraising [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":12271,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_price":"","_stock":"","_tribe_ticket_header":"","_tribe_default_ticket_provider":"","_tribe_ticket_capacity":"0","_ticket_start_date":"","_ticket_end_date":"","_tribe_ticket_show_description":"","_tribe_ticket_show_not_going":false,"_tribe_ticket_use_global_stock":"","_tribe_ticket_global_stock_level":"","_global_stock_mode":"","_global_stock_cap":"","_tribe_rsvp_for_event":"","_tribe_ticket_going_count":"","_tribe_ticket_not_going_count":"","_tribe_tickets_list":"[]","_tribe_ticket_has_attendee_info_fields":false,"_mc_calendar":[],"footnotes":"","_tec_slr_enabled":"","_tec_slr_layout":""},"class_list":["post-16713","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Citywide Fundraising Events - Operation Santa Claus | Jointly organised by SCMP and RTHK<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/\" \/>\n<meta property=\"og:locale\" content=\"zh_HK\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Citywide Fundraising Events - Operation Santa Claus | Jointly organised by SCMP and RTHK\" \/>\n<meta property=\"og:description\" content=\"CitywideFundraising Events Each year, Operation Santa Claus launches its public fundraising campaign ahead of Christmas, celebrating a season of caring, sharing, and giving. Here is a range of donor-led fundraising [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/\" \/>\n<meta property=\"og:site_name\" content=\"Operation Santa Claus | Jointly organised by SCMP and RTHK\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-25T05:46:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oschk.org\/wp-content\/uploads\/2026\/05\/OSC-primary-lockup-full-color-CMYK.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1651\" \/>\n\t<meta property=\"og:image:height\" content=\"1247\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/\",\"url\":\"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/\",\"name\":\"Citywide Fundraising Events - Operation Santa Claus | Jointly organised by SCMP and RTHK\",\"isPartOf\":{\"@id\":\"https:\/\/oschk.org\/zh\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/carousel-img-desktop-3-1.png\",\"datePublished\":\"2025-09-12T13:47:47+00:00\",\"dateModified\":\"2026-06-25T05:46:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/#breadcrumb\"},\"inLanguage\":\"zh-HK\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-HK\",\"@id\":\"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/#primaryimage\",\"url\":\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/carousel-img-desktop-3-1.png\",\"contentUrl\":\"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/carousel-img-desktop-3-1.png\",\"width\":790,\"height\":526},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oschk.org\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Citywide Fundraising Events\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/oschk.org\/zh\/#website\",\"url\":\"https:\/\/oschk.org\/zh\/\",\"name\":\"Operation Santa Claus | Jointly organised by SCMP and RTHK\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/oschk.org\/zh\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/oschk.org\/zh\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"zh-HK\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/oschk.org\/zh\/#organization\",\"name\":\"Operation Santa Claus | Jointly organised by SCMP and RTHK\",\"url\":\"https:\/\/oschk.org\/zh\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-HK\",\"@id\":\"https:\/\/oschk.org\/zh\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/oschk.org\/wp-content\/uploads\/2026\/05\/OSC-primary-lockup-full-color-CMYK.png\",\"contentUrl\":\"https:\/\/oschk.org\/wp-content\/uploads\/2026\/05\/OSC-primary-lockup-full-color-CMYK.png\",\"width\":1651,\"height\":1247,\"caption\":\"Operation Santa Claus | Jointly organised by SCMP and RTHK\"},\"image\":{\"@id\":\"https:\/\/oschk.org\/zh\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Citywide Fundraising Events - Operation Santa Claus | Jointly organised by SCMP and RTHK","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/","og_locale":"zh_HK","og_type":"article","og_title":"Citywide Fundraising Events - Operation Santa Claus | Jointly organised by SCMP and RTHK","og_description":"CitywideFundraising Events Each year, Operation Santa Claus launches its public fundraising campaign ahead of Christmas, celebrating a season of caring, sharing, and giving. Here is a range of donor-led fundraising [&hellip;]","og_url":"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/","og_site_name":"Operation Santa Claus | Jointly organised by SCMP and RTHK","article_modified_time":"2026-06-25T05:46:01+00:00","og_image":[{"width":1651,"height":1247,"url":"https:\/\/oschk.org\/wp-content\/uploads\/2026\/05\/OSC-primary-lockup-full-color-CMYK.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/","url":"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/","name":"Citywide Fundraising Events - Operation Santa Claus | Jointly organised by SCMP and RTHK","isPartOf":{"@id":"https:\/\/oschk.org\/zh\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/#primaryimage"},"image":{"@id":"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/#primaryimage"},"thumbnailUrl":"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/carousel-img-desktop-3-1.png","datePublished":"2025-09-12T13:47:47+00:00","dateModified":"2026-06-25T05:46:01+00:00","breadcrumb":{"@id":"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/#breadcrumb"},"inLanguage":"zh-HK","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oschk.org\/zh\/citywide-fundraising-events\/"]}]},{"@type":"ImageObject","inLanguage":"zh-HK","@id":"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/#primaryimage","url":"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/carousel-img-desktop-3-1.png","contentUrl":"https:\/\/oschk.org\/wp-content\/uploads\/2025\/09\/carousel-img-desktop-3-1.png","width":790,"height":526},{"@type":"BreadcrumbList","@id":"https:\/\/oschk.org\/zh\/citywide-fundraising-events\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oschk.org\/"},{"@type":"ListItem","position":2,"name":"Citywide Fundraising Events"}]},{"@type":"WebSite","@id":"https:\/\/oschk.org\/zh\/#website","url":"https:\/\/oschk.org\/zh\/","name":"Operation Santa Claus | Jointly organised by SCMP and RTHK","description":"","publisher":{"@id":"https:\/\/oschk.org\/zh\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/oschk.org\/zh\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"zh-HK"},{"@type":"Organization","@id":"https:\/\/oschk.org\/zh\/#organization","name":"Operation Santa Claus | Jointly organised by SCMP and RTHK","url":"https:\/\/oschk.org\/zh\/","logo":{"@type":"ImageObject","inLanguage":"zh-HK","@id":"https:\/\/oschk.org\/zh\/#\/schema\/logo\/image\/","url":"https:\/\/oschk.org\/wp-content\/uploads\/2026\/05\/OSC-primary-lockup-full-color-CMYK.png","contentUrl":"https:\/\/oschk.org\/wp-content\/uploads\/2026\/05\/OSC-primary-lockup-full-color-CMYK.png","width":1651,"height":1247,"caption":"Operation Santa Claus | Jointly organised by SCMP and RTHK"},"image":{"@id":"https:\/\/oschk.org\/zh\/#\/schema\/logo\/image\/"}}]}},"ticketed":false,"_links":{"self":[{"href":"https:\/\/oschk.org\/zh\/wp-json\/wp\/v2\/pages\/16713","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oschk.org\/zh\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/oschk.org\/zh\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/oschk.org\/zh\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/oschk.org\/zh\/wp-json\/wp\/v2\/comments?post=16713"}],"version-history":[{"count":276,"href":"https:\/\/oschk.org\/zh\/wp-json\/wp\/v2\/pages\/16713\/revisions"}],"predecessor-version":[{"id":29819,"href":"https:\/\/oschk.org\/zh\/wp-json\/wp\/v2\/pages\/16713\/revisions\/29819"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oschk.org\/zh\/wp-json\/wp\/v2\/media\/12271"}],"wp:attachment":[{"href":"https:\/\/oschk.org\/zh\/wp-json\/wp\/v2\/media?parent=16713"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}