Grepolis tripjes detector

Laat op het profiel van een speler of op het eiland scherm zien welke steden wel/geen trip hebben

目前为 2025-01-28 提交的版本。查看 最新版本

// ==UserScript==
// @name         Grepolis tripjes detector
// @version      2025-01-28
// @description  Laat op het profiel van een speler of op het eiland scherm zien welke steden wel/geen trip hebben
// @author       archdukeDaan
// @match        https://*.grepolis.com/*
// @exclude      https://*.grepolis.com/start
// @license      MIT
// @namespace    https://tampermonkey.net/
// @grant        GM_setValue
// @grant        GM_getValue
// @require      https://code.jquery.com/jquery-3.6.0.min.js
// ==/UserScript==

(function() {
    'use strict';

    // wacht tot document is geladen
    $(document).ready(function () {
        setTimeout(console.log("TripEnhancer script"), 5000);
        // maak een wrapper function over de createTownDiv function
        // voordat een stad wordt gemaakt op de kaart, run eerst mijn functie en dan pas de grepo functie
        var wrapper = function(originalFunc) {
            return function() {
                var wrapper = originalFunc.apply(this, arguments);
                return generateTripjesOpKaart(wrapper, arguments);
            };
        };
        MapTiles.createTownDiv = wrapper(MapTiles.createTownDiv);

        // maak de knop om naar het menu te gaan
        maakMenuKnop()

        // timer om te checken of de knop moet worden geplaatst
        // er kan maar maximaal 1 profiel tegelijk open staan
        setTimeout(function checkProfielWindowOpen() {
            if (document.getElementById("player_towns") != null) {
                if (document.getElementById("tripknopProfiel") == null){
                    addTripKnop('profiel')
                }
            }
            setTimeout(checkProfielWindowOpen, 500);
        }, 500);

        // timer om te checken of de knop moet worden geplaatst
        // er kunnen meerdere eilanden vensters tegelijk open staan
        setTimeout(function checkEilandWindowOpen() {
            if (document.getElementsByClassName("island_info_wrapper") != null) {
                // verkrijg alle openstaande eiland vensters
                var vensters = getAllOpenEilandVensters()
                for(let i=0;i<vensters.length;i++){
                    var venster = vensters[i]
                    // check of dit eiland venster al een knop heeft
                    if (venster.querySelector("#tripknopEiland") == null){
                        addTripKnop('eiland',venster)
                    }
                }
            }
            setTimeout(checkEilandWindowOpen, 500);
        }, 500);
    });

    // verkrijg de voorkeuren
    function laadSettings(){
        var auto_trip_kaart = GM_getValue('archduke_menu_auto_trip_kaart')
        if (auto_trip_kaart == null){
            auto_trip_kaart = false
        }
        var auto_trip_eiland = GM_getValue('archduke_menu_auto_trip_eiland')
        if (auto_trip_eiland == null){
            auto_trip_eiland = false
        }
        var auto_trip_profiel = GM_getValue('archduke_menu_auto_trip_profiel')
        if (auto_trip_profiel == null){
            auto_trip_profiel = false
        }
        var trip_allianties = GM_getValue('archduke_menu_trip_allianties')
        if (trip_allianties == null){
            trip_allianties = []
        }
        var trip_eigen_stad = GM_getValue('archduke_menu_trip_eigen_stad')
        if (trip_eigen_stad == null){
            trip_eigen_stad = false
        }
        var settings = {
            'auto_trip_kaart': auto_trip_kaart,
            'auto_trip_eiland': auto_trip_eiland,
            'auto_trip_profiel': auto_trip_profiel,
            "trip_allianties" : trip_allianties,
            "trip_eigen_stad" : trip_eigen_stad,
        }
        return settings
        
    }

    function addTripKnop(knop_type,venster) {
        var button = document.createElement('span');
        button.textContent = 'Tripjes';
        button.style.zIndex = 1000;
        button.style.width = '50px'
        button.style.padding = '4px';
        button.style.marginTop = '4px'
        button.style.marginBottom = '4px'
        button.style.color = 'white';
        button.style.border = '1px solid black';
        button.style.borderRadius = '5px';
        button.style.cursor = 'pointer';
        button.style.marginLeft = '15px';

        var settings = laadSettings()

        if (knop_type == 'profiel'){
            button.addEventListener('click', function(){
                generateTripjesOpProfiel();
            }, false);
            button.setAttribute('id', 'tripknopProfiel');

            // voeg de knop als tweede element toe aan de game_header van de stedenlijst op het profiel
            var profiel = document.getElementById("player_towns")
            var element = profiel.children[0].querySelector('.game_header');
            element.insertBefore(button,element.children[0]);

            var bool = settings.auto_trip_profiel
            if (bool == true){
                button.click()
            }

        } else if (knop_type == 'eiland'){
            button.addEventListener('click', function(){
                generateTripjesOpEiland(venster);
            }, false);
            button.setAttribute('id', `tripknopEiland`);
            button.style.backgroundColor = 'blue';

            var eiland_controls = venster.querySelector("#island_towns_controls")
            eiland_controls.appendChild(button)
            var bool = settings.auto_trip_eiland
            if (bool == true){
                button.click()
            }
        }
        console.log("Trip knop toegevoegd!")
    }

    function getHuidigeSpeler(){
        var playerObj = MM.getModels().Player
        var player = Object.values(playerObj)[0].attributes;
        var huidigeSpeler = player.name
        return huidigeSpeler
    }

    function getTripLijst(){
        // verkrijg alle tripjes en stop ze in een lijst
        const steden_met_troepen_buiten = ITowns.all_supporting_units.fragments

        var triplijst = []

        Object.values(steden_met_troepen_buiten).forEach((stad) => {
            var tripjes = stad.models
            tripjes.forEach((trip) => {
                var trip_info = trip.attributes

                var stad_naam = trip_info.current_town_name
                var stad_speler = trip_info.current_town_player_name
                var stad_id = trip_info.current_town_id
                //var trip_stad_herkomst = trip_info.home_town_name

                var row = {"stad_naam":stad_naam,"stad_speler":stad_speler,"stad_id":stad_id}
                triplijst.push( row )
            });
        });
        //console.log(triplijst)
        return triplijst
    }

    function getProfileName(){
        // verkrijg speler naam van het huidige profiel dat open staat
        var profiel = document.getElementById("player_info").children
        var naam = ""
        for(let i=0;i<profiel.length;i++){
            var el = profiel[i]
            if (el.tagName == "H3"){
                naam = el.innerHTML
                break
            }
        }
        return naam
    }

    function getStedenLijstOpProfiel(){
        // verkrijg stedenlijst dom element van een speler zn profiel
        var profiel_steden = document.getElementById("player_towns").children[0].children
        var steden = false
        for(let i=0;i<profiel_steden.length;i++){
            var el2 = profiel_steden[i]
            if (el2.tagName == "UL"){
                steden = el2.children
                break
            }
        }
        //console.log(steden)
        return steden
    }

    function getStedenLijstOpEiland(venster){
        // verkrijg stedenlijst dom element van een eiland
        var eiland_steden = venster.querySelector("#island_info_towns_left_sorted_by_name").children
        //console.log(steden)
        return eiland_steden
    }

    function getAlliantieFromLink(stad_obj){
        // verkrijg de alliantie van de eigenaar van een stad vanuit de GP link DOM element
        // als speler geen alliantie heeft, return -1
        if (stad_obj.querySelector('.gp_alliance_link') != null){
            var link_as_str = stad_obj.querySelector('.gp_alliance_link').outerHTML;
            var alliantie = link_as_str.split("Layout.allianceProfile.open")[1].split(",")[1].split(")")[0]
            return parseInt(alliantie)
        } else {
            return -1
        }
    }

    function getAllOpenEilandVensters(){
        var vensters = document.getElementsByClassName("island_info_wrapper")
        return vensters
    }

    function generateTripjesOpEiland(venster){
        // indien van toepassing, verwijder de oude tags op het eiland informatie scherm
        venster.querySelector("#island_info_towns_left_sorted_by_name").querySelectorAll('.tripTag').forEach(e => e.remove());

        // verkrijg stedenlijst op het eiland
        var steden = getStedenLijstOpEiland(venster)

        // verkrijg de triplijst
        var triplijst = getTripLijst()

        // loop over de steden en voeg tag 'geen trip' toe als de stadsnaam niet in triplijst staat
        for (let k=0; k < steden.length; k++){
            var stad_obj = steden[k]
            var stad_naam = stad_obj.querySelector(".gp_town_link").innerHTML;
            var stad_eigenaar_dom = stad_obj.querySelector(".gp_player_link")
            var stad_eigenaar = "Spookstad"
            if (stad_eigenaar_dom != null){
                stad_eigenaar = stad_eigenaar_dom.innerHTML;
            }
            var stad_alliantie = getAlliantieFromLink(stad_obj);

            // plaats geen tag als de stad van de huidige speler is
            // plaats geen tag als de alliantie van de eigenaar van de stad niet in de alliantie lijst staat
            var settings = laadSettings()
            var allianties = settings.trip_allianties
            if ( allianties.includes(stad_alliantie) == true ){
                var eigen_stad_bool = settings.eigen_stad
                if (eigen_stad_bool == false){
                    if (stad_eigenaar == getHuidigeSpeler()){
                        return
                    }
                }
                
                var tag = document.createElement('div');
                tag.style.zIndex = 1000;
                tag.style.cursor = 'pointer';
                tag.setAttribute('class','tripTag')
                tag.style.fontWeight = 'bold';
                tag.style.marginLeft = '10px';
                // kijk of er een trip in de stad ligt
                var j = triplijst.findIndex( e => (e.stad_naam == stad_naam) && (e.stad_speler == stad_eigenaar) )
                if (j>-1){
                    tag.textContent = "Wel trip";
                    tag.style.color = 'green'
                } else {
                    tag.textContent = "Geen trip";
                    tag.style.color = 'red'
                }
                // voeg de tag toe aan de DOM
                steden[k].appendChild(tag);
            }
        }
    }

    function generateTripjesOpProfiel(){
        // indien van toepassing, verwijder de oude tags op het profiel
        document.getElementById("player_towns").querySelectorAll('.tripTag').forEach(e => e.remove());

        // verkrijg naam op het profiel
        var naam = getProfileName()

        // verkrijg de triplijst
        var triplijst = getTripLijst()

        // verkrijg stedenlijst op het profiel
        var steden = getStedenLijstOpProfiel()

        // loop over de steden en voeg tag 'geen trip' of 'wel trip' toe
        for (let k=0; k < steden.length; k++){
            var stad = steden[k].children[1]
            var stad_naam = stad.innerHTML

            var tag = document.createElement('span');
            tag.style.zIndex = 1000;
            tag.style.cursor = 'pointer';
            tag.setAttribute('class','tripTag')
            tag.style.fontWeight = 'bold';

            // kijk of er een trip in de stad ligt
            var j = triplijst.findIndex( e => (e.stad_naam == stad_naam) & (e.stad_speler == naam) )
            if (j>-1){
                tag.textContent = "Wel trip";
                tag.style.color = 'green'
            } else {
                tag.textContent = "Geen trip";
                tag.style.color = 'red'
            }
            // voeg de tag toe aan de DOM
            steden[k].appendChild(tag)
        }

    }

    function generateTripjesOpKaart(originalFunc, args){
        var stad = args[0]
        //console.log(stad)
        // check of stad een speler heeft, dus of het geen spookstad is
        if(stad.player_id != null){
            // createTownDiv 2 keer geroepen per stad, eens voor de stad en eens voor de stad vlag
            for (let i=0;i<originalFunc.length;i++){
                // maak tag alleen op de stadsvlag ivm dubbele tags per stad
                var dom_element = originalFunc[i]
                var class_list = dom_element.classList
                //console.log(class_list)
                if (class_list.contains("flag")){
                    // verkrijg de triplijst
                    var triplijst = getTripLijst()

                    var stad_id = stad.id
                    var stad_alliantie = stad.alliance_id
                    var stad_eigenaar = stad.player_name

                    var settings = laadSettings()
                    var allianties = settings.trip_allianties
                    var eigen_stad = settings.trip_eigen_stad
                    if ((allianties.includes(stad_alliantie) == true)){
                        if(eigen_stad == false){
                            if(stad_eigenaar == getHuidigeSpeler()){
                                return originalFunc
                            }
                        }
                        // tag
                        var tag = document.createElement('div');
                        tag.style.zIndex = 2000;
                        tag.style.cursor = 'pointer';
                        tag.setAttribute('class','tripTag')
                        tag.style.fontWeight = 'bold';
                        tag.style.width = '15px';
                        tag.style.height = '15px';
                        tag.style.borderRadius = '50%'
                        tag.style.position = 'relative';
                        tag.style.top = "60%";
                        tag.style.left = "70%";
                        tag.style.border = '2px solid black'

                        // kijk of er een trip in de stad ligt
                        var j = triplijst.findIndex( e => (e.stad_id == stad_id) )
                        if (j>-1){
                            tag.style.backgroundColor = 'green'
                        } else {
                            tag.style.backgroundColor = 'red'
                        }
                        $(originalFunc[i]).append(tag);
                    }
                }
            }
        }
        return originalFunc
    }

    function maakMenuKnop(){
        var knop = document.createElement("div")
        knop.setAttribute("id","archduke_menu")
        knop.addEventListener('click', maakMenu)
        knop.style.position = 'absolute'
        knop.style.top = '3px'
        knop.style.height = '27px'
        knop.style.left = "35%"
        knop.style.width = '70px'
        knop.style.cursor = 'pointer'
        knop.style.zIndex = '2000'

        var icon = document.createElement("div")
        icon.setAttribute("class",'icon')
        icon.style.position = 'relative'
        icon.style.width = '100%'
        icon.style.height = '100%'
        icon.style.backgroundImage = `url(${getImageData()})`
        knop.appendChild(icon)

        document.body.appendChild(knop)
    }

    function maakMenu(){
        var menuTitel = 'Archduke Menu'
        var titel_dom = null
        // check of er al een menu window open staat
        var find = false;
        for(let i of document.getElementsByClassName('ui-dialog-title')){
            if(i.innerHTML == menuTitel){
                find = true;
                titel_dom = i
            }
        }
        // maak nieuwe window indien nodig
        if(find == false){
            var window = Layout.wnd.Create(Layout.wnd.TYPE_DIALOG, "Archduke Menu");
            // zet window size
            window.setHeight(document.body.scrollHeight/2);
            window.setWidth('800');
            window.setContent(''); // clear window
            for(let i of document.getElementsByClassName('ui-dialog-title')){ 
                if(i.innerHTML == menuTitel){
                    titel_dom = i;
                }
            }
        } 

        // maak mini pagina om in de frame te zetten
        var frame = titel_dom.parentElement.parentElement.children[1].children[4];
        frame.innerHTML = '';

        // maak menu voor module selectie aan de linker kant
        var container_left = document.createElement("div")
        container_left.setAttribute("id","archduke_menu_left")
        container_left.setAttribute("class",'settings-menu')
        frame.appendChild(container_left)
        var ul = document.createElement("ul")

        // maak module selectors
        var el = document.createElement("b")
        el.innerHTML = 'Scripts'
        container_left.append(el)
        var el = maakModuleSelector('Trip Detector')
        ul.append(el)
        var el = maakModuleSelector('Placeholder naam')
        ul.append(el)
        var el = maakModuleSelector('Placeholder naam')
        ul.append(el)

        container_left.appendChild(ul)

        // maak instellingen voor module aan de rechter kant
        var container_right = document.createElement("div")
        container_right.setAttribute("id","archduke_menu_right")
        container_right.setAttribute("class",'settings-container')
        frame.appendChild(container_right)

        // maak module instellingen
        var el = maakTripInstellingen()
        container_right.appendChild(el)

        // check settings in de local storage
        var settings = laadSettings()
        if (settings.auto_trip_eiland){ document.getElementById("archduke_menu_auto_trip_eiland").classList.add('checked') }
        if (settings.auto_trip_kaart){ document.getElementById("archduke_menu_auto_trip_kaart").classList.add('checked') }
        if (settings.auto_trip_profiel){ document.getElementById("archduke_menu_auto_trip_profiel").classList.add('checked') }
        if (settings.trip_eigen_stad){ document.getElementById("archduke_menu_trip_eigen_stad").classList.add('checked') }
        for (let i=0; i < settings.trip_allianties.length;i++){
            var ally_id = settings.trip_allianties[i]
            addRowToMenuList(document.getElementById('archduke_menu_alliantie_list'),ally_id)
        }
    }

    function maakModuleSelector(naam){
        var el = document.createElement("li")
        el.style.marginBottom = '10px'
        var a = document.createElement('a')
        a.innerHTML = naam
        a.setAttribute("class","settings-link")
        el.appendChild(a)
        return el
    }

    function maakTripInstellingen(){
        // maak container
        var el = document.createElement("div")
        el.setAttribute('id',"archduke_menu_instellingen")

        var form = document.createElement("form")
        el.appendChild(form)


        // maak section
        var section = createSection('Voorkeuren')
        form.appendChild(section)

        // maak groep waar alle knopjes in komen
        var group = createGroup("Bepaal het gedrag van de tripjes detector door de checkboxen aan te vinken.")

        // maak alle knopjes
        var auto_weergeef_kaart = createCheckBox("Weergeef automatisch de trip tags op de kaart", 'auto_trip_kaart')
        var auto_weergeef_eiland = createCheckBox("Weergeef automatisch de trip tags op het eiland scherm",'auto_trip_eiland')
        var auto_weergeef_profiel = createCheckBox("Weergeef automatisch de trip tags op het profiel van een speler",'auto_trip_profiel')
        var auto_weergeef_eigen_stad = createCheckBox("Weergeef trip tags bij je eigen steden",'trip_eigen_stad')
        // opslaan knop
        var btn = createKnop("Opslaan",saveInstellingen)

        // voeg alles toe aan de section
        group.appendChild(auto_weergeef_kaart)
        group.appendChild(auto_weergeef_eiland)
        group.appendChild(auto_weergeef_profiel)
        group.appendChild(auto_weergeef_eigen_stad)
        group.appendChild(document.createElement("br"))
        group.appendChild(btn)
        section.append(group)

        // maak inner box
        var box = createInnerBox("Alleen voor onderstaande allianties zullen trip tags worden getoond.",'input_ally_id','Alliantie ID', 'Opslaan',"archduke_menu_alliantie_list",saveInstellingenAllianties)
        group.appendChild(box)

        return el
    }

    function createSection(sectie_naam){
        var section = document.createElement("div")
        section.setAttribute("class",'section')
        section.style.display = 'block'

        var section_titel = document.createElement("div")
        section_titel.innerHTML = sectie_naam
        section_titel.setAttribute("class",'game_header bold')
        section.appendChild(section_titel)

        return section
    }

    function createGroup(beschrijving){
        var group = document.createElement("div")
        group.setAttribute("class",'group')

        var group_text = document.createElement("p")
        group_text.innerHTML = beschrijving
        group.appendChild(group_text)

        return group
    }

    function createCheckBox(beschrijving, id){
        var el = document.createElement("div")
        el.setAttribute('class',"checkbox_new large archduke_menu_checkbox")
        el.setAttribute('id', `archduke_menu_${id}`)

        var btn = document.createElement("div")
        btn.setAttribute("class","cbx_icon")
        el.appendChild(btn)

        var text = document.createElement("div")
        text.setAttribute("class","cbx_caption")
        text.innerHTML = beschrijving
        el.appendChild(text)

        el.addEventListener('click', function(){
            this.classList.toggle('checked')
            
        })

        return el
    }

    function createKnop(text, f){
        var el = document.createElement("div")
        el.setAttribute("class",'button_new')

        var el2 = document.createElement("div")
        el2.setAttribute("class",'left')

        var el3 = document.createElement("div")
        el3.setAttribute("class",'right')

        var btn = document.createElement("div")
        btn.setAttribute("class",'caption js-caption')

        var btn_txt = document.createElement("span")
        btn_txt.innerHTML = text

        var btn_ef = document.createElement("div")
        btn_ef.setAttribute('class',"effect js-effect")

        el.appendChild(el2)
        el.appendChild(el3)
        btn.appendChild(btn_txt)
        btn.appendChild(btn_ef)
        el.appendChild(btn)

        btn.addEventListener('click', f)

        return el
    }

    function saveInstellingen(){
        var checkboxen = document.body.querySelectorAll(".archduke_menu_checkbox")
        for (let i=0;i<checkboxen.length;i++){
            var box = checkboxen[i]
            var id = box.id
            var checked = false
            if (box.classList.contains('checked')){
                checked = true
            }
            GM_setValue(id,checked)
        }
    }

    function saveInstellingenAllianties(){
        var entries = document.body.querySelectorAll(".archduke_menu_trip_alliantie")
        var allianties = []
        for (let i=0;i<entries.length;i++){
            var ally = entries[i]
            var ally_id = parseInt(ally.id.substring(24))
            allianties.push(ally_id)
        }
        GM_setValue("archduke_menu_trip_allianties",allianties)
    }

    function addRowToMenuList(parent,txt){
        var li = document.createElement("li")
        li.style.listStyleType = 'square'
        li.setAttribute("class",`archduke_menu_trip_alliantie`)
        li.setAttribute('id',`archduke_menu_alliantie_${txt}`)

        var a = document.createElement("a")
        a.innerHTML = txt
        li.appendChild(a)

        var a = document.createElement("a")
        a.setAttribute("class",'cancel')
        a.addEventListener('click', function(){
            li.remove()
            saveInstellingenAllianties()
        })
        li.appendChild(a)

        parent.appendChild(li)
    }

    function createInnerBox(box_title, input_id, label_text ,button_text, ul_list_id, f){
        var el = document.createElement("div")
        el.setAttribute("class",'game_inner_box')
        el.style.marginTop = '20px'

        var child = document.createElement('div')
        child.setAttribute('class',"game_border")
        el.appendChild(child)

        var e = document.createElement('div')
        e.setAttribute('class',"game_border_top")
        child.appendChild(e)

        var e = document.createElement('div')
        e.setAttribute('class',"game_border_bottom")
        child.appendChild(e)

        var e = document.createElement('div')
        e.setAttribute('class',"game_border_left")
        child.appendChild(e)

        var e = document.createElement('div')
        e.setAttribute('class',"game_border_right")
        child.appendChild(e)

        var e = document.createElement('div')
        e.setAttribute('class',"game_border_corner corner1")
        child.appendChild(e)

        var e = document.createElement('div')
        e.setAttribute('class',"game_border_corner corner2")
        child.appendChild(e)

        var e = document.createElement('div')
        e.setAttribute('class',"game_border_corner corner3")
        child.appendChild(e)

        var e = document.createElement('div')
        e.setAttribute('class',"game_border_corner corner4")
        child.appendChild(e)

        var title = document.createElement('div')
        title.setAttribute('class',"game_header bold")
        title.style.margin = '5px 0 5px 0'
        title.innerHTML = box_title
        child.appendChild(title)

        var list = document.createElement("div")
        var list_ul = document.createElement("ul")
        list_ul.setAttribute('id',ul_list_id)
        list_ul.setAttribute("class",'game_list')
        list_ul.style.listStyle = 'disc'
        list_ul.style.width = '490px'
        list_ul.style.margin = '5px 0px 15px 35px'
        list.appendChild(list_ul)
        child.appendChild(list)

        var list_text = document.createElement('div')
        list_text.style.float = 'left'
        child.appendChild(list_text)

        var label = document.createElement("label")
        label.setAttribute("class","bold")
        label.style.marginLeft = '5px'
        label.innerHTML = label_text+" : "
        list_text.appendChild(label)

        var span = document.createElement("span")
        span.setAttribute("class","grepo_input")
        list_text.appendChild(span)

        var span_left = document.createElement("span")
        span_left.setAttribute("class","left")
        span.appendChild(span_left)

        var span_right = document.createElement("span")
        span_right.setAttribute("class","right")
        span_left.appendChild(span_right)

        var input = document.createElement("input")
        input.setAttribute("class", 'ac_input')
        input.setAttribute("id",input_id)
        input.type = 'text'
        input.value = ''
        input.autocomplete = 'off'
        span_right.appendChild(input)

        var btn = createKnop(button_text)
        child.appendChild(btn)
        btn.addEventListener('click', function(){
            var input_txt = document.getElementById(input_id).value
            if (input_txt != ""){
                document.getElementById(input_id).value = ''
                addRowToMenuList(list_ul,input_txt)
                f()
            }
        })

        return el
    }

    function getImageData() {
        return 'data:image/png;base64,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CiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgIHhtcE1NOkRvY3VtZW50SUQ9ImdpbXA6ZG9jaWQ6Z2ltcDoxYWQ0ZTgzNi0wZDcwLTRhYjctOWYzZi0zMjUzMTBiNTcwYmQiCiAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6YWQ4YjA1NjQtMjg3MS00Y2Y5LTk1MDctMTQ4NjA5NTlhYmNmIgogICB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6YjZkMTY1N2QtMzFkNi00OTU3LTg5ZjItZjVkM2E2YmQzNzczIgogICBkYzpGb3JtYXQ9ImltYWdlL3BuZyIKICAgR0lNUDpBUEk9IjIuMCIKICAgR0lNUDpQbGF0Zm9ybT0iTGludXgiCiAgIEdJTVA6VGltZVN0YW1wPSIxNzM4MDc0MjY5MjUyNDM4IgogICBHSU1QOlZlcnNpb249IjIuMTAuMzAiCiAgIHRpZmY6T3JpZW50YXRpb249IjEiCiAgIHhtcDpDcmVhdG9yVG9vbD0iR0lNUCAyLjEwIj4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OWE2ODBkYzUtNDliNi00MDdjLThhZDItYTcyOTZmMGI0OTYxIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wIDIuMTAgKExpbnV4KSIKICAgICAgc3RFdnQ6d2hlbj0iMjAyNS0wMS0yOFQxNToyNDoyOSswMTowMCIvPgogICAgPC9yZGY6U2VxPgogICA8L3htcE1NOkhpc3Rvcnk+CiAgPC9yZGY6RGVzY3JpcHRpb24+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg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'
    }

})();