2019-10-25 16:58:16 +00:00
|
|
|
require "pool/connection"
|
|
|
|
|
2019-10-25 22:02:33 +00:00
|
|
|
CHROME_VERSIONS = [
|
|
|
|
"68.0.3440.103",
|
|
|
|
"68.0.3440.104",
|
|
|
|
"68.0.3440.105",
|
|
|
|
"68.0.3440.106",
|
|
|
|
"68.0.3440.107",
|
|
|
|
"68.0.3440.108",
|
|
|
|
"68.0.3440.109",
|
|
|
|
"68.0.3440.110",
|
|
|
|
"68.0.3440.111",
|
|
|
|
"68.0.3440.112",
|
|
|
|
"68.0.3440.113",
|
|
|
|
"68.0.3440.114",
|
|
|
|
"68.0.3440.115",
|
|
|
|
"68.0.3440.116",
|
|
|
|
"68.0.3440.117",
|
|
|
|
"68.0.3440.118",
|
|
|
|
"68.0.3440.119",
|
|
|
|
"68.0.3440.120",
|
|
|
|
"68.0.3440.121",
|
|
|
|
"68.0.3440.122",
|
|
|
|
"68.0.3440.123",
|
|
|
|
"68.0.3440.124",
|
|
|
|
"68.0.3440.125",
|
|
|
|
"68.0.3440.126",
|
|
|
|
"68.0.3440.127",
|
|
|
|
"68.0.3440.128",
|
|
|
|
"68.0.3440.129",
|
|
|
|
"68.0.3440.130",
|
|
|
|
"68.0.3440.131",
|
|
|
|
"68.0.3440.132",
|
|
|
|
"68.0.3440.133",
|
|
|
|
"68.0.3440.134",
|
|
|
|
"69.0.3497.100",
|
|
|
|
"69.0.3497.101",
|
|
|
|
"69.0.3497.102",
|
|
|
|
"69.0.3497.103",
|
|
|
|
"69.0.3497.104",
|
|
|
|
"69.0.3497.105",
|
|
|
|
"69.0.3497.106",
|
|
|
|
"69.0.3497.107",
|
|
|
|
"69.0.3497.108",
|
|
|
|
"69.0.3497.109",
|
|
|
|
"69.0.3497.110",
|
|
|
|
"69.0.3497.111",
|
|
|
|
"69.0.3497.112",
|
|
|
|
"69.0.3497.113",
|
|
|
|
"69.0.3497.114",
|
|
|
|
"69.0.3497.115",
|
|
|
|
"69.0.3497.116",
|
|
|
|
"69.0.3497.117",
|
|
|
|
"69.0.3497.118",
|
|
|
|
"69.0.3497.119",
|
|
|
|
"69.0.3497.120",
|
|
|
|
"69.0.3497.121",
|
|
|
|
"69.0.3497.122",
|
|
|
|
"69.0.3497.123",
|
|
|
|
"69.0.3497.124",
|
|
|
|
"69.0.3497.125",
|
|
|
|
"69.0.3497.126",
|
|
|
|
"69.0.3497.127",
|
|
|
|
"69.0.3497.128",
|
|
|
|
"69.0.3497.28",
|
|
|
|
"69.0.3497.29",
|
|
|
|
"69.0.3497.30",
|
|
|
|
"69.0.3497.31",
|
|
|
|
"69.0.3497.32",
|
|
|
|
"69.0.3497.33",
|
|
|
|
"69.0.3497.34",
|
|
|
|
"69.0.3497.35",
|
|
|
|
"69.0.3497.36",
|
|
|
|
"69.0.3497.37",
|
|
|
|
"69.0.3497.38",
|
|
|
|
"69.0.3497.39",
|
|
|
|
"69.0.3497.40",
|
|
|
|
"69.0.3497.41",
|
|
|
|
"69.0.3497.42",
|
|
|
|
"69.0.3497.43",
|
|
|
|
"69.0.3497.44",
|
|
|
|
"69.0.3497.45",
|
|
|
|
"69.0.3497.46",
|
|
|
|
"69.0.3497.47",
|
|
|
|
"69.0.3497.48",
|
|
|
|
"69.0.3497.49",
|
|
|
|
"69.0.3497.50",
|
|
|
|
"69.0.3497.51",
|
|
|
|
"69.0.3497.52",
|
|
|
|
"69.0.3497.53",
|
|
|
|
"69.0.3497.54",
|
|
|
|
"69.0.3497.55",
|
|
|
|
"69.0.3497.56",
|
|
|
|
"69.0.3497.57",
|
|
|
|
"69.0.3497.58",
|
|
|
|
"69.0.3497.60",
|
|
|
|
"69.0.3497.64",
|
|
|
|
"69.0.3497.65",
|
|
|
|
"69.0.3497.66",
|
|
|
|
"69.0.3497.67",
|
|
|
|
"69.0.3497.68",
|
|
|
|
"69.0.3497.69",
|
|
|
|
"69.0.3497.70",
|
|
|
|
"69.0.3497.71",
|
|
|
|
"69.0.3497.72",
|
|
|
|
"69.0.3497.73",
|
|
|
|
"69.0.3497.74",
|
|
|
|
"69.0.3497.75",
|
|
|
|
"69.0.3497.76",
|
|
|
|
"69.0.3497.77",
|
|
|
|
"69.0.3497.78",
|
|
|
|
"69.0.3497.79",
|
|
|
|
"69.0.3497.80",
|
|
|
|
"69.0.3497.81",
|
|
|
|
"69.0.3497.82",
|
|
|
|
"69.0.3497.83",
|
|
|
|
"69.0.3497.84",
|
|
|
|
"69.0.3497.85",
|
|
|
|
"69.0.3497.86",
|
|
|
|
"69.0.3497.87",
|
|
|
|
"69.0.3497.88",
|
|
|
|
"69.0.3497.89",
|
|
|
|
"69.0.3497.90",
|
|
|
|
"69.0.3497.91",
|
|
|
|
"69.0.3497.92",
|
|
|
|
"69.0.3497.93",
|
|
|
|
"69.0.3497.94",
|
|
|
|
"69.0.3497.95",
|
|
|
|
"69.0.3497.96",
|
|
|
|
"69.0.3497.97",
|
|
|
|
"69.0.3497.98",
|
|
|
|
"69.0.3497.99",
|
|
|
|
"70.0.3505.6",
|
|
|
|
"70.0.3505.7",
|
|
|
|
"70.0.3505.8",
|
|
|
|
"70.0.3505.9",
|
|
|
|
"70.0.3513.0",
|
|
|
|
"70.0.3513.1",
|
|
|
|
"70.0.3514.0",
|
|
|
|
"70.0.3514.1",
|
|
|
|
"70.0.3514.2",
|
|
|
|
"70.0.3515.0",
|
|
|
|
"70.0.3515.1",
|
|
|
|
"70.0.3515.2",
|
|
|
|
"70.0.3515.3",
|
|
|
|
"70.0.3515.4",
|
|
|
|
"70.0.3516.0",
|
|
|
|
"70.0.3516.1",
|
|
|
|
"70.0.3516.2",
|
|
|
|
"70.0.3516.3",
|
|
|
|
"70.0.3517.0",
|
|
|
|
"70.0.3517.1",
|
|
|
|
"70.0.3518.0",
|
|
|
|
"70.0.3518.1",
|
|
|
|
"70.0.3519.0",
|
|
|
|
"70.0.3519.1",
|
|
|
|
"70.0.3519.2",
|
|
|
|
"70.0.3519.3",
|
|
|
|
"70.0.3520.0",
|
|
|
|
"70.0.3520.1",
|
|
|
|
"70.0.3521.0",
|
|
|
|
"70.0.3521.1",
|
|
|
|
"70.0.3521.2",
|
|
|
|
"70.0.3522.0",
|
|
|
|
"70.0.3522.1",
|
|
|
|
"70.0.3523.0",
|
|
|
|
"70.0.3523.1",
|
|
|
|
"70.0.3523.2",
|
|
|
|
"70.0.3524.0",
|
|
|
|
"70.0.3524.1",
|
|
|
|
"70.0.3524.2",
|
|
|
|
"70.0.3524.3",
|
|
|
|
"70.0.3524.4",
|
|
|
|
"70.0.3525.0",
|
|
|
|
"70.0.3525.1",
|
|
|
|
"70.0.3525.2",
|
|
|
|
"70.0.3525.3",
|
|
|
|
"70.0.3525.4",
|
|
|
|
"70.0.3525.5",
|
|
|
|
"70.0.3526.0",
|
|
|
|
"70.0.3526.1",
|
|
|
|
"70.0.3527.0",
|
|
|
|
"70.0.3527.1",
|
|
|
|
"70.0.3528.0",
|
|
|
|
"70.0.3528.1",
|
|
|
|
"70.0.3528.2",
|
|
|
|
"70.0.3528.3",
|
|
|
|
"70.0.3528.4",
|
|
|
|
"70.0.3529.0",
|
|
|
|
"70.0.3529.1",
|
|
|
|
"70.0.3529.2",
|
|
|
|
"70.0.3529.3",
|
|
|
|
"70.0.3530.0",
|
|
|
|
"70.0.3530.1",
|
|
|
|
"70.0.3530.2",
|
|
|
|
"70.0.3530.3",
|
|
|
|
"70.0.3530.4",
|
|
|
|
"70.0.3531.0",
|
|
|
|
"70.0.3532.0",
|
|
|
|
"70.0.3532.1",
|
|
|
|
"70.0.3532.2",
|
|
|
|
"70.0.3532.3",
|
|
|
|
"70.0.3532.4",
|
|
|
|
"70.0.3532.5",
|
|
|
|
"70.0.3532.6",
|
|
|
|
"70.0.3532.7",
|
|
|
|
"70.0.3532.8",
|
|
|
|
"70.0.3533.0",
|
|
|
|
"70.0.3533.1",
|
|
|
|
"70.0.3533.2",
|
|
|
|
"70.0.3534.0",
|
|
|
|
"70.0.3534.1",
|
|
|
|
"70.0.3534.2",
|
|
|
|
"70.0.3534.3",
|
|
|
|
"70.0.3534.4",
|
|
|
|
"70.0.3535.0",
|
|
|
|
"70.0.3535.1",
|
|
|
|
"70.0.3535.2",
|
|
|
|
"70.0.3535.3",
|
|
|
|
"70.0.3535.4",
|
|
|
|
"70.0.3535.5",
|
|
|
|
"70.0.3536.0",
|
|
|
|
"70.0.3537.0",
|
|
|
|
"70.0.3537.1",
|
|
|
|
"70.0.3537.2",
|
|
|
|
"70.0.3538.0",
|
|
|
|
"70.0.3538.1",
|
|
|
|
"70.0.3538.10",
|
|
|
|
"70.0.3538.100",
|
|
|
|
"70.0.3538.101",
|
|
|
|
"70.0.3538.102",
|
|
|
|
"70.0.3538.103",
|
|
|
|
"70.0.3538.104",
|
|
|
|
"70.0.3538.105",
|
|
|
|
"70.0.3538.106",
|
|
|
|
"70.0.3538.107",
|
|
|
|
"70.0.3538.108",
|
|
|
|
"70.0.3538.109",
|
|
|
|
"70.0.3538.11",
|
|
|
|
"70.0.3538.110",
|
|
|
|
"70.0.3538.111",
|
|
|
|
"70.0.3538.112",
|
|
|
|
"70.0.3538.113",
|
|
|
|
"70.0.3538.114",
|
|
|
|
"70.0.3538.115",
|
|
|
|
"70.0.3538.116",
|
|
|
|
"70.0.3538.117",
|
|
|
|
"70.0.3538.118",
|
|
|
|
"70.0.3538.119",
|
|
|
|
"70.0.3538.12",
|
|
|
|
"70.0.3538.120",
|
|
|
|
"70.0.3538.121",
|
|
|
|
"70.0.3538.122",
|
|
|
|
"70.0.3538.123",
|
|
|
|
"70.0.3538.124",
|
|
|
|
"70.0.3538.13",
|
|
|
|
"70.0.3538.14",
|
|
|
|
"70.0.3538.15",
|
|
|
|
"70.0.3538.16",
|
|
|
|
"70.0.3538.17",
|
|
|
|
"70.0.3538.18",
|
|
|
|
"70.0.3538.19",
|
|
|
|
"70.0.3538.2",
|
|
|
|
"70.0.3538.20",
|
|
|
|
"70.0.3538.21",
|
|
|
|
"70.0.3538.22",
|
|
|
|
"70.0.3538.23",
|
|
|
|
"70.0.3538.24",
|
|
|
|
"70.0.3538.25",
|
|
|
|
"70.0.3538.26",
|
|
|
|
"70.0.3538.27",
|
|
|
|
"70.0.3538.28",
|
|
|
|
"70.0.3538.29",
|
|
|
|
"70.0.3538.3",
|
|
|
|
"70.0.3538.30",
|
|
|
|
"70.0.3538.31",
|
|
|
|
"70.0.3538.32",
|
|
|
|
"70.0.3538.33",
|
|
|
|
"70.0.3538.34",
|
|
|
|
"70.0.3538.35",
|
|
|
|
"70.0.3538.36",
|
|
|
|
"70.0.3538.37",
|
|
|
|
"70.0.3538.38",
|
|
|
|
"70.0.3538.39",
|
|
|
|
"70.0.3538.4",
|
|
|
|
"70.0.3538.40",
|
|
|
|
"70.0.3538.41",
|
|
|
|
"70.0.3538.42",
|
|
|
|
"70.0.3538.43",
|
|
|
|
"70.0.3538.44",
|
|
|
|
"70.0.3538.45",
|
|
|
|
"70.0.3538.46",
|
|
|
|
"70.0.3538.47",
|
|
|
|
"70.0.3538.48",
|
|
|
|
"70.0.3538.49",
|
|
|
|
"70.0.3538.5",
|
|
|
|
"70.0.3538.50",
|
|
|
|
"70.0.3538.51",
|
|
|
|
"70.0.3538.52",
|
|
|
|
"70.0.3538.53",
|
|
|
|
"70.0.3538.54",
|
|
|
|
"70.0.3538.55",
|
|
|
|
"70.0.3538.56",
|
|
|
|
"70.0.3538.57",
|
|
|
|
"70.0.3538.58",
|
|
|
|
"70.0.3538.59",
|
|
|
|
"70.0.3538.6",
|
|
|
|
"70.0.3538.60",
|
|
|
|
"70.0.3538.61",
|
|
|
|
"70.0.3538.62",
|
|
|
|
"70.0.3538.63",
|
|
|
|
"70.0.3538.64",
|
|
|
|
"70.0.3538.65",
|
|
|
|
"70.0.3538.66",
|
|
|
|
"70.0.3538.67",
|
|
|
|
"70.0.3538.69",
|
|
|
|
"70.0.3538.7",
|
|
|
|
"70.0.3538.70",
|
|
|
|
"70.0.3538.71",
|
|
|
|
"70.0.3538.72",
|
|
|
|
"70.0.3538.73",
|
|
|
|
"70.0.3538.74",
|
|
|
|
"70.0.3538.75",
|
|
|
|
"70.0.3538.76",
|
|
|
|
"70.0.3538.77",
|
|
|
|
"70.0.3538.78",
|
|
|
|
"70.0.3538.79",
|
|
|
|
"70.0.3538.8",
|
|
|
|
"70.0.3538.80",
|
|
|
|
"70.0.3538.81",
|
|
|
|
"70.0.3538.82",
|
|
|
|
"70.0.3538.83",
|
|
|
|
"70.0.3538.84",
|
|
|
|
"70.0.3538.85",
|
|
|
|
"70.0.3538.86",
|
|
|
|
"70.0.3538.87",
|
|
|
|
"70.0.3538.9",
|
|
|
|
"70.0.3538.93",
|
|
|
|
"70.0.3538.94",
|
|
|
|
"70.0.3538.95",
|
|
|
|
"70.0.3538.96",
|
|
|
|
"70.0.3538.97",
|
|
|
|
"70.0.3538.98",
|
|
|
|
"70.0.3538.99",
|
|
|
|
"71.0.3539.0",
|
|
|
|
"71.0.3539.1",
|
|
|
|
"71.0.3540.0",
|
|
|
|
"71.0.3540.1",
|
|
|
|
"71.0.3541.0",
|
|
|
|
"71.0.3541.1",
|
|
|
|
"71.0.3542.0",
|
|
|
|
"71.0.3542.1",
|
|
|
|
"71.0.3542.2",
|
|
|
|
"71.0.3543.0",
|
|
|
|
"71.0.3543.1",
|
|
|
|
"71.0.3543.2",
|
|
|
|
"71.0.3543.3",
|
|
|
|
"71.0.3543.4",
|
|
|
|
"71.0.3544.0",
|
|
|
|
"71.0.3544.1",
|
|
|
|
"71.0.3544.2",
|
|
|
|
"71.0.3544.3",
|
|
|
|
"71.0.3544.4",
|
|
|
|
"71.0.3544.5",
|
|
|
|
"71.0.3545.0",
|
|
|
|
"71.0.3545.1",
|
|
|
|
"71.0.3545.2",
|
|
|
|
"71.0.3545.3",
|
|
|
|
"71.0.3545.4",
|
|
|
|
"71.0.3546.0",
|
|
|
|
"71.0.3546.1",
|
|
|
|
"71.0.3546.2",
|
|
|
|
"71.0.3547.0",
|
|
|
|
"71.0.3547.1",
|
|
|
|
"71.0.3548.0",
|
|
|
|
"71.0.3548.1",
|
|
|
|
"71.0.3549.0",
|
|
|
|
"71.0.3549.1",
|
|
|
|
"71.0.3550.0",
|
|
|
|
"71.0.3550.1",
|
|
|
|
"71.0.3550.2",
|
|
|
|
"71.0.3550.3",
|
|
|
|
"71.0.3551.0",
|
|
|
|
"71.0.3551.1",
|
|
|
|
"71.0.3551.2",
|
|
|
|
"71.0.3551.3",
|
|
|
|
"71.0.3552.0",
|
|
|
|
"71.0.3552.1",
|
|
|
|
"71.0.3552.2",
|
|
|
|
"71.0.3552.3",
|
|
|
|
"71.0.3552.4",
|
|
|
|
"71.0.3552.5",
|
|
|
|
"71.0.3552.6",
|
|
|
|
"71.0.3553.0",
|
|
|
|
"71.0.3553.1",
|
|
|
|
"71.0.3553.2",
|
|
|
|
"71.0.3553.3",
|
|
|
|
"71.0.3554.0",
|
|
|
|
"71.0.3554.1",
|
|
|
|
"71.0.3554.2",
|
|
|
|
"71.0.3554.3",
|
|
|
|
"71.0.3554.4",
|
|
|
|
"71.0.3555.0",
|
|
|
|
"71.0.3555.1",
|
|
|
|
"71.0.3555.2",
|
|
|
|
"71.0.3556.0",
|
|
|
|
"71.0.3556.1",
|
|
|
|
"71.0.3557.0",
|
|
|
|
"71.0.3557.1",
|
|
|
|
"71.0.3557.2",
|
|
|
|
"71.0.3558.0",
|
|
|
|
"71.0.3558.1",
|
|
|
|
"71.0.3558.2",
|
|
|
|
"71.0.3559.0",
|
|
|
|
"71.0.3559.1",
|
|
|
|
"71.0.3559.2",
|
|
|
|
"71.0.3559.3",
|
|
|
|
"71.0.3559.4",
|
|
|
|
"71.0.3559.5",
|
|
|
|
"71.0.3559.6",
|
|
|
|
"71.0.3560.0",
|
|
|
|
"71.0.3560.1",
|
|
|
|
"71.0.3561.0",
|
|
|
|
"71.0.3561.1",
|
|
|
|
"71.0.3562.0",
|
|
|
|
"71.0.3562.1",
|
|
|
|
"71.0.3562.2",
|
|
|
|
"71.0.3563.0",
|
|
|
|
"71.0.3564.0",
|
|
|
|
"71.0.3564.1",
|
|
|
|
"71.0.3565.0",
|
|
|
|
"71.0.3565.1",
|
|
|
|
"71.0.3566.0",
|
|
|
|
"71.0.3566.1",
|
|
|
|
"71.0.3567.0",
|
|
|
|
"71.0.3567.1",
|
|
|
|
"71.0.3568.0",
|
|
|
|
"71.0.3568.1",
|
|
|
|
"71.0.3568.2",
|
|
|
|
"71.0.3569.0",
|
|
|
|
"71.0.3569.1",
|
|
|
|
"71.0.3570.0",
|
|
|
|
"71.0.3570.1",
|
|
|
|
"71.0.3571.0",
|
|
|
|
"71.0.3571.1",
|
|
|
|
"71.0.3571.2",
|
|
|
|
"71.0.3572.0",
|
|
|
|
"71.0.3572.1",
|
|
|
|
"71.0.3573.0",
|
|
|
|
"71.0.3573.1",
|
|
|
|
"71.0.3574.0",
|
|
|
|
"71.0.3574.1",
|
|
|
|
"71.0.3575.0",
|
|
|
|
"71.0.3575.1",
|
|
|
|
"71.0.3575.2",
|
|
|
|
"71.0.3576.0",
|
|
|
|
"71.0.3576.1",
|
|
|
|
"71.0.3576.2",
|
|
|
|
"71.0.3577.0",
|
|
|
|
"71.0.3577.1",
|
|
|
|
"71.0.3578.0",
|
|
|
|
"71.0.3578.1",
|
|
|
|
"71.0.3578.10",
|
|
|
|
"71.0.3578.100",
|
|
|
|
"71.0.3578.101",
|
|
|
|
"71.0.3578.102",
|
|
|
|
"71.0.3578.103",
|
|
|
|
"71.0.3578.104",
|
|
|
|
"71.0.3578.105",
|
|
|
|
"71.0.3578.106",
|
|
|
|
"71.0.3578.107",
|
|
|
|
"71.0.3578.108",
|
|
|
|
"71.0.3578.109",
|
|
|
|
"71.0.3578.11",
|
|
|
|
"71.0.3578.110",
|
|
|
|
"71.0.3578.111",
|
|
|
|
"71.0.3578.112",
|
|
|
|
"71.0.3578.113",
|
|
|
|
"71.0.3578.114",
|
|
|
|
"71.0.3578.115",
|
|
|
|
"71.0.3578.116",
|
|
|
|
"71.0.3578.117",
|
|
|
|
"71.0.3578.118",
|
|
|
|
"71.0.3578.119",
|
|
|
|
"71.0.3578.12",
|
|
|
|
"71.0.3578.120",
|
|
|
|
"71.0.3578.121",
|
|
|
|
"71.0.3578.122",
|
|
|
|
"71.0.3578.123",
|
|
|
|
"71.0.3578.124",
|
|
|
|
"71.0.3578.125",
|
|
|
|
"71.0.3578.126",
|
|
|
|
"71.0.3578.127",
|
|
|
|
"71.0.3578.128",
|
|
|
|
"71.0.3578.129",
|
|
|
|
"71.0.3578.13",
|
|
|
|
"71.0.3578.130",
|
|
|
|
"71.0.3578.131",
|
|
|
|
"71.0.3578.132",
|
|
|
|
"71.0.3578.133",
|
|
|
|
"71.0.3578.134",
|
|
|
|
"71.0.3578.135",
|
|
|
|
"71.0.3578.136",
|
|
|
|
"71.0.3578.137",
|
|
|
|
"71.0.3578.138",
|
|
|
|
"71.0.3578.139",
|
|
|
|
"71.0.3578.14",
|
|
|
|
"71.0.3578.140",
|
|
|
|
"71.0.3578.141",
|
|
|
|
"71.0.3578.15",
|
|
|
|
"71.0.3578.16",
|
|
|
|
"71.0.3578.17",
|
|
|
|
"71.0.3578.18",
|
|
|
|
"71.0.3578.19",
|
|
|
|
"71.0.3578.2",
|
|
|
|
"71.0.3578.20",
|
|
|
|
"71.0.3578.21",
|
|
|
|
"71.0.3578.22",
|
|
|
|
"71.0.3578.23",
|
|
|
|
"71.0.3578.24",
|
|
|
|
"71.0.3578.25",
|
|
|
|
"71.0.3578.26",
|
|
|
|
"71.0.3578.27",
|
|
|
|
"71.0.3578.28",
|
|
|
|
"71.0.3578.29",
|
|
|
|
"71.0.3578.3",
|
|
|
|
"71.0.3578.30",
|
|
|
|
"71.0.3578.31",
|
|
|
|
"71.0.3578.32",
|
|
|
|
"71.0.3578.33",
|
|
|
|
"71.0.3578.34",
|
|
|
|
"71.0.3578.35",
|
|
|
|
"71.0.3578.36",
|
|
|
|
"71.0.3578.37",
|
|
|
|
"71.0.3578.38",
|
|
|
|
"71.0.3578.39",
|
|
|
|
"71.0.3578.4",
|
|
|
|
"71.0.3578.40",
|
|
|
|
"71.0.3578.41",
|
|
|
|
"71.0.3578.42",
|
|
|
|
"71.0.3578.43",
|
|
|
|
"71.0.3578.44",
|
|
|
|
"71.0.3578.45",
|
|
|
|
"71.0.3578.46",
|
|
|
|
"71.0.3578.47",
|
|
|
|
"71.0.3578.48",
|
|
|
|
"71.0.3578.49",
|
|
|
|
"71.0.3578.5",
|
|
|
|
"71.0.3578.50",
|
|
|
|
"71.0.3578.51",
|
|
|
|
"71.0.3578.52",
|
|
|
|
"71.0.3578.53",
|
|
|
|
"71.0.3578.54",
|
|
|
|
"71.0.3578.55",
|
|
|
|
"71.0.3578.56",
|
|
|
|
"71.0.3578.57",
|
|
|
|
"71.0.3578.58",
|
|
|
|
"71.0.3578.59",
|
|
|
|
"71.0.3578.6",
|
|
|
|
"71.0.3578.60",
|
|
|
|
"71.0.3578.61",
|
|
|
|
"71.0.3578.62",
|
|
|
|
"71.0.3578.63",
|
|
|
|
"71.0.3578.64",
|
|
|
|
"71.0.3578.65",
|
|
|
|
"71.0.3578.66",
|
|
|
|
"71.0.3578.67",
|
|
|
|
"71.0.3578.68",
|
|
|
|
"71.0.3578.69",
|
|
|
|
"71.0.3578.7",
|
|
|
|
"71.0.3578.70",
|
|
|
|
"71.0.3578.71",
|
|
|
|
"71.0.3578.72",
|
|
|
|
"71.0.3578.73",
|
|
|
|
"71.0.3578.74",
|
|
|
|
"71.0.3578.75",
|
|
|
|
"71.0.3578.76",
|
|
|
|
"71.0.3578.77",
|
|
|
|
"71.0.3578.78",
|
|
|
|
"71.0.3578.79",
|
|
|
|
"71.0.3578.8",
|
|
|
|
"71.0.3578.80",
|
|
|
|
"71.0.3578.81",
|
|
|
|
"71.0.3578.82",
|
|
|
|
"71.0.3578.83",
|
|
|
|
"71.0.3578.84",
|
|
|
|
"71.0.3578.85",
|
|
|
|
"71.0.3578.86",
|
|
|
|
"71.0.3578.87",
|
|
|
|
"71.0.3578.88",
|
|
|
|
"71.0.3578.89",
|
|
|
|
"71.0.3578.9",
|
|
|
|
"71.0.3578.90",
|
|
|
|
"71.0.3578.91",
|
|
|
|
"71.0.3578.92",
|
|
|
|
"71.0.3578.93",
|
|
|
|
"71.0.3578.94",
|
|
|
|
"71.0.3578.95",
|
|
|
|
"71.0.3578.96",
|
|
|
|
"71.0.3578.97",
|
|
|
|
"71.0.3578.98",
|
|
|
|
"71.0.3578.99",
|
|
|
|
"72.0.3579.0",
|
|
|
|
"72.0.3579.1",
|
|
|
|
"72.0.3580.0",
|
|
|
|
"72.0.3580.1",
|
|
|
|
"72.0.3581.0",
|
|
|
|
"72.0.3581.1",
|
|
|
|
"72.0.3581.2",
|
|
|
|
"72.0.3581.3",
|
|
|
|
"72.0.3581.4",
|
|
|
|
"72.0.3582.0",
|
|
|
|
"72.0.3583.0",
|
|
|
|
"72.0.3583.1",
|
|
|
|
"72.0.3583.2",
|
|
|
|
"72.0.3584.0",
|
|
|
|
"72.0.3584.1",
|
|
|
|
"72.0.3585.0",
|
|
|
|
"72.0.3585.1",
|
|
|
|
"72.0.3586.0",
|
|
|
|
"72.0.3586.1",
|
|
|
|
"72.0.3586.2",
|
|
|
|
"72.0.3587.0",
|
|
|
|
"72.0.3588.0",
|
|
|
|
"72.0.3588.1",
|
|
|
|
"72.0.3589.0",
|
|
|
|
"72.0.3589.1",
|
|
|
|
"72.0.3589.2",
|
|
|
|
"72.0.3589.3",
|
|
|
|
"72.0.3590.0",
|
|
|
|
"72.0.3590.1",
|
|
|
|
"72.0.3591.0",
|
|
|
|
"72.0.3591.1",
|
|
|
|
"72.0.3591.2",
|
|
|
|
"72.0.3591.3",
|
|
|
|
"72.0.3592.0",
|
|
|
|
"72.0.3592.1",
|
|
|
|
"72.0.3592.2",
|
|
|
|
"72.0.3593.0",
|
|
|
|
"72.0.3593.1",
|
|
|
|
"72.0.3593.2",
|
|
|
|
"72.0.3594.0",
|
|
|
|
"72.0.3594.1",
|
|
|
|
"72.0.3595.0",
|
|
|
|
"72.0.3595.1",
|
|
|
|
"72.0.3595.2",
|
|
|
|
"72.0.3596.0",
|
|
|
|
"72.0.3596.1",
|
|
|
|
"72.0.3596.2",
|
|
|
|
"72.0.3597.0",
|
|
|
|
"72.0.3597.1",
|
|
|
|
"72.0.3598.0",
|
|
|
|
"72.0.3598.1",
|
|
|
|
"72.0.3599.0",
|
|
|
|
"72.0.3599.1",
|
|
|
|
"72.0.3599.2",
|
|
|
|
"72.0.3599.3",
|
|
|
|
"72.0.3600.0",
|
|
|
|
"72.0.3600.1",
|
|
|
|
"72.0.3601.0",
|
|
|
|
"72.0.3601.1",
|
|
|
|
"72.0.3602.0",
|
|
|
|
"72.0.3602.1",
|
|
|
|
"72.0.3602.2",
|
|
|
|
"72.0.3602.3",
|
|
|
|
"72.0.3603.0",
|
|
|
|
"72.0.3603.1",
|
|
|
|
"72.0.3603.2",
|
|
|
|
"72.0.3604.0",
|
|
|
|
"72.0.3604.1",
|
|
|
|
"72.0.3605.0",
|
|
|
|
"72.0.3605.1",
|
|
|
|
"72.0.3605.2",
|
|
|
|
"72.0.3605.3",
|
|
|
|
"72.0.3606.0",
|
|
|
|
"72.0.3606.1",
|
|
|
|
"72.0.3606.2",
|
|
|
|
"72.0.3607.0",
|
|
|
|
"72.0.3607.1",
|
|
|
|
"72.0.3608.0",
|
|
|
|
"72.0.3608.1",
|
|
|
|
"72.0.3608.2",
|
|
|
|
"72.0.3608.3",
|
|
|
|
"72.0.3608.4",
|
|
|
|
"72.0.3608.5",
|
|
|
|
"72.0.3609.0",
|
|
|
|
"72.0.3609.1",
|
|
|
|
"72.0.3609.2",
|
|
|
|
"72.0.3609.3",
|
|
|
|
"72.0.3610.0",
|
|
|
|
"72.0.3610.1",
|
|
|
|
"72.0.3610.2",
|
|
|
|
"72.0.3610.3",
|
|
|
|
"72.0.3610.4",
|
|
|
|
"72.0.3611.0",
|
|
|
|
"72.0.3611.1",
|
|
|
|
"72.0.3611.2",
|
|
|
|
"72.0.3612.0",
|
|
|
|
"72.0.3612.1",
|
|
|
|
"72.0.3612.2",
|
|
|
|
"72.0.3613.0",
|
|
|
|
"72.0.3613.1",
|
|
|
|
"72.0.3614.0",
|
|
|
|
"72.0.3614.1",
|
|
|
|
"72.0.3615.0",
|
|
|
|
"72.0.3615.1",
|
|
|
|
"72.0.3616.0",
|
|
|
|
"72.0.3616.1",
|
|
|
|
"72.0.3617.0",
|
|
|
|
"72.0.3617.1",
|
|
|
|
"72.0.3618.0",
|
|
|
|
"72.0.3618.1",
|
|
|
|
"72.0.3619.0",
|
|
|
|
"72.0.3619.1",
|
|
|
|
"72.0.3620.0",
|
|
|
|
"72.0.3620.1",
|
|
|
|
"72.0.3621.0",
|
|
|
|
"72.0.3621.1",
|
|
|
|
"72.0.3622.0",
|
|
|
|
"72.0.3622.1",
|
|
|
|
"72.0.3622.2",
|
|
|
|
"72.0.3622.3",
|
|
|
|
"72.0.3623.0",
|
|
|
|
"72.0.3623.1",
|
|
|
|
"72.0.3623.2",
|
|
|
|
"72.0.3623.3",
|
|
|
|
"72.0.3623.4",
|
|
|
|
"72.0.3624.0",
|
|
|
|
"72.0.3624.1",
|
|
|
|
"72.0.3624.2",
|
|
|
|
"72.0.3624.3",
|
|
|
|
"72.0.3624.4",
|
|
|
|
"72.0.3625.0",
|
|
|
|
"72.0.3625.1",
|
|
|
|
"72.0.3625.2",
|
|
|
|
"72.0.3626.0",
|
|
|
|
"72.0.3626.1",
|
|
|
|
"72.0.3626.10",
|
|
|
|
"72.0.3626.100",
|
|
|
|
"72.0.3626.101",
|
|
|
|
"72.0.3626.102",
|
|
|
|
"72.0.3626.103",
|
|
|
|
"72.0.3626.105",
|
|
|
|
"72.0.3626.107",
|
|
|
|
"72.0.3626.108",
|
|
|
|
"72.0.3626.109",
|
|
|
|
"72.0.3626.11",
|
|
|
|
"72.0.3626.110",
|
|
|
|
"72.0.3626.111",
|
|
|
|
"72.0.3626.112",
|
|
|
|
"72.0.3626.113",
|
|
|
|
"72.0.3626.114",
|
|
|
|
"72.0.3626.115",
|
|
|
|
"72.0.3626.116",
|
|
|
|
"72.0.3626.117",
|
|
|
|
"72.0.3626.118",
|
|
|
|
"72.0.3626.119",
|
|
|
|
"72.0.3626.12",
|
|
|
|
"72.0.3626.120",
|
|
|
|
"72.0.3626.121",
|
|
|
|
"72.0.3626.122",
|
|
|
|
"72.0.3626.13",
|
|
|
|
"72.0.3626.14",
|
|
|
|
"72.0.3626.15",
|
|
|
|
"72.0.3626.16",
|
|
|
|
"72.0.3626.17",
|
|
|
|
"72.0.3626.18",
|
|
|
|
"72.0.3626.19",
|
|
|
|
"72.0.3626.2",
|
|
|
|
"72.0.3626.20",
|
|
|
|
"72.0.3626.21",
|
|
|
|
"72.0.3626.22",
|
|
|
|
"72.0.3626.23",
|
|
|
|
"72.0.3626.24",
|
|
|
|
"72.0.3626.25",
|
|
|
|
"72.0.3626.26",
|
|
|
|
"72.0.3626.27",
|
|
|
|
"72.0.3626.28",
|
|
|
|
"72.0.3626.29",
|
|
|
|
"72.0.3626.3",
|
|
|
|
"72.0.3626.30",
|
|
|
|
"72.0.3626.31",
|
|
|
|
"72.0.3626.32",
|
|
|
|
"72.0.3626.33",
|
|
|
|
"72.0.3626.34",
|
|
|
|
"72.0.3626.35",
|
|
|
|
"72.0.3626.36",
|
|
|
|
"72.0.3626.37",
|
|
|
|
"72.0.3626.38",
|
|
|
|
"72.0.3626.39",
|
|
|
|
"72.0.3626.4",
|
|
|
|
"72.0.3626.40",
|
|
|
|
"72.0.3626.41",
|
|
|
|
"72.0.3626.42",
|
|
|
|
"72.0.3626.43",
|
|
|
|
"72.0.3626.44",
|
|
|
|
"72.0.3626.45",
|
|
|
|
"72.0.3626.46",
|
|
|
|
"72.0.3626.47",
|
|
|
|
"72.0.3626.48",
|
|
|
|
"72.0.3626.49",
|
|
|
|
"72.0.3626.5",
|
|
|
|
"72.0.3626.50",
|
|
|
|
"72.0.3626.51",
|
|
|
|
"72.0.3626.52",
|
|
|
|
"72.0.3626.53",
|
|
|
|
"72.0.3626.54",
|
|
|
|
"72.0.3626.55",
|
|
|
|
"72.0.3626.56",
|
|
|
|
"72.0.3626.57",
|
|
|
|
"72.0.3626.58",
|
|
|
|
"72.0.3626.59",
|
|
|
|
"72.0.3626.6",
|
|
|
|
"72.0.3626.60",
|
|
|
|
"72.0.3626.61",
|
|
|
|
"72.0.3626.62",
|
|
|
|
"72.0.3626.63",
|
|
|
|
"72.0.3626.64",
|
|
|
|
"72.0.3626.65",
|
|
|
|
"72.0.3626.66",
|
|
|
|
"72.0.3626.67",
|
|
|
|
"72.0.3626.68",
|
|
|
|
"72.0.3626.69",
|
|
|
|
"72.0.3626.7",
|
|
|
|
"72.0.3626.70",
|
|
|
|
"72.0.3626.71",
|
|
|
|
"72.0.3626.72",
|
|
|
|
"72.0.3626.73",
|
|
|
|
"72.0.3626.74",
|
|
|
|
"72.0.3626.75",
|
|
|
|
"72.0.3626.76",
|
|
|
|
"72.0.3626.77",
|
|
|
|
"72.0.3626.78",
|
|
|
|
"72.0.3626.79",
|
|
|
|
"72.0.3626.8",
|
|
|
|
"72.0.3626.80",
|
|
|
|
"72.0.3626.81",
|
|
|
|
"72.0.3626.82",
|
|
|
|
"72.0.3626.83",
|
|
|
|
"72.0.3626.84",
|
|
|
|
"72.0.3626.85",
|
|
|
|
"72.0.3626.86",
|
|
|
|
"72.0.3626.87",
|
|
|
|
"72.0.3626.88",
|
|
|
|
"72.0.3626.89",
|
|
|
|
"72.0.3626.9",
|
|
|
|
"72.0.3626.90",
|
|
|
|
"72.0.3626.91",
|
|
|
|
"72.0.3626.92",
|
|
|
|
"72.0.3626.93",
|
|
|
|
"72.0.3626.94",
|
|
|
|
"72.0.3626.95",
|
|
|
|
"72.0.3626.96",
|
|
|
|
"72.0.3626.97",
|
|
|
|
"72.0.3626.98",
|
|
|
|
"72.0.3626.99",
|
|
|
|
"73.0.3627.0",
|
|
|
|
"73.0.3627.1",
|
|
|
|
"73.0.3628.0",
|
|
|
|
"73.0.3628.1",
|
|
|
|
"73.0.3628.2",
|
|
|
|
"73.0.3628.3",
|
|
|
|
"73.0.3629.0",
|
|
|
|
"73.0.3629.1",
|
|
|
|
"73.0.3630.0",
|
|
|
|
"73.0.3630.1",
|
|
|
|
"73.0.3631.0",
|
|
|
|
"73.0.3631.1",
|
|
|
|
"73.0.3631.2",
|
|
|
|
"73.0.3632.0",
|
|
|
|
"73.0.3632.1",
|
|
|
|
"73.0.3632.2",
|
|
|
|
"73.0.3632.3",
|
|
|
|
"73.0.3632.4",
|
|
|
|
"73.0.3632.5",
|
|
|
|
"73.0.3633.0",
|
|
|
|
"73.0.3633.1",
|
|
|
|
"73.0.3633.2",
|
|
|
|
"73.0.3634.0",
|
|
|
|
"73.0.3634.1",
|
|
|
|
"73.0.3634.2",
|
|
|
|
"73.0.3635.0",
|
|
|
|
"73.0.3635.1",
|
|
|
|
"73.0.3635.2",
|
|
|
|
"73.0.3635.3",
|
|
|
|
"73.0.3636.0",
|
|
|
|
"73.0.3636.1",
|
|
|
|
"73.0.3636.2",
|
|
|
|
"73.0.3637.0",
|
|
|
|
"73.0.3637.1",
|
|
|
|
"73.0.3638.0",
|
|
|
|
"73.0.3638.1",
|
|
|
|
"73.0.3638.2",
|
|
|
|
"73.0.3639.0",
|
|
|
|
"73.0.3639.1",
|
|
|
|
"73.0.3640.0",
|
|
|
|
"73.0.3640.1",
|
|
|
|
"73.0.3641.0",
|
|
|
|
"73.0.3641.1",
|
|
|
|
"73.0.3642.0",
|
|
|
|
"73.0.3642.1",
|
|
|
|
"73.0.3643.0",
|
|
|
|
"73.0.3643.1",
|
|
|
|
"73.0.3643.2",
|
|
|
|
"73.0.3644.0",
|
|
|
|
"73.0.3645.0",
|
|
|
|
"73.0.3645.1",
|
|
|
|
"73.0.3645.2",
|
|
|
|
"73.0.3646.0",
|
|
|
|
"73.0.3646.1",
|
|
|
|
"73.0.3646.2",
|
|
|
|
"73.0.3647.0",
|
|
|
|
"73.0.3647.1",
|
|
|
|
"73.0.3647.2",
|
|
|
|
"73.0.3648.0",
|
|
|
|
"73.0.3648.1",
|
|
|
|
"73.0.3648.2",
|
|
|
|
"73.0.3649.0",
|
|
|
|
"73.0.3649.1",
|
|
|
|
"73.0.3650.0",
|
|
|
|
"73.0.3650.1",
|
|
|
|
"73.0.3651.0",
|
|
|
|
"73.0.3651.1",
|
|
|
|
"73.0.3652.0",
|
|
|
|
"73.0.3652.1",
|
|
|
|
"73.0.3653.0",
|
|
|
|
"73.0.3653.1",
|
|
|
|
"73.0.3654.0",
|
|
|
|
"73.0.3654.1",
|
|
|
|
"73.0.3655.0",
|
|
|
|
"73.0.3655.1",
|
|
|
|
"73.0.3656.0",
|
|
|
|
"73.0.3656.1",
|
|
|
|
"73.0.3657.0",
|
|
|
|
"73.0.3657.1",
|
|
|
|
"73.0.3658.0",
|
|
|
|
"73.0.3658.1",
|
|
|
|
"73.0.3659.0",
|
|
|
|
"73.0.3659.1",
|
|
|
|
"73.0.3660.0",
|
|
|
|
"73.0.3660.1",
|
|
|
|
"73.0.3660.2",
|
|
|
|
"73.0.3661.0",
|
|
|
|
"73.0.3661.1",
|
|
|
|
"73.0.3662.0",
|
|
|
|
"73.0.3662.1",
|
|
|
|
"73.0.3663.0",
|
|
|
|
"73.0.3663.1",
|
|
|
|
"73.0.3663.2",
|
|
|
|
"73.0.3664.0",
|
|
|
|
"73.0.3664.1",
|
|
|
|
"73.0.3664.2",
|
|
|
|
"73.0.3664.3",
|
|
|
|
"73.0.3664.4",
|
|
|
|
"73.0.3665.0",
|
|
|
|
"73.0.3665.1",
|
|
|
|
"73.0.3665.2",
|
|
|
|
"73.0.3665.3",
|
|
|
|
"73.0.3665.4",
|
|
|
|
"73.0.3666.0",
|
|
|
|
"73.0.3666.1",
|
|
|
|
"73.0.3667.0",
|
|
|
|
"73.0.3667.1",
|
|
|
|
"73.0.3667.2",
|
|
|
|
"73.0.3668.0",
|
|
|
|
"73.0.3668.1",
|
|
|
|
"73.0.3668.2",
|
|
|
|
"73.0.3669.0",
|
|
|
|
"73.0.3669.1",
|
|
|
|
"73.0.3670.0",
|
|
|
|
"73.0.3670.1",
|
|
|
|
"73.0.3671.0",
|
|
|
|
"73.0.3671.1",
|
|
|
|
"73.0.3671.2",
|
|
|
|
"73.0.3671.3",
|
|
|
|
"73.0.3672.0",
|
|
|
|
"73.0.3672.1",
|
|
|
|
"73.0.3673.0",
|
|
|
|
"73.0.3673.1",
|
|
|
|
"73.0.3673.2",
|
|
|
|
"73.0.3674.0",
|
|
|
|
"73.0.3674.1",
|
|
|
|
"73.0.3674.2",
|
|
|
|
"73.0.3676.0",
|
|
|
|
"73.0.3676.1",
|
|
|
|
"73.0.3677.0",
|
|
|
|
"73.0.3677.1",
|
|
|
|
"73.0.3678.0",
|
|
|
|
"73.0.3678.1",
|
|
|
|
"73.0.3678.2",
|
|
|
|
"73.0.3679.0",
|
|
|
|
"73.0.3679.1",
|
|
|
|
"73.0.3680.0",
|
|
|
|
"73.0.3680.1",
|
|
|
|
"73.0.3681.0",
|
|
|
|
"73.0.3681.1",
|
|
|
|
"73.0.3681.2",
|
|
|
|
"73.0.3681.3",
|
|
|
|
"73.0.3681.4",
|
|
|
|
"73.0.3682.0",
|
|
|
|
"73.0.3682.1",
|
|
|
|
"73.0.3683.0",
|
|
|
|
"73.0.3683.1",
|
|
|
|
"73.0.3683.10",
|
|
|
|
"73.0.3683.100",
|
|
|
|
"73.0.3683.101",
|
|
|
|
"73.0.3683.102",
|
|
|
|
"73.0.3683.103",
|
|
|
|
"73.0.3683.104",
|
|
|
|
"73.0.3683.105",
|
|
|
|
"73.0.3683.106",
|
|
|
|
"73.0.3683.107",
|
|
|
|
"73.0.3683.108",
|
|
|
|
"73.0.3683.109",
|
|
|
|
"73.0.3683.11",
|
|
|
|
"73.0.3683.110",
|
|
|
|
"73.0.3683.111",
|
|
|
|
"73.0.3683.112",
|
|
|
|
"73.0.3683.113",
|
|
|
|
"73.0.3683.114",
|
|
|
|
"73.0.3683.115",
|
|
|
|
"73.0.3683.116",
|
|
|
|
"73.0.3683.117",
|
|
|
|
"73.0.3683.118",
|
|
|
|
"73.0.3683.119",
|
|
|
|
"73.0.3683.12",
|
|
|
|
"73.0.3683.120",
|
|
|
|
"73.0.3683.121",
|
|
|
|
"73.0.3683.13",
|
|
|
|
"73.0.3683.14",
|
|
|
|
"73.0.3683.15",
|
|
|
|
"73.0.3683.16",
|
|
|
|
"73.0.3683.17",
|
|
|
|
"73.0.3683.18",
|
|
|
|
"73.0.3683.19",
|
|
|
|
"73.0.3683.2",
|
|
|
|
"73.0.3683.20",
|
|
|
|
"73.0.3683.21",
|
|
|
|
"73.0.3683.22",
|
|
|
|
"73.0.3683.23",
|
|
|
|
"73.0.3683.24",
|
|
|
|
"73.0.3683.25",
|
|
|
|
"73.0.3683.26",
|
|
|
|
"73.0.3683.27",
|
|
|
|
"73.0.3683.28",
|
|
|
|
"73.0.3683.29",
|
|
|
|
"73.0.3683.3",
|
|
|
|
"73.0.3683.31",
|
|
|
|
"73.0.3683.32",
|
|
|
|
"73.0.3683.33",
|
|
|
|
"73.0.3683.34",
|
|
|
|
"73.0.3683.35",
|
|
|
|
"73.0.3683.36",
|
|
|
|
"73.0.3683.37",
|
|
|
|
"73.0.3683.38",
|
|
|
|
"73.0.3683.39",
|
|
|
|
"73.0.3683.4",
|
|
|
|
"73.0.3683.40",
|
|
|
|
"73.0.3683.41",
|
|
|
|
"73.0.3683.42",
|
|
|
|
"73.0.3683.43",
|
|
|
|
"73.0.3683.44",
|
|
|
|
"73.0.3683.45",
|
|
|
|
"73.0.3683.46",
|
|
|
|
"73.0.3683.47",
|
|
|
|
"73.0.3683.48",
|
|
|
|
"73.0.3683.49",
|
|
|
|
"73.0.3683.5",
|
|
|
|
"73.0.3683.50",
|
|
|
|
"73.0.3683.51",
|
|
|
|
"73.0.3683.52",
|
|
|
|
"73.0.3683.53",
|
|
|
|
"73.0.3683.54",
|
|
|
|
"73.0.3683.55",
|
|
|
|
"73.0.3683.56",
|
|
|
|
"73.0.3683.57",
|
|
|
|
"73.0.3683.58",
|
|
|
|
"73.0.3683.59",
|
|
|
|
"73.0.3683.6",
|
|
|
|
"73.0.3683.60",
|
|
|
|
"73.0.3683.61",
|
|
|
|
"73.0.3683.62",
|
|
|
|
"73.0.3683.63",
|
|
|
|
"73.0.3683.64",
|
|
|
|
"73.0.3683.65",
|
|
|
|
"73.0.3683.66",
|
|
|
|
"73.0.3683.67",
|
|
|
|
"73.0.3683.68",
|
|
|
|
"73.0.3683.69",
|
|
|
|
"73.0.3683.7",
|
|
|
|
"73.0.3683.70",
|
|
|
|
"73.0.3683.71",
|
|
|
|
"73.0.3683.72",
|
|
|
|
"73.0.3683.73",
|
|
|
|
"73.0.3683.74",
|
|
|
|
"73.0.3683.75",
|
|
|
|
"73.0.3683.76",
|
|
|
|
"73.0.3683.77",
|
|
|
|
"73.0.3683.78",
|
|
|
|
"73.0.3683.79",
|
|
|
|
"73.0.3683.8",
|
|
|
|
"73.0.3683.80",
|
|
|
|
"73.0.3683.81",
|
|
|
|
"73.0.3683.82",
|
|
|
|
"73.0.3683.83",
|
|
|
|
"73.0.3683.84",
|
|
|
|
"73.0.3683.85",
|
|
|
|
"73.0.3683.86",
|
|
|
|
"73.0.3683.87",
|
|
|
|
"73.0.3683.88",
|
|
|
|
"73.0.3683.89",
|
|
|
|
"73.0.3683.9",
|
|
|
|
"73.0.3683.90",
|
|
|
|
"73.0.3683.91",
|
|
|
|
"73.0.3683.92",
|
|
|
|
"73.0.3683.93",
|
|
|
|
"73.0.3683.94",
|
|
|
|
"73.0.3683.95",
|
|
|
|
"73.0.3683.96",
|
|
|
|
"73.0.3683.97",
|
|
|
|
"73.0.3683.98",
|
|
|
|
"73.0.3683.99",
|
|
|
|
"74.0.3684.0",
|
|
|
|
"74.0.3684.1",
|
|
|
|
"74.0.3685.0",
|
|
|
|
"74.0.3685.1",
|
|
|
|
"74.0.3686.0",
|
|
|
|
"74.0.3686.1",
|
|
|
|
"74.0.3686.2",
|
|
|
|
"74.0.3686.3",
|
|
|
|
"74.0.3686.4",
|
|
|
|
"74.0.3687.0",
|
|
|
|
"74.0.3687.1",
|
|
|
|
"74.0.3687.2",
|
|
|
|
"74.0.3687.3",
|
|
|
|
"74.0.3688.0",
|
|
|
|
"74.0.3688.1",
|
|
|
|
"74.0.3689.0",
|
|
|
|
"74.0.3689.1",
|
|
|
|
"74.0.3690.0",
|
|
|
|
"74.0.3690.1",
|
|
|
|
"74.0.3691.0",
|
|
|
|
"74.0.3691.1",
|
|
|
|
"74.0.3692.0",
|
|
|
|
"74.0.3692.1",
|
|
|
|
"74.0.3693.0",
|
|
|
|
"74.0.3693.1",
|
|
|
|
"74.0.3693.2",
|
|
|
|
"74.0.3693.3",
|
|
|
|
"74.0.3693.4",
|
|
|
|
"74.0.3693.5",
|
|
|
|
"74.0.3693.6",
|
|
|
|
"74.0.3694.0",
|
|
|
|
"74.0.3694.1",
|
|
|
|
"74.0.3694.2",
|
|
|
|
"74.0.3694.3",
|
|
|
|
"74.0.3694.4",
|
|
|
|
"74.0.3694.5",
|
|
|
|
"74.0.3694.6",
|
|
|
|
"74.0.3694.7",
|
|
|
|
"74.0.3694.8",
|
|
|
|
"74.0.3696.0",
|
|
|
|
"74.0.3696.1",
|
|
|
|
"74.0.3696.2",
|
|
|
|
"74.0.3698.0",
|
|
|
|
"74.0.3699.0",
|
|
|
|
"74.0.3699.1",
|
|
|
|
"74.0.3699.2",
|
|
|
|
"74.0.3699.3",
|
|
|
|
"74.0.3700.0",
|
|
|
|
"74.0.3700.1",
|
|
|
|
"74.0.3701.0",
|
|
|
|
"74.0.3701.1",
|
|
|
|
"74.0.3702.0",
|
|
|
|
"74.0.3702.1",
|
|
|
|
"74.0.3702.2",
|
|
|
|
"74.0.3702.3",
|
|
|
|
"74.0.3703.0",
|
|
|
|
"74.0.3703.1",
|
|
|
|
"74.0.3703.2",
|
|
|
|
"74.0.3703.3",
|
|
|
|
"74.0.3704.0",
|
|
|
|
"74.0.3704.1",
|
|
|
|
"74.0.3704.2",
|
|
|
|
"74.0.3704.3",
|
|
|
|
"74.0.3704.4",
|
|
|
|
"74.0.3704.5",
|
|
|
|
"74.0.3704.6",
|
|
|
|
"74.0.3704.7",
|
|
|
|
"74.0.3704.8",
|
|
|
|
"74.0.3704.9",
|
|
|
|
"74.0.3705.0",
|
|
|
|
"74.0.3705.1",
|
|
|
|
"74.0.3706.0",
|
|
|
|
"74.0.3706.1",
|
|
|
|
"74.0.3706.2",
|
|
|
|
"74.0.3706.3",
|
|
|
|
"74.0.3706.4",
|
|
|
|
"74.0.3706.5",
|
|
|
|
"74.0.3706.6",
|
|
|
|
"74.0.3706.7",
|
|
|
|
"74.0.3708.0",
|
|
|
|
"74.0.3709.0",
|
|
|
|
"74.0.3709.1",
|
|
|
|
"74.0.3710.0",
|
|
|
|
"74.0.3710.1",
|
|
|
|
"74.0.3710.2",
|
|
|
|
"74.0.3711.0",
|
|
|
|
"74.0.3711.1",
|
|
|
|
"74.0.3711.2",
|
|
|
|
"74.0.3712.0",
|
|
|
|
"74.0.3712.1",
|
|
|
|
"74.0.3712.2",
|
|
|
|
"74.0.3713.0",
|
|
|
|
"74.0.3713.1",
|
|
|
|
"74.0.3713.3",
|
|
|
|
"74.0.3714.0",
|
|
|
|
"74.0.3714.1",
|
|
|
|
"74.0.3714.2",
|
|
|
|
"74.0.3715.0",
|
|
|
|
"74.0.3715.1",
|
|
|
|
"74.0.3716.0",
|
|
|
|
"74.0.3716.1",
|
|
|
|
"74.0.3717.0",
|
|
|
|
"74.0.3717.1",
|
|
|
|
"74.0.3717.2",
|
|
|
|
"74.0.3718.0",
|
|
|
|
"74.0.3718.1",
|
|
|
|
"74.0.3718.2",
|
|
|
|
"74.0.3718.3",
|
|
|
|
"74.0.3718.4",
|
|
|
|
"74.0.3718.5",
|
|
|
|
"74.0.3718.6",
|
|
|
|
"74.0.3718.7",
|
|
|
|
"74.0.3718.8",
|
|
|
|
"74.0.3718.9",
|
|
|
|
"74.0.3719.0",
|
|
|
|
"74.0.3719.1",
|
|
|
|
"74.0.3719.2",
|
|
|
|
"74.0.3719.3",
|
|
|
|
"74.0.3719.4",
|
|
|
|
"74.0.3719.5",
|
|
|
|
"74.0.3720.0",
|
|
|
|
"74.0.3720.1",
|
|
|
|
"74.0.3720.2",
|
|
|
|
"74.0.3720.3",
|
|
|
|
"74.0.3720.4",
|
|
|
|
"74.0.3720.5",
|
|
|
|
"74.0.3720.6",
|
|
|
|
"74.0.3721.0",
|
|
|
|
"74.0.3721.1",
|
|
|
|
"74.0.3721.2",
|
|
|
|
"74.0.3721.3",
|
|
|
|
"74.0.3722.0",
|
|
|
|
"74.0.3722.1",
|
|
|
|
"74.0.3723.0",
|
|
|
|
"74.0.3723.1",
|
|
|
|
"74.0.3724.0",
|
|
|
|
"74.0.3724.1",
|
|
|
|
"74.0.3724.2",
|
|
|
|
"74.0.3724.3",
|
|
|
|
"74.0.3724.4",
|
|
|
|
"74.0.3724.5",
|
|
|
|
"74.0.3724.6",
|
|
|
|
"74.0.3724.7",
|
|
|
|
"74.0.3724.8",
|
|
|
|
"74.0.3725.0",
|
|
|
|
"74.0.3725.1",
|
|
|
|
"74.0.3725.2",
|
|
|
|
"74.0.3725.3",
|
|
|
|
"74.0.3725.4",
|
|
|
|
"74.0.3726.0",
|
|
|
|
"74.0.3726.1",
|
|
|
|
"74.0.3726.2",
|
|
|
|
"74.0.3726.3",
|
|
|
|
"74.0.3726.4",
|
|
|
|
"74.0.3728.0",
|
|
|
|
"74.0.3729.0",
|
|
|
|
"74.0.3729.1",
|
|
|
|
"74.0.3729.10",
|
|
|
|
"74.0.3729.100",
|
|
|
|
"74.0.3729.101",
|
|
|
|
"74.0.3729.102",
|
|
|
|
"74.0.3729.103",
|
|
|
|
"74.0.3729.104",
|
|
|
|
"74.0.3729.105",
|
|
|
|
"74.0.3729.106",
|
|
|
|
"74.0.3729.107",
|
|
|
|
"74.0.3729.108",
|
|
|
|
"74.0.3729.109",
|
|
|
|
"74.0.3729.11",
|
|
|
|
"74.0.3729.110",
|
|
|
|
"74.0.3729.111",
|
|
|
|
"74.0.3729.112",
|
|
|
|
"74.0.3729.113",
|
|
|
|
"74.0.3729.114",
|
|
|
|
"74.0.3729.115",
|
|
|
|
"74.0.3729.116",
|
|
|
|
"74.0.3729.117",
|
|
|
|
"74.0.3729.118",
|
|
|
|
"74.0.3729.119",
|
|
|
|
"74.0.3729.12",
|
|
|
|
"74.0.3729.120",
|
|
|
|
"74.0.3729.121",
|
|
|
|
"74.0.3729.122",
|
|
|
|
"74.0.3729.123",
|
|
|
|
"74.0.3729.124",
|
|
|
|
"74.0.3729.125",
|
|
|
|
"74.0.3729.126",
|
|
|
|
"74.0.3729.127",
|
|
|
|
"74.0.3729.128",
|
|
|
|
"74.0.3729.129",
|
|
|
|
"74.0.3729.13",
|
|
|
|
"74.0.3729.14",
|
|
|
|
"74.0.3729.15",
|
|
|
|
"74.0.3729.16",
|
|
|
|
"74.0.3729.17",
|
|
|
|
"74.0.3729.18",
|
|
|
|
"74.0.3729.19",
|
|
|
|
"74.0.3729.2",
|
|
|
|
"74.0.3729.20",
|
|
|
|
"74.0.3729.21",
|
|
|
|
"74.0.3729.22",
|
|
|
|
"74.0.3729.23",
|
|
|
|
"74.0.3729.24",
|
|
|
|
"74.0.3729.25",
|
|
|
|
"74.0.3729.26",
|
|
|
|
"74.0.3729.27",
|
|
|
|
"74.0.3729.28",
|
|
|
|
"74.0.3729.29",
|
|
|
|
"74.0.3729.3",
|
|
|
|
"74.0.3729.30",
|
|
|
|
"74.0.3729.31",
|
|
|
|
"74.0.3729.32",
|
|
|
|
"74.0.3729.33",
|
|
|
|
"74.0.3729.34",
|
|
|
|
"74.0.3729.35",
|
|
|
|
"74.0.3729.36",
|
|
|
|
"74.0.3729.37",
|
|
|
|
"74.0.3729.38",
|
|
|
|
"74.0.3729.39",
|
|
|
|
"74.0.3729.4",
|
|
|
|
"74.0.3729.40",
|
|
|
|
"74.0.3729.41",
|
|
|
|
"74.0.3729.42",
|
|
|
|
"74.0.3729.43",
|
|
|
|
"74.0.3729.44",
|
|
|
|
"74.0.3729.45",
|
|
|
|
"74.0.3729.46",
|
|
|
|
"74.0.3729.47",
|
|
|
|
"74.0.3729.48",
|
|
|
|
"74.0.3729.49",
|
|
|
|
"74.0.3729.5",
|
|
|
|
"74.0.3729.50",
|
|
|
|
"74.0.3729.51",
|
|
|
|
"74.0.3729.52",
|
|
|
|
"74.0.3729.53",
|
|
|
|
"74.0.3729.54",
|
|
|
|
"74.0.3729.55",
|
|
|
|
"74.0.3729.56",
|
|
|
|
"74.0.3729.57",
|
|
|
|
"74.0.3729.58",
|
|
|
|
"74.0.3729.59",
|
|
|
|
"74.0.3729.6",
|
|
|
|
"74.0.3729.60",
|
|
|
|
"74.0.3729.61",
|
|
|
|
"74.0.3729.62",
|
|
|
|
"74.0.3729.63",
|
|
|
|
"74.0.3729.64",
|
|
|
|
"74.0.3729.65",
|
|
|
|
"74.0.3729.66",
|
|
|
|
"74.0.3729.67",
|
|
|
|
"74.0.3729.68",
|
|
|
|
"74.0.3729.69",
|
|
|
|
"74.0.3729.7",
|
|
|
|
"74.0.3729.70",
|
|
|
|
"74.0.3729.71",
|
|
|
|
"74.0.3729.72",
|
|
|
|
"74.0.3729.73",
|
|
|
|
"74.0.3729.74",
|
|
|
|
"74.0.3729.75",
|
|
|
|
"74.0.3729.76",
|
|
|
|
"74.0.3729.77",
|
|
|
|
"74.0.3729.78",
|
|
|
|
"74.0.3729.79",
|
|
|
|
"74.0.3729.8",
|
|
|
|
"74.0.3729.80",
|
|
|
|
"74.0.3729.81",
|
|
|
|
"74.0.3729.82",
|
|
|
|
"74.0.3729.83",
|
|
|
|
"74.0.3729.84",
|
|
|
|
"74.0.3729.85",
|
|
|
|
"74.0.3729.86",
|
|
|
|
"74.0.3729.87",
|
|
|
|
"74.0.3729.88",
|
|
|
|
"74.0.3729.89",
|
|
|
|
"74.0.3729.9",
|
|
|
|
"74.0.3729.90",
|
|
|
|
"74.0.3729.91",
|
|
|
|
"74.0.3729.92",
|
|
|
|
"74.0.3729.93",
|
|
|
|
"74.0.3729.94",
|
|
|
|
"74.0.3729.95",
|
|
|
|
"74.0.3729.96",
|
|
|
|
"74.0.3729.97",
|
|
|
|
"74.0.3729.98",
|
|
|
|
"74.0.3729.99",
|
|
|
|
"75.0.3730.0",
|
|
|
|
"75.0.3730.1",
|
|
|
|
"75.0.3730.2",
|
|
|
|
"75.0.3730.3",
|
|
|
|
"75.0.3730.4",
|
|
|
|
"75.0.3730.5",
|
|
|
|
"75.0.3731.0",
|
|
|
|
"75.0.3731.2",
|
|
|
|
"75.0.3731.3",
|
|
|
|
"75.0.3732.0",
|
|
|
|
"75.0.3732.1",
|
|
|
|
"75.0.3733.0",
|
|
|
|
"75.0.3733.1",
|
|
|
|
"75.0.3734.0",
|
|
|
|
"75.0.3734.1",
|
|
|
|
"75.0.3735.0",
|
|
|
|
"75.0.3735.1",
|
|
|
|
"75.0.3736.0",
|
|
|
|
"75.0.3736.1",
|
|
|
|
"75.0.3737.0",
|
|
|
|
"75.0.3737.1",
|
|
|
|
"75.0.3738.0",
|
|
|
|
"75.0.3738.1",
|
|
|
|
"75.0.3738.2",
|
|
|
|
"75.0.3738.3",
|
|
|
|
"75.0.3738.4",
|
|
|
|
"75.0.3739.0",
|
|
|
|
"75.0.3739.1",
|
|
|
|
"75.0.3740.0",
|
|
|
|
"75.0.3740.1",
|
|
|
|
"75.0.3740.2",
|
|
|
|
"75.0.3740.3",
|
|
|
|
"75.0.3740.4",
|
|
|
|
"75.0.3740.5",
|
|
|
|
"75.0.3741.0",
|
|
|
|
"75.0.3741.1",
|
|
|
|
"75.0.3741.2",
|
|
|
|
"75.0.3744.0",
|
|
|
|
"75.0.3744.1",
|
|
|
|
"75.0.3744.2",
|
|
|
|
"75.0.3745.0",
|
|
|
|
"75.0.3745.1",
|
|
|
|
"75.0.3745.2",
|
|
|
|
"75.0.3745.3",
|
|
|
|
"75.0.3745.4",
|
|
|
|
"75.0.3745.5",
|
|
|
|
"75.0.3746.0",
|
|
|
|
"75.0.3746.1",
|
|
|
|
"75.0.3746.2",
|
|
|
|
"75.0.3746.3",
|
|
|
|
"75.0.3746.4",
|
|
|
|
"75.0.3747.0",
|
|
|
|
"75.0.3747.1",
|
|
|
|
"75.0.3748.0",
|
|
|
|
"75.0.3748.1",
|
|
|
|
"75.0.3749.0",
|
|
|
|
"75.0.3749.1",
|
|
|
|
"75.0.3749.2",
|
|
|
|
"75.0.3749.3",
|
|
|
|
"75.0.3750.0",
|
|
|
|
"75.0.3751.0",
|
|
|
|
"75.0.3751.1",
|
|
|
|
"75.0.3752.0",
|
|
|
|
"75.0.3752.1",
|
|
|
|
"75.0.3752.2",
|
|
|
|
"75.0.3753.0",
|
|
|
|
"75.0.3753.1",
|
|
|
|
"75.0.3753.2",
|
|
|
|
"75.0.3753.3",
|
|
|
|
"75.0.3753.4",
|
|
|
|
"75.0.3754.0",
|
|
|
|
"75.0.3754.1",
|
|
|
|
"75.0.3754.2",
|
|
|
|
"75.0.3755.0",
|
|
|
|
"75.0.3755.1",
|
|
|
|
"75.0.3755.2",
|
|
|
|
"75.0.3755.3",
|
|
|
|
"75.0.3756.0",
|
|
|
|
"75.0.3756.1",
|
|
|
|
"75.0.3757.0",
|
|
|
|
"75.0.3757.1",
|
|
|
|
"75.0.3758.0",
|
|
|
|
"75.0.3758.1",
|
|
|
|
"75.0.3759.0",
|
|
|
|
"75.0.3759.1",
|
|
|
|
"75.0.3759.2",
|
|
|
|
"75.0.3759.3",
|
|
|
|
"75.0.3759.4",
|
|
|
|
"75.0.3759.5",
|
|
|
|
"75.0.3759.6",
|
|
|
|
"75.0.3759.7",
|
|
|
|
"75.0.3759.8",
|
|
|
|
"75.0.3760.0",
|
|
|
|
"75.0.3761.0",
|
|
|
|
"75.0.3761.1",
|
|
|
|
"75.0.3761.2",
|
|
|
|
"75.0.3761.3",
|
|
|
|
"75.0.3761.4",
|
|
|
|
"75.0.3762.0",
|
|
|
|
"75.0.3762.1",
|
|
|
|
"75.0.3763.0",
|
|
|
|
"75.0.3763.1",
|
|
|
|
"75.0.3763.2",
|
|
|
|
"75.0.3764.0",
|
|
|
|
"75.0.3764.1",
|
|
|
|
"75.0.3765.0",
|
|
|
|
"75.0.3765.1",
|
|
|
|
"75.0.3766.0",
|
|
|
|
"75.0.3766.1",
|
|
|
|
"75.0.3766.2",
|
|
|
|
"75.0.3766.3",
|
|
|
|
"75.0.3767.0",
|
|
|
|
"75.0.3767.1",
|
|
|
|
"75.0.3767.2",
|
|
|
|
"75.0.3768.0",
|
|
|
|
"75.0.3768.1",
|
|
|
|
"75.0.3768.2",
|
|
|
|
"75.0.3768.3",
|
|
|
|
"75.0.3768.4",
|
|
|
|
"75.0.3768.5",
|
|
|
|
"75.0.3768.6",
|
|
|
|
"75.0.3769.0",
|
|
|
|
"75.0.3769.1",
|
|
|
|
"75.0.3769.2",
|
|
|
|
"75.0.3769.3",
|
|
|
|
"75.0.3769.4",
|
|
|
|
"75.0.3769.5",
|
|
|
|
"75.0.3770.0",
|
|
|
|
"75.0.3770.1",
|
|
|
|
"75.0.3770.10",
|
|
|
|
"75.0.3770.11",
|
|
|
|
"75.0.3770.12",
|
|
|
|
"75.0.3770.13",
|
|
|
|
"75.0.3770.14",
|
|
|
|
"75.0.3770.15",
|
|
|
|
"75.0.3770.2",
|
|
|
|
"75.0.3770.3",
|
|
|
|
"75.0.3770.4",
|
|
|
|
"75.0.3770.5",
|
|
|
|
"75.0.3770.6",
|
|
|
|
"75.0.3770.7",
|
|
|
|
"75.0.3770.8",
|
|
|
|
"75.0.3770.9",
|
|
|
|
"76.0.3771.0",
|
|
|
|
"76.0.3771.1",
|
|
|
|
"76.0.3772.0",
|
|
|
|
"76.0.3772.1",
|
|
|
|
"76.0.3773.0",
|
|
|
|
"76.0.3773.1",
|
|
|
|
"76.0.3774.0",
|
|
|
|
"76.0.3774.1",
|
|
|
|
"76.0.3775.0",
|
|
|
|
"76.0.3775.1",
|
|
|
|
"76.0.3775.2",
|
|
|
|
"76.0.3775.3",
|
|
|
|
"76.0.3775.4",
|
|
|
|
"76.0.3775.5",
|
|
|
|
"76.0.3776.0",
|
|
|
|
"76.0.3776.1",
|
|
|
|
"76.0.3776.2",
|
|
|
|
"76.0.3776.3",
|
|
|
|
"76.0.3776.4",
|
|
|
|
"76.0.3777.0",
|
|
|
|
"76.0.3777.1",
|
|
|
|
"76.0.3778.0",
|
|
|
|
"76.0.3778.1",
|
|
|
|
"76.0.3779.0",
|
|
|
|
"76.0.3779.1",
|
|
|
|
"76.0.3780.0",
|
|
|
|
"76.0.3780.1",
|
|
|
|
"76.0.3780.2",
|
|
|
|
"76.0.3780.3",
|
|
|
|
]
|
|
|
|
|
|
|
|
def random_user_agent
|
|
|
|
return "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/#{CHROME_VERSIONS[rand(CHROME_VERSIONS.size)]} Safari/537.36"
|
|
|
|
end
|
|
|
|
|
2019-10-25 16:58:16 +00:00
|
|
|
struct HTTPPool
|
|
|
|
property! url : URI
|
|
|
|
property! capacity : Int32
|
|
|
|
property! timeout : Float64
|
|
|
|
property pool : ConnectionPool(HTTPClient)
|
|
|
|
|
|
|
|
def initialize(url : URI, @capacity = 5, @timeout = 5.0)
|
|
|
|
@url = url
|
|
|
|
@pool = build_pool
|
|
|
|
end
|
|
|
|
|
|
|
|
def client(region = nil, &block)
|
2019-10-26 03:06:08 +00:00
|
|
|
conn = pool.checkout
|
|
|
|
|
|
|
|
begin
|
2019-10-25 16:58:16 +00:00
|
|
|
if region
|
|
|
|
PROXY_LIST[region]?.try &.sample(40).each do |proxy|
|
|
|
|
begin
|
|
|
|
proxy = HTTPProxy.new(proxy_host: proxy[:ip], proxy_port: proxy[:port])
|
|
|
|
conn.set_proxy(proxy)
|
|
|
|
break
|
|
|
|
rescue ex
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-10-26 03:06:08 +00:00
|
|
|
response = yield conn
|
2019-10-26 15:43:28 +00:00
|
|
|
|
|
|
|
if region
|
|
|
|
conn.unset_proxy
|
|
|
|
end
|
|
|
|
|
2019-10-26 03:06:08 +00:00
|
|
|
response
|
|
|
|
rescue ex
|
|
|
|
conn = HTTPClient.new(url)
|
2019-11-07 17:25:34 +00:00
|
|
|
conn.family = (url.host == "www.youtube.com" || url.host == "suggestqueries.google.com") ? CONFIG.force_resolve : Socket::Family::UNSPEC
|
2019-10-28 16:34:50 +00:00
|
|
|
conn.read_timeout = 10.seconds
|
|
|
|
conn.connect_timeout = 10.seconds
|
2019-10-26 03:06:08 +00:00
|
|
|
yield conn
|
|
|
|
ensure
|
|
|
|
pool.checkin(conn)
|
2019-10-25 16:58:16 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
private def build_pool
|
|
|
|
ConnectionPool(HTTPClient).new(capacity: capacity, timeout: timeout) do
|
|
|
|
client = HTTPClient.new(url)
|
2019-11-07 17:25:34 +00:00
|
|
|
client.family = (url.host == "www.youtube.com" || url.host == "suggestqueries.google.com") ? CONFIG.force_resolve : Socket::Family::UNSPEC
|
2019-10-28 16:34:50 +00:00
|
|
|
client.read_timeout = 10.seconds
|
|
|
|
client.connect_timeout = 10.seconds
|
2019-10-25 16:58:16 +00:00
|
|
|
client
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-08-04 20:30:44 +00:00
|
|
|
# See http://www.evanmiller.org/how-not-to-sort-by-average-rating.html
|
|
|
|
def ci_lower_bound(pos, n)
|
|
|
|
if n == 0
|
|
|
|
return 0.0
|
|
|
|
end
|
|
|
|
|
|
|
|
# z value here represents a confidence level of 0.95
|
|
|
|
z = 1.96
|
|
|
|
phat = 1.0*pos/n
|
|
|
|
|
|
|
|
return (phat + z*z/(2*n) - z * Math.sqrt((phat*(1 - phat) + z*z/(4*n))/n))/(1 + z*z/n)
|
|
|
|
end
|
|
|
|
|
|
|
|
def elapsed_text(elapsed)
|
|
|
|
millis = elapsed.total_milliseconds
|
|
|
|
return "#{millis.round(2)}ms" if millis >= 1
|
|
|
|
|
|
|
|
"#{(millis * 1000).round(2)}µs"
|
|
|
|
end
|
|
|
|
|
2019-06-29 02:17:56 +00:00
|
|
|
def make_client(url : URI, region = nil)
|
|
|
|
client = HTTPClient.new(url)
|
2019-10-18 16:41:03 +00:00
|
|
|
client.family = (url.host == "www.youtube.com") ? CONFIG.force_resolve : Socket::Family::UNSPEC
|
2019-10-28 16:34:50 +00:00
|
|
|
client.read_timeout = 10.seconds
|
|
|
|
client.connect_timeout = 10.seconds
|
2018-11-17 23:33:30 +00:00
|
|
|
|
|
|
|
if region
|
2019-06-29 02:17:56 +00:00
|
|
|
PROXY_LIST[region]?.try &.sample(40).each do |proxy|
|
2018-11-17 23:33:30 +00:00
|
|
|
begin
|
|
|
|
proxy = HTTPProxy.new(proxy_host: proxy[:ip], proxy_port: proxy[:port])
|
|
|
|
client.set_proxy(proxy)
|
|
|
|
break
|
|
|
|
rescue ex
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-08-04 20:30:44 +00:00
|
|
|
return client
|
|
|
|
end
|
|
|
|
|
|
|
|
def decode_length_seconds(string)
|
2019-10-26 14:17:25 +00:00
|
|
|
length_seconds = string.gsub(/[^0-9:]/, "").split(":").map &.to_i
|
2018-08-04 20:30:44 +00:00
|
|
|
length_seconds = [0] * (3 - length_seconds.size) + length_seconds
|
|
|
|
length_seconds = Time::Span.new(length_seconds[0], length_seconds[1], length_seconds[2])
|
|
|
|
length_seconds = length_seconds.total_seconds.to_i
|
|
|
|
|
|
|
|
return length_seconds
|
|
|
|
end
|
|
|
|
|
2018-10-21 01:37:55 +00:00
|
|
|
def recode_length_seconds(time)
|
|
|
|
if time <= 0
|
|
|
|
return ""
|
|
|
|
else
|
|
|
|
time = time.seconds
|
|
|
|
text = "#{time.minutes.to_s.rjust(2, '0')}:#{time.seconds.to_s.rjust(2, '0')}"
|
|
|
|
|
2019-05-11 15:57:58 +00:00
|
|
|
if time.total_hours.to_i > 0
|
|
|
|
text = "#{time.total_hours.to_i.to_s.rjust(2, '0')}:#{text}"
|
2018-10-21 01:37:55 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
text = text.lchop('0')
|
|
|
|
|
|
|
|
return text
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-08-04 20:30:44 +00:00
|
|
|
def decode_time(string)
|
|
|
|
time = string.try &.to_f?
|
|
|
|
|
|
|
|
if !time
|
|
|
|
hours = /(?<hours>\d+)h/.match(string).try &.["hours"].try &.to_f
|
|
|
|
hours ||= 0
|
|
|
|
|
|
|
|
minutes = /(?<minutes>\d+)m(?!s)/.match(string).try &.["minutes"].try &.to_f
|
|
|
|
minutes ||= 0
|
|
|
|
|
|
|
|
seconds = /(?<seconds>\d+)s/.match(string).try &.["seconds"].try &.to_f
|
|
|
|
seconds ||= 0
|
|
|
|
|
|
|
|
millis = /(?<millis>\d+)ms/.match(string).try &.["millis"].try &.to_f
|
|
|
|
millis ||= 0
|
|
|
|
|
2019-06-08 01:23:37 +00:00
|
|
|
time = hours * 3600 + minutes * 60 + seconds + millis // 1000
|
2018-08-04 20:30:44 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
return time
|
|
|
|
end
|
|
|
|
|
|
|
|
def decode_date(string : String)
|
2018-08-05 23:35:52 +00:00
|
|
|
# String matches 'YYYY'
|
2018-08-15 15:22:36 +00:00
|
|
|
if string.match(/^\d{4}/)
|
2019-06-08 01:23:37 +00:00
|
|
|
return Time.utc(string.to_i, 1, 1)
|
2018-08-05 23:35:52 +00:00
|
|
|
end
|
|
|
|
|
2018-08-15 15:22:36 +00:00
|
|
|
# Try to parse as format Jul 10, 2000
|
|
|
|
begin
|
|
|
|
return Time.parse(string, "%b %-d, %Y", Time::Location.local)
|
|
|
|
rescue ex
|
|
|
|
end
|
|
|
|
|
|
|
|
case string
|
|
|
|
when "today"
|
2019-06-08 00:56:41 +00:00
|
|
|
return Time.utc
|
2018-08-15 15:22:36 +00:00
|
|
|
when "yesterday"
|
2019-06-08 00:56:41 +00:00
|
|
|
return Time.utc - 1.day
|
2018-08-15 15:22:36 +00:00
|
|
|
end
|
|
|
|
|
2018-08-08 15:20:07 +00:00
|
|
|
# String matches format "20 hours ago", "4 months ago"...
|
2018-08-04 20:30:44 +00:00
|
|
|
date = string.split(" ")[-3, 3]
|
|
|
|
delta = date[0].to_i
|
|
|
|
|
|
|
|
case date[1]
|
2018-08-07 13:10:24 +00:00
|
|
|
when .includes? "second"
|
|
|
|
delta = delta.seconds
|
2018-08-04 20:30:44 +00:00
|
|
|
when .includes? "minute"
|
|
|
|
delta = delta.minutes
|
|
|
|
when .includes? "hour"
|
|
|
|
delta = delta.hours
|
|
|
|
when .includes? "day"
|
|
|
|
delta = delta.days
|
|
|
|
when .includes? "week"
|
|
|
|
delta = delta.weeks
|
|
|
|
when .includes? "month"
|
|
|
|
delta = delta.months
|
|
|
|
when .includes? "year"
|
|
|
|
delta = delta.years
|
|
|
|
else
|
|
|
|
raise "Could not parse #{string}"
|
|
|
|
end
|
|
|
|
|
2019-06-08 00:56:41 +00:00
|
|
|
return Time.utc - delta
|
2018-08-04 20:30:44 +00:00
|
|
|
end
|
|
|
|
|
2019-02-20 14:49:39 +00:00
|
|
|
def recode_date(time : Time, locale)
|
2019-06-08 00:56:41 +00:00
|
|
|
span = Time.utc - time
|
2018-08-04 20:30:44 +00:00
|
|
|
|
|
|
|
if span.total_days > 365.0
|
2019-06-08 01:23:37 +00:00
|
|
|
span = translate(locale, "`x` years", (span.total_days.to_i // 365).to_s)
|
2018-08-04 20:30:44 +00:00
|
|
|
elsif span.total_days > 30.0
|
2019-06-08 01:23:37 +00:00
|
|
|
span = translate(locale, "`x` months", (span.total_days.to_i // 30).to_s)
|
2018-08-04 20:30:44 +00:00
|
|
|
elsif span.total_days > 7.0
|
2019-06-08 01:23:37 +00:00
|
|
|
span = translate(locale, "`x` weeks", (span.total_days.to_i // 7).to_s)
|
2018-08-04 20:30:44 +00:00
|
|
|
elsif span.total_hours > 24.0
|
2019-02-20 15:37:33 +00:00
|
|
|
span = translate(locale, "`x` days", (span.total_days.to_i).to_s)
|
2018-08-04 20:30:44 +00:00
|
|
|
elsif span.total_minutes > 60.0
|
2019-02-20 15:37:33 +00:00
|
|
|
span = translate(locale, "`x` hours", (span.total_hours.to_i).to_s)
|
2018-08-07 13:10:24 +00:00
|
|
|
elsif span.total_seconds > 60.0
|
2019-02-20 15:37:33 +00:00
|
|
|
span = translate(locale, "`x` minutes", (span.total_minutes.to_i).to_s)
|
2018-08-04 20:30:44 +00:00
|
|
|
else
|
2019-02-20 15:37:33 +00:00
|
|
|
span = translate(locale, "`x` seconds", (span.total_seconds.to_i).to_s)
|
2018-08-04 20:30:44 +00:00
|
|
|
end
|
|
|
|
|
2019-02-20 14:49:39 +00:00
|
|
|
return span
|
2018-08-04 20:30:44 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def number_with_separator(number)
|
|
|
|
number.to_s.reverse.gsub(/(\d{3})(?=\d)/, "\\1,").reverse
|
|
|
|
end
|
|
|
|
|
2019-09-13 01:09:23 +00:00
|
|
|
def short_text_to_number(short_text : String) : Int32
|
2019-03-17 14:00:00 +00:00
|
|
|
case short_text
|
|
|
|
when .ends_with? "M"
|
|
|
|
number = short_text.rstrip(" mM").to_f
|
|
|
|
number *= 1000000
|
|
|
|
when .ends_with? "K"
|
|
|
|
number = short_text.rstrip(" kK").to_f
|
|
|
|
number *= 1000
|
|
|
|
else
|
|
|
|
number = short_text.rstrip(" ")
|
|
|
|
end
|
|
|
|
|
|
|
|
number = number.to_i
|
|
|
|
|
|
|
|
return number
|
|
|
|
end
|
|
|
|
|
2018-10-19 16:14:26 +00:00
|
|
|
def number_to_short_text(number)
|
|
|
|
seperated = number_with_separator(number).gsub(",", ".").split("")
|
|
|
|
text = seperated.first(2).join
|
|
|
|
|
|
|
|
if seperated[2]? && seperated[2] != "."
|
|
|
|
text += seperated[2]
|
|
|
|
end
|
|
|
|
|
|
|
|
text = text.rchop(".0")
|
|
|
|
|
2019-06-08 01:23:37 +00:00
|
|
|
if number // 1_000_000_000 != 0
|
2019-04-14 22:43:44 +00:00
|
|
|
text += "B"
|
2019-06-08 01:23:37 +00:00
|
|
|
elsif number // 1_000_000 != 0
|
2018-10-19 16:14:26 +00:00
|
|
|
text += "M"
|
2019-06-08 01:23:37 +00:00
|
|
|
elsif number // 1000 != 0
|
2018-10-19 16:14:26 +00:00
|
|
|
text += "K"
|
|
|
|
end
|
|
|
|
|
|
|
|
text
|
|
|
|
end
|
|
|
|
|
2018-08-04 20:30:44 +00:00
|
|
|
def arg_array(array, start = 1)
|
|
|
|
if array.size == 0
|
|
|
|
args = "NULL"
|
|
|
|
else
|
|
|
|
args = [] of String
|
|
|
|
(start..array.size + start - 1).each { |i| args << "($#{i})" }
|
|
|
|
args = args.join(",")
|
|
|
|
end
|
|
|
|
|
|
|
|
return args
|
|
|
|
end
|
2018-08-05 04:07:38 +00:00
|
|
|
|
2019-03-05 18:56:59 +00:00
|
|
|
def make_host_url(config, kemal_config)
|
|
|
|
ssl = config.https_only || kemal_config.ssl
|
2019-03-08 17:37:52 +00:00
|
|
|
port = config.external_port || kemal_config.port
|
2019-03-05 18:56:59 +00:00
|
|
|
|
2018-08-05 04:07:38 +00:00
|
|
|
if ssl
|
|
|
|
scheme = "https://"
|
|
|
|
else
|
|
|
|
scheme = "http://"
|
|
|
|
end
|
|
|
|
|
2019-03-08 17:37:52 +00:00
|
|
|
# Add if non-standard port
|
|
|
|
if port != 80 && port != 443
|
2019-03-05 18:56:59 +00:00
|
|
|
port = ":#{kemal_config.port}"
|
2019-03-03 17:55:14 +00:00
|
|
|
else
|
2019-03-05 18:56:59 +00:00
|
|
|
port = ""
|
|
|
|
end
|
|
|
|
|
|
|
|
if !config.domain
|
2019-03-03 17:55:14 +00:00
|
|
|
return ""
|
|
|
|
end
|
2019-03-05 18:56:59 +00:00
|
|
|
|
|
|
|
host = config.domain.not_nil!.lchop(".")
|
|
|
|
|
|
|
|
return "#{scheme}#{host}#{port}"
|
2018-08-05 04:07:38 +00:00
|
|
|
end
|
2018-08-09 01:26:02 +00:00
|
|
|
|
2019-06-05 00:58:56 +00:00
|
|
|
def get_referer(env, fallback = "/", unroll = true)
|
2018-08-17 15:19:20 +00:00
|
|
|
referer = env.params.query["referer"]?
|
|
|
|
referer ||= env.request.headers["referer"]?
|
2018-08-09 01:26:02 +00:00
|
|
|
referer ||= fallback
|
|
|
|
|
2018-08-17 15:19:20 +00:00
|
|
|
referer = URI.parse(referer)
|
|
|
|
|
2018-09-06 02:10:32 +00:00
|
|
|
# "Unroll" nested referrers
|
2019-06-05 00:58:56 +00:00
|
|
|
if unroll
|
|
|
|
loop do
|
|
|
|
if referer.query
|
|
|
|
params = HTTP::Params.parse(referer.query.not_nil!)
|
|
|
|
if params["referer"]?
|
2019-09-24 17:31:33 +00:00
|
|
|
referer = URI.parse(URI.decode_www_form(params["referer"]))
|
2019-06-05 00:58:56 +00:00
|
|
|
else
|
|
|
|
break
|
|
|
|
end
|
2018-08-17 15:19:20 +00:00
|
|
|
else
|
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
referer = referer.full_path
|
2018-09-06 02:07:19 +00:00
|
|
|
referer = "/" + referer.lstrip("\/\\")
|
2018-08-09 01:26:02 +00:00
|
|
|
|
|
|
|
if referer == env.request.path
|
|
|
|
referer = fallback
|
|
|
|
end
|
|
|
|
|
|
|
|
return referer
|
|
|
|
end
|
2018-09-04 13:52:30 +00:00
|
|
|
|
2019-07-21 01:18:08 +00:00
|
|
|
struct VarInt
|
2019-09-04 19:47:27 +00:00
|
|
|
def self.from_io(io : IO, format = IO::ByteFormat::NetworkEndian) : Int32
|
|
|
|
result = 0_u32
|
2019-07-21 01:18:08 +00:00
|
|
|
num_read = 0
|
2018-09-04 13:52:30 +00:00
|
|
|
|
2019-07-21 01:18:08 +00:00
|
|
|
loop do
|
|
|
|
byte = io.read_byte
|
|
|
|
raise "Invalid VarInt" if !byte
|
|
|
|
value = byte & 0x7f
|
2018-09-04 13:52:30 +00:00
|
|
|
|
2019-09-04 19:47:27 +00:00
|
|
|
result |= value.to_u32 << (7 * num_read)
|
2019-02-09 16:15:14 +00:00
|
|
|
num_read += 1
|
2019-07-21 01:18:08 +00:00
|
|
|
|
|
|
|
break if byte & 0x80 == 0
|
|
|
|
raise "Invalid VarInt" if num_read > 5
|
2018-09-04 13:52:30 +00:00
|
|
|
end
|
|
|
|
|
2019-09-04 19:47:27 +00:00
|
|
|
result.to_i32
|
2019-07-21 01:18:08 +00:00
|
|
|
end
|
2018-09-04 13:52:30 +00:00
|
|
|
|
2019-07-21 01:18:08 +00:00
|
|
|
def self.to_io(io : IO, value : Int32)
|
|
|
|
io.write_byte 0x00 if value == 0x00
|
2019-09-04 19:47:27 +00:00
|
|
|
value = value.to_u32
|
2018-09-04 13:52:30 +00:00
|
|
|
|
|
|
|
while value != 0
|
2019-07-21 01:18:08 +00:00
|
|
|
byte = (value & 0x7f).to_u8
|
|
|
|
value >>= 7
|
2018-09-04 13:52:30 +00:00
|
|
|
|
|
|
|
if value != 0
|
2019-07-21 01:18:08 +00:00
|
|
|
byte |= 0x80
|
2018-09-04 13:52:30 +00:00
|
|
|
end
|
|
|
|
|
2019-07-21 01:18:08 +00:00
|
|
|
io.write_byte byte
|
2018-09-04 13:52:30 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2018-10-09 13:40:29 +00:00
|
|
|
|
|
|
|
def sha256(text)
|
|
|
|
digest = OpenSSL::Digest.new("SHA256")
|
|
|
|
digest << text
|
|
|
|
return digest.hexdigest
|
|
|
|
end
|
2019-06-08 00:56:41 +00:00
|
|
|
|
2019-11-01 11:34:36 +00:00
|
|
|
def subscribe_pubsub(topic, key, config, client_pool)
|
2019-06-08 00:56:41 +00:00
|
|
|
case topic
|
|
|
|
when .match(/^UC[A-Za-z0-9_-]{22}$/)
|
|
|
|
topic = "channel_id=#{topic}"
|
2019-06-08 02:39:32 +00:00
|
|
|
when .match(/^(PL|LL|EC|UU|FL|UL|OLAK5uy_)[0-9A-Za-z-_]{10,}$/)
|
2019-06-08 00:56:41 +00:00
|
|
|
# There's a couple missing from the above regex, namely TL and RD, which
|
|
|
|
# don't have feeds
|
|
|
|
topic = "playlist_id=#{topic}"
|
|
|
|
else
|
|
|
|
# TODO
|
|
|
|
end
|
|
|
|
|
|
|
|
time = Time.utc.to_unix.to_s
|
|
|
|
nonce = Random::Secure.hex(4)
|
|
|
|
signature = "#{time}:#{nonce}"
|
|
|
|
|
|
|
|
host_url = make_host_url(config, Kemal.config)
|
|
|
|
|
|
|
|
body = {
|
|
|
|
"hub.callback" => "#{host_url}/feed/webhook/v1:#{time}:#{nonce}:#{OpenSSL::HMAC.hexdigest(:sha1, key, signature)}",
|
|
|
|
"hub.topic" => "https://www.youtube.com/xml/feeds/videos.xml?#{topic}",
|
|
|
|
"hub.verify" => "async",
|
|
|
|
"hub.mode" => "subscribe",
|
|
|
|
"hub.lease_seconds" => "432000",
|
|
|
|
"hub.secret" => key.to_s,
|
|
|
|
}
|
|
|
|
|
2019-11-01 11:34:36 +00:00
|
|
|
return client_pool.client &.post("/subscribe", form: body)
|
2019-06-08 00:56:41 +00:00
|
|
|
end
|
2019-07-04 20:30:00 +00:00
|
|
|
|
|
|
|
def parse_range(range)
|
|
|
|
if !range
|
|
|
|
return 0_i64, nil
|
|
|
|
end
|
|
|
|
|
|
|
|
ranges = range.lchop("bytes=").split(',')
|
|
|
|
ranges.each do |range|
|
|
|
|
start_range, end_range = range.split('-')
|
|
|
|
|
|
|
|
start_range = start_range.to_i64? || 0_i64
|
|
|
|
end_range = end_range.to_i64?
|
|
|
|
|
|
|
|
return start_range, end_range
|
|
|
|
end
|
|
|
|
|
|
|
|
return 0_i64, nil
|
|
|
|
end
|
2019-08-15 16:29:55 +00:00
|
|
|
|
|
|
|
def convert_theme(theme)
|
|
|
|
case theme
|
|
|
|
when "true"
|
|
|
|
"dark"
|
|
|
|
when "false"
|
|
|
|
"light"
|
|
|
|
when "", nil
|
|
|
|
nil
|
|
|
|
else
|
|
|
|
theme
|
|
|
|
end
|
|
|
|
end
|