Vor kurzem stellte unser Kollege Tobias ein Matherätsel vor, welches er sogleich mit dem Cubeware Importer löste. Die ausführliche Lösung findet ihr hier, aber das Rätsel sei an dieser Stelle noch einmal rekapituliert:

 

 

Man hat die Zahlen 1, 3, 4, 6 zur Verfügung.
Erstelle eine Gleichung, in der jede dieser Zahlen genau einmal vorkommt und das Ergebnis 24 ist.
Dabei können beliebig oft die Rechenoperationen Addieren, Subtrahieren, Multiplizieren und Dividieren, sowie beliebige Klammersetzung verwendet werden.

 

 

Die grundsätzliche Idee hinter dem Lösungsansatz wurde dort bereits genau ausgeführt, doch Tobias stellte sich nach der schönen Cubeware-Lösung dann doch bald die Frage: muss das nicht auch mit T-SQL gehen? Schließlich machen wir doch den ganzen Tag nichts anderes…
Und natürlich geht das! Wie sich herausstellt sogar deutlich schneller, denn statt knapp 6 Minuten läuft diese Lösung keine zwei Sekunden. Fairerweise sei allerdings gesagt, dass beide Lösungen nicht bis zum Letzten durchoptimiert wurden, denn ab und an lieben wir es einfach quick & dirty!

 

Hier nun also die komplette Lösung mit T-SQL:

[TS_EnlighterJS_Snippet_Single code_type=“sql“ code_theme=“classic“ code_content=“REVDTEFSRSUyMCU0MEtsYW1tZXJuJTIwVEFCTEUlMEElMjAlMjAlMjglMEElMjAlMjAlMjAlMjAlMjAlNUJrbGFtbWVyJTVEJTIwJTVCVkFSQ0hBUiU1RCUyODElMjklMjBOVUxMJTBBJTIwJTIwJTI5JTBBREVDTEFSRSUyMCU0ME9wZXJhdGlvbmVuJTIwVEFCTEUlMEElMjAlMjAlMjglMEElMjAlMjAlMjAlMjAlMjAlNUJvcGVyYXRpb24lNUQlMjAlNUJDSEFSJTVEJTI4MSUyOSUyME5VTEwlMEElMjAlMjAlMjklMEFERUNMQVJFJTIwJTQwWmFobGVuJTIwVEFCTEUlMEElMjAlMjAlMjglMEElMjAlMjAlMjAlMjAlMjAlNUJ6YWhsJTVEJTIwJTVCQ0hBUiU1RCUyODMlMjklMjBOVUxMJTBBJTIwJTIwJTI5JTBBJTBBSU5TRVJUJTIwJTQwS2xhbW1lcm4lMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjglNUJrbGFtbWVyJTVEJTI5JTBBVkFMVUVTJTIwJTI4JTI3JTI4JTI3JTI5JTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI4JTI3JTI5JTI3JTI5JTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI4JTI3JTI3JTI5JTBBJTBBSU5TRVJUJTIwJTQwT3BlcmF0aW9uZW4lMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjglNUJvcGVyYXRpb24lNUQlMjklMEFWQUxVRVMlMjAlMjglMjclMkIlMjclMjklMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjglMjctJTI3JTI5JTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI4JTI3JTJBJTI3JTI5JTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI4JTI3JTJGJTI3JTI5JTBBJTBBSU5TRVJUJTIwJTQwWmFobGVuJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI4JTVCemFobCU1RCUyOSUwQVZBTFVFUyUyMCUyOCUyNzEuMCUyNyUyOSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyOCUyNzMuMCUyNyUyOSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyOCUyNzQuMCUyNyUyOSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyOCUyNzYuMCUyNyUyOSUwQSUwQURFQ0xBUkUlMjAlNDBGb3JtZWwlMjBUQUJMRSUwQSUyMCUyMCUyOCUwQSUyMCUyMCUyMCUyMCUyMCU1QmZvcm1lbCU1RCUyMFZBUkNIQVIlMjgyNTUlMjklMEElMjAlMjAlMjklMEElMEFJTlNFUlQlMjBJTlRPJTIwJTQwRm9ybWVsJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI4Zm9ybWVsJTI5JTBBU0VMRUNUJTBBQ29uY2F0JTI4azEua2xhbW1lciUyQyUyMHoxLnphaGwlMkMlMjBrMi5rbGFtbWVyJTJDJTIwbzEub3BlcmF0aW9uJTJDJTIwazMua2xhbW1lciUyQyUyMHoyLnphaGwlMkMlMjBrNC5rbGFtbWVyJTJDJTIwbzIub3BlcmF0aW9uJTJDJTIwazUua2xhbW1lciUyQyUyMHozLnphaGwlMkMlMjBrNi5rbGFtbWVyJTJDJTIwbzMub3BlcmF0aW9uJTJDJTIwazcua2xhbW1lciUyQyUyMHo0LnphaGwlMkMlMjBrOC5rbGFtbWVyJTI5JTBBRlJPTSUyMCUyMCUyMCU0MEtsYW1tZXJuJTIwazElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjBDUk9TUyUyMEpPSU4lMjAlNDBaYWhsZW4lMjB6MSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMENST1NTJTIwSk9JTiUyMCU0MEtsYW1tZXJuJTIwazIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjBDUk9TUyUyMEpPSU4lMjAlNDBPcGVyYXRpb25lbiUyMG8xJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwQ1JPU1MlMjBKT0lOJTIwJTQwS2xhbW1lcm4lMjBrMyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMENST1NTJTIwSk9JTiUyMCU0MFphaGxlbiUyMHoyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwQ1JPU1MlMjBKT0lOJTIwJTQwS2xhbW1lcm4lMjBrNCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMENST1NTJTIwSk9JTiUyMCU0ME9wZXJhdGlvbmVuJTIwbzIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjBDUk9TUyUyMEpPSU4lMjAlNDBLbGFtbWVybiUyMGs1JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwQ1JPU1MlMjBKT0lOJTIwJTQwWmFobGVuJTIwejMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjBDUk9TUyUyMEpPSU4lMjAlNDBLbGFtbWVybiUyMGs2JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwQ1JPU1MlMjBKT0lOJTIwJTQwT3BlcmF0aW9uZW4lMjBvMyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMENST1NTJTIwSk9JTiUyMCU0MEtsYW1tZXJuJTIwazclMEElMjAlMjAlMjAlMjAlMjAlMjAlMjBDUk9TUyUyMEpPSU4lMjAlNDBaYWhsZW4lMjB6NCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMENST1NTJTIwSk9JTiUyMCU0MEtsYW1tZXJuJTIwazglMEFXSEVSRSUwQSUyMCUyMC0tJTIwdW5zaW5uaWdlJTIwS2xhbW1lcm4lMjBhdXNzY2hsaWUlQzMlOUZlbiUwQSUyMCUyMGsxLmtsYW1tZXIlMjAlM0MlM0UlMjAlMjclMjklMjclMEElMjAlMjBBTkQlMjBrMi5rbGFtbWVyJTIwJTNDJTNFJTIwJTI3JTI4JTI3JTBBJTIwJTIwQU5EJTIwazMua2xhbW1lciUyMCUzQyUzRSUyMCUyNyUyOSUyNyUwQSUyMCUyMEFORCUyMGs0LmtsYW1tZXIlMjAlM0MlM0UlMjAlMjclMjglMjclMEElMjAlMjBBTkQlMjBrNS5rbGFtbWVyJTIwJTNDJTNFJTIwJTI3JTI5JTI3JTBBJTIwJTIwQU5EJTIwazYua2xhbW1lciUyMCUzQyUzRSUyMCUyNyUyOCUyNyUwQSUyMCUyMEFORCUyMGs3LmtsYW1tZXIlMjAlM0MlM0UlMjAlMjclMjklMjclMEElMjAlMjBBTkQlMjBrOC5rbGFtbWVyJTIwJTNDJTNFJTIwJTI3JTI4JTI3JTBBJTIwJTIwQU5EJTIwTk9UJTIwJTI4JTIwazEua2xhbW1lciUyMCUzRCUyMCUyNyUyOCUyNyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEFORCUyMGsyLmtsYW1tZXIlMjAlM0QlMjAlMjclMjklMjclMjAlMjklMEElMjAlMjBBTkQlMjBOT1QlMjAlMjglMjBrMy5rbGFtbWVyJTIwJTNEJTIwJTI3JTI4JTI3JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwQU5EJTIwazQua2xhbW1lciUyMCUzRCUyMCUyNyUyOSUyNyUyMCUyOSUwQSUyMCUyMEFORCUyME5PVCUyMCUyOCUyMGs1LmtsYW1tZXIlMjAlM0QlMjAlMjclMjglMjclMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBBTkQlMjBrNi5rbGFtbWVyJTIwJTNEJTIwJTI3JTI5JTI3JTIwJTI5JTBBJTIwJTIwQU5EJTIwTk9UJTIwJTI4JTIwazcua2xhbW1lciUyMCUzRCUyMCUyNyUyOCUyNyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEFORCUyMGs4LmtsYW1tZXIlMjAlM0QlMjAlMjclMjklMjclMjAlMjklMEElMjAlMjBBTkQlMjBrMi5rbGFtbWVyJTIwJTNDJTNFJTIwQ0FTRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFdIRU4lMjBrMS5rbGFtbWVyJTIwJTNEJTIwJTI3JTI3JTIwVEhFTiUyMCUyNyUyOSUyNyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEVMU0UlMjBOVUxMJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwRU5EJTBBJTIwJTIwQU5EJTBBJTIwJTIwLS0lMjBaYWhsZW4lMjBkJUMzJUJDcmZlbiUyMG51ciUyMGVpbm1hbCUyMHZvcmtvbW1lbiUwQSUyMCUyMHoxLnphaGwlMjAlM0MlM0UlMjB6Mi56YWhsJTBBJTIwJTIwQU5EJTIwejEuemFobCUyMCUzQyUzRSUyMHozLnphaGwlMEElMjAlMjBBTkQlMjB6MS56YWhsJTIwJTNDJTNFJTIwejQuemFobCUwQSUyMCUyMEFORCUyMHoyLnphaGwlMjAlM0MlM0UlMjB6My56YWhsJTBBJTIwJTIwQU5EJTIwejIuemFobCUyMCUzQyUzRSUyMHo0LnphaGwlMEElMjAlMjBBTkQlMjB6My56YWhsJTIwJTNDJTNFJTIwejQuemFobCUwQSUwQURFQ0xBUkUlMjAlNDBHbGVpY2h1bmclMjBWQVJDSEFSJTI4MjU1JTI5JTBBREVDTEFSRSUyMCU0MEVyZ2VibmlzJTIwRkxPQVQlMEFERUNMQVJFJTIwZGJfY3Vyc29yJTIwQ1VSU09SJTIwRk9SJTBBJTIwJTIwU0VMRUNUJTIwJTI3U0VMRUNUJTIwJTQwRXJnZWJuaXMlMjAlM0QlMjAlMjclMjAlMkIlMjBmb3JtZWwlMEElMjAlMjBGUk9NJTIwJTIwJTIwJTQwRm9ybWVsJTBBJTIwJTIwV0hFUkUlMEElMjAlMjAlMjAlMjAtLSUyMEFuemFobCUyMGRlciUyMGdlJUMzJUI2ZmZuZXRlbiUyMEtsYW1tZXJuJTIwbXVzcyUyMGRpZXNlbGJlJTIwc2VpbiUyMHdpZSUyMGRpZSUyMGRlciUyMGdlc2NobG9zc2VuZW4lMEElMjAlMjAlMjAlMjAlMjglMjBMZW4lMjhmb3JtZWwlMjklMjAtJTIwTGVuJTI4UmVwbGFjZSUyOGZvcm1lbCUyQyUyMCUyNyUyOSUyNyUyQyUyMCUyNyUyNyUyOSUyOSUyMCUyOSUyMCUzRCUyMCUyOCUyMExlbiUyOGZvcm1lbCUyOSUyMC0lMEElMjAlMjAlMjAlMjBMZW4lMjhSZXBsYWNlJTI4Zm9ybWVsJTJDJTIwJTI3JTI4JTI3JTJDJTIwJTI3JTI3JTI5JTI5JTIwJTI5JTBBJTIwJTIwJTIwJTIwQU5EJTBBJTIwJTIwJTIwJTIwLS0lMjBFcyUyMGRhcmYlMjBuaWNodCUyMGVpbmUlMjBnZXNjaGxvc3NlbmUlMjB2b3IlMjBkZXIlMjBlcnN0ZW4lMjBnZSVDMyVCNmZmbmV0ZW4lMjBLbGFtbWVyJTIwa29tbWVuJTBBJTIwJTIwJTIwJTIwUGF0aW5kZXglMjglMjclMjUlMjklMjUlMjclMkMlMjBmb3JtZWwlMjklMjAlM0UlMjBQYXRpbmRleCUyOCUyNyUyNSUyOCUyNSUyNyUyQyUyMGZvcm1lbCUyOSUwQSUwQU9QRU4lMjBkYl9jdXJzb3IlMEElMEFGRVRDSCUyMG5leHQlMjBGUk9NJTIwZGJfY3Vyc29yJTIwSU5UTyUyMCU0MEdsZWljaHVuZyUzQiUwQSUwQVdISUxFJTIwJTQwJTQwRkVUQ0hfU1RBVFVTJTIwJTNEJTIwMCUwQSUyMCUyMEJFR0lOJTBBJTIwJTIwJTIwJTIwJTIwJTIwQkVHSU4lMjB0cnklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBFWEVDJTIwU3BfZXhlY3V0ZXNxbCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU0MEdsZWljaHVuZyUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyNyU0MEVyZ2VibmlzJTIwZmxvYXQlMjBPVVRQVVQlMjclMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNDBFcmdlYm5pcyUyMG91dHB1dCUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMElGJTIwJTQwRXJnZWJuaXMlMjAlM0QlMjAyNCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEJFR0lOJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUFJJTlQlMjBSZXBsYWNlJTI4JTQwR2xlaWNodW5nJTJDJTIwJTI3U0VMRUNUJTIwJTQwRXJnZWJuaXMlMjAlM0QlMjAlMjclMkMlMjAlMjclMjclMjklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBFTkQlMEElMjAlMjAlMjAlMjAlMjAlMjBFTkQlMjB0cnklMEElMEElMjAlMjAlMjAlMjAlMjAlMjBCRUdJTiUyMGNhdGNoJTBBJTIwJTIwJTIwJTIwJTIwJTIwRU5EJTIwY2F0Y2glMEElMEElMjAlMjAlMjAlMjAlMjAlMjBGRVRDSCUyMG5leHQlMjBGUk9NJTIwZGJfY3Vyc29yJTIwSU5UTyUyMCU0MEdsZWljaHVuZyUwQSUyMCUyMEVORCUwQSUwQUNMT1NFJTIwZGJfY3Vyc29yJTBBJTBBREVBTExPQ0FURSUyMGRiX2N1cnNvciUyMCUyMA==“]

Was haben wir hier genau gemacht? Zunächst einmal definieren wir drei Tabellenvariablen für die Klammern, Zahlen, und Rechenoperationen. Nun setzen wir aus diesen die (wiederum in einer Tabellenvariablen gespeicherte) Formel zusammen. Da wir in der Theorie alle Kombinationen testen müssen, verwenden wir für jede benötigte Stelle der Formel einen Cross Join mit der Tabelle des an dieser Stelle benötigten Elementes. Nun haben wir alle Formeln, die man aus den vorgegebenen Klammern, Rechenoperationen und Zahlen bilden kann. Das sind eine Menge! Und nun ja, mit dieser Menge ist der SQL Server per se erst einmal ein wenig überfordert, weshalb wir sie in bester quick&dirty-Manier einschränken und alles ausschließen, was uns mit kurzem Nachdenken in den Kopf kommt: unsinnige Klammern(-Kombinationen), gleiche Zahlen (das Rätsel sagt ja explizit, dass jede Zahl nur einmal vorkommen darf). Schließlich muss man nun wirklich nicht prüfen, ob )1(-3*)4(+)6( eine Lösung für das Rätsel ist. Mit der Menge geht der SQL Server dann schon deutlich besser gelaunt an die Arbeit, wir müssen also zum Glück nicht noch komplexeren Unsinn ausschließen.

Aber wie prüfen wir jetzt jede der übrig gebliebenen Formeln darauf, ob sie sinnvoll sind und vor allem zum gewünschten Ergebnis führen? Nun, wer hätte gedacht, dass wir den guten alten Cursor mal in einem Blog verwenden…

Wir iterieren mit Hilfe eines Cursors über jede der eben ermittelten Formeln, schließen dabei nochmal ein wenig offensichtlichen Unsinn aus, und machen daraus ein dynamisches SELECT-Statement, welches das Ergebnis in eine Variable speichert. Dieses Statement lassen wir anschließend per sp_executesql ausführen (nachdem wir uns bei der richtigen Syntax einmal die Finger verknotet haben). Natürlich benötigen wir hierfür einen TRY-CATCH-Block, da trotz unserer Bemühungen immer noch Formeln enthalten sind, die die Mathematik so gar nicht mag. Und da wir letztlich alle Lösungen, die nicht 24 sind, komplett uninteressant finden, lassen wir per print-Kommando lediglich die Gewinnerzeilen ausgeben – was, wie die Leser des ersten Beitrags wissen, lediglich eine einzige ist:

Puh, ein Blogbeitrag mit dynamischem T-SQL, Cursor, einem guten Dutzend Cross Joins und TRY-CATCH, was fehlt da noch… Richtig, eine Python-Lösung, die vom Kollegen Timo Klerx über LinkedIn eingereicht wurde. Da der Autor dieses Beitrags in aller Bescheidenheit zugeben muss, dass er dazu nicht viel sagen kann, sie aber auch nicht vorenthalten wollte, hier in all ihrer Schönheit.

 

Hier nun also die komplette Lösung mit Python:

[TS_EnlighterJS_Snippet_Single code_type=“python“ code_theme=“classic“ code_content=“X19hdXRob3JfXyUyMCUzRCUyMCUyMlJvYiUyMEtuaWdodCUyQyUyMEdhdmluJTIwSHV0dGxleSUyQyUyMGFuZCUyMFBldGVyJTIwTWF4d2VsbCUyMiUwQV9fdmVyc2lvbl9fJTIwJTNEJTIwJTIyMC4wLjElMjIlMEFfX2VtYWlsX18lMjAlM0QlMjAlMjJ0a2xleCU0MHBhaXFvLmNvbSUyMiUwQV9fc3RhdHVzX18lMjAlM0QlMjAlMjJBbHBoYSUyMiUwQSUwQWZyb20lMjBvcGVyYXRvciUyMGltcG9ydCUyMGFkZCUyQyUyMHN1YiUyQyUyMG11bCUyQyUyMHRydWVkaXYlMEFmcm9tJTIwaXRlcnRvb2xzJTIwaW1wb3J0JTIwcGVybXV0YXRpb25zJTJDJTIwcHJvZHVjdCUwQSUwQSUwQWRlZiUyMGNvbXB1dGUlMjhudW1iZXJzJTJDJTIwb3BlcmF0b3JzJTI5JTNBJTBBJTIwJTIwJTIwJTIwaWYlMjBsZW4lMjhudW1iZXJzJTI5JTIwJTNEJTNEJTIwMSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJldHVybiUyMCU1Qm51bWJlcnMlNUIwJTVEJTVEJTBBJTIwJTIwJTIwJTIwZWxzZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJlcyUyMCUzRCUyMCU1QiU1RCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHRyeSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxlZnRzJTIwJTNEJTIwJTVCb3BlcmF0b3JzJTVCMCU1RCUyOG51bWJlcnMlNUIwJTVEJTJDJTIweCUyOSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZvciUyMHglMjBpbiUyMGNvbXB1dGUlMjhudW1iZXJzJTVCMSUzQSU1RCUyQyUyMG9wZXJhdG9ycyU1QjElM0ElNUQlMjklNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXMuZXh0ZW5kJTI4bGVmdHMlMjklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBleGNlcHQlMjBaZXJvRGl2aXNpb25FcnJvciUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHBhc3MlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB0cnklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBtaWRkbGVfaWR4JTIwJTNEJTIwbGVuJTI4bnVtYmVycyUyOSUyMCUyRiUyRiUyMDIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvcGVyYXRvcl9pZHglMjAlM0QlMjBsZW4lMjhvcGVyYXRvcnMlMjklMjAlMkYlMkYlMjAyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWlkZGxlcyUyMCUzRCUyMCU1Qm9wZXJhdG9ycyU1Qm9wZXJhdG9yX2lkeCU1RCUyOGxlZnQlMkMlMjByaWdodCUyOSUyMGZvciUyMGxlZnQlMkMlMjByaWdodCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGluJTIwcHJvZHVjdCUyOGNvbXB1dGUlMjhudW1iZXJzJTVCJTNBbWlkZGxlX2lkeCU1RCUyQyUyMG9wZXJhdG9ycyU1QiUzQW9wZXJhdG9yX2lkeCU1RCUyOSUyQyUyMGNvbXB1dGUlMjhudW1iZXJzJTVCbWlkZGxlX2lkeCUzQSU1RCUyQyUyMG9wZXJhdG9ycyU1Qm9wZXJhdG9yX2lkeCUzQSU1RCUyOSUyOSU1RCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJlcy5leHRlbmQlMjhtaWRkbGVzJTI5JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZXhjZXB0JTIwWmVyb0RpdmlzaW9uRXJyb3IlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwYXNzJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwdHJ5JTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmlnaHRzJTIwJTNEJTIwJTVCb3BlcmF0b3JzJTVCLTElNUQlMjh4JTJDJTIwbnVtYmVycyU1Qi0xJTVEJTI5JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZm9yJTIweCUyMGluJTIwY29tcHV0ZSUyOG51bWJlcnMlNUIlM0EtMSU1RCUyQyUyMG9wZXJhdG9ycyU1QiUzQS0xJTVEJTI5JTVEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmVzLmV4dGVuZCUyOHJpZ2h0cyUyOSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGV4Y2VwdCUyMFplcm9EaXZpc2lvbkVycm9yJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcGFzcyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJldHVybiUyMHJlcyUwQSUwQSUwQW9wZXJhdG9ycyUyMCUzRCUyMCU1QmFkZCUyQyUyMHN1YiUyQyUyMG11bCUyQyUyMHRydWVkaXYlNUQlMEElMEFvcGVyYW5kcyUyMCUzRCUyMCU1QjElMkMlMjAzJTJDJTIwNCUyQyUyMDYlNUQlMEFwZXJtcyUyMCUzRCUyMHBlcm11dGF0aW9ucyUyOG9wZXJhbmRzJTI5JTBBb3BzX2NhbmRpZGF0ZXMlMjAlM0QlMjBwcm9kdWN0JTI4b3BlcmF0b3JzJTJDJTIwcmVwZWF0JTNEbGVuJTI4b3BlcmFuZHMlMjktMSUyOSUwQWRlc2lyZWRfcmVzdWx0JTIwJTNEJTIwMjQlMEFpJTIwJTNEJTIwMCUwQWZvciUyMHBlcm0lMkMlMjBvcHMlMjBpbiUyMHByb2R1Y3QlMjhwZXJtcyUyQyUyMG9wc19jYW5kaWRhdGVzJTI5JTNBJTBBJTIwJTIwJTIwJTIwcmVzJTIwJTNEJTIwY29tcHV0ZSUyOHBlcm0lMkMlMjBvcHMlMjklMEElMjAlMjAlMjAlMjBpZiUyMGRlc2lyZWRfcmVzdWx0JTIwaW4lMjByZXMlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcmludCUyOGYlMjJGb3VuZCUyMHRoZSUyMGRlc2lyZWQlMjByZXN1bHQlMjAlN0JkZXNpcmVkX3Jlc3VsdCU3RC4lMjIlMjklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvcHNfbmFtZXMlMjAlM0QlMjAlNUJvcC5fX25hbWVfXyUyMGZvciUyMG9wJTIwaW4lMjBvcHMlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcmludCUyOCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGYlMjJUaGUlMjByZXN1bHQlMjBjYW4lMjBiZSUyMGFjaGlldmVkJTIwd2l0aCUyMHRoZSUyMGZvbGxvd2luZyUyMHNldCUyMG9mJTIwb3BlcmF0b3JzJTNBJTIwJTdCb3BzX25hbWVzJTdELiUyMiUyOSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGJyZWFrJTBBJTIwJTIwJTIwJTIwaSUyMCUyQiUzRCUyMGxlbiUyOHJlcyUyOSUwQSUwQXByaW50JTI4ZiUyMlRyaWVkJTIwJTdCaSU3RCUyMGNvbWJpbmF0aW9ucyUyMiUyOSUwQQ==“]