UNPKG

simclimat-lib

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.0.

164 lines 37.6 kB
import { CLogger } from './simclimat-lib.logger'; import { CModelVars } from './simclimat-lib.model-vars'; import { CPhysicsConstants } from './simclimat-lib.physics-constants'; import { CDataArray } from './simclimat-lib.data-array'; export class CSimulationValues { constructor() { // Simulation name this.simulation_name = ''; /** Constants */ // private readonly ID_MIN: number = -100; this.ID_MIN = 0; this.ID_MAX = 100; this.TEMPS_ELEM = 1; this.INTERN_ECHEANCE = 100.; // Instanciate a CPhysicsConstants object CLogger.log('Enter CSimulationValues constructor'); this.modelPhysicsConstants = new CPhysicsConstants(); this.modelVarsConstants = new CModelVars(); } // eo constructor set_simulation_name(name) { this.simulation_name = name; return true; } // eo set_simulation_name method get_simulation_name() { return this.simulation_name; } // eo get_simulation_name method set_annee_fin(echeance) { this.annee_fin = Number.parseInt(this.annee_debut.toString()) + Number.parseInt(echeance.toString()); return true; } // eo set_simulation_name method get_annee_fin() { return this.annee_fin; } // eo get_simulation_name method set_resolution(resolution) { this.emissions_coo_data.resolution = resolution; this.concentrations_coo_data.resolution = resolution; this.niveau_calottes_data.resolution = resolution; this.niveau_mer_data.resolution = resolution; this.albedo_data.resolution = resolution; this.temperature_data.resolution = resolution; return true; } // eo set_simulation_name method recast_final_initial(sv, ev) { // this.annee_debut = Number.parseInt( sv.annee_debut.toString() ) + Number.parseInt( sv.annee_fin.toString() ); this.annee_debut = sv.annee_fin; this.emissions_coo_data.recast_final_initial_origin(sv.emissions_coo_data); this.concentrations_coo_data.recast_final_initial_origin(sv.concentrations_coo_data); this.niveau_calottes_data.recast_final_initial_origin_calotte(sv.niveau_calottes_data); // Modif pour gérer le changement d'origine sur le niveau des calottes A. Deseine 13-05-2024 this.niveau_mer_data.recast_final_initial_origin(sv.niveau_mer_data); this.albedo_data.recast_final_initial_origin(sv.albedo_data); this.temperature_data.recast_final_initial_origin(sv.temperature_data); this.temperature_data.recast_final_initial_past(sv.temperature_data, ev); return true; } // eo recast_final_initial method init_simulation_arrays(name, indice_min, indice_max, temps_elem) { CLogger.log('Enter init_simulation_arrays method'); if (name == undefined) { name = 'Nouvelle simulation'; } if (indice_min == undefined) { indice_min = this.ID_MIN; } if (indice_max == undefined) { indice_max = this.ID_MAX; } if (temps_elem == undefined) { temps_elem = this.TEMPS_ELEM; } this.simulation_name = name; this.emissions_coo_data = new CDataArray(temps_elem, indice_min, indice_max); this.concentrations_coo_data = new CDataArray(temps_elem, indice_min, indice_max); this.temperature_data = new CDataArray(temps_elem, indice_min, indice_max); this.niveau_calottes_data = new CDataArray(temps_elem, indice_min, indice_max); this.niveau_mer_data = new CDataArray(temps_elem, indice_min, indice_max); this.albedo_data = new CDataArray(temps_elem, indice_min, indice_max); } // eo init_simulation_arrays method create_1750_state() { CLogger.log('Enter create_1750_state method'); // SimulationValues s("le monde en 1750",ID_MIN,ID_MAX,TEMPS_ELEM); // TODO ALain : Initialise les tableaux. this.init_simulation_arrays('le monde en 1750', this.ID_MIN, this.ID_MAX, this.TEMPS_ELEM); this.annee_debut = 1750.; // 1650 ou 1750 ? this.fixed_eau = false; this.fixed_concentration = false; this.debranche_biologie = false; this.fixed_ocean = false; this.debranche_ocean = false; this.fixed_albedo = false; this.rapport_H2O_value = 100.; this.puit_bio_value = this.modelVarsConstants.modelConstants.puit_bio_reset_value; this.puit_oce_value = this.modelVarsConstants.modelConstants.puit_ocean_reset_value; this.albedo_value = CPhysicsConstants.albedo_1750 * 100; this.coo_concentr_value = this.modelVarsConstants.modelConstants.coo_concentr_reset_value; this.puissance_soleil_value = this.modelVarsConstants.modelConstants.puissance_soleil_reset_value; this.distance_ts_value = this.modelVarsConstants.modelConstants.distance_ts_reset_value; this.obliquite_value = this.modelVarsConstants.modelConstants.obliquite_reset_value; this.excentricite_value = this.modelVarsConstants.modelConstants.excentricite_reset_value; this.precession_value = this.modelVarsConstants.modelConstants.precession_reset_value; this.alteration_value = this.modelVarsConstants.modelConstants.alteration_reset_value; this.emit_anthro_coo_value = this.modelVarsConstants.modelConstants.emit_anthro_coo_reset_value; this.volcan_value = this.modelVarsConstants.modelConstants.volcan_reset_value; this.stockage_biologique_value = this.modelVarsConstants.modelConstants.stockage_biologique_reset_value; for (let t = this.ID_MIN; t <= this.ID_MAX; t++) { this.temperature_data.set(t, CPhysicsConstants.temperature_1750); this.niveau_mer_data.set(t, this.modelPhysicsConstants.niveau_mer_1750); this.niveau_calottes_data.set(t, CPhysicsConstants.niveau_calottes_1750); this.concentrations_coo_data.set(t, CPhysicsConstants.concentration_coo_1750); this.emissions_coo_data.set(t, 0.); this.albedo_data.set(t, CPhysicsConstants.albedo_1750 * 100); if (t > 0) { this.temperature_data.set_past(t, CPhysicsConstants.temperature_1750); } // eo if else { this.temperature_data.set_past(t, 0); } // eo else } //eo for return; } // eo create_1750_state method create_actual_state() { CLogger.log('Enter create_actual_state method'); // SimulationValues s("le monde en 2022",ID_MIN,ID_MAX,TEMPS_ELEM); // TODO ALain : Initialise les tableaux. this.init_simulation_arrays('le monde en 2022', this.ID_MIN, this.ID_MAX, this.TEMPS_ELEM); this.annee_debut = 2022.; // CR: mise à jour mars 2022 this.fixed_eau = false; this.fixed_concentration = false; this.debranche_biologie = false; this.fixed_ocean = false; this.debranche_ocean = false; this.fixed_albedo = false; this.rapport_H2O_value = this.modelVarsConstants.modelConstants.rapport_H2O_actuel; this.puit_bio_value = this.modelVarsConstants.modelConstants.puit_bio_reset_value; this.puit_oce_value = this.modelVarsConstants.modelConstants.puit_ocean_reset_value; this.albedo_value = this.modelVarsConstants.modelConstants.albedo_reset_value; this.coo_concentr_value = CPhysicsConstants.concentration_coo_actuel; this.puissance_soleil_value = this.modelVarsConstants.modelConstants.puissance_soleil_reset_value; this.distance_ts_value = this.modelVarsConstants.modelConstants.distance_ts_reset_value; this.obliquite_value = this.modelVarsConstants.modelConstants.obliquite_reset_value; this.excentricite_value = this.modelVarsConstants.modelConstants.excentricite_reset_value; this.precession_value = this.modelVarsConstants.modelConstants.precession_reset_value; this.alteration_value = this.modelVarsConstants.modelConstants.alteration_reset_value; this.emit_anthro_coo_value = CPhysicsConstants.emit_anthro_coo_act; this.volcan_value = this.modelVarsConstants.modelConstants.volcan_reset_value; this.stockage_biologique_value = this.modelVarsConstants.modelConstants.stockage_biologique_reset_value; for (let t = this.ID_MIN; t <= this.ID_MAX; t++) { // modif CR: 31 oct 2019: les températures positives ou nulles doivent être fixées à temperature_actuelle // this.temperature_data.set( t, CPhysicsConstants.temperature_actuelle + ( this.TEMPS_ELEM * ( t - this.ID_MAX ) * CPhysicsConstants.deltaT_last_century ) / this.INTERN_ECHEANCE ); this.temperature_data.set(t, CPhysicsConstants.temperature_actuelle); this.niveau_mer_data.set(t, 0.); this.niveau_calottes_data.set(t, this.modelPhysicsConstants.niveau_calottes_actuel); this.concentrations_coo_data.set(t, CPhysicsConstants.concentration_coo_actuel); this.emissions_coo_data.set(t, CPhysicsConstants.emit_anthro_coo_act * (1 - CPhysicsConstants.puit_bio_act - CPhysicsConstants.puit_ocean_act)); this.albedo_data.set(t, this.modelPhysicsConstants.albedo_actuel * 100); if (t > 0) { // this.temperature_data.set_past( t, CPhysicsConstants.temperature_actuelle + ( this.TEMPS_ELEM * ( - t - this.ID_MAX ) * CPhysicsConstants.deltaT_last_century ) / this.INTERN_ECHEANCE ); this.temperature_data.set_past(t, CPhysicsConstants.temperature_actuelle - (this.TEMPS_ELEM / this.INTERN_ECHEANCE * t * this.modelPhysicsConstants.deltaT_last_century)); // modif Camille 28 avril 2024: deltaT_last_century est maintenant un this.modelPhysicsConstants } // eo if else { this.temperature_data.set_past(t, 0); } // eo else } //eo for return; } // eo create_actual_state method } // eo CSimulationValues class //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltY2xpbWF0LWxpYi5zaW11bGF0aW9uLXZhbHVlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbWNsaW1hdC1saWIvc3JjL2xpYi9zaW1jbGltYXQtbGliLnNpbXVsYXRpb24tdmFsdWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQXFCLFVBQVUsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzFFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUd0RCxNQUFNLE9BQU8saUJBQWlCO0lBZ0UxQjtRQS9EQSxrQkFBa0I7UUFDWCxvQkFBZSxHQUFZLEVBQUUsQ0FBQztRQW1EckMsZ0JBQWdCO1FBQ2hCLHNEQUFzRDtRQUNyQyxXQUFNLEdBQXVCLENBQUMsQ0FBQztRQUMvQixXQUFNLEdBQXVCLEdBQUcsQ0FBQztRQUNqQyxlQUFVLEdBQW1CLENBQUMsQ0FBQztRQUMvQixvQkFBZSxHQUFjLElBQUksQ0FBQztRQU8vQyx5Q0FBeUM7UUFDekMsT0FBTyxDQUFDLEdBQUcsQ0FBRSxxQ0FBcUMsQ0FBRSxDQUFDO1FBQ3JELElBQUksQ0FBQyxxQkFBcUIsR0FBSSxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLGtCQUFrQixHQUFJLElBQUksVUFBVSxFQUFFLENBQUM7SUFDaEQsQ0FBQyxDQUFDLGlCQUFpQjtJQUdaLG1CQUFtQixDQUFFLElBQVk7UUFDcEMsSUFBSSxDQUFDLGVBQWUsR0FBTSxJQUFJLENBQUM7UUFDL0IsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQyxDQUFDLGdDQUFnQztJQUczQixtQkFBbUI7UUFDdEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUMs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LENBQUMsY0FBYyxDQUFFLENBQUUsQ0FBQztZQUNwSixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUUsQ0FBQztZQUUxRSxJQUFLLENBQUMsR0FBRyxDQUFDLEVBQ1Y7Z0JBQ0ksNkxBQTZMO2dCQUM3TCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFFLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxvQkFBb0IsR0FBRyxDQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLG1CQUFtQixDQUFFLENBQUUsQ0FBQztnQkFDNUwsZ0dBQWdHO2FBQ3JGLENBQUMsUUFBUTtpQkFFVjtnQkFDSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFFLENBQUMsRUFBRSxDQUFDLENBQUUsQ0FBQzthQUMxQyxDQUFDLFVBQVU7U0FDZixDQUFDLFFBQVE7UUFFVixPQUFPO0lBQ1gsQ0FBQyxDQUFDLGdDQUFnQztDQUNyQyxDQUFDLDZCQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q0xvZ2dlcn0gZnJvbSAnLi9zaW1jbGltYXQtbGliLmxvZ2dlcic7XG5pbXBvcnQge21vZGVsVmFyc0NvbnN0YW50cywgQ01vZGVsVmFyc30gZnJvbSAnLi9zaW1jbGltYXQtbGliLm1vZGVsLXZhcnMnO1xuaW1wb3J0IHtDUGh5c2ljc0NvbnN0YW50c30gZnJvbSAnLi9zaW1jbGltYXQtbGliLnBoeXNpY3MtY29uc3RhbnRzJztcbmltcG9ydCB7Q0RhdGFBcnJheX0gZnJvbSAnLi9zaW1jbGltYXQtbGliLmRhdGEtYXJyYXknO1xuaW1wb3J0IHtDRXhwZXJpZW5jZVZhbHVlc30gZnJvbSAnLi9zaW1jbGltYXQtbGliLmV4cGVyaWVuY2UtdmFsdWVzJztcblxuZXhwb3J0IGNsYXNzIENTaW11bGF0aW9uVmFsdWVzIHtcbiAgICAvLyBTaW11bGF0aW9uIG5hbWVcbiAgICBwdWJsaWMgc2ltdWxhdGlvbl9uYW1lOiBzdHJpbmcgID0gJyc7XG5cblx0cHVibGljIGFubmVlX2RlYnV0OiBudW1iZXI7XG5cdHB1YmxpYyBhbm5lZV9maW46IG51bWJlcjtcblxuXHQvLyBTaW11bGF0aW9uX3R5cGVfZGlhbG9nXG5cdHB1YmxpYyBmaXhlZF9jb25jZW50cmF0aW9uOiBib29sZWFuO1xuXG5cdC8vIENvbmNlbnRyYXRpb25fZGlhbG9nXG5cdHB1YmxpYyBjb29fY29uY2VudHJfdmFsdWU6IG51bWJlcjtcblxuXHQvLyBFbWlzc2lvbl9kaWFsb2dcblx0cHVibGljIGVtaXRfYW50aHJvX2Nvb192YWx1ZTogbnVtYmVyO1xuXHRwdWJsaWMgdm9sY2FuX3ZhbHVlOiBudW1iZXI7XG5cdHB1YmxpYyBhbHRlcmF0aW9uX3ZhbHVlOiBudW1iZXI7XG5cdHB1YmxpYyBzdG9ja2FnZV9iaW9sb2dpcXVlX3ZhbHVlOiBudW1iZXI7IFxuXG5cdC8vIFBhcmFtZXRyZXNfYXN0cm9ub21pcXVlc19kaWFsb2dcblx0cHVibGljIHB1aXNzYW5jZV9zb2xlaWxfdmFsdWU6IG51bWJlcjtcblx0cHVibGljIGRpc3RhbmNlX3RzX3ZhbHVlOiBudW1iZXI7XG5cdHB1YmxpYyBwcmVjZXNzaW9uX3ZhbHVlOiBudW1iZXI7XG5cdHB1YmxpYyBleGNlbnRyaWNpdGVfdmFsdWU6IG51bWJlcjtcblx0cHVibGljIG9ibGlxdWl0ZV92YWx1ZTogbnVtYmVyO1xuXG5cdC8vIFJldHJvYWN0aW9uc19kaWFsb2dcblx0Ly8gQWxiZWRvXG5cdHB1YmxpYyBmaXhlZF9hbGJlZG86IGJvb2xlYW47XG4gICAgcHVibGljIGFsYmVkb192YWx1ZTogbnVtYmVyO1xuICAgIFxuXHQvLyBPY2VhblxuXHRwdWJsaWMgZGVicmFuY2hlX29jZWFuOiBib29sZWFuO1xuXHRwdWJsaWMgZml4ZWRfb2NlYW46IGJvb2xlYW47XG5cdHB1YmxpYyBwdWl0X29jZV92YWx1ZTogbnVtYmVyO1xuICAgIFxuICAgIC8vIFZlZ2V0YXRpb25cdFxuXHRwdWJsaWMgZGVicmFuY2hlX2Jpb2xvZ2llOiBib29sZWFuO1xuXHRwdWJsaWMgcHVpdF9iaW9fdmFsdWU6IG51bWJlcjtcbiAgICBcbiAgICAvLyBWYXBldXIgZCdlYXVcblx0cHVibGljIGZpeGVkX2VhdTogYm9vbGVhbjtcblx0cHVibGljIHJhcHBvcnRfSDJPX3ZhbHVlOiBudW1iZXI7XG5cbiAgICAvLyBUYWJsZWF1eCBkZSBkb25uw6llc1xuXHRwdWJsaWMgZW1pc3Npb25zX2Nvb19kYXRhOiBDRGF0YUFycmF5O1xuXHRwdWJsaWMgY29uY2VudHJhdGlvbnNfY29vX2RhdGE6IENEYXRhQXJyYXk7XG5cdHB1YmxpYyB0ZW1wZXJhdHVyZV9kYXRhOiBDRGF0YUFycmF5O1xuXHRwdWJsaWMgbml2ZWF1X2NhbG90dGVzX2RhdGE6IENEYXRhQXJyYXk7XG5cdHB1YmxpYyBuaXZlYXVfbWVyX2RhdGE6IENEYXRhQXJyYXk7XG5cdHB1YmxpYyBhbGJlZG9fZGF0YTogQ0RhdGFBcnJheTtcblxuXG4gICAgLyoqIENvbnN0YW50cyAqL1xuICAgIC8vIHByaXZhdGUgcmVhZG9ubHkgSURfTUlOOiBudW1iZXIgICAgICAgICAgICAgPSAtMTAwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgSURfTUlOOiBudW1iZXIgICAgICAgICAgICAgPSAwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgSURfTUFYOiBudW1iZXIgICAgICAgICAgICAgPSAxMDA7XG4gICAgcHJpdmF0ZSByZWFkb25seSBURU1QU19FTEVNOiBudW1iZXIgICAgICAgICA9IDE7XG4gICAgcHJpdmF0ZSByZWFkb25seSBJTlRFUk5fRUNIRUFOQ0U6IG51bWJlciAgICA9IDEwMC47XG5cbiAgICAvKiogT2JqZWN0cyAqL1xuICAgIHByaXZhdGUgbW9kZWxQaHlzaWNzQ29uc3RhbnRzOiBDUGh5c2ljc0NvbnN0YW50cztcbiAgICBwcml2YXRlIG1vZGVsVmFyc0NvbnN0YW50czogQ01vZGVsVmFycztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBJbnN0YW5jaWF0ZSBhIENQaHlzaWNzQ29uc3RhbnRzIG9iamVjdFxuICAgICAgICBDTG9nZ2VyLmxvZyggJ0VudGVyIENTaW11bGF0aW9uVmFsdWVzIGNvbnN0cnVjdG9yJyApO1xuICAgICAgICB0aGlzLm1vZGVsUGh5c2ljc0NvbnN0YW50cyAgPSBuZXcgQ1BoeXNpY3NDb25zdGFudHMoKTtcbiAgICAgICAgdGhpcy5tb2RlbFZhcnNDb25zdGFudHMgID0gbmV3IENNb2RlbFZhcnMoKTtcbiAgICB9IC8vIGVvIGNvbnN0cnVjdG9yXG5cblxuICAgIHB1YmxpYyBzZXRfc2ltdWxhdGlvbl9uYW1lKCBuYW1lOiBzdHJpbmcgKSA6IGJvb2xlYW4ge1xuICAgICAgICB0aGlzLnNpbXVsYXRpb25fbmFtZSAgICA9IG5hbWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gZW8gc2V0X3NpbXVsYXRpb25fbmFtZSBtZXRob2RcblxuXG4gICAgcHVibGljIGdldF9zaW11bGF0aW9uX25hbWUoKSA6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpbXVsYXRpb25fbmFtZTtcbiAgICB9IC8vIGVvIGdldF9zaW11bGF0aW9uX25hbWUgbWV0aG9kXG5cblxuICAgIHB1YmxpYyBzZXRfYW5uZWVfZmluKCBlY2hlYW5jZTogbnVtYmVyICkgOiBib29sZWFuIHtcbiAgICAgICAgdGhpcy5hbm5lZV9maW4gICAgPSBOdW1iZXIucGFyc2VJbnQoIHRoaXMuYW5uZWVfZGVidXQudG9TdHJpbmcoKSApICsgTnVtYmVyLnBhcnNlSW50KCBlY2hlYW5jZS50b1N0cmluZygpICk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gZW8gc2V0X3NpbXVsYXRpb25fbmFtZSBtZXRob2RcblxuXG4gICAgcHVibGljIGdldF9hbm5lZV9maW4oKSA6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmFubmVlX2ZpbjtcbiAgICB9IC8vIGVvIGdldF9zaW11bGF0aW9uX25hbWUgbWV0aG9kXG5cblxuICAgIHB1YmxpYyBzZXRfcmVzb2x1dGlvbiggcmVzb2x1dGlvbjogbnVtYmVyICkgOiBib29sZWFuIHtcbiAgICAgICAgdGhpcy5lbWlzc2lvbnNfY29vX2RhdGEucmVzb2x1dGlvbiAgICAgID0gcmVzb2x1dGlvbjtcbiAgICAgICAgdGhpcy5jb25jZW50cmF0aW9uc19jb29fZGF0YS5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjtcbiAgICAgICAgdGhpcy5uaXZlYXVfY2Fsb3R0ZXNfZGF0YS5yZXNvbHV0aW9uICAgID0gcmVzb2x1dGlvbjtcbiAgICAgICAgdGhpcy5uaXZlYXVfbWVyX2RhdGEucmVzb2x1dGlvbiAgICAgICAgID0gcmVzb2x1dGlvbjtcbiAgICAgICAgdGhpcy5hbGJlZG9fZGF0YS5yZXNvbHV0aW9uICAgICAgICAgICAgID0gcmVzb2x1dGlvbjtcbiAgICAgICAgdGhpcy50ZW1wZXJhdHVyZV9kYXRhLnJlc29sdXRpb24gICAgICAgID0gcmVzb2x1dGlvbjtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIGVvIHNldF9zaW11bGF0aW9uX25hbWUgbWV0aG9kXG5cblxuICAgIHB1YmxpYyByZWNhc3RfZmluYWxfaW5pdGlhbCggc3Y6IENTaW11bGF0aW9uVmFsdWVzLCBldjogQ0V4cGVyaWVuY2VWYWx1ZXMgKSA6IGJvb2xlYW4ge1xuICAgICAgICAvLyB0aGlzLmFubmVlX2RlYnV0ICAgID0gTnVtYmVyLnBhcnNlSW50KCBzdi5hbm5lZV9kZWJ1dC50b1N0cmluZygpICkgKyBOdW1iZXIucGFyc2VJbnQoIHN2LmFubmVlX2Zpbi50b1N0cmluZygpICk7XG4gICAgICAgIHRoaXMuYW5uZWVfZGVidXQgICAgPSBzdi5hbm5lZV9maW47XG5cbiAgICAgICAgdGhpcy5lbWlzc2lvbnNfY29vX2RhdGEucmVjYXN0X2ZpbmFsX2luaXRpYWxfb3JpZ2luKCBzdi5lbWlzc2lvbnNfY29vX2RhdGEgKTtcbiAgICAgICAgdGhpcy5jb25jZW50cmF0aW9uc19jb29fZGF0YS5yZWNhc3RfZmluYWxfaW5pdGlhbF9vcmlnaW4oIHN2LmNvbmNlbnRyYXRpb25zX2Nvb19kYXRhICk7XG4gICAgICAgIHRoaXMubml2ZWF1X2NhbG90dGVzX2RhdGEucmVjYXN0X2ZpbmFsX2luaXRpYWxfb3JpZ2luX2NhbG90dGUoIHN2Lm5pdmVhdV9jYWxvdHRlc19kYXRhICk7IC8vIE1vZGlmIHBvdXIgZ8OpcmVyIGxlIGNoYW5nZW1lbnQgZCdvcmlnaW5lIHN1ciBsZSBuaXZlYXUgZGVzIGNhbG90dGVzIEEuIERlc2VpbmUgMTMtMDUtMjAyNFxuICAgICAgICB0aGlzLm5pdmVhdV9tZXJfZGF0YS5yZWNhc3RfZmluYWxfaW5pdGlhbF9vcmlnaW4oIHN2Lm5pdmVhdV9tZXJfZGF0YSApO1xuICAgICAgICB0aGlzLmFsYmVkb19kYXRhLnJlY2FzdF9maW5hbF9pbml0aWFsX29yaWdpbiggc3YuYWxiZWRvX2RhdGEgKTtcbiAgICAgICAgdGhpcy50ZW1wZXJhdHVyZV9kYXRhLnJlY2FzdF9maW5hbF9pbml0aWFsX29yaWdpbiggc3YudGVtcGVyYXR1cmVfZGF0YSApO1xuICAgICAgICB0aGlzLnRlbXBlcmF0dXJlX2RhdGEucmVjYXN0X2ZpbmFsX2luaXRpYWxfcGFzdCggc3YudGVtcGVyYXR1cmVfZGF0YSwgZXYgKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIGVvIHJlY2FzdF9maW5hbF9pbml0aWFsIG1ldGhvZFxuXG5cbiAgICBwdWJsaWMgaW5pdF9zaW11bGF0aW9uX2FycmF5cyggbmFtZT86IHN0cmluZywgaW5kaWNlX21pbj86IG51bWJlciwgaW5kaWNlX21heD86IG51bWJlciwgdGVtcHNfZWxlbT86IG51bWJlciApXG4gICAge1xuICAgICAgICBDTG9nZ2VyLmxvZyggJ0VudGVyIGluaXRfc2ltdWxhdGlvbl9hcnJheXMgbWV0aG9kJyApO1xuXG4gICAgICAgIGlmICggbmFtZSA9PSB1bmRlZmluZWQgKVxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lID0gJ05vdXZlbGxlIHNpbXVsYXRpb24nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCBpbmRpY2VfbWluID09IHVuZGVmaW5lZCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGluZGljZV9taW4gPSB0aGlzLklEX01JTjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICggaW5kaWNlX21heCA9PSB1bmRlZmluZWQgKVxuICAgICAgICB7XG4gICAgICAgICAgICBpbmRpY2VfbWF4ID0gdGhpcy5JRF9NQVg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIHRlbXBzX2VsZW0gPT0gdW5kZWZpbmVkIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGVtcHNfZWxlbSA9IHRoaXMuVEVNUFNfRUxFTTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2ltdWxhdGlvbl9uYW1lICAgICAgICAgICAgPSBuYW1lO1xuICAgICAgICB0aGlzLmVtaXNzaW9uc19jb29fZGF0YSAgICAgICAgID0gbmV3IENEYXRhQXJyYXkoIHRlbXBzX2VsZW0sIGluZGljZV9taW4sIGluZGljZV9tYXggKTtcbiAgICAgICAgdGhpcy5jb25jZW50cmF0aW9uc19jb29fZGF0YSAgICA9IG5ldyBDRGF0YUFycmF5KCB0ZW1wc19lbGVtLCBpbmRpY2VfbWluLCBpbmRpY2VfbWF4ICk7XG4gICAgICAgIHRoaXMudGVtcGVyYXR1cmVfZGF0YSAgICAgICAgICAgPSBuZXcgQ0RhdGFBcnJheSggdGVtcHNfZWxlbSwgaW5kaWNlX21pbiwgaW5kaWNlX21heCApO1xuICAgICAgICB0aGlzLm5pdmVhdV9jYWxvdHRlc19kYXRhICAgICAgID0gbmV3IENEYXRhQXJyYXkoIHRlbXBzX2VsZW0sIGluZGljZV9taW4sIGluZGljZV9tYXggKTtcbiAgICAgICAgdGhpcy5uaXZlYXVfbWVyX2RhdGEgICAgICAgICAgICA9IG5ldyBDRGF0YUFycmF5KCB0ZW1wc19lbGVtLCBpbmRpY2VfbWluLCBpbmRpY2VfbWF4ICk7XG4gICAgICAgIHRoaXMuYWxiZWRvX2RhdGEgICAgICAgICAgICAgICAgPSBuZXcgQ0RhdGFBcnJheSggdGVtcHNfZWxlbSwgaW5kaWNlX21pbiwgaW5kaWNlX21heCApO1xuICAgIFxuICAgIH0gLy8gZW8gaW5pdF9zaW11bGF0aW9uX2FycmF5cyBtZXRob2RcblxuXG4gICAgcHVibGljIGNyZWF0ZV8xNzUwX3N0YXRlKCkgXG4gICAge1xuICAgICAgICBDTG9nZ2VyLmxvZyggJ0VudGVyIGNyZWF0ZV8xNzUwX3N0YXRlIG1ldGhvZCcgKTtcblxuICAgICAgICAvLyBTaW11bGF0aW9uVmFsdWVzIHMoXCJsZSBtb25kZSBlbiAxNzUwXCIsSURfTUlOLElEX01BWCxURU1QU19FTEVNKTsgLy8gVE9ETyBBTGFpbiA6IEluaXRpYWxpc2UgbGVzIHRhYmxlYXV4LlxuICAgICAgICB0aGlzLmluaXRfc2ltdWxhdGlvbl9hcnJheXMoICdsZSBtb25kZSBlbiAxNzUwJywgdGhpcy5JRF9NSU4sIHRoaXMuSURfTUFYLCB0aGlzLlRFTVBTX0VMRU0gKTtcblxuICAgICAgICB0aGlzLmFubmVlX2RlYnV0ICAgICAgICAgICAgICAgID0gMTc1MC47IC8vIDE2NTAgb3UgMTc1MCA/XG4gICAgICAgIHRoaXMuZml4ZWRfZWF1ICAgICAgICAgICAgICAgICAgPSBmYWxzZTtcdFxuICAgICAgICB0aGlzLmZpeGVkX2NvbmNlbnRyYXRpb24gICAgICAgID0gZmFsc2U7XHRcdFxuICAgICAgICB0aGlzLmRlYnJhbmNoZV9iaW9sb2dpZSAgICAgICAgID0gZmFsc2U7XHRcbiAgICAgICAgdGhpcy5maXhlZF9vY2VhbiAgICAgICAgICAgICAgICA9IGZhbHNlO1x0XG4gICAgICAgIHRoaXMuZGVicmFuY2hlX29jZWFuICAgICAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5maXhlZF9hbGJlZG8gICAgICAgICAgICAgICA9IGZhbHNlO1x0XHRcbiAgICAgICAgdGhpcy5yYXBwb3J0X0gyT192YWx1ZSAgICAgICAgICA9IDEwMC47XHRcbiAgICAgICAgdGhpcy5wdWl0X2Jpb192YWx1ZSAgICAgICAgICAgICA9IHRoaXMubW9kZWxWYXJzQ29uc3RhbnRzLm1vZGVsQ29uc3RhbnRzLnB1aXRfYmlvX3Jlc2V0X3ZhbHVlO1xuICAgICAgICB0aGlzLnB1aXRfb2NlX3ZhbHVlICAgICAgICAgICAgID0gdGhpcy5tb2RlbFZhcnNDb25zdGFudHMubW9kZWxDb25zdGFudHMucHVpdF9vY2Vhbl9yZXNldF92YWx1ZTtcbiAgICAgICAgdGhpcy5hbGJlZG9fdmFsdWUgICAgICAgICAgICAgICA9IENQaHlzaWNzQ29uc3RhbnRzLmFsYmVkb18xNzUwICogMTAwO1xuICAgICAgICB0aGlzLmNvb19jb25jZW50cl92YWx1ZSAgICAgICAgID0gdGhpcy5tb2RlbFZhcnNDb25zdGFudHMubW9kZWxDb25zdGFudHMuY29vX2NvbmNlbnRyX3Jlc2V0X3ZhbHVlO1xuICAgICAgICB0aGlzLnB1aXNzYW5jZV9zb2xlaWxfdmFsdWUgICAgID0gdGhpcy5tb2RlbFZhcnNDb25zdGFudHMubW9kZWxDb25zdGFudHMucHVpc3NhbmNlX3NvbGVpbF9yZXNldF92YWx1ZTtcbiAgICAgICAgdGhpcy5kaXN0YW5jZV90c192YWx1ZSAgICAgICAgICA9IHRoaXMubW9kZWxWYXJzQ29uc3RhbnRzLm1vZGVsQ29uc3RhbnRzLmRpc3RhbmNlX3RzX3Jlc2V0X3ZhbHVlO1xuICAgICAgICB0aGlzLm9ibGlxdWl0ZV92YWx1ZSAgICAgICAgICAgID0gdGhpcy5tb2RlbFZhcnNDb25zdGFudHMubW9kZWxDb25zdGFudHMub2JsaXF1aXRlX3Jlc2V0X3ZhbHVlO1xuICAgICAgICB0aGlzLmV4Y2VudHJpY2l0ZV92YWx1ZSAgICAgICAgID0gdGhpcy5tb2RlbFZhcnNDb25zdGFudHMubW9kZWxDb25zdGFudHMuZXhjZW50cmljaXRlX3Jlc2V0X3ZhbHVlO1xuICAgICAgICB0aGlzLnByZWNlc3Npb25fdmFsdWUgICAgICAgICAgID0gdGhpcy5tb2RlbFZhcnNDb25zdGFudHMubW9kZWxDb25zdGFudHMucHJlY2Vzc2lvbl9yZXNldF92YWx1ZTtcbiAgICAgICAgdGhpcy5hbHRlcmF0aW9uX3ZhbHVlICAgICAgICAgICA9IHRoaXMubW9kZWxWYXJzQ29uc3RhbnRzLm1vZGVsQ29uc3RhbnRzLmFsdGVyYXRpb25fcmVzZXRfdmFsdWU7XG4gICAgICAgIHRoaXMuZW1pdF9hbnRocm9fY29vX3ZhbHVlICAgICAgPSB0aGlzLm1vZGVsVmFyc0NvbnN0YW50cy5tb2RlbENvbnN0YW50cy5lbWl0X2FudGhyb19jb29fcmVzZXRfdmFsdWU7XG4gICAgICAgIHRoaXMudm9sY2FuX3ZhbHVlICAgICAgICAgICAgICAgPSB0aGlzLm1vZGVsVmFyc0NvbnN0YW50cy5tb2RlbENvbnN0YW50cy52b2xjYW5fcmVzZXRfdmFsdWU7XG4gICAgICAgIHRoaXMuc3RvY2thZ2VfYmlvbG9naXF1ZV92YWx1ZSAgPSB0aGlzLm1vZGVsVmFyc0NvbnN0YW50cy5tb2RlbENvbnN0YW50cy5zdG9ja2FnZV9iaW9sb2dpcXVlX3Jlc2V0X3ZhbHVlO1xuICAgIFxuICAgICAgICBmb3IgKCBsZXQgdCA9IHRoaXMuSURfTUlOOyB0IDw9IHRoaXMuSURfTUFYOyB0KysgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnRlbXBlcmF0dXJlX2RhdGEuc2V0KCB0LCBDUGh5c2ljc0NvbnN0YW50cy50ZW1wZXJhdHVyZV8xNzUwICk7XG4gICAgICAgICAgICB0aGlzLm5pdmVhdV9tZXJfZGF0YS5zZXQoIHQsIHRoaXMubW9kZWxQaHlzaWNzQ29uc3RhbnRzLm5pdmVhdV9tZXJfMTc1MCApO1xuICAgICAgICAgICAgdGhpcy5uaXZlYXVfY2Fsb3R0ZXNfZGF0YS5zZXQoIHQsIENQaHlzaWNzQ29uc3RhbnRzLm5pdmVhdV9jYWxvdHRlc18xNzUwICk7XG4gICAgICAgICAgICB0aGlzLmNvbmNlbnRyYXRpb25zX2Nvb19kYXRhLnNldCggdCwgQ1BoeXNpY3NDb25zdGFudHMuY29uY2VudHJhdGlvbl9jb29fMTc1MCApO1xuICAgICAgICAgICAgdGhpcy5lbWlzc2lvbnNfY29vX2RhdGEuc2V0KCB0LCAwLiApO1xuICAgICAgICAgICAgdGhpcy5hbGJlZG9fZGF0YS5zZXQoIHQsIENQaHlzaWNzQ29uc3RhbnRzLmFsYmVkb18xNzUwICogMTAwICk7XG5cbiAgICAgICAgICAgIGlmICggdCA+IDAgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMudGVtcGVyYXR1cmVfZGF0YS5zZXRfcGFzdCggdCwgQ1BoeXNpY3NDb25zdGFudHMudGVtcGVyYXR1cmVfMTc1MCApO1xuICAgICAgICAgICAgfSAvLyBlbyBpZlxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMudGVtcGVyYXR1cmVfZGF0YS5zZXRfcGFzdCggdCwgMCApO1xuICAgICAgICAgICAgfSAvLyBlbyBlbHNlXG4gICAgICAgIH0gLy9lbyBmb3JcbiAgICAgICAgXG4gICAgICAgIHJldHVybjtcbiAgICB9IC8vIGVvIGNyZWF0ZV8xNzUwX3N0YXRlIG1ldGhvZFxuICAgIFxuXG4gICAgcHVibGljIGNyZWF0ZV9hY3R1YWxfc3RhdGUoKSBcbiAgICB7XG4gICAgICAgIENMb2dnZXIubG9nKCAnRW50ZXIgY3JlYXRlX2FjdHVhbF9zdGF0ZSBtZXRob2QnICk7XG5cbiAgICAgICAgLy8gU2ltdWxhdGlvblZhbHVlcyBzKFwibGUgbW9uZGUgZW4gMjAyMlwiLElEX01JTixJRF9NQVgsVEVNUFNfRUxFTSk7IC8vIFRPRE8gQUxhaW4gOiBJbml0aWFsaXNlIGxlcyB0YWJsZWF1eC5cbiAgICAgICAgdGhpcy5pbml0X3NpbXVsYXRpb25fYXJyYXlzKCAnbGUgbW9uZGUgZW4gMjAyMicsIHRoaXMuSURfTUlOLCB0aGlzLklEX01BWCwgdGhpcy5URU1QU19FTEVNICk7XG5cbiAgICAgICAgdGhpcy5hbm5lZV9kZWJ1dCAgICAgICAgICAgICAgICA9IDIwMjIuOyAvLyBDUjogbWlzZSDDoCBqb3VyIG1hcnMgMjAyMlxuICAgICAgICB0aGlzLmZpeGVkX2VhdSAgICAgICAgICAgICAgICAgID0gZmFsc2U7XHRcbiAgICAgICAgdGhpcy5maXhlZF9jb25jZW50cmF0aW9uICAgICAgICA9IGZhbHNlO1x0XHRcbiAgICAgICAgdGhpcy5kZWJyYW5jaGVfYmlvbG9naWUgICAgICAgICA9IGZhbHNlO1x0XG4gICAgICAgIHRoaXMuZml4ZWRfb2NlYW4gICAgICAgICAgICAgICAgPSBmYWxzZTtcdFxuICAgICAgICB0aGlzLmRlYnJhbmNoZV9vY2VhbiAgICAgICAgICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZml4ZWRfYWxiZWRvICAgICAgICAgICAgICAgPSBmYWxzZTtcdFx0XG4gICAgICAgIHRoaXMucmFwcG9ydF9IMk9fdmFsdWUgICAgICAgICAgPSB0aGlzLm1vZGVsVmFyc0NvbnN0YW50cy5tb2RlbENvbnN0YW50cy5yYXBwb3J0X0gyT19hY3R1ZWw7XHRcbiAgICAgICAgdGhpcy5wdWl0X2Jpb192YWx1ZSAgICAgICAgICAgICA9IHRoaXMubW9kZWxWYXJzQ29uc3RhbnRzLm1vZGVsQ29uc3RhbnRzLnB1aXRfYmlvX3Jlc2V0X3ZhbHVlO1xuICAgICAgICB0aGlzLnB1aXRfb2NlX3ZhbHVlICAgICAgICAgICAgID0gdGhpcy5tb2RlbFZhcnNDb25zdGFudHMubW9kZWxDb25zdGFudHMucHVpdF9vY2Vhbl9yZXNldF92YWx1ZTtcbiAgICAgICAgdGhpcy5hbGJlZG9fdmFsdWUgICAgICAgICAgICAgICA9IHRoaXMubW9kZWxWYXJzQ29uc3RhbnRzLm1vZGVsQ29uc3RhbnRzLmFsYmVkb19yZXNldF92YWx1ZTtcbiAgICAgICAgdGhpcy5jb29fY29uY2VudHJfdmFsdWUgICAgICAgICA9IENQaHlzaWNzQ29uc3RhbnRzLmNvbmNlbnRyYXRpb25fY29vX2FjdHVlbDtcbiAgICAgICAgdGhpcy5wdWlzc2FuY2Vfc29sZWlsX3ZhbHVlICAgICA9IHRoaXMubW9kZWxWYXJzQ29uc3RhbnRzLm1vZGVsQ29uc3RhbnRzLnB1aXNzYW5jZV9zb2xlaWxfcmVzZXRfdmFsdWU7XG4gICAgICAgIHRoaXMuZGlzdGFuY2VfdHNfdmFsdWUgICAgICAgICAgPSB0aGlzLm1vZGVsVmFyc0NvbnN0YW50cy5tb2RlbENvbnN0YW50cy5kaXN0YW5jZV90c19yZXNldF92YWx1ZTtcbiAgICAgICAgdGhpcy5vYmxpcXVpdGVfdmFsdWUgICAgICAgICAgICA9IHRoaXMubW9kZWxWYXJzQ29uc3RhbnRzLm1vZGVsQ29uc3RhbnRzLm9ibGlxdWl0ZV9yZXNldF92YWx1ZTtcbiAgICAgICAgdGhpcy5leGNlbnRyaWNpdGVfdmFsdWUgICAgICAgICA9IHRoaXMubW9kZWxWYXJzQ29uc3RhbnRzLm1vZGVsQ29uc3RhbnRzLmV4Y2VudHJpY2l0ZV9yZXNldF92YWx1ZTtcbiAgICAgICAgdGhpcy5wcmVjZXNzaW9uX3ZhbHVlICAgICAgICAgICA9IHRoaXMubW9kZWxWYXJzQ29uc3RhbnRzLm1vZGVsQ29uc3RhbnRzLnByZWNlc3Npb25fcmVzZXRfdmFsdWU7XG4gICAgICAgIHRoaXMuYWx0ZXJhdGlvbl92YWx1ZSAgICAgICAgICAgPSB0aGlzLm1vZGVsVmFyc0NvbnN0YW50cy5tb2RlbENvbnN0YW50cy5hbHRlcmF0aW9uX3Jlc2V0X3ZhbHVlO1xuICAgICAgICB0aGlzLmVtaXRfYW50aHJvX2Nvb192YWx1ZSAgICAgID0gQ1BoeXNpY3NDb25zdGFudHMuZW1pdF9hbnRocm9fY29vX2FjdDtcbiAgICAgICAgdGhpcy52b2xjYW5fdmFsdWUgICAgICAgICAgICAgICA9IHRoaXMubW9kZWxWYXJzQ29uc3RhbnRzLm1vZGVsQ29uc3RhbnRzLnZvbGNhbl9yZXNldF92YWx1ZTtcbiAgICAgICAgdGhpcy5zdG9ja2FnZV9iaW9sb2dpcXVlX3ZhbHVlICA9IHRoaXMubW9kZWxWYXJzQ29uc3RhbnRzLm1vZGVsQ29uc3RhbnRzLnN0b2NrYWdlX2Jpb2xvZ2lxdWVfcmVzZXRfdmFsdWU7XG5cbiAgICAgICAgZm9yICggbGV0IHQgPSB0aGlzLklEX01JTjsgdCA8PSB0aGlzLklEX01BWDsgdCsrIClcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gbW9kaWYgQ1I6IDMxIG9jdCAyMDE5OiBsZXMgdGVtcMOpcmF0dXJlcyBwb3NpdGl2ZXMgb3UgbnVsbGVzIGRvaXZlbnQgw6p0cmUgZml4w6llcyDDoCB0ZW1wZXJhdHVyZV9hY3R1ZWxsZVxuICAgICAgICAgICAgLy8gdGhpcy50ZW1wZXJhdHVyZV9kYXRhLnNldCggdCwgQ1BoeXNpY3NDb25zdGFudHMudGVtcGVyYXR1cmVfYWN0dWVsbGUgKyAoIHRoaXMuVEVNUFNfRUxFTSAqICggdCAtIHRoaXMuSURfTUFYICkgKiBDUGh5c2ljc0NvbnN0YW50cy5kZWx0YVRfbGFzdF9jZW50dXJ5ICkgLyB0aGlzLklOVEVSTl9FQ0hFQU5DRSApO1xuXHQgICAgdGhpcy50ZW1wZXJhdHVyZV9kYXRhLnNldCggdCwgQ1BoeXNpY3NDb25zdGFudHMudGVtcGVyYXR1cmVfYWN0dWVsbGUpO1xuICAgICAgICAgICAgdGhpcy5uaXZlYXVfbWVyX2RhdGEuc2V0KCB0LCAwLiApO1xuICAgICAgICAgICAgdGhpcy5uaXZlYXVfY2Fsb3R0ZXNfZGF0YS5zZXQoIHQsIHRoaXMubW9kZWxQaHlzaWNzQ29uc3RhbnRzLm5pdmVhdV9jYWxvdHRlc19hY3R1ZWwgKTtcbiAgICAgICAgICAgIHRoaXMuY29uY2VudHJhdGlvbnNfY29vX2RhdGEuc2V0KCB0LCBDUGh5c2ljc0NvbnN0YW50cy5jb25jZW50cmF0aW9uX2Nvb19hY3R1ZWwgKTtcbiAgICAgICAgICAgIHRoaXMuZW1pc3Npb25zX2Nvb19kYXRhLnNldCggdCwgQ1BoeXNpY3NDb25zdGFudHMuZW1pdF9hbnRocm9fY29vX2FjdCAqICggMSAtIENQaHlzaWNzQ29uc3RhbnRzLnB1aXRfYmlvX2FjdCAtIENQaHlzaWNzQ29uc3RhbnRzLnB1aXRfb2NlYW5fYWN0ICkgKTtcbiAgICAgICAgICAgIHRoaXMuYWxiZWRvX2RhdGEuc2V0KCB0LCB0aGlzLm1vZGVsUGh5c2ljc0NvbnN0YW50cy5hbGJlZG9fYWN0dWVsICogMTAwICk7XG5cbiAgICAgICAgICAgIGlmICggdCA+IDAgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMudGVtcGVyYXR1cmVfZGF0YS5zZXRfcGFzdCggdCwgQ1BoeXNpY3NDb25zdGFudHMudGVtcGVyYXR1cmVfYWN0dWVsbGUgKyAoIHRoaXMuVEVNUFNfRUxFTSAqICggIC0gdCAtIHRoaXMuSURfTUFYICkgKiBDUGh5c2ljc0NvbnN0YW50cy5kZWx0YVRfbGFzdF9jZW50dXJ5ICkgLyB0aGlzLklOVEVSTl9FQ0hFQU5DRSApO1xuICAgICAgICAgICAgICAgIHRoaXMudGVtcGVyYXR1cmVfZGF0YS5zZXRfcGFzdCggdCwgQ1BoeXNpY3NDb25zdGFudHMudGVtcGVyYXR1cmVfYWN0dWVsbGUgLSAoIHRoaXMuVEVNUFNfRUxFTSAvIHRoaXMuSU5URVJOX0VDSEVBTkNFICogdCAqIHRoaXMubW9kZWxQaHlzaWNzQ29uc3RhbnRzLmRlbHRhVF9sYXN0X2NlbnR1cnkgKSApO1xuXHRcdC8vIG1vZGlmIENhbWlsbGUgMjggYXZyaWwgMjAyNDogZGVsdGFUX2xhc3RfY2VudHVyeSBlc3QgbWFpbnRlbmFudCB1biB0aGlzLm1vZGVsUGh5c2ljc0NvbnN0YW50c1xuICAgICAgICAgICAgfSAvLyBlbyBpZlxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMudGVtcGVyYXR1cmVfZGF0YS5zZXRfcGFzdCggdCwgMCApO1xuICAgICAgICAgICAgfSAvLyBlbyBlbHNlXG4gICAgICAgIH0gLy9lbyBmb3JcblxuICAgICAgICByZXR1cm47XG4gICAgfSAvLyBlbyBjcmVhdGVfYWN0dWFsX3N0YXRlIG1ldGhvZFxufSAvLyBlbyBDU2ltdWxhdGlvblZhbHVlcyBjbGFzc1xuIl19