diff --git a/ollama.yml b/ollama.yml new file mode 100644 index 0000000..16dcaa8 --- /dev/null +++ b/ollama.yml @@ -0,0 +1,14 @@ +- hosts: webservers + roles: + - name: ollama + database_url: postgres://openwebui:{{ postgresql_users.openwebui }}@postgresql:5432/openwebui + webui_secret_key: "{{ ollama.webui_secret_key }}" + webui_url: https://ai.comfycamp.space + enable_login_form: false + admin_email: admin@comfycamp.space + enable_oauth_signup: true + oauth_client_id: pUiGwuYn4HP26e0R95IqCYhICay1qsLQIHSTZnxT + oauth_client_secret: "{{ ollama.client_secret }}" + oauth_provider_name: Comfy Camp + openid_provider_url: https://auth.comfycamp.space/application/o/ollama/.well-known/openid-configuration + openid_redirect_uri: https://ai.comfycamp.space/oauth/oidc/callback diff --git a/roles/haproxy/files/haproxy.cfg b/roles/haproxy/files/haproxy.cfg index 078efd6..e8fe6a3 100644 --- a/roles/haproxy/files/haproxy.cfg +++ b/roles/haproxy/files/haproxy.cfg @@ -107,6 +107,9 @@ frontend https acl host_freshrss hdr(host) -i rss.comfycamp.space use_backend freshrss if host_freshrss + acl host_ai hdr(host) -i ai.comfycamp.space + use_backend openwebui if host_ai + acl host_grafana hdr(host) -i grafana.comfycamp.space use_backend grafana if host_grafana @@ -240,3 +243,6 @@ backend phoenix backend uptime_kuma server s1 uptime-kuma-1:3001 check + +backend openwebui + server s1 open-webui-1:8080 diff --git a/roles/ollama/meta/argument_specs.yml b/roles/ollama/meta/argument_specs.yml new file mode 100644 index 0000000..118ae61 --- /dev/null +++ b/roles/ollama/meta/argument_specs.yml @@ -0,0 +1,41 @@ +argument_specs: + main: + options: + database_url: + type: str + required: true + database_pool_size: + type: int + webui_secret_key: + type: str + required: true + webui_url: + type: str + enable_login_form: + type: bool + admin_email: + type: str + task_model: + type: str + enable_rag_web_search: + type: str + enable_search_query: + type: bool + enable_oauth_signup: + type: bool + oauth_client_id: + type: str + oauth_client_secret: + type: str + oauth_scopes: + type: str + oauth_provider_name: + type: str + openid_provider_url: + type: str + openid_redirect_uri: + type: str + oauth_username_claim: + type: str + oauth_merge_accounts_by_email: + type: bool diff --git a/roles/ollama/tasks/main.yml b/roles/ollama/tasks/main.yml new file mode 100644 index 0000000..8b1c757 --- /dev/null +++ b/roles/ollama/tasks/main.yml @@ -0,0 +1,54 @@ +--- +- name: Create ollama docker volumes + become: true + community.docker.docker_volume: + name: "{{ item }}" + loop: + - ollama + - open-webui +- name: Create ollama network + become: true + community.docker.docker_network: + name: ollama +- name: Run ollama + become: true + community.docker.docker_container: + name: ollama-1 + image: ollama/ollama:0.4.2 + volumes: + - ollama:/root/.ollama + networks: + - name: ollama + restart_policy: unless-stopped +- name: Run ollama web ui + become: true + community.docker.docker_container: + name: open-webui-1 + image: ghcr.io/open-webui/open-webui:git-96c8654 + env: + OLLAMA_BASE_URL: http://ollama-1:11434 + DATABASE_URL: "{{ database_url }}" + DATABASE_POOL_SIZE: "{{ database_pool_size | string }}" + WEBUI_SECRET_KEY: "{{ webui_secret_key }}" + WEBUI_URL: "{{ webui_url }}" + ENABLE_LOGIN_FORM: "{{ enable_login_form | string }}" + ADMIN_EMAIL: "{{ admin_email }}" + TASK_MODEL: "{{ task_model }}" + ENABLE_RAG_WEB_SEARCH: "{{ enable_rag_web_search | string }}" + ENABLE_SEARCH_QUERY: "{{ enable_search_query | string }}" + ENABLE_OAUTH_SIGNUP: "{{ enable_oauth_signup | string }}" + OAUTH_MERGE_ACCOUNTS_BY_EMAIL: "{{ oauth_merge_accounts_by_email | string }}" + OAUTH_USERNAME_CLAIM: "{{ oauth_username_claim }}" + OAUTH_CLIENT_ID: "{{ oauth_client_id }}" + OAUTH_CLIENT_SECRET: "{{ oauth_client_secret }}" + OAUTH_SCOPES: "{{ oauth_scopes }}" + OAUTH_PROVIDER_NAME: "{{ oauth_provider_name }}" + OPENID_PROVIDER_URL: "{{ openid_provider_url }}" + OPENID_REDIRECT_URI: "{{ openid_redirect_uri }}" + volumes: + - open-webui:/app/backend/data + networks: + - name: ollama + - name: haproxy + - name: postgresql + restart_policy: unless-stopped diff --git a/roles/ollama/vars/main.yml b/roles/ollama/vars/main.yml new file mode 100644 index 0000000..550878f --- /dev/null +++ b/roles/ollama/vars/main.yml @@ -0,0 +1,19 @@ +database_pool_size: 5 + +enable_login_form: true +admin_email: "" + +task_model: llama3.1 + +enable_rag_web_search: true +enable_search_query: true + +enable_oauth_signup: false +oauth_client_id: "" +oauth_client_secret: "" +oauth_merge_accounts_by_email: false +oauth_username_claim: preferred_username +oauth_scopes: openid email profile +oauth_provider_name: SSO +openid_provider_url: "" +openid_redirect_uri: "" diff --git a/vaulted_vars.yml b/vaulted_vars.yml index 0e581f9..d0aec72 100644 --- a/vaulted_vars.yml +++ b/vaulted_vars.yml @@ -1,236 +1,247 @@ $ANSIBLE_VAULT;1.1;AES256 -30373463346361363832616462626534336233633936383032613437326433353437366363313032 -6430316535363530346633373638666262613436623133310a663037356562333334396261363833 -62663133363265326230333961313364343134623032376165323961386132326637383062373065 -3732653962616263360a663538613837303533653031376161643037623434336331613533356630 -65623563366666333463613436303534356238663934616530353363633635393466323636346437 -39643166613332326662373938366165336137623065356633646362316262663033633430326334 -38616337333566643536383138663762313161376534663132343763653464346561333331633339 -34636464613032633061646564623661656466393633653266323366363333393339363732376532 -32363063303865646561323637623632636435643866393131313131313131343031373234613061 -65336162633836383839333237353266316566666430333339333235313536303562653763396534 -39386238623737376234333266366132626136613632653239366538356462363030313464613431 -35616139373039623562306365623536346139643631653664396434383163663866313237663831 -63646131343663386231613237663638393061643131363436323561396430336333373538323430 -34323234623034356231663036643365646366376638323966313361313738316135643535623462 -66636338356436666637303537626566633437393163343434336435666433653461356337376138 -61623465653631633139626239343430323761353266353263323561386165356166666134623666 -36313538326433396131323266383033613133323566656162633965383739653164363237333039 -30373138626433343465666165356633346436646630333465376238343661653266313834623862 -37616137656564363131343035653266313965333436353932313566363031353239356265363361 -63623466646131323064306166626137306537613565666435616533623764613138643264383036 -65376136386539653666366136616533626433653030636563316232663031663365356631626431 -66653161633661643764666462333162363139626230303132663231636666343938393137333932 -63613937663464303538306165353039356165396636646666313232633132373933303162303762 -63653763633061306366393261653163633437306237386533663639326566306538346137343730 -65366132346531363239613161363466623830666236346266636634643833613263636632353438 -31666131303866333562376437363536333133633036353139643162626666656466336132303932 -39646639663364633736393138623566383538663839613533303866326232373431366239336266 -38633665313338636238653035646262356431333334633137646137633535396537306334613333 -64313163346365336131393832333064303033366634313663333262666361636131386138323764 -63613634666566616635336232663431353639326161313866326135303961333337636138336234 -39643966663266653464626331306662383235366537383039643563636464613563313365383737 -64303264643265316530326165333465306635383235313662646564333762333234616265313638 -30653064326438663230386432343961653936356130316534613837653062623663633934333132 -63643364393730633936343136626661383137643033316630336163383238616464326465366564 -39323931636564663536626237313066646436633632376262353964643635626163376163633133 -36363933313466356363613665383061386362333037373030393066326265333133636166613532 -35343530373666623036643339303438376534343535346533393134343133383037666437363166 -33653962376362383031323337386364326232613366613134343030306134323235623630306631 -64343165653661633135633035366262336362643435633733343866323136393562393833653733 -63646432356264323764336561633135336365393866623265366166303666666663653334343132 -66393538303739663736366362633264346238306566333962373265663366306465366238623333 -61333830393362326662393833326165393863643734386239333165346664343337373466626361 -66666165663438383363636261323136376334636435396233393034623461623134653066646461 -33653363333862393932306437633333396233653535353637663634323037393537343531393663 -61643664386434366232333366303637616332366131383936373236366363373166363931343838 -66626561393337373532326132663936393535613533393930663065633264343666343237633439 -33616363353762633538653034626137333736303661323034636163356662623336643833303537 -62373637643638356339396462613332336263633532343533353062636234646130326535663931 -66316165623539396232373262356161643966643935666262316166336162643565333063656265 -37313338383665386266633231326162303432646663353930643638626261343832616438316338 -38633366616335393633323764306531356236633663336532666634646430323066643938636565 -65626337353338653739363634376236373230646439353531353065353135313239353534653661 -31323261323838653631653038386663646335313265613166643131313036663566353561373535 -39663731363636366630386631306561616338663630396265343734623563663339316362383531 -63623063316562663631336133376232643732643038653662393632336639306465303566653935 -34323865353532306630303436623335326161363866303738323733613138636633393036633535 -39646135393336653538386165316139363436653766623232343537346162373866313338316337 -62306236616163613731316261626535313766323837316162643262626334393661643164623262 -39353632333765383230636130633765663761323437643230356637343330383230336637323638 -37613534646361346161383433386465353833383765613565616365323034396164353531656437 -64633066626339303366616136653461616537303962623761636431623837626636353634663433 -65396466636232653362663965313738316531383264353731393431346236393466653439396137 -62363937346538363365333538373639313361323662393236333633646632363032383931653936 -34653533646633636139336436613335633736306165303066313266326532633535366462326331 -64323263373364663866373362623738343539383433316664646462393161643931653561376432 -62373266613532666366663232636565393662643834636237633964613139646431343064613233 -37656535396430636361386334343365663439383363366564313462656334316330356232636237 -64393561363064313461613233306466303733386230383131353864643031346633373065343537 -33663731656537316239383538333961336164633439386236346539316132636432376637303438 -31393563623133323461653035326231306435613564643536633033333537646431393264353337 -62643962363164666633373066356337373835626635326434656435633936343865363837356236 -33383063323230646331663566653538373738356363313030366231393664313338353262663262 -63663264653636393235333330643131616531363531633565623531393731623238373161663065 -37636533353862643134333430386232643735373934623939656362383064633162306633363139 -30643163306563646433366232363039653034383034393338343263626562373766343139636432 -30383036653262343365636431613665633930663165386337653031336462373336323534393039 -36316636633966326661396532653032356161326431653237376135323461653539356466366365 -33336532643531663732313733316364653361653536656633333331613636633338376432316137 -64326561623432376434663432396532336364326530663563366261393862303036313734623535 -63363030353232613064613262633563313464396233633535663832376339393736336665623131 -35333533363862303133653832306638306534656330373130383561343937656339653466393162 -39626331376632623065643631393034323766323231393931363432383531346530383037613532 -36353935346535376163313634303430616233376564306663303165623933353862343837666464 -39643264383333356633623134626132663435393565666263613261643930306262663165626139 -62393961376166366431643566626539376135653663343031303937643930613435626366663062 -61616637396566363732313631633334616163346135383936373465626465306630303363393764 -36623463656234633164633737356532313263616536366237636630363166353333306637653335 -64616230613033383765646164646533376432353338303838656232646533623730663234333462 -38666132666434643839636164666530636230366531386131333566313362393136353836356262 -38653437653464313232303265316431393830303862323138653661346635396133666239353766 -34633166393165623531343437306166393930633130653339326436356662666434653962316633 -63306133636431303964356166626464616266326162636361633137663735646434623138333936 -39373139633864393436383931343361616537646131653564663536306561323933343539656532 -65313733626162356334386230346132373133316636306131643438353037356465313132356363 -33653234623537393436336163626532326363303263323665643831313666366461336432636631 -32346365323837666436636438636563366134636363303566643735643235303139646538633263 -32656531373330373530313261363535313430303337333136373339323830623535646137373137 -39643934366235666633343039346562643864633639383335663765653834656636333665346131 -65316366663665626632313464316463376339643738633933313131333461653530623732653966 -30353437396535303261343737333938396366383136356333663461666238353862386237336264 -63353034616563396231343434336137653432313734666633316330376163663139303064336238 -61623965643432626233326431626530616466663164326662316464636466313666353939316437 -38326265303630333631303364346464626465356438373931313131663631356330363863363066 -30363936393537356238663762363635666565643036646564363164333162313263663933346163 -33336163306237643834316333653535613533303863346333616630353231383261393765373466 -35633061373835663831613830393234363335656639303262366633656462626535643637383465 -34316665383337643030633862636266306631643935356633343762646261343734636338303730 -62363833623031343130653665613536623135343036363762343532663131643365343163343462 -37333863643236633635653038383762663035306361363138336462633534356133303831313163 -65306131663338343366353232646134326234356130663962663635353837663863643937383339 -32636138376163363936353831656463356663356633663534346336353131313662303839613063 -36633538613336383037613132396563356631656338393166313463666237373761363734373037 -39316238613930396633616465336463363031383630306261323839646630303662383936366432 -35376534393063646337373137356565343562623438646437666361663330303835313831313837 -39376263366265613964363730353939363331383361643966383663333634303434616534386138 -35366335643332353964623965333237626538326163333733313239646535613930656266366463 -63336134613037623938343530303764346331323362656632356362386337393736306563306663 -66313837303461323066656338326339633635353435383135626333386234373239333263656532 -32366362323266323139376232663066333563663666633937393362646433656561623432666232 -36353961366661323264353061353736616230383337646638656439363639613536353162396237 -38386238376137353937653336333639393463333838353632336235336566633562303033653362 -34643539613037373834353139323638313532633663653837363166323931356330316431373639 -66663836316265663063306637343530303334386433386630363436616133643961313835353336 -66333236336332353433376566353135303161633539623539366637353262313330346661386635 -34376564336635326362326631623533366665663862313833623863326435346639323133353835 -35613162643934353064313330666163303730376666313133613035393964633736666639393535 -35373262396535373166303233343431316338316534633261343063306232343262626164643561 -66343332376332353235343462353165326638333465633138346239633833396364336632353338 -65363330653734646565663466346131616533333833303962326664323737653937396664663431 -31303833653162373231653231383438666637326439386234323432613561613363353166396563 -36373436356333306563643739636562363161303366643237613166343233653033656362663065 -61646365343265326232303439303739343937653637346132343561383363663034646565623638 -35383037663565326137636163643463383930323936346465626562333337653531623232653531 -33323836623463346535626562383834383238303432653735313437323165666134366663643232 -32313531383138383531343337303333616136643937333131303735313766303334333636376663 -38626366313137626466616330333236376432646334363637383438656261623530643938396561 -38623538386338646335363165343632353937623333343865346232623763633130623662626531 -64663566323536373364306365316532333430323661623861643263663738383031376136373231 -62626365336364616534323761303462613035626535623735303538323938356265353131623730 -63383130623365333835383461626235656333386131636233353734666334376630363666373737 -30326635636438363166643361323864393832616538313466366630346537626231356365616433 -64636463303262666237356137666332356338396632306135663431366135343461306566386633 -31373564383039316135656631623934306439626637396631323235636362373562636339323161 -33363632316138356563633033333833613434633838616232393230346333626661623230643861 -38333166646132373630613432323234633137666435323339653438663932613461633235373633 -38613637373736656263396239663035663261333066376435613264656138313462336266303731 -33623863633535386164363466393230393162616133313230336330323339396631386334663430 -63333161623062623437386437326438396661363863633836326333626137386435656536383331 -37353434313730313361353565373730393631613433333338666139373064316165313835326635 -30393361663964656565396531386465306336393034333133376637383334393161393866656564 -63383731363739663263333639366538326236313932336130623965653236373730646532656136 -66623131373965376138323961663561633336653963613765396533376462386566363362623238 -30613362373131636363343762343364363038316264333962383632663734653663383037643464 -65626334616566373335396435633863633062626363343563363333323063666261313662353864 -33313237616261646435386534636435646466353239633165333538626663626163656161646338 -30353961373761626261646565333830383235386331356532663536313335353835333032326635 -31313836323937366261663939353035386264393839663139623661663139336163383232336165 -33333137386163373635613237333432653431633362343236643963636162353632353534623361 -66333534623330323439373238346565613165326336333030656536353730373162323930353234 -30653732316561303934373238366366376135383036383632623836353430643462316139613562 -64343462626433636433656139616534373635313236326338386438366133363934613361613437 -61343061646362343363663966343834643939376233653464373237326133656234303164336461 -63613763396363336334313866656431363835656164396532366231663739613333343935383232 -33616233376562346637623162333764643663663637346332656337333865626535303363336638 -63386562616532623135656532386538383664396632626635373832366463366564623732636538 -66393532313631646663373839653337653230346165373338343166393936306633656265323430 -32653861616362666632643063663536383437633533376437616135336538383932326138656565 -61306534613262323230616364613463623062386565653036663861373933353562353364663433 -30666535383461653033653638303935616465666339323962393933333666313136646663626138 -62373661326534613731346466386162316232646634323765326533613034366663366265656435 -35616139653966393135646637343063383036646436616362646132623638366435356431333634 -38626265653662383135346433323131366564626562636338656432623561396139623532636361 -33333234316535623262663532636436306437643434303366656262386434356139643662656636 -33613439653562636434653439653265336435373231653538383336663561343733363231653936 -34306161646266626565303938616463353731386236343466663463363264373763643533636530 -32313936356139646539353233666131333139303835376262303061313831623138643362363966 -35646434333665626638633034323763343132646230313433336535663735393736313838373463 -63633232623538343632396664636435396538393635356539323662356363396631333263373731 -64333833383336373733353932396337623937373061636239356261313363316163356434653461 -33363436316165633436633238356662633166373065613338633638363266303838333765353536 -35646265616562313530333431313737393635333230636331306564636336386638356633336132 -30626432333065633864346533333632306136333339363964383033616230383430386139636630 -39643337633533643830386138353034613830346165613037343166396238366238346135396636 -35333930396462303736306530353939366561313837613166653331623034343538396464653337 -38613134346663636438363230303332363339326139653263303230643833323261326337646264 -34353365663439653538663835373435383764633733353163336536616665393763366564626137 -30613439356534663237346262386435333038366633373662616266306461333536356239666439 -66323236326130336232306439613334313134316162653665326331333661343763373532303637 -36316134366433623839323535303331623431346633613432346631303266643430663834353234 -36616663383630663164303165643930343930303630353437313837376537313862303964633232 -62363036663164303037376163306464323665383339333364386265626234663936623739303464 -39336137353361653634306634613465363935633764323733656162366633353532656162613733 -30633661303936313738346432303135396138346133323331616661343135613664616164666137 -61366666333132303364353361323536663665373861643134663963353639313866373335666437 -66373630336366313437653763393033616231396564363363396431363263323565313762623264 -31303434393565336237326635383438383331323266336539333063613938306162343430313434 -62353863666165336434646261303862623334633636653235323730636238366633633838616335 -66376432626432373337376438383962336362613963333161656331313732363565653238613130 -38656661653663363537373064363864646438303139363739366332633738653462663436343966 -64326634323439366535343537613238366235386439643331656332306338383836616564333536 -63643331666336663061323633353733386631316639633265613836636663386331326665633030 -65313034316462316532313065633965636330633830343139313064653566343639333034613264 -35663464313431306431646439333066303738653366383762663363666333646163303365313739 -65643638613335333165366363323535666532376465343535386530346531323137626562393137 -61613830323432623762613532623435333765643965616661653534333964306565353931386539 -32636565313462353337316532643937306162663437313034616634663137356235643930623862 -31393263613831646561366636366165336335616134353663656138626262656561343330326234 -61646134303138623931373035396530653064363233313365373437646335656638363238316438 -35363138373938313939333737353239396330356334306234653230313539366135633630643535 -36303063323763656330373733653138353065316235333338383061623261343934666532393939 -63316466316663326163633536333462373632653665663636363137303336636531336663326432 -62646261303364646230376335376563376230613137386234633937366665626236396161336165 -39363065613636353733373530636430333439333130346138323565303264376663633263373335 -33646533376665353865336333353531393734343564663933636435323733616237313534353163 -36386233353939666238653131306465646263626264343265303830626130366234306636383361 -66653762326432633237623066363638343630666234656466356131306334623132653339656165 -65633136316530386665333235343264303235643761643837616235613530666461363166626363 -32383937366534346138653337653764323566373962663062393262356266303738313139393462 -37353439643966336463396363316562336662336338633261636365323232666534383763333333 -33313966343230636464636538663666356637663036323038663062356161346461393866646163 -39396235323631636236343466343063353033363538663430366432346535623539333631306239 -31643738613164396266616362396536333330363432333865633239336632343930346535616562 -34373763666530393261376538383664313630396435373065376362616135633931383766326566 -64353862613434316532383037626266366437646137643435323136376362653031343139613234 -61303636333464373631323534323265646236393665623239616330376638396437393863646266 -30383632643336643236653332653639653065363337303665623034646566333166353930663537 -34303563326636383466653438303238393731333839303832316431353864333163333937633832 -66306533623961386531636337333035663336396162373439396335643930383531363031366237 -33353139663035326533643432613966333231666437333635636539356430353233633331393134 -36633737633631323737383033666233333061306332616331653536636233663031353538396335 -61336532623539623838663539326366306531643063323763393762633764383435346161386636 -32383837353939633831663661613437383533353564663865373539363064376436356437613631 -39653235313232383839316633313736373165363939613930323835643264623331343663336333 -32663366373166343339666636666331623064363039613933373834636437303336363565623231 -643264663362373833376333363461396566 +38303939653832653463626363373732363731643437653435356231363165633765366534643733 +3632366430343539376437396332656233393534376433310a646465623437663965623532663363 +64653166396565656332303561643533663638613662323130636337386665306563646161656333 +6538376238333032630a333333346639643034386565376538326234333238656630623331363865 +34346630666534393339373638313465626231376633353239383631383334393166346365626534 +31643435313062363533333765376261656561343162653665376661383461386130303638396630 +30393134303935666165333333323238353539626337643631666166636136626362633736386234 +65623534383932363966653939313939666164653737636637346263363964383834303862616261 +65613539386434633633373365623162326437623635346438643661316539363662323335343330 +62643533626631393433333731326435373031633361633539333166666231633737393963633237 +65343363646133333964366463383763613731356166366465363635366538343139323631316565 +38306632613332333839663436313539313963306166376639316433623437613736643239323436 +64656533366136353533653039636637626437386161346532363835353534633366366566643666 +61383836646130383361393739663631656538663438623733376634623938396165633433623130 +34656438363736393433373830663538663261313963623366363161643936303137323239363430 +61666631653965373831306261633139393063366666393262626134323762396633376434393037 +63666163326630393038616564393537643031663332666237346334616366303338303062646262 +33303636326265323332633538623535386432383161613530396262366430646438313130383230 +36643565303663646663303161383536633531333365333664633438646631313361316136326433 +63306566316164653666393437366164623739643634303462356465616530303931663563303838 +32356433653130303036663636666231343737663830303435316631383737623265653438396538 +37613537353430386531343066356665336230663465306164316631623538383066643263343232 +61656534323666613638636261643130376465316430383830346164623565616366343436636566 +30373263346262616233393131653262343630613737346132326261656136393934366632633136 +36653438363833653232636362396461376630376531326633306339396534663663616539656665 +37396336366465623961303432383933306564366139646265653438323966616630333839616239 +35376366383962636566353530366133373833386533356464386532303135663664366333323631 +64303632636166376432336161363362623834366262633531376463363065623436313761326365 +64383836353562383233363863356238343234626363343964633136343530323939333335623932 +33646563343265373538623265393033653638363561396436303336343465663039316633323436 +39383236616231343463326261373764616231653837653631386136643530313538633639353166 +32306534376438306564393438336363313461396466376235356431376637323266363263636333 +39643733383766383536386535343832373131396533323663643063333861353832663237643731 +38366162363865333765333731303064343965646138666366303162653462303962633239326235 +33363234333965353863343965373061346562393566323565393531336637363931656362343739 +65373165623535313766643864666162376535393437343335393661633430643039383461636131 +39373533336134396561623761383338373734623537336565363836303435646237326633336363 +35343631666235383566323564626137616636373830646262633661393432666430386638646233 +63323864613765363539666235653864363335333530616364356138353361663031663237616161 +61666132313635313364353433646232326165353034376333383738633433383635316232323837 +36633566653330623161636139383566313235623061386339373966346437323265386163626431 +36653534336265626439636261376230643463353765386632666361613636383237383731656461 +63353138353836376336376265356565363634633337393133346633666664386430386437333564 +61386334393766313464643666653864306564356633623037656330383331633165323539393737 +34353331373764633666643032336136386632393735643133386465396530346239326333643364 +65323035363066393431663537643231613038336361386566303034343363346164396563336531 +33636137313839303963613564356338363833386430346132656333323366303464353163353632 +34373165353762383030303439663936646263656439616266396265663835626538326537353833 +38633761623331643263356538353263663863393233303139346132383964363735353334626532 +35356138386661643232353237306462326465306430303362363864376630343937623938383464 +32616537653136646330333033653461313565656535306236663530363934663730663331363964 +32313833653239363162326237316430363535306138323865663733396361646563626230326332 +65313366313362376363343939326135623365366564323364383364663639663863663337363236 +37363131613837333539393938626637633139373332303062303636343830656532396562386161 +30323233363334643164313835373761363566306461313633336365313033343731616632373263 +31616433643566393139353666373964323838666133613030396661353238323737616235663135 +61666532623636336237653532616135366465623534366134613961343636303334313633366436 +62653936336666373839656631353330396139383137343834366339653534663832333533303062 +65616561376564323337353362383663353439623539383839393132653964653634353031333030 +35666561313534663134616539343165333665303632643132396632353261643566303839373465 +30353833306563656639316365356563323638326634316362653137393435336364333738353031 +66656632343134616439336337336161353834626462383761656561663062386561316636326135 +63643436336463396364633763653735303766396539373861656162623434323539613031663839 +66653330386135646539353338663066653037366464306233386136323838616237306162303530 +63643638643963363131653035396565333862353632643733383136366635313839623766303531 +63336338666162646130646134613162636365663061623635336464313435333962316162383363 +37393434313062663037656437383036363066373561373335386239663837326431333264373439 +34636236383361343138343037316462323339346662346333643761663336666235383461376334 +30666136643164633564666564613231633361303339663833343264633031333465306237303334 +64356165663263616566663437303935353264393538613766336563623730636562656635646266 +66383339343738656431346333383537653338386466343736666138633930366235396138383461 +36623763333761643833383262613436353563393134653765656139633665376230333034336137 +30623131353265333665346631653535613538663537613238373237646564333438356466383161 +61326362306335363461343566626661623533656133306437343766303437316534363133646333 +32613032323434363166356133316162303166383766623665623062316135626332303935303335 +37306332326464323431393631663839633366653837663338366432333334303439646532326165 +62386162303533343664373665303265326432663331613262323738303337623037363962613537 +66616161303435323436356262663463633963303933386336623161616665626436383264373864 +37313561616361353166633039306265653237376363633930663235663732653834366131373038 +35623565356363616532323133346338383138316639303063306134386663613361343038613736 +66363765346139353363306566613132363461353332353230343364313538633936306632383038 +33343266393136633263376366336635633864393331646333356234353162373733326633373630 +66323261633933333834653363333932336164633637363939323462333233653535333335323736 +32643332333539356562366666663734353234323534616434616562323666323462306336396164 +38396536326232346361616131333364646239643231353135376334613335386462346138646136 +36346163333566383937353261643264656433393766653461623734316566333539303961306432 +39326638616234303166306534633738396565353138323635333335356432343861616332623538 +33336533343730313066633930366130396566343031303935643962643133386133623365613663 +64393564653230643165373732616563366631363239336637383139626232316461373037366164 +36303263616338663564623861663433653761663836613835656162303865323631363138386130 +37393731613837363835383639336535336633393733613964613637633161363431613232663436 +35393739316165343335363065633863663737373134616430333966333037613361353533343064 +35383037373334333963336335323737653436356465646161313237313431623461663335346566 +33303761383736623538366438306134633538336634336330643861343136303635643763303063 +65376430343136393436383030653862393832633066663834343562373830313936326265613964 +62326163383233303938666263346464343630373533623466336130333238656631613761666365 +36373930336162323563633932633832393335323064353339373962616165643763666230653735 +65653966336263633565323666656237336261333463653866636363633539623630626336353763 +35316538363432396533333561636462373764363438386238623735623166613931386166646630 +36353632383763383664616436653363633639656262313833323237386561386236616362626532 +62383430346436656639376433333937306438353461343834656261336163366563643062626463 +33353662393836396233326330353830356435626234646538643235643661313736353836363235 +32616133396530346339383163616331336331666366613030616263306531303361383261376262 +31396432356536623366336562373833343733313432613763343462336131313837666435323639 +30303033656466313832656231383132323134666136386538363034663264343039353763373261 +63646236366365393964613965613664643539623136343161346338383236376262616465353465 +62346135366237303030313533373864613538313337613162636162623462383631356636313336 +63303831353662643239633434356537396531333930373633623836316436633236623431353066 +62383366316261396632643062373233346532616261616330303437653336366433323534323030 +30343937323363303063386436363432343065366330383762666233366234383162303364303631 +35346163303061323633306466636562303934663835366630383266346361626235663931663837 +64643034646539626231616133383035363937643432633261386361623263313362636664323632 +35336131663863626630373066316335343561303635663934613632373234363264663864383831 +35366165386466393130316664656437326432613866613238366232643833316361313038356631 +63383737363062323632366561373030613338343837656330633366613435353336653161373833 +66663237333733343033386563663661663862363339393430376534643661653462653432663533 +39343330646635353034313338323733396362663339633664376339663839663730306565633166 +66643237316231323334633864353139396664376538343566306535616364396263316131666232 +30656663623535373439363830383561323831353664383133366362613938306437353630353035 +62646639346334376434346461303462303635396362336138633839393030396235313132626163 +37303532636433333466633734306363646566343236353731616463383863346434393134326461 +65373430343064363462666234653464313638616466363035633663306131366361623630373039 +35636662613366366263623361313465306236376262316263343666343136303533323562653165 +34323063356133623961303738623337396431306264663761646235343338646332376530663433 +36363864633964303235386530326161323639393861613062343764626361623730616435393034 +64366264646561326461383132626330316166623339663435303339383064656365613133656637 +31383133306436363863323537373932393937646539643835323466323937333766356339656164 +35326661373637353535623135353530313536323733623736333033326564356538393935616437 +38316366663932323364333238316333373366366238633832393933313436346461306265356430 +61393834643763616634303232626164386461323966666631366534336465663435316137616330 +31373232633565636261323530323165636161366534306437366236666430393765353866623539 +31626532356564663230353338383565646635336265653262626231613832396263616666613462 +32653034643737363931646634346339633366653730303066623039643035303337373538303761 +33326533313863323931616638646231323964626434613133643531613631306364616266366563 +31646237396235623162643130313563343734313363663037393734313663326335373038376139 +62323136366231623238306362396638396334663237633436386239663031373734386437333562 +30646266616331653131653236336634343563636233613731613665316565376565363865666336 +62343234373163643238333830383065613033343934393338373966336530373135346235363262 +63633265633939666665396630336461626533343935643665323332323131633833626466356131 +34313531303939666666356430326236353534623634616661343363303562666138326266643331 +63653163353337393330303762323537373865643765363930323661316136346536313964653338 +62343063303636363463373362346234353731323235373163336337643038376439343834643462 +39313137323637643766343266303761343636373932383633656437356530663233613564643037 +64393863393431663064393062323536663332643134316539333264633033393036643962643261 +31316164333735353830383061646633333838613761393665346562633362663034613635336564 +33303033616633386466653837386338383163383038636532323437666431656263373966623939 +63623664353430383963386430613734646164643935623534323865303036306665373433313139 +30663363656331663834666530386165326366353837666434666264356566666236363534623632 +64383232333232653833636366653133376432626531633861333938333765626432613933626130 +65336664653461666664623330356539356534636365306464373030313636333465623132346130 +32343834663332323934346137643832363531303238366130326365313038363339303738666136 +30343435333661343032613164666138343434643433643034643637303131663765386362343534 +39346236333734323338326134656562303361616639666361633936383735313635313238303033 +36643638353638356132636138626239633666373365653830656562323263633564393437323539 +32656664336636613734666638653633353439623630643531393436343039376161396335336635 +62646432356463623266323061366663656163626535343735623064386437386338656363343235 +30613431313035313236333666373861323166636338646361363466323834313633656231616165 +31643439356565313531613734623439383937383835383866326164373633626662663536383234 +32323030346335623166653063366533663866383736333561656463333566616631333165653038 +35386531346561656663366535663565323234386361306633336136663033376264333539646136 +34323233356330343065383335366362353165633736323862396165626337313333666164396262 +33343034656261336630646464303266656137356434383738383738336235386236353664356337 +61356264663231653637356265343930626430386166303333303437386333623464386363653939 +33376431663539386331633830623363303636313537636465366130353338386430626433323332 +35393533303436343138303934366632626365373635636661386639643431333463303466656633 +38326436376134613931643563396261353638363637363364666631643632343633373731663837 +32663233343463666234663931623962643932613033343561393366303563653637646137376162 +38653330376131306332626532626539653433623430383262636531653864333665373962323532 +36386636336264666664353033323061363165373565396231353637323837346532633666636266 +34376566386230613633313231613331346665373165323638633966623361376334633139393534 +36633935383362313932666464393137366537636632313431663935316166323833366530643437 +64616262666162326361306462306430653536346333666363616530393134323237343963336431 +37373532363862653666646135383762376133393433303762373362313466353732333935373866 +36386561343234663663633931616632373933383866346534636633346138303236613438386665 +38633364353236643439326664663939336639336562613538363363303936346566346163633436 +38626265643833643432663166393132323330393466633736663236663830636132626237613166 +37323431306636343565356261333636353739313763663266383633613363633935313033646333 +64613434633262383162393662626461616336356563326139356136313931636132306662373861 +36383761396666363239353635666666646233626635613830323332363136356135363163306463 +61393965383632613734356230366631306462323163343065643331343738383762633065663237 +39636534623231366635623239316537306461306330373565633731376263316165653361643031 +61343334366634373238303263393665623836366139313661636466663034383934376464356163 +34646234643432376138663131363533373138313763616264353834303430636339396163613065 +65376661323936656234303935613633306363623662666236653961323564373333653536323937 +34353962636638393664313539666565663738613966383133646161336338313935343730653561 +39643438333234646534316565653864376363386439363838363738386533636638663138643866 +66356266346562323535313934356262353330616662636232656230346263316566623937326233 +39663362373162376565303538623734316463646361326634373038313236663838656664633662 +66636537333837616331346665623338306131386161666435343362316130353034616164643064 +64663638353361616438643431633263643133383164646166623833383838626335393837373437 +62313431646434656466386564323037333662386636636361396635633662383265646332316236 +61643239306430306331323137333663626633323961366561313730626462663630643734623736 +36613339356539396265643061323030323530323439313034393134303132333265363934643436 +63363437323334646537353335303532353666363362356163346334633638633936313936393336 +32643438323132623261336362396135616364613461376338336261373535383134666339653464 +36343637326431343639336237363239376661653439613462343839326331376236613766333237 +63623565626464376533636263623730343065393166636630343035653466313539316230346532 +39653164383839653034383362336662323833656632396262623766333234313835386535393661 +36653935323066643130373636633630336335396430316261616132663066373432643363386563 +39646337316463346539366566373763333133366435613433613764386430666439656136613265 +66663735393166313438633665393465316336336437326337336330353838373965343535333430 +30323833393962646535616461613331363965343734313636376531393934396139326438343531 +31366437643464343464356337633137303563656130313361653465383532643263383830353139 +34303965326562656132623862613935666137376161623735653662373261633035653037666362 +65313934333963623431386636613630363564613231353933366436366134376337666336323739 +63653565623538663366376262373731303433396638333732643834313430653632313737316435 +65363462653561343130643837383266393438623866643136623666373764323363646533333966 +30373665356237656639323132373731313365636161393934346665656561356562363036326161 +36663566303530356537636238383439376435316561613466666538356436343663663336623765 +32306536356334623061383965633338633466633931356330323965373065646135623366613636 +39653065343433323231663261626262313634656631376161646562636334653736363863306462 +64643936393661323237336533653566316264336537386630366562353862633462623533623839 +32633436323031366230616664373136313639636266333538323062323231623634643931376234 +36363666666137656230633430333635616362356330653162363163323961653062383334363330 +61636432646566346239386638306663346233613866336434376336666164373662303964363766 +64636136346365396236656238323630346534363966363930613264316161383933313766313032 +32343663626139303133626462366438396463643433656437386264323330363464373866323466 +64396333326562363063353236373831616661373861633437303932373333343535376639636163 +30316661303266376536303364346461306563663232643633316334393832316664363231633764 +66653962663064646236353566613935396532373364353938336266613233633065646463663639 +34393334323862336531323832313637623565393633316431613639396561353737343134613434 +31363465663364366262373236616639363665653165373561346430303432316565333237326138 +34626130373436336161636632666331653762656463323764646536613132303062643965616235 +31383839383632643463363365663133373637613938393535346335393630666566396137303365 +39623762383165616530333035393736663666333739356232373137333137653763386637363239 +35323536373566326432333834666135663463343330316433376435633766663139656137626539 +39396437333833326665633037653732366335376439626565326339313037316432376438353539 +64666634646333343934343966383461386530653934396264633262383165666663643539343435 +39373665393834663137346133346439303766646130626437376136383964363138313663656239 +65636334356334613933373335356130373833323634363330333337623566363038353366356133 +62636362613737343635346236633530633033313431376439656565343662636535383762376162 +35303637336433646531363137623731383663623035653164653232363533316437376436303238 +39363630323466353633343166393038623239626632333135623230393062343431353231383961 +35383761613566613934636633343361613133626536316637323631386431346232663031396236 +64306261666536303664343662396464343031383036326139633863633237656466373764656533 +64383037343063643563306133656137663162616637653131373836303636323930323232653834 +61623732336561343331633364396637343138363266336134316135663762393263333637363630 +33633964666262396361343832303033373662386231333531333064373430666435303762363764 +65383332313330386231663966396532396232623935353162396431613034643538393939373835 +63363561363863393737353730336564323633663735346138613562616236353631393739636637 +66633234303965303734323665303333633663353936363933323731656464626337343337623433 +62343666356562613964653662363434383563343636386137353365393537333735623934623237 +38393664636634633764333936613566346465663538613532393265376662663663656632323565 +36366539363266663338306237306563663133656162656566643466643138666462643237383661 +36326436373438373730626363396563376538313731323532373330366136656535353463396336 +3634336533353830663239353138313336623131353063313538