Skip to content

Instantly share code, notes, and snippets.

@fireattack
Created September 11, 2023 11:20
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fireattack/9897195320db43e3f3509701789111b1 to your computer and use it in GitHub Desktop.
Save fireattack/9897195320db43e3f3509701789111b1 to your computer and use it in GitHub Desktop.
import colorsys
import csv
from datetime import datetime
from pathlib import Path
import matplotlib.colors as mcolors
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import markers
from matplotlib.path import Path as pPath
# https://stackoverflow.com/questions/26686722/align-matplotlib-scatter-marker-left-and-or-right
def align_marker(marker, halign='center', valign='middle'):
if isinstance(halign, (str)):
halign = {'right': -1.,
'middle': 0.,
'center': 0.,
'left': 1.,
}[halign]
if isinstance(valign, (str)):
valign = {'top': -1.,
'middle': 0.,
'center': 0.,
'bottom': 1.,
}[valign]
# Define the base marker
bm = markers.MarkerStyle(marker)
# Get the marker path and apply the marker transform to get the
# actual marker vertices (they should all be in a unit-square
# centered at (0, 0))
m_arr = bm.get_path().transformed(bm.get_transform()).vertices
# Shift the marker vertices for the specified alignment.
m_arr[:, 0] += halign / 2
m_arr[:, 1] += valign / 2
return pPath(m_arr, bm.get_path().codes)
def tsv2dict(p):
p = Path(p)
with p.open(encoding='utf8') as f:
reader = csv.DictReader(f, delimiter='\t', quoting=csv.QUOTE_NONE)
# headers = reader.fieldnames
data = list(reader)
return data
def adjust_lightness(color, amount=0.5):
try:
c = mcolors.cnames[color]
except:
c = color
c = colorsys.rgb_to_hls(*mcolors.to_rgb(c))
return colorsys.hls_to_rgb(c[0], max(0, min(1, amount * c[1])), c[2])
def ordinal(n: int):
if 11 <= (n % 100) <= 13:
suffix = 'th'
else:
suffix = ['th', 'st', 'nd', 'rd', 'th'][min(n % 10, 4)]
return str(n) + suffix
def cleanup():
'''
Clean up the data copied from https://music765plus.com/%E3%83%A9%E3%82%A4%E3%83%96%26%E6%AD%8C%E3%81%82%E3%82%8A%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E4%B8%80%E8%A6%A7
I still have to manually clean more later in the live_event_data_new.tsv and save the result to live_event_data_cleaned.tsv
'''
data = Path('live_event_data.tsv').read_text(encoding='utf-8').splitlines()
data_new = []
for d in data:
cat, date, title = d.split('\t')
date = date.lstrip('D')
for no in range(1, 11):
if ordinal(no) in title.lower():
print(d, 'has ordinal', ordinal(no))
title += '\t' + ordinal(no)
data_new.append('\t'.join([cat, date, title]))
Path('live_event_data_new.tsv').write_text('\n'.join(data_new), encoding='utf-8')
def plot(by_days=False):
data = tsv2dict('live_event_data_cleaned.tsv')
# preprocess data
data_ = []
for d in data:
date = d['date']
if '~' in date:
date = date.split('~')[0]
date = datetime.strptime(date, '%Y-%m-%d')
prev_data = data_[-1] if data_ else None
if prev_data and prev_data['date'].day + 1 == date.day and d['number'] == prev_data['number']:
# combine two-day events datapoint into one
print('Second day of the same event! Ignore:')
print(' ', d['event_name'])
print(' ', prev_data['event_name'])
else:
d['date'] = date
data_.append(d)
data = data_
CATS = ("[765]", "[CIN]", "[MIL]", "[SdM]", "[SnC]")
PROPER_NAMES = ("765AS", "CINDERELLA GIRLS", "MILLION LIVE!", "SideM", "SHINY COLORS")
COLORS = ('tab:red', 'tab:blue', 'tab:orange', 'tab:green', 'tab:cyan')
# get the largest interval for x-axis
all_dates = [d['date'] for d in data]
if by_days:
intervals = []
for cat in CATS:
data_ = [d for d in data if d['cat'] == cat]
dates_ = [d['date'] for d in data_]
interval = (dates_[-1] - dates_[0]).days
intervals.append(interval)
largest_intervals = max(intervals)
x_base, y_base = 0, largest_intervals
else:
x_base, y_base = all_dates[0], all_dates[-1]
fig, axes = plt.subplots(5, 1, figsize=(10, 5), layout="constrained")
for idx, cat in enumerate(CATS):
ax = axes[idx]
ax.set(title=PROPER_NAMES[idx])
data_ = [d for d in data if d['cat'] == cat]
dates_ = [d['date'] for d in data_]
if by_days:
day0_ = dates_[0]
for d in data_:
d['date'] = (d['date'] - day0_).days
# draw a baseline
ax.hlines(0, data_[0]['date'], data_[-1]['date'], color=COLORS[idx], zorder=1)
# split the data into two groups by alternating the event names
data_groups =[[], []]
prev = None
current_group = 1
for d in data_:
number = d["number"]
if number == prev:
pass
else:
ax.annotate(number, xy=(d['date'], 0.5), xytext=(0, 0), textcoords="offset points", horizontalalignment="center", verticalalignment="bottom")
current_group = 1 - current_group
data_groups[current_group].append(d)
prev = number
for j, data__ in enumerate(data_groups):
if j == 0:
color = COLORS[idx]
else:
color = adjust_lightness(COLORS[idx], 1.5)
dates__ = [d['date'] for d in data__]
ax.scatter(dates__, np.zeros_like(dates__), marker=align_marker('v', valign='bottom'), s=600, color=color, edgecolors='black', zorder=3, clip_on=False)
prev = None
ax.set_xlim(x_base, y_base)
ax.set_ylim(-1, 1)
ax.yaxis.set_visible(False)
# hide all lines but the x-axis for the bottom subplot
if idx < 4:
ax.xaxis.set_visible(False)
ax.spines[["left", "top", "right", "bottom"]].set_visible(False)
else:
ax.spines[["left", "top", "right"]].set_visible(False)
# plt.show()
if by_days:
filename = 'live_event_timeline_by_days.png'
else:
filename = 'live_event_timeline_by_date.png'
plt.savefig(filename, dpi=150, bbox_inches='tight')
# cleanup()
plot(by_days=False)
plot(by_days=True)
cat date event_name number
[765] 2006-07-23 1st ANNIVERSARY LIVE 1st
[765] 2007-04-01 ALL STAR LIVE 2007 2nd
[765] 2008-07-27 3rd ANNIVERSARY LIVE 3rd
[765] 2009-05-17 4th SPECIAL DREAM TOUR'S!! IN NAGOYA 4th
[765] 2009-05-24 4th SPECIAL DREAM TOUR'S!! IN FUKUOKA 4th
[765] 2009-05-30 4th SPECIAL DREAM TOUR'S!! IN TOKYO 4th
[765] 2009-07-23 4th SPECIAL DREAM TOUR'S!! IN OSAKA 4th
[765] 2009-11-28 4th Blu-ray&DVD Release Party 4th
[765] 2010-07-03 5th Live The world is all one !! DAY1 5th
[765] 2010-07-04 5th Live The world is all one !! DAY2 5th
[765] 2011-06-25 6th SMILE SUMMER FESTIV@L!東京公演 6th
[765] 2011-07-02 6th SMILE SUMMER FESTIV@L!札幌公演 6th
[765] 2011-07-09 6th SMILE SUMMER FESTIV@L!名古屋公演 6th
[765] 2011-07-16 6th SMILE SUMMER FESTIV@L!福岡公演 6th
[765] 2011-07-23 6th SMILE SUMMER FESTIV@L!大阪公演 6th
[765] 2012-06-23~24 7th ANNIVERSARY みんなといっしょに! 7th
[765] 2013-07-07 8th HOP!STEP!!FESTIV@L!!! @NAGOYA 8th
[765] 2013-07-20 8th HOP!STEP!!FESTIV@L!!! @OSAKA0720 8th
[765] 2013-07-21 8th HOP!STEP!!FESTIV@L!!! @OSAKA0721 8th
[765] 2013-08-04 8th HOP!STEP!!FESTIV@L!!! @YOKOHAMA 8th
[765] 2013-09-15 8th HOP!STEP!!FESTIV@L!!! @FUKUOKA 8th
[765] 2013-09-21~22 8th HOP!STEP!!FESTIV@L!!! @MAKUHARI 8th
[CIN] 2014-04-05 CINDERELLA GIRLS 1stLIVE WONDERFUL M@GIC!! 1st
[CIN] 2014-04-06 CINDERELLA GIRLS 1stLIVE WONDERFUL M@GIC!! 1st
[MIL] 2014-06-07 MILLION LIVE! 1stLIVE HAPPY☆PERFORM@NCE!! 1st
[MIL] 2014-06-08 MILLION LIVE! 1stLIVE HAPPY☆PERFORM@NCE!! 1st
[765] 2014-08-02 9th WE ARE M@STERPIECE!!大阪公演 9th
[765] 2014-08-03 9th WE ARE M@STERPIECE!!大阪公演 9th
[765] 2014-08-16 9th WE ARE M@STERPIECE!!名古屋公演 9th
[765] 2014-08-17 9th WE ARE M@STERPIECE!!名古屋公演 9th
[765] 2014-10-04 9th WE ARE M@STERPIECE!!東京公演 9th
[765] 2014-10-05 9th WE ARE M@STERPIECE!!東京公演 9th
[CIN] 2014-11-30 CINDERELLA GIRLS 2ndLIVE PARTY M@GIC!! 2nd
[MIL] 2015-04-04 MILLION LIVE! 2ndLIVE ENJOY H@RMONY!! 2nd
[MIL] 2015-04-05 MILLION LIVE! 2ndLIVE ENJOY H@RMONY!! 2nd
[765] 2015-07-18 M@STERS OF IDOL WORLD!!2015 10th
[765] 2015-07-19 M@STERS OF IDOL WORLD!!2015 10th
[CIN] 2015-11-28 CINDERELLA GIRLS 3rdLIVE シンデレラの舞踏会 3rd
[CIN] 2015-11-29 CINDERELLA GIRLS 3rdLIVE シンデレラの舞踏会 3rd
[SdM] 2015-12-06 SideM 1st STAGE〜ST@RTING!〜 1st
[MIL] 2016-01-31 MILLION LIVE! 3rdLIVE TOUR BELIEVE MY DRE@M!!@NAGOYA 3rd
[MIL] 2016-02-07 MILLION LIVE! 3rdLIVE TOUR BELIEVE MY DRE@M!!@SENDAI 3rd
[MIL] 2016-03-12 MILLION LIVE! 3rdLIVE TOUR BELIEVE MY DRE@M!!@OSAKA 3rd
[MIL] 2016-03-13 MILLION LIVE! 3rdLIVE TOUR BELIEVE MY DRE@M!!@OSAKA 3rd
[MIL] 2016-04-03 MILLION LIVE! 3rdLIVE TOUR BELIEVE MY DRE@M!!@FUKUOKA 3rd
[MIL] 2016-04-16 MILLION LIVE! 3rdLIVE TOUR BELIEVE MY DRE@M!!@MAKUHARI 3rd
[MIL] 2016-04-17 MILLION LIVE! 3rdLIVE TOUR BELIEVE MY DRE@M!!@MAKUHARI 3rd
[CIN] 2016-09-03 CINDERELLA GIRLS 4thLIVE TriCastle Story Starlight Castle 4th
[CIN] 2016-09-04 CINDERELLA GIRLS 4thLIVE TriCastle Story Starlight Castle 4th
[CIN] 2016-10-15 CINDERELLA GIRLS 4thLIVE TriCastle Story Brand new Castle 4th
[CIN] 2016-10-16 CINDERELLA GIRLS 4thLIVE TriCastle Story 346 Castle 4th
[SdM] 2017-02-11 SideM 2nd ORIGIN@L STARS Shining Side 2nd
[SdM] 2017-02-12 SideM 2nd ORIGIN@L STARS Brilliant Side 2nd
[MIL] 2017-03-10 MILLION LIVE! 4thLIVE TH@NK YOU for SMILE!! Sunshine Theater 4th
[MIL] 2017-03-11 MILLION LIVE! 4thLIVE TH@NK YOU for SMILE!! BlueMoon Theater 4th
[MIL] 2017-03-12 MILLION LIVE! 4thLIVE TH@NK YOU for SMILE!! Starlight Theater 4th
[CIN] 2017-05-13~14 CINDERELLA GIRLS 5thLIVE Serendipity Parade!!! 宮城公演 5th
[CIN] 2017-05-27~28 CINDERELLA GIRLS 5thLIVE Serendipity Parade!!! 石川公演 5th
[CIN] 2017-06-09~10 CINDERELLA GIRLS 5thLIVE Serendipity Parade!!! 大阪公演 5th
[CIN] 2017-06-24~25 CINDERELLA GIRLS 5thLIVE Serendipity Parade!!! 静岡公演 5th
[CIN] 2017-07-08~09 CINDERELLA GIRLS 5thLIVE Serendipity Parade!!! 幕張公演 5th
[SdM] 2017-07-15 SideM 3rd Anniversary ST@RTING SIGNAL!!! 2017 3rd
[CIN] 2017-07-29~30 CINDERELLA GIRLS 5thLIVE Serendipity Parade!!! 福岡公演 5th
[CIN] 2017-08-12 CINDERELLA GIRLS 5thLIVE Serendipity Parade!!! SSA公演 5th
[CIN] 2017-08-13 CINDERELLA GIRLS 5thLIVE Serendipity Parade!!! SSA公演 5th
[SdM] 2018-02-03 SideM 3rdLIVE GLORIOUS ST@GE! 幕張公演 DAY1 3rd
[SdM] 2018-02-04 SideM 3rdLIVE GLORIOUS ST@GE! 幕張公演 DAY2 3rd
[SdM] 2018-02-24 SideM 3rdLIVE GLORIOUS ST@GE! 仙台公演 DAY1 3rd
[SdM] 2018-02-25 SideM 3rdLIVE GLORIOUS ST@GE! 仙台公演 DAY2 3rd
[SdM] 2018-03-25 SideM 3rdLIVE GLORIOUS ST@GE! 福岡公演 3rd
[SdM] 2018-04-28 SideM 3rdLIVE GLORIOUS ST@GE! 静岡公演(1日目) 3rd
[SdM] 2018-04-29 SideM 3rdLIVE GLORIOUS ST@GE! 静岡公演(2日目) 3rd
[MIL] 2018-06-02 MILLION LIVE! 5thLIVE BRAND NEW PERFORM@NCE!!! DAY1 5th
[MIL] 2018-06-03 MILLION LIVE! 5thLIVE BRAND NEW PERFORM@NCE!!! DAY2 5th
[CIN] 2018-11-10 CINDERELLA GIRLS 6thLIVE MERRY-GO-ROUNDOME!!! メットライフドーム公演 DAY1 6th
[CIN] 2018-11-11 CINDERELLA GIRLS 6thLIVE MERRY-GO-ROUNDOME!!! メットライフドーム公演 DAY2 6th
[CIN] 2018-12-01 CINDERELLA GIRLS 6thLIVE MERRY-GO-ROUNDOME!!! ナゴヤドーム公演 DAY1 6th
[CIN] 2018-12-02 CINDERELLA GIRLS 6thLIVE MERRY-GO-ROUNDOME!!! ナゴヤドーム公演 DAY2 6th
[SnC] 2019-03-09~10 SHINY COLORS 1stLIVE FLY TO THE SHINY SKY 1st
[MIL] 2019-04-27 MILLION LIVE! 6thLIVE TOUR UNI-ON@IR!!!! 仙台公演 Angel STATION 1日目 6th
[MIL] 2019-04-28 MILLION LIVE! 6thLIVE TOUR UNI-ON@IR!!!! 仙台公演 Angel STATION 2日目 6th
[SdM] 2019-05-11 SideM 4th STAGE 〜TRE@SURE GATE〜 DAY1:SMILE PASSPORT 4th
[SdM] 2019-05-12 SideM 4th STAGE 〜TRE@SURE GATE〜 DAY2:DREAM PASSPORT 4th
[MIL] 2019-05-18 MILLION LIVE! 6thLIVE TOUR UNI-ON@IR!!!! 神戸公演 Princess STATION 1日目 6th
[MIL] 2019-05-19 MILLION LIVE! 6thLIVE TOUR UNI-ON@IR!!!! 神戸公演 Princess STATION 2日目 6th
[MIL] 2019-06-29 MILLION LIVE! 6thLIVE TOUR UNI-ON@IR!!!! 福岡公演 Fairy STATION 1日目 6th
[MIL] 2019-06-30 MILLION LIVE! 6thLIVE TOUR UNI-ON@IR!!!! 福岡公演 Fairy STATION 2日目 6th
[CIN] 2019-09-03 CINDERELLA GIRLS 7thLIVE TOUR Special 3chord♪ Comical Pops! DAY1 7th
[CIN] 2019-09-04 CINDERELLA GIRLS 7thLIVE TOUR Special 3chord♪ Comical Pops! DAY2 7th
[MIL] 2019-09-21 MILLION LIVE! 6thLIVE UNI-ON@IR!!!! SPECIAL DAY1 6th
[MIL] 2019-09-22 MILLION LIVE! 6thLIVE UNI-ON@IR!!!! SPECIAL DAY2 6th
[CIN] 2019-11-09 CINDERELLA GIRLS 7thLIVE TOUR Special 3chord♪ Funky Dancing! DAY1 7th
[CIN] 2019-11-10 CINDERELLA GIRLS 7thLIVE TOUR Special 3chord♪ Funky Dancing! DAY2 7th
[CIN] 2020-02-15 CINDERELLA GIRLS 7thLIVE TOUR Special 3chord♪ Glowing Rock! DAY1 7th
[CIN] 2020-02-16 CINDERELLA GIRLS 7thLIVE TOUR Special 3chord♪ Glowing Rock! DAY2 7th
[SnC] 2021-03-20 SHINY COLORS 2ndLIVE STEP INTO THE SUNSET SKY DAY1 2nd
[SnC] 2021-03-21 SHINY COLORS 2ndLIVE STEP INTO THE SUNSET SKY DAY2 2nd
[SnC] 2021-04-03 SHINY COLORS 3rdLIVE TOUR PIECE ON PLANET / NAGOYA DAY1 3rd
[SnC] 2021-04-04 SHINY COLORS 3rdLIVE TOUR PIECE ON PLANET / NAGOYA DAY2 3rd
[SnC] 2021-04-24 SHINY COLORS 3rdLIVE TOUR PIECE ON PLANET / TOKYO DAY1 3rd
[SnC] 2021-04-25 SHINY COLORS 3rdLIVE TOUR PIECE ON PLANET / TOKYO DAY2 3rd
[MIL] 2021-05-22 MILLION LIVE! 7thLIVE Q@MP FLYER!!! Reburn DAY1 7th
[MIL] 2021-05-23 MILLION LIVE! 7thLIVE Q@MP FLYER!!! Reburn DAY2 7th
[SnC] 2021-05-29 SHINY COLORS 3rdLIVE TOUR PIECE ON PLANET / FUKUOKA DAY1 3rd
[SnC] 2021-05-30 SHINY COLORS 3rdLIVE TOUR PIECE ON PLANET / FUKUOKA DAY2 3rd
[CIN] 2021-10-02 CINDERELLA GIRLS 10th ANNIVERSARY M@GICAL WONDERLAND TOUR!!! MerryMaerchen Land DAY1 10th
[CIN] 2021-10-03 CINDERELLA GIRLS 10th ANNIVERSARY M@GICAL WONDERLAND TOUR!!! MerryMaerchen Land DAY2 10th
[SdM] 2021-11-06 SideM 6thLIVE TOUR ~NEXT DESTIN@TION!~ Side KOBE DAY1 6th
[SdM] 2021-11-07 SideM 6thLIVE TOUR ~NEXT DESTIN@TION!~ Side KOBE DAY2 6th
[CIN] 2021-11-27 CINDERELLA GIRLS 10th ANNIVERSARY M@GICAL WONDERLAND TOUR!!! Celebration Land DAY1 10th
[CIN] 2021-11-28 CINDERELLA GIRLS 10th ANNIVERSARY M@GICAL WONDERLAND TOUR!!! Celebration Land DAY2 10th
[CIN] 2021-12-25 CINDERELLA GIRLS 10th ANNIVERSARY M@GICAL WONDERLAND TOUR!!! CosmoStar Land DAY1 10th
[CIN] 2021-12-26 CINDERELLA GIRLS 10th ANNIVERSARY M@GICAL WONDERLAND TOUR!!! CosmoStar Land DAY2 10th
[SdM] 2022-01-08 SideM 6thLIVE TOUR ~NEXT DESTIN@TION!~ Side TOKYO DAY1 6th
[SdM] 2022-01-09 SideM 6thLIVE TOUR ~NEXT DESTIN@TION!~ Side TOKYO DAY2 6th
[CIN] 2022-01-29 CINDERELLA GIRLS 10th ANNIVERSARY M@GICAL WONDERLAND TOUR!!! Tropical Land DAY1 10th
[CIN] 2022-01-30 CINDERELLA GIRLS 10th ANNIVERSARY M@GICAL WONDERLAND TOUR!!! Tropical Land DAY2 10th
[MIL] 2022-02-12 MILLION LIVE! 8thLIVE Twelw@ve DAY1 8th
[MIL] 2022-02-13 MILLION LIVE! 8thLIVE Twelw@ve DAY2 8th
[CIN] 2022-04-02 CINDERELLA GIRLS 10th ANNIVERSARY M@GICAL WONDERLAND!!! DAY1 10th
[CIN] 2022-04-03 CINDERELLA GIRLS 10th ANNIVERSARY M@GICAL WONDERLAND!!! DAY2 10th
[SdM] 2022-04-16 SideM 6thLIVE TOUR ~NEXT DESTIN@TION!~ Side HOKKAIDO DAY1 6th
[SdM] 2022-04-17 SideM 6thLIVE TOUR ~NEXT DESTIN@TION!~ Side HOKKAIDO DAY2 6th
[SnC] 2022-04-23 SHINY COLORS 4thLIVE 空は澄み、今を越えて。DAY1 4th
[SnC] 2022-04-24 SHINY COLORS 4thLIVE 空は澄み、今を越えて。DAY2 4th
[SdM] 2022-10-01 SideM 7th STAGE 〜GROW & GLOW〜 STARLIGHT SIGN@L DAY1 7th
[SdM] 2022-10-02 SideM 7th STAGE 〜GROW & GLOW〜 STARLIGHT SIGN@L DAY2 7th
[SdM] 2022-12-03 SideM 7th STAGE 〜GROW & GLOW〜 SUNLIGHT SIGN@L DAY1 7th
[SdM] 2022-12-04 SideM 7th STAGE 〜GROW & GLOW〜 SUNLIGHT SIGN@L DAY2 7th
[MIL] 2023-01-14 THE IDOLM@STER MILLION LIVE! 9thLIVE ChoruSp@rkle!! Day1 9th
[MIL] 2023-01-15 THE IDOLM@STER MILLION LIVE! 9thLIVE ChoruSp@rkle!! Day2 9th
[SnC] 2023-03-18 THE IDOLM@STER SHINY COLORS 5thLIVE If I_wings. DAY1 5th
[SnC] 2023-03-19 THE IDOLM@STER SHINY COLORS 5thLIVE If I_wings. DAY2 5th
[MIL] 2023-04-22 THE IDOLM@STER MILLION LIVE! 10thLIVE TOUR Act-1 H@PPY 4 YOU! Day1 10th
[MIL] 2023-04-23 THE IDOLM@STER MILLION LIVE! 10thLIVE TOUR Act-1 H@PPY 4 YOU! Day2 10th
[MIL] 2023-07-29 THE IDOLM@STER MILLION LIVE! 10thLIVE TOUR Act-2 5 TO SP@RKLE!! Day1 10th
[MIL] 2023-07-30 THE IDOLM@STER MILLION LIVE! 10thLIVE TOUR Act-2 5 TO SP@RKLE!! Day2 10th
[MIL] 2023-11-04 THE IDOLM@STER MILLION LIVE! 10thLIVE TOUR Act-3 R@ISE THE DREAM!!! Day1 10th
[MIL] 2023-11-05 THE IDOLM@STER MILLION LIVE! 10thLIVE TOUR Act-3 R@ISE THE DREAM!!! Day2 10th
[MIL] 2024-02-24 THE IDOLM@STER MILLION LIVE! 10thLIVE TOUR Act-4 MILLION THE@TER!!!! Day1 10th
[MIL] 2024-02-25 THE IDOLM@STER MILLION LIVE! 10thLIVE TOUR Act-4 MILLION THE@TER!!!! Day2 10th
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment