function loadDynamicTrainData(secrets) {
    const trainData = new Map(),
        trainInfoData = [],
        urls = [];

    for (const source of Object.keys(RAILWAYS_FOR_TRAINS)) {
        const url = configs.apiUrl[source],
            key = secrets[source];

        if (source === 'odpt') {
            const railways = RAILWAYS_FOR_TRAINS[source]
                .map((railway) => `odpt.Railway:${railway}`)
                .join(',');

            urls.push(`${url}odpt:Train?odpt:railway=${railways}&acl:consumerKey=${key}`);
        }
    }

    urls.push(configs.tidUrl);

    for (const source of Object.keys(OPERATORS_FOR_TRAININFORMATION)) {
        const url = configs.apiUrl[source],
            key = secrets[source];

        if (source === 'odpt') {
            const operators = OPERATORS_FOR_TRAININFORMATION[source]
                .map(operator => `odpt.Operator:${operator}`)
                .join(',');

            urls.push(`${url}odpt:TrainInformation?odpt:operator=${operators}&acl:consumerKey=${key}`);
        }
    }

    urls.push(configs.trainInfoUrl);

    return Promise.all(urls.map(loadJSON)).then(data => {
        // Train data from ODPT
        for (const train of data.shift()) {
            const trainType = removePrefix(train['odpt:trainType']),
                destinationStation = removePrefix(train['odpt:destinationStation']),
                id = adjustTrainID(removePrefix(train['owl:sameAs']), trainType, destinationStation);

            trainData.set(id, {
                id,
                o: removePrefix(train['odpt:operator']),
                r: removePrefix(train['odpt:railway']),
                y: trainType,
                n: train['odpt:trainNumber'],
                os: removePrefix(train['odpt:originStation']),
                d: removePrefix(train['odpt:railDirection']),
                ds: destinationStation,
                ts: removePrefix(train['odpt:toStation']),
                fs: removePrefix(train['odpt:fromStation']),
                delay: (train['odpt:delay'] || 0) * 1000,
                carComposition: train['odpt:carComposition'],
                date: train['dc:date'].replace(/([\d\-])T([\d:]+).*/, '$1 $2')
            });
        }

        // Train data from others
        for (const train of data.shift()) {
            const id = train.id;

            if (trainData.has(id)) {
                Object.assign(trainData.get(id), train);
            } else {
                trainData.set(id, train);
            }
        }

        // Train information data from ODPT
        for (const trainInfo of data.shift()) {
            trainInfoData.push({
                operator: removePrefix(trainInfo['odpt:operator']),
                railway: removePrefix(trainInfo['odpt:railway']),
                status: trainInfo['odpt:trainInformationStatus'],
                text: trainInfo['odpt:trainInformationText']
            });
        }

        // Train information data from others
        for (const trainInfo of data.shift()) {
            trainInfoData.push(trainInfo);
        }

        return {
            trainData: Array.from(trainData.values()),
            trainInfoData
        };
    });
}
Load the dynamic data for trains.
@param {Object} secrets - Secrets object
@returns {Object} Loaded data