Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. ioBroker Allgemein
  4. Javascript Schedule Start-End wann ist der letzte Lauf

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    4.0k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.2k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.5k

Javascript Schedule Start-End wann ist der letzte Lauf

Geplant Angeheftet Gesperrt Verschoben ioBroker Allgemein
15 Beiträge 4 Kommentatoren 732 Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • T trojanhector

    Ich habe jetzt mal versucht, die Zeit "19:00" und "19:30" in Sekunden und auch in Millisekunden umzuwandeln und diese Werte in dem Skript aus dem Link eingetragen. Beim Speichern wird zwar kein Fehler angezeigt, das Skript wird aber auch nicht ausgeführt. Mit der funktion new date geht es natürlich. Aber da ist dann halt auch der Datumsteil dabei, was für heute okay ist, aber nicht mehr für morgen.
    Und in der schedule function des Javascript Adapters schaffe ich es nicht das Event nextInvocation abzufangen.

    HomoranH Nicht stören
    HomoranH Nicht stören
    Homoran
    Global Moderator Administrators
    schrieb am zuletzt editiert von Homoran
    #5

    @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

    aber auch nicht ausgeführt.

    Natürlich nicht!

    @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

    da ist dann halt auch der Datumsteil dabei,

    und den braucht ein Unix Timestamp!

    @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

    aber nicht mehr für morgen.

    warum nicht?

    Nimm den Timestamp des jeweiligen Tages um 00:00 und rechne

    @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

    die Zeit "19:00" und "19:30" in Sekunden und auch in Millisekunden umzuwandeln

    hinzu

    PS Solange du nicht zeigst, was du da genau tust, wird dir such niemand spezifisch helfen können

    kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

    Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

    der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

    T 1 Antwort Letzte Antwort
    0
    • OliverIOO OliverIO

      @trojanhector

      Zeige mal das was du da wie geschrieben hast.
      Das Beispiel im link zeigt was zu einem extra Node Modul, was so direkt mit iobroker Nix zu tun hat.
      Mn kann die Bibliothek zwar verwenden, muss dieses aber nochmal extra registrieren
      Welches schedule meinst du da genau?

      paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von
      #6

      @oliverio sagte: zu einem extra Node Modul, was so direkt mit iobroker Nix zu tun hat.

      Das Modul "node-schedule" ist Teil des Javascript-Adapters.

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      OliverIOO 1 Antwort Letzte Antwort
      0
      • paul53P paul53

        @oliverio sagte: zu einem extra Node Modul, was so direkt mit iobroker Nix zu tun hat.

        Das Modul "node-schedule" ist Teil des Javascript-Adapters.

        OliverIOO Offline
        OliverIOO Offline
        OliverIO
        schrieb am zuletzt editiert von OliverIO
        #7

        @paul53
        W
        Das wusste ich tatsächlich nicht, aber so wie es dort beschrieben wird kann man es im iobroker nicht verwenden.

        https://github.com/ioBroker/ioBroker.javascript/blob/dcc86d319d6e9b5a5e2f0ae6c93c9e7814df35f3/docs/en/javascript.md#time-schedule

        aber das werden wir erst sehen wenn er seinen Code zeigt.

        Meine Adapter und Widgets
        TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
        Links im Profil

        1 Antwort Letzte Antwort
        0
        • HomoranH Homoran

          @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

          aber auch nicht ausgeführt.

          Natürlich nicht!

          @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

          da ist dann halt auch der Datumsteil dabei,

          und den braucht ein Unix Timestamp!

          @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

          aber nicht mehr für morgen.

          warum nicht?

          Nimm den Timestamp des jeweiligen Tages um 00:00 und rechne

          @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

          die Zeit "19:00" und "19:30" in Sekunden und auch in Millisekunden umzuwandeln

          hinzu

          PS Solange du nicht zeigst, was du da genau tust, wird dir such niemand spezifisch helfen können

          T Offline
          T Offline
          trojanhector
          schrieb am zuletzt editiert von
          #8

          @homoran
          Hier ist soweit mein Code, angelehnt an das Beispiel aus dem Netz.

          const schedule = require('node-schedule');
          const EventEmitter = require('events');
          class Ee extends EventEmitter {}
          
          const jobStatus = new Ee();
          
          jobStatus.on('finished', () => {
              console.log('JOB FINISHED');
              job.cancel();
          
              // Preform your DB Operations here (in your case: delete job from database)
          
          });
          
          function calcSecondsFromTime(time){
              //console.log("Time: " + time);
              var array = time.split(":");
              var seconds = 0; 
              if(typeof(array[2] = "undefined")){
                  seconds = (parseInt(array[0], 10) * 60 * 60) + (parseInt(array[1], 10) * 60);        
              } else {
                  seconds = (parseInt(array[0], 10) * 60 * 60) + (parseInt(array[1], 10) * 60) + parseInt(array[2], 10); 
              }
              //console.log("Array: "+ array.length +" Seconds: " + seconds);
              //console.log(array[0] +" -- " + array[1] +" -- " + array[2] +" -- " );
              return seconds;
          } 
          
          //So funktioniert das nicht.
          const strStart = "20:10"
          const strEnd = "21:15"
          const startTime = calcSecondsFromTime(strStart);
          const endTime = calcSecondsFromTime(strEnd);
          log("StartTime: " + startTime,"info");
          log("EndTime: " + endTime, "info");
          
          /*
          //So funktioniert das.
          const startTime = new Date(Date.now() + 5000);
          const endTime = new Date(startTime.getTime() + 5000);
          */
          
          const job = schedule.scheduleJob({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function(){
          
              console.log('Time for tea!');
                      if (this.nextInvocation() === null) {
                    //here you can code whatever you need to do in the last invocation
              jobStatus.emit('finished'); // Emit your job done emitter when you are done.            
                  }
          
          });
          

          Das mit dem jeweiligen Timestamp um Mitternacht setzt immer eine Bearbeitung voraus. Mein Ziel ist es aber einmal Start und Ende als hh:mm anzugeben und dann nicht mehr.

          Wenn ich in Blockly den Wizard vom kleinen Cron Bauteil nehme, kann ich da Start und Endzeit eingeben.
          Dann kommt als JS sowas raus:
          '{"time":{"start":"08:00","end":"20:00","mode":"minutes","interval":2},"period":{"days":1}}'
          Und das habe ich mit den Werten aus den Objekten nachgebaut und es funktioniert.

          Hier ist mein Ansatz als Blockly. Den Teil mit nextInvocation ist in der function createSchedule als Block auskommentiert, da er Fehler schmeißt und den Adapter zum Neustart zwingt.

          var cronConditions, modus, conditions, rootdp, ObjectID, var_CronConditions, dp, var_Raum, schedule1;
          
          // Beschreibe diese Funktion …
          async function getSchedule() {
              const list = getSchedules(false);
              list.forEach(schedule => log(JSON.stringify(schedule)));
          }
          
          // Beschreibe diese Funktion …
          async function createSchedule(cronConditions) {
              let testSched = null;
              const EventEmitter = require('events');
              class Ee extends EventEmitter {}
              
              const jobStatus = new Ee();
              //log("cronConditions: " + cronConditions,"info");
              
              jobStatus.on('finished', () => {
                  console.log('JOB FINISHED');
                  job.cancel();
                   // Preform your DB Operations here (in your case: delete job from database)
              
              });
                 
              (() => { if (testSched) { clearSchedule(testSched); testSched = null; }})();
              //log("TestSchedCond: " + cronConditions,"warn");
                console.info('Hier wird der TESTScheduler gesetzt');
                (() => { if (testSched) { clearSchedule(testSched); testSched = null; }})();
              
                testSched = schedule((await buildCronRule('time', cronConditions)), function() {
                  console.info('Hier läuft der TESTTrigger');
                  /*
                  if (this.nextInvocation() === null) {
                          //here you can code whatever you need to do in the last invocation
                      jobStatus.emit('finished'); // Emit your job done emitter when you are done.            
                          }
                          */
                });
               
              
          
          }
          
          // Beschreibe diese Funktion …
          async function buildCronRule(modus, conditions) {
              let result = "";
              let resultStart = "";
              let ovalPeriod = "";
              
              conditions.forEach(function (line,index, array) {
              
                  /*
                      '{"time":{"start":"08:00","end":"20:00","mode":"minutes","interval":2},"period":{"days":1}}'
                  */
                  let okey = Object.keys(line);
                  let oval = line[okey];
                  okey = okey.toString().replace(/\s+/g, '');
                 
                  //log(okey,"info");
                      if(okey == "period"){
                          okey = stringQuote({strVariable: okey});
                          //log("okey is: ","info");
                          ovalPeriod = ovalPeriod.concat(okey,":", oval);
                      } else if(okey != "period") {
                      okey = stringQuote({strVariable: okey});    
                      if(typeof oval == "string"){
                          oval = stringQuote({strVariable: oval});
                      }
                      //log(okey,"warn");
                      //log("Val: " + oval + " | typeof: "+ typeof oval,"info");
                      if(index === array.length -1){
                      result =result.concat(okey,":", oval); 
                      } else {
                      result =result.concat(okey,":", oval,",");        
                      }
              
                      }
              
              
              
              });
              
              result = stringQuote({strVariable: result,strQuote: "{}", boolSplitQuote: true});
              //log(ovalPeriod,"warn");
              
              switch(modus){
                  case "time":
                      resultStart = "time";
              
                  default:
                      resultStart = "time";
              }
              resultStart = stringQuote({strVariable: resultStart});
              resultStart = "".concat(resultStart,":") ;
              
              
              result = "".concat(resultStart, result,",", ovalPeriod);
              
              result = stringQuote({strVariable:result,strQuote:"{}",boolSplitQuote: true }) ;
              //log(result,"warn");
              
              
              return result;
          }
          
          // Beschreibe diese Funktion …
          async function getCronConditions(rootdp) {
              let result = [];
              log("getCronConds","warn");
              const dps = $(rootdp).toArray();
              log(dps);
              dps.forEach((id) => {
                  const dpval = getState(id).val;
                  const dp = splittVariable(id,"last",".");
                  let obj = {};
                  obj[dp] = dpval;
                  result.push(obj);
              });
                  //log(result,"warn");
              return result;
          }
          
          // Beschreibe diese Funktion …
          async function gl_leseRaum(ObjectID) {
              let room = leseRaum(ObjectID);
              return room;
          }
          
          // Beschreibe diese Funktion …
          async function runTest(dp) {
            console.info('Hier wird der Scheduler gesetzt');
            (() => { if (schedule1) { clearSchedule(schedule1); schedule1 = null; }})();
            schedule1 = schedule((await buildCronRule('time', var_CronConditions)), async () => {
              console.info('Hier läuft der Trigger');
            });
            await getSchedule();
          }
          
          
          var_CronConditions = await getCronConditions('0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*');
          console.info((await buildCronRule('time', var_CronConditions)));
          console.info(var_CronConditions);
          await createSchedule(var_CronConditions);
          await getSchedule();
          on({ id: [].concat(Array.prototype.slice.apply($('state[state.id=0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*]'))), change: 'any' }, async (obj) => {
            let value = obj.state.val;
            let oldValue = obj.oldState.val;
            var_CronConditions = await getCronConditions('0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*');
            await runTest(var_CronConditions);
          });
          
          //JTNDeG1sJTIweG1sbnMlM0QlMjJodHRwcyUzQSUyRiUyRmRldmVsb3BlcnMuZ29vZ2xlLmNvbSUyRmJsb2NrbHklMkZ4bWwlMjIlM0UlM0N2YXJpYWJsZXMlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyYyU1QiUzQVd3aiU3QnNpd3JOJTJGRiU1RSglNjBoTHclMjIlM0Vjcm9uQ29uZGl0aW9ucyUzQyUyRnZhcmlhYmxlJTNFJTNDdmFyaWFibGUlMjBpZCUzRCUyMlVRaCUyNVMhJTVERyU3Qig4UUU3YW9SRkNvJTIyJTNFbW9kdXMlM0MlMkZ2YXJpYWJsZSUzRSUzQ3ZhcmlhYmxlJTIwaWQlM0QlMjJtUnhrcSklNUQxMUclMkYqVlglNDBxdkxkRCUyMiUzRWNvbmRpdGlvbnMlM0MlMkZ2YXJpYWJsZSUzRSUzQ3ZhcmlhYmxlJTIwaWQlM0QlMjJvNk51LUZjQnZEMyUyNHIlMkYlN0QuanElNjAqJTIyJTNFcm9vdGRwJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyTSU2MGZyOS1hRyUzQVMlMkNLcSh4JTVFYTkoLiUyMiUzRU9iamVjdElEJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyNVElMkNXQkYlNUJtJTIzJTJGSCUyQ2tPIXglN0M4NCU1RCUyMiUzRWRwJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyQSUyNHpKJTNELm9hLkslN0MlMkM4MCUzRFclMjRTJTQwRyUyMiUzRXZhcl9SYXVtJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMHR5cGUlM0QlMjJjcm9uJTIyJTIwaWQlM0QlMjJzY2hlZHVsZTElMjIlM0VzY2hlZHVsZTElM0MlMkZ2YXJpYWJsZSUzRSUzQyUyRnZhcmlhYmxlcyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMkZiKE9oV3BGJTdEbmMlM0ZHZDB0ODIlMjQpJTIyJTIweCUzRCUyMjYzJTIyJTIweSUzRCUyMjM4JTIyJTNFJTNDbXV0YXRpb24lMjBzdGF0ZW1lbnRzJTNEJTIyZmFsc2UlMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VnZXRTY2hlZHVsZSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU0NSSVBUJTIyJTNFWTI5dWMzUWdiR2x6ZENBOUlHZGxkRk5qYUdWa2RXeGxjeWhtWVd4elpTazdEUXBzYVhOMExtWnZja1ZoWTJnb2MyTm9aV1IxYkdVZ1BUNGdiRzluS0VwVFQwNHVjM1J5YVc1bmFXWjVLSE5qYUdWa2RXeGxLU2twT3clM0QlM0QlM0MlMkZmaWVsZCUzRSUzQ2NvbW1lbnQlMjBwaW5uZWQlM0QlMjJmYWxzZSUyMiUyMGglM0QlMjI4MCUyMiUyMHclM0QlMjIxNjAlMjIlM0VCZXNjaHJlaWJlJTIwZGllc2UlMjBGdW5rdGlvbiUyMCVFMiU4MCVBNiUzQyUyRmNvbW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMnIlNUV0KWQhLlQlNURtJTJCR1hoMCUyNTlYUUklMjIlMjB4JTNEJTIyNjMlMjIlMjB5JTNEJTIyNjMlMjIlM0UlM0NtdXRhdGlvbiUyMHN0YXRlbWVudHMlM0QlMjJmYWxzZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjcm9uQ29uZGl0aW9ucyUyMiUyMHZhcmlkJTNEJTIyYyU1QiUzQVd3aiU3QnNpd3JOJTJGRiU1RSglNjBoTHclMjIlM0UlM0MlMkZhcmclM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VjcmVhdGVTY2hlZHVsZSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU0NSSVBUJTIyJTNFYkdWMElIUmxjM1JUWTJobFpDQTlJRzUxYkd3N0RRcGpiMjV6ZENCRmRtVnVkRVZ0YVhSMFpYSWdQU0J5WlhGMWFYSmxLQ2RsZG1WdWRITW5LVHNOQ21Oc1lYTnpJRVZsSUdWNGRHVnVaSE1nUlhabGJuUkZiV2wwZEdWeUlIdDlEUW9OQ21OdmJuTjBJR3B2WWxOMFlYUjFjeUE5SUc1bGR5QkZaU2dwT3cwS0x5OXNiMmNvSW1OeWIyNURiMjVrYVhScGIyNXpPaUFpSUNzZ1kzSnZia052Ym1ScGRHbHZibk1zSW1sdVptOGlLVHNOQ2cwS2FtOWlVM1JoZEhWekxtOXVLQ2RtYVc1cGMyaGxaQ2NzSUNncElEMCUyQklIc05DaUFnSUNCamIyNXpiMnhsTG14dlp5Z25TazlDSUVaSlRrbFRTRVZFSnlrN0RRb2dJQ0FnYW05aUxtTmhibU5sYkNncE93MEtJQ0FnSUNBdkx5QlFjbVZtYjNKdElIbHZkWElnUkVJZ1QzQmxjbUYwYVc5dWN5Qm9aWEpsSUNocGJpQjViM1Z5SUdOaGMyVTZJR1JsYkdWMFpTQnFiMklnWm5KdmJTQmtZWFJoWW1GelpTa05DZzBLZlNrN0RRb2dJQ0FOQ2lnb0tTQTlQaUI3SUdsbUlDaDBaWE4wVTJOb1pXUXBJSHNnWTJ4bFlYSlRZMmhsWkhWc1pTaDBaWE4wVTJOb1pXUXBPeUIwWlhOMFUyTm9aV1FnUFNCdWRXeHNPeUI5ZlNrb0tUc05DaTh2Ykc5bktDSlVaWE4wVTJOb1pXUkRiMjVrT2lBaUlDc2dZM0p2YmtOdmJtUnBkR2x2Ym5Nc0luZGhjbTRpS1RzTkNpQWdZMjl1YzI5c1pTNXBibVp2S0NkSWFXVnlJSGRwY21RZ1pHVnlJRlJGVTFSVFkyaGxaSFZzWlhJZ1oyVnpaWFI2ZENjcE93MEtJQ0FvS0NrZ1BUNGdleUJwWmlBb2RHVnpkRk5qYUdWa0tTQjdJR05zWldGeVUyTm9aV1IxYkdVb2RHVnpkRk5qYUdWa0tUc2dkR1Z6ZEZOamFHVmtJRDBnYm5Wc2JEc2dmWDBwS0NrN0RRb05DaUFnZEdWemRGTmphR1ZrSUQwZ2MyTm9aV1IxYkdVb0tHRjNZV2wwSUdKMWFXeGtRM0p2YmxKMWJHVW9KM1JwYldVbkxDQmpjbTl1UTI5dVpHbDBhVzl1Y3lrcExDQm1kVzVqZEdsdmJpZ3BJSHNOQ2lBZ0lDQmpiMjV6YjJ4bExtbHVabThvSjBocFpYSWdiTU9rZFdaMElHUmxjaUJVUlZOVVZISnBaMmRsY2ljcE93MEtJQ0FnSUM4cURRb2dJQ0FnYVdZZ0tIUm9hWE11Ym1WNGRFbHVkbTlqWVhScGIyNG9LU0E5UFQwZ2JuVnNiQ2tnZXcwS0lDQWdJQ0FnSUNBZ0lDQWdMeTlvWlhKbElIbHZkU0JqWVc0Z1kyOWtaU0IzYUdGMFpYWmxjaUI1YjNVZ2JtVmxaQ0IwYnlCa2J5QnBiaUIwYUdVZ2JHRnpkQ0JwYm5adlkyRjBhVzl1RFFvZ0lDQWdJQ0FnSUdwdllsTjBZWFIxY3k1bGJXbDBLQ2RtYVc1cGMyaGxaQ2NwT3lBdkx5QkZiV2wwSUhsdmRYSWdhbTlpSUdSdmJtVWdaVzFwZEhSbGNpQjNhR1Z1SUhsdmRTQmhjbVVnWkc5dVpTNGdJQ0FnSUNBZ0lDQWdJQ0FOQ2lBZ0lDQWdJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdJQ0FnSUNvdkRRb2dJSDBwT3cwS0lBMEtEUW8lM0QlM0MlMkZmaWVsZCUzRSUzQ2NvbW1lbnQlMjBwaW5uZWQlM0QlMjJmYWxzZSUyMiUyMGglM0QlMjI4MCUyMiUyMHclM0QlMjIxNjAlMjIlM0VCZXNjaHJlaWJlJTIwZGllc2UlMjBGdW5rdGlvbiUyMCVFMiU4MCVBNiUzQyUyRmNvbW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tcmV0dXJuJTIyJTIwaWQlM0QlMjJzJTVFJTJDZkhEJTNBZEMlMjRkb2VoJTQwRSUyRjNhMSUyMiUyMHglM0QlMjI2MyUyMiUyMHklM0QlMjI4OCUyMiUzRSUzQ211dGF0aW9uJTIwc3RhdGVtZW50cyUzRCUyMmZhbHNlJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMm1vZHVzJTIyJTIwdmFyaWQlM0QlMjJVUWglMjVTISU1REclN0IoOFFFN2FvUkZDbyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTIwdmFyaWQlM0QlMjJtUnhrcSklNUQxMUclMkYqVlglNDBxdkxkRCUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRWJ1aWxkQ3JvblJ1bGUlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNDUklQVCUyMiUzRWJHVjBJSEpsYzNWc2RDQTlJQ0lpT3cwS2JHVjBJSEpsYzNWc2RGTjBZWEowSUQwZ0lpSTdEUXBzWlhRZ2IzWmhiRkJsY21sdlpDQTlJQ0lpT3cwS0RRcGpiMjVrYVhScGIyNXpMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNGdLR3hwYm1Vc2FXNWtaWGdzSUdGeWNtRjVLU0I3RFFvTkNpQWdJQ0F2S2cwS0lDQWdJQ0FnSUNBbmV5SjBhVzFsSWpwN0luTjBZWEowSWpvaU1EZzZNREFpTENKbGJtUWlPaUl5TURvd01DSXNJbTF2WkdVaU9pSnRhVzUxZEdWeklpd2lhVzUwWlhKMllXd2lPako5TENKd1pYSnBiMlFpT25zaVpHRjVjeUk2TVgxOUp3MEtJQ0FnSUNvdkRRb2dJQ0FnYkdWMElHOXJaWGtnUFNCUFltcGxZM1F1YTJWNWN5aHNhVzVsS1RzTkNpQWdJQ0JzWlhRZ2IzWmhiQ0E5SUd4cGJtVmJiMnRsZVYwN0RRb2dJQ0FnYjJ0bGVTQTlJRzlyWlhrdWRHOVRkSEpwYm1jb0tTNXlaWEJzWVdObEtDOWNjeXN2Wnl3Z0p5Y3BPdzBLSUNBZ0RRb2dJQ0FnTHk5c2IyY29iMnRsZVN3aWFXNW1ieUlwT3cwS0lDQWdJQ0FnSUNCcFppaHZhMlY1SUQwOUlDSndaWEpwYjJRaUtYc05DaUFnSUNBZ0lDQWdJQ0FnSUc5clpYa2dQU0J6ZEhKcGJtZFJkVzkwWlNoN2MzUnlWbUZ5YVdGaWJHVTZJRzlyWlhsOUtUc05DaUFnSUNBZ0lDQWdJQ0FnSUM4dmJHOW5LQ0p2YTJWNUlHbHpPaUFpTENKcGJtWnZJaWs3RFFvZ0lDQWdJQ0FnSUNBZ0lDQnZkbUZzVUdWeWFXOWtJRDBnYjNaaGJGQmxjbWx2WkM1amIyNWpZWFFvYjJ0bGVTd2lPaUlzSUc5MllXd3BPdzBLSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lvYjJ0bGVTQWhQU0FpY0dWeWFXOWtJaWtnZXcwS0lDQWdJQ0FnSUNCdmEyVjVJRDBnYzNSeWFXNW5VWFZ2ZEdVb2UzTjBjbFpoY21saFlteGxPaUJ2YTJWNWZTazdJQ0FnSUEwS0lDQWdJQ0FnSUNCcFppaDBlWEJsYjJZZ2IzWmhiQ0E5UFNBaWMzUnlhVzVuSWlsN0RRb2dJQ0FnSUNBZ0lDQWdJQ0J2ZG1Gc0lEMGdjM1J5YVc1blVYVnZkR1VvZTNOMGNsWmhjbWxoWW14bE9pQnZkbUZzZlNrN0RRb2dJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdMeTlzYjJjb2IydGxlU3dpZDJGeWJpSXBPdzBLSUNBZ0lDQWdJQ0F2TDJ4dlp5Z2lWbUZzT2lBaUlDc2diM1poYkNBcklDSWdmQ0IwZVhCbGIyWTZJQ0lySUhSNWNHVnZaaUJ2ZG1Gc0xDSnBibVp2SWlrN0RRb2dJQ0FnSUNBZ0lHbG1LR2x1WkdWNElEMDlQU0JoY25KaGVTNXNaVzVuZEdnZ0xURXBldzBLSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQWEpsYzNWc2RDNWpiMjVqWVhRb2IydGxlU3dpT2lJc0lHOTJZV3dwT3lBTkNpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUhzTkNpQWdJQ0FnSUNBZ2NtVnpkV3gwSUQxeVpYTjFiSFF1WTI5dVkyRjBLRzlyWlhrc0lqb2lMQ0J2ZG1Gc0xDSXNJaWs3SUNBZ0lDQWdJQ0FOQ2lBZ0lDQWdJQ0FnZlEwS0RRb2dJQ0FnSUNBZ0lIME5DZzBLRFFvTkNuMHBPdzBLRFFweVpYTjFiSFFnUFNCemRISnBibWRSZFc5MFpTaDdjM1J5Vm1GeWFXRmliR1U2SUhKbGMzVnNkQ3h6ZEhKUmRXOTBaVG9nSW50OUlpd2dZbTl2YkZOd2JHbDBVWFZ2ZEdVNklIUnlkV1Y5S1RzTkNpOHZiRzluS0c5MllXeFFaWEpwYjJRc0luZGhjbTRpS1RzTkNnMEtjM2RwZEdOb0tHMXZaSFZ6S1hzTkNpQWdJQ0JqWVhObElDSjBhVzFsSWpvTkNpQWdJQ0FnSUNBZ2NtVnpkV3gwVTNSaGNuUWdQU0FpZEdsdFpTSTdEUW9OQ2lBZ0lDQmtaV1poZFd4ME9nMEtJQ0FnSUNBZ0lDQnlaWE4xYkhSVGRHRnlkQ0E5SUNKMGFXMWxJanNOQ24wTkNuSmxjM1ZzZEZOMFlYSjBJRDBnYzNSeWFXNW5VWFZ2ZEdVb2UzTjBjbFpoY21saFlteGxPaUJ5WlhOMWJIUlRkR0Z5ZEgwcE93MEtjbVZ6ZFd4MFUzUmhjblFnUFNBaUlpNWpiMjVqWVhRb2NtVnpkV3gwVTNSaGNuUXNJam9pS1NBN0RRb05DZzBLY21WemRXeDBJRDBnSWlJdVkyOXVZMkYwS0hKbGMzVnNkRk4wWVhKMExDQnlaWE4xYkhRc0lpd2lMQ0J2ZG1Gc1VHVnlhVzlrS1RzTkNnMEtjbVZ6ZFd4MElEMGdjM1J5YVc1blVYVnZkR1VvZTNOMGNsWmhjbWxoWW14bE9uSmxjM1ZzZEN4emRISlJkVzkwWlRvaWUzMGlMR0p2YjJ4VGNHeHBkRkYxYjNSbE9pQjBjblZsSUgwcElEc05DaTh2Ykc5bktISmxjM1ZzZEN3aWQyRnliaUlwT3cwS0RRb05DbkpsZEhWeWJpQnlaWE4xYkhRNyUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19kZWZjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMiU3QjBjVyUzRjBWJTdCJTIzb05+fipzMzAwMkklMjIlMjB4JTNEJTIyNjMlMjIlMjB5JTNEJTIyMTEzJTIyJTNFJTNDbXV0YXRpb24lMjBzdGF0ZW1lbnRzJTNEJTIyZmFsc2UlMjIlM0UlM0NhcmclMjBuYW1lJTNEJTIycm9vdGRwJTIyJTIwdmFyaWQlM0QlMjJvNk51LUZjQnZEMyUyNHIlMkYlN0QuanElNjAqJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOQU1FJTIyJTNFZ2V0Q3JvbkNvbmRpdGlvbnMlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNDUklQVCUyMiUzRWJHVjBJSEpsYzNWc2RDQTlJRnRkT3cwS2JHOW5LQ0puWlhSRGNtOXVRMjl1WkhNaUxDSjNZWEp1SWlrN0RRcGpiMjV6ZENCa2NITWdQU0FrS0hKdmIzUmtjQ2t1ZEc5QmNuSmhlU2dwT3cwS2JHOW5LR1J3Y3lrN0RRcGtjSE11Wm05eVJXRmphQ2dvYVdRcElEMCUyQklIc05DaUFnSUNCamIyNXpkQ0JrY0haaGJDQTlJR2RsZEZOMFlYUmxLR2xrS1M1MllXdzdEUW9nSUNBZ1kyOXVjM1FnWkhBZ1BTQnpjR3hwZEhSV1lYSnBZV0pzWlNocFpDd2liR0Z6ZENJc0lpNGlLVHNOQ2lBZ0lDQnNaWFFnYjJKcUlEMGdlMzA3RFFvZ0lDQWdiMkpxVzJSd1hTQTlJR1J3ZG1Gc093MEtJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tHOWlhaWs3RFFwOUtUc05DaUFnSUNBdkwyeHZaeWh5WlhOMWJIUXNJbmRoY200aUtUc05DbkpsZEhWeWJpQnlaWE4xYkhRNyUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19kZWZjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMlhZU185WiUzQmZOJTNENi5XKjdCMDEzYiUyMiUyMHglM0QlMjI2MyUyMiUyMHklM0QlMjIxMzglMjIlM0UlM0NtdXRhdGlvbiUyMHN0YXRlbWVudHMlM0QlMjJmYWxzZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJPYmplY3RJRCUyMiUyMHZhcmlkJTNEJTIyTSU2MGZyOS1hRyUzQVMlMkNLcSh4JTVFYTkoLiUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRWdsX2xlc2VSYXVtJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTQ1JJUFQlMjIlM0ViR1YwSUhKdmIyMGdQU0JzWlhObFVtRjFiU2hQWW1wbFkzUkpSQ2s3RFFweVpYUjFjbTRnY205dmJUcyUzRCUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyNHUlNDB0Tl9tZCklM0ElNUQlNDBLJTQwMG9yQyU1RHclMjIlMjBkaXNhYmxlZCUzRCUyMnRydWUlMjIlMjB4JTNEJTIyMTA2MyUyMiUyMHklM0QlMjIxODglMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFJTdCJTIydGltZSUyMiUzQSU3QiUyMmVuZCUyMiUzQSUyMjIwJTNBMDAlMjIlMkMlMjJpbnRlcnZhbCUyMiUzQTIlMkMlMjJtb2RlJTIyJTNBJTIybWludXRlcyUyMiUyQyUyMnN0YXJ0JTIyJTNBJTIyMDglM0EwMCUyMiU3RCUyQyUyMnBlcmlvZCUyMiUzQSU3QiUyMmRheXMlMjIlM0ExJTdEJTdEJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19zZXQlMjIlMjBpZCUzRCUyMkwlNUJxNkQlNURtREJvV1klNURLTCUzQWNoJTI1ZCUyMiUyMHglM0QlMjIxMiUyMiUyMHklM0QlMjIyNjklMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVkFMVUUlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMjllcGslMkNDbyUyQzZlRVFUMDRhXyU0ME1xJTIyJTIwaW5saW5lJTNEJTIydHJ1ZSUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmdldENyb25Db25kaXRpb25zJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMnJvb3RkcCUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQVJHMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnRleHQlMjIlMjBpZCUzRCUyMjJ4V3AyTn5VJTdDVmguTkJwVzQlNURwVCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UwX3VzZXJkYXRhLjAuUm9sbGFkZW4uQWxsZ2VtZWluLlNjaGF0dGVuLmNyb25Db25kaXRpb25zLiolM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjJuJTNCVCUzRDhqT1J+JTNGTjBWOHYuQUVvSyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNldmVyaXR5JTIyJTNFaW5mbyUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRSUzQ3NoYWRvdyUyMHR5cGUlM0QlMjJ0ZXh0JTIyJTIwaWQlM0QlMjJEU1NtcWElN0MxbV9EcCUzRCF6UVE0dVMlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFdGVzdCUzQyUyRmZpZWxkJTNFJTNDJTJGc2hhZG93JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsY3VzdG9tcmV0dXJuJTIyJTIwaWQlM0QlMjIuOVlnRi1GTTlFVkh6RXY0JTIzZzElMkYlMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyYnVpbGRDcm9uUnVsZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJtb2R1cyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIySG1HOCUzQkolMkJaWCUzRnlwJTdEJTI0cyUyNWxZRyU3RCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0V0aW1lJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQVJHMSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMnE2RjZsJTdCVUpYJTNGM1Y5dHUlNDAhamxlJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVkFSJTIyJTIwaWQlM0QlMjIuaDZYVyUyNXFfWUMlM0RoMmFfLXhMOVMlMjIlM0V2YXJfQ3JvbkNvbmRpdGlvbnMlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjIlMkJKfmklNDBLMEZhJTdCeTBkKiUzQkFXbjglN0IlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyRFNTbXFhJTdDMW1fRHAlM0QhelFRNHVTJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRlc3QlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMkIzViFiSkclMkNOcUJ0Y0lfc1RRdW0lMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21ub3JldHVybiUyMiUyMGlkJTNEJTIyc2RVaWN0fiU0MFglN0JDKVhKS34lMkMoJTNESCUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmNyZWF0ZVNjaGVkdWxlJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmNyb25Db25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyOSElMjMlMjMlM0I1JTdCJTNCNDUzJTJGVXglM0FCN2hMWiUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfY2FsbGN1c3RvbW5vcmV0dXJuJTIyJTIwaWQlM0QlMjJyJTIzSG1iVW4uTUt3aEk4flZpNl9CJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyZ2V0U2NoZWR1bGUlMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJvbl9leHQlMjIlMjBpZCUzRCUyMmZ0UG9VZ0hNdG8lM0ElNUV6cDElN0JzWlktJTIyJTNFJTNDbXV0YXRpb24lMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhodG1sJTIyJTIwaXRlbXMlM0QlMjIxJTIyJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJDT05ESVRJT04lMjIlM0VhbnklM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkFDS19DT05ESVRJT04lMjIlM0UlM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMk9JRDAlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIyZmllbGRfb2lkJTIyJTIwaWQlM0QlMjJTdTdCel9wJTdCMjMuU00lM0R0Rn5+dWYlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJvaWQlMjIlM0VJRCUyMGF1c3clQzMlQTRobGVuJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0NibG9jayUyMHR5cGUlM0QlMjJzZWxlY3RvciUyMiUyMGlkJTNEJTIyWS5kanRib0x2KkxTTVEqdSUyNTclMkNkJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXN0YXRlJTVCc3RhdGUuaWQlM0QwX3VzZXJkYXRhLjAuUm9sbGFkZW4uQWxsZ2VtZWluLlNjaGF0dGVuLmNyb25Db25kaXRpb25zLiolNUQlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NzdGF0ZW1lbnQlMjBuYW1lJTNEJTIyU1RBVEVNRU5UJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX3NldCUyMiUyMGlkJTNEJTIyR1UwViUzRFBUSHdPby41MXVkKHVPSSUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJWQUxVRSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfY2FsbGN1c3RvbXJldHVybiUyMiUyMGlkJTNEJTIyLUhJJTVEKFZSaCloJTYwKCUzQmhiWkwxQ1YlMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyZ2V0Q3JvbkNvbmRpdGlvbnMlMjIlM0UlM0NhcmclMjBuYW1lJTNEJTIycm9vdGRwJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyd0hCa1QlMkJWcSUyM045UzchdWtMZWw2JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRTBfdXNlcmRhdGEuMC5Sb2xsYWRlbi5BbGxnZW1laW4uU2NoYXR0ZW4uY3JvbkNvbmRpdGlvbnMuKiUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsbm9yZXR1cm4lMjIlMjBpZCUzRCUyMiU0MCgyZnlXIVRoYWpON19OWml6RmYlMjIlM0UlM0NtdXRhdGlvbiUyMG5hbWUlM0QlMjJydW5UZXN0JTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmRwJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyYTg2S04uJTdCc3IlMjN2JTNBJTQwZiUzQXUlN0J+Qk0lMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGc3RhdGVtZW50JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2RlZm5vcmV0dXJuJTIyJTIwaWQlM0QlMjJseS0lN0RZRSUyM1pxJTJCUW8lNURtfiUyRllRblElMjIlMjB4JTNEJTIyOTg4JTIyJTIweSUzRCUyMjMxMyUyMiUzRSUzQ211dGF0aW9uJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmRwJTIyJTIwdmFyaWQlM0QlMjI1USUyQ1dCRiU1Qm0lMjMlMkZIJTJDa08heCU3Qzg0JTVEJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOQU1FJTIyJTNFcnVuVGVzdCUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQ3N0YXRlbWVudCUyMG5hbWUlM0QlMjJTVEFDSyUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjJXJTNBViUzRlNLKElqM1hPJTQwTnNGKSUyM3AtJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU2V2ZXJpdHklMjIlM0VpbmZvJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJURVhUJTIyJTNFJTNDc2hhZG93JTIwdHlwZSUzRCUyMnRleHQlMjIlMjBpZCUzRCUyMjdieiU1RU9JJTI1MUhIZ0gwYS1zeiUyQiU1REQlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFSGllciUyMHdpcmQlMjBkZXIlMjBTY2hlZHVsZXIlMjBnZXNldHp0JTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0MlMkZ2YWx1ZSUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJ2YXJpYWJsZXNfc2V0JTIyJTIwaWQlM0QlMjJ6bSFITVA3X1pOViUyMyUyRikpQndNcVglMjIlMjBkaXNhYmxlZCUzRCUyMnRydWUlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMkElMjR6SiUzRC5vYS5LJTdDJTJDODAlM0RXJTI0UyU0MEclMjIlM0V2YXJfUmF1bSUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVkFMVUUlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMkJWJTQwTDJaNCUzQjFVSCUzRiU1RCU1QmFXRDQ0eiUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmdsX2xlc2VSYXVtJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMk9iamVjdElEJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyNnRXQWJFNlpEMmElN0JHTkEtQ3UlMjM0JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVkFSJTIyJTIwaWQlM0QlMjI1USUyQ1dCRiU1Qm0lMjMlMkZIJTJDa08heCU3Qzg0JTVEJTIyJTNFZHAlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnNjaGVkdWxlX2NsZWFyJTIyJTIwaWQlM0QlMjIpYzElMjMlM0JCTkNNaWoyJTNEJTJCJTJDTWklMjRfcyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VzY2hlZHVsZTElM0MlMkZmaWVsZCUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJzY2hlZHVsZV9jcmVhdGUlMjIlMjBpZCUzRCUyMiUyNCglMjQlNUJ0ZDVscjhKJTNCZiUzQjlFejhUJTdDJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRXNjaGVkdWxlMSUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyU0NIRURVTEUlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIyZmllbGRfY3JvbiUyMiUyMGlkJTNEJTIydSElMkIlNUIhJTIzby0lNUV5YSU3RHlSQXF+VC5FJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQ1JPTiUyMiUzRSolMjAqJTIwKiUyMColMjAqJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMnd3JTNGWFMqfl9UTHh0ZUY5S09aenglMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyYnVpbGRDcm9uUnVsZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJtb2R1cyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyMyg1YTBNLWMlNDAxVWwoRERVUlQlMkM2JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRpbWUlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcxJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIySzlBVU1oJTQwMFZyJTNBLThtVTN+JTdCcmElMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NzdGF0ZW1lbnQlMjBuYW1lJTNEJTIyU1RBVEVNRU5UJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIyZGVidWclMjIlMjBpZCUzRCUyMk0lMkY4RipPeGQqTVc0NSU3RCUyNWgpWDQlN0IlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyRyUzRCU1RFAyZ3pMJTVCbUUlM0ZlMC1xLS5DLiUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0VIaWVyJTIwbCVDMyVBNHVmdCUyMGRlciUyMFRyaWdnZXIlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQyUyRnZhbHVlJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZzdGF0ZW1lbnQlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMmJOJTdCcC0lN0JJYnAhJTdEJTJCRktnSWRBaF8lMjIlM0UlM0NtdXRhdGlvbiUyMG5hbWUlM0QlMjJnZXRTY2hlZHVsZSUyMiUzRSUzQyUyRm11dGF0aW9uJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmNvbnRyb2xzX2lmJTIyJTIwaWQlM0QlMjJYcmclMjQyTlMlNUVnQ04qJTNGT3BVc0cwUSUyMiUyMGRpc2FibGVkJTNEJTIydHJ1ZSUyMiUzRSUzQ211dGF0aW9uJTIwZWxzZSUzRCUyMjElMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMklGMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2NvbXBhcmUlMjIlMjBpZCUzRCUyMld4LiU3QkolNUVhX3olMkJKJTI1SUlkJTQwJTVCJTdCU0clMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJPUCUyMiUzRUVRJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyVyUzRCUyNUF5JTYwLkRpMCUyNHFlcSU3Q24lMkIlMjUlM0J1JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXVuZGVmaW5lZCUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMkIlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJjb252ZXJ0X3R5cGUlMjIlMjBpZCUzRCUyMjBTOSU1Qjl4SClsRU0teF9Edk5YVjQlMjIlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJJVEVNJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyMjU5SkglMkIoN1ZYdEd4cTlhJTJGTyglN0QlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMkElMjR6SiUzRC5vYS5LJTdDJTJDODAlM0RXJTI0UyU0MEclMjIlM0V2YXJfUmF1bSUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMkRPMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjIhLSU3Q1RZSlZjQ35XMyU3QnhYan5oS1glMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyISU3QiUzQiUyQ3BnNiU2MC4yRyU3QyU1QkxuJTJCbjFoJTYwJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRWtlaW4lMjBSYXVtJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGc3RhdGVtZW50JTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMkVMU0UlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJkZWJ1ZyUyMiUyMGlkJTNEJTIyNjclNUJzUnBMJTJCblEwNUFnJTQwMSlHNHYlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIydWMyJTJDOHQ4Qk5IdnYlMjV6JTJCSCUzQSUyMy5iJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRlc3QlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMnMlMkYlMjVGJTNGKkUpZmNPSWMlMjRteGlGJTVEdyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyQSUyNHpKJTNELm9hLkslN0MlMkM4MCUzRFclMjRTJTQwRyUyMiUzRXZhcl9SYXVtJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZzdGF0ZW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnN0YXRlbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGeG1sJTNF
          
          T OliverIOO 2 Antworten Letzte Antwort
          0
          • T trojanhector

            @homoran
            Hier ist soweit mein Code, angelehnt an das Beispiel aus dem Netz.

            const schedule = require('node-schedule');
            const EventEmitter = require('events');
            class Ee extends EventEmitter {}
            
            const jobStatus = new Ee();
            
            jobStatus.on('finished', () => {
                console.log('JOB FINISHED');
                job.cancel();
            
                // Preform your DB Operations here (in your case: delete job from database)
            
            });
            
            function calcSecondsFromTime(time){
                //console.log("Time: " + time);
                var array = time.split(":");
                var seconds = 0; 
                if(typeof(array[2] = "undefined")){
                    seconds = (parseInt(array[0], 10) * 60 * 60) + (parseInt(array[1], 10) * 60);        
                } else {
                    seconds = (parseInt(array[0], 10) * 60 * 60) + (parseInt(array[1], 10) * 60) + parseInt(array[2], 10); 
                }
                //console.log("Array: "+ array.length +" Seconds: " + seconds);
                //console.log(array[0] +" -- " + array[1] +" -- " + array[2] +" -- " );
                return seconds;
            } 
            
            //So funktioniert das nicht.
            const strStart = "20:10"
            const strEnd = "21:15"
            const startTime = calcSecondsFromTime(strStart);
            const endTime = calcSecondsFromTime(strEnd);
            log("StartTime: " + startTime,"info");
            log("EndTime: " + endTime, "info");
            
            /*
            //So funktioniert das.
            const startTime = new Date(Date.now() + 5000);
            const endTime = new Date(startTime.getTime() + 5000);
            */
            
            const job = schedule.scheduleJob({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function(){
            
                console.log('Time for tea!');
                        if (this.nextInvocation() === null) {
                      //here you can code whatever you need to do in the last invocation
                jobStatus.emit('finished'); // Emit your job done emitter when you are done.            
                    }
            
            });
            

            Das mit dem jeweiligen Timestamp um Mitternacht setzt immer eine Bearbeitung voraus. Mein Ziel ist es aber einmal Start und Ende als hh:mm anzugeben und dann nicht mehr.

            Wenn ich in Blockly den Wizard vom kleinen Cron Bauteil nehme, kann ich da Start und Endzeit eingeben.
            Dann kommt als JS sowas raus:
            '{"time":{"start":"08:00","end":"20:00","mode":"minutes","interval":2},"period":{"days":1}}'
            Und das habe ich mit den Werten aus den Objekten nachgebaut und es funktioniert.

            Hier ist mein Ansatz als Blockly. Den Teil mit nextInvocation ist in der function createSchedule als Block auskommentiert, da er Fehler schmeißt und den Adapter zum Neustart zwingt.

            var cronConditions, modus, conditions, rootdp, ObjectID, var_CronConditions, dp, var_Raum, schedule1;
            
            // Beschreibe diese Funktion …
            async function getSchedule() {
                const list = getSchedules(false);
                list.forEach(schedule => log(JSON.stringify(schedule)));
            }
            
            // Beschreibe diese Funktion …
            async function createSchedule(cronConditions) {
                let testSched = null;
                const EventEmitter = require('events');
                class Ee extends EventEmitter {}
                
                const jobStatus = new Ee();
                //log("cronConditions: " + cronConditions,"info");
                
                jobStatus.on('finished', () => {
                    console.log('JOB FINISHED');
                    job.cancel();
                     // Preform your DB Operations here (in your case: delete job from database)
                
                });
                   
                (() => { if (testSched) { clearSchedule(testSched); testSched = null; }})();
                //log("TestSchedCond: " + cronConditions,"warn");
                  console.info('Hier wird der TESTScheduler gesetzt');
                  (() => { if (testSched) { clearSchedule(testSched); testSched = null; }})();
                
                  testSched = schedule((await buildCronRule('time', cronConditions)), function() {
                    console.info('Hier läuft der TESTTrigger');
                    /*
                    if (this.nextInvocation() === null) {
                            //here you can code whatever you need to do in the last invocation
                        jobStatus.emit('finished'); // Emit your job done emitter when you are done.            
                            }
                            */
                  });
                 
                
            
            }
            
            // Beschreibe diese Funktion …
            async function buildCronRule(modus, conditions) {
                let result = "";
                let resultStart = "";
                let ovalPeriod = "";
                
                conditions.forEach(function (line,index, array) {
                
                    /*
                        '{"time":{"start":"08:00","end":"20:00","mode":"minutes","interval":2},"period":{"days":1}}'
                    */
                    let okey = Object.keys(line);
                    let oval = line[okey];
                    okey = okey.toString().replace(/\s+/g, '');
                   
                    //log(okey,"info");
                        if(okey == "period"){
                            okey = stringQuote({strVariable: okey});
                            //log("okey is: ","info");
                            ovalPeriod = ovalPeriod.concat(okey,":", oval);
                        } else if(okey != "period") {
                        okey = stringQuote({strVariable: okey});    
                        if(typeof oval == "string"){
                            oval = stringQuote({strVariable: oval});
                        }
                        //log(okey,"warn");
                        //log("Val: " + oval + " | typeof: "+ typeof oval,"info");
                        if(index === array.length -1){
                        result =result.concat(okey,":", oval); 
                        } else {
                        result =result.concat(okey,":", oval,",");        
                        }
                
                        }
                
                
                
                });
                
                result = stringQuote({strVariable: result,strQuote: "{}", boolSplitQuote: true});
                //log(ovalPeriod,"warn");
                
                switch(modus){
                    case "time":
                        resultStart = "time";
                
                    default:
                        resultStart = "time";
                }
                resultStart = stringQuote({strVariable: resultStart});
                resultStart = "".concat(resultStart,":") ;
                
                
                result = "".concat(resultStart, result,",", ovalPeriod);
                
                result = stringQuote({strVariable:result,strQuote:"{}",boolSplitQuote: true }) ;
                //log(result,"warn");
                
                
                return result;
            }
            
            // Beschreibe diese Funktion …
            async function getCronConditions(rootdp) {
                let result = [];
                log("getCronConds","warn");
                const dps = $(rootdp).toArray();
                log(dps);
                dps.forEach((id) => {
                    const dpval = getState(id).val;
                    const dp = splittVariable(id,"last",".");
                    let obj = {};
                    obj[dp] = dpval;
                    result.push(obj);
                });
                    //log(result,"warn");
                return result;
            }
            
            // Beschreibe diese Funktion …
            async function gl_leseRaum(ObjectID) {
                let room = leseRaum(ObjectID);
                return room;
            }
            
            // Beschreibe diese Funktion …
            async function runTest(dp) {
              console.info('Hier wird der Scheduler gesetzt');
              (() => { if (schedule1) { clearSchedule(schedule1); schedule1 = null; }})();
              schedule1 = schedule((await buildCronRule('time', var_CronConditions)), async () => {
                console.info('Hier läuft der Trigger');
              });
              await getSchedule();
            }
            
            
            var_CronConditions = await getCronConditions('0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*');
            console.info((await buildCronRule('time', var_CronConditions)));
            console.info(var_CronConditions);
            await createSchedule(var_CronConditions);
            await getSchedule();
            on({ id: [].concat(Array.prototype.slice.apply($('state[state.id=0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*]'))), change: 'any' }, async (obj) => {
              let value = obj.state.val;
              let oldValue = obj.oldState.val;
              var_CronConditions = await getCronConditions('0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*');
              await runTest(var_CronConditions);
            });
            
            //JTNDeG1sJTIweG1sbnMlM0QlMjJodHRwcyUzQSUyRiUyRmRldmVsb3BlcnMuZ29vZ2xlLmNvbSUyRmJsb2NrbHklMkZ4bWwlMjIlM0UlM0N2YXJpYWJsZXMlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyYyU1QiUzQVd3aiU3QnNpd3JOJTJGRiU1RSglNjBoTHclMjIlM0Vjcm9uQ29uZGl0aW9ucyUzQyUyRnZhcmlhYmxlJTNFJTNDdmFyaWFibGUlMjBpZCUzRCUyMlVRaCUyNVMhJTVERyU3Qig4UUU3YW9SRkNvJTIyJTNFbW9kdXMlM0MlMkZ2YXJpYWJsZSUzRSUzQ3ZhcmlhYmxlJTIwaWQlM0QlMjJtUnhrcSklNUQxMUclMkYqVlglNDBxdkxkRCUyMiUzRWNvbmRpdGlvbnMlM0MlMkZ2YXJpYWJsZSUzRSUzQ3ZhcmlhYmxlJTIwaWQlM0QlMjJvNk51LUZjQnZEMyUyNHIlMkYlN0QuanElNjAqJTIyJTNFcm9vdGRwJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyTSU2MGZyOS1hRyUzQVMlMkNLcSh4JTVFYTkoLiUyMiUzRU9iamVjdElEJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyNVElMkNXQkYlNUJtJTIzJTJGSCUyQ2tPIXglN0M4NCU1RCUyMiUzRWRwJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyQSUyNHpKJTNELm9hLkslN0MlMkM4MCUzRFclMjRTJTQwRyUyMiUzRXZhcl9SYXVtJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMHR5cGUlM0QlMjJjcm9uJTIyJTIwaWQlM0QlMjJzY2hlZHVsZTElMjIlM0VzY2hlZHVsZTElM0MlMkZ2YXJpYWJsZSUzRSUzQyUyRnZhcmlhYmxlcyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMkZiKE9oV3BGJTdEbmMlM0ZHZDB0ODIlMjQpJTIyJTIweCUzRCUyMjYzJTIyJTIweSUzRCUyMjM4JTIyJTNFJTNDbXV0YXRpb24lMjBzdGF0ZW1lbnRzJTNEJTIyZmFsc2UlMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VnZXRTY2hlZHVsZSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU0NSSVBUJTIyJTNFWTI5dWMzUWdiR2x6ZENBOUlHZGxkRk5qYUdWa2RXeGxjeWhtWVd4elpTazdEUXBzYVhOMExtWnZja1ZoWTJnb2MyTm9aV1IxYkdVZ1BUNGdiRzluS0VwVFQwNHVjM1J5YVc1bmFXWjVLSE5qYUdWa2RXeGxLU2twT3clM0QlM0QlM0MlMkZmaWVsZCUzRSUzQ2NvbW1lbnQlMjBwaW5uZWQlM0QlMjJmYWxzZSUyMiUyMGglM0QlMjI4MCUyMiUyMHclM0QlMjIxNjAlMjIlM0VCZXNjaHJlaWJlJTIwZGllc2UlMjBGdW5rdGlvbiUyMCVFMiU4MCVBNiUzQyUyRmNvbW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMnIlNUV0KWQhLlQlNURtJTJCR1hoMCUyNTlYUUklMjIlMjB4JTNEJTIyNjMlMjIlMjB5JTNEJTIyNjMlMjIlM0UlM0NtdXRhdGlvbiUyMHN0YXRlbWVudHMlM0QlMjJmYWxzZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjcm9uQ29uZGl0aW9ucyUyMiUyMHZhcmlkJTNEJTIyYyU1QiUzQVd3aiU3QnNpd3JOJTJGRiU1RSglNjBoTHclMjIlM0UlM0MlMkZhcmclM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VjcmVhdGVTY2hlZHVsZSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU0NSSVBUJTIyJTNFYkdWMElIUmxjM1JUWTJobFpDQTlJRzUxYkd3N0RRcGpiMjV6ZENCRmRtVnVkRVZ0YVhSMFpYSWdQU0J5WlhGMWFYSmxLQ2RsZG1WdWRITW5LVHNOQ21Oc1lYTnpJRVZsSUdWNGRHVnVaSE1nUlhabGJuUkZiV2wwZEdWeUlIdDlEUW9OQ21OdmJuTjBJR3B2WWxOMFlYUjFjeUE5SUc1bGR5QkZaU2dwT3cwS0x5OXNiMmNvSW1OeWIyNURiMjVrYVhScGIyNXpPaUFpSUNzZ1kzSnZia052Ym1ScGRHbHZibk1zSW1sdVptOGlLVHNOQ2cwS2FtOWlVM1JoZEhWekxtOXVLQ2RtYVc1cGMyaGxaQ2NzSUNncElEMCUyQklIc05DaUFnSUNCamIyNXpiMnhsTG14dlp5Z25TazlDSUVaSlRrbFRTRVZFSnlrN0RRb2dJQ0FnYW05aUxtTmhibU5sYkNncE93MEtJQ0FnSUNBdkx5QlFjbVZtYjNKdElIbHZkWElnUkVJZ1QzQmxjbUYwYVc5dWN5Qm9aWEpsSUNocGJpQjViM1Z5SUdOaGMyVTZJR1JsYkdWMFpTQnFiMklnWm5KdmJTQmtZWFJoWW1GelpTa05DZzBLZlNrN0RRb2dJQ0FOQ2lnb0tTQTlQaUI3SUdsbUlDaDBaWE4wVTJOb1pXUXBJSHNnWTJ4bFlYSlRZMmhsWkhWc1pTaDBaWE4wVTJOb1pXUXBPeUIwWlhOMFUyTm9aV1FnUFNCdWRXeHNPeUI5ZlNrb0tUc05DaTh2Ykc5bktDSlVaWE4wVTJOb1pXUkRiMjVrT2lBaUlDc2dZM0p2YmtOdmJtUnBkR2x2Ym5Nc0luZGhjbTRpS1RzTkNpQWdZMjl1YzI5c1pTNXBibVp2S0NkSWFXVnlJSGRwY21RZ1pHVnlJRlJGVTFSVFkyaGxaSFZzWlhJZ1oyVnpaWFI2ZENjcE93MEtJQ0FvS0NrZ1BUNGdleUJwWmlBb2RHVnpkRk5qYUdWa0tTQjdJR05zWldGeVUyTm9aV1IxYkdVb2RHVnpkRk5qYUdWa0tUc2dkR1Z6ZEZOamFHVmtJRDBnYm5Wc2JEc2dmWDBwS0NrN0RRb05DaUFnZEdWemRGTmphR1ZrSUQwZ2MyTm9aV1IxYkdVb0tHRjNZV2wwSUdKMWFXeGtRM0p2YmxKMWJHVW9KM1JwYldVbkxDQmpjbTl1UTI5dVpHbDBhVzl1Y3lrcExDQm1kVzVqZEdsdmJpZ3BJSHNOQ2lBZ0lDQmpiMjV6YjJ4bExtbHVabThvSjBocFpYSWdiTU9rZFdaMElHUmxjaUJVUlZOVVZISnBaMmRsY2ljcE93MEtJQ0FnSUM4cURRb2dJQ0FnYVdZZ0tIUm9hWE11Ym1WNGRFbHVkbTlqWVhScGIyNG9LU0E5UFQwZ2JuVnNiQ2tnZXcwS0lDQWdJQ0FnSUNBZ0lDQWdMeTlvWlhKbElIbHZkU0JqWVc0Z1kyOWtaU0IzYUdGMFpYWmxjaUI1YjNVZ2JtVmxaQ0IwYnlCa2J5QnBiaUIwYUdVZ2JHRnpkQ0JwYm5adlkyRjBhVzl1RFFvZ0lDQWdJQ0FnSUdwdllsTjBZWFIxY3k1bGJXbDBLQ2RtYVc1cGMyaGxaQ2NwT3lBdkx5QkZiV2wwSUhsdmRYSWdhbTlpSUdSdmJtVWdaVzFwZEhSbGNpQjNhR1Z1SUhsdmRTQmhjbVVnWkc5dVpTNGdJQ0FnSUNBZ0lDQWdJQ0FOQ2lBZ0lDQWdJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdJQ0FnSUNvdkRRb2dJSDBwT3cwS0lBMEtEUW8lM0QlM0MlMkZmaWVsZCUzRSUzQ2NvbW1lbnQlMjBwaW5uZWQlM0QlMjJmYWxzZSUyMiUyMGglM0QlMjI4MCUyMiUyMHclM0QlMjIxNjAlMjIlM0VCZXNjaHJlaWJlJTIwZGllc2UlMjBGdW5rdGlvbiUyMCVFMiU4MCVBNiUzQyUyRmNvbW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tcmV0dXJuJTIyJTIwaWQlM0QlMjJzJTVFJTJDZkhEJTNBZEMlMjRkb2VoJTQwRSUyRjNhMSUyMiUyMHglM0QlMjI2MyUyMiUyMHklM0QlMjI4OCUyMiUzRSUzQ211dGF0aW9uJTIwc3RhdGVtZW50cyUzRCUyMmZhbHNlJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMm1vZHVzJTIyJTIwdmFyaWQlM0QlMjJVUWglMjVTISU1REclN0IoOFFFN2FvUkZDbyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTIwdmFyaWQlM0QlMjJtUnhrcSklNUQxMUclMkYqVlglNDBxdkxkRCUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRWJ1aWxkQ3JvblJ1bGUlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNDUklQVCUyMiUzRWJHVjBJSEpsYzNWc2RDQTlJQ0lpT3cwS2JHVjBJSEpsYzNWc2RGTjBZWEowSUQwZ0lpSTdEUXBzWlhRZ2IzWmhiRkJsY21sdlpDQTlJQ0lpT3cwS0RRcGpiMjVrYVhScGIyNXpMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNGdLR3hwYm1Vc2FXNWtaWGdzSUdGeWNtRjVLU0I3RFFvTkNpQWdJQ0F2S2cwS0lDQWdJQ0FnSUNBbmV5SjBhVzFsSWpwN0luTjBZWEowSWpvaU1EZzZNREFpTENKbGJtUWlPaUl5TURvd01DSXNJbTF2WkdVaU9pSnRhVzUxZEdWeklpd2lhVzUwWlhKMllXd2lPako5TENKd1pYSnBiMlFpT25zaVpHRjVjeUk2TVgxOUp3MEtJQ0FnSUNvdkRRb2dJQ0FnYkdWMElHOXJaWGtnUFNCUFltcGxZM1F1YTJWNWN5aHNhVzVsS1RzTkNpQWdJQ0JzWlhRZ2IzWmhiQ0E5SUd4cGJtVmJiMnRsZVYwN0RRb2dJQ0FnYjJ0bGVTQTlJRzlyWlhrdWRHOVRkSEpwYm1jb0tTNXlaWEJzWVdObEtDOWNjeXN2Wnl3Z0p5Y3BPdzBLSUNBZ0RRb2dJQ0FnTHk5c2IyY29iMnRsZVN3aWFXNW1ieUlwT3cwS0lDQWdJQ0FnSUNCcFppaHZhMlY1SUQwOUlDSndaWEpwYjJRaUtYc05DaUFnSUNBZ0lDQWdJQ0FnSUc5clpYa2dQU0J6ZEhKcGJtZFJkVzkwWlNoN2MzUnlWbUZ5YVdGaWJHVTZJRzlyWlhsOUtUc05DaUFnSUNBZ0lDQWdJQ0FnSUM4dmJHOW5LQ0p2YTJWNUlHbHpPaUFpTENKcGJtWnZJaWs3RFFvZ0lDQWdJQ0FnSUNBZ0lDQnZkbUZzVUdWeWFXOWtJRDBnYjNaaGJGQmxjbWx2WkM1amIyNWpZWFFvYjJ0bGVTd2lPaUlzSUc5MllXd3BPdzBLSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lvYjJ0bGVTQWhQU0FpY0dWeWFXOWtJaWtnZXcwS0lDQWdJQ0FnSUNCdmEyVjVJRDBnYzNSeWFXNW5VWFZ2ZEdVb2UzTjBjbFpoY21saFlteGxPaUJ2YTJWNWZTazdJQ0FnSUEwS0lDQWdJQ0FnSUNCcFppaDBlWEJsYjJZZ2IzWmhiQ0E5UFNBaWMzUnlhVzVuSWlsN0RRb2dJQ0FnSUNBZ0lDQWdJQ0J2ZG1Gc0lEMGdjM1J5YVc1blVYVnZkR1VvZTNOMGNsWmhjbWxoWW14bE9pQnZkbUZzZlNrN0RRb2dJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdMeTlzYjJjb2IydGxlU3dpZDJGeWJpSXBPdzBLSUNBZ0lDQWdJQ0F2TDJ4dlp5Z2lWbUZzT2lBaUlDc2diM1poYkNBcklDSWdmQ0IwZVhCbGIyWTZJQ0lySUhSNWNHVnZaaUJ2ZG1Gc0xDSnBibVp2SWlrN0RRb2dJQ0FnSUNBZ0lHbG1LR2x1WkdWNElEMDlQU0JoY25KaGVTNXNaVzVuZEdnZ0xURXBldzBLSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQWEpsYzNWc2RDNWpiMjVqWVhRb2IydGxlU3dpT2lJc0lHOTJZV3dwT3lBTkNpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUhzTkNpQWdJQ0FnSUNBZ2NtVnpkV3gwSUQxeVpYTjFiSFF1WTI5dVkyRjBLRzlyWlhrc0lqb2lMQ0J2ZG1Gc0xDSXNJaWs3SUNBZ0lDQWdJQ0FOQ2lBZ0lDQWdJQ0FnZlEwS0RRb2dJQ0FnSUNBZ0lIME5DZzBLRFFvTkNuMHBPdzBLRFFweVpYTjFiSFFnUFNCemRISnBibWRSZFc5MFpTaDdjM1J5Vm1GeWFXRmliR1U2SUhKbGMzVnNkQ3h6ZEhKUmRXOTBaVG9nSW50OUlpd2dZbTl2YkZOd2JHbDBVWFZ2ZEdVNklIUnlkV1Y5S1RzTkNpOHZiRzluS0c5MllXeFFaWEpwYjJRc0luZGhjbTRpS1RzTkNnMEtjM2RwZEdOb0tHMXZaSFZ6S1hzTkNpQWdJQ0JqWVhObElDSjBhVzFsSWpvTkNpQWdJQ0FnSUNBZ2NtVnpkV3gwVTNSaGNuUWdQU0FpZEdsdFpTSTdEUW9OQ2lBZ0lDQmtaV1poZFd4ME9nMEtJQ0FnSUNBZ0lDQnlaWE4xYkhSVGRHRnlkQ0E5SUNKMGFXMWxJanNOQ24wTkNuSmxjM1ZzZEZOMFlYSjBJRDBnYzNSeWFXNW5VWFZ2ZEdVb2UzTjBjbFpoY21saFlteGxPaUJ5WlhOMWJIUlRkR0Z5ZEgwcE93MEtjbVZ6ZFd4MFUzUmhjblFnUFNBaUlpNWpiMjVqWVhRb2NtVnpkV3gwVTNSaGNuUXNJam9pS1NBN0RRb05DZzBLY21WemRXeDBJRDBnSWlJdVkyOXVZMkYwS0hKbGMzVnNkRk4wWVhKMExDQnlaWE4xYkhRc0lpd2lMQ0J2ZG1Gc1VHVnlhVzlrS1RzTkNnMEtjbVZ6ZFd4MElEMGdjM1J5YVc1blVYVnZkR1VvZTNOMGNsWmhjbWxoWW14bE9uSmxjM1ZzZEN4emRISlJkVzkwWlRvaWUzMGlMR0p2YjJ4VGNHeHBkRkYxYjNSbE9pQjBjblZsSUgwcElEc05DaTh2Ykc5bktISmxjM1ZzZEN3aWQyRnliaUlwT3cwS0RRb05DbkpsZEhWeWJpQnlaWE4xYkhRNyUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19kZWZjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMiU3QjBjVyUzRjBWJTdCJTIzb05+fipzMzAwMkklMjIlMjB4JTNEJTIyNjMlMjIlMjB5JTNEJTIyMTEzJTIyJTNFJTNDbXV0YXRpb24lMjBzdGF0ZW1lbnRzJTNEJTIyZmFsc2UlMjIlM0UlM0NhcmclMjBuYW1lJTNEJTIycm9vdGRwJTIyJTIwdmFyaWQlM0QlMjJvNk51LUZjQnZEMyUyNHIlMkYlN0QuanElNjAqJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOQU1FJTIyJTNFZ2V0Q3JvbkNvbmRpdGlvbnMlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNDUklQVCUyMiUzRWJHVjBJSEpsYzNWc2RDQTlJRnRkT3cwS2JHOW5LQ0puWlhSRGNtOXVRMjl1WkhNaUxDSjNZWEp1SWlrN0RRcGpiMjV6ZENCa2NITWdQU0FrS0hKdmIzUmtjQ2t1ZEc5QmNuSmhlU2dwT3cwS2JHOW5LR1J3Y3lrN0RRcGtjSE11Wm05eVJXRmphQ2dvYVdRcElEMCUyQklIc05DaUFnSUNCamIyNXpkQ0JrY0haaGJDQTlJR2RsZEZOMFlYUmxLR2xrS1M1MllXdzdEUW9nSUNBZ1kyOXVjM1FnWkhBZ1BTQnpjR3hwZEhSV1lYSnBZV0pzWlNocFpDd2liR0Z6ZENJc0lpNGlLVHNOQ2lBZ0lDQnNaWFFnYjJKcUlEMGdlMzA3RFFvZ0lDQWdiMkpxVzJSd1hTQTlJR1J3ZG1Gc093MEtJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tHOWlhaWs3RFFwOUtUc05DaUFnSUNBdkwyeHZaeWh5WlhOMWJIUXNJbmRoY200aUtUc05DbkpsZEhWeWJpQnlaWE4xYkhRNyUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19kZWZjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMlhZU185WiUzQmZOJTNENi5XKjdCMDEzYiUyMiUyMHglM0QlMjI2MyUyMiUyMHklM0QlMjIxMzglMjIlM0UlM0NtdXRhdGlvbiUyMHN0YXRlbWVudHMlM0QlMjJmYWxzZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJPYmplY3RJRCUyMiUyMHZhcmlkJTNEJTIyTSU2MGZyOS1hRyUzQVMlMkNLcSh4JTVFYTkoLiUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRWdsX2xlc2VSYXVtJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTQ1JJUFQlMjIlM0ViR1YwSUhKdmIyMGdQU0JzWlhObFVtRjFiU2hQWW1wbFkzUkpSQ2s3RFFweVpYUjFjbTRnY205dmJUcyUzRCUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyNHUlNDB0Tl9tZCklM0ElNUQlNDBLJTQwMG9yQyU1RHclMjIlMjBkaXNhYmxlZCUzRCUyMnRydWUlMjIlMjB4JTNEJTIyMTA2MyUyMiUyMHklM0QlMjIxODglMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFJTdCJTIydGltZSUyMiUzQSU3QiUyMmVuZCUyMiUzQSUyMjIwJTNBMDAlMjIlMkMlMjJpbnRlcnZhbCUyMiUzQTIlMkMlMjJtb2RlJTIyJTNBJTIybWludXRlcyUyMiUyQyUyMnN0YXJ0JTIyJTNBJTIyMDglM0EwMCUyMiU3RCUyQyUyMnBlcmlvZCUyMiUzQSU3QiUyMmRheXMlMjIlM0ExJTdEJTdEJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19zZXQlMjIlMjBpZCUzRCUyMkwlNUJxNkQlNURtREJvV1klNURLTCUzQWNoJTI1ZCUyMiUyMHglM0QlMjIxMiUyMiUyMHklM0QlMjIyNjklMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVkFMVUUlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMjllcGslMkNDbyUyQzZlRVFUMDRhXyU0ME1xJTIyJTIwaW5saW5lJTNEJTIydHJ1ZSUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmdldENyb25Db25kaXRpb25zJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMnJvb3RkcCUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQVJHMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnRleHQlMjIlMjBpZCUzRCUyMjJ4V3AyTn5VJTdDVmguTkJwVzQlNURwVCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UwX3VzZXJkYXRhLjAuUm9sbGFkZW4uQWxsZ2VtZWluLlNjaGF0dGVuLmNyb25Db25kaXRpb25zLiolM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjJuJTNCVCUzRDhqT1J+JTNGTjBWOHYuQUVvSyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNldmVyaXR5JTIyJTNFaW5mbyUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRSUzQ3NoYWRvdyUyMHR5cGUlM0QlMjJ0ZXh0JTIyJTIwaWQlM0QlMjJEU1NtcWElN0MxbV9EcCUzRCF6UVE0dVMlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFdGVzdCUzQyUyRmZpZWxkJTNFJTNDJTJGc2hhZG93JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsY3VzdG9tcmV0dXJuJTIyJTIwaWQlM0QlMjIuOVlnRi1GTTlFVkh6RXY0JTIzZzElMkYlMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyYnVpbGRDcm9uUnVsZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJtb2R1cyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIySG1HOCUzQkolMkJaWCUzRnlwJTdEJTI0cyUyNWxZRyU3RCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0V0aW1lJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQVJHMSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMnE2RjZsJTdCVUpYJTNGM1Y5dHUlNDAhamxlJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVkFSJTIyJTIwaWQlM0QlMjIuaDZYVyUyNXFfWUMlM0RoMmFfLXhMOVMlMjIlM0V2YXJfQ3JvbkNvbmRpdGlvbnMlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjIlMkJKfmklNDBLMEZhJTdCeTBkKiUzQkFXbjglN0IlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyRFNTbXFhJTdDMW1fRHAlM0QhelFRNHVTJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRlc3QlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMkIzViFiSkclMkNOcUJ0Y0lfc1RRdW0lMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21ub3JldHVybiUyMiUyMGlkJTNEJTIyc2RVaWN0fiU0MFglN0JDKVhKS34lMkMoJTNESCUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmNyZWF0ZVNjaGVkdWxlJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmNyb25Db25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyOSElMjMlMjMlM0I1JTdCJTNCNDUzJTJGVXglM0FCN2hMWiUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfY2FsbGN1c3RvbW5vcmV0dXJuJTIyJTIwaWQlM0QlMjJyJTIzSG1iVW4uTUt3aEk4flZpNl9CJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyZ2V0U2NoZWR1bGUlMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJvbl9leHQlMjIlMjBpZCUzRCUyMmZ0UG9VZ0hNdG8lM0ElNUV6cDElN0JzWlktJTIyJTNFJTNDbXV0YXRpb24lMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhodG1sJTIyJTIwaXRlbXMlM0QlMjIxJTIyJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJDT05ESVRJT04lMjIlM0VhbnklM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkFDS19DT05ESVRJT04lMjIlM0UlM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMk9JRDAlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIyZmllbGRfb2lkJTIyJTIwaWQlM0QlMjJTdTdCel9wJTdCMjMuU00lM0R0Rn5+dWYlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJvaWQlMjIlM0VJRCUyMGF1c3clQzMlQTRobGVuJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0NibG9jayUyMHR5cGUlM0QlMjJzZWxlY3RvciUyMiUyMGlkJTNEJTIyWS5kanRib0x2KkxTTVEqdSUyNTclMkNkJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXN0YXRlJTVCc3RhdGUuaWQlM0QwX3VzZXJkYXRhLjAuUm9sbGFkZW4uQWxsZ2VtZWluLlNjaGF0dGVuLmNyb25Db25kaXRpb25zLiolNUQlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NzdGF0ZW1lbnQlMjBuYW1lJTNEJTIyU1RBVEVNRU5UJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX3NldCUyMiUyMGlkJTNEJTIyR1UwViUzRFBUSHdPby41MXVkKHVPSSUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJWQUxVRSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfY2FsbGN1c3RvbXJldHVybiUyMiUyMGlkJTNEJTIyLUhJJTVEKFZSaCloJTYwKCUzQmhiWkwxQ1YlMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyZ2V0Q3JvbkNvbmRpdGlvbnMlMjIlM0UlM0NhcmclMjBuYW1lJTNEJTIycm9vdGRwJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyd0hCa1QlMkJWcSUyM045UzchdWtMZWw2JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRTBfdXNlcmRhdGEuMC5Sb2xsYWRlbi5BbGxnZW1laW4uU2NoYXR0ZW4uY3JvbkNvbmRpdGlvbnMuKiUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsbm9yZXR1cm4lMjIlMjBpZCUzRCUyMiU0MCgyZnlXIVRoYWpON19OWml6RmYlMjIlM0UlM0NtdXRhdGlvbiUyMG5hbWUlM0QlMjJydW5UZXN0JTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmRwJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyYTg2S04uJTdCc3IlMjN2JTNBJTQwZiUzQXUlN0J+Qk0lMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGc3RhdGVtZW50JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2RlZm5vcmV0dXJuJTIyJTIwaWQlM0QlMjJseS0lN0RZRSUyM1pxJTJCUW8lNURtfiUyRllRblElMjIlMjB4JTNEJTIyOTg4JTIyJTIweSUzRCUyMjMxMyUyMiUzRSUzQ211dGF0aW9uJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmRwJTIyJTIwdmFyaWQlM0QlMjI1USUyQ1dCRiU1Qm0lMjMlMkZIJTJDa08heCU3Qzg0JTVEJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOQU1FJTIyJTNFcnVuVGVzdCUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQ3N0YXRlbWVudCUyMG5hbWUlM0QlMjJTVEFDSyUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjJXJTNBViUzRlNLKElqM1hPJTQwTnNGKSUyM3AtJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU2V2ZXJpdHklMjIlM0VpbmZvJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJURVhUJTIyJTNFJTNDc2hhZG93JTIwdHlwZSUzRCUyMnRleHQlMjIlMjBpZCUzRCUyMjdieiU1RU9JJTI1MUhIZ0gwYS1zeiUyQiU1REQlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFSGllciUyMHdpcmQlMjBkZXIlMjBTY2hlZHVsZXIlMjBnZXNldHp0JTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0MlMkZ2YWx1ZSUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJ2YXJpYWJsZXNfc2V0JTIyJTIwaWQlM0QlMjJ6bSFITVA3X1pOViUyMyUyRikpQndNcVglMjIlMjBkaXNhYmxlZCUzRCUyMnRydWUlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMkElMjR6SiUzRC5vYS5LJTdDJTJDODAlM0RXJTI0UyU0MEclMjIlM0V2YXJfUmF1bSUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVkFMVUUlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMkJWJTQwTDJaNCUzQjFVSCUzRiU1RCU1QmFXRDQ0eiUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmdsX2xlc2VSYXVtJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMk9iamVjdElEJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyNnRXQWJFNlpEMmElN0JHTkEtQ3UlMjM0JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVkFSJTIyJTIwaWQlM0QlMjI1USUyQ1dCRiU1Qm0lMjMlMkZIJTJDa08heCU3Qzg0JTVEJTIyJTNFZHAlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnNjaGVkdWxlX2NsZWFyJTIyJTIwaWQlM0QlMjIpYzElMjMlM0JCTkNNaWoyJTNEJTJCJTJDTWklMjRfcyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VzY2hlZHVsZTElM0MlMkZmaWVsZCUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJzY2hlZHVsZV9jcmVhdGUlMjIlMjBpZCUzRCUyMiUyNCglMjQlNUJ0ZDVscjhKJTNCZiUzQjlFejhUJTdDJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRXNjaGVkdWxlMSUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyU0NIRURVTEUlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIyZmllbGRfY3JvbiUyMiUyMGlkJTNEJTIydSElMkIlNUIhJTIzby0lNUV5YSU3RHlSQXF+VC5FJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQ1JPTiUyMiUzRSolMjAqJTIwKiUyMColMjAqJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMnd3JTNGWFMqfl9UTHh0ZUY5S09aenglMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyYnVpbGRDcm9uUnVsZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJtb2R1cyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyMyg1YTBNLWMlNDAxVWwoRERVUlQlMkM2JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRpbWUlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcxJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIySzlBVU1oJTQwMFZyJTNBLThtVTN+JTdCcmElMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NzdGF0ZW1lbnQlMjBuYW1lJTNEJTIyU1RBVEVNRU5UJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIyZGVidWclMjIlMjBpZCUzRCUyMk0lMkY4RipPeGQqTVc0NSU3RCUyNWgpWDQlN0IlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyRyUzRCU1RFAyZ3pMJTVCbUUlM0ZlMC1xLS5DLiUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0VIaWVyJTIwbCVDMyVBNHVmdCUyMGRlciUyMFRyaWdnZXIlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQyUyRnZhbHVlJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZzdGF0ZW1lbnQlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMmJOJTdCcC0lN0JJYnAhJTdEJTJCRktnSWRBaF8lMjIlM0UlM0NtdXRhdGlvbiUyMG5hbWUlM0QlMjJnZXRTY2hlZHVsZSUyMiUzRSUzQyUyRm11dGF0aW9uJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmNvbnRyb2xzX2lmJTIyJTIwaWQlM0QlMjJYcmclMjQyTlMlNUVnQ04qJTNGT3BVc0cwUSUyMiUyMGRpc2FibGVkJTNEJTIydHJ1ZSUyMiUzRSUzQ211dGF0aW9uJTIwZWxzZSUzRCUyMjElMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMklGMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2NvbXBhcmUlMjIlMjBpZCUzRCUyMld4LiU3QkolNUVhX3olMkJKJTI1SUlkJTQwJTVCJTdCU0clMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJPUCUyMiUzRUVRJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyVyUzRCUyNUF5JTYwLkRpMCUyNHFlcSU3Q24lMkIlMjUlM0J1JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXVuZGVmaW5lZCUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMkIlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJjb252ZXJ0X3R5cGUlMjIlMjBpZCUzRCUyMjBTOSU1Qjl4SClsRU0teF9Edk5YVjQlMjIlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJJVEVNJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyMjU5SkglMkIoN1ZYdEd4cTlhJTJGTyglN0QlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMkElMjR6SiUzRC5vYS5LJTdDJTJDODAlM0RXJTI0UyU0MEclMjIlM0V2YXJfUmF1bSUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMkRPMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjIhLSU3Q1RZSlZjQ35XMyU3QnhYan5oS1glMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyISU3QiUzQiUyQ3BnNiU2MC4yRyU3QyU1QkxuJTJCbjFoJTYwJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRWtlaW4lMjBSYXVtJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGc3RhdGVtZW50JTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMkVMU0UlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJkZWJ1ZyUyMiUyMGlkJTNEJTIyNjclNUJzUnBMJTJCblEwNUFnJTQwMSlHNHYlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIydWMyJTJDOHQ4Qk5IdnYlMjV6JTJCSCUzQSUyMy5iJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRlc3QlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMnMlMkYlMjVGJTNGKkUpZmNPSWMlMjRteGlGJTVEdyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyQSUyNHpKJTNELm9hLkslN0MlMkM4MCUzRFclMjRTJTQwRyUyMiUzRXZhcl9SYXVtJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZzdGF0ZW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnN0YXRlbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGeG1sJTNF
            
            T Offline
            T Offline
            trojanhector
            schrieb am zuletzt editiert von
            #9

            @trojanhector
            Das hier ist noch eine hilfsfunction, die bei mir im globalen Javascript Modul läuft.

            function stringQuote({strVariable='',strQuote = '"',boolReverse = false, boolSplitQuote = false}){
                let result = "";
                let strRQuote = "";
                if(boolReverse){
                    strRQuote = boolReverse ? strQuote.split('').reverse().join(""): strQuote ;        
                }
                else if(boolSplitQuote){
                    strRQuote = strQuote.substring(1,2);
                    strQuote = strQuote.substring(0,1);        
                } else {
                    strRQuote = strQuote;
                }
                result = result.concat(strQuote,strVariable,strRQuote);
            
                return result;
            }
            
            1 Antwort Letzte Antwort
            0
            • T trojanhector

              @homoran
              Hier ist soweit mein Code, angelehnt an das Beispiel aus dem Netz.

              const schedule = require('node-schedule');
              const EventEmitter = require('events');
              class Ee extends EventEmitter {}
              
              const jobStatus = new Ee();
              
              jobStatus.on('finished', () => {
                  console.log('JOB FINISHED');
                  job.cancel();
              
                  // Preform your DB Operations here (in your case: delete job from database)
              
              });
              
              function calcSecondsFromTime(time){
                  //console.log("Time: " + time);
                  var array = time.split(":");
                  var seconds = 0; 
                  if(typeof(array[2] = "undefined")){
                      seconds = (parseInt(array[0], 10) * 60 * 60) + (parseInt(array[1], 10) * 60);        
                  } else {
                      seconds = (parseInt(array[0], 10) * 60 * 60) + (parseInt(array[1], 10) * 60) + parseInt(array[2], 10); 
                  }
                  //console.log("Array: "+ array.length +" Seconds: " + seconds);
                  //console.log(array[0] +" -- " + array[1] +" -- " + array[2] +" -- " );
                  return seconds;
              } 
              
              //So funktioniert das nicht.
              const strStart = "20:10"
              const strEnd = "21:15"
              const startTime = calcSecondsFromTime(strStart);
              const endTime = calcSecondsFromTime(strEnd);
              log("StartTime: " + startTime,"info");
              log("EndTime: " + endTime, "info");
              
              /*
              //So funktioniert das.
              const startTime = new Date(Date.now() + 5000);
              const endTime = new Date(startTime.getTime() + 5000);
              */
              
              const job = schedule.scheduleJob({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function(){
              
                  console.log('Time for tea!');
                          if (this.nextInvocation() === null) {
                        //here you can code whatever you need to do in the last invocation
                  jobStatus.emit('finished'); // Emit your job done emitter when you are done.            
                      }
              
              });
              

              Das mit dem jeweiligen Timestamp um Mitternacht setzt immer eine Bearbeitung voraus. Mein Ziel ist es aber einmal Start und Ende als hh:mm anzugeben und dann nicht mehr.

              Wenn ich in Blockly den Wizard vom kleinen Cron Bauteil nehme, kann ich da Start und Endzeit eingeben.
              Dann kommt als JS sowas raus:
              '{"time":{"start":"08:00","end":"20:00","mode":"minutes","interval":2},"period":{"days":1}}'
              Und das habe ich mit den Werten aus den Objekten nachgebaut und es funktioniert.

              Hier ist mein Ansatz als Blockly. Den Teil mit nextInvocation ist in der function createSchedule als Block auskommentiert, da er Fehler schmeißt und den Adapter zum Neustart zwingt.

              var cronConditions, modus, conditions, rootdp, ObjectID, var_CronConditions, dp, var_Raum, schedule1;
              
              // Beschreibe diese Funktion …
              async function getSchedule() {
                  const list = getSchedules(false);
                  list.forEach(schedule => log(JSON.stringify(schedule)));
              }
              
              // Beschreibe diese Funktion …
              async function createSchedule(cronConditions) {
                  let testSched = null;
                  const EventEmitter = require('events');
                  class Ee extends EventEmitter {}
                  
                  const jobStatus = new Ee();
                  //log("cronConditions: " + cronConditions,"info");
                  
                  jobStatus.on('finished', () => {
                      console.log('JOB FINISHED');
                      job.cancel();
                       // Preform your DB Operations here (in your case: delete job from database)
                  
                  });
                     
                  (() => { if (testSched) { clearSchedule(testSched); testSched = null; }})();
                  //log("TestSchedCond: " + cronConditions,"warn");
                    console.info('Hier wird der TESTScheduler gesetzt');
                    (() => { if (testSched) { clearSchedule(testSched); testSched = null; }})();
                  
                    testSched = schedule((await buildCronRule('time', cronConditions)), function() {
                      console.info('Hier läuft der TESTTrigger');
                      /*
                      if (this.nextInvocation() === null) {
                              //here you can code whatever you need to do in the last invocation
                          jobStatus.emit('finished'); // Emit your job done emitter when you are done.            
                              }
                              */
                    });
                   
                  
              
              }
              
              // Beschreibe diese Funktion …
              async function buildCronRule(modus, conditions) {
                  let result = "";
                  let resultStart = "";
                  let ovalPeriod = "";
                  
                  conditions.forEach(function (line,index, array) {
                  
                      /*
                          '{"time":{"start":"08:00","end":"20:00","mode":"minutes","interval":2},"period":{"days":1}}'
                      */
                      let okey = Object.keys(line);
                      let oval = line[okey];
                      okey = okey.toString().replace(/\s+/g, '');
                     
                      //log(okey,"info");
                          if(okey == "period"){
                              okey = stringQuote({strVariable: okey});
                              //log("okey is: ","info");
                              ovalPeriod = ovalPeriod.concat(okey,":", oval);
                          } else if(okey != "period") {
                          okey = stringQuote({strVariable: okey});    
                          if(typeof oval == "string"){
                              oval = stringQuote({strVariable: oval});
                          }
                          //log(okey,"warn");
                          //log("Val: " + oval + " | typeof: "+ typeof oval,"info");
                          if(index === array.length -1){
                          result =result.concat(okey,":", oval); 
                          } else {
                          result =result.concat(okey,":", oval,",");        
                          }
                  
                          }
                  
                  
                  
                  });
                  
                  result = stringQuote({strVariable: result,strQuote: "{}", boolSplitQuote: true});
                  //log(ovalPeriod,"warn");
                  
                  switch(modus){
                      case "time":
                          resultStart = "time";
                  
                      default:
                          resultStart = "time";
                  }
                  resultStart = stringQuote({strVariable: resultStart});
                  resultStart = "".concat(resultStart,":") ;
                  
                  
                  result = "".concat(resultStart, result,",", ovalPeriod);
                  
                  result = stringQuote({strVariable:result,strQuote:"{}",boolSplitQuote: true }) ;
                  //log(result,"warn");
                  
                  
                  return result;
              }
              
              // Beschreibe diese Funktion …
              async function getCronConditions(rootdp) {
                  let result = [];
                  log("getCronConds","warn");
                  const dps = $(rootdp).toArray();
                  log(dps);
                  dps.forEach((id) => {
                      const dpval = getState(id).val;
                      const dp = splittVariable(id,"last",".");
                      let obj = {};
                      obj[dp] = dpval;
                      result.push(obj);
                  });
                      //log(result,"warn");
                  return result;
              }
              
              // Beschreibe diese Funktion …
              async function gl_leseRaum(ObjectID) {
                  let room = leseRaum(ObjectID);
                  return room;
              }
              
              // Beschreibe diese Funktion …
              async function runTest(dp) {
                console.info('Hier wird der Scheduler gesetzt');
                (() => { if (schedule1) { clearSchedule(schedule1); schedule1 = null; }})();
                schedule1 = schedule((await buildCronRule('time', var_CronConditions)), async () => {
                  console.info('Hier läuft der Trigger');
                });
                await getSchedule();
              }
              
              
              var_CronConditions = await getCronConditions('0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*');
              console.info((await buildCronRule('time', var_CronConditions)));
              console.info(var_CronConditions);
              await createSchedule(var_CronConditions);
              await getSchedule();
              on({ id: [].concat(Array.prototype.slice.apply($('state[state.id=0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*]'))), change: 'any' }, async (obj) => {
                let value = obj.state.val;
                let oldValue = obj.oldState.val;
                var_CronConditions = await getCronConditions('0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*');
                await runTest(var_CronConditions);
              });
              
              //JTNDeG1sJTIweG1sbnMlM0QlMjJodHRwcyUzQSUyRiUyRmRldmVsb3BlcnMuZ29vZ2xlLmNvbSUyRmJsb2NrbHklMkZ4bWwlMjIlM0UlM0N2YXJpYWJsZXMlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyYyU1QiUzQVd3aiU3QnNpd3JOJTJGRiU1RSglNjBoTHclMjIlM0Vjcm9uQ29uZGl0aW9ucyUzQyUyRnZhcmlhYmxlJTNFJTNDdmFyaWFibGUlMjBpZCUzRCUyMlVRaCUyNVMhJTVERyU3Qig4UUU3YW9SRkNvJTIyJTNFbW9kdXMlM0MlMkZ2YXJpYWJsZSUzRSUzQ3ZhcmlhYmxlJTIwaWQlM0QlMjJtUnhrcSklNUQxMUclMkYqVlglNDBxdkxkRCUyMiUzRWNvbmRpdGlvbnMlM0MlMkZ2YXJpYWJsZSUzRSUzQ3ZhcmlhYmxlJTIwaWQlM0QlMjJvNk51LUZjQnZEMyUyNHIlMkYlN0QuanElNjAqJTIyJTNFcm9vdGRwJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyTSU2MGZyOS1hRyUzQVMlMkNLcSh4JTVFYTkoLiUyMiUzRU9iamVjdElEJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyNVElMkNXQkYlNUJtJTIzJTJGSCUyQ2tPIXglN0M4NCU1RCUyMiUzRWRwJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyQSUyNHpKJTNELm9hLkslN0MlMkM4MCUzRFclMjRTJTQwRyUyMiUzRXZhcl9SYXVtJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMHR5cGUlM0QlMjJjcm9uJTIyJTIwaWQlM0QlMjJzY2hlZHVsZTElMjIlM0VzY2hlZHVsZTElM0MlMkZ2YXJpYWJsZSUzRSUzQyUyRnZhcmlhYmxlcyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMkZiKE9oV3BGJTdEbmMlM0ZHZDB0ODIlMjQpJTIyJTIweCUzRCUyMjYzJTIyJTIweSUzRCUyMjM4JTIyJTNFJTNDbXV0YXRpb24lMjBzdGF0ZW1lbnRzJTNEJTIyZmFsc2UlMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VnZXRTY2hlZHVsZSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU0NSSVBUJTIyJTNFWTI5dWMzUWdiR2x6ZENBOUlHZGxkRk5qYUdWa2RXeGxjeWhtWVd4elpTazdEUXBzYVhOMExtWnZja1ZoWTJnb2MyTm9aV1IxYkdVZ1BUNGdiRzluS0VwVFQwNHVjM1J5YVc1bmFXWjVLSE5qYUdWa2RXeGxLU2twT3clM0QlM0QlM0MlMkZmaWVsZCUzRSUzQ2NvbW1lbnQlMjBwaW5uZWQlM0QlMjJmYWxzZSUyMiUyMGglM0QlMjI4MCUyMiUyMHclM0QlMjIxNjAlMjIlM0VCZXNjaHJlaWJlJTIwZGllc2UlMjBGdW5rdGlvbiUyMCVFMiU4MCVBNiUzQyUyRmNvbW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMnIlNUV0KWQhLlQlNURtJTJCR1hoMCUyNTlYUUklMjIlMjB4JTNEJTIyNjMlMjIlMjB5JTNEJTIyNjMlMjIlM0UlM0NtdXRhdGlvbiUyMHN0YXRlbWVudHMlM0QlMjJmYWxzZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjcm9uQ29uZGl0aW9ucyUyMiUyMHZhcmlkJTNEJTIyYyU1QiUzQVd3aiU3QnNpd3JOJTJGRiU1RSglNjBoTHclMjIlM0UlM0MlMkZhcmclM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VjcmVhdGVTY2hlZHVsZSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU0NSSVBUJTIyJTNFYkdWMElIUmxjM1JUWTJobFpDQTlJRzUxYkd3N0RRcGpiMjV6ZENCRmRtVnVkRVZ0YVhSMFpYSWdQU0J5WlhGMWFYSmxLQ2RsZG1WdWRITW5LVHNOQ21Oc1lYTnpJRVZsSUdWNGRHVnVaSE1nUlhabGJuUkZiV2wwZEdWeUlIdDlEUW9OQ21OdmJuTjBJR3B2WWxOMFlYUjFjeUE5SUc1bGR5QkZaU2dwT3cwS0x5OXNiMmNvSW1OeWIyNURiMjVrYVhScGIyNXpPaUFpSUNzZ1kzSnZia052Ym1ScGRHbHZibk1zSW1sdVptOGlLVHNOQ2cwS2FtOWlVM1JoZEhWekxtOXVLQ2RtYVc1cGMyaGxaQ2NzSUNncElEMCUyQklIc05DaUFnSUNCamIyNXpiMnhsTG14dlp5Z25TazlDSUVaSlRrbFRTRVZFSnlrN0RRb2dJQ0FnYW05aUxtTmhibU5sYkNncE93MEtJQ0FnSUNBdkx5QlFjbVZtYjNKdElIbHZkWElnUkVJZ1QzQmxjbUYwYVc5dWN5Qm9aWEpsSUNocGJpQjViM1Z5SUdOaGMyVTZJR1JsYkdWMFpTQnFiMklnWm5KdmJTQmtZWFJoWW1GelpTa05DZzBLZlNrN0RRb2dJQ0FOQ2lnb0tTQTlQaUI3SUdsbUlDaDBaWE4wVTJOb1pXUXBJSHNnWTJ4bFlYSlRZMmhsWkhWc1pTaDBaWE4wVTJOb1pXUXBPeUIwWlhOMFUyTm9aV1FnUFNCdWRXeHNPeUI5ZlNrb0tUc05DaTh2Ykc5bktDSlVaWE4wVTJOb1pXUkRiMjVrT2lBaUlDc2dZM0p2YmtOdmJtUnBkR2x2Ym5Nc0luZGhjbTRpS1RzTkNpQWdZMjl1YzI5c1pTNXBibVp2S0NkSWFXVnlJSGRwY21RZ1pHVnlJRlJGVTFSVFkyaGxaSFZzWlhJZ1oyVnpaWFI2ZENjcE93MEtJQ0FvS0NrZ1BUNGdleUJwWmlBb2RHVnpkRk5qYUdWa0tTQjdJR05zWldGeVUyTm9aV1IxYkdVb2RHVnpkRk5qYUdWa0tUc2dkR1Z6ZEZOamFHVmtJRDBnYm5Wc2JEc2dmWDBwS0NrN0RRb05DaUFnZEdWemRGTmphR1ZrSUQwZ2MyTm9aV1IxYkdVb0tHRjNZV2wwSUdKMWFXeGtRM0p2YmxKMWJHVW9KM1JwYldVbkxDQmpjbTl1UTI5dVpHbDBhVzl1Y3lrcExDQm1kVzVqZEdsdmJpZ3BJSHNOQ2lBZ0lDQmpiMjV6YjJ4bExtbHVabThvSjBocFpYSWdiTU9rZFdaMElHUmxjaUJVUlZOVVZISnBaMmRsY2ljcE93MEtJQ0FnSUM4cURRb2dJQ0FnYVdZZ0tIUm9hWE11Ym1WNGRFbHVkbTlqWVhScGIyNG9LU0E5UFQwZ2JuVnNiQ2tnZXcwS0lDQWdJQ0FnSUNBZ0lDQWdMeTlvWlhKbElIbHZkU0JqWVc0Z1kyOWtaU0IzYUdGMFpYWmxjaUI1YjNVZ2JtVmxaQ0IwYnlCa2J5QnBiaUIwYUdVZ2JHRnpkQ0JwYm5adlkyRjBhVzl1RFFvZ0lDQWdJQ0FnSUdwdllsTjBZWFIxY3k1bGJXbDBLQ2RtYVc1cGMyaGxaQ2NwT3lBdkx5QkZiV2wwSUhsdmRYSWdhbTlpSUdSdmJtVWdaVzFwZEhSbGNpQjNhR1Z1SUhsdmRTQmhjbVVnWkc5dVpTNGdJQ0FnSUNBZ0lDQWdJQ0FOQ2lBZ0lDQWdJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdJQ0FnSUNvdkRRb2dJSDBwT3cwS0lBMEtEUW8lM0QlM0MlMkZmaWVsZCUzRSUzQ2NvbW1lbnQlMjBwaW5uZWQlM0QlMjJmYWxzZSUyMiUyMGglM0QlMjI4MCUyMiUyMHclM0QlMjIxNjAlMjIlM0VCZXNjaHJlaWJlJTIwZGllc2UlMjBGdW5rdGlvbiUyMCVFMiU4MCVBNiUzQyUyRmNvbW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tcmV0dXJuJTIyJTIwaWQlM0QlMjJzJTVFJTJDZkhEJTNBZEMlMjRkb2VoJTQwRSUyRjNhMSUyMiUyMHglM0QlMjI2MyUyMiUyMHklM0QlMjI4OCUyMiUzRSUzQ211dGF0aW9uJTIwc3RhdGVtZW50cyUzRCUyMmZhbHNlJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMm1vZHVzJTIyJTIwdmFyaWQlM0QlMjJVUWglMjVTISU1REclN0IoOFFFN2FvUkZDbyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTIwdmFyaWQlM0QlMjJtUnhrcSklNUQxMUclMkYqVlglNDBxdkxkRCUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRWJ1aWxkQ3JvblJ1bGUlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNDUklQVCUyMiUzRWJHVjBJSEpsYzNWc2RDQTlJQ0lpT3cwS2JHVjBJSEpsYzNWc2RGTjBZWEowSUQwZ0lpSTdEUXBzWlhRZ2IzWmhiRkJsY21sdlpDQTlJQ0lpT3cwS0RRcGpiMjVrYVhScGIyNXpMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNGdLR3hwYm1Vc2FXNWtaWGdzSUdGeWNtRjVLU0I3RFFvTkNpQWdJQ0F2S2cwS0lDQWdJQ0FnSUNBbmV5SjBhVzFsSWpwN0luTjBZWEowSWpvaU1EZzZNREFpTENKbGJtUWlPaUl5TURvd01DSXNJbTF2WkdVaU9pSnRhVzUxZEdWeklpd2lhVzUwWlhKMllXd2lPako5TENKd1pYSnBiMlFpT25zaVpHRjVjeUk2TVgxOUp3MEtJQ0FnSUNvdkRRb2dJQ0FnYkdWMElHOXJaWGtnUFNCUFltcGxZM1F1YTJWNWN5aHNhVzVsS1RzTkNpQWdJQ0JzWlhRZ2IzWmhiQ0E5SUd4cGJtVmJiMnRsZVYwN0RRb2dJQ0FnYjJ0bGVTQTlJRzlyWlhrdWRHOVRkSEpwYm1jb0tTNXlaWEJzWVdObEtDOWNjeXN2Wnl3Z0p5Y3BPdzBLSUNBZ0RRb2dJQ0FnTHk5c2IyY29iMnRsZVN3aWFXNW1ieUlwT3cwS0lDQWdJQ0FnSUNCcFppaHZhMlY1SUQwOUlDSndaWEpwYjJRaUtYc05DaUFnSUNBZ0lDQWdJQ0FnSUc5clpYa2dQU0J6ZEhKcGJtZFJkVzkwWlNoN2MzUnlWbUZ5YVdGaWJHVTZJRzlyWlhsOUtUc05DaUFnSUNBZ0lDQWdJQ0FnSUM4dmJHOW5LQ0p2YTJWNUlHbHpPaUFpTENKcGJtWnZJaWs3RFFvZ0lDQWdJQ0FnSUNBZ0lDQnZkbUZzVUdWeWFXOWtJRDBnYjNaaGJGQmxjbWx2WkM1amIyNWpZWFFvYjJ0bGVTd2lPaUlzSUc5MllXd3BPdzBLSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lvYjJ0bGVTQWhQU0FpY0dWeWFXOWtJaWtnZXcwS0lDQWdJQ0FnSUNCdmEyVjVJRDBnYzNSeWFXNW5VWFZ2ZEdVb2UzTjBjbFpoY21saFlteGxPaUJ2YTJWNWZTazdJQ0FnSUEwS0lDQWdJQ0FnSUNCcFppaDBlWEJsYjJZZ2IzWmhiQ0E5UFNBaWMzUnlhVzVuSWlsN0RRb2dJQ0FnSUNBZ0lDQWdJQ0J2ZG1Gc0lEMGdjM1J5YVc1blVYVnZkR1VvZTNOMGNsWmhjbWxoWW14bE9pQnZkbUZzZlNrN0RRb2dJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdMeTlzYjJjb2IydGxlU3dpZDJGeWJpSXBPdzBLSUNBZ0lDQWdJQ0F2TDJ4dlp5Z2lWbUZzT2lBaUlDc2diM1poYkNBcklDSWdmQ0IwZVhCbGIyWTZJQ0lySUhSNWNHVnZaaUJ2ZG1Gc0xDSnBibVp2SWlrN0RRb2dJQ0FnSUNBZ0lHbG1LR2x1WkdWNElEMDlQU0JoY25KaGVTNXNaVzVuZEdnZ0xURXBldzBLSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQWEpsYzNWc2RDNWpiMjVqWVhRb2IydGxlU3dpT2lJc0lHOTJZV3dwT3lBTkNpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUhzTkNpQWdJQ0FnSUNBZ2NtVnpkV3gwSUQxeVpYTjFiSFF1WTI5dVkyRjBLRzlyWlhrc0lqb2lMQ0J2ZG1Gc0xDSXNJaWs3SUNBZ0lDQWdJQ0FOQ2lBZ0lDQWdJQ0FnZlEwS0RRb2dJQ0FnSUNBZ0lIME5DZzBLRFFvTkNuMHBPdzBLRFFweVpYTjFiSFFnUFNCemRISnBibWRSZFc5MFpTaDdjM1J5Vm1GeWFXRmliR1U2SUhKbGMzVnNkQ3h6ZEhKUmRXOTBaVG9nSW50OUlpd2dZbTl2YkZOd2JHbDBVWFZ2ZEdVNklIUnlkV1Y5S1RzTkNpOHZiRzluS0c5MllXeFFaWEpwYjJRc0luZGhjbTRpS1RzTkNnMEtjM2RwZEdOb0tHMXZaSFZ6S1hzTkNpQWdJQ0JqWVhObElDSjBhVzFsSWpvTkNpQWdJQ0FnSUNBZ2NtVnpkV3gwVTNSaGNuUWdQU0FpZEdsdFpTSTdEUW9OQ2lBZ0lDQmtaV1poZFd4ME9nMEtJQ0FnSUNBZ0lDQnlaWE4xYkhSVGRHRnlkQ0E5SUNKMGFXMWxJanNOQ24wTkNuSmxjM1ZzZEZOMFlYSjBJRDBnYzNSeWFXNW5VWFZ2ZEdVb2UzTjBjbFpoY21saFlteGxPaUJ5WlhOMWJIUlRkR0Z5ZEgwcE93MEtjbVZ6ZFd4MFUzUmhjblFnUFNBaUlpNWpiMjVqWVhRb2NtVnpkV3gwVTNSaGNuUXNJam9pS1NBN0RRb05DZzBLY21WemRXeDBJRDBnSWlJdVkyOXVZMkYwS0hKbGMzVnNkRk4wWVhKMExDQnlaWE4xYkhRc0lpd2lMQ0J2ZG1Gc1VHVnlhVzlrS1RzTkNnMEtjbVZ6ZFd4MElEMGdjM1J5YVc1blVYVnZkR1VvZTNOMGNsWmhjbWxoWW14bE9uSmxjM1ZzZEN4emRISlJkVzkwWlRvaWUzMGlMR0p2YjJ4VGNHeHBkRkYxYjNSbE9pQjBjblZsSUgwcElEc05DaTh2Ykc5bktISmxjM1ZzZEN3aWQyRnliaUlwT3cwS0RRb05DbkpsZEhWeWJpQnlaWE4xYkhRNyUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19kZWZjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMiU3QjBjVyUzRjBWJTdCJTIzb05+fipzMzAwMkklMjIlMjB4JTNEJTIyNjMlMjIlMjB5JTNEJTIyMTEzJTIyJTNFJTNDbXV0YXRpb24lMjBzdGF0ZW1lbnRzJTNEJTIyZmFsc2UlMjIlM0UlM0NhcmclMjBuYW1lJTNEJTIycm9vdGRwJTIyJTIwdmFyaWQlM0QlMjJvNk51LUZjQnZEMyUyNHIlMkYlN0QuanElNjAqJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOQU1FJTIyJTNFZ2V0Q3JvbkNvbmRpdGlvbnMlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNDUklQVCUyMiUzRWJHVjBJSEpsYzNWc2RDQTlJRnRkT3cwS2JHOW5LQ0puWlhSRGNtOXVRMjl1WkhNaUxDSjNZWEp1SWlrN0RRcGpiMjV6ZENCa2NITWdQU0FrS0hKdmIzUmtjQ2t1ZEc5QmNuSmhlU2dwT3cwS2JHOW5LR1J3Y3lrN0RRcGtjSE11Wm05eVJXRmphQ2dvYVdRcElEMCUyQklIc05DaUFnSUNCamIyNXpkQ0JrY0haaGJDQTlJR2RsZEZOMFlYUmxLR2xrS1M1MllXdzdEUW9nSUNBZ1kyOXVjM1FnWkhBZ1BTQnpjR3hwZEhSV1lYSnBZV0pzWlNocFpDd2liR0Z6ZENJc0lpNGlLVHNOQ2lBZ0lDQnNaWFFnYjJKcUlEMGdlMzA3RFFvZ0lDQWdiMkpxVzJSd1hTQTlJR1J3ZG1Gc093MEtJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tHOWlhaWs3RFFwOUtUc05DaUFnSUNBdkwyeHZaeWh5WlhOMWJIUXNJbmRoY200aUtUc05DbkpsZEhWeWJpQnlaWE4xYkhRNyUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19kZWZjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMlhZU185WiUzQmZOJTNENi5XKjdCMDEzYiUyMiUyMHglM0QlMjI2MyUyMiUyMHklM0QlMjIxMzglMjIlM0UlM0NtdXRhdGlvbiUyMHN0YXRlbWVudHMlM0QlMjJmYWxzZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJPYmplY3RJRCUyMiUyMHZhcmlkJTNEJTIyTSU2MGZyOS1hRyUzQVMlMkNLcSh4JTVFYTkoLiUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRWdsX2xlc2VSYXVtJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTQ1JJUFQlMjIlM0ViR1YwSUhKdmIyMGdQU0JzWlhObFVtRjFiU2hQWW1wbFkzUkpSQ2s3RFFweVpYUjFjbTRnY205dmJUcyUzRCUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyNHUlNDB0Tl9tZCklM0ElNUQlNDBLJTQwMG9yQyU1RHclMjIlMjBkaXNhYmxlZCUzRCUyMnRydWUlMjIlMjB4JTNEJTIyMTA2MyUyMiUyMHklM0QlMjIxODglMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFJTdCJTIydGltZSUyMiUzQSU3QiUyMmVuZCUyMiUzQSUyMjIwJTNBMDAlMjIlMkMlMjJpbnRlcnZhbCUyMiUzQTIlMkMlMjJtb2RlJTIyJTNBJTIybWludXRlcyUyMiUyQyUyMnN0YXJ0JTIyJTNBJTIyMDglM0EwMCUyMiU3RCUyQyUyMnBlcmlvZCUyMiUzQSU3QiUyMmRheXMlMjIlM0ExJTdEJTdEJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19zZXQlMjIlMjBpZCUzRCUyMkwlNUJxNkQlNURtREJvV1klNURLTCUzQWNoJTI1ZCUyMiUyMHglM0QlMjIxMiUyMiUyMHklM0QlMjIyNjklMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVkFMVUUlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMjllcGslMkNDbyUyQzZlRVFUMDRhXyU0ME1xJTIyJTIwaW5saW5lJTNEJTIydHJ1ZSUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmdldENyb25Db25kaXRpb25zJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMnJvb3RkcCUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQVJHMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnRleHQlMjIlMjBpZCUzRCUyMjJ4V3AyTn5VJTdDVmguTkJwVzQlNURwVCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UwX3VzZXJkYXRhLjAuUm9sbGFkZW4uQWxsZ2VtZWluLlNjaGF0dGVuLmNyb25Db25kaXRpb25zLiolM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjJuJTNCVCUzRDhqT1J+JTNGTjBWOHYuQUVvSyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNldmVyaXR5JTIyJTNFaW5mbyUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRSUzQ3NoYWRvdyUyMHR5cGUlM0QlMjJ0ZXh0JTIyJTIwaWQlM0QlMjJEU1NtcWElN0MxbV9EcCUzRCF6UVE0dVMlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFdGVzdCUzQyUyRmZpZWxkJTNFJTNDJTJGc2hhZG93JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsY3VzdG9tcmV0dXJuJTIyJTIwaWQlM0QlMjIuOVlnRi1GTTlFVkh6RXY0JTIzZzElMkYlMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyYnVpbGRDcm9uUnVsZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJtb2R1cyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIySG1HOCUzQkolMkJaWCUzRnlwJTdEJTI0cyUyNWxZRyU3RCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0V0aW1lJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQVJHMSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMnE2RjZsJTdCVUpYJTNGM1Y5dHUlNDAhamxlJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVkFSJTIyJTIwaWQlM0QlMjIuaDZYVyUyNXFfWUMlM0RoMmFfLXhMOVMlMjIlM0V2YXJfQ3JvbkNvbmRpdGlvbnMlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjIlMkJKfmklNDBLMEZhJTdCeTBkKiUzQkFXbjglN0IlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyRFNTbXFhJTdDMW1fRHAlM0QhelFRNHVTJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRlc3QlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMkIzViFiSkclMkNOcUJ0Y0lfc1RRdW0lMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21ub3JldHVybiUyMiUyMGlkJTNEJTIyc2RVaWN0fiU0MFglN0JDKVhKS34lMkMoJTNESCUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmNyZWF0ZVNjaGVkdWxlJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmNyb25Db25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyOSElMjMlMjMlM0I1JTdCJTNCNDUzJTJGVXglM0FCN2hMWiUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfY2FsbGN1c3RvbW5vcmV0dXJuJTIyJTIwaWQlM0QlMjJyJTIzSG1iVW4uTUt3aEk4flZpNl9CJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyZ2V0U2NoZWR1bGUlMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJvbl9leHQlMjIlMjBpZCUzRCUyMmZ0UG9VZ0hNdG8lM0ElNUV6cDElN0JzWlktJTIyJTNFJTNDbXV0YXRpb24lMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhodG1sJTIyJTIwaXRlbXMlM0QlMjIxJTIyJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJDT05ESVRJT04lMjIlM0VhbnklM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkFDS19DT05ESVRJT04lMjIlM0UlM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMk9JRDAlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIyZmllbGRfb2lkJTIyJTIwaWQlM0QlMjJTdTdCel9wJTdCMjMuU00lM0R0Rn5+dWYlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJvaWQlMjIlM0VJRCUyMGF1c3clQzMlQTRobGVuJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0NibG9jayUyMHR5cGUlM0QlMjJzZWxlY3RvciUyMiUyMGlkJTNEJTIyWS5kanRib0x2KkxTTVEqdSUyNTclMkNkJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXN0YXRlJTVCc3RhdGUuaWQlM0QwX3VzZXJkYXRhLjAuUm9sbGFkZW4uQWxsZ2VtZWluLlNjaGF0dGVuLmNyb25Db25kaXRpb25zLiolNUQlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NzdGF0ZW1lbnQlMjBuYW1lJTNEJTIyU1RBVEVNRU5UJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX3NldCUyMiUyMGlkJTNEJTIyR1UwViUzRFBUSHdPby41MXVkKHVPSSUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJWQUxVRSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfY2FsbGN1c3RvbXJldHVybiUyMiUyMGlkJTNEJTIyLUhJJTVEKFZSaCloJTYwKCUzQmhiWkwxQ1YlMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyZ2V0Q3JvbkNvbmRpdGlvbnMlMjIlM0UlM0NhcmclMjBuYW1lJTNEJTIycm9vdGRwJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyd0hCa1QlMkJWcSUyM045UzchdWtMZWw2JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRTBfdXNlcmRhdGEuMC5Sb2xsYWRlbi5BbGxnZW1laW4uU2NoYXR0ZW4uY3JvbkNvbmRpdGlvbnMuKiUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsbm9yZXR1cm4lMjIlMjBpZCUzRCUyMiU0MCgyZnlXIVRoYWpON19OWml6RmYlMjIlM0UlM0NtdXRhdGlvbiUyMG5hbWUlM0QlMjJydW5UZXN0JTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmRwJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyYTg2S04uJTdCc3IlMjN2JTNBJTQwZiUzQXUlN0J+Qk0lMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGc3RhdGVtZW50JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2RlZm5vcmV0dXJuJTIyJTIwaWQlM0QlMjJseS0lN0RZRSUyM1pxJTJCUW8lNURtfiUyRllRblElMjIlMjB4JTNEJTIyOTg4JTIyJTIweSUzRCUyMjMxMyUyMiUzRSUzQ211dGF0aW9uJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmRwJTIyJTIwdmFyaWQlM0QlMjI1USUyQ1dCRiU1Qm0lMjMlMkZIJTJDa08heCU3Qzg0JTVEJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOQU1FJTIyJTNFcnVuVGVzdCUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQ3N0YXRlbWVudCUyMG5hbWUlM0QlMjJTVEFDSyUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjJXJTNBViUzRlNLKElqM1hPJTQwTnNGKSUyM3AtJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU2V2ZXJpdHklMjIlM0VpbmZvJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJURVhUJTIyJTNFJTNDc2hhZG93JTIwdHlwZSUzRCUyMnRleHQlMjIlMjBpZCUzRCUyMjdieiU1RU9JJTI1MUhIZ0gwYS1zeiUyQiU1REQlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFSGllciUyMHdpcmQlMjBkZXIlMjBTY2hlZHVsZXIlMjBnZXNldHp0JTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0MlMkZ2YWx1ZSUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJ2YXJpYWJsZXNfc2V0JTIyJTIwaWQlM0QlMjJ6bSFITVA3X1pOViUyMyUyRikpQndNcVglMjIlMjBkaXNhYmxlZCUzRCUyMnRydWUlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMkElMjR6SiUzRC5vYS5LJTdDJTJDODAlM0RXJTI0UyU0MEclMjIlM0V2YXJfUmF1bSUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVkFMVUUlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMkJWJTQwTDJaNCUzQjFVSCUzRiU1RCU1QmFXRDQ0eiUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmdsX2xlc2VSYXVtJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMk9iamVjdElEJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyNnRXQWJFNlpEMmElN0JHTkEtQ3UlMjM0JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVkFSJTIyJTIwaWQlM0QlMjI1USUyQ1dCRiU1Qm0lMjMlMkZIJTJDa08heCU3Qzg0JTVEJTIyJTNFZHAlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnNjaGVkdWxlX2NsZWFyJTIyJTIwaWQlM0QlMjIpYzElMjMlM0JCTkNNaWoyJTNEJTJCJTJDTWklMjRfcyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VzY2hlZHVsZTElM0MlMkZmaWVsZCUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJzY2hlZHVsZV9jcmVhdGUlMjIlMjBpZCUzRCUyMiUyNCglMjQlNUJ0ZDVscjhKJTNCZiUzQjlFejhUJTdDJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRXNjaGVkdWxlMSUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyU0NIRURVTEUlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIyZmllbGRfY3JvbiUyMiUyMGlkJTNEJTIydSElMkIlNUIhJTIzby0lNUV5YSU3RHlSQXF+VC5FJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQ1JPTiUyMiUzRSolMjAqJTIwKiUyMColMjAqJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMnd3JTNGWFMqfl9UTHh0ZUY5S09aenglMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyYnVpbGRDcm9uUnVsZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJtb2R1cyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyMyg1YTBNLWMlNDAxVWwoRERVUlQlMkM2JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRpbWUlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcxJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIySzlBVU1oJTQwMFZyJTNBLThtVTN+JTdCcmElMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NzdGF0ZW1lbnQlMjBuYW1lJTNEJTIyU1RBVEVNRU5UJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIyZGVidWclMjIlMjBpZCUzRCUyMk0lMkY4RipPeGQqTVc0NSU3RCUyNWgpWDQlN0IlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyRyUzRCU1RFAyZ3pMJTVCbUUlM0ZlMC1xLS5DLiUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0VIaWVyJTIwbCVDMyVBNHVmdCUyMGRlciUyMFRyaWdnZXIlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQyUyRnZhbHVlJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZzdGF0ZW1lbnQlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMmJOJTdCcC0lN0JJYnAhJTdEJTJCRktnSWRBaF8lMjIlM0UlM0NtdXRhdGlvbiUyMG5hbWUlM0QlMjJnZXRTY2hlZHVsZSUyMiUzRSUzQyUyRm11dGF0aW9uJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmNvbnRyb2xzX2lmJTIyJTIwaWQlM0QlMjJYcmclMjQyTlMlNUVnQ04qJTNGT3BVc0cwUSUyMiUyMGRpc2FibGVkJTNEJTIydHJ1ZSUyMiUzRSUzQ211dGF0aW9uJTIwZWxzZSUzRCUyMjElMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMklGMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2NvbXBhcmUlMjIlMjBpZCUzRCUyMld4LiU3QkolNUVhX3olMkJKJTI1SUlkJTQwJTVCJTdCU0clMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJPUCUyMiUzRUVRJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyVyUzRCUyNUF5JTYwLkRpMCUyNHFlcSU3Q24lMkIlMjUlM0J1JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXVuZGVmaW5lZCUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMkIlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJjb252ZXJ0X3R5cGUlMjIlMjBpZCUzRCUyMjBTOSU1Qjl4SClsRU0teF9Edk5YVjQlMjIlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJJVEVNJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyMjU5SkglMkIoN1ZYdEd4cTlhJTJGTyglN0QlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMkElMjR6SiUzRC5vYS5LJTdDJTJDODAlM0RXJTI0UyU0MEclMjIlM0V2YXJfUmF1bSUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMkRPMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjIhLSU3Q1RZSlZjQ35XMyU3QnhYan5oS1glMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyISU3QiUzQiUyQ3BnNiU2MC4yRyU3QyU1QkxuJTJCbjFoJTYwJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRWtlaW4lMjBSYXVtJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGc3RhdGVtZW50JTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMkVMU0UlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJkZWJ1ZyUyMiUyMGlkJTNEJTIyNjclNUJzUnBMJTJCblEwNUFnJTQwMSlHNHYlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIydWMyJTJDOHQ4Qk5IdnYlMjV6JTJCSCUzQSUyMy5iJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRlc3QlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMnMlMkYlMjVGJTNGKkUpZmNPSWMlMjRteGlGJTVEdyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyQSUyNHpKJTNELm9hLkslN0MlMkM4MCUzRFclMjRTJTQwRyUyMiUzRXZhcl9SYXVtJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZzdGF0ZW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnN0YXRlbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGeG1sJTNF
              
              OliverIOO Offline
              OliverIOO Offline
              OliverIO
              schrieb am zuletzt editiert von OliverIO
              #10

              @trojanhector

              Soweit ich das grob überblicke, liegt das Problem in deiner Funktion calcSecondsFromTime
              Das berechnet sozusagen die Anzahl der Sekunden seit Mitternacht
              Node-schedule möchte aber ein Jahr was Skript Datum Objekt, was die Anzahl an Millisekunden seit dem 1.1.1970 beinhaltet. Das musst du noch berücksichtigen.
              Aus diesem Grund funktioniert auch das Beispiel, welches du aus der Dokumentation kopiert hast.
              Dort wird das Date Objekt verwendet, welches du nicht verwändest

              So wie du es jetzt verwändest, wird der Job auch nur einmalig gestartet.
              Wenn du es wiederholt gestartet haben möchtest, musst du unter Recurring schauen

              Wenn du es noch einfacher machen möchtest, schaue meinen Adapter
              Mytime an.
              Dort kannst du beliebige Zeitreihen definieren, zu denen dann ein Datenpunkt für eine definierbar a Zeit lang getriggert wird. Auf diesen Daten. Kannst du dann reagieren und beliebige Aktionen ausführen.

              Meine Adapter und Widgets
              TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
              Links im Profil

              T 1 Antwort Letzte Antwort
              0
              • OliverIOO OliverIO

                @trojanhector

                Soweit ich das grob überblicke, liegt das Problem in deiner Funktion calcSecondsFromTime
                Das berechnet sozusagen die Anzahl der Sekunden seit Mitternacht
                Node-schedule möchte aber ein Jahr was Skript Datum Objekt, was die Anzahl an Millisekunden seit dem 1.1.1970 beinhaltet. Das musst du noch berücksichtigen.
                Aus diesem Grund funktioniert auch das Beispiel, welches du aus der Dokumentation kopiert hast.
                Dort wird das Date Objekt verwendet, welches du nicht verwändest

                So wie du es jetzt verwändest, wird der Job auch nur einmalig gestartet.
                Wenn du es wiederholt gestartet haben möchtest, musst du unter Recurring schauen

                Wenn du es noch einfacher machen möchtest, schaue meinen Adapter
                Mytime an.
                Dort kannst du beliebige Zeitreihen definieren, zu denen dann ein Datenpunkt für eine definierbar a Zeit lang getriggert wird. Auf diesen Daten. Kannst du dann reagieren und beliebige Aktionen ausführen.

                T Offline
                T Offline
                trojanhector
                schrieb am zuletzt editiert von
                #11

                @oliverio
                Aber wie funktionert das denn in Blockly mit dem kleinen Cron Bauteil aus den Triggern? Wenn Du da was mit dem Wizard baust, hast in JS auch nur die Uhrzeiten.

                OliverIOO 2 Antworten Letzte Antwort
                0
                • T trojanhector

                  @oliverio
                  Aber wie funktionert das denn in Blockly mit dem kleinen Cron Bauteil aus den Triggern? Wenn Du da was mit dem Wizard baust, hast in JS auch nur die Uhrzeiten.

                  OliverIOO Offline
                  OliverIOO Offline
                  OliverIO
                  schrieb am zuletzt editiert von
                  #12

                  @trojanhector

                  Für recurring musst du andere Eigenschaften verwenden. Nicht Start und end, sondern

                  RecurrenceRule properties
                  second (0-59)
                  minute (0-59)
                  hour (0-23)
                  date (1-31)
                  month (0-11)
                  year
                  dayOfWeek (0-6) Starting with Sunday
                  tz

                  Meine Adapter und Widgets
                  TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                  Links im Profil

                  1 Antwort Letzte Antwort
                  0
                  • T trojanhector

                    @oliverio
                    Aber wie funktionert das denn in Blockly mit dem kleinen Cron Bauteil aus den Triggern? Wenn Du da was mit dem Wizard baust, hast in JS auch nur die Uhrzeiten.

                    OliverIOO Offline
                    OliverIOO Offline
                    OliverIO
                    schrieb am zuletzt editiert von OliverIO
                    #13

                    @trojanhector

                    Du könntest natürlich, so wie du es machst, immer den nächsten Start berechnen und wenn der Zeitpunkt erreicht ist, wiederum den darauf folgenden Start neu berechnen.
                    Ich habe auch noch nicht ganz verstanden, was du überhaupt erreichen möchtest:

                    Du möchtest innerhalb einer Zeitspanne, dann immer wieder was erneut ausführen?
                    Also ein schedule in einem schedule?

                    Meine Adapter und Widgets
                    TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                    Links im Profil

                    T 1 Antwort Letzte Antwort
                    1
                    • OliverIOO OliverIO

                      @trojanhector

                      Du könntest natürlich, so wie du es machst, immer den nächsten Start berechnen und wenn der Zeitpunkt erreicht ist, wiederum den darauf folgenden Start neu berechnen.
                      Ich habe auch noch nicht ganz verstanden, was du überhaupt erreichen möchtest:

                      Du möchtest innerhalb einer Zeitspanne, dann immer wieder was erneut ausführen?
                      Also ein schedule in einem schedule?

                      T Offline
                      T Offline
                      trojanhector
                      schrieb am zuletzt editiert von
                      #14

                      @oliverio
                      Mein Usecase sind meine Rolladen. Ich habe eine Schattenfunction, die alle 2 Minuten überprüft, ob die Sonne scheint.
                      Wenn ja: Rolladen runter, wenn nein: Rolladen hoch. (Anmerkung: Meine Rolladen bleiben mind. 5 Minuten auf ihrer letzten Position)
                      Diese Funktion soll zwischen 08:00 und 20:00 Uhr laufen. Wenn jetzt das letzte Intervall gelaufen ist, sollen die Rolladen, unabhängig vom Sonnenschein wieder hochfahren. Früher habe ich das mit dem Zeitenvergleich zwischen Zielzeit und Executiontime gemacht. Das wollte ich jetzt umstellen auf Eventsteuerung.

                      HomoranH 1 Antwort Letzte Antwort
                      0
                      • T trojanhector

                        @oliverio
                        Mein Usecase sind meine Rolladen. Ich habe eine Schattenfunction, die alle 2 Minuten überprüft, ob die Sonne scheint.
                        Wenn ja: Rolladen runter, wenn nein: Rolladen hoch. (Anmerkung: Meine Rolladen bleiben mind. 5 Minuten auf ihrer letzten Position)
                        Diese Funktion soll zwischen 08:00 und 20:00 Uhr laufen. Wenn jetzt das letzte Intervall gelaufen ist, sollen die Rolladen, unabhängig vom Sonnenschein wieder hochfahren. Früher habe ich das mit dem Zeitenvergleich zwischen Zielzeit und Executiontime gemacht. Das wollte ich jetzt umstellen auf Eventsteuerung.

                        HomoranH Nicht stören
                        HomoranH Nicht stören
                        Homoran
                        Global Moderator Administrators
                        schrieb am zuletzt editiert von Homoran
                        #15

                        @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

                        Das wollte ich jetzt umstellen auf Eventsteuerung.

                        dann mach das doch!

                        @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

                        ob die Sonne scheint.

                        dann Trigger auf den Sonnensensor bei Änderung.

                        Anschließend
                        FALLS Wert>xy UND aktuelle Zeit ist zwischen 08:00 und 20:00
                        MACHE Rolladen auf Beschattung
                        SONST FALLS Wert <(xy-Hysterese)
                        MACHE Rollladen hoch

                        im sonst falls ggf noch eine Zeitabfrage damit der Rollladen nachts nicht hochfährt

                        edit:
                        Screenshot_20250720-220532_Firefox.jpg

                        kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                        Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                        der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                        1 Antwort Letzte Antwort
                        0
                        Antworten
                        • In einem neuen Thema antworten
                        Anmelden zum Antworten
                        • Älteste zuerst
                        • Neuste zuerst
                        • Meiste Stimmen


                        Support us

                        ioBroker
                        Community Adapters
                        Donate
                        FAQ Cloud / IOT
                        HowTo: Node.js-Update
                        HowTo: Backup/Restore
                        Downloads
                        BLOG

                        329

                        Online

                        32.7k

                        Benutzer

                        82.4k

                        Themen

                        1.3m

                        Beiträge
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                        ioBroker Community 2014-2025
                        logo
                        • Anmelden

                        • Du hast noch kein Konto? Registrieren

                        • Anmelden oder registrieren, um zu suchen
                        • Erster Beitrag
                          Letzter Beitrag
                        0
                        • Home
                        • Aktuell
                        • Tags
                        • Ungelesen 0
                        • Kategorien
                        • Unreplied
                        • Beliebt
                        • GitHub
                        • Docu
                        • Hilfe