{"id":6,"date":"2026-05-15T19:03:26","date_gmt":"2026-05-15T19:03:26","guid":{"rendered":"https:\/\/zie.mhaus.net\/?page_id=6"},"modified":"2026-05-15T20:39:52","modified_gmt":"2026-05-15T20:39:52","slug":"home","status":"publish","type":"page","link":"https:\/\/zie.mhaus.net\/","title":{"rendered":"Home"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"6\" class=\"elementor elementor-6\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e7ae84a e-flex e-con-boxed e-con e-parent\" data-id=\"e7ae84a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7003b80 elementor-widget elementor-widget-html\" data-id=\"7003b80\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"zh-CN\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<title>5\u56fd\u65c5\u6e38\u653b\u7565\u5bf9\u6bd4 \u00b7 Travel Compass v2<\/title>\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..900;1,9..144,300..900&family=Noto+Serif+SC:wght@400;500;700;900&family=JetBrains+Mono:wght@400;500;700&display=swap\" rel=\"stylesheet\">\r\n<style>\r\n  :root {\r\n    --ink: #1a1612;\r\n    --paper: #f5f1e8;\r\n    --paper-warm: #ede5d3;\r\n    --paper-deep: #e0d5bc;\r\n    --rust: #b8472b;\r\n    --rust-deep: #8a2e15;\r\n    --jade: #2d5f3f;\r\n    --jade-light: #4a8a5e;\r\n    --gold: #c9962b;\r\n    --gold-soft: #e6c068;\r\n    --indigo: #1e3a5f;\r\n    --plum: #6b2c5c;\r\n    --shadow: rgba(26, 22, 18, 0.08);\r\n    --shadow-strong: rgba(26, 22, 18, 0.18);\r\n\r\n    --serif-display: 'Fraunces', 'Noto Serif SC', serif;\r\n    --serif-cn: 'Noto Serif SC', serif;\r\n    --mono: 'JetBrains Mono', monospace;\r\n  }\r\n\r\n  * { margin: 0; padding: 0; box-sizing: border-box; }\r\n  html { scroll-behavior: smooth; }\r\n\r\n  body {\r\n    font-family: var(--serif-cn);\r\n    background: var(--paper);\r\n    color: var(--ink);\r\n    line-height: 1.6;\r\n    overflow-x: hidden;\r\n    background-image:\r\n      radial-gradient(circle at 20% 30%, rgba(184,71,43,0.04) 0%, transparent 50%),\r\n      radial-gradient(circle at 80% 70%, rgba(45,95,63,0.04) 0%, transparent 50%);\r\n  }\r\n\r\n  body::before {\r\n    content: '';\r\n    position: fixed;\r\n    inset: 0;\r\n    pointer-events: none;\r\n    background-image: url(\"data:image\/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http:\/\/www.w3.org\/2000\/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3'\/%3E%3CfeColorMatrix values='0 0 0 0 0.4 0 0 0 0 0.3 0 0 0 0 0.2 0 0 0 0.04 0'\/%3E%3C\/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'\/%3E%3C\/svg%3E\");\r\n    opacity: 0.6;\r\n    z-index: 1;\r\n    mix-blend-mode: multiply;\r\n  }\r\n\r\n  \/* ============ HEADER ============ *\/\r\n  .header {\r\n    position: relative;\r\n    padding: 80px 5vw 60px;\r\n    z-index: 2;\r\n    border-bottom: 1px solid rgba(26,22,18,0.12);\r\n  }\r\n\r\n  .header-top {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: flex-start;\r\n    margin-bottom: 60px;\r\n    font-family: var(--mono);\r\n    font-size: 11px;\r\n    letter-spacing: 0.15em;\r\n    text-transform: uppercase;\r\n    opacity: 0.6;\r\n  }\r\n\r\n  .header-top span { display: block; }\r\n\r\n  h1.title {\r\n    font-family: var(--serif-display);\r\n    font-weight: 300;\r\n    font-size: clamp(48px, 9vw, 140px);\r\n    line-height: 0.9;\r\n    letter-spacing: -0.04em;\r\n    font-variation-settings: 'opsz' 144;\r\n  }\r\n\r\n  h1.title em {\r\n    font-style: italic;\r\n    font-weight: 400;\r\n    color: var(--rust);\r\n  }\r\n\r\n  .subtitle {\r\n    margin-top: 32px;\r\n    max-width: 720px;\r\n    font-size: 16px;\r\n    color: rgba(26,22,18,0.7);\r\n  }\r\n\r\n  .subtitle strong { color: var(--rust-deep); font-weight: 700; }\r\n\r\n  \/* ============ CONTROL PANEL ============ *\/\r\n  .control-panel {\r\n    position: sticky;\r\n    top: 0;\r\n    z-index: 50;\r\n    background: var(--paper);\r\n    border-bottom: 2px solid var(--ink);\r\n    box-shadow: 0 4px 20px var(--shadow);\r\n  }\r\n\r\n  \/* Compact summary bar (mobile + desktop fallback) *\/\r\n  .control-summary {\r\n    display: none;\r\n    align-items: center;\r\n    justify-content: space-between;\r\n    padding: 14px 5vw;\r\n    cursor: pointer;\r\n    gap: 16px;\r\n  }\r\n\r\n  .control-summary-text {\r\n    font-family: var(--serif-cn);\r\n    font-size: 13px;\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n    gap: 10px;\r\n    align-items: center;\r\n  }\r\n\r\n  .control-summary-text strong {\r\n    font-family: var(--serif-display);\r\n    font-style: italic;\r\n    font-weight: 500;\r\n    color: var(--rust);\r\n    font-size: 16px;\r\n  }\r\n\r\n  .summary-dot {\r\n    width: 3px;\r\n    height: 3px;\r\n    background: rgba(26,22,18,0.3);\r\n    border-radius: 50%;\r\n    display: inline-block;\r\n  }\r\n\r\n  .control-toggle-btn {\r\n    background: var(--ink);\r\n    color: var(--paper);\r\n    border: none;\r\n    padding: 8px 16px;\r\n    font-family: var(--mono);\r\n    font-size: 10px;\r\n    letter-spacing: 0.15em;\r\n    text-transform: uppercase;\r\n    cursor: pointer;\r\n    flex-shrink: 0;\r\n    transition: all 0.2s;\r\n  }\r\n\r\n  .control-toggle-btn:hover { background: var(--rust); }\r\n  .control-toggle-btn::after { content: ' \u25be'; }\r\n  .control-panel.expanded .control-toggle-btn::after { content: ' \u25b4'; }\r\n\r\n  .control-body {\r\n    padding: 20px 5vw;\r\n  }\r\n\r\n  .control-grid {\r\n    display: grid;\r\n    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\r\n    gap: 28px;\r\n    align-items: end;\r\n  }\r\n\r\n  .control {\r\n    display: flex;\r\n    flex-direction: column;\r\n    gap: 8px;\r\n  }\r\n\r\n  .control-label {\r\n    font-family: var(--mono);\r\n    font-size: 10px;\r\n    letter-spacing: 0.2em;\r\n    text-transform: uppercase;\r\n    color: rgba(26,22,18,0.5);\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: baseline;\r\n  }\r\n\r\n  .control-value {\r\n    font-family: var(--serif-display);\r\n    font-style: italic;\r\n    font-size: 22px;\r\n    color: var(--rust);\r\n    font-weight: 500;\r\n    letter-spacing: normal;\r\n    text-transform: none;\r\n  }\r\n\r\n  input[type=\"range\"] {\r\n    -webkit-appearance: none;\r\n    width: 100%;\r\n    height: 4px;\r\n    background: var(--paper-deep);\r\n    border-radius: 2px;\r\n    outline: none;\r\n  }\r\n\r\n  input[type=\"range\"]::-webkit-slider-thumb {\r\n    -webkit-appearance: none;\r\n    width: 20px;\r\n    height: 20px;\r\n    background: var(--ink);\r\n    border: 3px solid var(--paper);\r\n    border-radius: 50%;\r\n    cursor: pointer;\r\n    box-shadow: 0 2px 6px var(--shadow-strong);\r\n    transition: all 0.2s;\r\n  }\r\n\r\n  input[type=\"range\"]::-webkit-slider-thumb:hover {\r\n    background: var(--rust);\r\n    transform: scale(1.15);\r\n  }\r\n\r\n  input[type=\"range\"]::-moz-range-thumb {\r\n    width: 20px;\r\n    height: 20px;\r\n    background: var(--ink);\r\n    border: 3px solid var(--paper);\r\n    border-radius: 50%;\r\n    cursor: pointer;\r\n    box-shadow: 0 2px 6px var(--shadow-strong);\r\n  }\r\n\r\n  .style-selector {\r\n    display: flex;\r\n    gap: 6px;\r\n    flex-wrap: wrap;\r\n  }\r\n\r\n  .style-btn {\r\n    padding: 6px 12px;\r\n    background: transparent;\r\n    border: 1px solid rgba(26,22,18,0.25);\r\n    border-radius: 0;\r\n    font-family: var(--serif-cn);\r\n    font-size: 12px;\r\n    cursor: pointer;\r\n    transition: all 0.2s;\r\n    color: var(--ink);\r\n  }\r\n\r\n  .style-btn:hover { border-color: var(--ink); }\r\n  .style-btn.active {\r\n    background: var(--ink);\r\n    color: var(--paper);\r\n    border-color: var(--ink);\r\n  }\r\n\r\n  \/* ============ MAIN CONTENT ============ *\/\r\n  .main {\r\n    position: relative;\r\n    z-index: 2;\r\n    padding: 60px 5vw 40px;\r\n  }\r\n\r\n  \/* ============ COUNTRY CARDS ============ *\/\r\n  .countries-grid {\r\n    display: grid;\r\n    grid-template-columns: 1fr;\r\n    gap: 40px;\r\n    margin-bottom: 80px;\r\n  }\r\n\r\n  .country-card {\r\n    position: relative;\r\n    background: var(--paper-warm);\r\n    border: 1px solid rgba(26,22,18,0.15);\r\n    overflow: hidden;\r\n    transition: all 0.4s cubic-bezier(0.2, 0.8, 0.2, 1);\r\n  }\r\n\r\n  .country-card:hover {\r\n    box-shadow: 0 20px 40px var(--shadow-strong);\r\n  }\r\n\r\n  .country-card.expanded {\r\n    background: var(--paper);\r\n  }\r\n\r\n  .country-header {\r\n    display: grid;\r\n    grid-template-columns: auto 1fr auto;\r\n    gap: 40px;\r\n    padding: 40px;\r\n    align-items: center;\r\n    cursor: pointer;\r\n  }\r\n\r\n  .country-card.expanded .country-header {\r\n    border-bottom: 1px solid rgba(26,22,18,0.1);\r\n  }\r\n\r\n  .country-number {\r\n    font-family: var(--serif-display);\r\n    font-size: 88px;\r\n    line-height: 1;\r\n    font-weight: 200;\r\n    color: var(--rust);\r\n    font-style: italic;\r\n    opacity: 0.85;\r\n  }\r\n\r\n  .country-main {\r\n    display: flex;\r\n    flex-direction: column;\r\n    gap: 8px;\r\n  }\r\n\r\n  .country-name-row {\r\n    display: flex;\r\n    align-items: baseline;\r\n    gap: 16px;\r\n    flex-wrap: wrap;\r\n  }\r\n\r\n  .country-name-cn {\r\n    font-family: var(--serif-cn);\r\n    font-size: 36px;\r\n    font-weight: 700;\r\n    letter-spacing: -0.01em;\r\n  }\r\n\r\n  .country-name-en {\r\n    font-family: var(--serif-display);\r\n    font-style: italic;\r\n    font-size: 22px;\r\n    color: rgba(26,22,18,0.5);\r\n    font-weight: 300;\r\n  }\r\n\r\n  .country-tags {\r\n    display: flex;\r\n    gap: 8px;\r\n    flex-wrap: wrap;\r\n    margin-top: 4px;\r\n  }\r\n\r\n  .tag {\r\n    font-family: var(--mono);\r\n    font-size: 10px;\r\n    letter-spacing: 0.1em;\r\n    padding: 4px 10px;\r\n    background: rgba(26,22,18,0.07);\r\n    border-radius: 2px;\r\n    text-transform: uppercase;\r\n  }\r\n\r\n  .tag.hot { background: rgba(184,71,43,0.12); color: var(--rust-deep); }\r\n  .tag.cool { background: rgba(45,95,63,0.12); color: var(--jade); }\r\n  .tag.budget { background: rgba(201,150,43,0.18); color: #8a6315; }\r\n\r\n  .country-stats {\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: flex-end;\r\n    gap: 4px;\r\n    text-align: right;\r\n  }\r\n\r\n  .stat-cost {\r\n    font-family: var(--serif-display);\r\n    font-size: 38px;\r\n    font-weight: 500;\r\n    letter-spacing: -0.02em;\r\n    line-height: 1;\r\n  }\r\n\r\n  .stat-cost .currency {\r\n    font-size: 16px;\r\n    font-style: italic;\r\n    color: rgba(26,22,18,0.5);\r\n    margin-right: 4px;\r\n  }\r\n\r\n  .stat-meta {\r\n    font-family: var(--mono);\r\n    font-size: 10px;\r\n    letter-spacing: 0.15em;\r\n    text-transform: uppercase;\r\n    color: rgba(26,22,18,0.5);\r\n  }\r\n\r\n  \/* Score bars *\/\r\n  .score-section {\r\n    padding: 30px 40px;\r\n    background: rgba(0,0,0,0.015);\r\n    display: grid;\r\n    grid-template-columns: repeat(4, 1fr);\r\n    gap: 30px;\r\n  }\r\n\r\n  .score-item {\r\n    display: flex;\r\n    flex-direction: column;\r\n    gap: 6px;\r\n  }\r\n\r\n  .score-label {\r\n    font-family: var(--mono);\r\n    font-size: 9px;\r\n    letter-spacing: 0.2em;\r\n    text-transform: uppercase;\r\n    color: rgba(26,22,18,0.55);\r\n  }\r\n\r\n  .score-value-row {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n  }\r\n\r\n  .score-bar {\r\n    flex: 1;\r\n    height: 3px;\r\n    background: rgba(26,22,18,0.1);\r\n    position: relative;\r\n  }\r\n\r\n  .score-fill {\r\n    position: absolute;\r\n    inset: 0;\r\n    background: var(--ink);\r\n    transform-origin: left;\r\n    transition: transform 1s cubic-bezier(0.2, 0.8, 0.2, 1);\r\n  }\r\n\r\n  .score-num {\r\n    font-family: var(--serif-display);\r\n    font-style: italic;\r\n    font-size: 14px;\r\n    font-weight: 500;\r\n    min-width: 28px;\r\n    text-align: right;\r\n  }\r\n\r\n  \/* ============ EXPANDED CONTENT ============ *\/\r\n  .country-details {\r\n    max-height: 0;\r\n    overflow: hidden;\r\n    transition: max-height 0.6s cubic-bezier(0.2, 0.8, 0.2, 1);\r\n  }\r\n\r\n  .country-card.expanded .country-details {\r\n    max-height: 8000px;\r\n  }\r\n\r\n  \/* Route Selector *\/\r\n  .route-selector-section {\r\n    padding: 30px 40px;\r\n    background: rgba(184,71,43,0.04);\r\n    border-bottom: 1px solid rgba(26,22,18,0.08);\r\n  }\r\n\r\n  .route-selector-title {\r\n    font-family: var(--mono);\r\n    font-size: 10px;\r\n    letter-spacing: 0.2em;\r\n    text-transform: uppercase;\r\n    color: rgba(26,22,18,0.55);\r\n    margin-bottom: 14px;\r\n  }\r\n\r\n  .route-pills {\r\n    display: flex;\r\n    gap: 8px;\r\n    flex-wrap: wrap;\r\n  }\r\n\r\n  .route-pill {\r\n    padding: 10px 18px;\r\n    background: var(--paper);\r\n    border: 1px solid rgba(26,22,18,0.2);\r\n    cursor: pointer;\r\n    transition: all 0.2s;\r\n    font-family: var(--serif-cn);\r\n    font-size: 14px;\r\n    font-weight: 500;\r\n  }\r\n\r\n  .route-pill:hover { border-color: var(--ink); }\r\n  .route-pill.active {\r\n    background: var(--ink);\r\n    color: var(--paper);\r\n    border-color: var(--ink);\r\n  }\r\n\r\n  .route-description {\r\n    margin-top: 16px;\r\n    font-size: 13px;\r\n    color: rgba(26,22,18,0.7);\r\n    font-style: italic;\r\n    font-family: var(--serif-display);\r\n    font-weight: 400;\r\n    line-height: 1.6;\r\n  }\r\n\r\n  \/* Style mode toggle (\u4e3b\u6d41 vs \u9ad8\u6027\u4ef7\u6bd4) *\/\r\n  .mode-toggle-section {\r\n    padding: 24px 40px;\r\n    background: rgba(26,22,18,0.025);\r\n    border-bottom: 1px solid rgba(26,22,18,0.08);\r\n    display: flex;\r\n    gap: 20px;\r\n    align-items: center;\r\n    flex-wrap: wrap;\r\n  }\r\n\r\n  .mode-toggle-label {\r\n    font-family: var(--mono);\r\n    font-size: 10px;\r\n    letter-spacing: 0.2em;\r\n    text-transform: uppercase;\r\n    color: rgba(26,22,18,0.55);\r\n  }\r\n\r\n  .mode-toggle {\r\n    display: flex;\r\n    background: var(--paper);\r\n    border: 1px solid var(--ink);\r\n    overflow: hidden;\r\n  }\r\n\r\n  .mode-btn {\r\n    padding: 8px 18px;\r\n    background: transparent;\r\n    border: none;\r\n    cursor: pointer;\r\n    font-family: var(--serif-cn);\r\n    font-size: 13px;\r\n    transition: all 0.2s;\r\n  }\r\n\r\n  .mode-btn.active {\r\n    background: var(--ink);\r\n    color: var(--paper);\r\n  }\r\n\r\n  .mode-explainer {\r\n    flex: 1;\r\n    font-size: 12px;\r\n    color: rgba(26,22,18,0.6);\r\n    font-style: italic;\r\n    font-family: var(--serif-display);\r\n    min-width: 200px;\r\n  }\r\n\r\n  \/* Details content *\/\r\n  .details-content {\r\n    padding: 50px 40px;\r\n    display: grid;\r\n    grid-template-columns: 1fr 1fr;\r\n    gap: 60px;\r\n  }\r\n\r\n  .detail-block h3 {\r\n    font-family: var(--serif-display);\r\n    font-weight: 400;\r\n    font-style: italic;\r\n    font-size: 28px;\r\n    margin-bottom: 20px;\r\n    color: var(--ink);\r\n    border-bottom: 1px solid var(--ink);\r\n    padding-bottom: 8px;\r\n    display: inline-block;\r\n  }\r\n\r\n  .info-list { list-style: none; margin-top: 12px; }\r\n  .info-list li {\r\n    padding: 10px 0;\r\n    border-bottom: 1px dashed rgba(26,22,18,0.15);\r\n    font-size: 14px;\r\n    display: flex;\r\n    justify-content: space-between;\r\n    gap: 16px;\r\n  }\r\n  .info-list li:last-child { border-bottom: none; }\r\n  .info-list .key {\r\n    font-family: var(--mono);\r\n    font-size: 11px;\r\n    letter-spacing: 0.05em;\r\n    color: rgba(26,22,18,0.55);\r\n    text-transform: uppercase;\r\n    flex-shrink: 0;\r\n  }\r\n  .info-list .val { text-align: right; }\r\n\r\n  .place-list {\r\n    display: flex;\r\n    flex-direction: column;\r\n    gap: 16px;\r\n    margin-top: 12px;\r\n  }\r\n  .place-item {\r\n    display: flex;\r\n    gap: 16px;\r\n    align-items: flex-start;\r\n  }\r\n  .place-dot {\r\n    width: 8px;\r\n    height: 8px;\r\n    background: var(--rust);\r\n    border-radius: 50%;\r\n    margin-top: 8px;\r\n    flex-shrink: 0;\r\n  }\r\n  .place-content { flex: 1; }\r\n  .place-name { font-weight: 700; font-size: 15px; margin-bottom: 2px; }\r\n  .place-desc { font-size: 13px; color: rgba(26,22,18,0.7); line-height: 1.5; }\r\n\r\n  \/* Itinerary *\/\r\n  .itinerary {\r\n    grid-column: 1 \/ -1;\r\n    margin-top: 20px;\r\n  }\r\n\r\n  .day-row {\r\n    display: grid;\r\n    grid-template-columns: 80px 1fr;\r\n    gap: 30px;\r\n    padding: 24px 0;\r\n    border-bottom: 1px solid rgba(26,22,18,0.1);\r\n  }\r\n  .day-row:last-child { border-bottom: none; }\r\n\r\n  .day-num {\r\n    font-family: var(--serif-display);\r\n    font-style: italic;\r\n    font-size: 24px;\r\n    color: var(--rust);\r\n    font-weight: 400;\r\n  }\r\n  .day-num small {\r\n    display: block;\r\n    font-family: var(--mono);\r\n    font-size: 10px;\r\n    letter-spacing: 0.15em;\r\n    color: rgba(26,22,18,0.5);\r\n    font-style: normal;\r\n    margin-top: 4px;\r\n    text-transform: uppercase;\r\n  }\r\n\r\n  .day-content {\r\n    display: flex;\r\n    flex-direction: column;\r\n    gap: 8px;\r\n  }\r\n\r\n  .day-title {\r\n    font-weight: 700;\r\n    font-size: 16px;\r\n  }\r\n\r\n  .day-desc {\r\n    font-size: 14px;\r\n    color: rgba(26,22,18,0.75);\r\n    line-height: 1.65;\r\n  }\r\n\r\n  .day-tip {\r\n    margin-top: 6px;\r\n    padding: 10px 12px;\r\n    background: rgba(201,150,43,0.1);\r\n    border-left: 2px solid var(--gold);\r\n    font-size: 12.5px;\r\n    color: var(--rust-deep);\r\n    font-style: italic;\r\n    line-height: 1.5;\r\n  }\r\n\r\n  .day-tip::before {\r\n    content: '\ud83d\udca1 ';\r\n    font-style: normal;\r\n  }\r\n\r\n  .day-tip.budget-tip {\r\n    background: rgba(45,95,63,0.08);\r\n    border-left-color: var(--jade);\r\n    color: var(--jade);\r\n  }\r\n  .day-tip.budget-tip::before { content: '\ud83d\udcb0 '; }\r\n\r\n  \/* Budget breakdown *\/\r\n  .budget-breakdown {\r\n    grid-column: 1 \/ -1;\r\n    background: rgba(26,22,18,0.03);\r\n    padding: 30px;\r\n    border-left: 3px solid var(--rust);\r\n  }\r\n\r\n  .breakdown-grid {\r\n    display: grid;\r\n    grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\r\n    gap: 24px;\r\n    margin-top: 20px;\r\n  }\r\n  .breakdown-item { text-align: left; }\r\n  .breakdown-label {\r\n    font-family: var(--mono);\r\n    font-size: 10px;\r\n    letter-spacing: 0.15em;\r\n    text-transform: uppercase;\r\n    color: rgba(26,22,18,0.55);\r\n    margin-bottom: 6px;\r\n  }\r\n  .breakdown-value {\r\n    font-family: var(--serif-display);\r\n    font-size: 28px;\r\n    font-weight: 500;\r\n    letter-spacing: -0.02em;\r\n  }\r\n  .breakdown-value small {\r\n    font-size: 13px;\r\n    color: rgba(26,22,18,0.5);\r\n    font-style: italic;\r\n    font-weight: 400;\r\n    margin-left: 4px;\r\n  }\r\n\r\n  \/* Verdict *\/\r\n  .verdict {\r\n    grid-column: 1 \/ -1;\r\n    padding: 24px;\r\n    background: var(--ink);\r\n    color: var(--paper);\r\n    margin-top: 20px;\r\n    display: grid;\r\n    grid-template-columns: auto 1fr;\r\n    gap: 30px;\r\n    align-items: center;\r\n  }\r\n  .verdict-label {\r\n    font-family: var(--mono);\r\n    font-size: 10px;\r\n    letter-spacing: 0.2em;\r\n    text-transform: uppercase;\r\n    opacity: 0.7;\r\n    writing-mode: vertical-rl;\r\n    transform: rotate(180deg);\r\n  }\r\n  .verdict-text {\r\n    font-family: var(--serif-display);\r\n    font-style: italic;\r\n    font-weight: 300;\r\n    font-size: 22px;\r\n    line-height: 1.5;\r\n  }\r\n  .verdict-text em {\r\n    font-style: normal;\r\n    font-family: var(--serif-cn);\r\n    color: var(--gold-soft);\r\n    font-weight: 700;\r\n  }\r\n\r\n  .expand-hint {\r\n    position: absolute;\r\n    bottom: 20px;\r\n    right: 40px;\r\n    font-family: var(--mono);\r\n    font-size: 10px;\r\n    letter-spacing: 0.15em;\r\n    text-transform: uppercase;\r\n    color: rgba(26,22,18,0.4);\r\n    transition: color 0.2s;\r\n    pointer-events: none;\r\n  }\r\n  .country-card:hover .expand-hint { color: var(--rust); }\r\n  .country-card.expanded .expand-hint::after { content: ' \/ \u6536\u8d77'; }\r\n\r\n  \/* Section titles *\/\r\n  .section-title {\r\n    font-family: var(--serif-display);\r\n    font-weight: 300;\r\n    font-size: clamp(36px, 5vw, 64px);\r\n    margin-bottom: 16px;\r\n    letter-spacing: -0.02em;\r\n  }\r\n  .section-title em {\r\n    font-style: italic;\r\n    color: var(--rust);\r\n  }\r\n  .section-sub {\r\n    font-family: var(--mono);\r\n    font-size: 11px;\r\n    letter-spacing: 0.2em;\r\n    text-transform: uppercase;\r\n    color: rgba(26,22,18,0.5);\r\n    margin-bottom: 40px;\r\n  }\r\n\r\n  \/* Comparison table *\/\r\n  .compare-table {\r\n    width: 100%;\r\n    border-collapse: collapse;\r\n    margin-bottom: 80px;\r\n    font-size: 14px;\r\n    background: var(--paper-warm);\r\n  }\r\n\r\n  .compare-table th, .compare-table td {\r\n    padding: 16px 18px;\r\n    text-align: left;\r\n    border-bottom: 1px solid rgba(26,22,18,0.1);\r\n    vertical-align: top;\r\n  }\r\n\r\n  .compare-table th {\r\n    background: var(--ink);\r\n    color: var(--paper);\r\n    font-family: var(--mono);\r\n    font-size: 11px;\r\n    letter-spacing: 0.15em;\r\n    text-transform: uppercase;\r\n    font-weight: 500;\r\n  }\r\n\r\n  .compare-table tr:hover { background: rgba(26,22,18,0.03); }\r\n\r\n  .compare-table td:first-child {\r\n    font-family: var(--serif-cn);\r\n    font-weight: 700;\r\n    font-size: 15px;\r\n    width: 140px;\r\n  }\r\n\r\n  \/* Recommend section *\/\r\n  .recommend-section {\r\n    background: var(--ink);\r\n    color: var(--paper);\r\n    margin: 60px -5vw;\r\n    padding: 80px 5vw;\r\n    position: relative;\r\n  }\r\n\r\n  .recommend-section .section-title { color: var(--paper); }\r\n  .recommend-section .section-title em { color: var(--gold-soft); }\r\n  .recommend-section .section-sub { color: rgba(245,241,232,0.5); }\r\n\r\n  .recommend-card {\r\n    background: rgba(245,241,232,0.05);\r\n    border: 1px solid rgba(245,241,232,0.15);\r\n    padding: 40px;\r\n    margin-top: 30px;\r\n  }\r\n\r\n  .recommend-top {\r\n    display: grid;\r\n    grid-template-columns: auto 1fr auto;\r\n    gap: 40px;\r\n    align-items: center;\r\n    margin-bottom: 30px;\r\n  }\r\n\r\n  .recommend-rank {\r\n    font-family: var(--serif-display);\r\n    font-style: italic;\r\n    font-size: 88px;\r\n    font-weight: 200;\r\n    color: var(--gold-soft);\r\n    line-height: 1;\r\n  }\r\n\r\n  .recommend-country {\r\n    font-family: var(--serif-cn);\r\n    font-size: 42px;\r\n    font-weight: 700;\r\n  }\r\n\r\n  .recommend-fit {\r\n    font-family: var(--serif-display);\r\n    font-style: italic;\r\n    font-size: 32px;\r\n    color: var(--gold-soft);\r\n    font-weight: 400;\r\n  }\r\n\r\n  .recommend-fit small {\r\n    display: block;\r\n    font-family: var(--mono);\r\n    font-size: 10px;\r\n    letter-spacing: 0.2em;\r\n    text-transform: uppercase;\r\n    color: rgba(245,241,232,0.5);\r\n    font-style: normal;\r\n    margin-bottom: 6px;\r\n  }\r\n\r\n  .recommend-reason {\r\n    font-size: 15px;\r\n    line-height: 1.7;\r\n    color: rgba(245,241,232,0.85);\r\n    max-width: 900px;\r\n  }\r\n\r\n  footer {\r\n    padding: 60px 5vw 40px;\r\n    text-align: center;\r\n    font-family: var(--mono);\r\n    font-size: 11px;\r\n    letter-spacing: 0.15em;\r\n    text-transform: uppercase;\r\n    color: rgba(26,22,18,0.4);\r\n    border-top: 1px solid rgba(26,22,18,0.1);\r\n    margin-top: 40px;\r\n  }\r\n\r\n  footer em {\r\n    font-family: var(--serif-display);\r\n    font-style: italic;\r\n    color: var(--rust);\r\n    text-transform: none;\r\n    letter-spacing: normal;\r\n    font-size: 14px;\r\n  }\r\n\r\n  \/* ============ RESPONSIVE (Mobile) ============ *\/\r\n  @media (max-width: 900px) {\r\n    .header { padding: 50px 5vw 40px; }\r\n    .header-top { margin-bottom: 32px; }\r\n\r\n    \/* Show summary bar on mobile, hide control body by default *\/\r\n    .control-summary { display: flex; }\r\n    .control-body {\r\n      max-height: 0;\r\n      overflow: hidden;\r\n      padding: 0 5vw;\r\n      transition: max-height 0.4s ease, padding 0.3s ease;\r\n    }\r\n    .control-panel.expanded .control-body {\r\n      max-height: 800px;\r\n      padding: 20px 5vw 24px;\r\n      border-top: 1px solid rgba(26,22,18,0.1);\r\n    }\r\n    .control-grid {\r\n      grid-template-columns: 1fr;\r\n      gap: 22px;\r\n    }\r\n\r\n    .country-header {\r\n      grid-template-columns: 1fr;\r\n      gap: 16px;\r\n      padding: 28px;\r\n    }\r\n    .country-number { font-size: 56px; }\r\n    .country-name-cn { font-size: 26px; }\r\n    .country-name-en { font-size: 17px; }\r\n    .country-stats { align-items: flex-start; text-align: left; }\r\n    .stat-cost { font-size: 32px; }\r\n\r\n    .score-section {\r\n      grid-template-columns: repeat(2, 1fr);\r\n      padding: 24px 28px;\r\n      gap: 20px;\r\n    }\r\n\r\n    .route-selector-section, .mode-toggle-section { padding: 24px 28px; }\r\n    .mode-toggle-section { flex-direction: column; align-items: flex-start; gap: 12px; }\r\n\r\n    .details-content {\r\n      grid-template-columns: 1fr;\r\n      padding: 30px 28px;\r\n      gap: 40px;\r\n    }\r\n\r\n    .day-row { grid-template-columns: 60px 1fr; gap: 18px; padding: 20px 0; }\r\n    .day-num { font-size: 20px; }\r\n\r\n    .verdict {\r\n      grid-template-columns: 1fr;\r\n      padding: 20px;\r\n    }\r\n    .verdict-label {\r\n      writing-mode: horizontal-tb;\r\n      transform: none;\r\n    }\r\n    .verdict-text { font-size: 18px; }\r\n\r\n    .compare-table { display: block; overflow-x: auto; font-size: 12.5px; }\r\n    .compare-table th, .compare-table td { padding: 12px 14px; }\r\n    .compare-table td:first-child { width: 100px; }\r\n\r\n    .recommend-section { padding: 60px 5vw; margin: 40px -5vw; }\r\n    .recommend-card { padding: 28px; }\r\n    .recommend-top {\r\n      grid-template-columns: 1fr;\r\n      gap: 12px;\r\n      text-align: left;\r\n    }\r\n    .recommend-rank { font-size: 60px; }\r\n    .recommend-country { font-size: 28px; }\r\n    .recommend-fit { font-size: 24px; text-align: left !important; }\r\n\r\n    .expand-hint { right: 28px; bottom: 16px; }\r\n\r\n    .section-title { font-size: clamp(28px, 7vw, 44px); }\r\n  }\r\n\r\n  \/* Animations *\/\r\n  .fade-in {\r\n    opacity: 0;\r\n    transform: translateY(20px);\r\n    animation: fadeUp 0.8s forwards;\r\n  }\r\n  @keyframes fadeUp {\r\n    to { opacity: 1; transform: translateY(0); }\r\n  }\r\n  .country-card:nth-child(1) { animation-delay: 0.1s; }\r\n  .country-card:nth-child(2) { animation-delay: 0.2s; }\r\n  .country-card:nth-child(3) { animation-delay: 0.3s; }\r\n  .country-card:nth-child(4) { animation-delay: 0.4s; }\r\n  .country-card:nth-child(5) { animation-delay: 0.5s; }\r\n<\/style>\r\n<\/head>\r\n<body>\r\n\r\n<header class=\"header\">\r\n  <div class=\"header-top\">\r\n    <div>\r\n      <span>Five Countries<\/span>\r\n      <span>Multiple Routes<\/span>\r\n    <\/div>\r\n    <div style=\"text-align:right\">\r\n      <span>2026 \u00b7 KL Departure<\/span>\r\n      <span>v2.0 \u00b7 For Groups<\/span>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <h1 class=\"title\">\u4e94\u56fd\u65c5\u884c<br>\u5bf9\u6bd4 <em>compass.<\/em><\/h1>\r\n  <p class=\"subtitle\">\r\n    \u4e00\u4efd\u7ed9 <strong>7-10\u4eba\u5c0f\u961f<\/strong>\u7684\u5b8c\u6574\u51b3\u7b56\u624b\u518c\u3002\u4ece\u9a6c\u6765\u897f\u4e9a\u51fa\u53d1\uff0c\u9884\u7b97 RM1500-3000\/\u4eba\u3002\r\n    \u6bcf\u4e2a\u56fd\u5bb6\u53ef\u9009\u4e0d\u540c<strong>\u57ce\u5e02\u8def\u7ebf<\/strong>\uff0c\u884c\u7a0b\u53ef\u5207\u6362<strong>\u4e3b\u6d41 \/ \u9ad8\u6027\u4ef7\u6bd4<\/strong>\u73a9\u6cd5\u3002\r\n    \u70b9\u51fb\u56fd\u5bb6\u5361\u7247\u5c55\u5f00\u8be6\u60c5\u3002\r\n  <\/p>\r\n<\/header>\r\n\r\n<!-- ============ CONTROL PANEL ============ -->\r\n<section class=\"control-panel\" id=\"controlPanel\">\r\n  <!-- Mobile compact summary -->\r\n  <div class=\"control-summary\" id=\"controlSummary\">\r\n    <div class=\"control-summary-text\">\r\n      <strong id=\"sum-people\">8\u4eba<\/strong>\r\n      <span class=\"summary-dot\"><\/span>\r\n      <strong id=\"sum-days\">7\u5929<\/strong>\r\n      <span id=\"sum-return\" style=\"font-family:var(--mono);font-size:10px;letter-spacing:0.1em;color:rgba(26,22,18,0.5);text-transform:uppercase;\">\u542b\u8fd4\u7a0b<\/span>\r\n      <span class=\"summary-dot\"><\/span>\r\n      <span id=\"sum-stay\">\u7ecf\u6d4e<\/span>\r\n      <span class=\"summary-dot\"><\/span>\r\n      <span id=\"sum-vibe\">\u5747\u8861<\/span>\r\n    <\/div>\r\n    <button class=\"control-toggle-btn\">\u8c03\u6574<\/button>\r\n  <\/div>\r\n\r\n  <div class=\"control-body\">\r\n    <div class=\"control-grid\">\r\n      <div class=\"control\">\r\n        <div class=\"control-label\">\r\n          <span>Group Size \u00b7 \u56e2\u961f\u4eba\u6570<\/span>\r\n          <span class=\"control-value\" id=\"ppl-val\">8\u4eba<\/span>\r\n        <\/div>\r\n        <input type=\"range\" id=\"ppl\" min=\"2\" max=\"12\" value=\"8\" step=\"1\">\r\n      <\/div>\r\n\r\n      <div class=\"control\">\r\n        <div class=\"control-label\">\r\n          <span>Days \u00b7 \u65c5\u884c\u5929\u6570<\/span>\r\n          <span class=\"control-value\" id=\"days-val\">7\u5929<\/span>\r\n        <\/div>\r\n        <input type=\"range\" id=\"days\" min=\"3\" max=\"14\" value=\"7\" step=\"1\">\r\n      <\/div>\r\n\r\n      <div class=\"control\">\r\n        <div class=\"control-label\">\r\n          <span>Stay Style \u00b7 \u4f4f\u5bbf\u6863\u6b21<\/span>\r\n        <\/div>\r\n        <div class=\"style-selector\" id=\"stay-selector\">\r\n          <button class=\"style-btn\" data-stay=\"hostel\">\u9752\u65c5<\/button>\r\n          <button class=\"style-btn active\" data-stay=\"budget\">\u7ecf\u6d4e<\/button>\r\n          <button class=\"style-btn\" data-stay=\"mid\">\u8212\u9002<\/button>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"control\">\r\n        <div class=\"control-label\">\r\n          <span>Vibe \u00b7 \u73a9\u6cd5<\/span>\r\n        <\/div>\r\n        <div class=\"style-selector\" id=\"vibe-selector\">\r\n          <button class=\"style-btn active\" data-vibe=\"balanced\">\u5747\u8861<\/button>\r\n          <button class=\"style-btn\" data-vibe=\"chill\">\u5403\u559d\u8d70\u8d70<\/button>\r\n          <button class=\"style-btn\" data-vibe=\"adventure\">\u4f53\u9a8c\u63a2\u7d22<\/button>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"control\">\r\n        <div class=\"control-label\">\r\n          <span>Day Count \u00b7 \u5929\u6570\u5b9a\u4e49<\/span>\r\n        <\/div>\r\n        <div class=\"style-selector\" id=\"return-selector\">\r\n          <button class=\"style-btn active\" data-return=\"include\">\u542b\u8fd4\u7a0b<\/button>\r\n          <button class=\"style-btn\" data-return=\"exclude\">\u53ea\u7b97\u73a9\u4e50<\/button>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<main class=\"main\">\r\n\r\n<div class=\"countries-grid\" id=\"countries\"><\/div>\r\n\r\n<!-- Comparison Table -->\r\n<div class=\"section-sub\">02 \u2014 Side by Side<\/div>\r\n<h2 class=\"section-title\">\u7ef4\u5ea6<em>\u5bf9\u6bd4<\/em>\u4e00\u89c8<\/h2>\r\n\r\n<div style=\"overflow-x:auto;\">\r\n<table class=\"compare-table\">\r\n  <thead>\r\n    <tr>\r\n      <th>\u7ef4\u5ea6<\/th>\r\n      <th>\u4e2d\u56fd<\/th>\r\n      <th>\u6cf0\u56fd<\/th>\r\n      <th>\u5df4\u5398\u5c9b<\/th>\r\n      <th>\u8d8a\u5357<\/th>\r\n      <th>\u65e5\u60f9<\/th>\r\n    <\/tr>\r\n  <\/thead>\r\n  <tbody>\r\n    <tr>\r\n      <td>\u98de\u884c\u65f6\u95f4<\/td>\r\n      <td>4-5\u5c0f\u65f6<\/td>\r\n      <td>2.25\u5c0f\u65f6<\/td>\r\n      <td>3\u5c0f\u65f6<\/td>\r\n      <td>2-3.5\u5c0f\u65f6<\/td>\r\n      <td>2.5\u5c0f\u65f6<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td>\u673a\u7968\u6765\u56de<\/td>\r\n      <td>RM700-1100<\/td>\r\n      <td>RM250-400<\/td>\r\n      <td>RM400-700<\/td>\r\n      <td>RM230-700<\/td>\r\n      <td>RM500-700<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td>\u7b7e\u8bc1<\/td><td>\u514d\u7b7e240\u5c0f\u65f6<\/td><td>\u514d\u7b7e60\u5929<\/td><td>\u843d\u5730\u7b7e<\/td><td>\u514d\u7b7e30\u5929<\/td><td>\u843d\u5730\u7b7e<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td>\u5f53\u5730\u7269\u4ef7<\/td><td>\u4e2d\u7b49<\/td><td>\u4fbf\u5b9c<\/td><td>\u4e2d\u7b49<\/td><td>\u6700\u4fbf\u5b9c<\/td><td>\u5f88\u4fbf\u5b9c<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td>\u8bed\u8a00<\/td><td>\u4e2d\u6587 (\u6c9f\u901a\u6700\u6613)<\/td><td>\u6cf0\u8bed+\u82f1\u8bed<\/td><td>\u5370\u5c3c+\u82f1\u8bed<\/td><td>\u8d8a\u8bed+\u5c11\u82f1\u8bed<\/td><td>\u5370\u5c3c+\u5c11\u82f1\u8bed<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td>\u5927\u4f17\u5316\u7a0b\u5ea6<\/td><td>\u4e2d<\/td><td>\u975e\u5e38\u6210\u719f<\/td><td>\u975e\u5e38\u6210\u719f<\/td><td>\u6210\u719f<\/td><td>\u8f83\u5c0f\u4f17<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td>\u4ea4\u901a\u4fbf\u5229<\/td><td>\u5730\u94c1+\u6ef4\u6ef4<\/td><td>\u5730\u94c1+Grab<\/td><td>\u9700\u5305\u8f66<\/td><td>Grab+\u5305\u8f66<\/td><td>\u9700\u5305\u8f66<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td>\u5efa\u8bae\u5929\u6570<\/td><td>6-8\u5929<\/td><td>5-7\u5929<\/td><td>5-7\u5929<\/td><td>5-7\u5929<\/td><td>4-5\u5929<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td>\u65b0\u9c9c\u611f<\/td><td>\u2605\u2605\u2605\u2605\u2605<\/td><td>\u2605\u2605\u2605<\/td><td>\u2605\u2605\u2605\u2605<\/td><td>\u2605\u2605\u2605\u2605<\/td><td>\u2605\u2605\u2605\u2605\u2605<\/td>\r\n    <\/tr>\r\n  <\/tbody>\r\n<\/table>\r\n<\/div>\r\n\r\n<!-- Recommendations -->\r\n<section class=\"recommend-section\">\r\n  <div class=\"section-sub\">03 \u2014 Algorithm<\/div>\r\n  <h2 class=\"section-title\">\u667a\u80fd<em>\u63a8\u8350<\/em>\u5f15\u64ce<\/h2>\r\n  <p style=\"max-width:700px; color:rgba(245,241,232,0.7); margin-bottom:20px;\">\r\n    \u6839\u636e\u4f60\u4eec\u7684\u9884\u7b97\u3001\u4eba\u6570\u3001\u73a9\u6cd5\u504f\u597d\uff0c\u7b97\u51fa\u6700\u9002\u5408\u7684\u56fd\u5bb6+\u8def\u7ebf\u3002\u8c03\u6574\u65cb\u94ae\u770b\u63a8\u8350\u5982\u4f55\u53d8\u5316\u3002\r\n  <\/p>\r\n  <div id=\"recommendations\"><\/div>\r\n<\/section>\r\n\r\n<!-- Decision checklist -->\r\n<div class=\"section-sub\">04 \u2014 Final Checklist<\/div>\r\n<h2 class=\"section-title\">\u51b3\u7b56<em>\u6e05\u5355<\/em><\/h2>\r\n\r\n<div style=\"display:grid; grid-template-columns:repeat(auto-fit, minmax(280px, 1fr)); gap:24px; margin-top:30px;\">\r\n\r\n  <div style=\"padding:30px; background:var(--paper-warm); border-left:3px solid var(--rust);\">\r\n    <div style=\"font-family:var(--mono); font-size:10px; letter-spacing:0.2em; text-transform:uppercase; opacity:0.55; margin-bottom:12px;\">\u9884\u7b97\u7d27\u5f20\u7684\u4eba<\/div>\r\n    <div style=\"font-family:var(--serif-display); font-style:italic; font-size:28px; margin-bottom:8px;\">\u8d8a\u5357 \/ \u65e5\u60f9<\/div>\r\n    <p style=\"font-size:14px; line-height:1.7;\">\u7269\u4ef7\u6700\u4f4e\uff0c\u80e1\u5fd7\u660e\u5e02\u673a\u7968RM230\u8d77\u3002RM1500\/\u4eba\u53ef\u4ee5\u73a9\u5f97\u5f88\u8212\u670d\u3002<\/p>\r\n  <\/div>\r\n\r\n  <div style=\"padding:30px; background:var(--paper-warm); border-left:3px solid var(--jade);\">\r\n    <div style=\"font-family:var(--mono); font-size:10px; letter-spacing:0.2em; text-transform:uppercase; opacity:0.55; margin-bottom:12px;\">\u60f3\u8981\u65b0\u9c9c\u611f\u7684\u4eba<\/div>\r\n    <div style=\"font-family:var(--serif-display); font-style:italic; font-size:28px; margin-bottom:8px;\">\u65e5\u60f9 \/ \u4e2d\u56fd<\/div>\r\n    <p style=\"font-size:14px; line-height:1.7;\">\u4e2d\u56fd\u53ef\u4ee5\u9009\u6210\u90fd\/\u91cd\u5e86\/\u6842\u6797\/\u5f20\u5bb6\u754c\u7b49\u5c0f\u4f17\u76ee\u7684\u5730\uff0c\u65e5\u60f9\u6587\u5316\u6df1\u5ea6\u4e5f\u6781\u9ad8\u3002<\/p>\r\n  <\/div>\r\n\r\n  <div style=\"padding:30px; background:var(--paper-warm); border-left:3px solid var(--gold);\">\r\n    <div style=\"font-family:var(--mono); font-size:10px; letter-spacing:0.2em; text-transform:uppercase; opacity:0.55; margin-bottom:12px;\">\u53ea\u60f3\u5403\u559d\u8d70\u8d70\u7684\u4eba<\/div>\r\n    <div style=\"font-family:var(--serif-display); font-style:italic; font-size:28px; margin-bottom:8px;\">\u6cf0\u56fd \/ \u5df4\u5398\u5c9b<\/div>\r\n    <p style=\"font-size:14px; line-height:1.7;\">\u57fa\u7840\u8bbe\u65bd\u6210\u719f\uff0c\u884c\u7a0b\u7075\u6d3b\u3002\u6cf0\u56fd\u6309\u6469+\u7f8e\u98df\u6c38\u8fdc\u4e0d\u8e29\u96f7\u3002<\/p>\r\n  <\/div>\r\n\r\n  <div style=\"padding:30px; background:var(--paper-warm); border-left:3px solid var(--indigo);\">\r\n    <div style=\"font-family:var(--mono); font-size:10px; letter-spacing:0.2em; text-transform:uppercase; opacity:0.55; margin-bottom:12px;\">7-10\u4eba\u5927\u56e2<\/div>\r\n    <div style=\"font-family:var(--serif-display); font-style:italic; font-size:28px; margin-bottom:8px;\">\u5df4\u5398\u5c9b \/ \u8d8a\u5357 \/ \u65e5\u60f9<\/div>\r\n    <p style=\"font-size:14px; line-height:1.7;\">\u5305\u8f66\u6027\u4ef7\u6bd4\u9ad8+\u5927Villa\/\u6c11\u5bbf\u53cb\u597d\u3002\u5df4\u5398\u5c9b\u8ba2\u4e00\u680bVilla\u6700\u5212\u7b97\u3002<\/p>\r\n  <\/div>\r\n\r\n<\/div>\r\n\r\n<\/main>\r\n\r\n<footer>\r\n  <em>Travel Compass v2.0<\/em><br><br>\r\n  \u653b\u7565\u57fa\u4e8e2026\u5e745\u6708\u6570\u636e \u00b7 \u4ef7\u683c\u4ec5\u4f9b\u53c2\u8003 \u00b7 \u5b9e\u9645\u8bf7\u4ee5\u9884\u8ba2\u65f6\u4e3a\u51c6<br>\r\n  Made for friends \u00b7 Plan well \u00b7 Travel light\r\n<\/footer>\r\n\r\n<script>\r\n\/\/ ============ DATA ============\r\n\/\/ Each country has multiple routes. Each route has its own scores, costs, places, itineraries.\r\n\/\/ itineraries are split into \"main\" (\u4e3b\u6d41) and \"smart\" (\u9ad8\u6027\u4ef7\u6bd4)\r\n\r\nconst countries = [\r\n  {\r\n    id: 'china',\r\n    num: '01',\r\n    nameCn: '\u4e2d\u56fd',\r\n    nameEn: 'China',\r\n    visa: '\u514d\u7b7e240\u5c0f\u65f6 (\u90e8\u5206\u57ce\u5e02\u8fc7\u5883\u514d\u7b7e)',\r\n    bestTime: '3-5\u6708\u30019-11\u6708',\r\n    currency: 'RM1 \u2248 1.6 CNY',\r\n    routes: [\r\n      {\r\n        id: 'chengdu',\r\n        name: '\u6210\u90fd',\r\n        desc: '\u718a\u732b+\u706b\u9505+\u53e4\u9547\u6587\u5316\uff0c\u4e2d\u56fd\u897f\u90e8\u6162\u751f\u6d3b\u4ee3\u8868\u3002\u4e2d\u6587\u6c9f\u901a0\u969c\u788d\u3002',\r\n        flightCost: 900,\r\n        flightTime: '~4.5\u5c0f\u65f6',\r\n        baseDays: 7,\r\n        dailyCost: { hostel: 120, budget: 180, mid: 280 },\r\n        scores: { budget: 6, novelty: 9, ease: 9, chill: 7 },\r\n        tags: [{label:'\u4e2d\u6587\u6c9f\u901a',type:'cool'},{label:'\u7f8e\u98df\u5929\u5802',type:'budget'},{label:'\u718a\u732b\u4e3b\u573a',type:'hot'}],\r\n        places: [\r\n          {name:'\u5927\u718a\u732b\u7e41\u80b2\u7814\u7a76\u57fa\u5730', desc:'\u65e9\u4e0a7\u70b9\u5f00\u95e8\u5c31\u53bb\uff0c\u718a\u732b\u6700\u6d3b\u8dc3\u3002\u95e8\u7968\u7ea6RM30\u3002'},\r\n          {name:'\u5bbd\u7a84\u5df7\u5b50 & \u9526\u91cc', desc:'\u4f20\u7edf\u5ddd\u897f\u5efa\u7b51\u8857\u533a\uff0c\u5403\u559d\u901b\u62cd\u4e00\u7ad9\u641e\u5b9a\u3002'},\r\n          {name:'\u90fd\u6c5f\u5830 + \u9752\u57ce\u5c71', desc:'\u4e16\u754c\u9057\u4ea7\u6c34\u5229\u5de5\u7a0b+\u9053\u6559\u540d\u5c71\uff0c\u4e00\u65e5\u6e38\u8def\u7ebf\u3002'},\r\n          {name:'\u6625\u7199\u8def & \u592a\u53e4\u91cc', desc:'IFS\u718a\u732b\u96d5\u5851\u6253\u5361\u70b9+\u5927\u578b\u8d2d\u7269\u3002'},\r\n          {name:'\u4eba\u6c11\u516c\u56ed\u8001\u8336\u9986', desc:'\u559d\u76d6\u7897\u8336\u3001\u638f\u8033\u6735\uff0c\u4f53\u9a8c\u672c\u5730\u4eba\u6162\u751f\u6d3b\u3002'}\r\n        ],\r\n        itineraryMain: [\r\n          {title:'\u62b5\u8fbe\u6210\u90fd', desc:'\u5165\u4f4f\u5bbd\u7a84\u5df7\u5b50\u9644\u8fd1\u6c11\u5bbf\u3002\u665a\u4e0a\u5403\u5c0f\u9f99\u574e\/\u6d77\u5e95\u635e\u706b\u9505\u3002'},\r\n          {title:'\u718a\u732b\u57fa\u5730+\u9526\u91cc', desc:'\u65e9\u8d77\u53bb\u718a\u732b\u57fa\u5730\uff0c\u4e0b\u5348\u56de\u5e02\u533a\u3002\u508d\u665a\u9526\u91cc\u53e4\u8857+\u6b66\u4faf\u7960\u3002'},\r\n          {title:'\u90fd\u6c5f\u5830+\u9752\u57ce\u5c71', desc:'\u5305\u8f66\u4e00\u65e5\u6e38\uff0c\u770b\u5343\u5e74\u6c34\u5229\u5de5\u7a0b+\u722c\u9752\u57ce\u5c71\u3002'},\r\n          {title:'\u4e50\u5c71+\u5ce8\u7709\u5c71', desc:'\u9ad8\u94c1\u51fa\u884c\uff0c\u770b\u4e50\u5c71\u5927\u4f5b\u3002\u559c\u6b22\u722c\u5c71\u53ef\u4e0a\u5ce8\u7709\u5c71\u3002'},\r\n          {title:'\u5ddd\u5267\u53d8\u8138+\u8d2d\u7269', desc:'\u6625\u7199\u8def\u3001\u592a\u53e4\u91ccshopping\uff0c\u665a\u4e0a\u770b\u5ddd\u5267\u53d8\u8138\u6f14\u51fa\u3002'},\r\n          {title:'\u4eba\u6c11\u516c\u56ed\u53d1\u5446\u65e5', desc:'\u4f53\u9a8c\u6162\u751f\u6d3b\uff0c\u9e64\u9e23\u8336\u9986\u559d\u8336\u3002\u4e0b\u5348\u81ea\u7531+\u4e70\u4f34\u624b\u793c\u3002'},\r\n          {title:'\u8fd4\u7a0b', desc:'\u673a\u573a\u9644\u8fd1\u6700\u540e\u4e00\u987f\uff0c\u98de\u56deKL\u3002'}\r\n        ],\r\n        itinerarySmart: [\r\n          {title:'\u62b5\u8fbe\u6210\u90fd', desc:'\u5165\u4f4f\u6625\u7199\u8def\u9644\u8fd1\u7ecf\u6d4e\u578b\u9152\u5e97 (\u4eba\u5747RM80)\u3002\u665a\u996d\u53bb\u672c\u5730\u4eba\u5f00\u7684\"\u8700\u4e5d\u9999\"\u706b\u9505 (\u4eba\u5747RM30\uff0c\u6bd4\u5c0f\u9f99\u574e\u4fbf\u5b9c\u4e00\u534a)\u3002', tip:'\u4f4f\u6625\u7199\u8def\u533a\u4e0d\u8981\u4f4f\u5bbd\u7a84\u5df7\u5b50\uff0c\u4ef7\u683c\u4fbf\u5b9c\u4e00\u534a\uff0c\u5730\u94c12\u53f7\u7ebf\u4e00\u7ad9\u5c31\u5230\u3002'},\r\n          {title:'\u718a\u732b\u57fa\u5730+\u9526\u91cc', desc:'\u5730\u94c13\u53f7\u7ebf\u8f6c\u5730\u94c19\u53f7\u7ebf\u5230\u718a\u732b\u5927\u9053\uff0c\u516c\u4ea4\u76f4\u8fbe (RM2)\u3002\u4e0b\u5348\u9526\u91cc\u53ea\u901b\u514d\u8d39\u90e8\u5206\u3002', tip:'\u718a\u732b\u57fa\u5730\u5b66\u751f\u8bc1\u53ef\u534a\u4ef7\u3002\u4e0b\u53483\u70b9\u56de\u5e02\u533a\u907f\u5f00\u65e9\u9ad8\u5cf0\u3002'},\r\n          {title:'\u90fd\u6c5f\u5830+\u9752\u57ce\u5c71', desc:'\u9ad8\u94c1\u7280\u6d66\u7ad9\u5230\u90fd\u6c5f\u583015\u5206\u949fRM6\uff0c\u81ea\u884c\u6e38\u89c8\u3002\u9752\u57ce\u5c71\u516c\u4ea4\u76f4\u8fbe\u3002\u5168\u5929RM30\u641e\u5b9a\u3002', tip:'\u6bd4\u5305\u8f66\u4fbf\u5b9c90% (\u5305\u8f66RM60\u2192\u81ea\u7531\u884cRM6)\u3002\u65e9\u4e0a7\u70b9\u51fa\u53d1\u907f\u5f00\u65c5\u6e38\u56e2\u3002'},\r\n          {title:'\u4e50\u5c71\u4e00\u65e5\u5f80\u8fd4', desc:'\u52a8\u8f662\u5c0f\u65f6\u5230\u4e50\u5c71\uff0c\u770b\u5927\u4f5b+\u4e4c\u6728\u535a\u7269\u9986\u3002\u5f53\u5929\u56de\u6210\u90fd\u4e0d\u8fc7\u591c\u3002', tip:'\u7701\u4e86\u5ce8\u7709\u5c71\u7684\u4f4f\u5bbf+\u95e8\u7968\u94b1\uff0c\u4e50\u5c71\u624d\u662f\u6027\u4ef7\u6bd4\u4e4b\u738b\u3002'},\r\n          {title:'\u6587\u6b8a\u9662+\u5bbd\u7a84\u5df7\u5b50', desc:'\u6587\u6b8a\u9662\u514d\u8d39 (\u5bfa\u5e99\u6bd4\u9526\u91cc\u66f4\u5b89\u9759\u5730\u9053)\uff0c\u5403\u6587\u6b8a\u9662\u658b\u996d (RM15)\u3002\u508d\u665a\u518d\u53bb\u5bbd\u7a84\u5df7\u5b50\u3002', tip:'\u6587\u6b8a\u9662\u8857\u533a\u662f\u672c\u5730\u8001\u6210\u90fd\uff0c\u6bd4\u9526\u91cc\u5c11\u4e00\u534a\u4eba\u3002'},\r\n          {title:'\u4eba\u6c11\u516c\u56ed+\u83dc\u5e02\u573a', desc:'\u4e0a\u5348\u8336\u9986\u638f\u8033\u6735 (RM20)\uff0c\u4e0b\u5348\u9752\u7f8a\u5bab+\u901b\u7389\u6797\u83dc\u5e02\u573a+\u5c0f\u9152\u9986\u3002', tip:'\u7389\u6797\u8def\u662f\u8d75\u96f7\u300a\u6210\u90fd\u300b\u539f\u578b\uff0c\u665a\u4e0a\u6709Live House\u4eba\u5747RM50\u3002'},\r\n          {title:'\u8fd4\u7a0b', desc:'\u79bb\u673a\u573a\u8fd1\u7684\u53cc\u6d41\u673a\u573a8\u53f7\u7ebf\u76f4\u8fbe\u3002'}\r\n        ]\r\n      },\r\n      {\r\n        id: 'chongqing',\r\n        name: '\u91cd\u5e86',\r\n        desc: '8D\u9b54\u5e7b\u57ce\u5e02+\u5730\u9053\u5ddd\u6e1d\u706b\u9505\u3002\u6d2a\u5d16\u6d1e\u591c\u666f\u6bd4\u5343\u4e0e\u5343\u5bfb\u8fd8\u7f8e\u3002',\r\n        flightCost: 850,\r\n        flightTime: '~4.5\u5c0f\u65f6',\r\n        baseDays: 6,\r\n        dailyCost: { hostel: 110, budget: 170, mid: 260 },\r\n        scores: { budget: 7, novelty: 10, ease: 8, chill: 6 },\r\n        tags: [{label:'\u9b54\u5e7b8D',type:'hot'},{label:'\u591c\u666f\u4e4b\u738b',type:'cool'},{label:'\u6700\u8fa3\u706b\u9505',type:'budget'}],\r\n        places: [\r\n          {name:'\u6d2a\u5d16\u6d1e', desc:'\u5343\u4e0e\u5343\u5bfb\u539f\u578b\uff0c\u508d\u665a\u706f\u5149\u5f00\u542f\u65f6\u4e0a\u5343\u4eba\u56f4\u89c2\u3002'},\r\n          {name:'\u674e\u5b50\u575d\u8f7b\u8f68\u7a7f\u697c', desc:'\u8f7b\u8f682\u53f7\u7ebf\u7a7f\u8fc7\u5c45\u6c11\u697c\uff0c\u5168\u56fd\u6700\u9b54\u5e7b\u6253\u5361\u70b9\u3002'},\r\n          {name:'\u78c1\u5668\u53e3\u53e4\u9547', desc:'\u660e\u6e05\u53e4\u9547\uff0c\u5c0f\u5403\u8857+\u9648\u9ebb\u82b1\u3002'},\r\n          {name:'\u89e3\u653e\u7891+\u516b\u4e00\u597d\u5403\u8857', desc:'\u91cd\u5e86CBD+\u5730\u9053\u5c0f\u5403\u805a\u96c6\u5730\u3002'},\r\n          {name:'\u6b66\u9686\u5929\u751f\u4e09\u6865', desc:'\u300a\u53d8\u5f62\u91d1\u521a4\u300b\u53d6\u666f\u5730\uff0c\u97001\u65e5\u6e38 (RM120\u5305\u8f66)\u3002'},\r\n          {name:'\u957f\u6c5f\u7d22\u9053', desc:'\u6a2a\u8de8\u957f\u6c5f\u7684\u7a7a\u4e2d\u89c2\u5149\uff0cRM10\u5355\u7a0b\u3002'}\r\n        ],\r\n        itineraryMain: [\r\n          {title:'\u62b5\u8fbe\u91cd\u5e86', desc:'\u5165\u4f4f\u89e3\u653e\u7891\u6216\u6d2a\u5d16\u6d1e\u9644\u8fd1\u3002\u665a\u4e0a\u5403\u79e6\u5988\/\u5c0f\u5929\u9e45\u8001\u706b\u9505\u3002'},\r\n          {title:'\u6d2a\u5d16\u6d1e+\u89e3\u653e\u7891', desc:'\u767d\u5929\u5343\u53ae\u95e8\u5927\u6865\u62cd\u6d2a\u5d16\u6d1e\u5916\u89c2\uff0c\u508d\u665a6\u70b9\u770b\u706f\u5149\u79c0\u3002'},\r\n          {title:'\u78c1\u5668\u53e3+\u6e23\u6ed3\u6d1e', desc:'\u5730\u94c11\u53f7\u7ebf\u5230\u78c1\u5668\u53e3\u901b\u53e4\u9547\uff0c\u770b\u7ea2\u5ca9\u9769\u547d\u5386\u53f2\u535a\u7269\u9986\u3002'},\r\n          {title:'\u674e\u5b50\u575d+\u9e45\u5cad\u4e8c\u5382', desc:'\u5fc5\u62cd\u674e\u5b50\u575d\u7a7f\u697c\u8f7b\u8f68\uff0c\u4e0b\u5348\u6587\u827a\u9752\u5e74\u6253\u5361\u9e45\u5cad\u4e8c\u5382\u3002'},\r\n          {title:'\u6b66\u9686\u4e00\u65e5\u6e38', desc:'\u9ad8\u94c1\/\u5305\u8f66\u53bb\u6b66\u9686\u770b\u5929\u751f\u4e09\u6865+\u9f99\u6c34\u5ce1\u5730\u7f1d\u3002'},\r\n          {title:'\u8fd4\u7a0b', desc:'\u6700\u540e\u4e00\u987f\u5c0f\u9762+\u9178\u8fa3\u7c89\uff0c\u98de\u56deKL\u3002'}\r\n        ],\r\n        itinerarySmart: [\r\n          {title:'\u62b5\u8fbe\u91cd\u5e86', desc:'\u4f4f\u5357\u576a (\u5927\u578b\u56e2\u8d2d\u9152\u5e97\u5747\u4ef7RM60\/\u665a)\uff0c\u5730\u94c1\u76f4\u8fbe\u89e3\u653e\u7891\u3002', tip:'\u89e3\u653e\u7891\u9644\u8fd1\u9152\u5e97\u6bd4\u5357\u576a\u8d3560%\uff0c\u5357\u576a\u4e5f\u662f\u5546\u4e1a\u533a\u3002'},\r\n          {title:'\u89e3\u653e\u7891+\u6d2a\u5d16\u6d1e\u591c', desc:'\u767d\u5929\u89e3\u653e\u7891shopping\uff0c\u508d\u665a\u8d70\u5343\u53ae\u95e8\u5927\u6865\u5230\u6d2a\u5d16\u6d1e (\u514d\u8d39\u770b\u591c\u666f\u7684\u6700\u4f73\u4f4d\u7f6e)\u3002', tip:'\u6d2a\u5d16\u6d1e\u91cc\u9762\u6d88\u8d39\u8d35\uff0c\u5916\u9762\u62cd\u7167\u5373\u53ef\u3002'},\r\n          {title:'\u674e\u5b50\u575d+\u9e45\u5cad\u4e8c\u5382', desc:'\u5730\u94c12\u53f7\u7ebf\u4e00\u7968\u901a\u884c (RM3\u5168\u5929)\uff0c\u674e\u5b50\u575d\u2192\u9e45\u5cad\u2192\u671d\u5929\u95e8\u4e00\u7ebf\u4e32\u8054\u3002', tip:'\u5750\u8f7b\u8f682\u53f7\u7ebf\u7a7f\u697c\u6bd4\u79df\u6469\u6258\u4fbf\u5b9c\uff0c\u6cbf\u7ebf\u5168\u662f\u666f\u70b9\u3002'},\r\n          {title:'\u78c1\u5668\u53e3+\u672c\u5730\u5e02\u573a', desc:'\u65e9\u4e0a\u78c1\u5668\u53e3\u907f\u5f00\u4eba\u6f6e (10\u70b9\u524d)\uff0c\u4e0b\u5348\u53bb\u89c2\u97f3\u6865+\u6768\u5bb6\u576a\u6b65\u884c\u8857\u3002', tip:'\u78c1\u5668\u53e3\u9648\u9ebb\u82b1\u8def\u8fb9\u4e70\u548c\u5e97\u91cc\u540c\u4ef7\u683c\u4f46\u4eba\u5c11\u3002'},\r\n          {title:'\u6b66\u9686 vs \u4ed9\u5973\u5c71', desc:'\u9009\u4ed9\u5973\u5c71 (RM60\/\u4eba\u95e8\u7968) \u800c\u975e\u5929\u751f\u4e09\u6865 (RM135)\u3002\u540c\u6837\u7684\u5c71\u666f\uff0c\u4ef7\u683c\u5dee\u4e00\u534a\u3002', tip:'\u56e2\u8d2d\u706b\u9505Bar Code: \u5927\u9f99\u71da+\u5218\u4e00\u624b+\u73ee\u59d0 \u90fd\u6709\u5927\u56e28\u6298\u5238\u3002'},\r\n          {title:'\u8fd4\u7a0b', desc:'\u79bb\u5f00\u524d\u53bb\u516b\u4e00\u597d\u5403\u8857\u540320+\u79cd\u5c0f\u5403\u3002'}\r\n        ]\r\n      },\r\n      {\r\n        id: 'guilin',\r\n        name: '\u6842\u6797+\u9633\u6714',\r\n        desc: '\"\u6842\u6797\u5c71\u6c34\u7532\u5929\u4e0b\"\uff0c\u5580\u65af\u7279\u5730\u8c8c+\u6f13\u6c5f\u7af9\u7b4f\uff0c\u81ea\u7136\u98ce\u5149\u6700\u5f3a\u3002',\r\n        flightCost: 950,\r\n        flightTime: '~5\u5c0f\u65f6 (\u8f6c\u673a)',\r\n        baseDays: 6,\r\n        dailyCost: { hostel: 100, budget: 160, mid: 240 },\r\n        scores: { budget: 7, novelty: 10, ease: 6, chill: 9 },\r\n        tags: [{label:'\u5c71\u6c34\u7edd\u666f',type:'cool'},{label:'\u8f7b\u5962\u9732\u8425',type:'hot'},{label:'\u9002\u5408\u53d1\u5446',type:'budget'}],\r\n        places: [\r\n          {name:'\u6f13\u6c5f\u7af9\u7b4f', desc:'20\u5143RMB\u7eb8\u5e01\u80cc\u666f\u5c31\u662f\u8fd9\u91cc (\u5174\u576a\u6bb5)\u3002'},\r\n          {name:'\u5341\u91cc\u753b\u5eca+\u9047\u9f99\u6cb3', desc:'\u9633\u6714\u9a91\u884c+\u6f02\u6d41\uff0c\u6700\u6d6a\u6f2b\u7684\u5c71\u6c34\u8def\u7ebf\u3002'},\r\n          {name:'\u9f99\u810a\u68af\u7530', desc:'\u58ee\u65cf\u5927\u5be8\u68af\u7530\uff0c\u4e16\u754c\u9057\u4ea7\u7ea7\u98ce\u666f\u3002'},\r\n          {name:'\u897f\u8857', desc:'\u9633\u6714\u6700\u70ed\u95f9\u7684\u9152\u5427\u8857+\u7279\u8272\u5c0f\u5403\u3002'},\r\n          {name:'\u94f6\u5b50\u5ca9\u6eb6\u6d1e', desc:'\u5580\u65af\u7279\u6eb6\u6d1e\u5947\u89c2\u3002'}\r\n        ],\r\n        itineraryMain: [\r\n          {title:'\u62b5\u8fbe\u6842\u6797', desc:'\u5165\u4f4f\u6842\u6797\u5e02\u533a\u3002\u508d\u665a\u4e24\u6c5f\u56db\u6e56\u591c\u6e38 (RM150)\u3002'},\r\n          {title:'\u9f99\u810a\u68af\u7530', desc:'\u5305\u8f66\u4e00\u65e5\u6e38\uff0c\u770b\u58ee\u65cf\u5927\u5be8\u68af\u7530\u3002'},\r\n          {title:'\u6842\u6797\u2192\u9633\u6714', desc:'\u4e58\u5750\u6f13\u6c5f\u7cbe\u534e\u6bb5\u6e38\u8239 (\u5174\u576a\u2192\u6768\u5824\u7ea64\u5c0f\u65f6)\u3002'},\r\n          {title:'\u9633\u6714\u9047\u9f99\u6cb3\u6f02\u6d41', desc:'\u5341\u91cc\u753b\u5eca\u9a91\u884c+\u9047\u9f99\u6cb3\u7af9\u7b4f\u3002'},\r\n          {title:'\u897f\u8857+\u94f6\u5b50\u5ca9', desc:'\u4e0a\u5348\u6eb6\u6d1e\uff0c\u4e0b\u5348\u897f\u8857\u901b\u5403\u559d\u3002'},\r\n          {title:'\u8fd4\u7a0b', desc:'\u6842\u6797\u673a\u573a\u98de\u56deKL\u3002'}\r\n        ],\r\n        itinerarySmart: [\r\n          {title:'\u76f4\u98de\u9633\u6714', desc:'\u98de\u6842\u6797\u673a\u573a\u540e\u76f4\u63a5\u5df4\u58eb\u5230\u9633\u6714 (RM15)\uff0c\u4e0d\u5728\u6842\u6797\u505c\u7559\u3002', tip:'\u9633\u6714\u4f4f\u5bbf\u4fbf\u5b9c80%\uff0c\u897f\u8857\u65c1\u9752\u65c5\u5e8a\u4f4dRM40\u3002'},\r\n          {title:'\u6f13\u6c5f\u7af9\u7b4f (\u5174\u576a\u6bb5)', desc:'\u53ea\u73a9\u5174\u576a\u2192\u4e5d\u9a6c\u753b\u5c71\u6bb5 (RM30\/\u4eba)\uff0c\u6bd4\u5168\u7a0b\u4fbf\u5b9cRM150\u3002', tip:'20\u5143\u80cc\u666f\u5728\u5174\u576a\u8001\u5be8\u5c71\uff0c\u514d\u8d39\u722c\u4e0a\u53bb\u62cd\u7167\u3002'},\r\n          {title:'\u9047\u9f99\u6cb3\u81ea\u7531\u9a91\u884c', desc:'\u79df\u7535\u52a8\u8f66\u4e00\u5929RM30\uff0c\u6cbf\u9047\u9f99\u6cb3\u9a91\u884c+\u514d\u8d39\u8df3\u6c34\u62cd\u7167\u3002', tip:'\u4e0d\u8981\u53c2\u52a0\u8ddf\u56e2\u6f02\u6d41 (RM200)\uff0c\u81ea\u5df1\u9a91\u884c+\u6e38\u6cf3\u66f4\u723d\u3002'},\r\n          {title:'\u9f99\u810a\u68af\u7530 (\u5927\u5be8)', desc:'\u5750\u73ed\u8f66\u53bb\u5927\u5be8 (RM20)\uff0c\u4f4f\u5be8\u5b50\u91cc\u6c11\u5bbf (RM50\/\u665a)\u3002', tip:'\u5927\u5be8\u6bd4\u5e73\u5b89\u5be8\u5c1160%\u6e38\u5ba2\uff0c\u666f\u8272\u4e00\u6837\u3002'},\r\n          {title:'\u5341\u91cc\u753b\u5eca+\u897f\u8857', desc:'\u6700\u540e\u4e00\u5929\u9a91\u884c\u5341\u91cc\u753b\u5eca\u5168\u7a0b\uff0c\u508d\u665a\u56de\u897f\u8857\u5403\u5564\u9152\u9c7c\u3002', tip:'\u5564\u9152\u9c7c\u522b\u70b9\u666f\u533a\u9910\u9986 (RM60\/\u4efd)\uff0c\u897f\u8857\u5c3e\u90e8\"\u5218\u5e08\u5085\" RM30\u3002'},\r\n          {title:'\u8fd4\u7a0b', desc:'\u9633\u6714\u2192\u6842\u6797\u673a\u573a\u5927\u5df4RM15\u3002'}\r\n        ]\r\n      }\r\n    ]\r\n  },\r\n\r\n  {\r\n    id: 'thailand',\r\n    num: '02',\r\n    nameCn: '\u6cf0\u56fd',\r\n    nameEn: 'Thailand',\r\n    visa: '\u514d\u7b7e (\u505c\u7559\u4e0d\u8d85\u8fc760\u5929)',\r\n    bestTime: '11\u6708-2\u6708 (\u51c9\u5b63)',\r\n    currency: 'RM1 \u2248 7.5 THB',\r\n    routes: [\r\n      {\r\n        id: 'bkk-cnx',\r\n        name: '\u66fc\u8c37+\u6e05\u8fc8',\r\n        desc: '\u6cf0\u56fd\u7ecf\u5178\u53cc\u57ce\u3002\u66fc\u8c37\u591c\u751f\u6d3b+\u6e05\u8fc8\u53e4\u57ce\u6162\u751f\u6d3b\u7684\u5b8c\u7f8e\u7ec4\u5408\u3002',\r\n        flightCost: 320,\r\n        flightTime: '~2.25\u5c0f\u65f6',\r\n        baseDays: 6,\r\n        dailyCost: { hostel: 100, budget: 160, mid: 260 },\r\n        scores: { budget: 8, novelty: 5, ease: 10, chill: 9 },\r\n        tags: [{label:'\u6700\u4fbf\u5b9c\u673a\u7968',type:'budget'},{label:'\u57fa\u5efa\u6210\u719f',type:'cool'},{label:'\u5403\u559d\u73a9\u4e50',type:'hot'}],\r\n        places: [\r\n          {name:'\u5927\u7687\u5bab+\u5367\u4f5b\u5bfa', desc:'\u66fc\u8c37\u5fc5\u6253\u5361\uff0c\u5efa\u8bae\u65e9\u4e0a\u53bb (\u70ed)\u3002\u7a7f\u8fc7\u819d\u88e4+\u906e\u80a9\u3002'},\r\n          {name:'Chatuchak\u5468\u672b\u5e02\u573a', desc:'\u4e16\u754c\u6700\u5927\u9732\u5929\u5e02\u96c6\uff0c1.5\u4e07\u644a\u4f4d\u3002'},\r\n          {name:'\u8003\u5c71\u8def', desc:'\u80cc\u5305\u5ba2\u5723\u5730\uff0c\u591c\u751f\u6d3b+\u6309\u6469\u5929\u5802\u3002'},\r\n          {name:'\u6e05\u8fc8\u53e4\u57ce+\u5468\u65e5\u5e02\u573a', desc:'\u6bd4\u66fc\u8c37\u60a0\u95f2\uff0c\u7269\u4ef7\u66f4\u4f4e\u3002'},\r\n          {name:'\u6e05\u8fc8\u5927\u8c61\u4fdd\u62a4\u8425', desc:'\u4e0d\u9a91\u5927\u8c61\uff0c\u53ea\u662f\u4e92\u52a8+\u5582\u98df (RM150-200\/\u4eba)\u3002'},\r\n          {name:'Doi Suthep\u53cc\u9f99\u5bfa', desc:'\u6e05\u8fc8\u6700\u795e\u5723\u7684\u5c71\u9876\u5bfa\u5e99\u3002'}\r\n        ],\r\n        itineraryMain: [\r\n          {title:'\u62b5\u8fbe\u66fc\u8c37', desc:'\u5165\u4f4f\u8003\u5c71\u8def\u6216Sukhumvit\u533a\u3002\u665a\u4e0a\u8239\u9762+\u6309\u6469 (RM30\/\u5c0f\u65f6)\u3002'},\r\n          {title:'\u5927\u7687\u5bab+\u662d\u62ab\u8036\u6cb3', desc:'\u5927\u7687\u5bab+\u5367\u4f5b\u5bfa+\u9ece\u660e\u5bfa\uff0c\u508d\u665a\u4e58\u8239\u6e38\u6cb3+Asiatique\u3002'},\r\n          {title:'\u5468\u672b\u5e02\u573a+Sky Bar', desc:'Chatuchak\u6216Terminal 21\uff0c\u665a\u4e0aSky Bar\u4fef\u77b0\u591c\u666f\u3002'},\r\n          {title:'\u98de\u6e05\u8fc8', desc:'\u65e9\u73ed\u673a\u98de\u6e05\u8fc8 (RM150)\uff0c\u4e0b\u5348\u5854\u4f69\u95e8+\u53e4\u57ce\u5bfa\u5e99\u3002'},\r\n          {title:'\u5927\u8c61\u8425+\u5468\u65e5\u591c\u5e02', desc:'\u4e0a\u5348\u5927\u8c61\u8425\uff0c\u665a\u4e0a\u5468\u65e5Walking Street\u626b\u5403\u3002'},\r\n          {title:'\u6e05\u8fc8\u2192\u8fd4\u7a0b', desc:'\u4e0a\u5348Doi Suthep\u53cc\u9f99\u5bfa\uff0c\u4e0b\u5348\u98de\u56deKL\u3002'}\r\n        ],\r\n        itinerarySmart: [\r\n          {title:'\u62b5\u8fbe\u66fc\u8c37', desc:'\u4f4fPhra Khanong\u6216Onnut (BTS\u5730\u94c1\u6cbf\u7ebf\uff0c\u6bd4Sukhumvit\u4fbf\u5b9c40%)\u3002\u7b2c\u4e00\u665a\u4e0d\u53bb\u8003\u5c71\u8def (\u592a\u6e38\u5ba2)\uff0c\u53bbKhlong Toei\u591c\u5e02\u5403\u672c\u5730\u4eba\u5c0f\u5403\u3002', tip:'\u673a\u573a\u5230\u5e02\u533a\u5750ARL\u673a\u573a\u5feb\u7ebfRM6\uff0c\u6bd4Grab\u4fbf\u5b9c70%\u3002'},\r\n          {title:'\u5927\u7687\u5bab\u51c9\u65e9\u4e0a', desc:'7\u70b9\u5f00\u95e8\u5c31\u5230\uff0c10\u70b9\u79bb\u5f00\u907f\u5f00\u65c5\u6e38\u56e2+\u66b4\u6652\u3002\u4e0b\u5348Wat Pho\u6309\u6469\u5b66\u6821\u505a\u6cf0\u5f0f\u6309\u6469 (RM65 vs Spa RM150)\u3002', tip:'Wat Pho\u662f\u6cf0\u5f0f\u6309\u6469\u53d1\u6e90\u5730\uff0c\u4ef7\u683c\u4fbf\u5b9c\u8d28\u91cf\u66f4\u9ad8\u3002'},\r\n          {title:'\u672c\u5730\u4eba\u6a21\u5f0f', desc:'\u8df3\u8fc7Chatuchak (\u592a\u6324)\uff0c\u53bbJJ Green\u591c\u5e02+The COMMONS\u8857\u533a (\u672c\u5730\u5e74\u8f7b\u4eba\u805a\u96c6\u5730)\u3002', tip:'\u591c\u5e02\u8981\u7b49\u665a\u4e0a7\u70b9\u540e\u53bb\uff0c\u907f\u5f00\u6b63\u5348\u3002'},\r\n          {title:'\u98de\u6e05\u8fc8 (\u5ec9\u822a)', desc:'\u9009AirAsia\/NokAir\/Thai Lion\u591c\u822a (RM80\u4e00\u7a0b)\uff0c\u7701\u4e00\u665a\u9152\u5e97\u3002', tip:'\u6e05\u8fc8\u53e4\u57ce\u5185\u4f4f\u5bbfRM50\/\u665a\u5c31\u6709\u597d\u9009\u62e9\u3002'},\r\n          {title:'\u6e05\u8fc8\u672c\u5730\u73a9\u6cd5', desc:'\u653e\u5f03Elephant Sanctuary (RM150)\uff0c\u6539\u53bb\u514d\u8d39\u7684\u7d20\u8d34\u5c71\u5f92\u6b65+Wat Umong\u68ee\u6797\u5bfa\u5e99\u3002', tip:'\u5927\u8c61\u8425\u662f\u89c2\u5149\u5316\u4ea7\u7269\uff0c\u53bb\u6e05\u8fc8\u5927\u5b66\u80cc\u540e\u7684\u5c71\u5f92\u6b65\u66f4\u5730\u9053\u3002'},\r\n          {title:'\u5b81\u66fc\u8def+\u8fd4\u7a0b', desc:'\u5b81\u66fc\u8def (Nimman) \u6587\u827a\u5496\u5561\u5e97\u6bd4\u53e4\u57ce\u4fbf\u5b9c+\u5730\u9053\u3002', tip:'\u6e05\u8fc8\u673a\u573a\u5c31\u5728\u5e02\u533a\uff0c\u56de\u7a0b\u51fa\u53d1\u4e0d\u614c\u5f20\u3002'}\r\n        ]\r\n      },\r\n      {\r\n        id: 'phuket-krabi',\r\n        name: '\u666e\u5409+\u7532\u7c73',\r\n        desc: '\u5b89\u8fbe\u66fc\u6d77\u5c9b\u5c7f\u5929\u5802\u3002\u871c\u6708+\u6d77\u5c9b\u8df3\u5c9b\u7684\u6700\u4f73\u9009\u62e9\u3002',\r\n        flightCost: 450,\r\n        flightTime: '~2.5\u5c0f\u65f6',\r\n        baseDays: 6,\r\n        dailyCost: { hostel: 130, budget: 200, mid: 350 },\r\n        scores: { budget: 6, novelty: 6, ease: 8, chill: 10 },\r\n        tags: [{label:'\u6d77\u5c9b\u5929\u5802',type:'cool'},{label:'\u9002\u5408\u8eba\u5e73',type:'hot'},{label:'\u6f5c\u6c34\u6d6e\u6f5c',type:'budget'}],\r\n        places: [\r\n          {name:'PP\u5c9b\u8df3\u5c9b\u4e00\u65e5\u6e38', desc:'\u300a\u6d77\u6ee9\u300b\u53d6\u666f\u5730\u739b\u96c5\u6e7e\uff0cRM150\u542b\u8239+\u5348\u9910\u3002'},\r\n          {name:'\u7687\u5e1d\u5c9b', desc:'\u6bd4PP\u5c9b\u4eba\u5c11\u6c34\u66f4\u6e05\u7684\u6d6e\u6f5c\u5929\u5802\u3002'},\r\n          {name:'\u7532\u7c73\u56db\u5c9b\u6e38', desc:'Poda Island\u3001Chicken Island\u3001Tup Island\u3001Phra Nang\u3002'},\r\n          {name:'\u6500\u7259\u6e7e (007\u5c9b)', desc:'\u5580\u65af\u7279\u5c9b\u5c7f+\u6d77\u4e0a\u72ec\u6728\u821f\u3002'},\r\n          {name:'\u82ad\u4e1c\u6d77\u6ee9\u591c\u751f\u6d3b', desc:'Bangla Road\u662f\u6cf0\u56fd\u5357\u90e8\u591c\u5e97\u4e2d\u5fc3\u3002'}\r\n        ],\r\n        itineraryMain: [\r\n          {title:'\u62b5\u8fbe\u666e\u5409', desc:'\u5165\u4f4f\u82ad\u4e1c\u6d77\u6ee9 (Patong)\u3002\u665a\u4e0aBangla Road\u591c\u751f\u6d3b\u3002'},\r\n          {title:'PP\u5c9b+\u7687\u5e1d\u5c9b\u8df3\u5c9b', desc:'\u62a51\u65e5\u6e38\uff0c\u739b\u96c5\u6e7e+\u7334\u5b50\u6d77\u6ee9+\u6d6e\u6f5c\u3002'},\r\n          {title:'\u6500\u7259\u6e7e007\u5c9b', desc:'\u5750\u957f\u5c3e\u8239+\u6d77\u4e0a\u72ec\u6728\u821f\u3002'},\r\n          {title:'\u666e\u5409\u2192\u7532\u7c73', desc:'\u4e58\u82392\u5c0f\u65f6\u5230\u7532\u7c73Aonang\u3002'},\r\n          {title:'\u7532\u7c73\u56db\u5c9b\u6e38', desc:'\u6700\u7f8e\u6d77\u6e7ePhra Nang\u516c\u4e3b\u6d1e\u3002'},\r\n          {title:'\u8fd4\u7a0b', desc:'\u7532\u7c73\u673a\u573a\u98de\u66fc\u8c37\u8f6c\u56deKL\u3002'}\r\n        ],\r\n        itinerarySmart: [\r\n          {title:'\u76f4\u98de\u7532\u7c73', desc:'\u8df3\u8fc7\u666e\u5409\u76f4\u98de\u7532\u7c73 (\u673a\u7968\u4e00\u6837)\uff0c\u4f4fAonang\u6d77\u6ee9\u3002', tip:'\u7532\u7c73\u7269\u4ef7\u6bd4\u666e\u5409\u4fbf\u5b9c30%\uff0c\u6d77\u5c9b\u666f\u8272\u4e00\u6837\u7f8e\u3002'},\r\n          {title:'\u56db\u5c9b\u6e38 (\u672c\u5730\u8239)', desc:'\u7801\u5934\u73b0\u573a\u4e70\u7968RM45 (\u7f51\u4e0aRM75)\uff0c\u8df3\u8fc7\u4e2d\u4ecb\u3002', tip:'\u4e0b\u53481\u70b9\u51fa\u53d1\u6bd4\u4e0a\u53488\u70b9\u7684\u56e2\u5c1160%\u6e38\u5ba2\u3002'},\r\n          {title:'\u6500\u5ca9+\u514d\u8d39\u6d77\u6ee9', desc:'Railay Beach\u6500\u5ca9 (RM80\/\u5929\u542b\u88c5\u5907) \u6216\u514d\u8d39\u73a9\u6c99\u3002', tip:'Railay\u53ea\u80fd\u5750\u957f\u5c3e\u8239\u5230 (RM10\u5355\u7a0b)\uff0c\u662f\u7532\u7c73\u6700\u7f8e\u6d77\u6ee9\u3002'},\r\n          {title:'PP\u5c9b day trip', desc:'\u5750\u9ad8\u901f\u8239\u4e00\u65e5\u5f80\u8fd4 (RM85)\uff0c\u4e0d\u5728PP\u5c9b\u4f4f (PP\u4f4f\u5bbf\u8d352\u500d)\u3002', tip:'PP\u5c9b\u739b\u96c5\u6e7e\u8981\u95e8\u7968RM60\uff0c\u53ef\u4ee5\u53ea\u770b\u5916\u666f\u62cd\u7167\u3002'},\r\n          {title:'\u6e29\u6cc9\u7011\u5e03+\u8001\u864e\u6d1e', desc:'\u5185\u9646\u4e00\u65e5\u6e38\uff0cKlong Thom\u7fe1\u7fe0\u6c60\u6e29\u6cc9+\u8001\u864e\u6d1e\u5e99\u3002', tip:'\u672c\u5730\u79df\u6469\u6258RM20\/\u5929\uff0c\u6bd4\u5305\u8f66\u4fbf\u5b9c90%\u3002'},\r\n          {title:'\u8fd4\u7a0b', desc:'\u7532\u7c73\u673a\u573a\u98deKL\u6216\u8f6c\u66fc\u8c37\u3002'}\r\n        ]\r\n      }\r\n    ]\r\n  },\r\n\r\n  {\r\n    id: 'bali',\r\n    num: '03',\r\n    nameCn: '\u5df4\u5398\u5c9b',\r\n    nameEn: 'Bali',\r\n    visa: '\u843d\u5730\u7b7e (~RM150) \u6216 e-VOA\uff0c\u505c\u755930\u5929',\r\n    bestTime: '4-10\u6708 (\u5e72\u5b63)',\r\n    currency: 'RM1 \u2248 3,800 IDR',\r\n    routes: [\r\n      {\r\n        id: 'south-ubud',\r\n        name: '\u5357\u90e8+\u4e4c\u5e03',\r\n        desc: '\u7ecf\u5178\u5df4\u5398\u884c\u7a0b\uff1a\u6d77\u6ee9Beach Club+\u68af\u7530\u745c\u4f3d\uff0cIG\u6253\u5361\u5929\u5802\u3002',\r\n        flightCost: 550,\r\n        flightTime: '~3\u5c0f\u65f6',\r\n        baseDays: 6,\r\n        dailyCost: { hostel: 130, budget: 200, mid: 350 },\r\n        scores: { budget: 6, novelty: 6, ease: 7, chill: 10 },\r\n        tags: [{label:'\u6d77\u5c9b\u5ea6\u5047',type:'hot'},{label:'Villa\u5929\u5802',type:'cool'},{label:'\u9002\u5408\u8eba\u5e73',type:'budget'}],\r\n        places: [\r\n          {name:'Ubud \u4e4c\u5e03\u00b7\u68af\u7530\u745c\u4f3d', desc:'\u827a\u672f\u5bb6\u5c0f\u9547\uff0c\u68af\u7530\u3001\u745c\u4f3d\u8bfe\u3001\u7f51\u7ea2\u5496\u5561\u9986\u90fd\u5728\u8fd9\u3002'},\r\n          {name:'Seminyak\/Canggu', desc:'\u51b2\u6d6a\u6d77\u6ee9+\u6d77\u8fb9Beach Club (La Brisa, Finns)\u3002'},\r\n          {name:'Nusa Penida\u4e00\u65e5\u6e38', desc:'Kelingking Beach (\u6050\u9f99\u80cc)\u3001\u5929\u4f7f\u6e7e\u3002'},\r\n          {name:'Tanah Lot \u6d77\u795e\u5e99', desc:'\u6d77\u4e0a\u5bfa\u5e99\uff0c\u65e5\u843d\u65f6\u5206\u6700\u7f8e\u3002'},\r\n          {name:'\u4e4c\u9c81\u74e6\u56fe\u65ad\u5d16+Kecak\u821e', desc:'\u770b\u60ac\u5d16+\u7334\u5b50+\u4f20\u7edf\u706b\u821e\u8868\u6f14\u3002'}\r\n        ],\r\n        itineraryMain: [\r\n          {title:'\u62b5\u8fbe\u00b7\u5165\u4f4fVilla', desc:'\u5230Denpasar\u76f4\u63a5\u524d\u5f80Seminyak\/Canggu\u30027-10\u4eba\u8ba2\u4e00\u680bVilla\u8d85\u5212\u7b97\u3002'},\r\n          {title:'Seminyak\u6d77\u6ee9\u65e5', desc:'\u6e38\u6cf3\u3001\u6652\u592a\u9633\uff0c\u4e0b\u5348Beach Club\u8e66\u8fea\u770b\u65e5\u843d\u3002'},\r\n          {title:'\u79fb\u5e08\u4e4c\u5e03', desc:'\u6362Villa\u5230\u4e4c\u5e03\u3002\u4e0b\u5348\u68af\u7530\u5496\u5561+\u745c\u4f3d\u8bfe\u3002'},\r\n          {title:'Nusa Penida\u8df3\u5c9b', desc:'\u8239\u7968\u4e00\u65e5\u6e38 (RM200)\uff0c\u770b\u6050\u9f99\u80cc+\u5929\u4f7f\u6e7e\u3002'},\r\n          {title:'\u4e4c\u5e03\u5468\u8fb9+\u7f51\u7ea2\u6253\u5361', desc:'Tegenungan\u7011\u5e03\u3001\u7f51\u7ea2\u79cb\u5343\u3001\u5149\u67f1\u7011\u5e03\u3002'},\r\n          {title:'\u5357\u90e8\u51b2\u6d6a+Spa', desc:'\u56de\u5357\u90e8\u51b2\u6d6a\u8bfe (RM150)\uff0c\u4e0b\u5348\u5168\u8eabSPA (RM80\/2\u5c0f\u65f6)\u3002'},\r\n          {title:'\u8fd4\u7a0b', desc:'\u673a\u573a\u8d2d\u7269\uff0c\u98de\u56deKL\u3002'}\r\n        ],\r\n        itinerarySmart: [\r\n          {title:'\u62b5\u8fbe\u00b7\u4f4fCanggu\u4e0d\u4f4fSeminyak', desc:'Canggu\u4f4f\u5bbf\u4fbf\u5b9c40%\u4e14\u66f4\u6587\u827a\u3002\u673a\u573aGrab\/Gojek\u5230Canggu RM40\u3002', tip:'\u575a\u51b3\u4e0d\u7528\u673a\u573a\u51fa\u79df\u8f66 (RM100+)\uff0c\u7528Gojek\/Grab\u3002'},\r\n          {title:'Echo Beach\u51b2\u6d6a\u65e5', desc:'Echo Beach\u51b2\u6d6a\u8bfe (RM60\/\u5c0f\u65f6vs\u6d77\u6ee9\u8fb9RM150)\u3002\u6d77\u8fb9Warung\u5348\u9910 (RM10\u4e00\u4efd)\u3002', tip:'Warung\u662f\u672c\u5730\u5927\u6392\u6863\uff0c\u6bd4Beach Club\u4fbf\u5b9c10\u500d\u3002'},\r\n          {title:'\u5305\u8f66\u53bb\u4e4c\u5e03', desc:'7-10\u4eba\u5305\u8f66\u4e00\u5929 (RM200)\uff0c\u6cbf\u8def\u505cTegenungan\u7011\u5e03\u514d\u8d39\u73a9\u6c34\u3002', tip:'\u5df4\u5398\u666f\u70b9\u4e4b\u95f4\u8ddd\u79bb\u8fdc\uff0c\u4e0d\u5305\u8f66Grab\u4f1a\u8d35\u5230\u6000\u7591\u4eba\u751f\u3002'},\r\n          {title:'Nusa Penida (\u8ddf\u8239)', desc:'\u7801\u5934\u4e70\u5957\u7968 (RM150)\uff0c\u8df3\u8fc7\u4e2d\u4ecb (RM250)\u3002', tip:'\u4f4f\u4e4c\u5e03\u7684\u8bdd\u4e5f\u53ef\u4ee5\u5355\u72ec\u8df3\u8fc7\u8fd9\u4e2a (\u6765\u56de6\u5c0f\u65f6\u8f66\u7a0b\u4f24\u8eab)\u3002'},\r\n          {title:'\u4e4c\u5e03\u514d\u8d39\u9879\u76ee', desc:'\u68af\u7530\u53ea\u770bTegallalang\u514d\u8d39\u533a\uff0c\u4e0b\u5348\u7334\u6797RM18\u3002\u5496\u5561\u5e97\u4efb\u9009 (\u4eba\u5747RM15)\u3002', tip:'\u7f51\u7ea2\u79cb\u5343\u90fd\u662f\u5546\u4e1a\u5316\u4ea7\u7269 (RM80\/\u6b21)\uff0c\u8df3\u8fc7\u6ca1\u635f\u5931\u3002'},\r\n          {title:'\u4e4c\u9c81\u74e6\u56fe+\u672c\u5730\u9910', desc:'\u6700\u4fbf\u5b9c\u7684Kecak\u821e\u95e8\u7968RM30\u3002\u665a\u9910\u53bbJimbaran\u6d77\u6ee9\u70e4\u9c7c\u9910 (RM50\/\u4ebavs Seminyak RM150)\u3002', tip:'Jimbaran\u6c99\u6ee9\u70e4\u9c7c\u662f\u5df4\u5398\u6700\u597d\u5403\u7684\u6d77\u9c9c\u9910\u4e4b\u4e00\u3002'},\r\n          {title:'\u8fd4\u7a0b', desc:'\u6700\u540e\u4e00\u5929Spa\u4e00\u4e0b\uff0c\u53bb\u673a\u573a\u3002'}\r\n        ]\r\n      },\r\n      {\r\n        id: 'nusa-deep',\r\n        name: 'Nusa\u7fa4\u5c9b\u6df1\u5ea6',\r\n        desc: '\u8df3\u8fc7\u6e38\u5ba2\u5bc6\u96c6\u533a\uff0c\u6df1\u5ea6\u63a2\u7d22Nusa Penida+Lembongan\uff0c\u7eaf\u51c0\u6d77\u5c9b\u3002',\r\n        flightCost: 550,\r\n        flightTime: '~3\u5c0f\u65f6',\r\n        baseDays: 5,\r\n        dailyCost: { hostel: 120, budget: 180, mid: 320 },\r\n        scores: { budget: 7, novelty: 9, ease: 5, chill: 10 },\r\n        tags: [{label:'\u5c0f\u4f17\u5c9b',type:'hot'},{label:'\u6d6e\u6f5c\u5929\u5802',type:'cool'},{label:'\u7eaf\u51c0\u81ea\u7136',type:'budget'}],\r\n        places: [\r\n          {name:'Kelingking Beach (\u6050\u9f99\u80cc)', desc:'Nusa Penida\u6700\u6709\u540d\u7684\u5d16\u9876view\u3002'},\r\n          {name:'Diamond Beach', desc:'\u4e1c\u5cb8\u94bb\u77f3\u6d77\u6ee9\uff0c\u60ac\u5d16+\u767d\u6c99\u3002'},\r\n          {name:'Manta Point', desc:'\u4e0emanta\u9b3c\u8760\u9b5f\u4e00\u8d77\u6d6e\u6f5c\u3002'},\r\n          {name:'Lembongan Mushroom Bay', desc:'\u8611\u83c7\u6e7e\u65e5\u843d+\u6d77\u4e0a\u6469\u6258\u3002'},\r\n          {name:'Mangrove Forest', desc:'\u7ea2\u6811\u6797\u5212\u76ae\u8247\u3002'}\r\n        ],\r\n        itineraryMain: [\r\n          {title:'\u62b5\u8fbe\u00b7\u4e58\u8239\u81f3Nusa Penida', desc:'\u673a\u573a\u2192Sanur\u7801\u5934\u2192Penida (\u8239\u7a0b40\u5206\u949f)\u3002'},\r\n          {title:'\u897f\u5cb8\u7ecf\u5178\u4e09\u666f', desc:'Kelingking Beach+Broken Beach+Angel Billabong\u3002'},\r\n          {title:'\u4e1c\u5cb8+\u6d6e\u6f5c', desc:'Diamond Beach + Atuh Beach + Manta Point\u6d6e\u6f5c\u3002'},\r\n          {title:'Penida\u2192Lembongan', desc:'\u77ed\u9014\u8239\u8fc7Lembongan\u5c9b\uff0c\u6d77\u8fb9\u5ea6\u5047\u3002'},\r\n          {title:'Mushroom Bay+\u8fd4\u7a0b', desc:'\u6700\u540e\u4e00\u5929\u8611\u83c7\u6e7e\uff0c\u4e0b\u5348\u56de\u673a\u573a\u3002'}\r\n        ],\r\n        itinerarySmart: [\r\n          {title:'Sanur\u76f4\u63a5\u51fa\u53d1', desc:'\u673a\u573aGrab\u5230Sanur (RM30)\uff0c\u4f4fSanur\u8fc7\u4e00\u665a (RM80\/\u665a\u53cc\u4eba)\uff0c\u7b2c\u4e8c\u5929\u5927\u65e9\u4e58\u7b2c\u4e00\u73ed\u8239\u3002', tip:'\u7b2c\u4e00\u73ed\u8239 (7:30am) \u7968\u4ef7\u6bd4\u4e2d\u5348\u4fbf\u5b9c40%\u4e14\u6d77\u51b5\u6700\u7a33\u3002'},\r\n          {title:'\u897f\u5cb8\u81ea\u884c\u79df\u6469\u6258', desc:'\u7801\u5934\u79df\u6469\u6258RM30\/\u5929 (\u8ddf\u56e2RM150)\uff0c\u81ea\u7531\u505c\u8f66\u62cd\u7167\u3002', tip:'Penida\u8def\u51b5\u5dee\uff0c\u4f1a\u6469\u6258\u624d\u79df\uff0c\u5426\u5219\u5305\u8f66 (RM200\/\u5929\/4\u4eba)\u3002'},\r\n          {title:'\u4e1c\u5cb8+\u672c\u5730\u6d6e\u6f5c', desc:'Atuh Beach\u514d\u8d39 (\u5929\u4f7f\u6e7e\u6536\u95e8\u7968RM6)\uff0c\u6751\u6c11\u5e26\u6d6e\u6f5cRM40 vs \u8ddf\u56e2RM150\u3002', tip:'\u4e1c\u5cb8Diamond Beach\u8981\u8d70\u60ac\u5d16\u68af\u5b50\uff0c\u4e0b\u53484\u70b9\u5149\u7ebf\u6700\u597d\u3002'},\r\n          {title:'\u79fb\u5e08Lembongan', desc:'\u4e24\u5c9b\u4e4b\u95f4\u7684\u5feb\u8239RM10\uff0c\u6bd4\u5b98\u65b9\u8239\u4fbf\u5b9c60%\u3002', tip:'Lembongan\u6bd4Penida\u7269\u4ef7\u4f4e30%\uff0c\u4f4f\u5bbf\u9009\u62e9\u66f4\u591a\u3002'},\r\n          {title:'Mushroom Bay+\u8fd4\u7a0b', desc:'\u65e9\u4e0a\u6d77\u8fb9\u65e5\u843d+\u65e9\u5348\u9910 (RM20\/\u4efd)\uff0c\u4e2d\u5348\u56deSanur\u8f6c\u673a\u573a\u3002', tip:'\u673a\u573a\u9644\u8fd1Kuta\u8fc7\u591c\u4e0d\u5212\u7b97\uff0c\u76f4\u63a5\u56de\u673a\u573a\u9152\u5e97\u4f11\u606f\u3002'}\r\n        ]\r\n      }\r\n    ]\r\n  },\r\n\r\n  {\r\n    id: 'vietnam',\r\n    num: '04',\r\n    nameCn: '\u8d8a\u5357',\r\n    nameEn: 'Vietnam',\r\n    visa: '\u514d\u7b7e (\u505c\u755930\u5929\u5185)',\r\n    bestTime: '10-12\u6708 (\u5e72\u5b63)',\r\n    currency: 'RM1 \u2248 5,800 VND',\r\n    routes: [\r\n      {\r\n        id: 'hanoi-halong',\r\n        name: '\u6cb3\u5185+\u4e0b\u9f99\u6e7e',\r\n        desc: '\u5317\u8d8a\u7ecf\u5178\uff1a\u5343\u5e74\u53e4\u90fd+UNESCO\u4e16\u754c\u9057\u4ea7\u4e0b\u9f99\u6e7e\u90ae\u8f6e\u3002',\r\n        flightCost: 550,\r\n        flightTime: '~3.5\u5c0f\u65f6',\r\n        baseDays: 6,\r\n        dailyCost: { hostel: 80, budget: 130, mid: 220 },\r\n        scores: { budget: 9, novelty: 7, ease: 7, chill: 7 },\r\n        tags: [{label:'\u7269\u4ef7\u6700\u4f4e',type:'budget'},{label:'\u4e16\u754c\u9057\u4ea7',type:'hot'},{label:'\u5496\u5561\u5929\u5802',type:'cool'}],\r\n        places: [\r\n          {name:'\u4e0b\u9f99\u6e7e\u6e38\u8239', desc:'\u4e00\u65e5\u6216\u4e24\u65e5\u90ae\u8f6e (RM200-600)\uff0cUNESCO\u4e16\u754c\u9057\u4ea7\u3002'},\r\n          {name:'\u6cb3\u5185\u4e09\u5341\u516d\u884c\u8001\u8857', desc:'\u8ff7\u5bab\u5f0f\u8001\u57ce\u533a\uff0c\u5403Bun Cha\u3001\u86cb\u5496\u5561\u3002'},\r\n          {name:'\u8fd8\u5251\u6e56+\u6c34\u4e0a\u6728\u5076\u5267', desc:'\u6cb3\u5185\u5e02\u4e2d\u5fc3+\u4f20\u7edf\u6c34\u4e0a\u6728\u5076\u5267\u3002'},\r\n          {name:'\u5b81\u5e73 Trang An', desc:'\"\u9646\u4e0a\u4e0b\u9f99\u6e7e\"\uff0c\u5212\u8239\u7a7f\u8fc7\u6c34\u6d1e\u548c\u7c73\u7530\u3002'},\r\n          {name:'Sapa\u6c99\u575d\u68af\u7530', desc:'\u52a02\u5929\u53bb\u8d8a\u5357\u5317\u90e8\u5c71\u533a\u3002'},\r\n          {name:'\u706b\u8f66\u8857 (Train Street)', desc:'\u5496\u5561\u9986\u6328\u7740\u706b\u8f66\u8f68\u9053\u3002'}\r\n        ],\r\n        itineraryMain: [\r\n          {title:'\u62b5\u8fbe\u6cb3\u5185', desc:'\u5165\u4f4f\u8001\u57ce\u533a\u3002\u508d\u665a\u8fd8\u5251\u6e56+Bia Hoi\u5564\u9152\u8857\u3002'},\r\n          {title:'\u6cb3\u5185\u6587\u5316\u6e38', desc:'\u4e09\u5341\u516d\u884c+\u80e1\u5fd7\u660e\u9675+\u6c34\u4e0a\u6728\u5076\u5267\u3002'},\r\n          {title:'\u4e0b\u9f99\u6e7e2\u65e5\u90ae\u8f6e', desc:'\u4e0a\u8239\u6e38\u89c8\uff0c\u8239\u4e0a\u8fc7\u591c\u770b\u65e5\u843d+\u65e5\u51fa\u3002'},\r\n          {title:'\u4e0b\u9f99\u6e7e\u2192\u5b81\u5e73', desc:'\u56de\u6cb3\u5185\u540e\u5305\u8f66\u53bb\u5b81\u5e73 Trang An\u5212\u8239+Mua Cave\u3002'},\r\n          {title:'\u8fd4\u6cb3\u5185+\u706b\u8f66\u8857', desc:'\u6587\u5e99\u3001\u706b\u8f66\u8857\u5496\u5561\uff0c\u665a\u9910\u9ad8\u7ea7\u8d8a\u83dc\u3002'},\r\n          {title:'\u8fd4\u7a0b', desc:'Dong Xuan\u5e02\u573a\u4e70\u4f34\u624b\u793c\u3002'}\r\n        ],\r\n        itinerarySmart: [\r\n          {title:'\u62b5\u8fbe\u6cb3\u5185', desc:'\u673a\u573a\u5750 86\u8def\u516c\u4ea4 RM2 \u76f4\u8fbe\u8001\u57ce (Grab\u8981RM35)\u3002\u4f4f\u8001\u57ce\u533a\u65c1\u7684Hang Bac\u533a\u57df (\u6bd4Old Quarter\u4e2d\u5fc3\u4fbf\u5b9c30%)\u3002', tip:'\u6cb3\u5185\u6c47\u73871\u9a6c\u5e01=5800\u76fe\uff0c\u5728ATM\u53d6\u73b0\u91d1\u6700\u5212\u7b97\uff0c\u8857\u8fb9\u6362\u94b1\u5e97\u6709\u8bc8\u9a97\u3002'},\r\n          {title:'\u6b65\u884c\u6e38\u8001\u57ce', desc:'\u6cb3\u5185\u8001\u57ce\u5168\u90e8\u6b65\u884c (1km\u00d71km)\u3002\u86cb\u5496\u5561\u627eGiang Cafe (\u539f\u521b\u8001\u5e97)\u3002', tip:'Cha Ca\u8001\u5e97RM12 vs \u540c\u6b3e\u9910\u5385RM35\u3002\u6240\u6709\u8457\u540d\u5c0f\u5403\u90fd\u5728\u8001\u57ce\u65b9\u5706500\u7c73\u5185\u3002'},\r\n          {title:'\u4e0b\u9f99\u6e7e\u8ddf\u56e21\u65e5\u6e38', desc:'\u8ddf\u56e21\u65e5\u6e38RM150 vs \u90ae\u8f6e2\u65e5RM600\u30021\u65e5\u5c31\u591f\u770b\u666f\u8272\u3002', tip:'\u7f51\u4e0aKlook\u6bd4\u7ebf\u4e0b\u65c5\u884c\u793e\u8d3540%\uff0c\u4f4f\u9752\u65c5\u524d\u53f0\u95ee\u6700\u4fbf\u5b9c\u3002'},\r\n          {title:'\u5b81\u5e73\u81ea\u7531\u884c', desc:'\u6cb3\u5185\u706b\u8f66\u7ad9\u5750\u706b\u8f662\u5c0f\u65f6\u5230\u5b81\u5e73 (RM15) vs \u5305\u8f66 (RM50)\u3002\u79df\u81ea\u884c\u8f66RM20\/\u5929\u3002', tip:'\u5b81\u5e73Trang An\u548cTam Coc\u4e8c\u9009\u4e00\uff0cTrang An\u98ce\u666f\u66f4\u58ee\u9614\u3002'},\r\n          {title:'\u6cb3\u5185\u6587\u5316\u65e5', desc:'\u80e1\u5fd7\u660e\u9675\u514d\u8d39 (\u8981\u6392\u961f)\u3002\u706b\u8f66\u8857\u5496\u5561\u9986\u70b9\u4e00\u676f\u5c31\u80fd\u5750 (RM5)\u3002', tip:'\u6587\u5e99RM5\uff0c\u6bd4\u80e1\u5fd7\u660e\u535a\u7269\u9986 (RM15) \u6027\u4ef7\u6bd4\u9ad8\u3002'},\r\n          {title:'\u8fd4\u7a0b', desc:'Dong Xuan\u5e02\u573a\u4e70Phin\u5496\u5561\u58f6+\u8d8a\u5357\u5496\u5561\u3002'}\r\n        ]\r\n      },\r\n      {\r\n        id: 'hcm-mui-ne',\r\n        name: '\u80e1\u5fd7\u660e+\u7f8e\u5948',\r\n        desc: '\u5357\u8d8a\u6fc0\u60c5\uff1a\u80e1\u5fd7\u660e\u6cd5\u5f0f\u98ce\u60c5+\u7f8e\u5948\u7ea2\/\u767d\u6c99\u4e18\u5947\u89c2\u3002',\r\n        flightCost: 380,\r\n        flightTime: '~2\u5c0f\u65f6',\r\n        baseDays: 6,\r\n        dailyCost: { hostel: 75, budget: 120, mid: 200 },\r\n        scores: { budget: 10, novelty: 8, ease: 7, chill: 7 },\r\n        tags: [{label:'\u673a\u7968\u8d85\u4fbf\u5b9c',type:'budget'},{label:'\u6c99\u4e18\u5947\u89c2',type:'hot'},{label:'\u6cd5\u5f0f\u60c5\u8c03',type:'cool'}],\r\n        places: [\r\n          {name:'\u80e1\u5fd7\u660e\u7ea2\u6559\u5802+\u90ae\u653f\u5c40', desc:'19\u4e16\u7eaa\u6cd5\u5f0f\u5efa\u7b51\u6807\u5fd7\u3002'},\r\n          {name:'\u8303\u4e94\u8001\u80cc\u5305\u5ba2\u8857', desc:'\u80e1\u5fd7\u660e\u591c\u751f\u6d3b+\u6309\u6469+\u9152\u5427\u3002'},\r\n          {name:'\u6e44\u516c\u6cb3\u4e09\u89d2\u6d32\u4e00\u65e5\u6e38', desc:'\u5750\u5c0f\u8239\u7a7f\u8fc7\u8fd0\u6cb3\u770b\u6c34\u4e0a\u5e02\u573a\u3002'},\r\n          {name:'\u7f8e\u5948\u7ea2\u6c99\u4e18+\u767d\u6c99\u4e18', desc:'\u70ed\u5e26\u7248\"\u6492\u54c8\u62c9\u6c99\u6f20\"\u3002'},\r\n          {name:'\u4ed9\u5973\u6eaa (Fairy Stream)', desc:'\u8d70\u5728\u7ea2\u8272\u6ce5\u6eaa\u91cc\u7684\u5947\u666f\u3002'},\r\n          {name:'\u6e14\u6751+\u9c7c\u8239\u65e5\u51fa', desc:'\u7f8e\u5948\u6e14\u6e2f\u65e5\u51fa\u6700\u7f8e\u3002'}\r\n        ],\r\n        itineraryMain: [\r\n          {title:'\u62b5\u8fbe\u80e1\u5fd7\u660e', desc:'\u5165\u4f4f\u7b2c\u4e00\u90e1\uff0c\u901b\u7ea2\u6559\u5802+\u90ae\u653f\u5c40+\u8303\u4e94\u8001\u8857\u3002'},\r\n          {title:'\u6e44\u516c\u6cb3\u4e09\u89d2\u6d32', desc:'1\u65e5\u56e2\u53bbCai Be\u6216Cai Rang\u6c34\u4e0a\u5e02\u573a\u3002'},\r\n          {title:'\u80e1\u5fd7\u660e\u2192\u7f8e\u5948', desc:'\u5df4\u58eb5\u5c0f\u65f6 (RM30) \u6216Sleeper Bus\u8fc7\u591c\u3002'},\r\n          {title:'\u7f8e\u5948\u6c99\u4e18+\u6e14\u6751', desc:'\u51cc\u66684\u70b9\u770b\u767d\u6c99\u4e18\u65e5\u51fa+\u7ea2\u6c99\u4e18\u65e5\u843d+\u6e14\u8239\u3002'},\r\n          {title:'\u4ed9\u5973\u6eaa+\u6d77\u6ee9', desc:'\u4ed9\u5973\u6eaa\u5f92\u6b65+\u6d77\u8fb9\u4f11\u95f2\u3002'},\r\n          {title:'\u8fd4\u80e1\u5fd7\u660e\u2192\u8fd4\u7a0b', desc:'\u5df4\u58eb\u56de\u80e1\u5fd7\u660e\u8f6c\u673a\u56deKL\u3002'}\r\n        ],\r\n        itinerarySmart: [\r\n          {title:'\u62b5\u8fbe\u80e1\u5fd7\u660e', desc:'\u673a\u573a\u5750 Bus 152 RM1 \u5230\u5e02\u533a (Grab\u8981RM30)\u3002\u4f4f\u8303\u4e94\u8001\u8857\u9752\u65c5 (\u5e8a\u4f4dRM30)\u3002', tip:'\u80e1\u5fd7\u660e\u6cd5\u5f0f\u5efa\u7b51\u90fd\u96c6\u4e2d\u5728\u7b2c\u4e00\u90e1\uff0c\u5168\u90e8\u6b65\u884c\u53ef\u8fbe\u3002'},\r\n          {title:'\u6e44\u516c\u6cb3\u81ea\u7531\u884c', desc:'\u5750\u5f53\u5730\u5df4\u58eb\u5230My Tho RM20 (\u8ddf\u56e2RM80)\uff0c\u81ea\u5df1\u53eb\u8239 RM30\/\u8239\u3002', tip:'\u8ddf\u56e2\u6709\"\u8d2d\u7269\u70b9\"\u5f88\u70e6\uff0c\u81ea\u7531\u884c\u7701\u94b1+\u7075\u6d3b\u3002'},\r\n          {title:'\u591c\u5df4\u53bb\u7f8e\u5948', desc:'Sleeper Bus\u8fc7\u591c RM45\uff0c\u7701\u4e00\u665a\u9152\u5e97\u94b1\u3002', tip:'\u9009FUTA\u6216SinhTourist\u5df4\u58eb\u54c1\u724c\uff0c\u5b89\u5168\u53ef\u9760\u3002'},\r\n          {title:'\u7f8e\u5948\u6c99\u4e18 (\u79df\u6469\u6258)', desc:'\u7f8e\u5948\u79df\u6469\u6258\u4e00\u5929 RM25 (\u8ddf\u56e2RM120)\uff0c\u53ef\u4ee5\u770b\u5b8c\u7ea2\u6c99\u4e18+\u767d\u6c99\u4e18+\u6e14\u6751\u3002', tip:'\u51cc\u66684\u70b9\u51fa\u53d1\u770b\u767d\u6c99\u4e18\u65e5\u51fa\uff0c5\u70b9\u624d\u5230\u7684\u4eba\u6324\u6b7b\u3002'},\r\n          {title:'\u7f8e\u5948\u6d77\u8fb9Spa', desc:'\u7f8e\u5948\u6d77\u6ee9spa\u4e00\u5c0f\u65f6 RM30 (\u80e1\u5fd7\u660e\u540c\u6b3e RM80)\u3002\u4e0b\u5348\u6d77\u8fb9\u559d\u6930\u5b50\u3002', tip:'\u7f8e\u5948\u662f\u4fc4\u7f57\u65af\u4eba\u5ea6\u5047\u6751\uff0c\u6d77\u9c9c\u8d85\u65b0\u9c9c\u3002'},\r\n          {title:'\u8fd4\u7a0b', desc:'\u591c\u5df4\u56de\u80e1\u5fd7\u660e \u2192 \u673a\u573a\u3002'}\r\n        ]\r\n      },\r\n      {\r\n        id: 'danang-hoian',\r\n        name: '\u5c98\u6e2f+\u4f1a\u5b89',\r\n        desc: '\u4e2d\u8d8a\u7cbe\u534e\uff1a\u91d1\u6865\u624b+UNESCO\u4f1a\u5b89\u53e4\u9547+\u987a\u5316\u7687\u57ce\uff0c\u6587\u5316\u6df1\u5ea6\u6700\u9ad8\u3002',\r\n        flightCost: 480,\r\n        flightTime: '~3\u5c0f\u65f6',\r\n        baseDays: 6,\r\n        dailyCost: { hostel: 90, budget: 140, mid: 250 },\r\n        scores: { budget: 8, novelty: 9, ease: 7, chill: 8 },\r\n        tags: [{label:'\u91d1\u6865\u7f51\u7ea2',type:'hot'},{label:'UNESCO',type:'cool'},{label:'\u7f8e\u98df\u4e4b\u90fd',type:'budget'}],\r\n        places: [\r\n          {name:'\u5c98\u6e2f\u5df4\u62ff\u5c71+\u91d1\u6865', desc:'\u4f5b\u624b\u6258\u8d77\u7684\u91d1\u6865\uff0c\u5168\u7403\u7f51\u7ea2\u6253\u5361\u70b9\u3002'},\r\n          {name:'\u4f1a\u5b89\u53e4\u9547', desc:'UNESCO\u4e16\u754c\u9057\u4ea7\uff0c\u63d0\u706f\u53e4\u9547\u591c\u666f\u6700\u7f8e\u3002'},\r\n          {name:'\u7f8e\u6eaa\u6d77\u6ee9', desc:'\u5c98\u6e2f\u57ce\u5e02\u6d77\u6ee9\uff0c\u514d\u8d39\u6e38\u6cf3\u3002'},\r\n          {name:'\u7075\u5e94\u5bfa+\u5c71\u8336\u534a\u5c9b', desc:'\u5de8\u578b\u89c2\u97f3\u50cf+\u5c71\u9876view\u3002'},\r\n          {name:'\u987a\u5316\u7687\u57ce', desc:'\u962e\u671d\u53e4\u90fd+\u7d2b\u7981\u57ce\u3002'},\r\n          {name:'\u6d77\u4e91\u5cad', desc:'\u5c98\u6e2f\u5230\u987a\u5316\u7684\u4e16\u754c\u7ea7\u6d77\u5cb8\u516c\u8def\u3002'}\r\n        ],\r\n        itineraryMain: [\r\n          {title:'\u62b5\u8fbe\u5c98\u6e2f', desc:'\u5165\u4f4f\u7f8e\u6eaa\u6d77\u6ee9\u533a\u3002\u508d\u665a\u9f99\u6865\u55b7\u706b (\u5468\u672b\u665a9\u70b9)\u3002'},\r\n          {title:'\u5df4\u62ff\u5c71+\u91d1\u6865', desc:'\u7f06\u8f66\u4e0a\u5c71\u73a9\u4e00\u6574\u5929 (\u542b\u95e8\u7968RM150)\u3002'},\r\n          {title:'\u5c98\u6e2f\u2192\u4f1a\u5b89', desc:'30\u5206\u949f\u8f66\u7a0b\u5230\u4f1a\u5b89\uff0c\u901b\u53e4\u9547+\u4e0b\u5348\u63d0\u706f\u4eea\u5f0f\u3002'},\r\n          {title:'\u4f1a\u5b89\u5168\u65e5\u6e38', desc:'\u53e4\u9547+\u8ba2\u505a\u8863\u670d+\u8fe6\u5357\u5c9b\u5212\u8239+\u591c\u706f\u8282\u3002'},\r\n          {title:'\u987a\u5316\u4e00\u65e5\u5f80\u8fd4', desc:'\u9ad8\u94c1\/\u5305\u8f662.5\u5c0f\u65f6\u5230\u987a\u5316\u770b\u7687\u57ce\u3002'},\r\n          {title:'\u8fd4\u7a0b', desc:'\u5c98\u6e2f\u673a\u573a\u98de\u56deKL\u3002'}\r\n        ],\r\n        itinerarySmart: [\r\n          {title:'\u62b5\u8fbe\u5c98\u6e2f', desc:'\u673a\u573a\u51fa\u6765Grab\u5230\u5e02\u533aRM10 (\u51fa\u79df\u8f66RM35)\u3002\u4f4f\u5b89\u6d77\u8857\u533a (\u672c\u5730\u533a+\u6d77\u8fb9\u6b65\u884c)\u3002', tip:'\u5c98\u6e2f\u673a\u573a\u5c31\u5728\u5e02\u533a\uff0c\u662f\u6700\u65b9\u4fbf\u7684\u8d8a\u5357\u673a\u573a\u3002'},\r\n          {title:'\u5df4\u62ff\u5c71 (\u6de1\u5b63\u53bb)', desc:'\u5df4\u62ff\u5c71\u5468\u4e00\u81f3\u56db\u4fbf\u5b9c30%\u3002\u65e9\u73ed\u7f06\u8f667am\u53bb\uff0c\u4e0b\u5348\u56de\u907f\u514d\u6392\u961f\u3002', tip:'\u91d1\u6865\u4e0b\u5348\u9634\u5929\u53cd\u800c\u66f4\u51fa\u7247\uff0c\u6b63\u5348\u592a\u6652\u4e0d\u597d\u770b\u3002'},\r\n          {title:'\u5c98\u6e2f\u514d\u8d39\u73a9', desc:'\u7f8e\u6eaa\u6d77\u6ee9\u514d\u8d39+\u7075\u5e94\u5bfa\u514d\u8d39+\u9f99\u6865\u55b7\u706b\u514d\u8d39\u3002\u4e00\u59290\u5143\u6e38\u5c98\u6e2f\u3002', tip:'\u7075\u5e94\u5bfa\u80cc\u540e\u5c71\u8336\u534a\u5c9bview\u6bd4\u4ed8\u8d39\u666f\u70b9\u90fd\u7f8e\u3002'},\r\n          {title:'\u4f1a\u5b89\u4f4f\u4e00\u665a', desc:'\u5750 1\u8def\u516c\u4ea4 RM3 \u5230\u4f1a\u5b89 vs Grab RM30\u3002\u4f4f\u53e4\u9547\u5916RM40\/\u665a vs \u53e4\u9547\u5185RM150\u3002', tip:'\u4f1a\u5b89\u53e4\u9547\u767d\u5929\u8fdb\u5165\u8981\u95e8\u7968RM18\uff0c\u665a\u4e0a6\u70b9\u540e\u514d\u8d39\u3002'},\r\n          {title:'\u4f1a\u5b89\u706f\u8282+\u8ba2\u8863', desc:'\u6bcf\u670814\u300115\u519c\u5386\u662f\u706f\u7b3c\u8282\u6700\u7f8e\u3002\u8ba2\u505a\u897f\u88c5 RM150 (Yaly Couture\u540c\u6b3e RM500)\u3002', tip:'\u4f1a\u5b89\u88c1\u7f1d\u5e9724\u5c0f\u65f6\u51fa\u8863\uff0c\u6700\u540e\u4e00\u5929\u53bb\u53d6\u3002'},\r\n          {title:'\u8fd4\u7a0b', desc:'\u4f1a\u5b89\u56de\u5c98\u6e2f\u673a\u573a\u5168\u90e8\u5df4\u58ebRM5\u3002'}\r\n        ]\r\n      }\r\n    ]\r\n  },\r\n\r\n  {\r\n    id: 'yogyakarta',\r\n    num: '05',\r\n    nameCn: '\u65e5\u60f9',\r\n    nameEn: 'Yogyakarta',\r\n    visa: '\u843d\u5730\u7b7e (~RM150) \u6216 e-VOA\uff0c\u505c\u755930\u5929',\r\n    bestTime: '5-9\u6708 (\u5e72\u5b63)',\r\n    currency: 'RM1 \u2248 3,800 IDR',\r\n    routes: [\r\n      {\r\n        id: 'jog-classic',\r\n        name: '\u65e5\u60f9\u7ecf\u5178',\r\n        desc: '\u5a46\u7f57\u6d6e\u5c60+\u9ed8\u62c9\u76ae\u706b\u5c71+\u8721\u67d3\u827a\u672f\uff0c5\u56fd\u4e2d\u6700\u5c0f\u4f17\u7684\u76ee\u7684\u5730\u3002',\r\n        flightCost: 600,\r\n        flightTime: '~2.5\u5c0f\u65f6',\r\n        baseDays: 5,\r\n        dailyCost: { hostel: 70, budget: 120, mid: 200 },\r\n        scores: { budget: 9, novelty: 10, ease: 6, chill: 6 },\r\n        tags: [{label:'\u6700\u5c0f\u4f17',type:'hot'},{label:'\u6587\u5316\u6df1\u5ea6',type:'cool'},{label:'\u7269\u4ef7\u8d85\u4f4e',type:'budget'}],\r\n        places: [\r\n          {name:'\u5a46\u7f57\u6d6e\u5c60 Borobudur', desc:'\u4e16\u754c\u6700\u5927\u4f5b\u6559\u9057\u8ff9\uff0cUNESCO\u9057\u4ea7\u3002'},\r\n          {name:'\u666e\u5170\u5df4\u5357 Prambanan', desc:'\u5370\u5ea6\u6559\u795e\u5e99\u7fa4+\u508d\u665aRamayana\u821e\u5267\u3002'},\r\n          {name:'\u9ed8\u62c9\u76ae\u706b\u5c71\u5409\u666e\u8f66', desc:'\u5750Jeep\u7a7f\u8d8a\u706b\u5c71\u9057\u5740+\u5730\u4e0b\u6cb3\u3002'},\r\n          {name:'\u514b\u62c9\u987f\u738b\u5bab+\u6c34\u57ce', desc:'\u65e5\u60f9\u82cf\u4e39\u738b\u5bab\uff0c\u8721\u67d3\u827a\u672f\u3002'},\r\n          {name:'Pindul\u6d1e\u7a74\u6f02\u6d41', desc:'\u5750\u6a61\u76ae\u5708\u7a7f\u8d8a\u5730\u4e0b\u6cb3\u3002'},\r\n          {name:'Malioboro\u8857', desc:'\u65e5\u60f9\u6700\u70ed\u95f9\u7684\u8857+\u8721\u67d3+\u5c0f\u5403\u3002'}\r\n        ],\r\n        itineraryMain: [\r\n          {title:'\u62b5\u8fbe\u65e5\u60f9', desc:'\u5165\u4f4fMalioboro\u9644\u8fd1\u3002\u4e0b\u5348\u901b\u5e02\u96c6\u5403Gudeg\u3002'},\r\n          {title:'\u5a46\u7f57\u6d6e\u5c60\u65e5\u51fa', desc:'\u51cc\u66683\u70b9\u51fa\u53d1\u770b\u65e5\u51fa\u3002\u4e0b\u5348\u514b\u62c9\u987f\u738b\u5bab+\u6c34\u57ce\u3002'},\r\n          {title:'\u9ed8\u62c9\u76ae\u706b\u5c71', desc:'\u4e0a\u5348Jeep\u4e00\u65e5\u6e38\u3002\u4e0b\u5348Punthuk Setumbu\u770bBorobudur\u5168\u666f\u3002'},\r\n          {title:'\u666e\u5170\u5df4\u5357+\u821e\u5267', desc:'\u4e0b\u5348\u795e\u5e99\u7fa4\uff0c\u665a\u4e0a\u770bRamayana\u821e\u5267\u3002'},\r\n          {title:'\u8fd4\u7a0b', desc:'\u4e70\u8721\u67d3\u4f34\u624b\u793c\uff0c\u98de\u56deKL\u3002'}\r\n        ],\r\n        itinerarySmart: [\r\n          {title:'\u62b5\u8fbe\u65e5\u60f9', desc:'\u673a\u573a\u5230Malioboro\u5750 1A\u8defTrans Jogja\u516c\u4ea4 RM0.5 (Grab\u8981RM10)\u3002\u4f4fSosrowijayan\u80cc\u5305\u5ba2\u533a (RM30\/\u665a)\u3002', tip:'\u65e5\u60f9\u662f\u5370\u5c3c\u7269\u4ef7\u6700\u4f4e\u7684\u65c5\u6e38\u57ce\u5e02\u4e4b\u4e00\u3002'},\r\n          {title:'\u5a46\u7f57\u6d6e\u5c60Setumbu\u770b', desc:'Punthuk Setumbu\u5c71\u770bBorobudur\u65e5\u51fa RM30 vs \u5a46\u7f57\u6d6e\u5c60\u65e5\u51fa RM150\u3002', tip:'\u540c\u6837\u7684\u65e5\u51fa\u770b\u7684\u662f\u540c\u4e00\u5ea7Borobudur\uff0c\u4ef7\u683c\u5dee5\u500d\u3002\u4e0b\u5348\u518d\u4e70\u6b63\u95e8\u7968RM50\u8fdb\u53bb\u3002'},\r\n          {title:'\u9ed8\u62c9\u76aeJeep', desc:'\u780d\u4ef7\u5230 RM60\/\u4eba (\u5199\u660eRM100\u662f\u7ed9\u6e38\u5ba2\u7684)\u3002\u4e00\u5b9a\u8981\u4e2d\u7ebf (medium)\uff0c\u4e0b\u7ebf\u6ca1\u770b\u5934\u3002', tip:'\u95ee\u9752\u65c5\u524d\u53f0\u5e2e\u8ba2\u6bd4\u9152\u5e97\u4fbf\u5b9c30%\u3002'},\r\n          {title:'\u666e\u5170\u5df4\u5357 (\u8df3\u8fc7\u821e\u5267)', desc:'\u666e\u5170\u5df4\u5357\u672c\u8eab RM40\uff0c\u9ec4\u660f\u65f6\u5206\u514d\u8d39\u770b\u5915\u9633\u3002Ramayana\u821e\u5267 RM150\u8df3\u8fc7 (\u76f8\u7247\u62cd\u4e0d\u5230+\u542c\u4e0d\u61c2)\u3002', tip:'\u7701\u4e0b\u821e\u5267\u94b1\u53bbMalioboro\u5403 Gudeg Yu Djum (\u65e5\u60f9\u6700\u6709\u540d\u4f20\u7edf\u83dc)\u3002'},\r\n          {title:'\u8fd4\u7a0b', desc:'\u540c\u4e00\u516c\u4ea4\u56de\u673a\u573a\u3002\u6700\u540e\u4e00\u5929 Beringharjo\u5e02\u573a\u4e70\u8721\u67d3\u3002', tip:'Beringharjo\u5e02\u573a\u8721\u67d3\u6bd4Malioboro\u5e97\u4fbf\u5b9c60%\uff0c\u8981\u4f1a\u780d\u4ef7\u3002'}\r\n        ]\r\n      }\r\n    ]\r\n  }\r\n];\r\n\r\n\/\/ ============ STATE ============\r\nlet state = {\r\n  people: 8,\r\n  days: 7,\r\n  stay: 'budget',\r\n  vibe: 'balanced',\r\n  includeReturn: true, \/\/ true = \u603b\u5929\u6570\u542b\u8fd4\u7a0b\u65e5, false = \u7eaf\u73a9\u4e50\u5929\u6570\r\n  selectedRoutes: {}, \/\/ { 'china': 'chengdu', 'thailand': 'bkk-cnx', ... }\r\n  itineraryMode: {} \/\/ { 'china': 'main' or 'smart' }\r\n};\r\n\r\n\/\/ Initialize default routes (first route of each country)\r\ncountries.forEach(c => {\r\n  state.selectedRoutes[c.id] = c.routes[0].id;\r\n  state.itineraryMode[c.id] = 'main';\r\n});\r\n\r\nconst stayLabels = { hostel:'\u9752\u65c5', budget:'\u7ecf\u6d4e', mid:'\u8212\u9002' };\r\nconst vibeLabels = { balanced:'\u5747\u8861', chill:'\u5403\u559d\u8d70\u8d70', adventure:'\u4f53\u9a8c\u63a2\u7d22' };\r\n\r\n\/\/ ============ HELPERS ============\r\nfunction getSelectedRoute(country) {\r\n  const routeId = state.selectedRoutes[country.id];\r\n  return country.routes.find(r => r.id === routeId) || country.routes[0];\r\n}\r\n\r\n\/\/ \u5929\u6570\u8bed\u4e49\uff1a\r\n\/\/ \"\u542b\u8fd4\u7a0b\" (includeReturn=true): state.days = \u5b8c\u6574\u65e5\u671f\u8de8\u5ea6\r\n\/\/   \u4f8b: 5\u5929 = Day1\u62b5\u8fbe + Day2-4\u6d3b\u52a8 + Day5\u8fd4\u7a0b (\u51715\u5929)\r\n\/\/ \"\u53ea\u7b97\u73a9\u4e50\" (includeReturn=false): state.days = \u73a9\u4e50+\u62b5\u8fbe\u5929\u6570\uff0c\u4f46\u8fd4\u7a0b\u989d\u5916\r\n\/\/   \u4f8b: 5\u5929 = Day1\u62b5\u8fbe+\u73a9 + Day2-5\u5168\u73a9 + Day6\u8fd4\u7a0b (\u51716\u5929)\r\nfunction getDisplayDays() {\r\n  return state.includeReturn ? state.days : state.days + 1;\r\n}\r\n\r\nfunction calculateCost(route) {\r\n  const flight = route.flightCost;\r\n  const daily = route.dailyCost[state.stay];\r\n  const vibeMul = { balanced: 1.0, chill: 0.9, adventure: 1.15 }[state.vibe];\r\n  \/\/ \u7528\u5b9e\u9645\u663e\u793a\u7684\u603b\u5929\u6570\u8ba1\u7b97\u5f00\u9500\r\n  const totalDays = getDisplayDays();\r\n  const totalDaily = daily * totalDays * vibeMul;\r\n  const groupFactor = state.people >= 6 ? 0.93 : 1.0;\r\n  return Math.round((flight + totalDaily) * groupFactor);\r\n}\r\n\r\n\/\/ \u667a\u80fd\u884c\u7a0b\u6784\u5efa\uff1a\u6839\u636e\u5929\u6570\u81ea\u52a8\u7ec4\u5408\r\n\/\/ \u6bcf\u6761\u8def\u7ebf\u7684 itinerary \u6570\u7ec4\u7ed3\u6784\uff1a[\u62b5\u8fbe\u65e5, ...\u73a9\u4e50\u65e5, \u8fd4\u7a0b\u65e5]\r\n\/\/ \u62b5\u8fbe\u65e5 = index 0\r\n\/\/ \u8fd4\u7a0b\u65e5 = \u6700\u540e\u4e00\u4e2a item\r\n\/\/ \u73a9\u4e50\u65e5 = \u4e2d\u95f4\u7684 items\r\nfunction buildSmartItinerary(fullItinerary, totalDays) {\r\n  if (totalDays <= 0) return [];\r\n\r\n  \/\/ \u8fb9\u754c case\r\n  if (fullItinerary.length === 0) return [];\r\n  if (totalDays === 1) {\r\n    \/\/ 1\u5929: \u53ea\u80fd\u662f \u62b5\u8fbe+\u8fd4\u7a0b\u5408\u4f53 (\u4e0d\u73b0\u5b9e\u4f46\u8981handle)\r\n    return [{\r\n      title: fullItinerary[0].title + ' + \u8fd4\u7a0b',\r\n      desc: '\u62b5\u8fbe\u540e\u76f4\u63a5\u8f6c\u4e00\u5708\u5373\u8fd4\u7a0b\uff0c\u5efa\u8bae\u81f3\u5c11\u5b89\u63922\u5929 (\u542b\u8fd4\u7a0b)\u3002',\r\n      tip: '1\u5929\u884c\u7a0b\u4e0d\u73b0\u5b9e\uff0c\u5efa\u8bae\u589e\u52a0\u5929\u6570\u3002'\r\n    }];\r\n  }\r\n  if (totalDays === 2) {\r\n    \/\/ 2\u5929: \u62b5\u8fbe\u65e5 + \u8fd4\u7a0b\u65e5\r\n    const arrival = fullItinerary[0];\r\n    const returnDay = fullItinerary[fullItinerary.length - 1];\r\n    return [arrival, returnDay];\r\n  }\r\n\r\n  \/\/ \u6b63\u5e38\u60c5\u51b5: totalDays >= 3\r\n  \/\/ \u62b5\u8fbe\u65e5 (Day 1)\r\n  const arrival = fullItinerary[0];\r\n  \/\/ \u8fd4\u7a0b\u65e5 (last day)\r\n  const returnDay = fullItinerary[fullItinerary.length - 1];\r\n  \/\/ \u4e2d\u95f4\u73a9\u4e50\u65e5\u6570\u91cf\r\n  const middleDaysNeeded = totalDays - 2;\r\n  \/\/ \u53ef\u7528\u7684\u73a9\u4e50\u65e5 (\u6392\u9664\u62b5\u8fbe\u548c\u8fd4\u7a0b)\r\n  const availableMiddle = fullItinerary.slice(1, -1);\r\n\r\n  let middleDays = [];\r\n  if (middleDaysNeeded <= availableMiddle.length) {\r\n    \/\/ \u73a9\u4e50\u5929\u6570\u5c11\u4e8e\u63a8\u8350 \u2192 \u622a\u53d6\u6700\u91cd\u8981\u7684\u524dN\u5929\r\n    middleDays = availableMiddle.slice(0, middleDaysNeeded);\r\n  } else {\r\n    \/\/ \u73a9\u4e50\u5929\u6570\u8d85\u8fc7\u63a8\u8350 \u2192 \u5168\u90e8\u5c55\u793a+\u52a0\u81ea\u7531\u6d3b\u52a8\u63d0\u793a\r\n    middleDays = [...availableMiddle];\r\n    const extraDays = middleDaysNeeded - availableMiddle.length;\r\n    for (let i = 0; i < extraDays; i++) {\r\n      middleDays.push({\r\n        title: '\u81ea\u7531\u6d3b\u52a8 \/ Buffer Day',\r\n        desc: '\u63a8\u8350\u8def\u7ebf\u5df2\u7ed3\u675f\uff0c\u53ef\u7528\u4e8e\uff1a\u5468\u8fb9\u5c0f\u4f17\u76ee\u7684\u5730\u4e00\u65e5\u6e38\u3001\u6df1\u5ea6\u67d0\u4e2a\u57ce\u5e02\u3001SPA\u653e\u677e\u3001\u6216\u7eaf\u7cb9\u7761\u5230\u81ea\u7136\u9192\u3002',\r\n        tip: '\u5efa\u8bae\u63d0\u524d\u9884\u75591-2\u5929buffer\u5e94\u5bf9\u5929\u6c14\/\u822a\u73ed\u5ef6\u8bef\uff0c\u5269\u4f59\u65f6\u95f4\u5b89\u6392\u5f39\u6027\u6d3b\u52a8\u3002'\r\n      });\r\n    }\r\n  }\r\n\r\n  return [arrival, ...middleDays, returnDay];\r\n}\r\n\r\n\/\/ ============ RENDERING ============\r\nfunction renderCountries() {\r\n  const container = document.getElementById('countries');\r\n  container.innerHTML = countries.map(c => {\r\n    const wasExpanded = document.querySelector(`[data-id=\"${c.id}\"]`)?.classList.contains('expanded');\r\n    const route = getSelectedRoute(c);\r\n    const cost = calculateCost(route);\r\n    const tagsHtml = route.tags.map(t => `<span class=\"tag ${t.type}\">${t.label}<\/span>`).join('');\r\n\r\n    \/\/ Route selector pills (only if more than 1 route)\r\n    const routeSelector = c.routes.length > 1 ? `\r\n      <div class=\"route-selector-section\">\r\n        <div class=\"route-selector-title\">\u57ce\u5e02 \/ \u8def\u7ebf\u9009\u62e9 \u00b7 Choose Your Route<\/div>\r\n        <div class=\"route-pills\">\r\n          ${c.routes.map(r => `\r\n            <button class=\"route-pill ${r.id === state.selectedRoutes[c.id] ? 'active' : ''}\"\r\n                    data-country=\"${c.id}\" data-route=\"${r.id}\">\r\n              ${r.name}\r\n            <\/button>\r\n          `).join('')}\r\n        <\/div>\r\n        <div class=\"route-description\">${route.desc}<\/div>\r\n      <\/div>\r\n    ` : `\r\n      <div class=\"route-selector-section\">\r\n        <div class=\"route-description\">${route.desc}<\/div>\r\n      <\/div>\r\n    `;\r\n\r\n    \/\/ Itinerary mode toggle\r\n    const currentMode = state.itineraryMode[c.id] || 'main';\r\n    const modeToggle = `\r\n      <div class=\"mode-toggle-section\">\r\n        <span class=\"mode-toggle-label\">\u884c\u7a0b\u7c7b\u578b<\/span>\r\n        <div class=\"mode-toggle\">\r\n          <button class=\"mode-btn ${currentMode === 'main' ? 'active' : ''}\" data-country=\"${c.id}\" data-mode=\"main\">\u4e3b\u6d41\u8def\u7ebf<\/button>\r\n          <button class=\"mode-btn ${currentMode === 'smart' ? 'active' : ''}\" data-country=\"${c.id}\" data-mode=\"smart\">\u9ad8\u6027\u4ef7\u6bd4<\/button>\r\n        <\/div>\r\n        <div class=\"mode-explainer\">\r\n          ${currentMode === 'main'\r\n            ? '\u7ecf\u5178\u63a8\u8350\u8def\u7ebf\uff0c\u666f\u70b9\u5168\u9762\u3001\u8ddf\u7740\u5927\u90e8\u961f\u8d70\uff0c\u9002\u5408\u7b2c\u4e00\u6b21\u53bb'\r\n            : '\u672c\u5730\u4eba\u8def\u7ebf + \u7701\u94b1tip\uff0c\u9519\u5cf0\u3001\u7701\u4e00\u534a\u94b1\u3001\u907f\u5f00\u6e38\u5ba2\u9677\u9631'}\r\n        <\/div>\r\n      <\/div>\r\n    `;\r\n\r\n    const placesHtml = route.places.map(p => `\r\n      <div class=\"place-item\">\r\n        <div class=\"place-dot\"><\/div>\r\n        <div class=\"place-content\">\r\n          <div class=\"place-name\">${p.name}<\/div>\r\n          <div class=\"place-desc\">${p.desc}<\/div>\r\n        <\/div>\r\n      <\/div>\r\n    `).join('');\r\n\r\n    \/\/ Choose itinerary based on mode\r\n    const fullItinerary = currentMode === 'smart' ? route.itinerarySmart : route.itineraryMain;\r\n    const totalDisplayDays = getDisplayDays();\r\n    const itineraryDays = buildSmartItinerary(fullItinerary, totalDisplayDays);\r\n    const itineraryHtml = itineraryDays.map((d, idx) => {\r\n      const isArrival = idx === 0;\r\n      const isReturn = idx === itineraryDays.length - 1 && itineraryDays.length > 1;\r\n      const dayBadge = isArrival ? '\u62b5\u8fbe' : (isReturn ? '\u8fd4\u7a0b' : '\u73a9\u4e50');\r\n      const badgeColor = isArrival ? 'var(--jade)' : (isReturn ? 'var(--rust-deep)' : 'var(--gold)');\r\n      return `\r\n        <div class=\"day-row\">\r\n          <div class=\"day-num\">${idx + 1}<small>Day ${idx + 1}<\/small><\/div>\r\n          <div class=\"day-content\">\r\n            <div class=\"day-title\">\r\n              ${d.title}\r\n              <span style=\"display:inline-block;margin-left:8px;padding:2px 8px;background:${badgeColor};color:var(--paper);font-family:var(--mono);font-size:9px;letter-spacing:0.15em;text-transform:uppercase;vertical-align:middle;\">${dayBadge}<\/span>\r\n            <\/div>\r\n            <div class=\"day-desc\">${d.desc}<\/div>\r\n            ${d.tip ? `<div class=\"day-tip ${currentMode === 'smart' ? 'budget-tip' : ''}\">${d.tip}<\/div>` : ''}\r\n          <\/div>\r\n        <\/div>\r\n      `;\r\n    }).join('');\r\n\r\n    \/\/ Day count explainer\r\n    const playDays = totalDisplayDays - 2; \/\/ \u5b9e\u9645\u5168\u5929\u73a9\u4e50\u7684\u5929\u6570\r\n    const dayCountExplainer = `\r\n      <div style=\"margin-bottom:20px;padding:14px 16px;background:rgba(45,95,63,0.08);border-left:3px solid var(--jade);font-size:13px;line-height:1.6;\">\r\n        <strong style=\"font-family:var(--mono);font-size:10px;letter-spacing:0.15em;text-transform:uppercase;color:var(--jade);\">\u884c\u7a0b\u6784\u6210<\/strong><br>\r\n        \u5171 <strong>${totalDisplayDays}\u5929<\/strong> = 1\u5929\u62b5\u8fbe + ${playDays >= 0 ? playDays : 0}\u5929\u5168\u5929\u73a9 + 1\u5929\u8fd4\u7a0b\r\n        ${!state.includeReturn ? '<em style=\"color:rgba(26,22,18,0.6);\"> \u00b7 \u4f60\u9009\u4e86\"\u53ea\u7b97\u73a9\u4e50\"\uff0c\u6240\u4ee5\u603b\u8de8\u5ea6\u6bd4\u5929\u6570\u591a1\u5929<\/em>' : ''}\r\n      <\/div>\r\n    `;\r\n\r\n    const flightShare = route.flightCost;\r\n    const localShare = cost - flightShare;\r\n    const dailyAvg = Math.round(localShare \/ totalDisplayDays);\r\n    const groupTotal = cost * state.people;\r\n\r\n    \/\/ Build verdict text dynamically based on route\r\n    let verdict = '';\r\n    if (c.id === 'china') {\r\n      if (route.id === 'chengdu') verdict = '\u4e2d\u6587\u6c9f\u901a0\u969c\u788d + <em>\u7f8e\u98df\u5929\u5802<\/em>\u3002\u6162\u751f\u6d3b+\u718a\u732b\u4e3b\u573a\uff0c\u6700\u9002\u5408\u4e0d\u60f3\u7d2f\u7684\u4f53\u9a8c\u6d3e\u3002';\r\n      else if (route.id === 'chongqing') verdict = '5\u56fd\u4e2d<em>\u6700\u9b54\u5e7b\u7684\u57ce\u5e02<\/em>\u30028D\u7acb\u4f53\u5730\u5f62+\u9707\u64bc\u591c\u666f\uff0c\u670b\u53cb\u5708\u4f1a\u7206\u3002';\r\n      else verdict = '\u4e2d\u56fd<em>\u81ea\u7136\u98ce\u5149\u5929\u82b1\u677f<\/em>\u3002\u6f13\u6c5f\u5c71\u6c34+\u9633\u6714\u9a91\u884c\uff0c\u7597\u6108\u7cfb\u7b2c\u4e00\u3002';\r\n    } else if (c.id === 'thailand') {\r\n      if (route.id === 'bkk-cnx') verdict = '<em>\u6700\u7a33\u7684\u9009\u62e9<\/em>\u3002\u673a\u7968\u6700\u4fbf\u5b9c\uff0c\u7269\u4ef7\u4f4e\u3002\u7f3a\u70b9\uff1a\u5f88\u591a\u670b\u53cb\u53bb\u8fc7\u3002';\r\n      else verdict = '<em>\u871c\u6708+\u6d77\u5c9b\u8df3\u5c9b\u4e4b\u738b<\/em>\u3002\u5b89\u8fbe\u66fc\u6d77\u4e00\u7247\u6e05\u6f88\uff0cPP\u5c9b+\u7532\u7c73\u53cc\u91cd\u4eab\u53d7\u3002';\r\n    } else if (c.id === 'bali') {\r\n      if (route.id === 'south-ubud') verdict = '<em>\u5927\u56e2\u5305Villa\u6700\u8212\u670d<\/em>\u3002\u5403\u559d\u73a9\u4e50\u8eba\u5e73+\u7f51\u7ea2\u6253\u5361\u4e24\u4e0d\u8bef\u3002';\r\n      else verdict = '<em>\u6df1\u5ea6\u5c0f\u4f17\u73a9\u5bb6<\/em>\u3002\u8df3\u8fc7\u6e38\u5ba2\u5bc6\u96c6\u533a\uff0c\u5728Nusa\u7fa4\u5c9b\u627e\u5230\u771f\u6b63\u7684\u7eaf\u51c0\u6d77\u5c9b\u3002';\r\n    } else if (c.id === 'vietnam') {\r\n      if (route.id === 'hanoi-halong') verdict = '<em>\u9884\u7b97\u7d27\u7684\u6700\u4f18\u9009<\/em>\u3002\u7269\u4ef7\u662f5\u56fd\u6700\u4f4e\uff0c\u4e0b\u9f99\u6e7e\u7edd\u666f\u4eba\u5747\u624dRM200\u3002';\r\n      else if (route.id === 'hcm-mui-ne') verdict = '<em>\u5357\u8d8a\u6fc0\u60c5\u73a9\u5bb6<\/em>\u3002\u673a\u7968RM230\u8d77\u6700\u4fbf\u5b9c\uff0c\u7f8e\u5948\u6c99\u4e18\u50cf\u6492\u54c8\u62c9\u3002';\r\n      else verdict = '<em>\u6587\u5316\u6df1\u5ea6\u7b2c\u4e00<\/em>\u3002\u91d1\u6865+UNESCO\u4f1a\u5b89+\u987a\u5316\u7687\u57ce\uff0c\u8d8a\u5357\u6700\u6709\u5185\u6db5\u7684\u8def\u7ebf\u3002';\r\n    } else if (c.id === 'yogyakarta') {\r\n      verdict = '<em>\u7ed9\u4f53\u9a8c\u6d3e\u7684\u6700\u4f73\u9009\u62e9<\/em>\u3002\u9a6c\u6765\u670b\u53cb\u91cc99%\u6ca1\u53bb\u8fc7\uff0c\u56de\u6765\u53d1IG\u6700\u6709\u9762\u5b50\u3002';\r\n    }\r\n\r\n    return `\r\n      <div class=\"country-card fade-in ${wasExpanded ? 'expanded' : ''}\" data-id=\"${c.id}\">\r\n        <div class=\"country-header\">\r\n          <div class=\"country-number\">${c.num}<\/div>\r\n          <div class=\"country-main\">\r\n            <div class=\"country-name-row\">\r\n              <div class=\"country-name-cn\">${c.nameCn} \u00b7 ${route.name}<\/div>\r\n              <div class=\"country-name-en\">${c.nameEn}<\/div>\r\n            <\/div>\r\n            <div class=\"country-tags\">${tagsHtml}<\/div>\r\n          <\/div>\r\n          <div class=\"country-stats\">\r\n            <div class=\"stat-cost\"><span class=\"currency\">RM<\/span>${cost.toLocaleString()}<\/div>\r\n            <div class=\"stat-meta\">PER PERSON \u00b7 ${totalDisplayDays} DAYS<\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"score-section\">\r\n          <div class=\"score-item\">\r\n            <div class=\"score-label\">\u9884\u7b97\u53cb\u597d<\/div>\r\n            <div class=\"score-value-row\">\r\n              <div class=\"score-bar\"><div class=\"score-fill\" style=\"transform:scaleX(${route.scores.budget\/10})\"><\/div><\/div>\r\n              <div class=\"score-num\">${route.scores.budget}<\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"score-item\">\r\n            <div class=\"score-label\">\u65b0\u9c9c\u611f<\/div>\r\n            <div class=\"score-value-row\">\r\n              <div class=\"score-bar\"><div class=\"score-fill\" style=\"transform:scaleX(${route.scores.novelty\/10})\"><\/div><\/div>\r\n              <div class=\"score-num\">${route.scores.novelty}<\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"score-item\">\r\n            <div class=\"score-label\">\u51fa\u884c\u4fbf\u5229<\/div>\r\n            <div class=\"score-value-row\">\r\n              <div class=\"score-bar\"><div class=\"score-fill\" style=\"transform:scaleX(${route.scores.ease\/10})\"><\/div><\/div>\r\n              <div class=\"score-num\">${route.scores.ease}<\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"score-item\">\r\n            <div class=\"score-label\">\u8f7b\u677e\u5ea6<\/div>\r\n            <div class=\"score-value-row\">\r\n              <div class=\"score-bar\"><div class=\"score-fill\" style=\"transform:scaleX(${route.scores.chill\/10})\"><\/div><\/div>\r\n              <div class=\"score-num\">${route.scores.chill}<\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"country-details\">\r\n          ${routeSelector}\r\n          ${modeToggle}\r\n\r\n          <div class=\"details-content\">\r\n\r\n            <div class=\"detail-block\">\r\n              <h3>\u57fa\u672c\u4fe1\u606f<\/h3>\r\n              <ul class=\"info-list\">\r\n                <li><span class=\"key\">\u98de\u884c\u65f6\u95f4<\/span><span class=\"val\">${route.flightTime}<\/span><\/li>\r\n                <li><span class=\"key\">\u7b7e\u8bc1<\/span><span class=\"val\">${c.visa}<\/span><\/li>\r\n                <li><span class=\"key\">\u6700\u4f73\u5b63\u8282<\/span><span class=\"val\">${c.bestTime}<\/span><\/li>\r\n                <li><span class=\"key\">\u6c47\u7387<\/span><span class=\"val\">${c.currency}<\/span><\/li>\r\n                <li><span class=\"key\">\u5efa\u8bae\u5929\u6570<\/span><span class=\"val\">${route.baseDays}\u5929<\/span><\/li>\r\n              <\/ul>\r\n            <\/div>\r\n\r\n            <div class=\"detail-block\">\r\n              <h3>\u63a8\u8350\u666f\u70b9<\/h3>\r\n              <div class=\"place-list\">${placesHtml}<\/div>\r\n            <\/div>\r\n\r\n            <div class=\"detail-block itinerary\">\r\n              <h3>${totalDisplayDays}\u5929\u884c\u7a0b \u00b7 ${currentMode === 'smart' ? '\u9ad8\u6027\u4ef7\u6bd4\u7248' : '\u4e3b\u6d41\u7248'}<\/h3>\r\n              ${dayCountExplainer}\r\n              ${itineraryHtml}\r\n              ${totalDisplayDays < 3 ? `\r\n                <p style=\"margin-top:20px; padding:16px; background:rgba(184,71,43,0.08); font-size:13px; color:var(--rust-deep);\">\r\n                \u26a0 \u5929\u6570\u592a\u77ed\uff1a\u5efa\u8bae\u81f3\u5c113\u5929 (1\u5929\u62b5\u8fbe + 1\u5929\u73a9 + 1\u5929\u8fd4\u7a0b)\uff0c\u5426\u5219\u771f\u6b63\u80fd\u73a9\u7684\u65f6\u95f4\u4e0d\u591f\u3002\r\n                <\/p>\r\n              ` : ''}\r\n            <\/div>\r\n\r\n            <div class=\"detail-block budget-breakdown\">\r\n              <h3 style=\"border:none; padding:0;\">\u9884\u7b97\u62c6\u89e3 \u00b7 ${state.people}\u4eba\u56e2<\/h3>\r\n              <div class=\"breakdown-grid\">\r\n                <div class=\"breakdown-item\">\r\n                  <div class=\"breakdown-label\">\u673a\u7968\u6765\u56de<\/div>\r\n                  <div class=\"breakdown-value\">RM${flightShare}<small>\/\u4eba<\/small><\/div>\r\n                <\/div>\r\n                <div class=\"breakdown-item\">\r\n                  <div class=\"breakdown-label\">\u6bcf\u65e5\u5f00\u9500<\/div>\r\n                  <div class=\"breakdown-value\">RM${dailyAvg}<small>\/\u4eba\/\u5929<\/small><\/div>\r\n                <\/div>\r\n                <div class=\"breakdown-item\">\r\n                  <div class=\"breakdown-label\">\u4eba\u5747\u603b\u4ef7<\/div>\r\n                  <div class=\"breakdown-value\">RM${cost.toLocaleString()}<small>\/\u4eba<\/small><\/div>\r\n                <\/div>\r\n                <div class=\"breakdown-item\">\r\n                  <div class=\"breakdown-label\">\u56e2\u961f\u603b\u9884\u7b97<\/div>\r\n                  <div class=\"breakdown-value\">RM${groupTotal.toLocaleString()}<\/div>\r\n                <\/div>\r\n              <\/div>\r\n            <\/div>\r\n\r\n            <div class=\"detail-block verdict\">\r\n              <div class=\"verdict-label\">Verdict<\/div>\r\n              <div class=\"verdict-text\">${verdict}<\/div>\r\n            <\/div>\r\n\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"expand-hint\">\u70b9\u51fb\u5c55\u5f00<\/div>\r\n      <\/div>\r\n    `;\r\n  }).join('');\r\n\r\n  \/\/ Re-attach handlers\r\n  attachCountryHandlers();\r\n}\r\n\r\nfunction attachCountryHandlers() {\r\n  \/\/ Card expand on header click only (so inner controls don't toggle)\r\n  document.querySelectorAll('.country-card').forEach(card => {\r\n    const header = card.querySelector('.country-header');\r\n    header.addEventListener('click', () => {\r\n      card.classList.toggle('expanded');\r\n    });\r\n  });\r\n\r\n  \/\/ Route pill buttons\r\n  document.querySelectorAll('.route-pill').forEach(pill => {\r\n    pill.addEventListener('click', (e) => {\r\n      e.stopPropagation();\r\n      const country = pill.dataset.country;\r\n      const route = pill.dataset.route;\r\n      state.selectedRoutes[country] = route;\r\n      renderCountries();\r\n      renderRecommendations();\r\n      \/\/ Re-expand the card that was modified\r\n      const card = document.querySelector(`[data-id=\"${country}\"]`);\r\n      if (card) card.classList.add('expanded');\r\n    });\r\n  });\r\n\r\n  \/\/ Mode toggle buttons\r\n  document.querySelectorAll('.mode-btn').forEach(btn => {\r\n    btn.addEventListener('click', (e) => {\r\n      e.stopPropagation();\r\n      const country = btn.dataset.country;\r\n      const mode = btn.dataset.mode;\r\n      state.itineraryMode[country] = mode;\r\n      renderCountries();\r\n      \/\/ Re-expand\r\n      const card = document.querySelector(`[data-id=\"${country}\"]`);\r\n      if (card) card.classList.add('expanded');\r\n    });\r\n  });\r\n}\r\n\r\nfunction renderRecommendations() {\r\n  const scored = countries.map(c => {\r\n    const route = getSelectedRoute(c);\r\n    const cost = calculateCost(route);\r\n    let score = 0;\r\n\r\n    score += Math.max(0, (3000 - cost) \/ 100);\r\n\r\n    if (state.vibe === 'chill') {\r\n      score += route.scores.chill * 1.5;\r\n      score += route.scores.ease * 0.8;\r\n    } else if (state.vibe === 'adventure') {\r\n      score += route.scores.novelty * 1.5;\r\n    } else {\r\n      score += (route.scores.chill + route.scores.novelty + route.scores.ease) * 0.5;\r\n    }\r\n\r\n    if (state.people >= 6) score += route.scores.ease * 0.3;\r\n\r\n    return { country: c, route, cost, score };\r\n  });\r\n\r\n  scored.sort((a, b) => b.score - a.score);\r\n  const top3 = scored.slice(0, 3);\r\n\r\n  const container = document.getElementById('recommendations');\r\n  container.innerHTML = top3.map((s, i) => {\r\n    const reasons = generateReason(s.country, s.route, state, i);\r\n    return `\r\n      <div class=\"recommend-card fade-in\">\r\n        <div class=\"recommend-top\">\r\n          <div class=\"recommend-rank\">0${i + 1}<\/div>\r\n          <div class=\"recommend-country\">${s.country.nameCn} \u00b7 ${s.route.name}<\/div>\r\n          <div class=\"recommend-fit\" style=\"text-align:right;\">\r\n            <small>\u9884\u4f30\u82b1\u8d39<\/small>\r\n            RM${s.cost.toLocaleString()}\r\n          <\/div>\r\n        <\/div>\r\n        <p class=\"recommend-reason\">${reasons}<\/p>\r\n      <\/div>\r\n    `;\r\n  }).join('');\r\n}\r\n\r\nfunction generateReason(country, route, state, rank) {\r\n  const reasons = [];\r\n\r\n  if (country.id === 'china') {\r\n    if (route.id === 'chengdu') reasons.push('\u4e2d\u6587\u6c9f\u901a\u65e0\u969c\u788d + \u7f8e\u98df\u5929\u5802 + \u718a\u732b\u4e3b\u573a');\r\n    else if (route.id === 'chongqing') reasons.push('8D\u9b54\u5e7b\u5730\u5f62+\u9707\u64bc\u591c\u666f\uff0c\u670b\u53cb\u5708\u51fa\u7247\u7387\u6700\u9ad8');\r\n    else reasons.push('\u6f13\u6c5f\u5c71\u6c34+\u9633\u6714\u9a91\u884c\uff0c\u81ea\u7136\u98ce\u5149\u9876\u7ea7\u4eab\u53d7');\r\n    if (state.people >= 6) reasons.push('\u5730\u94c1+\u6ef4\u6ef4\u65b9\u4fbf\uff0c\u56e2\u961f\u79fb\u52a8\u6548\u7387\u9ad8');\r\n  } else if (country.id === 'thailand') {\r\n    if (route.id === 'bkk-cnx') reasons.push('\u673a\u7968\u6765\u56de\u6700\u4fbf\u5b9cRM250-400 + \u57fa\u5efa\u6700\u6210\u719f');\r\n    else reasons.push('\u6d77\u5c9b\u8df3\u5c9b\u5929\u5802\uff0c\u6f5c\u6c34\u6d6e\u6f5c\u9996\u9009');\r\n    if (state.vibe === 'chill') reasons.push('\u6cf0\u5f0f\u6309\u6469+\u7f8e\u98df\uff0c\u7eaf\u7cb9\u653e\u677e\u9996\u9009');\r\n  } else if (country.id === 'bali') {\r\n    if (state.vibe === 'chill') reasons.push('Villa\u6587\u5316+\u6d77\u6ee9\uff0c\u53d1\u5446\u8eba\u5e73\u7684\u5929\u5802');\r\n    if (state.people >= 6) reasons.push(`${state.people}\u4eba\u8ba2\u4e00\u680bVilla\u8d85\u5212\u7b97\uff0c\u4eba\u5747\u4f4f\u5bbf\u80fd\u538b\u5230RM50-80\/\u665a`);\r\n    if (route.id === 'nusa-deep') reasons.push('\u6df1\u5ea6\u73a9\u6cd5 + \u6d6e\u6f5c\u4e0emanta\u5171\u6e38');\r\n  } else if (country.id === 'vietnam') {\r\n    if (route.id === 'hcm-mui-ne') reasons.push('\u673a\u7968\u8d85\u4fbf\u5b9c (RM230\u8d77) + \u5f53\u5730\u7269\u4ef7\u6700\u4f4e');\r\n    else if (route.id === 'hanoi-halong') reasons.push('\u4e0b\u9f99\u6e7eUNESCO\u9057\u4ea7\uff0c\u90ae\u8f6e\u4eba\u5747RM200');\r\n    else reasons.push('\u91d1\u6865+UNESCO\u4f1a\u5b89+\u987a\u5316\u7687\u57ce\uff0c\u6587\u5316\u6df1\u5ea6\u7206\u68da');\r\n    if (state.vibe === 'adventure') reasons.push('\u4f53\u9a8c\u611f\u5f3a\uff0c\u5496\u5561\u63a7+\u7f8e\u98df\u63a7\u5929\u5802');\r\n  } else if (country.id === 'yogyakarta') {\r\n    if (state.vibe === 'adventure') reasons.push('5\u56fd\u4e2d\u6700\u5c0f\u4f17\uff0c\u670b\u53cb\u570899%\u6ca1\u53bb\u8fc7');\r\n    reasons.push('\u5a46\u7f57\u6d6e\u5c60+\u9ed8\u62c9\u76ae\u706b\u5c71+\u8721\u67d3\u827a\u672f\uff0c\u6587\u5316\u6df1\u5ea6\u6ee1\u5206');\r\n    reasons.push(`\u7269\u4ef7\u8d85\u4f4e\uff0c${state.people}\u4eba\u5305\u8f66\u6027\u4ef7\u6bd4\u9ad8`);\r\n  }\r\n\r\n  return reasons.join(' \u00b7 ');\r\n}\r\n\r\n\/\/ ============ CONTROL PANEL HANDLERS ============\r\nconst controlPanel = document.getElementById('controlPanel');\r\nconst controlSummary = document.getElementById('controlSummary');\r\n\r\ncontrolSummary.addEventListener('click', () => {\r\n  controlPanel.classList.toggle('expanded');\r\n});\r\n\r\nfunction updateSummary() {\r\n  document.getElementById('sum-people').textContent = state.people + '\u4eba';\r\n  document.getElementById('sum-days').textContent = state.days + '\u5929';\r\n  document.getElementById('sum-stay').textContent = stayLabels[state.stay];\r\n  document.getElementById('sum-vibe').textContent = vibeLabels[state.vibe];\r\n  const sumReturnEl = document.getElementById('sum-return');\r\n  if (sumReturnEl) {\r\n    sumReturnEl.textContent = state.includeReturn ? '\u542b\u8fd4\u7a0b' : '\u7eaf\u73a9\u4e50';\r\n  }\r\n}\r\n\r\ndocument.getElementById('ppl').addEventListener('input', (e) => {\r\n  state.people = parseInt(e.target.value);\r\n  document.getElementById('ppl-val').textContent = state.people + '\u4eba';\r\n  updateSummary();\r\n  renderCountries();\r\n  renderRecommendations();\r\n});\r\n\r\ndocument.getElementById('days').addEventListener('input', (e) => {\r\n  state.days = parseInt(e.target.value);\r\n  document.getElementById('days-val').textContent = state.days + '\u5929';\r\n  updateSummary();\r\n  renderCountries();\r\n  renderRecommendations();\r\n});\r\n\r\ndocument.querySelectorAll('#stay-selector .style-btn').forEach(btn => {\r\n  btn.addEventListener('click', () => {\r\n    document.querySelectorAll('#stay-selector .style-btn').forEach(b => b.classList.remove('active'));\r\n    btn.classList.add('active');\r\n    state.stay = btn.dataset.stay;\r\n    updateSummary();\r\n    renderCountries();\r\n    renderRecommendations();\r\n  });\r\n});\r\n\r\ndocument.querySelectorAll('#vibe-selector .style-btn').forEach(btn => {\r\n  btn.addEventListener('click', () => {\r\n    document.querySelectorAll('#vibe-selector .style-btn').forEach(b => b.classList.remove('active'));\r\n    btn.classList.add('active');\r\n    state.vibe = btn.dataset.vibe;\r\n    updateSummary();\r\n    renderCountries();\r\n    renderRecommendations();\r\n  });\r\n});\r\n\r\ndocument.querySelectorAll('#return-selector .style-btn').forEach(btn => {\r\n  btn.addEventListener('click', () => {\r\n    document.querySelectorAll('#return-selector .style-btn').forEach(b => b.classList.remove('active'));\r\n    btn.classList.add('active');\r\n    state.includeReturn = btn.dataset.return === 'include';\r\n    updateSummary();\r\n    renderCountries();\r\n    renderRecommendations();\r\n  });\r\n});\r\n\r\n\/\/ Initial render\r\nupdateSummary();\r\nrenderCountries();\r\nrenderRecommendations();\r\n<\/script>\r\n\r\n<\/body>\r\n<\/html>\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>5\u56fd\u65c5\u6e38\u653b\u7565\u5bf9\u6bd4 \u00b7 Travel Compass v2 Five Countries Multiple Routes 2026 \u00b7 KL Departure v2.0 \u00b7 For Groups \u4e94\u56fd\u65c5\u884c\u5bf9\u6bd4 compass. \u4e00\u4efd\u7ed9 7-10\u4eba\u5c0f\u961f\u7684\u5b8c\u6574\u51b3\u7b56\u624b\u518c\u3002\u4ece\u9a6c\u6765\u897f\u4e9a\u51fa\u53d1\uff0c\u9884\u7b97 RM1500-3000\/\u4eba\u3002 \u6bcf\u4e2a\u56fd\u5bb6\u53ef\u9009\u4e0d\u540c\u57ce\u5e02\u8def\u7ebf\uff0c\u884c\u7a0b\u53ef\u5207\u6362\u4e3b\u6d41 \/ \u9ad8\u6027\u4ef7\u6bd4\u73a9\u6cd5\u3002 \u70b9\u51fb\u56fd\u5bb6\u5361\u7247\u5c55\u5f00\u8be6\u60c5\u3002 8\u4eba 7\u5929 \u542b\u8fd4\u7a0b \u7ecf\u6d4e \u5747\u8861 \u8c03\u6574 Group Size \u00b7 \u56e2\u961f\u4eba\u6570 8\u4eba Days \u00b7 \u65c5\u884c\u5929\u6570 7\u5929 Stay Style \u00b7 \u4f4f\u5bbf\u6863\u6b21 \u9752\u65c5 \u7ecf\u6d4e \u8212\u9002 Vibe \u00b7 \u73a9\u6cd5 \u5747\u8861 \u5403\u559d\u8d70\u8d70 \u4f53\u9a8c\u63a2\u7d22 Day [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-6","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/zie.mhaus.net\/index.php?rest_route=\/wp\/v2\/pages\/6","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zie.mhaus.net\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/zie.mhaus.net\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/zie.mhaus.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zie.mhaus.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6"}],"version-history":[{"count":15,"href":"https:\/\/zie.mhaus.net\/index.php?rest_route=\/wp\/v2\/pages\/6\/revisions"}],"predecessor-version":[{"id":25,"href":"https:\/\/zie.mhaus.net\/index.php?rest_route=\/wp\/v2\/pages\/6\/revisions\/25"}],"wp:attachment":[{"href":"https:\/\/zie.mhaus.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}