{"id":9472,"date":"2026-10-02T10:14:47","date_gmt":"2026-10-02T03:14:47","guid":{"rendered":"https:\/\/bingxueindonesia.co.id\/?page_id=9472"},"modified":"2026-10-02T10:15:14","modified_gmt":"2026-10-02T03:15:14","slug":"slot-machine-2","status":"publish","type":"page","link":"https:\/\/bingxueindonesia.co.id\/en\/slot-machine-2\/","title":{"rendered":"Slot Machine 2"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"9472\" class=\"elementor elementor-9472\">\n\t\t\t\t<div class=\"elementor-element elementor-element-079f14d e-flex e-con-boxed e-con e-parent\" data-id=\"079f14d\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c91b8e2 elementor-widget__width-inherit elementor-absolute elementor-widget elementor-widget-html\" data-id=\"c91b8e2\" data-element_type=\"widget\" data-settings=\"{&quot;_position&quot;:&quot;absolute&quot;}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- BINGXUE GREEN GRAPE GIVEAWAY \u2014 paste this ENTIRE file into ONE Elementor HTML widget.\r\n     Replaces Spinwheel.html only. Keep Form.php, Dashboard.php, and Spinwheel.php active.\r\n     No build step, third-party JavaScript, participant fixtures, or PHP inside this widget. -->\r\n<style>\r\n  #bxgg-slot {\r\n    --ink:#183e2e; --muted:#627566; --lime:#d7f28d; --paper:#fffef7; --line:#d9e1c7;\r\n    box-sizing:border-box; font-family:Arial,Helvetica,sans-serif; color:var(--ink); font-size:16px; line-height:1.5;\r\n    background:radial-gradient(ellipse at 4% 5%,#fdfded 0,transparent 48%),linear-gradient(130deg,#f0f4df,#e1ebc9);\r\n    min-height:100vh; padding:28px clamp(16px,4vw,76px) 32px; position:relative; isolation:isolate;\r\n  }\r\n  #bxgg-slot *, #bxgg-slot *::before, #bxgg-slot *::after { box-sizing:border-box; }\r\n  #bxgg-slot [hidden] { display:none !important; }\r\n  #bxgg-slot h1, #bxgg-slot h2, #bxgg-slot h3, #bxgg-slot p { margin:0; color:inherit; }\r\n  #bxgg-slot button, #bxgg-slot input { font:inherit; letter-spacing:normal; text-transform:none; }\r\n  #bxgg-slot button { cursor:pointer; margin:0; line-height:1.3; box-shadow:none; }\r\n  #bxgg-slot button:disabled { cursor:not-allowed; opacity:.48; }\r\n  #bxgg-slot button:focus-visible, #bxgg-slot a:focus-visible, #bxgg-slot input:focus-visible { outline:3px solid #65932e; outline-offset:4px; }\r\n  #bxgg-slot a { color:var(--ink); text-decoration:underline; }\r\n  #bxgg-slot .gg-shell { max-width:1600px; margin:auto; }\r\n  #bxgg-slot .gg-header { display:flex; justify-content:space-between; align-items:center; gap:24px; padding-bottom:22px; border-bottom:1px solid #bccbab; }\r\n  #bxgg-slot .gg-brand { display:flex; align-items:center; gap:14px; }\r\n  #bxgg-slot .gg-logo { display:block; max-width:225px; max-height:85px; width:auto; height:auto; object-fit:contain; }\r\n  #bxgg-slot .gg-brand-text { font-weight:900; font-size:27px; letter-spacing:-1px; line-height:1.1; }\r\n  #bxgg-slot .gg-brand-text small { display:block; font-size:10px; letter-spacing:2.2px; margin-top:8px; }\r\n  #bxgg-slot .gg-schedule { text-align:right; font-size:12px; font-weight:600; }\r\n  #bxgg-slot .gg-live { display:inline-flex; align-items:center; gap:8px; font-size:10px; letter-spacing:2px; margin-bottom:6px; }\r\n  #bxgg-slot .gg-live::before { content:\"\"; width:7px; height:7px; border-radius:50%; background:#518735; }\r\n  #bxgg-slot .gg-intro { display:flex; align-items:flex-end; justify-content:space-between; gap:24px; padding:29px 0 23px; }\r\n  #bxgg-slot .gg-eyebrow { font-size:10px; font-weight:800; letter-spacing:2.5px; text-transform:uppercase; margin-bottom:8px; }\r\n  #bxgg-slot h1 { font-family:Georgia,'Times New Roman',serif; font-size:clamp(34px,3.7vw,59px); font-weight:400; letter-spacing:-1.8px; line-height:1.05; }\r\n  #bxgg-slot h1 em { font-weight:400; }\r\n  #bxgg-slot .gg-intro-note { font-size:13px; color:var(--muted); max-width:220px; text-align:right; }\r\n  #bxgg-slot .gg-grid { display:grid; grid-template-columns:minmax(0,1fr) 310px; gap:24px; align-items:start; }\r\n  #bxgg-slot .gg-machine { min-width:0; background:linear-gradient(145deg,#285b3c,#123b2b); border:1px solid #2e613c; border-radius:32px; padding:26px; box-shadow:0 18px 38px #2948201a,inset 0 1px 0 #ffffff55; position:relative; }\r\n  #bxgg-slot .gg-machine-top { display:flex; justify-content:space-between; align-items:center; color:#e7f0cf; gap:12px; margin-bottom:21px; }\r\n  #bxgg-slot .gg-machine-label { font-size:11px; letter-spacing:3px; font-weight:700; }\r\n  #bxgg-slot .gg-count { font-size:12px; border:1px solid #688b5c; background:#ffffff09; border-radius:30px; padding:7px 12px; text-align:right; }\r\n  #bxgg-slot .gg-window-frame { position:relative; background:#b6cc82; padding:8px; border-radius:20px; box-shadow:inset 0 2px 3px #ffffff66,0 4px 0 #0e2c21; }\r\n  #bxgg-slot .gg-stage { --row-h:92px; position:relative; min-height:224px; border-radius:13px; background:#fafbf0; overflow:hidden; box-shadow:inset 0 2px 9px #142c2530; }\r\n  #bxgg-slot .gg-reels { position:absolute; inset:0; display:grid; gap:3px; padding:0 4px; }\r\n  #bxgg-slot .gg-reel { position:relative; min-width:0; overflow:hidden; border-right:1px solid #d5ddc8; background:linear-gradient(90deg,#eef1e4,#fffef8 25%,#fffef8 75%,#eef1e4); }\r\n  #bxgg-slot .gg-reel:last-child { border-right:0; }\r\n  #bxgg-slot .gg-track { position:absolute; top:calc(50% - var(--row-h)*1.5); width:100%; will-change:transform; }\r\n  #bxgg-slot .gg-cell { height:var(--row-h); display:flex; align-items:center; justify-content:center; font-family:ui-monospace,'Cascadia Code','Courier New',monospace; font-weight:800; font-size:clamp(28px,4.8vw,76px); line-height:1; white-space:pre; color:#173d2b; }\r\n  #bxgg-slot .gg-wide .gg-cell { font-size:clamp(20px,3vw,43px); padding:0 20px; text-align:center; line-height:1.2; overflow-wrap:anywhere; white-space:pre-wrap; }\r\n  #bxgg-slot .gg-selection { position:absolute; top:calc(50% - var(--row-h)\/2); height:var(--row-h); inset-inline:0; border-block:2px solid #9ac14a; background:#c8eb7620; pointer-events:none; }\r\n  #bxgg-slot .gg-stage::after { content:\"\"; position:absolute; inset:0; pointer-events:none; background:linear-gradient(180deg,#eef0e7 0%,#f1f4e6cc 15%,transparent 33%,transparent 67%,#f1f4e6cc 85%,#eef0e7 100%); }\r\n  #bxgg-slot .gg-wide-final { position:relative; z-index:1; min-height:224px; display:flex; align-items:center; justify-content:center; padding:35px 24px; font:800 clamp(24px,3.3vw,50px)\/1.25 ui-monospace,'Courier New',monospace; overflow-wrap:anywhere; white-space:pre-wrap; text-align:center; background:#fffef3; border-block:2px solid #a5c96b; }\r\n  #bxgg-slot .gg-machine-footer { display:flex; align-items:center; justify-content:center; gap:10px; padding-top:16px; color:#c2d6b8; font-size:10px; letter-spacing:2px; }\r\n  #bxgg-slot .gg-grapes { width:28px; height:32px; flex-shrink:0; }\r\n  #bxgg-slot .gg-controls { text-align:center; padding-top:22px; }\r\n  #bxgg-slot .gg-primary { border:1px solid #bddb75; border-radius:14px; background:#d7f28d; color:#173d2b; padding:15px 30px; font-weight:800; font-size:14px; }\r\n  #bxgg-slot .gg-draw { width:min(360px,100%); font-size:15px; letter-spacing:2px; min-height:57px; box-shadow:0 4px 0 #a9c86b; transition:transform .15s,background .15s; }\r\n  #bxgg-slot .gg-primary:hover:not(:disabled) { background:#e4ffa2; }\r\n  #bxgg-slot .gg-draw:active:not(:disabled) { transform:translateY(2px); }\r\n  #bxgg-slot .gg-status { min-height:24px; font-size:12px; color:var(--muted); margin:13px 0 8px; }\r\n  #bxgg-slot .gg-secondary { border:1px solid #c6d2b5; border-radius:9px; background:#fffef780; color:var(--ink); padding:8px 12px; font-size:12px; font-weight:700; }\r\n  #bxgg-slot .gg-link-button { border:0; border-radius:0; padding:6px; background:transparent; color:var(--muted); font-size:11px; text-decoration:underline; text-underline-offset:3px; }\r\n  #bxgg-slot .gg-result { background:#ffffff70; border:1px solid var(--line); border-radius:16px; padding:15px; margin-top:17px; text-align:center; }\r\n  #bxgg-slot .gg-result p:first-child { font-size:10px; letter-spacing:1.8px; font-weight:800; }\r\n  #bxgg-slot .gg-exact { white-space:pre-wrap; overflow-wrap:anywhere; word-break:normal; unicode-bidi:plaintext; }\r\n  #bxgg-slot .gg-result .gg-exact { font:700 20px\/1.4 ui-monospace,'Courier New',monospace; margin-top:5px; }\r\n  #bxgg-slot .gg-winners { background:#fffef7b3; border:1px solid #cfdabb; border-radius:24px; padding:22px; min-height:360px; }\r\n  #bxgg-slot .gg-winners-head { display:flex; justify-content:space-between; align-items:center; margin-bottom:4px; gap:8px; }\r\n  #bxgg-slot .gg-winners h2 { font-size:18px; font-weight:700; letter-spacing:-.5px; }\r\n  #bxgg-slot .gg-small { font-size:11px; color:var(--muted); }\r\n  #bxgg-slot .gg-winner-list { display:flex; flex-direction:column; gap:10px; margin-top:20px; max-height:370px; overflow-y:auto; padding:2px; }\r\n  #bxgg-slot .gg-empty { color:var(--muted); font-size:12px; text-align:center; padding:48px 15px; border:1px dashed #c8d4b3; border-radius:13px; }\r\n  #bxgg-slot .gg-winner-row { display:grid; grid-template-columns:33px minmax(0,1fr); gap:9px; padding:12px 10px; border:1px solid #dce3cc; border-radius:12px; background:#fffef9; }\r\n  #bxgg-slot .gg-no { width:30px; height:30px; display:grid; place-items:center; border-radius:50%; background:#e9f2d6; font-size:10px; font-weight:800; }\r\n  #bxgg-slot .gg-row-receipt { font:700 14px\/1.4 ui-monospace,'Courier New',monospace; margin-bottom:4px; }\r\n  #bxgg-slot .gg-row-name { font-size:11px; color:var(--muted); overflow-wrap:anywhere; }\r\n  #bxgg-slot .gg-row-prize { font-size:11px; font-weight:700; margin-top:4px; overflow-wrap:anywhere; }\r\n  #bxgg-slot .gg-row-bottom { display:flex; align-items:center; justify-content:space-between; gap:8px; margin-top:8px; }\r\n  #bxgg-slot .gg-alert { background:#fff7df; border:1px solid #d9bf7b; color:#624715; padding:16px; border-radius:15px; margin-top:18px; font-size:13px; overflow-wrap:anywhere; }\r\n  #bxgg-slot .gg-alert h2 { font-size:16px; margin-bottom:7px; }\r\n  #bxgg-slot .gg-alert p + p { margin-top:7px; }\r\n  #bxgg-slot .gg-actions { display:flex; flex-wrap:wrap; align-items:center; gap:9px; margin-top:13px; }\r\n  #bxgg-slot .gg-check { display:flex; gap:9px; align-items:flex-start; font-size:12px; margin-top:12px; cursor:pointer; }\r\n  #bxgg-slot .gg-check input { accent-color:#315b34; margin-top:3px; flex-shrink:0; }\r\n  #bxgg-slot .gg-recovery-list { display:flex; flex-direction:column; gap:8px; margin-top:12px; max-height:280px; overflow:auto; }\r\n  #bxgg-slot .gg-recovery-item { display:flex; justify-content:space-between; align-items:center; gap:12px; background:#fffef7; border-radius:10px; padding:10px; }\r\n  #bxgg-slot .gg-recovery-item > span { min-width:0; }\r\n  #bxgg-slot .gg-bottom { display:flex; justify-content:space-between; gap:12px; margin-top:25px; font-size:10px; letter-spacing:1px; color:#667c5d; }\r\n  #bxgg-slot dialog { color:var(--ink); font:inherit; margin:auto; padding:0; border:1px solid #d8e4bd; border-radius:24px; background:#fcfdf1; width:min(760px,calc(100vw - 28px)); max-width:none; max-height:calc(100dvh - 32px); overflow:auto; box-shadow:0 25px 90px #051b2466; }\r\n  #bxgg-slot dialog::backdrop { background:#092519ba; backdrop-filter:blur(7px); }\r\n  #bxgg-slot .gg-modal-heading { padding:27px 30px 21px; background:linear-gradient(120deg,#e6f3c9,#f5f9e9); border-bottom:1px solid #d9e4c4; text-align:center; }\r\n  #bxgg-slot .gg-modal-heading p { font-size:10px; letter-spacing:2.5px; font-weight:800; }\r\n  #bxgg-slot .gg-modal-heading h2 { font:400 35px\/1.15 Georgia,serif; margin-top:9px; overflow-wrap:anywhere; }\r\n  #bxgg-slot .gg-modal-body { display:grid; grid-template-columns:minmax(0,1fr) 220px; gap:24px; padding:24px 30px; }\r\n  #bxgg-slot .gg-field { margin-bottom:17px; }\r\n  #bxgg-slot .gg-field-label { display:block; font-size:10px; letter-spacing:1.4px; font-weight:700; color:var(--muted); margin-bottom:5px; }\r\n  #bxgg-slot .gg-modal-receipt { font:800 26px\/1.3 ui-monospace,'Courier New',monospace; }\r\n  #bxgg-slot .gg-wa-row { display:flex; align-items:center; gap:12px; }\r\n  #bxgg-slot .gg-photo-button { display:block; padding:5px; width:100%; border:1px solid #d1ddbd; border-radius:12px; background:white; }\r\n  #bxgg-slot .gg-photo-button img { display:block; width:100%; height:175px; object-fit:contain; border-radius:8px; }\r\n  #bxgg-slot .gg-input { display:block; width:100%; padding:12px; background:white; border:1px solid #b7c5a1; border-radius:9px; color:var(--ink); font-size:14px; }\r\n  #bxgg-slot .gg-modal-footer { padding:0 30px 25px; }\r\n  #bxgg-slot .gg-danger { border:1px solid #d1a69a; color:#8b3b30; border-radius:12px; padding:14px 20px; background:#fff5ef; font-weight:700; font-size:13px; }\r\n  #bxgg-slot .gg-modal-error { font-size:13px; color:#943e29; padding:11px 0; }\r\n  #bxgg-slot .gg-lightbox { width:calc(100vw - 32px); max-width:1100px; padding:16px; background:#102e22; border-color:#44624e; }\r\n  #bxgg-slot .gg-lightbox img { display:block; max-width:100%; max-height:calc(100dvh - 120px); object-fit:contain; margin:auto; }\r\n  #bxgg-slot .gg-lightbox .gg-secondary { display:block; margin:0 0 12px auto; background:#f3f8df; }\r\n  #bxgg-slot .gg-toast { position:fixed; bottom:24px; left:50%; transform:translateX(-50%); width:max-content; max-width:calc(100vw - 40px); padding:12px 18px; border-radius:12px; background:#183e2e; color:white; box-shadow:0 4px 30px #152e1930; z-index:2147483646; font-size:13px; text-align:center; pointer-events:none; }\r\n  #bxgg-slot .gg-sr { position:absolute; width:1px; height:1px; overflow:hidden; clip-path:inset(50%); white-space:nowrap; }\r\n  #bxgg-slot .gg-processing .gg-machine-label::after { content:\" \u00b7 \u00b7 \u00b7\"; }\r\n  @media (min-width:1700px) { #bxgg-slot .gg-grid { grid-template-columns:minmax(0,1fr) 345px; gap:30px; } #bxgg-slot .gg-stage, #bxgg-slot .gg-wide-final { min-height:290px; } #bxgg-slot .gg-stage { --row-h:110px; } #bxgg-slot .gg-intro { padding-block:43px 32px; } #bxgg-slot .gg-machine { padding:34px; } }\r\n  @media (min-width:1021px) and (max-height:850px) {\r\n    #bxgg-slot { padding-top:20px; padding-bottom:20px; } #bxgg-slot .gg-header { padding-bottom:14px; }\r\n    #bxgg-slot .gg-logo { max-height:60px; } #bxgg-slot .gg-intro { padding:20px 0 18px; } #bxgg-slot h1 { font-size:44px; }\r\n    #bxgg-slot .gg-machine { padding:22px; } #bxgg-slot .gg-machine-top { margin-bottom:14px; }\r\n    #bxgg-slot .gg-stage { --row-h:80px; min-height:188px; } #bxgg-slot .gg-wide-final { min-height:188px; }\r\n    #bxgg-slot .gg-machine-footer { padding-top:12px; } #bxgg-slot .gg-controls { padding-top:18px; }\r\n    #bxgg-slot .gg-bottom { margin-top:19px; }\r\n  }\r\n  @media (max-width:1020px) { #bxgg-slot .gg-grid { grid-template-columns:minmax(0,1fr); } #bxgg-slot .gg-winners { min-height:0; } #bxgg-slot .gg-winner-list { max-height:290px; } }\r\n  @media (max-width:600px) {\r\n    #bxgg-slot { padding:20px 14px 25px; } #bxgg-slot .gg-header { gap:14px; } #bxgg-slot .gg-logo { max-width:145px; max-height:68px; }\r\n    #bxgg-slot .gg-brand-text { font-size:22px; } #bxgg-slot .gg-brand-text small { font-size:8px; } #bxgg-slot .gg-schedule { font-size:10px; max-width:150px; }\r\n    #bxgg-slot .gg-intro { padding:25px 0 22px; } #bxgg-slot .gg-intro-note { display:none; } #bxgg-slot h1 { font-size:36px; }\r\n    #bxgg-slot .gg-machine { border-radius:23px; padding:15px; } #bxgg-slot .gg-machine-top { flex-wrap:wrap; gap:8px; margin-bottom:14px; }\r\n    #bxgg-slot .gg-machine-label { font-size:10px; letter-spacing:2px; } #bxgg-slot .gg-count { font-size:10px; padding:5px 9px; }\r\n    #bxgg-slot .gg-stage { --row-h:74px; min-height:194px; } #bxgg-slot .gg-cell { font-size:38px; } #bxgg-slot .gg-wide .gg-cell { font-size:21px; }\r\n    #bxgg-slot .gg-wide-final { min-height:194px; padding:24px 15px; font-size:27px; } #bxgg-slot .gg-machine-footer { font-size:8px; letter-spacing:1.3px; }\r\n    #bxgg-slot .gg-modal-body { grid-template-columns:1fr; padding:20px; gap:12px; } #bxgg-slot .gg-modal-heading { padding:23px 20px 18px; } #bxgg-slot .gg-modal-heading h2 { font-size:29px; }\r\n    #bxgg-slot .gg-photo-button img { height:140px; } #bxgg-slot .gg-modal-footer { padding:0 20px 20px; } #bxgg-slot .gg-bottom { font-size:8px; }\r\n  }\r\n  @media (prefers-reduced-motion:reduce) { #bxgg-slot *, #bxgg-slot *::before, #bxgg-slot *::after { animation:none !important; transition:none !important; scroll-behavior:auto !important; } }\r\n<\/style>\r\n\r\n<section id=\"bxgg-slot\" lang=\"id\" aria-label=\"Giveaway Green Grape\">\r\n <div class=\"gg-shell\">\r\n  <header class=\"gg-header\">\r\n   <div class=\"gg-brand\">\r\n    <img decoding=\"async\" id=\"gg-logo\" class=\"gg-logo\" hidden src=\"https:\/\/bingxueindonesia.co.id\/wp-content\/uploads\/2026\/09\/Asset-1.png\" alt=\"Bingxue Green Grape New Product Launch\">\r\n    <div id=\"gg-brand-fallback\" class=\"gg-brand-text\">BINGXUE<small>GREEN GRAPE SERIES<\/small><\/div>\r\n   <\/div>\r\n   <div class=\"gg-schedule\"><span class=\"gg-live\">FRIDAY LIVE DRAW<\/span><p>Live draw setiap Jumat pukul 19.00 WIB<\/p><\/div>\r\n  <\/header>\r\n  <div class=\"gg-intro\">\r\n   <div><p class=\"gg-eyebrow\">New product launch \u00b7 Lucky receipt<\/p><h1>Green Grape <em>Giveaway.<\/em><\/h1><\/div>\r\n   <p class=\"gg-intro-note\">Segarnya dapat.<br>Siapa yang bawa pulang hadiah?<\/p>\r\n  <\/div>\r\n  <div class=\"gg-grid\">\r\n   <main>\r\n    <div id=\"gg-machine\" class=\"gg-machine\">\r\n     <div class=\"gg-machine-top\"><span class=\"gg-machine-label\">NOMOR STRUK<\/span><span id=\"gg-count\" class=\"gg-count\">GREEN GRAPE SERIES<\/span><\/div>\r\n     <div class=\"gg-window-frame\"><div id=\"gg-stage\" class=\"gg-stage\" aria-hidden=\"true\"><\/div><\/div>\r\n     <div class=\"gg-machine-footer\">\r\n      <svg class=\"gg-grapes\" viewbox=\"0 0 40 44\" fill=\"none\" aria-hidden=\"true\"><path d=\"M20 11Q15 2 26 2M22 9Q30 2 35 8Q30 14 22 9\" stroke=\"#ccea9d\" stroke-width=\"2\"\/><g fill=\"#ccea9d\"><circle cx=\"13\" cy=\"17\" r=\"6\"\/><circle cx=\"27\" cy=\"17\" r=\"6\"\/><circle cx=\"20\" cy=\"25\" r=\"6\"\/><circle cx=\"12\" cy=\"29\" r=\"5\"\/><circle cx=\"28\" cy=\"29\" r=\"5\"\/><circle cx=\"20\" cy=\"36\" r=\"5\"\/><\/g><\/svg>\r\n      <span>A FRESH SIP. A LUCKY MOMENT.<\/span>\r\n     <\/div>\r\n    <\/div>\r\n    <div class=\"gg-controls\">\r\n     <button type=\"button\" id=\"gg-draw\" class=\"gg-primary gg-draw\" disabled hidden>MULAI UNDIAN<\/button>\r\n     <p id=\"gg-status\" class=\"gg-status\" role=\"status\" aria-live=\"polite\">Memuat undian...<\/p>\r\n     <button type=\"button\" id=\"gg-refresh\" class=\"gg-link-button\" hidden>Perbarui data<\/button>\r\n     <button type=\"button\" id=\"gg-connect\" class=\"gg-secondary\" hidden>Coba hubungkan kembali<\/button>\r\n    <\/div>\r\n    <div id=\"gg-result\" class=\"gg-result\" hidden aria-live=\"polite\"><p>SELAMAT KEPADA PEMENANG!<\/p><p id=\"gg-result-receipt\" class=\"gg-exact\"><\/p><\/div>\r\n    <div id=\"gg-notice\" class=\"gg-alert\" role=\"alert\" hidden><\/div>\r\n    <section id=\"gg-recovery\" class=\"gg-alert\" hidden aria-labelledby=\"gg-recovery-title\">\r\n     <h2 id=\"gg-recovery-title\">Periksa hasil undian sebelumnya<\/h2>\r\n     <p id=\"gg-recovery-message\">Undian baru dikunci sampai hasil sebelumnya dipastikan.<\/p>\r\n     <p id=\"gg-recovery-meta\" class=\"gg-small\"><\/p>\r\n     <div class=\"gg-actions\"><button type=\"button\" id=\"gg-check\" class=\"gg-secondary\">Periksa pemenang tersimpan<\/button><a id=\"gg-dashboard\" target=\"_blank\" rel=\"noopener noreferrer\">Buka dashboard pemenang \u2197<\/a><a id=\"gg-login\" target=\"_blank\" rel=\"noopener noreferrer\">Login admin \u2197<\/a><\/div>\r\n     <div id=\"gg-recovery-list\" class=\"gg-recovery-list\"><\/div>\r\n     <div id=\"gg-retry-area\" hidden>\r\n      <label class=\"gg-check\"><input type=\"checkbox\" id=\"gg-retry-ack\"><span>Saya sudah memeriksa pemenang tersimpan. Saya memahami percobaan ulang dapat menghasilkan undian tambahan jika cache token server hilang.<\/span><\/label>\r\n      <button type=\"button\" id=\"gg-retry\" class=\"gg-secondary\" disabled style=\"margin-top:10px\">Coba ulang dengan token yang sama<\/button>\r\n     <\/div>\r\n     <div id=\"gg-resolve-area\" hidden>\r\n      <label class=\"gg-check\"><input type=\"checkbox\" id=\"gg-resolve-ack\"><span>Saya sudah mencocokkan hasil di dashboard, termasuk sesi lain, memastikan tidak ada permintaan yang masih berjalan, dan menyelesaikan penanganan undian ini.<\/span><\/label>\r\n      <button type=\"button\" id=\"gg-resolve\" class=\"gg-secondary\" disabled style=\"margin-top:10px\">Selesaikan pemulihan<\/button>\r\n     <\/div>\r\n    <\/section>\r\n   <\/main>\r\n   <aside class=\"gg-winners\" aria-labelledby=\"gg-winners-title\">\r\n    <div class=\"gg-winners-head\"><h2 id=\"gg-winners-title\">Pemenang<\/h2><button type=\"button\" id=\"gg-reset\" class=\"gg-link-button\" hidden>Reset List<\/button><\/div>\r\n    <p class=\"gg-small\">Sesi undian saat ini \u00b7 Terbaru di atas<\/p>\r\n    <div id=\"gg-winner-list\" class=\"gg-winner-list\"><p class=\"gg-empty\">Pemenang diumumkan saat live draw.<\/p><\/div>\r\n    <button type=\"button\" id=\"gg-more\" class=\"gg-link-button\" hidden>Tampilkan lebih banyak<\/button>\r\n   <\/aside>\r\n  <\/div>\r\n  <footer class=\"gg-bottom\"><span>BINGXUE \u00b7 GREEN GRAPE SERIES<\/span><span>GOOD LUCK &amp; STAY FRESH.<\/span><\/footer>\r\n <\/div>\r\n <dialog id=\"gg-modal\" aria-labelledby=\"gg-modal-name\">\r\n  <header class=\"gg-modal-heading\"><p>SELAMAT KEPADA PEMENANG!<\/p><h2 id=\"gg-modal-name\"><\/h2><\/header>\r\n  <div class=\"gg-modal-body\">\r\n   <div>\r\n    <div class=\"gg-field\"><span class=\"gg-field-label\">NOMOR STRUK<\/span><p id=\"gg-modal-receipt\" class=\"gg-modal-receipt gg-exact\"><\/p><\/div>\r\n    <div class=\"gg-field\"><span class=\"gg-field-label\">WHATSAPP<\/span><div class=\"gg-wa-row\"><span id=\"gg-wa\"><\/span><button type=\"button\" id=\"gg-copy\" class=\"gg-secondary\">Salin<\/button><\/div><\/div>\r\n    <div class=\"gg-field\"><span class=\"gg-field-label\">PRODUK<\/span><p id=\"gg-products\" class=\"gg-small\"><\/p><\/div>\r\n    <p id=\"gg-won-at\" class=\"gg-small\"><\/p>\r\n   <\/div>\r\n   <div><span class=\"gg-field-label\">FOTO STRUK<\/span><button type=\"button\" id=\"gg-photo-button\" class=\"gg-photo-button\" aria-label=\"Perbesar foto struk\" hidden><img id=\"gg-photo\" alt=\"Foto struk pemenang\" referrerpolicy=\"no-referrer\"><\/button><p id=\"gg-photo-note\" class=\"gg-small\">Foto tidak tersedia.<\/p><\/div>\r\n  <\/div>\r\n  <div class=\"gg-modal-footer\">\r\n   <label for=\"gg-prize\" class=\"gg-field-label\">HADIAH (OPSIONAL)<\/label><input id=\"gg-prize\" class=\"gg-input\" type=\"text\" maxlength=\"200\" placeholder=\"Contoh: Voucher Rp 100.000\" autocomplete=\"off\">\r\n   <p id=\"gg-modal-error\" class=\"gg-modal-error\" role=\"alert\" hidden><\/p>\r\n   <a id=\"gg-modal-login\" class=\"gg-small\" target=\"_blank\" rel=\"noopener noreferrer\" hidden>Login ulang, lalu kembali ke sini \u2197<\/a>\r\n   <div class=\"gg-actions\"><button type=\"button\" id=\"gg-confirm\" class=\"gg-primary\">Konfirmasi<\/button><button type=\"button\" id=\"gg-cancel\" class=\"gg-danger\">Batalkan<\/button><button type=\"button\" id=\"gg-cancel-check\" class=\"gg-secondary\" hidden>Periksa status pembatalan<\/button><button type=\"button\" id=\"gg-detail-close\" class=\"gg-link-button\" hidden>Kembali ke pemulihan<\/button><\/div>\r\n  <\/div>\r\n <\/dialog>\r\n <dialog id=\"gg-lightbox\" class=\"gg-lightbox\" aria-label=\"Foto struk diperbesar\"><button type=\"button\" id=\"gg-lightbox-close\" class=\"gg-secondary\">Tutup foto \u00d7<\/button><img id=\"gg-lightbox-image\" alt=\"Foto struk diperbesar\" referrerpolicy=\"no-referrer\"><\/dialog>\r\n <div id=\"gg-toast\" class=\"gg-toast\" role=\"status\" hidden><\/div>\r\n <noscript>Aktifkan JavaScript untuk membuka undian. Live draw setiap Jumat pukul 19.00 WIB.<\/noscript>\r\n<\/section>\r\n\r\n<script>\r\n(function () {\r\n 'use strict';\r\n const root = document.getElementById('bxgg-slot');\r\n if (!root || root.dataset.initialized) return;\r\n root.dataset.initialized = 'true';\r\n const $ = id => root.querySelector('#gg-' + id);\r\n const API = window.location.origin + '\/wp-json\/swe\/v1';\r\n const AJAX = window.location.origin + '\/wp-admin\/admin-ajax.php';\r\n const PUBLIC_STATUS = 'Live draw setiap Jumat pukul 19.00 WIB';\r\n const INTENT_KEY = 'bxgg-slot-pending-v1'; \/\/ Origin-wide, survives reload; contains no names\/receipts\/phones.\r\n const LOCK_NAME = 'bxgg-slot-draw-v1';\r\n const REQUEST_TIMEOUT = 25000;\r\n const REPLAY_WINDOW = 14 * 60 * 1000; \/\/ Conservatively inside the PHP transient's 15 minutes; NOT a guarantee.\r\n const RETRY_COOLDOWN = 30000;\r\n const MANUAL_RESOLVE_DELAY = 120000;\r\n const DURATION = 6000;\r\n const motion = window.matchMedia('(prefers-reduced-motion: reduce)');\r\n const formatCount = n => new Intl.NumberFormat('id-ID').format(n);\r\n let nonce = '', noncePromise = null, phase = 'loading', admin = false, everAdmin = false;\r\n let segments = [], winners = [], total = 0, snapshotOK = false;\r\n let hiddenWinners = new Set(), visibleLimit = 40;\r\n let pending = null, storageOK = true, currentWinner = null, modalSource = '', cancelUncertain = false;\r\n let animation = null, displayReceipt = null, renderer = null, toastTimer = null;\r\n let recoveryCheckedAt = 0, recoveryCandidates = [], recoveryMessage = '';\r\n let savedOverflow = '', modalReturnFocus = null;\r\n\r\n class RequestError extends Error {\r\n   constructor(message, kind, status, code) { super(message); this.kind=kind; this.status=status||0; this.code=code||''; }\r\n }\r\n const text = (el, value) => { el.textContent = value == null ? '' : String(value); };\r\n const node = (tag, className, value) => { const el=document.createElement(tag); el.className=className||''; if(value!==undefined) text(el,value); return el; };\r\n const fingerprint = w => String(w.id) + '|' + w.won_at;\r\n const nonnegative = n => typeof n === 'number' && Number.isSafeInteger(n) && n >= 0;\r\n function normalizeWinner(w) {\r\n   if (!w || !Number.isSafeInteger(w.id) || w.id<1 || !nonnegative(w.no) || typeof w.no_struk!=='string' || !w.no_struk.length || typeof w.won_at!=='string') {\r\n     throw new RequestError('Data pemenang belum lengkap. Periksa hasil tersimpan sebelum melanjutkan.', 'invalid');\r\n   }\r\n   return {id:w.id,no:w.no,no_struk:w.no_struk,won_at:w.won_at,nama:typeof w.nama==='string'?w.nama:'',\r\n     produk:Array.isArray(w.produk)?w.produk.filter(x=>typeof x==='string'):[],\r\n     foto_struk_url:typeof w.foto_struk_url==='string'?w.foto_struk_url:'',\r\n     no_wa_masked:typeof w.no_wa_masked==='string'?w.no_wa_masked:'',no_wa:typeof w.no_wa==='string'?w.no_wa:'',prize:typeof w.prize==='string'?w.prize:''};\r\n }\r\n function readIntent() {\r\n   try {\r\n     const raw=localStorage.getItem(INTENT_KEY); if(!raw) return null;\r\n     const p=JSON.parse(raw);\r\n     if (!p || p.v!==1 || typeof p.token!=='string' || !\/^[A-Za-z0-9-]{1,64}$\/.test(p.token) || !Number.isFinite(p.createdAt) || !Array.isArray(p.baseline)) return {corrupt:true};\r\n     return p;\r\n   } catch (_) { storageOK=false; return {corrupt:true}; }\r\n }\r\n function persistIntent(p) {\r\n   \/\/ Must succeed BEFORE a draw is sent. Otherwise a reload would forget an ambiguous draw.\r\n   localStorage.setItem(INTENT_KEY,JSON.stringify(p)); pending=p;\r\n }\r\n function clearIntent() {\r\n   const stored=readIntent();\r\n   if (stored && !stored.corrupt && pending && stored.token!==pending.token) throw new Error('Ada undian lain yang perlu diperiksa.');\r\n   localStorage.removeItem(INTENT_KEY); pending=null; recoveryCheckedAt=0;\r\n }\r\n function notify(message) {\r\n   text($('toast'),message); $('toast').hidden=false; clearTimeout(toastTimer);\r\n   toastTimer=setTimeout(()=>{$('toast').hidden=true;},4500);\r\n }\r\n function notice(message) { text($('notice'),message); $('notice').hidden=!message; }\r\n function status(message) { text($('status'),message); }\r\n function setPhase(value) { phase=value; root.dataset.phase=value; updateControls(); }\r\n function updateControls() {\r\n   const idle=phase==='ready' && admin && snapshotOK && !pending && storageOK;\r\n   $('draw').hidden=!admin;\r\n   $('draw').disabled=!idle || total===0;\r\n   text($('draw'), ['preparing','request','animating'].includes(phase)?'Mengundi...':displayReceipt!==null?'UNDI LAGI':'MULAI UNDIAN');\r\n   $('refresh').hidden=!admin;\r\n   $('refresh').disabled=phase!=='ready' && phase!=='error';\r\n   $('reset').hidden=!admin; $('reset').disabled=phase!=='ready' || !!pending;\r\n   $('connect').hidden=!['error','public'].includes(phase) || phase==='public';\r\n   root.classList.toggle('gg-processing',['preparing','request','animating'].includes(phase));\r\n   root.querySelectorAll('.gg-detail').forEach(b=>b.disabled=phase!=='ready');\r\n   const modalBusy=phase!=='modal';\r\n   $('confirm').disabled=modalBusy || cancelUncertain; $('cancel').disabled=modalBusy || cancelUncertain;\r\n   $('prize').disabled=modalBusy || cancelUncertain;\r\n   $('copy').disabled=modalBusy || !currentWinner || !currentWinner.no_wa;\r\n   $('cancel-check').hidden=!cancelUncertain; $('cancel-check').disabled=modalBusy;\r\n   $('detail-close').hidden=modalSource!=='recovery-review'; $('detail-close').disabled=modalBusy || cancelUncertain;\r\n   $('more').disabled=phase!=='ready';\r\n   updateRecoveryControls();\r\n }\r\n async function fetchJSON(url, init) {\r\n   const controller=new AbortController(); const timeout=setTimeout(()=>controller.abort(),REQUEST_TIMEOUT);\r\n   try {\r\n     const response=await fetch(url,{...init,signal:controller.signal,credentials:'same-origin',cache:'no-store'});\r\n     let data; try { data=await response.json(); } catch (_) { data=null; }\r\n     return {response,data};\r\n   } catch (e) {\r\n     throw new RequestError(e.name==='AbortError'?'Server belum menjawab. Hasil mungkin sudah tersimpan.':'Koneksi terputus. Hasil mungkin sudah tersimpan.','network');\r\n   } finally { clearTimeout(timeout); }\r\n }\r\n async function getNonce(force) {\r\n   if(nonce && !force) return nonce;\r\n   if(noncePromise) return noncePromise;\r\n   if(force) nonce='';\r\n   noncePromise=(async()=>{\r\n     const {response:r,data:d}=await fetchJSON(AJAX,{method:'POST',body:new URLSearchParams({action:'bxgg_spin_nonce'})});\r\n     if(d && d.success===true && typeof d.nonce==='string' && d.nonce && r.ok) { nonce=d.nonce; admin=true; everAdmin=true; return nonce; }\r\n     if(r.status===401 || r.status===403 || d===0 || d===-1) { nonce=''; admin=false; throw new RequestError('Sesi admin berakhir atau akses ditolak. Login ulang, lalu kembali ke halaman ini.','auth',r.status); }\r\n     throw new RequestError('Gagal mendapatkan akses undian. Periksa koneksi dan keaktifan ketiga snippet PHP.','http',r.status);\r\n   })();\r\n   try { return await noncePromise; } finally { noncePromise=null; }\r\n }\r\n async function api(path, body, beforeSend) {\r\n   for(let attempt=0;attempt<2;attempt++) {\r\n     const token=await getNonce(false);\r\n     const init={method:body===undefined?'GET':'POST',headers:{'X-WP-Nonce':token}};\r\n     if(body!==undefined) { init.headers['Content-Type']='application\/json'; init.body=JSON.stringify(body); }\r\n     if(beforeSend) beforeSend();\r\n     const {response:r,data:d}=await fetchJSON(API+path,init);\r\n     if(r.status===401 || r.status===403) {\r\n       nonce='';\r\n       if(attempt===0) { await getNonce(true); continue; }\r\n       admin=false; throw new RequestError('Akses ditolak. Login admin kembali, lalu ulangi tindakan ini.','auth',r.status);\r\n     }\r\n     if(!d || typeof d!=='object' || typeof d.success!=='boolean') throw new RequestError('Respons server tidak dapat dibaca (HTTP '+r.status+').','invalid',r.status);\r\n     if(!r.ok || !d.success) throw new RequestError(typeof d.message==='string'?d.message:'Permintaan belum berhasil.','http',r.status,typeof d.code==='string'?d.code:'');\r\n     return d;\r\n   }\r\n }\r\n async function syncAll() {\r\n   snapshotOK=false;\r\n   \/\/ Do not publish a half-loaded snapshot, and consume both failures.\r\n   const results=await Promise.allSettled([api('\/pool'),api('\/winners')]);\r\n   const failed=results.find(r=>r.status==='rejected'); if(failed) throw failed.reason;\r\n   const p=results[0].value, list=results[1].value;\r\n   if(!nonnegative(p.total) || !Array.isArray(p.segments) || !Array.isArray(list.winners)) throw new RequestError('Data undian dari server tidak lengkap.','invalid');\r\n   const nextSegments=p.segments.map(s=>{\r\n     if(!s || !Number.isSafeInteger(s.id) || typeof s.no_struk!=='string') throw new RequestError('Data nomor struk tidak valid.','invalid');\r\n     return {id:s.id,no_struk:s.no_struk};\r\n   });\r\n   const nextWinners=list.winners.map(normalizeWinner).sort((a,b)=>b.no-a.no || b.id-a.id);\r\n   segments=nextSegments; total=p.total; winners=nextWinners; snapshotOK=true; admin=true;\r\n   text($('count'),formatCount(total)+' struk siap diundi'); $('count').title=typeof p.info==='string'?p.info:'';\r\n   renderWinners();\r\n }\r\n function renderWinners() {\r\n   const list=$('winner-list'); list.replaceChildren();\r\n   const visible=winners.filter(w=>!hiddenWinners.has(fingerprint(w)));\r\n   if(!visible.length) list.append(node('p','gg-empty',!admin?'Pemenang diumumkan saat live draw.':hiddenWinners.size?'Daftar disembunyikan di halaman ini. Muat ulang halaman untuk menampilkannya.':'Belum ada pemenang di sesi ini.'));\r\n   const fragment=document.createDocumentFragment();\r\n   visible.slice(0,visibleLimit).forEach(w=>{\r\n     const row=node('div','gg-winner-row'), body=node('div');\r\n     row.append(node('span','gg-no','#'+w.no),body);\r\n     body.append(node('p','gg-row-receipt gg-exact',w.no_struk),node('p','gg-row-name',w.nama));\r\n     if(w.prize) body.append(node('p','gg-row-prize',w.prize));\r\n     const bottom=node('div','gg-row-bottom'), button=node('button','gg-secondary gg-detail','Detail');\r\n     button.type='button'; button.disabled=phase!=='ready'; button.addEventListener('click',()=>showDetail(w.id));\r\n     bottom.append(node('span','gg-small','Undian #'+w.no),button); body.append(bottom); fragment.append(row);\r\n   });\r\n   list.append(fragment); $('more').hidden=visible.length<=visibleLimit;\r\n }\r\n function publicMode() {\r\n   admin=false; nonce=''; winners=[]; segments=[]; total=0; snapshotOK=false; currentWinner=null;\r\n   displayReceipt=null; $('result').hidden=true; text($('result-receipt'),'');\r\n   text($('count'),'GREEN GRAPE SERIES'); $('count').removeAttribute('title');\r\n   renderDisplay(null,true); renderWinners(); $('recovery').hidden=true; notice('');\r\n   status(PUBLIC_STATUS); setPhase('public');\r\n }\r\n function showReady() {\r\n   if(pending) { enterRecovery('Undian sebelumnya belum selesai ditinjau. Periksa hasil tersimpan.'); return; }\r\n   setPhase('ready'); status(total? 'Siap untuk momen keberuntungan berikutnya.':'Belum ada struk siap diundi. Setujui struk di dashboard lalu perbarui data.');\r\n   if(!storageOK) { setPhase('error'); notice('Penyimpanan browser tidak tersedia. Izinkan penyimpanan situs lalu muat ulang agar hasil undian dapat dipulihkan setelah koneksi terputus.'); }\r\n }\r\n async function connect() {\r\n   if(!['loading','error','public','ready'].includes(phase) || $('modal').open) return;\r\n   setPhase('loading'); notice(''); status('Memuat data undian...');\r\n   try { await getNonce(true); await syncAll(); pending=readIntent(); if(pending) enterRecovery('Ada undian sebelumnya yang perlu diperiksa sebelum mengundi lagi.'); else showReady(); }\r\n   catch(e) {\r\n     if(e.kind==='auth' && !everAdmin) publicMode();\r\n     else if(pending) enterRecovery(e.message);\r\n     else { setPhase('error'); status('Data belum siap.'); notice(e.message); }\r\n   }\r\n }\r\n\r\n \/\/ Animation only: bounded five cells per reel, independent of pool size.\r\n \/\/ Decorative characters\/sample receipts NEVER determine the selected winner.\r\n function splitCharacters(value) {\r\n   return typeof Intl.Segmenter==='function'?Array.from(new Intl.Segmenter('id',{granularity:'grapheme'}).segment(value),x=>x.segment):Array.from(value);\r\n }\r\n function renderDisplay(value, settled) {\r\n   const stage=$('stage'); stage.replaceChildren();\r\n   const capacity=Math.max(4,Math.min(12,Math.floor(stage.clientWidth\/52)));\r\n   const chars=value===null?Array(Math.min(6,capacity)).fill('\u2014'):splitCharacters(value);\r\n   const wide=chars.length>capacity || chars.some(c=>c.length>2 || \/\\s\/.test(c));\r\n   stage.classList.toggle('gg-wide',wide);\r\n   if(wide && settled) { stage.append(node('div','gg-wide-final gg-exact',value)); renderer=null; return; }\r\n   const reelBox=node('div','gg-reels'); reelBox.style.gridTemplateColumns=wide?'1fr':'repeat('+chars.length+',minmax(0,1fr))';\r\n   const targets=wide?[value]:chars;\r\n   const samples=[];\r\n   for(let i=0,n=Math.min(24,segments.length);i<n;i++) samples.push(segments[Math.floor(i*segments.length\/n)].no_struk);\r\n   const reels=targets.map((target,i)=>{\r\n     const reel=node('div','gg-reel'), track=node('div','gg-track'), cells=Array.from({length:5},()=>node('div','gg-cell'));\r\n     track.append(...cells); reel.append(track); reelBox.append(reel);\r\n     return {target,track,cells,index:-999,steps:wide?52:46+i*2,duration:targets.length===1?DURATION:4700+i\/(targets.length-1)*1300};\r\n   });\r\n   stage.append(reelBox,node('div','gg-selection'));\r\n   renderer={reels,wide,samples,placeholder:value===null};\r\n   paintReels(settled?DURATION:0,settled);\r\n }\r\n function paintReels(elapsed, force) {\r\n   if(!renderer) return;\r\n   const alphabet='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';\r\n   renderer.reels.forEach((r,i)=>{\r\n     const progress=force?1:Math.min(1,Math.max(0,elapsed\/r.duration));\r\n     const position=r.steps*(1-Math.pow(1-progress,4));\r\n     const index=Math.floor(position), fraction=position-index;\r\n     if(index!==r.index) {\r\n       r.cells.forEach((cell,k)=>{\r\n         const step=index+k-1;\r\n         let value;\r\n         if(step===r.steps) value=r.target;\r\n         else if(renderer.placeholder) value='\u2014';\r\n         else if(renderer.wide) value=renderer.samples.length?renderer.samples[((step%renderer.samples.length)+renderer.samples.length)%renderer.samples.length]:'\u2022\u2022\u2022';\r\n         else value=alphabet[((step*7+i*11)%alphabet.length+alphabet.length)%alphabet.length];\r\n         text(cell,value);\r\n       });\r\n       r.index=index;\r\n     }\r\n     r.track.style.transform='translateY('+(-fraction*20)+'%)';\r\n   });\r\n }\r\n function animateReceipt(value) {\r\n   if(motion.matches) { renderDisplay(value,true); return Promise.resolve(); }\r\n   return new Promise(resolve=>{\r\n     let done=false, raf=0, watchdog=0;\r\n     const start=performance.now();\r\n     const finish=()=>{\r\n       if(done) return; done=true; cancelAnimationFrame(raf); clearTimeout(watchdog); animation=null;\r\n       \/\/ Rendering failure cannot turn into another \/draw request.\r\n       try { renderDisplay(value,true); } catch(_) { $('stage').replaceChildren(node('div','gg-wide-final gg-exact',value)); }\r\n       resolve();\r\n     };\r\n     animation={start,value,finish};\r\n     const tick=now=>{\r\n       if(done) return;\r\n       try { const elapsed=now-start; if(elapsed>=DURATION || motion.matches) { finish(); return; } paintReels(elapsed,false); raf=requestAnimationFrame(tick); }\r\n       catch(_) { finish(); }\r\n     };\r\n     try { renderDisplay(value,false); raf=requestAnimationFrame(tick); watchdog=setTimeout(finish,DURATION+250); }\r\n     catch(_) { finish(); }\r\n   });\r\n }\r\n function showExact(w) {\r\n   displayReceipt=w.no_struk; renderDisplay(w.no_struk,true);\r\n   text($('result-receipt'),w.no_struk); $('result').hidden=false;\r\n }\r\n function makeToken() {\r\n   if(crypto.randomUUID) return crypto.randomUUID();\r\n   const bytes=new Uint8Array(24); crypto.getRandomValues(bytes);\r\n   return Array.from(bytes,n=>n.toString(16).padStart(2,'0')).join('');\r\n }\r\n async function withDrawLock(work) {\r\n   if(navigator.locks && navigator.locks.request) {\r\n     return navigator.locks.request(LOCK_NAME,{ifAvailable:true},async lock=>{\r\n       if(!lock) { pending=readIntent(); if(pending) enterRecovery('Undian sedang ditangani di tab lain. Tunggu operator menyelesaikannya.'); else { setPhase('error'); notice('Tab lain sedang memulai undian. Kembali ke tab tersebut atau perbarui data.'); } return; }\r\n       await work();\r\n     });\r\n   }\r\n   return work(); \/\/ Storage remains a recovery marker; it is NOT an atomic cross-device lock.\r\n }\r\n async function startDraw() {\r\n   if(phase!=='ready' || !admin || !snapshotOK || pending || !storageOK || total<1) return;\r\n   setPhase('preparing'); status('Menyiapkan undian...'); notice('');\r\n   try {\r\n     await withDrawLock(async()=>{\r\n       pending=readIntent(); if(pending) { enterRecovery('Ada undian sebelumnya yang belum selesai.'); return; }\r\n       await syncAll(); \/\/ Fresh baseline; no new token is created if these read-only requests fail.\r\n       if(total===0) { showReady(); return; }\r\n       const p={v:1,token:makeToken(),createdAt:Date.now(),lastSentAt:0,sentCount:0,baseline:winners.map(fingerprint),stage:'prepared'};\r\n       try { persistIntent(p); } catch(_) { storageOK=false; throw new Error('Penyimpanan browser gagal. Undian belum dikirim. Izinkan penyimpanan situs lalu muat ulang.'); }\r\n       await requestDraw(false);\r\n     });\r\n   } catch(e) { if(pending) enterRecovery(e.message); else { setPhase('error'); notice(e.message); status('Undian belum dimulai.'); } }\r\n }\r\n async function requestDraw(isRecovery) {\r\n   const p=pending; if(!p || p.corrupt) return;\r\n   let sent=false;\r\n   setPhase('request'); status('Mengundi... Menunggu hasil dari server.'); $('recovery').hidden=true;\r\n   try {\r\n     const d=await api('\/draw',{token:p.token},()=>{\r\n       if(Date.now()-p.createdAt>=REPLAY_WINDOW || Date.now()<p.createdAt) throw new RequestError('Batas percobaan ulang berakhir. Periksa hasil melalui dashboard.','expired');\r\n       p.lastSentAt=Date.now(); p.sentCount++; p.stage='sent'; persistIntent(p); sent=true;\r\n     });\r\n     const w=normalizeWinner(d.winner);\r\n     p.stage='saved'; p.winnerId=w.id; p.winnerStamp=fingerprint(w);\r\n     try { persistIntent(p); } catch(_) { pending=p; notice('Hasil sudah diterima, tetapi penanda pemulihan browser gagal diperbarui. Selesaikan pemenang ini sebelum menutup halaman.'); }\r\n     if(nonnegative(d.remaining)) { total=d.remaining; text($('count'),formatCount(total)+' struk siap diundi'); }\r\n     setPhase('animating'); status('Mengundi...'); $('result').hidden=true;\r\n     try { await animateReceipt(w.no_struk); } catch(_) { \/* Reveal the committed winner below. *\/ }\r\n     showExact(w);\r\n     winners=winners.filter(x=>x.id!==w.id); winners.unshift(w); hiddenWinners.delete(fingerprint(w)); renderWinners();\r\n     status(d.replay?'Hasil undian sebelumnya berhasil dipulihkan.':'Pemenang terpilih. Selamat!');\r\n     openModal(w,'draw');\r\n     setPhase('sync-modal');\r\n     \/\/ Synchronize while the modal stays locked; never overwrite its typed prize.\r\n     try { await syncAll(); renderWinners(); } catch(e) { notice('Pemenang sudah diterima. Sinkronisasi data belum berhasil: '+e.message); }\r\n     setPhase('modal');\r\n   } catch(e) {\r\n     \/\/ pool_empty is definitive only for the FIRST attempt, never after an ambiguous request.\r\n     if((!sent || e.code==='pool_empty') && !isRecovery && p.sentCount<=1) {\r\n       try { clearIntent(); } catch(_) { enterRecovery(e.message); return; }\r\n       if(e.code==='pool_empty') { total=0; segments=[]; text($('count'),'0 struk siap diundi'); }\r\n       setPhase('error'); notice(e.message); status('Undian belum menghasilkan pemenang. Perbarui data untuk melanjutkan.');\r\n     } else {\r\n       enterRecovery(e.code==='busy'?'Permintaan sebelumnya masih diproses. Jangan mulai undian baru.':e.message);\r\n     }\r\n   }\r\n }\r\n\r\n \/\/ Recovery never automatically sends \/draw. Same-token retries require a recent\r\n \/\/ read-only check and operator acknowledgement; an expired\/evicted transient can\r\n \/\/ otherwise draw again. No client can prove token-to-winner mapping via these APIs.\r\n function enterRecovery(message) {\r\n   recoveryMessage=message || 'Hasil undian perlu dipastikan.';\r\n   recoveryCheckedAt=0; recoveryCandidates=[]; $('retry-ack').checked=false; $('resolve-ack').checked=false;\r\n   $('recovery-list').replaceChildren(); $('recovery').hidden=false;\r\n   text($('recovery-message'),recoveryMessage+' Undian baru tetap dikunci sampai pemulihan selesai.');\r\n   setPhase('recovery'); status('Periksa undian sebelumnya.'); updateRecoveryControls();\r\n }\r\n function updateRecoveryControls() {\r\n   const p=pending, idle=phase==='recovery', fresh=recoveryCheckedAt && Date.now()-recoveryCheckedAt<60000;\r\n   const age=p&&!p.corrupt?Date.now()-p.createdAt:Infinity;\r\n   const since=p&&!p.corrupt?Date.now()-(p.lastSentAt||p.createdAt):Infinity;\r\n   const canRetry=!!(p && !p.corrupt && !p.winnerId && fresh && !recoveryCandidates.length && age>=0 && age<REPLAY_WINDOW);\r\n   $('check').disabled=!idle;\r\n   $('retry-area').hidden=!canRetry;\r\n   $('retry').disabled=!idle || !canRetry || since<RETRY_COOLDOWN || !$('retry-ack').checked;\r\n   $('resolve-area').hidden=!fresh;\r\n   $('resolve').disabled=!idle || !fresh || since<MANUAL_RESOLVE_DELAY || !$('resolve-ack').checked;\r\n   if(!p) return;\r\n   const expired=age>=REPLAY_WINDOW || age<0;\r\n   text($('recovery-meta'),p.corrupt?'Penanda undian tidak dapat dibaca. Cocokkan hasil di dashboard.':\r\n     'Permintaan: '+new Date(p.createdAt).toLocaleString('id-ID',{timeZone:'Asia\/Jakarta'})+' WIB. '+\r\n     (p.winnerId?'Pemenang sudah pernah diterima dari server.':expired?'Percobaan ulang token dinonaktifkan karena sudah terlalu lama.':'Token lama dipertahankan. Cache server dapat hilang sebelum masa berlakunya habis.')+\r\n     (fresh && since<MANUAL_RESOLVE_DELAY?' Penutupan manual tersedia setelah jeda pemeriksaan 2 menit.':''));\r\n   root.querySelectorAll('.gg-recovery-detail').forEach(b=>b.disabled=!idle);\r\n }\r\n async function checkRecovery() {\r\n   if(phase!=='recovery' || !pending) return;\r\n   $('retry-ack').checked=false; $('resolve-ack').checked=false;\r\n   setPhase('checking');\r\n   try {\r\n     await getNonce(true); await syncAll();\r\n     recoveryCheckedAt=Date.now();\r\n     const p=pending;\r\n     const exact=p.winnerId?winners.find(w=>w.id===p.winnerId && fingerprint(w)===p.winnerStamp):null;\r\n     if(exact) { showExact(exact); openModal(exact,'recovery-known'); return; }\r\n     recoveryCandidates=p.corrupt?winners:winners.filter(w=>!p.baseline.includes(fingerprint(w)));\r\n     const list=$('recovery-list'); list.replaceChildren();\r\n     if(!recoveryCandidates.length) list.append(node('p','gg-small','Belum ada hasil baru di sesi ini. Ini bukan bukti bahwa permintaan tidak tersimpan. Periksa juga dashboard, terutama bila sesi undian berganti.'));\r\n     else {\r\n       list.append(node('p','gg-small','Hasil tersimpan sejak pemeriksaan awal. Cocokkan dengan dashboard; daftar ini tidak membuktikan hubungan hasil dengan token.'));\r\n       recoveryCandidates.forEach(w=>{\r\n         const row=node('div','gg-recovery-item'), label=node('span','gg-exact','#'+w.no+' \u00b7 '+w.no_struk), b=node('button','gg-secondary gg-recovery-detail','Tinjau');\r\n         b.type='button'; b.addEventListener('click',()=>{if(phase==='recovery') openModal(w,'recovery-review');});\r\n         row.append(label,b); list.append(row);\r\n       });\r\n     }\r\n     setPhase('recovery'); updateRecoveryControls();\r\n   } catch(e) { setPhase('recovery'); text($('recovery-message'),e.message+' Undian baru tetap dikunci.'); }\r\n }\r\n async function retryDraw() {\r\n   updateRecoveryControls(); if($('retry').disabled) return;\r\n   const token=pending.token; setPhase('checking');\r\n   try {\r\n     await withDrawLock(async()=>{\r\n       const stored=readIntent();\r\n       if(!stored || stored.token!==token) { pending=stored; if(pending) enterRecovery('Status undian berubah di tab lain. Periksa lagi.'); else { await syncAll(); showReady(); } return; }\r\n       pending=stored;\r\n       await syncAll(); \/\/ A winner may have appeared since the operator checked.\r\n       const newWinners=winners.filter(w=>!pending.baseline.includes(fingerprint(w)));\r\n       if(newWinners.length || pending.winnerId || Date.now()-pending.createdAt>=REPLAY_WINDOW) { enterRecovery('Hasil atau masa percobaan ulang berubah. Periksa pemenang tersimpan kembali.'); return; }\r\n       $('retry-ack').checked=false; await requestDraw(true);\r\n     });\r\n   } catch(e) { enterRecovery(e.message); }\r\n }\r\n async function resolveRecovery() {\r\n   updateRecoveryControls(); if($('resolve').disabled) return;\r\n   setPhase('checking');\r\n   try {\r\n     await syncAll();\r\n     const updated=pending.corrupt?winners:winners.filter(w=>!pending.baseline.includes(fingerprint(w)));\r\n     if(updated.map(fingerprint).join('\\n')!==recoveryCandidates.map(fingerprint).join('\\n')) { enterRecovery('Daftar pemenang berubah. Tinjau hasil terbaru sebelum menyelesaikan pemulihan.'); return; }\r\n     clearIntent(); $('recovery').hidden=true; notice('Pemulihan diselesaikan sesuai pemeriksaan operator.'); showReady();\r\n   } catch(e) { enterRecovery(e.message); }\r\n }\r\n\r\n function safePhotoURL(value) {\r\n   try { const url=new URL(value,window.location.origin); return value && ['https:','http:'].includes(url.protocol)?url.href:''; } catch(_) { return ''; }\r\n }\r\n function openModal(w,source) {\r\n   currentWinner=w; modalSource=source; cancelUncertain=false;\r\n   text($('modal-name'),w.nama||'Pemenang'); text($('modal-receipt'),w.no_struk);\r\n   \/\/ Never fall back to displaying the unmasked number, even if masked data is missing.\r\n   text($('wa'),w.no_wa_masked && w.no_wa_masked.includes('*')?w.no_wa_masked:'\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022');\r\n   text($('products'),w.produk.join(', ')||'\u2014'); text($('won-at'),'Undian #'+w.no+' \u00b7 '+w.won_at);\r\n   $('prize').value=w.prize; $('modal-error').hidden=true; $('modal-login').hidden=true;\r\n   const photo=safePhotoURL(w.foto_struk_url);\r\n   $('photo').removeAttribute('src'); $('photo-button').hidden=!photo; text($('photo-note'),photo?'Klik foto untuk memperbesar.':'Foto tidak tersedia.');\r\n   if(photo) $('photo').src=photo;\r\n   setPhase('modal');\r\n   if(!$('modal').open) {\r\n     modalReturnFocus=document.activeElement; savedOverflow=document.documentElement.style.overflow;\r\n     $('modal').showModal(); document.documentElement.style.overflow='hidden'; $('confirm').focus();\r\n   }\r\n }\r\n function closeModal() {\r\n   if($('lightbox').open) $('lightbox').close();\r\n   $('modal').close(); document.documentElement.style.overflow=savedOverflow;\r\n   currentWinner=null; cancelUncertain=false; $('photo').removeAttribute('src'); $('lightbox-image').removeAttribute('src');\r\n   text($('wa'),''); $('prize').value='';\r\n   if(modalReturnFocus && modalReturnFocus.isConnected) modalReturnFocus.focus();\r\n }\r\n function modalError(e) { text($('modal-error'),e.message||String(e)); $('modal-error').hidden=false; $('modal-login').hidden=e.kind!=='auth'; }\r\n async function showDetail(id) {\r\n   if(phase!=='ready' || pending) return;\r\n   setPhase('details');\r\n   try { await syncAll(); const w=winners.find(x=>x.id===id); if(w) openModal(w,'detail'); else { showReady(); notify('Pemenang sudah berubah atau sesi berganti.'); } }\r\n   catch(e) { setPhase('error'); notice(e.message); }\r\n }\r\n function isPendingWinner(w) { return pending && pending.winnerId===w.id && pending.winnerStamp===fingerprint(w); }\r\n async function finishModalAction(w,cancelled) {\r\n   \/\/ Keep the marker until a known winner has been confirmed\/cancelled. Reviewing\r\n   \/\/ a candidate does not silently associate it with an ambiguous token.\r\n   if(isPendingWinner(w)) clearIntent();\r\n   if(cancelled && displayReceipt===w.no_struk) { displayReceipt=null; $('result').hidden=true; renderDisplay(null,true); }\r\n   closeModal(); setPhase('sync');\r\n   try { await syncAll(); notice(''); if(pending) enterRecovery('Detail ditinjau. Cocokkan hasil, lalu selesaikan pemulihan.'); else { $('recovery').hidden=true; showReady(); } }\r\n   catch(e) { if(pending) enterRecovery(e.message); else { setPhase('error'); notice('Tindakan tersimpan. Data perlu diperbarui sebelum undian berikutnya: '+e.message); } }\r\n }\r\n async function confirmPrize() {\r\n   if(phase!=='modal' || !currentWinner || cancelUncertain) return;\r\n   const w=currentWinner, typed=$('prize').value;\r\n   setPhase('saving'); $('modal-error').hidden=true;\r\n   try {\r\n     const d=await api('\/prize',{id:w.id,prize:typed});\r\n     if(typeof d.prize!=='string') throw new RequestError('Jawaban penyimpanan hadiah belum lengkap. Periksa koneksi, lalu Konfirmasi lagi.','invalid');\r\n     w.prize=d.prize;\r\n     await finishModalAction(w,false); notify('Hadiah berhasil disimpan.');\r\n   } catch(e) {\r\n     \/\/ Leave the exact draft untouched on every error, including expired sessions.\r\n     $('prize').value=typed; setPhase('modal'); modalError(e);\r\n   }\r\n }\r\n async function cancelWinner() {\r\n   if(phase!=='modal' || !currentWinner || cancelUncertain) return;\r\n   const w=currentWinner; setPhase('canceling'); $('modal-error').hidden=true;\r\n   try { await api('\/cancel',{id:w.id}); await finishModalAction(w,true); notify('Kemenangan dibatalkan. Struk kembali ke daftar undian.'); }\r\n   catch(e) {\r\n     cancelUncertain=e.kind!=='auth'; setPhase('modal');\r\n     modalError(new RequestError(e.message+(cancelUncertain?' Periksa status pembatalan sebelum mencoba lagi.':''),e.kind));\r\n   }\r\n }\r\n async function checkCancellation() {\r\n   if(phase!=='modal' || !currentWinner || !cancelUncertain) return;\r\n   const w=currentWinner; setPhase('checking-cancel');\r\n   try {\r\n     await syncAll();\r\n     const still=winners.find(x=>x.id===w.id);\r\n     if(!still && segments.some(s=>s.id===w.id)) { await finishModalAction(w,true); notify('Pembatalan sudah tersimpan.'); return; }\r\n     if(still && fingerprint(still)===fingerprint(w)) {\r\n       cancelUncertain=false; setPhase('modal'); modalError('Pemenang masih tercatat. Pembatalan belum terlihat; Anda dapat mencoba Batalkan lagi.');\r\n     } else {\r\n       setPhase('modal'); modalError('Status entri atau sesi sudah berubah. Cocokkan di dashboard. Setelah selesai, muat ulang dan periksa hasil tersimpan.');\r\n     }\r\n   } catch(e) { setPhase('modal'); modalError(e); }\r\n }\r\n async function copyWA() {\r\n   if(phase!=='modal' || !currentWinner || !currentWinner.no_wa) return;\r\n   const full=currentWinner.no_wa;\r\n   try {\r\n     if(navigator.clipboard && window.isSecureContext) await navigator.clipboard.writeText(full);\r\n     else throw new Error('fallback');\r\n   } catch(_) {\r\n     const input=node('textarea','gg-sr'); input.value=full; input.setAttribute('readonly',''); input.setAttribute('aria-hidden','true'); $('modal').append(input);\r\n     input.select(); let copied=false; try { copied=document.execCommand('copy'); } catch(_) { \/* Keep the number invisible. *\/ }\r\n     input.remove(); $('copy').focus(); if(!copied) { text($('modal-error'),'Gagal menyalin. Izinkan akses clipboard browser.'); $('modal-error').hidden=false; return; }\r\n   }\r\n   text($('copy'),'Tersalin'); setTimeout(()=>text($('copy'),'Salin'),1600);\r\n }\r\n\r\n $('draw').addEventListener('click',startDraw);\r\n $('refresh').addEventListener('click',connect); $('connect').addEventListener('click',connect);\r\n $('check').addEventListener('click',checkRecovery); $('retry').addEventListener('click',retryDraw); $('resolve').addEventListener('click',resolveRecovery);\r\n $('retry-ack').addEventListener('change',updateRecoveryControls); $('resolve-ack').addEventListener('change',updateRecoveryControls);\r\n $('confirm').addEventListener('click',confirmPrize); $('cancel').addEventListener('click',cancelWinner); $('cancel-check').addEventListener('click',checkCancellation); $('copy').addEventListener('click',copyWA);\r\n $('detail-close').addEventListener('click',()=>{if(phase==='modal' && modalSource==='recovery-review' && !cancelUncertain) {closeModal(); setPhase('recovery');}});\r\n $('modal').addEventListener('cancel',event=>event.preventDefault()); \/\/ No accidental dismissal \/ second draw.\r\n $('photo-button').addEventListener('click',()=>{if(currentWinner) { const src=safePhotoURL(currentWinner.foto_struk_url); if(src) {$('lightbox-image').src=src; $('lightbox').showModal();} }});\r\n $('lightbox-close').addEventListener('click',()=>$('lightbox').close());\r\n $('lightbox').addEventListener('click',e=>{if(e.target===$('lightbox')) $('lightbox').close();});\r\n $('photo').addEventListener('error',()=>{$('photo-button').hidden=true; text($('photo-note'),'Foto gagal dimuat. Periksa di dashboard.');});\r\n $('reset').addEventListener('click',()=>{\r\n   if(phase!=='ready' || pending || !admin) return;\r\n   winners.forEach(w=>hiddenWinners.add(fingerprint(w))); renderWinners();\r\n   notify('List disembunyikan di halaman ini. Data pemenang dan status struk tetap tersimpan.');\r\n });\r\n $('more').addEventListener('click',()=>{if(phase==='ready') {visibleLimit+=40; renderWinners();}});\r\n const loginURL=window.location.origin+'\/wp-login.php?redirect_to='+encodeURIComponent(window.location.href);\r\n $('login').href=loginURL; $('modal-login').href=loginURL;\r\n $('dashboard').href=window.location.origin+'\/wp-admin\/admin.php?page=bxgg-winners';\r\n const logo=$('logo'), fallback=$('brand-fallback');\r\n const showLogo=()=>{logo.hidden=!logo.naturalWidth; fallback.hidden=!!logo.naturalWidth;};\r\n logo.addEventListener('load',showLogo); logo.addEventListener('error',showLogo); if(logo.complete) showLogo();\r\n let resizeRAF=0;\r\n const resize=()=>{\r\n   cancelAnimationFrame(resizeRAF); resizeRAF=requestAnimationFrame(()=>{\r\n     if(animation) { const a=animation; try { renderDisplay(a.value,false); paintReels(performance.now()-a.start,false); } catch(_) {a.finish();} }\r\n     else renderDisplay(displayReceipt,true);\r\n   });\r\n };\r\n if(typeof ResizeObserver==='function') {\r\n   let width=0; new ResizeObserver(entries=>{const next=entries[0].contentRect.width; if(Math.abs(next-width)>1) {width=next; resize();}}).observe($('stage'));\r\n } else window.addEventListener('resize',resize);\r\n document.addEventListener('visibilitychange',()=>{if(!document.hidden && animation && performance.now()-animation.start>=DURATION) animation.finish();});\r\n const motionChanged=()=>{if(animation && motion.matches) animation.finish();};\r\n if(motion.addEventListener) motion.addEventListener('change',motionChanged);\r\n window.addEventListener('storage',e=>{\r\n   if(e.key!==INTENT_KEY || !everAdmin) return;\r\n   if(['request','animating','modal','saving','canceling','checking-cancel','preparing'].includes(phase)) return;\r\n   pending=readIntent();\r\n   if(pending) enterRecovery('Status undian berubah di tab lain. Gunakan satu tab operator untuk melanjutkan.');\r\n   else { setPhase('error'); notice('Undian di tab lain sudah ditangani. Perbarui data sebelum melanjutkan.'); }\r\n });\r\n window.addEventListener('beforeunload',e=>{if(everAdmin && (pending || $('modal').open)) {e.preventDefault(); e.returnValue='';}});\r\n \/\/ Small UI timer only; no polling and no background draw requests.\r\n setInterval(()=>{if(phase==='recovery') updateRecoveryControls();},1000);\r\n try { localStorage.setItem(INTENT_KEY+'-check','1'); localStorage.removeItem(INTENT_KEY+'-check'); pending=readIntent(); }\r\n catch(_) {storageOK=false;}\r\n renderDisplay(null,true); connect();\r\n})();\r\n<\/script>\r\n\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>","protected":false},"excerpt":{"rendered":"<p>BINGXUEGREEN GRAPE SERIES FRIDAY LIVE DRAW Live draw setiap Jumat pukul 19.00 WIB New product launch \u00b7 Lucky receipt Green Grape Giveaway. Segarnya dapat.Siapa yang bawa pulang hadiah? NOMOR STRUKGREEN GRAPE SERIES A FRESH SIP. A LUCKY MOMENT. MULAI UNDIAN Memuat undian&#8230; Perbarui data Coba hubungkan kembali SELAMAT KEPADA PEMENANG! Periksa hasil undian sebelumnya Undian [&hellip;]<\/p>","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-9472","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Slot Machine 2 - Bingxue<\/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:\/\/bingxueindonesia.co.id\/en\/slot-machine-2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Slot Machine 2 - Bingxue\" \/>\n<meta property=\"og:description\" content=\"BINGXUEGREEN GRAPE SERIES FRIDAY LIVE DRAW Live draw setiap Jumat pukul 19.00 WIB New product launch \u00b7 Lucky receipt Green Grape Giveaway. Segarnya dapat.Siapa yang bawa pulang hadiah? NOMOR STRUKGREEN GRAPE SERIES A FRESH SIP. A LUCKY MOMENT. MULAI UNDIAN Memuat undian&#8230; Perbarui data Coba hubungkan kembali SELAMAT KEPADA PEMENANG! Periksa hasil undian sebelumnya Undian [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/bingxueindonesia.co.id\/en\/slot-machine-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Bingxue\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/bingxueindonesia\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-02T03:15:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/bingxueindonesia.co.id\/wp-content\/uploads\/2026\/09\/Asset-1.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:\/\/bingxueindonesia.co.id\/slot-machine-2\/\",\"url\":\"https:\/\/bingxueindonesia.co.id\/slot-machine-2\/\",\"name\":\"Slot Machine 2 - Bingxue\",\"isPartOf\":{\"@id\":\"https:\/\/bingxueindonesia.co.id\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/bingxueindonesia.co.id\/slot-machine-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/bingxueindonesia.co.id\/slot-machine-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/bingxueindonesia.co.id\/wp-content\/uploads\/2026\/09\/Asset-1.png\",\"datePublished\":\"2026-10-02T03:14:47+00:00\",\"dateModified\":\"2026-10-02T03:15:14+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/bingxueindonesia.co.id\/slot-machine-2\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/bingxueindonesia.co.id\/slot-machine-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/bingxueindonesia.co.id\/slot-machine-2\/#primaryimage\",\"url\":\"https:\/\/bingxueindonesia.co.id\/wp-content\/uploads\/2026\/09\/Asset-1.png\",\"contentUrl\":\"https:\/\/bingxueindonesia.co.id\/wp-content\/uploads\/2026\/09\/Asset-1.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/bingxueindonesia.co.id\/slot-machine-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/bingxueindonesia.co.id\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Slot Machine 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/bingxueindonesia.co.id\/#website\",\"url\":\"https:\/\/bingxueindonesia.co.id\/\",\"name\":\"Bingxue\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/bingxueindonesia.co.id\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/bingxueindonesia.co.id\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/bingxueindonesia.co.id\/#organization\",\"name\":\"Bingxue\",\"url\":\"https:\/\/bingxueindonesia.co.id\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/bingxueindonesia.co.id\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/bingxueindonesia.co.id\/wp-content\/uploads\/2026\/08\/cropped-1@2x-1.png\",\"contentUrl\":\"https:\/\/bingxueindonesia.co.id\/wp-content\/uploads\/2026\/08\/cropped-1@2x-1.png\",\"width\":1901,\"height\":410,\"caption\":\"Bingxue\"},\"image\":{\"@id\":\"https:\/\/bingxueindonesia.co.id\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/bingxueindonesia\/\",\"https:\/\/www.instagram.com\/bingxue.indonesia\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Slot Machine 2 - Bingxue","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:\/\/bingxueindonesia.co.id\/en\/slot-machine-2\/","og_locale":"en_US","og_type":"article","og_title":"Slot Machine 2 - Bingxue","og_description":"BINGXUEGREEN GRAPE SERIES FRIDAY LIVE DRAW Live draw setiap Jumat pukul 19.00 WIB New product launch \u00b7 Lucky receipt Green Grape Giveaway. Segarnya dapat.Siapa yang bawa pulang hadiah? NOMOR STRUKGREEN GRAPE SERIES A FRESH SIP. A LUCKY MOMENT. MULAI UNDIAN Memuat undian&#8230; Perbarui data Coba hubungkan kembali SELAMAT KEPADA PEMENANG! Periksa hasil undian sebelumnya Undian [&hellip;]","og_url":"https:\/\/bingxueindonesia.co.id\/en\/slot-machine-2\/","og_site_name":"Bingxue","article_publisher":"https:\/\/www.facebook.com\/bingxueindonesia\/","article_modified_time":"2026-10-02T03:15:14+00:00","og_image":[{"url":"https:\/\/bingxueindonesia.co.id\/wp-content\/uploads\/2026\/09\/Asset-1.png","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/bingxueindonesia.co.id\/slot-machine-2\/","url":"https:\/\/bingxueindonesia.co.id\/slot-machine-2\/","name":"Slot Machine 2 - Bingxue","isPartOf":{"@id":"https:\/\/bingxueindonesia.co.id\/#website"},"primaryImageOfPage":{"@id":"https:\/\/bingxueindonesia.co.id\/slot-machine-2\/#primaryimage"},"image":{"@id":"https:\/\/bingxueindonesia.co.id\/slot-machine-2\/#primaryimage"},"thumbnailUrl":"https:\/\/bingxueindonesia.co.id\/wp-content\/uploads\/2026\/09\/Asset-1.png","datePublished":"2026-10-02T03:14:47+00:00","dateModified":"2026-10-02T03:15:14+00:00","breadcrumb":{"@id":"https:\/\/bingxueindonesia.co.id\/slot-machine-2\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/bingxueindonesia.co.id\/slot-machine-2\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/bingxueindonesia.co.id\/slot-machine-2\/#primaryimage","url":"https:\/\/bingxueindonesia.co.id\/wp-content\/uploads\/2026\/09\/Asset-1.png","contentUrl":"https:\/\/bingxueindonesia.co.id\/wp-content\/uploads\/2026\/09\/Asset-1.png"},{"@type":"BreadcrumbList","@id":"https:\/\/bingxueindonesia.co.id\/slot-machine-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/bingxueindonesia.co.id\/"},{"@type":"ListItem","position":2,"name":"Slot Machine 2"}]},{"@type":"WebSite","@id":"https:\/\/bingxueindonesia.co.id\/#website","url":"https:\/\/bingxueindonesia.co.id\/","name":"Bingxue","description":"","publisher":{"@id":"https:\/\/bingxueindonesia.co.id\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/bingxueindonesia.co.id\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/bingxueindonesia.co.id\/#organization","name":"Bingxue","url":"https:\/\/bingxueindonesia.co.id\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/bingxueindonesia.co.id\/#\/schema\/logo\/image\/","url":"https:\/\/bingxueindonesia.co.id\/wp-content\/uploads\/2026\/08\/cropped-1@2x-1.png","contentUrl":"https:\/\/bingxueindonesia.co.id\/wp-content\/uploads\/2026\/08\/cropped-1@2x-1.png","width":1901,"height":410,"caption":"Bingxue"},"image":{"@id":"https:\/\/bingxueindonesia.co.id\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/bingxueindonesia\/","https:\/\/www.instagram.com\/bingxue.indonesia\/"]}]}},"jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/bingxueindonesia.co.id\/en\/wp-json\/wp\/v2\/pages\/9472","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bingxueindonesia.co.id\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bingxueindonesia.co.id\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bingxueindonesia.co.id\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/bingxueindonesia.co.id\/en\/wp-json\/wp\/v2\/comments?post=9472"}],"version-history":[{"count":5,"href":"https:\/\/bingxueindonesia.co.id\/en\/wp-json\/wp\/v2\/pages\/9472\/revisions"}],"predecessor-version":[{"id":9477,"href":"https:\/\/bingxueindonesia.co.id\/en\/wp-json\/wp\/v2\/pages\/9472\/revisions\/9477"}],"wp:attachment":[{"href":"https:\/\/bingxueindonesia.co.id\/en\/wp-json\/wp\/v2\/media?parent=9472"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}