Преглед на файлове

무결성 유지할 방법을 도통 못 찾아서 Golang 분리 포기

잉여개발기 (SPDV) преди 2 години
родител
ревизия
ed83107275
променени са 54 файла, в които са добавени 4055 реда и са изтрити 18 реда
  1. 0 5
      .gitignore
  2. 4 13
      route/tool/func.py
  3. BIN
      route_go/bin/main.amd64.bin
  4. BIN
      route_go/bin/main.amd64.exe
  5. BIN
      route_go/bin/main.arm64.bin
  6. BIN
      route_go/bin/main.arm64.exe
  7. 0 0
      route_go/bin/test.txt
  8. 62 0
      route_go/go.mod
  9. 222 0
      route_go/go.sum
  10. 85 0
      route_go/main.go
  11. 143 0
      route_go/route/api_bbs.go
  12. 93 0
      route_go/route/api_bbs_list.go
  13. 42 0
      route_go/route/api_bbs_w.go
  14. 71 0
      route_go/route/api_bbs_w_comment.go
  15. 24 0
      route_go/route/api_edit_move_all.go
  16. 20 0
      route_go/route/api_func_auth_list.go
  17. 23 0
      route_go/route/api_func_ip.go
  18. 23 0
      route_go/route/api_func_ip_menu.go
  19. 26 0
      route_go/route/api_func_language.go
  20. 56 0
      route_go/route/api_func_llm.go
  21. 19 0
      route_go/route/api_func_sha224.go
  22. 78 0
      route_go/route/api_list_old_page.go
  23. 185 0
      route_go/route/api_list_recent_block.go
  24. 169 0
      route_go/route/api_list_recent_change.go
  25. 152 0
      route_go/route/api_list_recent_discuss.go
  26. 116 0
      route_go/route/api_list_recent_edit_request.go
  27. 63 0
      route_go/route/api_list_title_index.go
  28. 87 0
      route_go/route/api_search.go
  29. 66 0
      route_go/route/api_setting.go
  30. 54 0
      route_go/route/api_setting_edit.go
  31. 138 0
      route_go/route/api_topic.go
  32. 115 0
      route_go/route/api_topic_list.go
  33. 64 0
      route_go/route/api_user_setting_editor.go
  34. 47 0
      route_go/route/api_user_setting_editor_delele.go
  35. 48 0
      route_go/route/api_user_setting_editor_insert.go
  36. 75 0
      route_go/route/api_user_watch_list.go
  37. 31 0
      route_go/route/api_w_random.go
  38. 86 0
      route_go/route/api_w_raw.go
  39. 19 0
      route_go/route/api_w_render.go
  40. 81 0
      route_go/route/api_w_set_reset.go
  41. 87 0
      route_go/route/api_w_watch_list.go
  42. 77 0
      route_go/route/api_w_xref.go
  43. 33 0
      route_go/route/main_func_easter_egg.go
  44. 78 0
      route_go/route/tool/db_connect.go
  45. 5 0
      route_go/route/tool/document.go
  46. 1 0
      route_go/route/tool/dokumark.go
  47. 481 0
      route_go/route/tool/ip_parser.go
  48. 44 0
      route_go/route/tool/language.go
  49. 163 0
      route_go/route/tool/markdown.go
  50. 25 0
      route_go/route/tool/monimark.go
  51. 227 0
      route_go/route/tool/namumark.go
  52. 176 0
      route_go/route/tool/render.go
  53. 25 0
      route_go/route/tool/some_tool.go
  54. 46 0
      route_go/windows_amd64.ps1

+ 0 - 5
.gitignore

@@ -33,10 +33,5 @@ views/sl_open
 views/nitori
 views/jsonnamu
 
-route_go/bin/main.amd64.bin
-route_go/bin/main.arm64.bin
-route_go/bin/main.amd64.exe
-route_go/bin/main.arm64.exe
-
 sitemap.xml
 sitemap_0.xml

+ 4 - 13
route/tool/func.py

@@ -695,20 +695,11 @@ def set_init_always(conn, ver_num):
             else:
                 exe_type = 'main.arm64.exe'
 
-        exe_path = os.path.join('.', 'route_go', 'bin', exe_type)
+        exe_path = os.path.join('.', 'route_go', 'bin')
 
-        if os.path.exists(exe_path):
-            os.remove(exe_path)
-        
-        print('Download dev ' + exe_type)
-
-        # https://raw.githubusercontent.com/openNAMU/GopenNAMU/beta/route_go/bin/main.amd64.bin
-        urllib.request.urlretrieve('https://raw.githubusercontent.com/openNAMU/GopenNAMU/dev/route_go/bin/' + exe_type, exe_path)
-        
-        if platform.system() == 'Linux':
-            os.system('chmod +x ./route_go/bin/' + exe_type)
-
-        print('Complete')
+        for for_a in os.listdir(exe_path):
+            if for_a != exe_type:
+                os.remove(os.path.join(exe_path, for_a))
 
 def set_init(conn):
     curs = conn.cursor()

BIN
route_go/bin/main.amd64.bin


BIN
route_go/bin/main.amd64.exe


BIN
route_go/bin/main.arm64.bin


BIN
route_go/bin/main.arm64.exe


+ 0 - 0
route_go/bin/test.txt


+ 62 - 0
route_go/go.mod

@@ -0,0 +1,62 @@
+module opennamu
+
+go 1.21
+
+toolchain go1.22.0
+
+require (
+	github.com/3th1nk/cidr v0.2.0
+	github.com/dlclark/regexp2 v1.11.0
+	github.com/go-sql-driver/mysql v1.8.1
+	github.com/google/generative-ai-go v0.11.0
+	github.com/yuin/goldmark v1.7.1
+	google.golang.org/api v0.175.0
+	modernc.org/sqlite v1.29.8
+)
+
+require (
+	cloud.google.com/go v0.112.2 // indirect
+	cloud.google.com/go/ai v0.4.0 // indirect
+	cloud.google.com/go/auth v0.2.2 // indirect
+	cloud.google.com/go/auth/oauth2adapt v0.2.1 // indirect
+	cloud.google.com/go/compute/metadata v0.3.0 // indirect
+	cloud.google.com/go/longrunning v0.5.6 // indirect
+	filippo.io/edwards25519 v1.1.0 // indirect
+	github.com/dustin/go-humanize v1.0.1 // indirect
+	github.com/felixge/httpsnoop v1.0.4 // indirect
+	github.com/go-logr/logr v1.4.1 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
+	github.com/golang/protobuf v1.5.4 // indirect
+	github.com/google/s2a-go v0.1.7 // indirect
+	github.com/google/uuid v1.6.0 // indirect
+	github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
+	github.com/googleapis/gax-go/v2 v2.12.3 // indirect
+	github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
+	github.com/mattn/go-isatty v0.0.20 // indirect
+	github.com/ncruces/go-strftime v0.1.9 // indirect
+	github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
+	go.opencensus.io v0.24.0 // indirect
+	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.50.0 // indirect
+	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 // indirect
+	go.opentelemetry.io/otel v1.25.0 // indirect
+	go.opentelemetry.io/otel/metric v1.25.0 // indirect
+	go.opentelemetry.io/otel/trace v1.25.0 // indirect
+	golang.org/x/crypto v0.22.0 // indirect
+	golang.org/x/net v0.24.0 // indirect
+	golang.org/x/oauth2 v0.19.0 // indirect
+	golang.org/x/sync v0.7.0 // indirect
+	golang.org/x/sys v0.19.0 // indirect
+	golang.org/x/text v0.14.0 // indirect
+	golang.org/x/time v0.5.0 // indirect
+	google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be // indirect
+	google.golang.org/grpc v1.63.2 // indirect
+	google.golang.org/protobuf v1.33.0 // indirect
+	modernc.org/gc/v3 v3.0.0-20240304020402-f0dba7c97c2b // indirect
+	modernc.org/libc v1.49.3 // indirect
+	modernc.org/mathutil v1.6.0 // indirect
+	modernc.org/memory v1.8.0 // indirect
+	modernc.org/strutil v1.2.0 // indirect
+	modernc.org/token v1.1.0 // indirect
+)

+ 222 - 0
route_go/go.sum

@@ -0,0 +1,222 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.112.2 h1:ZaGT6LiG7dBzi6zNOvVZwacaXlmf3lRqnC4DQzqyRQw=
+cloud.google.com/go v0.112.2/go.mod h1:iEqjp//KquGIJV/m+Pk3xecgKNhV+ry+vVTsy4TbDms=
+cloud.google.com/go/ai v0.4.0 h1:hoF8+joXKfW2Ug7MKssoffXCVUSxUqMUJL0hJxVtO1Q=
+cloud.google.com/go/ai v0.4.0/go.mod h1:iX72tmUodGXVDxRDCGUZEPiB9HaMeERXkOdgCkUi8sA=
+cloud.google.com/go/auth v0.2.2 h1:gmxNJs4YZYcw6YvKRtVBaF2fyUE6UrWPyzU8jHvYfmI=
+cloud.google.com/go/auth v0.2.2/go.mod h1:2bDNJWtWziDT3Pu1URxHHbkHE/BbOCuyUiKIGcNvafo=
+cloud.google.com/go/auth/oauth2adapt v0.2.1 h1:VSPmMmUlT8CkIZ2PzD9AlLN+R3+D1clXMWHHa6vG/Ag=
+cloud.google.com/go/auth/oauth2adapt v0.2.1/go.mod h1:tOdK/k+D2e4GEwfBRA48dKNQiDsqIXxLh7VU319eV0g=
+cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc=
+cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
+cloud.google.com/go/longrunning v0.5.6 h1:xAe8+0YaWoCKr9t1+aWe+OeQgN/iJK1fEgZSXmjuEaE=
+cloud.google.com/go/longrunning v0.5.6/go.mod h1:vUaDrWYOMKRuhiv6JBnn49YxCPz2Ayn9GqyjaBT8/mA=
+filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
+filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
+github.com/3th1nk/cidr v0.2.0 h1:81jjEknszD8SHPLVTPPk+BZjNVqq1ND2YXLSChl6Lrs=
+github.com/3th1nk/cidr v0.2.0/go.mod h1:XsSQnS4rEYyB2veDfnIGgViulFpIITPKtp3f0VxpiLw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
+github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
+github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
+github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
+github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
+github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
+github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
+github.com/google/generative-ai-go v0.11.0 h1:+wL9xu5jVIgJKC6NmZOxZsBYWDtIap7DGUZ1diQSSnk=
+github.com/google/generative-ai-go v0.11.0/go.mod h1:RauvbBjc+AzW0b1LV0VSlxHI5n2i3dz8oJfjboOSiWQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo=
+github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
+github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o=
+github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs=
+github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=
+github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA=
+github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4=
+github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
+github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
+github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
+github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
+github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
+github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/yuin/goldmark v1.7.1 h1:3bajkSilaCbjdKVsKdZjZCLBNPL9pYzrCakKaf4U49U=
+github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E=
+go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
+go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.50.0 h1:zvpPXY7RfYAGSdYQLjp6zxdJNSYD/+FFoCTQN9IPxBs=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.50.0/go.mod h1:BMn8NB1vsxTljvuorms2hyOs8IBuuBEq0pl7ltOfy30=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 h1:cEPbyTSEHlQR89XVlyo78gqluF8Y3oMeBkXGWzQsfXY=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0/go.mod h1:DKdbWcT4GH1D0Y3Sqt/PFXt2naRKDWtU+eE6oLdFNA8=
+go.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k=
+go.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=
+go.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA=
+go.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=
+go.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=
+go.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
+golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
+golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
+golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.19.0 h1:9+E/EZBCbTLNrbN35fHv/a/d/mOBatymz1zbtQrXpIg=
+golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
+golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
+golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
+golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw=
+golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.175.0 h1:9bMDh10V9cBuU8N45Wlc3cKkItfqMRV0Fi8UscLEtbY=
+google.golang.org/api v0.175.0/go.mod h1:Rra+ltKu14pps/4xTycZfobMgLpbosoaaL7c+SEMrO8=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be h1:Zz7rLWqp0ApfsR/l7+zSHhY3PMiH2xqgxlfYfAfNpoU=
+google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be/go.mod h1:dvdCTIoAGbkWbcIKBniID56/7XHTt6WfxXNMxuziJ+w=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be h1:LG9vZxsWGOmUKieR8wPAUR3u3MpnYFQZROPIMaXh7/A=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM=
+google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
+google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+modernc.org/cc/v4 v4.20.0 h1:45Or8mQfbUqJOG9WaxvlFYOAQO0lQ5RvqBcFCXngjxk=
+modernc.org/cc/v4 v4.20.0/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
+modernc.org/ccgo/v4 v4.16.0 h1:ofwORa6vx2FMm0916/CkZjpFPSR70VwTjUCe2Eg5BnA=
+modernc.org/ccgo/v4 v4.16.0/go.mod h1:dkNyWIjFrVIZ68DTo36vHK+6/ShBn4ysU61So6PIqCI=
+modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
+modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
+modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw=
+modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU=
+modernc.org/gc/v3 v3.0.0-20240304020402-f0dba7c97c2b h1:BnN1t+pb1cy61zbvSUV7SeI0PwosMhlAEi/vBY4qxp8=
+modernc.org/gc/v3 v3.0.0-20240304020402-f0dba7c97c2b/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4=
+modernc.org/libc v1.49.3 h1:j2MRCRdwJI2ls/sGbeSk0t2bypOG/uvPZUsGQFDulqg=
+modernc.org/libc v1.49.3/go.mod h1:yMZuGkn7pXbKfoT/M35gFJOAEdSKdxL0q64sF7KqCDo=
+modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
+modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
+modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E=
+modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU=
+modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
+modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
+modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc=
+modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss=
+modernc.org/sqlite v1.29.8 h1:nGKglNx9K5v0As+zF0/Gcl1kMkmaU1XynYyq92PbsC8=
+modernc.org/sqlite v1.29.8/go.mod h1:lQPm27iqa4UNZpmr4Aor0MH0HkCLbt1huYDfWylLZFk=
+modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
+modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
+modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
+modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=

+ 85 - 0
route_go/main.go

@@ -0,0 +1,85 @@
+package main
+
+import (
+	"fmt"
+	"log"
+	"opennamu/route"
+	"os"
+)
+
+func main() {
+	call_arg := os.Args[1:]
+
+	log.SetFlags(log.LstdFlags | log.Lshortfile)
+
+	var route_data string
+	if call_arg[0] == "main_func_easter_egg" {
+		route_data = route.Main_func_easter_egg()
+	} else if call_arg[0] == "api_w_raw" {
+		route_data = route.Api_w_raw(call_arg[1:])
+	} else if call_arg[0] == "api_func_sha224" {
+		route_data = route.Api_func_sha224(call_arg[1:])
+	} else if call_arg[0] == "api_w_random" {
+		route_data = route.Api_w_random(call_arg[1:])
+	} else if call_arg[0] == "api_search" {
+		route_data = route.Api_search(call_arg[1:])
+	} else if call_arg[0] == "api_topic" {
+		route_data = route.Api_topic(call_arg[1:])
+	} else if call_arg[0] == "api_func_ip" {
+		route_data = route.Api_func_ip(call_arg[1:])
+	} else if call_arg[0] == "api_list_recent_change" {
+		route_data = route.Api_list_recent_change(call_arg[1:])
+	} else if call_arg[0] == "api_list_recent_edit_request" {
+		route_data = route.Api_list_recent_edit_request(call_arg[1:])
+	} else if call_arg[0] == "api_bbs" {
+		route_data = route.Api_bbs(call_arg[1:])
+	} else if call_arg[0] == "api_w_xref" {
+		route_data = route.Api_w_xref(call_arg[1:])
+	} else if call_arg[0] == "api_w_watch_list" {
+		route_data = route.Api_w_watch_list(call_arg[1:])
+	} else if call_arg[0] == "api_user_watch_list" {
+		route_data = route.Api_user_watch_list(call_arg[1:])
+	} else if call_arg[0] == "api_w_render" {
+		route_data = route.Api_w_render(call_arg[1:])
+	} else if call_arg[0] == "api_func_llm" {
+		route_data = route.Api_func_llm(call_arg[1:])
+	} else if call_arg[0] == "api_func_language" {
+		route_data = route.Api_func_language(call_arg[1:])
+	} else if call_arg[0] == "api_func_auth_list" {
+		route_data = route.Api_func_auth_list(call_arg[1:])
+	} else if call_arg[0] == "api_list_recent_discuss" {
+		route_data = route.Api_list_recent_discuss(call_arg[1:])
+	} else if call_arg[0] == "api_bbs_list" {
+		route_data = route.Api_bbs_list(call_arg[1:])
+	} else if call_arg[0] == "api_list_old_page" {
+		route_data = route.Api_list_old_page(call_arg[1:])
+	} else if call_arg[0] == "api_topic_list" {
+		route_data = route.Api_topic_list(call_arg[1:])
+	} else if call_arg[0] == "api_bbs_w_comment_n" {
+		route_data = route.Api_bbs_w_comment(call_arg[1:])
+	} else if call_arg[0] == "api_bbs_w_n" {
+		route_data = route.Api_bbs_w(call_arg[1:])
+	} else if call_arg[0] == "api_w_set_reset" {
+		route_data = route.Api_w_set_reset(call_arg[1:])
+	} else if call_arg[0] == "api_list_recent_block" {
+		route_data = route.Api_list_recent_block(call_arg[1:])
+	} else if call_arg[0] == "api_list_title_index" {
+		route_data = route.Api_list_title_index(call_arg[1:])
+	} else if call_arg[0] == "api_user_setting_editor_insert" {
+		route_data = route.Api_user_setting_editor_insert(call_arg[1:])
+	} else if call_arg[0] == "api_user_setting_editor_delete" {
+		route_data = route.Api_user_setting_editor_delete(call_arg[1:])
+	} else if call_arg[0] == "api_user_setting_editor" {
+		route_data = route.Api_user_setting_editor(call_arg[1:])
+	} else if call_arg[0] == "api_setting" {
+		route_data = route.Api_setting(call_arg[1:])
+	} else if call_arg[0] == "api_setting_edit" {
+		route_data = route.Api_setting_edit(call_arg[1:])
+	} else if call_arg[0] == "api_func_ip_menu" {
+		route_data = route.Api_func_ip_menu(call_arg[1:])
+	} else {
+		log.Fatal(call_arg[0] + " is 404")
+	}
+
+	fmt.Print(route_data)
+}

+ 143 - 0
route_go/route/api_bbs.go

@@ -0,0 +1,143 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+	"strconv"
+)
+
+func Api_bbs(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	var rows []*sql.Rows
+	if other_set["bbs_num"] == "" {
+		var err error
+
+		row, err := db.Query(tool.DB_change("select set_code, set_id, '0' from bbs_data where set_name = 'date' order by set_data desc limit 50"))
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		rows = append(rows, row)
+	} else {
+		page, _ := strconv.Atoi(other_set["page"])
+		num := 0
+		if page*50 > 0 {
+			num = page*50 - 50
+		}
+
+		stmt, err := db.Prepare(tool.DB_change("select set_code, set_id, '1' from bbs_data where set_name = 'pinned' and set_id like ? order by set_data desc"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		row, err := stmt.Query(other_set["bbs_num"])
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		rows = append(rows, row)
+
+		stmt, err = db.Prepare(tool.DB_change("select set_code, set_id, '0' from bbs_data where set_name = 'title' and set_id like ? order by set_code + 0 desc limit ?, 50"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		row, err = stmt.Query(other_set["bbs_num"], num)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		rows = append(rows, row)
+	}
+
+	var data_list []map[string]string
+	ip_parser_temp := map[string][]string{}
+
+	for for_a := 0; for_a < len(rows); for_a++ {
+		defer rows[for_a].Close()
+
+		for rows[for_a].Next() {
+			temp_data := make(map[string]string)
+
+			var set_code string
+			var set_id string
+			var pinned string
+
+			err := rows[for_a].Scan(&set_code, &set_id, &pinned)
+			if err != nil {
+				log.Fatal(err)
+			}
+
+			temp_data["set_code"] = set_code
+			temp_data["set_id"] = set_id
+			temp_data["pinned"] = pinned
+
+			stmt, err := db.Prepare(tool.DB_change("select set_name, set_data, set_code, set_id from bbs_data where set_code = ? and set_id = ?"))
+			if err != nil {
+				log.Fatal(err)
+			}
+			defer stmt.Close()
+
+			rows, err := stmt.Query(set_code, set_id)
+			if err != nil {
+				log.Fatal(err)
+			}
+			defer rows.Close()
+
+			for rows.Next() {
+				var set_name string
+				var set_data string
+
+				err := rows.Scan(&set_name, &set_data, &set_code, &set_id)
+				if err != nil {
+					log.Fatal(err)
+				}
+
+				if set_name == "user_id" {
+					var ip_pre string
+					var ip_render string
+
+					if _, ok := ip_parser_temp[set_data]; ok {
+						ip_pre = ip_parser_temp[set_data][0]
+						ip_render = ip_parser_temp[set_data][1]
+					} else {
+						ip_pre = tool.IP_preprocess(db, set_data, other_set["ip"])[0]
+						ip_render = tool.IP_parser(db, set_data, other_set["ip"])
+
+						ip_parser_temp[set_data] = []string{ip_pre, ip_render}
+					}
+
+					set_data = ip_pre
+					temp_data["user_id_render"] = ip_render
+				}
+
+				if set_name != "data" && set_name != "pinned" {
+					temp_data[set_name] = set_data
+				}
+			}
+
+			data_list = append(data_list, temp_data)
+		}
+	}
+
+	return_data := make(map[string]interface{})
+	return_data["language"] = map[string]string{}
+
+	if len(data_list) == 0 {
+		return_data["data"] = map[string]string{}
+	} else {
+		return_data["data"] = data_list
+	}
+
+	json_data, _ := json.Marshal(return_data)
+	return string(json_data)
+}

+ 93 - 0
route_go/route/api_bbs_list.go

@@ -0,0 +1,93 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+)
+
+func bbs_list(db *sql.DB) map[string]string {
+	rows, err := db.Query(tool.DB_change("select set_data, set_id from bbs_set where set_name = 'bbs_name'"))
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer rows.Close()
+
+	data_list := map[string]string{}
+
+	for rows.Next() {
+		var name string
+		var id string
+
+		err := rows.Scan(&name, &id)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		data_list[name] = id
+	}
+
+	return data_list
+}
+
+func Api_bbs_list(call_arg []string) string {
+	db := tool.DB_connect()
+	defer db.Close()
+
+	data_list := bbs_list(db)
+	data_list_sub := map[string][]string{}
+
+	for k, v := range data_list {
+		stmt, err := db.Prepare(tool.DB_change("select set_data from bbs_set where set_name = 'bbs_type' and set_id = ?"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		var bbs_type string
+
+		err = stmt.QueryRow(v).Scan(&bbs_type)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				bbs_type = ""
+			} else {
+				log.Fatal(err)
+			}
+		}
+
+		stmt, err = db.Prepare(tool.DB_change("select set_data from bbs_data where set_id = ? and set_name = 'date' order by set_code + 0 desc limit 1"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		var bbs_date string
+
+		err = stmt.QueryRow(v).Scan(&bbs_date)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				bbs_date = ""
+			} else {
+				log.Fatal(err)
+			}
+		}
+
+		data_list_sub[k] = []string{v, bbs_type, bbs_date}
+	}
+
+	return_data := make(map[string]interface{})
+	return_data["language"] = map[string]string{
+		"thread_base":  tool.Get_language(db, "thread_base", false),
+		"comment_base": tool.Get_language(db, "comment_base", false),
+	}
+
+	if len(data_list_sub) == 0 {
+		return_data["data"] = map[string]string{}
+	} else {
+		return_data["data"] = data_list_sub
+	}
+
+	json_data, _ := json.Marshal(return_data)
+	return string(json_data)
+}

+ 42 - 0
route_go/route/api_bbs_w.go

@@ -0,0 +1,42 @@
+package route
+
+import (
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+)
+
+func Api_bbs_w(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	stmt, err := db.Prepare(tool.DB_change("select set_name, set_data from bbs_data where set_id = ? and set_code = ?"))
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer stmt.Close()
+
+	rows, err := stmt.Query(other_set["bbs_num"], other_set["post_num"])
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	data_list := map[string]string{}
+
+	for rows.Next() {
+		var set_name string
+		var set_data string
+
+		data_list[set_name] = set_data
+	}
+
+	return_data := make(map[string]interface{})
+	return_data["language"] = map[string]string{}
+	return_data["data"] = data_list
+
+	json_data, _ := json.Marshal(return_data)
+	return string(json_data)
+}

+ 71 - 0
route_go/route/api_bbs_w_comment.go

@@ -0,0 +1,71 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+	"strconv"
+)
+
+func Api_bbs_w_comment(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	if other_set["tool"] == "length" {
+		stmt, err := db.Prepare(tool.DB_change("select count(*) from bbs_data where set_name = 'comment_date' and set_id = ? order by set_code + 0 desc"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		var comment_length string
+		bbs_and_post_num := other_set["bbs_num"] + "-" + other_set["post_num"]
+
+		err = stmt.QueryRow(bbs_and_post_num).Scan(&comment_length)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				comment_length = "0"
+			} else {
+				log.Fatal(err)
+			}
+		}
+
+		stmt, err = db.Prepare(tool.DB_change("select count(*) from bbs_data where set_name = 'comment_date' and set_id like ? order by set_code + 0 desc"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		var reply_length string
+
+		err = stmt.QueryRow(bbs_and_post_num + "-%").Scan(&reply_length)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				reply_length = "0"
+			} else {
+				log.Fatal(err)
+			}
+		}
+
+		comment_length_int, _ := strconv.Atoi(comment_length)
+		reply_length_int, _ := strconv.Atoi(reply_length)
+
+		length_int := comment_length_int + reply_length_int
+		length_str := strconv.Itoa(length_int)
+
+		data_list := map[string]string{
+			"comment": comment_length,
+			"reply":   reply_length,
+			"data":    length_str,
+		}
+
+		json_data, _ := json.Marshal(data_list)
+		return string(json_data)
+	} else {
+		return ""
+	}
+}

+ 24 - 0
route_go/route/api_edit_move_all.go

@@ -0,0 +1,24 @@
+package route
+
+import (
+	"encoding/json"
+	"opennamu/route/tool"
+)
+
+func Api_edit_move_all(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	if other_set["select"] == "include" {
+
+	} else if other_set["select"] == "start" {
+
+	} else {
+
+	}
+
+	return ""
+}

+ 20 - 0
route_go/route/api_func_auth_list.go

@@ -0,0 +1,20 @@
+package route
+
+import (
+	"encoding/json"
+	"opennamu/route/tool"
+)
+
+func Api_func_auth_list(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	auth_name := tool.Get_user_auth(db, other_set["ip"])
+	auth_info := tool.Get_auth_group_info(db, auth_name)
+
+	json_data, _ := json.Marshal(auth_info)
+	return string(json_data)
+}

+ 23 - 0
route_go/route/api_func_ip.go

@@ -0,0 +1,23 @@
+package route
+
+import (
+	"encoding/json"
+
+	"opennamu/route/tool"
+)
+
+func Api_func_ip(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	ip_data := tool.IP_parser(db, other_set["data"], other_set["ip"])
+
+	new_data := map[string]string{}
+	new_data["data"] = ip_data
+
+	json_data, _ := json.Marshal(new_data)
+	return string(json_data)
+}

+ 23 - 0
route_go/route/api_func_ip_menu.go

@@ -0,0 +1,23 @@
+package route
+
+import (
+	"encoding/json"
+
+	"opennamu/route/tool"
+)
+
+func Api_func_ip_menu(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	ip_data := tool.IP_menu(db, other_set["ip"], other_set["my_ip"], other_set["option"])
+
+	new_data := make(map[string]interface{})
+	new_data["data"] = ip_data
+
+	json_data, _ := json.Marshal(new_data)
+	return string(json_data)
+}

+ 26 - 0
route_go/route/api_func_language.go

@@ -0,0 +1,26 @@
+package route
+
+import (
+	"encoding/json"
+	"opennamu/route/tool"
+)
+
+func Api_func_language(call_arg []string) string {
+	other_set := make(map[string]interface{})
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	data_list := map[string][]string{}
+	data_list["data"] = []string{}
+
+	temp_list := other_set["data"].([]interface{})
+
+	for for_a := 0; for_a < len(temp_list); for_a++ {
+		data_list["data"] = append(data_list["data"], tool.Get_language(db, temp_list[for_a].(string), false))
+	}
+
+	json_data, _ := json.Marshal(data_list)
+	return string(json_data)
+}

+ 56 - 0
route_go/route/api_func_llm.go

@@ -0,0 +1,56 @@
+package route
+
+import (
+	"context"
+	"database/sql"
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+
+	"github.com/google/generative-ai-go/genai"
+	"google.golang.org/api/option"
+)
+
+func Api_func_llm(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	var api_key string
+
+	stmt, err := db.Prepare(tool.DB_change("select data from user_set where name = 'llm_api_key' and id = ?"))
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer stmt.Close()
+
+	err = stmt.QueryRow(other_set["ip"]).Scan(api_key)
+	if err != nil {
+		if err == sql.ErrNoRows {
+			api_key = ""
+		} else {
+			log.Fatal(err)
+		}
+	}
+
+	ctx := context.Background()
+
+	client, err := genai.NewClient(ctx, option.WithAPIKey(api_key))
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer client.Close()
+
+	model := client.GenerativeModel("gemini-pro")
+	resp, err := model.GenerateContent(ctx, genai.Text(other_set["prompt"]))
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	text := resp.Candidates[0].Content.Parts[0]
+
+	json_data, _ := json.Marshal(map[string]genai.Part{"data": text})
+	return string(json_data)
+}

+ 19 - 0
route_go/route/api_func_sha224.go

@@ -0,0 +1,19 @@
+package route
+
+import (
+	"encoding/json"
+
+	"opennamu/route/tool"
+)
+
+func Api_func_sha224(call_arg []string) string {
+	data := call_arg[0]
+
+	hash_str := tool.Sha224(data)
+
+	new_data := map[string]string{}
+	new_data["data"] = hash_str
+
+	json_data, _ := json.Marshal(new_data)
+	return string(json_data)
+}

+ 78 - 0
route_go/route/api_list_old_page.go

@@ -0,0 +1,78 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+	"strconv"
+)
+
+func Api_list_old_page(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	page_int, err := strconv.Atoi(other_set["num"])
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	if page_int > 0 {
+		page_int = (page_int * 50) - 50
+	} else {
+		page_int = 0
+	}
+
+	var stmt *sql.Stmt
+
+	if other_set["set_type"] == "old" {
+		stmt, err = db.Prepare(tool.DB_change("select doc_name, set_data from data_set where set_name = 'last_edit' and doc_rev = '' and not (doc_name) in (select doc_name from data_set where set_name = 'doc_type' and set_data != '') order by set_data asc limit ?, 50"))
+	} else {
+		stmt, err = db.Prepare(tool.DB_change("select doc_name, set_data from data_set where set_name = 'last_edit' and doc_rev = '' and not (doc_name) in (select doc_name from data_set where set_name = 'doc_type' and set_data != '') order by set_data desc limit ?, 50"))
+	}
+
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer stmt.Close()
+
+	rows, err := stmt.Query(page_int)
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer rows.Close()
+
+	var data_list [][]string
+
+	for rows.Next() {
+		var doc_name string
+		var date string
+
+		err := rows.Scan(&doc_name, &date)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		stmt, err = db.Prepare(tool.DB_change("select set_data from data_set where doc_name = ? and set_name = 'doc_type'"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		data_list = append(data_list, []string{doc_name, date})
+	}
+
+	return_data := make(map[string]interface{})
+
+	if len(data_list) == 0 {
+		return_data["data"] = map[string]string{}
+	} else {
+		return_data["data"] = data_list
+	}
+
+	json_data, _ := json.Marshal(return_data)
+	return string(json_data)
+}

+ 185 - 0
route_go/route/api_list_recent_block.go

@@ -0,0 +1,185 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+	"strconv"
+)
+
+func Api_list_recent_block(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	page_int, err := strconv.Atoi(other_set["num"])
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	if page_int > 0 {
+		page_int = (page_int * 50) - 50
+	} else {
+		page_int = 0
+	}
+
+	var stmt *sql.Stmt
+	var rows *sql.Rows
+	if other_set["set_type"] == "all" {
+		stmt, err = db.Prepare(tool.DB_change("select why, block, blocker, end, today, band, ongoing from rb order by today desc limit ?, 50"))
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		rows, err = stmt.Query(page_int)
+		if err != nil {
+			log.Fatal(err)
+		}
+	} else if other_set["set_type"] == "ongoing" {
+		stmt, err = db.Prepare(tool.DB_change("select why, block, blocker, end, today, band, ongoing from rb where ongoing = '1' order by end desc limit ?, 50"))
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		rows, err = stmt.Query(page_int)
+		if err != nil {
+			log.Fatal(err)
+		}
+	} else if other_set["set_type"] == "regex" {
+		stmt, err = db.Prepare(tool.DB_change("select why, block, blocker, end, today, band, ongoing from rb where band = 'regex' order by today desc limit ?, 50"))
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		rows, err = stmt.Query(page_int)
+		if err != nil {
+			log.Fatal(err)
+		}
+	} else if other_set["set_type"] == "user" {
+		stmt, err = db.Prepare(tool.DB_change("select why, block, blocker, end, today, band, ongoing from rb where block = ? order by today desc limit ?, 50"))
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		rows, err = stmt.Query(other_set["user_name"], page_int)
+		if err != nil {
+			log.Fatal(err)
+		}
+	} else if other_set["set_type"] == "cidr" {
+		stmt, err = db.Prepare(tool.DB_change("select why, block, blocker, end, today, band, ongoing from rb where band = 'cidr' order by today desc limit ?, 50"))
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		rows, err = stmt.Query(page_int)
+		if err != nil {
+			log.Fatal(err)
+		}
+	} else {
+		stmt, err = db.Prepare(tool.DB_change("select why, block, blocker, end, today, band, ongoing from rb where blocker = ? order by today desc limit ?, 50"))
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		rows, err = stmt.Query(other_set["user_name"], page_int)
+		if err != nil {
+			log.Fatal(err)
+		}
+	}
+
+	defer stmt.Close()
+	defer rows.Close()
+
+	var data_list [][]string
+	ip_parser_temp := map[string][]string{}
+
+	for rows.Next() {
+		var why string
+		var block string
+		var blocker string
+		var end string
+		var today string
+		var band string
+		var ongoing string
+
+		err := rows.Scan(&why, &block, &blocker, &end, &today, &band, &ongoing)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		var ip_pre_blocker string
+		var ip_render_blocker string
+
+		if _, ok := ip_parser_temp[blocker]; ok {
+			ip_pre_blocker = ip_parser_temp[blocker][0]
+			ip_render_blocker = ip_parser_temp[blocker][1]
+		} else {
+			ip_pre_blocker = tool.IP_preprocess(db, blocker, other_set["ip"])[0]
+			ip_render_blocker = tool.IP_parser(db, blocker, other_set["ip"])
+
+			ip_parser_temp[blocker] = []string{ip_pre_blocker, ip_render_blocker}
+		}
+
+		var ip_pre_block string
+		var ip_render_block string
+
+		if band == "" {
+			if _, ok := ip_parser_temp[block]; ok {
+				ip_pre_block = ip_parser_temp[block][0]
+				ip_render_block = ip_parser_temp[block][1]
+			} else {
+				ip_pre_block = tool.IP_preprocess(db, block, other_set["ip"])[0]
+				ip_render_block = tool.IP_parser(db, block, other_set["ip"])
+
+				ip_parser_temp[block] = []string{ip_pre_block, ip_render_block}
+			}
+		} else {
+			ip_pre_block = block
+			ip_render_block = block
+		}
+
+		data_list = append(data_list, []string{
+			why,
+			ip_pre_block,
+			ip_render_block,
+			ip_pre_blocker,
+			ip_render_blocker,
+			end,
+			today,
+			band,
+			ongoing,
+		})
+	}
+
+	return_data := make(map[string]interface{})
+	return_data["language"] = map[string]string{
+		"all":         tool.Get_language(db, "all", false),
+		"regex":       tool.Get_language(db, "regex", false),
+		"cidr":        tool.Get_language(db, "cidr", false),
+		"in_progress": tool.Get_language(db, "in_progress", false),
+		"admin":       tool.Get_language(db, "admin", false),
+		"blocked":     tool.Get_language(db, "blocked", false),
+		"limitless":   tool.Get_language(db, "limitless", false),
+		"release":     tool.Get_language(db, "release", false),
+		"start":       tool.Get_language(db, "start", false),
+		"end":         tool.Get_language(db, "end", false),
+		"ban":         tool.Get_language(db, "ban", false),
+	}
+
+	if len(data_list) == 0 {
+		return_data["data"] = map[string]string{}
+	} else {
+		return_data["data"] = data_list
+	}
+
+	auth_name := tool.Get_user_auth(db, other_set["ip"])
+	auth_info := tool.Get_auth_group_info(db, auth_name)
+
+	return_data["auth"] = auth_info
+
+	json_data, _ := json.Marshal(return_data)
+	return string(json_data)
+}

+ 169 - 0
route_go/route/api_list_recent_change.go

@@ -0,0 +1,169 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+	"strconv"
+)
+
+func Api_list_recent_change(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	set_type := other_set["set_type"]
+	if set_type == "edit" {
+		set_type = ""
+	}
+
+	limit_int, err := strconv.Atoi(other_set["limit"])
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	if limit_int > 50 || limit_int < 0 {
+		limit_int = 50
+	}
+
+	page_int, err := strconv.Atoi(other_set["num"])
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	if page_int > 0 {
+		page_int = (page_int * limit_int) - limit_int
+	} else {
+		page_int = 0
+	}
+
+	stmt, err := db.Prepare(tool.DB_change("select id, title from rc where type = ? order by date desc limit ?, ?"))
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer stmt.Close()
+
+	rows, err := stmt.Query(set_type, page_int, limit_int)
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer rows.Close()
+
+	var data_list [][]string
+
+	admin_auth := tool.Get_user_auth(db, other_set["ip"])
+	ip_parser_temp := map[string][]string{}
+
+	for rows.Next() {
+		var id string
+		var title string
+
+		err := rows.Scan(&id, &title)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		var date string
+		var ip string
+		var send string
+		var leng string
+		var hide string
+		var type_data string
+
+		stmt, err := db.Prepare(tool.DB_change("select date, ip, send, leng, hide, type from history where id = ? and title = ?"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		err = stmt.QueryRow(id, title).Scan(&date, &ip, &send, &leng, &hide, &type_data)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				date = ""
+				ip = ""
+				send = ""
+				leng = ""
+				hide = ""
+				type_data = ""
+			} else {
+				log.Fatal(err)
+			}
+		}
+
+		var ip_pre string
+		var ip_render string
+
+		if _, ok := ip_parser_temp[ip]; ok {
+			ip_pre = ip_parser_temp[ip][0]
+			ip_render = ip_parser_temp[ip][1]
+		} else {
+			ip_pre = tool.IP_preprocess(db, ip, other_set["ip"])[0]
+			ip_render = tool.IP_parser(db, ip, other_set["ip"])
+
+			ip_parser_temp[ip] = []string{ip_pre, ip_render}
+		}
+
+		if hide == "" || admin_auth != "" {
+			data_list = append(data_list, []string{
+				id,
+				title,
+				date,
+				ip_pre,
+				send,
+				leng,
+				hide,
+				ip_render,
+				type_data,
+			})
+		} else {
+			data_list = append(data_list, []string{"", "", "", "", "", "", hide, "", ""})
+		}
+	}
+
+	if other_set["legacy"] != "" {
+		if len(data_list) == 0 {
+			return "{}"
+		} else {
+			json_data, _ := json.Marshal(data_list)
+			return string(json_data)
+		}
+	} else {
+		auth_name := tool.Get_user_auth(db, other_set["ip"])
+		auth_info := tool.Get_auth_group_info(db, auth_name)
+
+		return_data := make(map[string]interface{})
+		return_data["language"] = map[string]string{
+			"tool":           tool.Get_language(db, "tool", false),
+			"normal":         tool.Get_language(db, "normal", false),
+			"edit":           tool.Get_language(db, "edit", false),
+			"move":           tool.Get_language(db, "move", false),
+			"delete":         tool.Get_language(db, "delete", false),
+			"revert":         tool.Get_language(db, "revert", false),
+			"new_doc":        tool.Get_language(db, "new_doc", false),
+			"edit_request":   tool.Get_language(db, "edit_request", false),
+			"user_document":  tool.Get_language(db, "user_document", false),
+			"raw":            tool.Get_language(db, "raw", false),
+			"compare":        tool.Get_language(db, "compare", false),
+			"history":        tool.Get_language(db, "history", false),
+			"hide":           tool.Get_language(db, "hide", false),
+			"history_delete": tool.Get_language(db, "history_delete", false),
+			"send_edit":      tool.Get_language(db, "send_edit", false),
+			"file":           tool.Get_language(db, "file", false),
+			"category":       tool.Get_language(db, "category", false),
+			"setting":        tool.Get_language(db, "setting", false),
+		}
+		return_data["auth"] = auth_info
+
+		if len(data_list) == 0 {
+			return_data["data"] = map[string]string{}
+		} else {
+			return_data["data"] = data_list
+		}
+
+		json_data, _ := json.Marshal(return_data)
+		return string(json_data)
+	}
+}

+ 152 - 0
route_go/route/api_list_recent_discuss.go

@@ -0,0 +1,152 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+	"strconv"
+)
+
+func Api_list_recent_discuss(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	limit_int, err := strconv.Atoi(other_set["limit"])
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	if limit_int > 50 || limit_int < 0 {
+		limit_int = 50
+	}
+
+	page_int, err := strconv.Atoi(other_set["num"])
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	if page_int > 0 {
+		page_int = (page_int * limit_int) - limit_int
+	} else {
+		page_int = 0
+	}
+
+	var stmt *sql.Stmt
+
+	set_type := other_set["set_type"]
+	if set_type == "normal" {
+		stmt, err = db.Prepare(tool.DB_change("select title, sub, date, code, stop, agree from rd order by date desc limit ?, ?"))
+	} else if set_type == "close" {
+		stmt, err = db.Prepare(tool.DB_change("select title, sub, date, code, stop, agree from rd where stop = 'O' order by date desc limit ?, ?"))
+	} else {
+		stmt, err = db.Prepare(tool.DB_change("select title, sub, date, code, stop, agree from rd where stop != 'O' order by date desc limit ?, ?"))
+	}
+
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer stmt.Close()
+
+	rows, err := stmt.Query(page_int, limit_int)
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer rows.Close()
+
+	var data_list [][]string
+	ip_parser_temp := map[string][]string{}
+
+	for rows.Next() {
+		var title string
+		var sub string
+		var date string
+		var code string
+		var stop string
+		var agree string
+
+		err := rows.Scan(&title, &sub, &date, &code, &stop, &agree)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		stmt, err := db.Prepare(tool.DB_change("select ip, id from topic where code = ? order by id + 0 desc limit 1"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		var ip string
+		var id string
+
+		err = stmt.QueryRow(code).Scan(&ip, &id)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				ip = ""
+			} else {
+				log.Fatal(err)
+			}
+		}
+
+		var ip_pre string
+		var ip_render string
+
+		if _, ok := ip_parser_temp[ip]; ok {
+			ip_pre = ip_parser_temp[ip][0]
+			ip_render = ip_parser_temp[ip][1]
+		} else {
+			ip_pre = tool.IP_preprocess(db, ip, other_set["ip"])[0]
+			ip_render = tool.IP_parser(db, ip, other_set["ip"])
+
+			ip_parser_temp[ip] = []string{ip_pre, ip_render}
+		}
+
+		data_list = append(data_list, []string{
+			title,
+			sub,
+			date,
+			code,
+			stop,
+			ip_pre,
+			ip_render,
+			id,
+			agree,
+		})
+	}
+
+	if other_set["legacy"] != "" {
+		if len(data_list) == 0 {
+			return "{}"
+		} else {
+			json_data, _ := json.Marshal(data_list)
+			return string(json_data)
+		}
+	} else {
+		auth_name := tool.Get_user_auth(db, other_set["ip"])
+		auth_info := tool.Get_auth_group_info(db, auth_name)
+
+		return_data := make(map[string]interface{})
+		return_data["language"] = map[string]string{
+			"tool":              tool.Get_language(db, "tool", false),
+			"normal":            tool.Get_language(db, "normal", false),
+			"close_discussion":  tool.Get_language(db, "close_discussion", false),
+			"open_discussion":   tool.Get_language(db, "open_discussion", false),
+			"closed":            tool.Get_language(db, "closed", false),
+			"agreed_discussion": tool.Get_language(db, "agreed_discussion", false),
+			"stop":              tool.Get_language(db, "stop", false),
+		}
+		return_data["auth"] = auth_info
+
+		if len(data_list) == 0 {
+			return_data["data"] = map[string]string{}
+		} else {
+			return_data["data"] = data_list
+		}
+
+		json_data, _ := json.Marshal(return_data)
+		return string(json_data)
+	}
+}

+ 116 - 0
route_go/route/api_list_recent_edit_request.go

@@ -0,0 +1,116 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+	"strconv"
+)
+
+func Api_list_recent_edit_request(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	limit_int, err := strconv.Atoi(other_set["limit"])
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	if limit_int > 50 || limit_int < 0 {
+		limit_int = 50
+	}
+
+	stmt, err := db.Prepare(tool.DB_change("select doc_name, doc_rev, set_data from data_set where set_name = 'edit_request_doing' order by set_data desc limit ?"))
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer stmt.Close()
+
+	rows, err := stmt.Query(limit_int)
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer rows.Close()
+
+	var doc_name string
+	var doc_rev string
+	var date string
+
+	var data_list [][]string
+	for rows.Next() {
+		err := rows.Scan(&doc_name, &doc_rev, &date)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		var ip string
+		var send string
+		var leng string
+
+		stmt, err := db.Prepare(tool.DB_change("select set_data from data_set where set_name = 'edit_request_user' and doc_rev = ? and doc_name = ?"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		err = stmt.QueryRow(doc_rev, doc_name).Scan(&ip)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				ip = ""
+			} else {
+				log.Fatal(err)
+			}
+		}
+
+		stmt, err = db.Prepare(tool.DB_change("select set_data from data_set where set_name = 'edit_request_send' and doc_rev = ? and doc_name = ?"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		err = stmt.QueryRow(doc_rev, doc_name).Scan(&send)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				send = ""
+			} else {
+				log.Fatal(err)
+			}
+		}
+
+		stmt, err = db.Prepare(tool.DB_change("select set_data from data_set where set_name = 'edit_request_leng' and doc_rev = ? and doc_name = ?"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		err = stmt.QueryRow(doc_rev, doc_name).Scan(&leng)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				leng = ""
+			} else {
+				log.Fatal(err)
+			}
+		}
+
+		data_list = append(data_list, []string{
+			doc_name,
+			doc_rev,
+			date,
+			tool.IP_preprocess(db, ip, other_set["ip"])[0],
+			send,
+			leng,
+			tool.IP_parser(db, ip, other_set["ip"]),
+		})
+	}
+
+	if len(data_list) == 0 {
+		return "{}"
+	} else {
+		json_data, _ := json.Marshal(data_list)
+		return string(json_data)
+	}
+}

+ 63 - 0
route_go/route/api_list_title_index.go

@@ -0,0 +1,63 @@
+package route
+
+import (
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+	"strconv"
+)
+
+func Api_list_title_index(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	page_int, err := strconv.Atoi(other_set["num"])
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	if page_int > 0 {
+		page_int = (page_int * 50) - 50
+	} else {
+		page_int = 0
+	}
+
+	stmt, err := db.Prepare(tool.DB_change("select title from data limit ?, 50"))
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer stmt.Close()
+
+	rows, err := stmt.Query(page_int)
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer rows.Close()
+
+	var data_list []string
+
+	for rows.Next() {
+		var title string
+
+		err := rows.Scan(&title)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		data_list = append(data_list, title)
+	}
+
+	return_data := make(map[string]interface{})
+
+	if len(data_list) == 0 {
+		return_data["data"] = map[string]string{}
+	} else {
+		return_data["data"] = data_list
+	}
+
+	json_data, _ := json.Marshal(return_data)
+	return string(json_data)
+}

+ 87 - 0
route_go/route/api_search.go

@@ -0,0 +1,87 @@
+package route
+
+import (
+	"encoding/json"
+	"log"
+	"strconv"
+
+	"opennamu/route/tool"
+)
+
+func Api_search(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	page, _ := strconv.Atoi(other_set["num"])
+	num := 0
+	if page*50 > 0 {
+		num = page*50 - 50
+	}
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	if other_set["search_type"] == "title" {
+		stmt, err := db.Prepare(tool.DB_change("select title from data where title collate nocase like ? order by title limit ?, 50"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		var title string
+		var title_list []string
+
+		rows, err := stmt.Query("%"+other_set["name"]+"%", num)
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer rows.Close()
+
+		for rows.Next() {
+			err := rows.Scan(&title)
+			if err != nil {
+				log.Fatal(err)
+			}
+
+			title_list = append(title_list, title)
+		}
+
+		if len(title_list) == 0 {
+			return "{}"
+		} else {
+			json_data, _ := json.Marshal(title_list)
+			return string(json_data)
+		}
+	} else {
+		stmt, err := db.Prepare(tool.DB_change("select title from data where data collate nocase like ? order by title limit ?, 50"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		var title string
+		var title_list []string
+
+		rows, err := stmt.Query("%"+other_set["name"]+"%", num)
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer rows.Close()
+
+		for rows.Next() {
+			err := rows.Scan(&title)
+			if err != nil {
+				log.Fatal(err)
+			}
+
+			title_list = append(title_list, title)
+		}
+
+		if len(title_list) == 0 {
+			return "{}"
+		} else {
+			json_data, _ := json.Marshal(title_list)
+			return string(json_data)
+		}
+	}
+}

+ 66 - 0
route_go/route/api_setting.go

@@ -0,0 +1,66 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+)
+
+func Api_setting(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	setting_acl := map[string]string{}
+
+	setting_acl["manage_404_page"] = ""
+	setting_acl["manage_404_page_content"] = ""
+
+	if val, ok := setting_acl[other_set["set_name"]]; ok {
+		if val != "" {
+			auth_name := tool.Get_user_auth(db, other_set["ip"])
+			auth_info := tool.Get_auth_group_info(db, auth_name)
+
+			if _, ok := auth_info["owner"]; !ok {
+				return_data := make(map[string]interface{})
+				return_data["response"] = "require auth"
+
+				json_data, _ := json.Marshal(return_data)
+				return string(json_data)
+			}
+		}
+
+		stmt, err := db.Prepare(tool.DB_change("select data from other where name = ?"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		var set_data string
+
+		err = stmt.QueryRow(other_set["set_name"]).Scan(&set_data)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				set_data = ""
+			} else {
+				log.Fatal(err)
+			}
+		}
+
+		return_data := make(map[string]interface{})
+		return_data["response"] = "ok"
+		return_data["data"] = set_data
+
+		json_data, _ := json.Marshal(return_data)
+		return string(json_data)
+	} else {
+		return_data := make(map[string]interface{})
+		return_data["response"] = "not exist"
+
+		json_data, _ := json.Marshal(return_data)
+		return string(json_data)
+	}
+}

+ 54 - 0
route_go/route/api_setting_edit.go

@@ -0,0 +1,54 @@
+package route
+
+import (
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+)
+
+func Api_setting_edit(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	auth_name := tool.Get_user_auth(db, other_set["ip"])
+	auth_info := tool.Get_auth_group_info(db, auth_name)
+
+	if _, ok := auth_info["owner"]; ok {
+		stmt, err := db.Prepare(tool.DB_change("delete from other where name = ?"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		_, err = stmt.Exec(other_set["set_name"])
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		stmt, err = db.Prepare(tool.DB_change("insert into other (name, data, coverage) values (?, ?, '')"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		_, err = stmt.Exec(other_set["set_name"], other_set["data"])
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		return_data := make(map[string]interface{})
+		return_data["response"] = "ok"
+
+		json_data, _ := json.Marshal(return_data)
+		return string(json_data)
+	} else {
+		return_data := make(map[string]interface{})
+		return_data["response"] = "require auth"
+
+		json_data, _ := json.Marshal(return_data)
+		return string(json_data)
+	}
+}

+ 138 - 0
route_go/route/api_topic.go

@@ -0,0 +1,138 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+
+	"opennamu/route/tool"
+)
+
+func Api_topic(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	if other_set["tool"] == "length" {
+		stmt, err := db.Prepare(tool.DB_change("select id from topic where code = ? order by id + 0 desc limit 1"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		var length string
+		err = stmt.QueryRow(other_set["topic_num"]).Scan(&length)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				length = "0"
+			} else {
+				log.Fatal(err)
+			}
+		}
+
+		new_data := map[string]string{}
+		new_data["length"] = length
+
+		json_data, _ := json.Marshal(new_data)
+		return string(json_data)
+	} else {
+		var rows *sql.Rows
+
+		if other_set["tool"] == "top" {
+			stmt, err := db.Prepare(tool.DB_change("select id, data, date, ip, block, top from topic where code = ? and top = 'O' order by id + 0 asc"))
+			if err != nil {
+				log.Fatal(err)
+			}
+			defer stmt.Close()
+
+			rows, err = stmt.Query(other_set["topic_num"])
+			if err != nil {
+				log.Fatal(err)
+			}
+		} else {
+			if other_set["s_num"] != "" && other_set["e_num"] != "" {
+				stmt, err := db.Prepare(tool.DB_change("select id, data, date, ip, block, top from topic where code = ? and ? + 0 <= id + 0 and id + 0 <= ? + 0 order by id + 0 asc"))
+				if err != nil {
+					log.Fatal(err)
+				}
+				defer stmt.Close()
+
+				rows, err = stmt.Query(other_set["topic_num"], other_set["s_num"], other_set["e_num"])
+				if err != nil {
+					log.Fatal(err)
+				}
+			} else {
+				stmt, err := db.Prepare(tool.DB_change("select id, data, date, ip, block, top from topic where code = ? order by id + 0 asc"))
+				if err != nil {
+					log.Fatal(err)
+				}
+				defer stmt.Close()
+
+				rows, err = stmt.Query(other_set["topic_num"])
+				if err != nil {
+					log.Fatal(err)
+				}
+			}
+		}
+		defer rows.Close()
+
+		var id, data, date, ip, block, top string
+		var data_list [][]string
+		ip_parser_temp := map[string][]string{}
+
+		for rows.Next() {
+			err := rows.Scan(&id, &data, &date, &ip, &block, &top)
+			if err != nil {
+				log.Fatal(err)
+			}
+
+			data_list = append(data_list, []string{id, data, date, ip, block, top})
+		}
+
+		new_data := make(map[string]interface{})
+		new_data["data"] = []map[string]string{}
+		data_slice := []map[string]string{}
+
+		admin_auth := tool.Get_user_auth(db, other_set["ip"])
+
+		var ip_pre string
+		var ip_render string
+
+		for for_a := 0; for_a < len(data_list); for_a++ {
+			data := ""
+			if data_list[for_a][4] != "O" || admin_auth != "" {
+				data = data_list[for_a][1]
+			}
+
+			if _, ok := ip_parser_temp[data_list[for_a][3]]; ok {
+				ip_pre = ip_parser_temp[data_list[for_a][3]][0]
+				ip_render = ip_parser_temp[data_list[for_a][3]][1]
+			} else {
+				ip_pre = tool.IP_preprocess(db, data_list[for_a][3], other_set["ip"])[0]
+				ip_render = tool.IP_parser(db, data_list[for_a][3], other_set["ip"])
+
+				ip_parser_temp[data_list[for_a][3]] = []string{ip_pre, ip_render}
+			}
+
+			data_slice = append(data_slice, map[string]string{
+				"id":        data_list[for_a][0],
+				"data":      data,
+				"date":      data_list[for_a][2],
+				"ip":        ip_pre,
+				"ip_render": ip_render,
+				"blind":     data_list[for_a][4],
+			})
+		}
+
+		new_data["data"] = data_slice
+		new_data["language"] = map[string]string{
+			"tool":   tool.Get_language(db, "tool", false),
+			"render": tool.Get_language(db, "render", false),
+		}
+
+		json_data, _ := json.Marshal(new_data)
+		return string(json_data)
+	}
+}

+ 115 - 0
route_go/route/api_topic_list.go

@@ -0,0 +1,115 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+	"strconv"
+)
+
+func Api_topic_list(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	page_int, err := strconv.Atoi(other_set["num"])
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	if page_int > 0 {
+		page_int = (page_int * 50) - 50
+	} else {
+		page_int = 0
+	}
+
+	stmt, err := db.Prepare(tool.DB_change("select code, sub, stop, agree, date from rd where title = ? order by sub asc limit ?, 50"))
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer stmt.Close()
+
+	rows, err := stmt.Query(other_set["name"], page_int)
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer rows.Close()
+
+	var data_list [][]string
+	ip_parser_temp := map[string][]string{}
+
+	for rows.Next() {
+		var code string
+		var sub string
+		var stop string
+		var agree string
+		var date string
+
+		err := rows.Scan(&code, &sub, &stop, &agree, &date)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		stmt, err := db.Prepare(tool.DB_change("select ip, id from topic where code = ? order by id + 0 desc limit 1"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		var ip string
+		var id string
+
+		err = stmt.QueryRow(code).Scan(&ip, &id)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				ip = ""
+			} else {
+				log.Fatal(err)
+			}
+		}
+
+		var ip_pre string
+		var ip_render string
+
+		if _, ok := ip_parser_temp[ip]; ok {
+			ip_pre = ip_parser_temp[ip][0]
+			ip_render = ip_parser_temp[ip][1]
+		} else {
+			ip_pre = tool.IP_preprocess(db, ip, other_set["ip"])[0]
+			ip_render = tool.IP_parser(db, ip, other_set["ip"])
+
+			ip_parser_temp[ip] = []string{ip_pre, ip_render}
+		}
+
+		data_list = append(data_list, []string{
+			code,
+			sub,
+			stop,
+			agree,
+			ip_pre,
+			ip_render,
+			date,
+			id,
+		})
+	}
+
+	return_data := make(map[string]interface{})
+	return_data["language"] = map[string]string{
+		"closed":            tool.Get_language(db, "closed", false),
+		"agreed_discussion": tool.Get_language(db, "agreed_discussion", false),
+		"make_new_topic":    tool.Get_language(db, "make_new_topic", false),
+		"stop":              tool.Get_language(db, "stop", false),
+	}
+
+	if len(data_list) == 0 {
+		return_data["data"] = map[string]string{}
+	} else {
+		return_data["data"] = data_list
+	}
+
+	json_data, _ := json.Marshal(return_data)
+	return string(json_data)
+}

+ 64 - 0
route_go/route/api_user_setting_editor.go

@@ -0,0 +1,64 @@
+package route
+
+import (
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+)
+
+func Api_user_setting_editor(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	ip := other_set["ip"]
+	if !tool.IP_or_user(ip) {
+		stmt, err := db.Prepare(tool.DB_change("select data from user_set where id = ? and name = 'user_editor_top'"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		rows, err := stmt.Query(ip)
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer rows.Close()
+
+		var data_list []string
+
+		for rows.Next() {
+			var data string
+
+			err := rows.Scan(&data)
+			if err != nil {
+				log.Fatal(err)
+			}
+
+			data_list = append(data_list, data)
+		}
+
+		return_data := make(map[string]interface{})
+		return_data["response"] = "ok"
+
+		if len(data_list) == 0 {
+			return_data["data"] = map[string]string{}
+		} else {
+			return_data["data"] = data_list
+		}
+
+		json_data, _ := json.Marshal(return_data)
+		return string(json_data)
+	} else {
+		return_data := make(map[string]interface{})
+		return_data["response"] = "require auth"
+		return_data["language"] = map[string]string{
+			"authority_error": tool.Get_language(db, "authority_error", false),
+		}
+
+		json_data, _ := json.Marshal(return_data)
+		return string(json_data)
+	}
+}

+ 47 - 0
route_go/route/api_user_setting_editor_delele.go

@@ -0,0 +1,47 @@
+package route
+
+import (
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+)
+
+func Api_user_setting_editor_delete(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	ip := other_set["ip"]
+	if !tool.IP_or_user(ip) {
+		stmt, err := db.Prepare(tool.DB_change("delete from user_set where id = ? and name = 'user_editor_top' and data = ?"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		_, err = stmt.Exec(ip, other_set["data"])
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		return_data := make(map[string]interface{})
+		return_data["response"] = "ok"
+		return_data["language"] = map[string]string{
+			"delete": tool.Get_language(db, "delete", false),
+		}
+
+		json_data, _ := json.Marshal(return_data)
+		return string(json_data)
+	} else {
+		return_data := make(map[string]interface{})
+		return_data["response"] = "require auth"
+		return_data["language"] = map[string]string{
+			"authority_error": tool.Get_language(db, "authority_error", false),
+		}
+
+		json_data, _ := json.Marshal(return_data)
+		return string(json_data)
+	}
+}

+ 48 - 0
route_go/route/api_user_setting_editor_insert.go

@@ -0,0 +1,48 @@
+package route
+
+import (
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+)
+
+func Api_user_setting_editor_insert(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	ip := other_set["ip"]
+
+	if !tool.IP_or_user(ip) {
+		stmt, err := db.Prepare(tool.DB_change("insert into user_set (id, name, data) values (?, 'user_editor_top', ?)"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		_, err = stmt.Exec(ip, other_set["data"])
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		return_data := make(map[string]interface{})
+		return_data["response"] = "ok"
+		return_data["language"] = map[string]string{
+			"save": tool.Get_language(db, "save", false),
+		}
+
+		json_data, _ := json.Marshal(return_data)
+		return string(json_data)
+	} else {
+		return_data := make(map[string]interface{})
+		return_data["response"] = "require auth"
+		return_data["language"] = map[string]string{
+			"authority_error": tool.Get_language(db, "authority_error", false),
+		}
+
+		json_data, _ := json.Marshal(return_data)
+		return string(json_data)
+	}
+}

+ 75 - 0
route_go/route/api_user_watch_list.go

@@ -0,0 +1,75 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+	"strconv"
+)
+
+func Api_user_watch_list(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	page, _ := strconv.Atoi(other_set["num"])
+	num := 0
+	if page*50 > 0 {
+		num = page*50 - 50
+	}
+
+	ip := other_set["ip"]
+	name := other_set["name"]
+	if ip != name && tool.Get_user_auth(db, ip) == "" {
+		return "{}"
+	}
+
+	var stmt *sql.Stmt
+	var err error
+	if other_set["do_type"] == "star_doc" {
+		stmt, err = db.Prepare(tool.DB_change("select data from user_set where name = 'star_doc' and id = ? limit ?, 50"))
+	} else {
+		stmt, err = db.Prepare(tool.DB_change("select data from user_set where name = 'watchlist' and id = ? limit ?, 50"))
+	}
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer stmt.Close()
+
+	rows, err := stmt.Query(name, num)
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer rows.Close()
+
+	var data_list []string
+
+	for rows.Next() {
+		var title_data string
+
+		err := rows.Scan(&title_data)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		data_list = append(data_list, title_data)
+	}
+
+	return_data := make(map[string]interface{})
+	return_data["language"] = map[string]string{
+		"watchlist": tool.Get_language(db, "watchlist", false),
+		"star_doc":  tool.Get_language(db, "star_doc", false),
+	}
+
+	if len(data_list) == 0 {
+		return_data["data"] = map[string]string{}
+	} else {
+		return_data["data"] = data_list
+	}
+
+	json_data, _ := json.Marshal(return_data)
+	return string(json_data)
+}

+ 31 - 0
route_go/route/api_w_random.go

@@ -0,0 +1,31 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+
+	"opennamu/route/tool"
+)
+
+func Api_w_random(call_arg []string) string {
+	db := tool.DB_connect()
+	defer db.Close()
+
+	var title string
+
+	err := db.QueryRow(tool.DB_change("select title from data where title not like 'user:%' and title not like 'category:%' and title not like 'file:%' order by random() limit 1")).Scan(&title)
+	if err != nil {
+		if err == sql.ErrNoRows {
+			title = ""
+		} else {
+			log.Fatal(err)
+		}
+	}
+
+	new_data := map[string]string{}
+	new_data["data"] = title
+
+	json_data, _ := json.Marshal(new_data)
+	return string(json_data)
+}

+ 86 - 0
route_go/route/api_w_raw.go

@@ -0,0 +1,86 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+
+	"opennamu/route/tool"
+)
+
+func Api_w_raw(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	if other_set["exist_check"] != "" {
+		stmt, err := db.Prepare(tool.DB_change("select title from data where title = ?"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		new_data := map[string]string{}
+		var title string
+
+		err = stmt.QueryRow(other_set["name"]).Scan(&title)
+		if err != nil {
+			if err == sql.ErrNoRows {
+			} else {
+				log.Fatal(err)
+			}
+		} else {
+			new_data["exist"] = "1"
+		}
+
+		json_data, _ := json.Marshal(new_data)
+		return string(json_data)
+	} else {
+		new_data := map[string]string{}
+		var data string
+
+		if other_set["rev"] != "" {
+			stmt, err := db.Prepare(tool.DB_change("select data from history where title = ? and id = ?"))
+			if err != nil {
+				log.Fatal(err)
+			}
+			defer stmt.Close()
+
+			err = stmt.QueryRow(other_set["name"], other_set["rev"]).Scan(&data)
+			if err != nil {
+				if err == sql.ErrNoRows {
+				} else {
+					log.Fatal(err)
+				}
+			} else {
+				new_data["title"] = other_set["name"]
+				new_data["data"] = data
+			}
+
+			json_data, _ := json.Marshal(new_data)
+			return string(json_data)
+		} else {
+			stmt, err := db.Prepare(tool.DB_change("select data from data where title = ?"))
+			if err != nil {
+				log.Fatal(err)
+			}
+			defer stmt.Close()
+
+			err = stmt.QueryRow(other_set["name"]).Scan(&data)
+			if err != nil {
+				if err == sql.ErrNoRows {
+				} else {
+					log.Fatal(err)
+				}
+			} else {
+				new_data["title"] = other_set["name"]
+				new_data["data"] = data
+			}
+
+			json_data, _ := json.Marshal(new_data)
+			return string(json_data)
+		}
+	}
+}

+ 19 - 0
route_go/route/api_w_render.go

@@ -0,0 +1,19 @@
+package route
+
+import (
+	"encoding/json"
+	"opennamu/route/tool"
+)
+
+func Api_w_render(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	data := tool.Get_render(db, other_set["doc_name"], other_set["data"], other_set["render_type"])
+
+	json_data, _ := json.Marshal(data)
+	return string(json_data)
+}

+ 81 - 0
route_go/route/api_w_set_reset.go

@@ -0,0 +1,81 @@
+package route
+
+import (
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+)
+
+func Api_w_set_reset(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	doc_name := other_set["name"]
+	ip := other_set["ip"]
+	auth_name := tool.Get_user_auth(db, ip)
+	auth_info := tool.Get_auth_group_info(db, auth_name)
+
+	if auth_info["owner"] {
+		stmt, err := db.Prepare(tool.DB_change("delete from acl where title = ?"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		_, err = stmt.Exec(doc_name)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		stmt, err = db.Prepare(tool.DB_change("delete from data_set where doc_name = ? and set_name = 'acl_date'"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		_, err = stmt.Exec(doc_name)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		set_list := []string{
+			"document_markup",
+			"document_top",
+			"document_editor_top",
+		}
+
+		for for_a := 0; for_a < len(set_list); for_a++ {
+			stmt, err = db.Prepare(tool.DB_change("delete from data_set where doc_name = ? and set_name = ?"))
+			if err != nil {
+				log.Fatal(err)
+			}
+			defer stmt.Close()
+
+			_, err = stmt.Exec(doc_name, set_list[for_a])
+			if err != nil {
+				log.Fatal(err)
+			}
+		}
+
+		return_data := make(map[string]interface{})
+		return_data["response"] = "ok"
+		return_data["language"] = map[string]string{
+			"reset": tool.Get_language(db, "reset", false),
+		}
+
+		json_data, _ := json.Marshal(return_data)
+		return string(json_data)
+	} else {
+		return_data := make(map[string]interface{})
+		return_data["response"] = "require auth"
+		return_data["language"] = map[string]string{
+			"authority_error": tool.Get_language(db, "authority_error", false),
+		}
+
+		json_data, _ := json.Marshal(return_data)
+		return string(json_data)
+	}
+}

+ 87 - 0
route_go/route/api_w_watch_list.go

@@ -0,0 +1,87 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+	"strconv"
+)
+
+func Api_w_watch_list(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	page, _ := strconv.Atoi(other_set["num"])
+	num := 0
+	if page*50 > 0 {
+		num = page*50 - 50
+	}
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	if tool.Get_user_auth(db, other_set["ip"]) == "" {
+		return "{}"
+	}
+
+	var stmt *sql.Stmt
+	var err error
+	if other_set["do_type"] == "star_doc" {
+		stmt, err = db.Prepare(tool.DB_change("select id from user_set where name = 'star_doc' and data = ? limit ?, 50"))
+	} else {
+		stmt, err = db.Prepare(tool.DB_change("select id from user_set where name = 'watchlist' and data = ? limit ?, 50"))
+	}
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer stmt.Close()
+
+	rows, err := stmt.Query(other_set["name"], num)
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer rows.Close()
+
+	var data_list [][]string
+	ip_parser_temp := map[string][]string{}
+
+	for rows.Next() {
+		var user_name string
+
+		err := rows.Scan(&user_name)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		var ip_pre string
+		var ip_render string
+
+		if _, ok := ip_parser_temp[user_name]; ok {
+			ip_pre = ip_parser_temp[user_name][0]
+			ip_render = ip_parser_temp[user_name][1]
+		} else {
+			ip_pre = tool.IP_preprocess(db, user_name, other_set["ip"])[0]
+			ip_render = tool.IP_parser(db, user_name, other_set["ip"])
+
+			ip_parser_temp[user_name] = []string{ip_pre, ip_render}
+		}
+
+		data_list = append(data_list, []string{ip_pre, ip_render})
+	}
+
+	return_data := make(map[string]interface{})
+	return_data["language"] = map[string]string{
+		"watchlist": tool.Get_language(db, "watchlist", false),
+		"star_doc":  tool.Get_language(db, "star_doc", false),
+	}
+
+	if len(data_list) == 0 {
+		return_data["data"] = map[string]string{}
+	} else {
+		return_data["data"] = data_list
+	}
+
+	json_data, _ := json.Marshal(return_data)
+	return string(json_data)
+}

+ 77 - 0
route_go/route/api_w_xref.go

@@ -0,0 +1,77 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+	"strconv"
+)
+
+func Api_w_xref(call_arg []string) string {
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &other_set)
+
+	db := tool.DB_connect()
+	defer db.Close()
+
+	page, _ := strconv.Atoi(other_set["page"])
+	num := 0
+	if page*50 > 0 {
+		num = page*50 - 50
+	}
+
+	var link_case_insensitive string
+
+	err := db.QueryRow(tool.DB_change("select data from other where name = 'link_case_insensitive'")).Scan(&link_case_insensitive)
+	if err != nil {
+		if err == sql.ErrNoRows {
+			link_case_insensitive = ""
+		} else {
+			log.Fatal(err)
+		}
+	}
+
+	if link_case_insensitive != "" {
+		link_case_insensitive = " collate nocase"
+	}
+
+	var stmt *sql.Stmt
+	if other_set["do_type"] == "1" {
+		stmt, err = db.Prepare(tool.DB_change("select distinct link, type from back where title" + link_case_insensitive + " = ? and not type = 'no' and not type = 'nothing' order by type asc, link asc limit ?, 50"))
+	} else {
+		stmt, err = db.Prepare(tool.DB_change("select distinct title, type from back where link" + link_case_insensitive + " = ? and not type = 'no' and not type = 'nothing' order by type asc, title asc limit ?, 50"))
+	}
+
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer stmt.Close()
+
+	rows, err := stmt.Query(other_set["name"], num)
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer rows.Close()
+
+	var name string
+	var type_data string
+
+	var data_list [][]string
+
+	for rows.Next() {
+		err := rows.Scan(&name, &type_data)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		data_list = append(data_list, []string{name, type_data})
+	}
+
+	if len(data_list) == 0 {
+		return "{}"
+	} else {
+		json_data, _ := json.Marshal(data_list)
+		return string(json_data)
+	}
+}

+ 33 - 0
route_go/route/main_func_easter_egg.go

@@ -0,0 +1,33 @@
+package route
+
+import (
+	"math/rand"
+)
+
+func Main_func_easter_egg() string {
+	select_list := []string{
+		"PWD0ZbR7AOY", // Shanghai Teahouse ~ Chinese Tea
+		"HoU29ljOmTE", // Flawless Clothing of Celestials
+		"PR2vUm-Ald8", // U.N. Owen Was Her
+		"opZoEmsu_Lo", // Night of Nights
+		"txZFFTusSvw", // Reach for the Moon ~ Immortal Smoke
+		"Ixq9xL2tvRU", // Phantom Ensemble
+		"-3IAx_r4Au0", // Entrusting This World to Idols ~ Idolatrize World
+		"wObZkycA6sc", // Last Remote
+		"hZxYLa97gDg", // Emotional Skyscraper ~ Cosmic Mind
+		"hwn2kw4eFJM", // Border of Life
+		"wX2t_8HOtiY", // Voyage 1969
+		"tLQjcf45fKE", // Necrofantasia
+		"7DvMRAMuMrU", // Where Is That Bustling Marketplace Now ~ Immemorial Marketeers
+		// Remix by NyxTheShield
+		"SXFP9HgWBYQ", // 세계는 귀엽게 만들어져 있다
+		"YDrgO0Oj3Fg", // 죽취비상
+		"wxWV_sUGPB0", // 디자이어 드라이브
+		"uw0h2O7UaZ8", // 100번째 블랙 마켓
+		"blE4lnfEWbU", // 일렉트릭 헤리티지
+		// Remix by KR. Palto47
+	}
+	select_str := select_list[rand.Intn(len(select_list)-1)]
+
+	return "<iframe width=\"640\" height=\"360\" src=\"https://www.youtube.com/embed/" + select_str + "\" frameborder=\"0\" allowfullscreen></iframe>"
+}

+ 78 - 0
route_go/route/tool/db_connect.go

@@ -0,0 +1,78 @@
+package tool
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+	"strings"
+
+	_ "github.com/go-sql-driver/mysql"
+	_ "modernc.org/sqlite"
+)
+
+func Temp_DB_connect() *sql.DB {
+	db, err := sql.Open("sqlite", "./data/temp.db")
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	return db
+}
+
+func DB_connect() *sql.DB {
+	m_db := Temp_DB_connect()
+	defer m_db.Close()
+
+	var db_set_str string
+
+	err := m_db.QueryRow("select data from temp where name = 'db_set'").Scan(&db_set_str)
+	if err != nil {
+		if err == sql.ErrNoRows {
+			db_set_str = "{}"
+		} else {
+			log.Fatal(err)
+		}
+	}
+
+	db_set := map[string]string{}
+	json.Unmarshal([]byte(db_set_str), &db_set)
+
+	if db_set["type"] == "sqlite" {
+		db, err := sql.Open("sqlite", db_set["name"]+".db")
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		return db
+	} else {
+		db, err := sql.Open("mysql", db_set["mysql_user"]+":"+db_set["mysql_pw"]+"@tcp("+db_set["mysql_host"]+":"+db_set["mysql_port"]+")/"+db_set["name"])
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		return db
+	}
+}
+
+func DB_change(data string) string {
+	m_db := Temp_DB_connect()
+	defer m_db.Close()
+
+	var db_set_type string
+
+	err := m_db.QueryRow("select data from temp where name = 'db_set_type'").Scan(&db_set_type)
+	if err != nil {
+		if err == sql.ErrNoRows {
+			db_set_type = "sqlite"
+		} else {
+			log.Fatal(err)
+		}
+	}
+
+	if db_set_type == "mysql" {
+		data = strings.Replace(data, "random()", "rand()", -1)
+		data = strings.Replace(data, "collate nocase", "collate utf8mb4_general_ci", -1)
+	}
+
+	return data
+}

+ 5 - 0
route_go/route/tool/document.go

@@ -0,0 +1,5 @@
+package tool
+
+func Add_history() {
+
+}

+ 1 - 0
route_go/route/tool/dokumark.go

@@ -0,0 +1 @@
+package tool

+ 481 - 0
route_go/route/tool/ip_parser.go

@@ -0,0 +1,481 @@
+package tool
+
+import (
+	"database/sql"
+	"log"
+	"regexp"
+	"strconv"
+	"strings"
+
+	"github.com/3th1nk/cidr"
+	"github.com/dlclark/regexp2"
+)
+
+func IP_or_user(ip string) bool {
+	match, _ := regexp.MatchString("(\\.|:)", ip)
+	if match {
+		return true
+	} else {
+		return false
+	}
+}
+
+func Get_level(db *sql.DB, ip string) []string {
+	var level string
+	var exp string
+	var max_exp string
+
+	stmt, err := db.Prepare(DB_change("select data from user_set where id = ? and name = 'level'"))
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer stmt.Close()
+
+	err = stmt.QueryRow(ip).Scan(&level)
+	if err != nil {
+		if err == sql.ErrNoRows {
+			level = "0"
+		} else {
+			log.Fatal(err)
+		}
+	}
+
+	stmt, err = db.Prepare(DB_change("select data from user_set where id = ? and name = 'experience'"))
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer stmt.Close()
+
+	err = stmt.QueryRow(ip).Scan(&exp)
+	if err != nil {
+		if err == sql.ErrNoRows {
+			exp = "0"
+		} else {
+			log.Fatal(err)
+		}
+	}
+
+	level_int, _ := strconv.Atoi(level)
+	max_exp = strconv.Itoa(level_int*50 + 500)
+
+	return []string{level, exp, max_exp}
+}
+
+func Get_user_auth(db *sql.DB, ip string) string {
+	if !IP_or_user(ip) {
+		var auth string
+
+		stmt, err := db.Prepare(DB_change("select data from user_set where id = ? and name = 'acl'"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		err = stmt.QueryRow(ip).Scan(&auth)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				auth = "user"
+			} else {
+				log.Fatal(err)
+			}
+		}
+
+		if auth != "user" && auth != "ban" {
+			return auth
+		} else {
+			return ""
+		}
+	}
+
+	return ""
+}
+
+func Get_auth_group_info(db *sql.DB, auth string) map[string]bool {
+	stmt, err := db.Prepare(DB_change("select name from alist where name = ?"))
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer stmt.Close()
+
+	rows, err := stmt.Query(auth)
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer rows.Close()
+
+	data_list := map[string]bool{}
+
+	for rows.Next() {
+		var name string
+
+		err := rows.Scan(&name)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		data_list[name] = true
+	}
+
+	return data_list
+}
+
+func IP_preprocess(db *sql.DB, ip string, my_ip string) []string {
+	var ip_view string
+	var user_name_view string
+
+	ip_split := strings.Split(ip, ":")
+	if len(ip_split) != 1 && ip_split[0] == "tool" {
+		return []string{ip, ""}
+	}
+
+	err := db.QueryRow(DB_change("select data from other where name = 'ip_view'")).Scan(&ip_view)
+	if err != nil {
+		if err == sql.ErrNoRows {
+			ip_view = ""
+		} else {
+			log.Fatal(err)
+		}
+	}
+
+	err = db.QueryRow(DB_change("select data from other where name = 'user_name_view'")).Scan(&user_name_view)
+	if err != nil {
+		if err == sql.ErrNoRows {
+			user_name_view = ""
+		} else {
+			log.Fatal(err)
+		}
+	}
+
+	if Get_user_auth(db, my_ip) != "" {
+		ip_view = ""
+		user_name_view = ""
+	}
+
+	ip_change := ""
+	if IP_or_user(ip) {
+		if ip_view != "" && ip != my_ip {
+			hash_ip := Sha224(ip)
+			ip = hash_ip[:10]
+			ip_change = "true"
+		}
+	} else {
+		if user_name_view != "" {
+			var sub_user_name string
+
+			stmt, err := db.Prepare(DB_change("select data from user_set where id = ? and name = 'sub_user_name'"))
+			if err != nil {
+				log.Fatal(err)
+			}
+			defer stmt.Close()
+
+			err = stmt.QueryRow(ip).Scan(&sub_user_name)
+			if err != nil {
+				if err == sql.ErrNoRows {
+					sub_user_name = Get_language(db, "member", false)
+				} else {
+					log.Fatal(err)
+				}
+			}
+
+			if sub_user_name == "" {
+				sub_user_name = Get_language(db, "member", false)
+			}
+
+			ip = sub_user_name
+			ip_change = "true"
+		} else {
+			var user_name string
+
+			stmt, err := db.Prepare(DB_change("select data from user_set where name = 'user_name' and id = ?"))
+			if err != nil {
+				log.Fatal(err)
+			}
+			defer stmt.Close()
+
+			err = stmt.QueryRow(ip).Scan(&user_name)
+			if err != nil {
+				if err == sql.ErrNoRows {
+					user_name = ip
+				} else {
+					log.Fatal(err)
+				}
+			}
+
+			if user_name == "" {
+				user_name = ip
+			}
+
+			ip = user_name
+		}
+	}
+
+	return []string{ip, ip_change}
+}
+
+func IP_menu(db *sql.DB, ip string, my_ip string, option string) map[string][][]string {
+	menu := map[string][][]string{}
+
+	if ip == my_ip && option == "" {
+		stmt, err := db.Prepare(DB_change("select count(*) from user_notice where name = ? and readme = ''"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		var alarm_count string
+
+		err = stmt.QueryRow(my_ip).Scan(&alarm_count)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				alarm_count = "0"
+			} else {
+				log.Fatal(err)
+			}
+		}
+
+		if IP_or_user(my_ip) {
+			menu[Get_language(db, "login", false)] = [][]string{
+				{"/login", Get_language(db, "login", false)},
+				{"/register", Get_language(db, "register", false)},
+				{"/change", Get_language(db, "user_setting", false)},
+				{"/login/find", Get_language(db, "password_search", false)},
+				{"/alarm" + Url_parser(my_ip), Get_language(db, "alarm", false) + " (" + alarm_count + ")"},
+			}
+		} else {
+			menu[Get_language(db, "login", false)] = [][]string{
+				{"/logout", Get_language(db, "logout", false)},
+				{"/change", Get_language(db, "user_setting", false)},
+			}
+
+			menu[Get_language(db, "tool", false)] = [][]string{
+				{"/watch_list", Get_language(db, "watchlist", false)},
+				{"/star_doc", Get_language(db, "star_doc", false)},
+				{"/challenge", Get_language(db, "challenge_and_level_manage", false)},
+				{"/acl/user:" + Url_parser(my_ip), Get_language(db, "user_document_acl", false)},
+				{"/alarm" + Url_parser(my_ip), Get_language(db, "alarm", false) + " (" + alarm_count + ")"},
+			}
+		}
+	}
+
+	auth_name := Get_user_auth(db, my_ip)
+	if auth_name != "" {
+		menu[Get_language(db, "admin", false)] = [][]string{
+			{"/auth/give/ban/" + Url_parser(ip), Get_language(db, "ban", false)},
+			{"/list/user/check_submit/" + Url_parser(ip), Get_language(db, "check", false)},
+		}
+	}
+
+	menu[Get_language(db, "other", false)] = [][]string{
+		{"/record/" + Url_parser(ip), Get_language(db, "edit_record", false)},
+		{"/record/topic/" + Url_parser(ip), Get_language(db, "discussion_record", false)},
+		{"/record/bbs/" + Url_parser(ip), Get_language(db, "bbs_record", false)},
+		{"/record/bbs_comment/" + Url_parser(ip), Get_language(db, "bbs_comment_record", false)},
+		{"/topic/user:" + Url_parser(ip), Get_language(db, "user_discussion", false)},
+		{"/count/" + Url_parser(ip), Get_language(db, "count", false)},
+	}
+
+	return menu
+}
+
+func Get_user_ban_type(ban_type string) string {
+	if ban_type == "O" {
+		return "1"
+	} else if ban_type == "E" {
+		return "2"
+	} else {
+		return ""
+	}
+}
+
+func Get_user_ban(db *sql.DB, ip string, tool string) []string {
+	if Get_user_auth(db, ip) != "" {
+		return []string{"", ""}
+	}
+
+	rows, err := db.Query(DB_change("select login, block from rb where band = 'regex' and ongoing = '1'"))
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer rows.Close()
+
+	for rows.Next() {
+		var login string
+		var block string
+
+		err := rows.Scan(&login, &block)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		ban_type := Get_user_ban_type(login)
+
+		r := regexp2.MustCompile(block, 0)
+		if m, _ := r.FindStringMatch(ip); m != nil {
+			if tool == "login" {
+				if ban_type != "1" {
+					return []string{"true", "a" + ban_type}
+				}
+			} else if tool == "edit_request" {
+				if ban_type != "2" {
+					return []string{"true", "a" + ban_type}
+				}
+			} else {
+				return []string{"true", "a" + ban_type}
+			}
+		}
+	}
+
+	if IP_or_user(ip) {
+		rows, err = db.Query(DB_change("select login, block from rb where band = 'cidr' and ongoing = '1'"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer rows.Close()
+
+		for rows.Next() {
+			var login string
+			var block string
+
+			err := rows.Scan(&login, &block)
+			if err != nil {
+				log.Fatal(err)
+			}
+
+			ban_type := Get_user_ban_type(login)
+
+			c, _ := cidr.Parse(block)
+			if c.Contains(ip) {
+				if tool == "login" {
+					if ban_type != "1" {
+						return []string{"true", "b" + ban_type}
+					}
+				} else if tool == "edit_request" {
+					if ban_type != "2" {
+						return []string{"true", "b" + ban_type}
+					}
+				} else {
+					return []string{"true", "b" + ban_type}
+				}
+			}
+		}
+	}
+
+	stmt, err := db.Prepare(DB_change("select login from rb where block = ? and band = '' and ongoing = '1'"))
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer stmt.Close()
+
+	var login string
+
+	err = stmt.QueryRow(ip).Scan(&login)
+	if err != nil {
+		if err == sql.ErrNoRows {
+
+		} else {
+			log.Fatal(err)
+		}
+	} else {
+		ban_type := Get_user_ban_type(login)
+
+		if tool == "login" {
+			if ban_type != "1" {
+				return []string{"true", ban_type}
+			}
+		} else if tool == "edit_request" {
+			if ban_type != "2" {
+				return []string{"true", ban_type}
+			}
+		} else {
+			return []string{"true", ban_type}
+		}
+	}
+
+	stmt, err = db.Prepare(DB_change("select data from user_set where id = ? and name = 'acl'"))
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer stmt.Close()
+
+	var data string
+
+	err = stmt.QueryRow(ip).Scan(&data)
+	if err != nil {
+		if err == sql.ErrNoRows {
+
+		} else {
+			log.Fatal(err)
+		}
+	} else {
+		if data == "ban" {
+			return []string{"true", "c"}
+		}
+	}
+
+	return []string{"", ""}
+}
+
+func IP_parser(db *sql.DB, ip string, my_ip string) string {
+	ip_pre_data := IP_preprocess(db, ip, my_ip)
+	if ip_pre_data[0] == "" {
+		return ""
+	}
+
+	if ip_pre_data[1] != "" {
+		return ip_pre_data[0]
+	} else {
+		raw_ip := ip
+		ip = HTML_escape(ip_pre_data[0])
+
+		if !IP_or_user(raw_ip) {
+			var user_name_level string
+			var user_title string
+
+			err := db.QueryRow(DB_change("select data from other where name = 'user_name_level'")).Scan(&user_name_level)
+			if err != nil {
+				if err == sql.ErrNoRows {
+					user_name_level = ""
+				} else {
+					log.Fatal(err)
+				}
+			}
+
+			if user_name_level != "" {
+				level_data := Get_level(db, raw_ip)
+				ip += "<sup>" + level_data[0] + "</sup>"
+			}
+
+			ip = "<a href=\"/w/" + Url_parser("user:"+raw_ip) + "\">" + ip + "</a>"
+
+			stmt, err := db.Prepare(DB_change("select data from user_set where name = 'user_title' and id = ?"))
+			if err != nil {
+				log.Fatal(err)
+			}
+			defer stmt.Close()
+
+			err = stmt.QueryRow(raw_ip).Scan(&user_title)
+			if err != nil {
+				if err == sql.ErrNoRows {
+					user_title = ""
+				} else {
+					log.Fatal(err)
+				}
+			}
+
+			if Get_user_auth(db, raw_ip) != "" {
+				ip = "<b>" + ip + "</b>"
+			}
+
+			ip = user_title + ip
+		}
+
+		ban := Get_user_ban(db, raw_ip, "")
+		if ban[0] == "true" {
+			ip = "<sup>" + ban[1] + "</sup><s>" + ip + "</s>"
+		}
+
+		ip += "<a href=\"javascript:void(0);\" name=\"" + Url_parser(raw_ip) + "\" onclick=\"opennamu_do_ip_click(this);\"><span class=\"opennamu_svg opennamu_svg_tool\">&nbsp;</span></a>"
+
+		return ip
+	}
+}

+ 44 - 0
route_go/route/tool/language.go

@@ -0,0 +1,44 @@
+package tool
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+	"os"
+)
+
+func Get_language(db *sql.DB, data string, safe bool) string {
+	var language string
+
+	err := db.QueryRow(DB_change("select data from other where name = 'language'")).Scan(&language)
+	if err != nil {
+		if err == sql.ErrNoRows {
+			language = "ko-KR"
+		} else {
+			log.Fatal(err)
+		}
+	}
+
+	file, err := os.Open("./lang/" + language + ".json")
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer file.Close()
+
+	lang_data := map[string]string{}
+
+	decoder := json.NewDecoder(file)
+	if err := decoder.Decode(&lang_data); err != nil {
+		return ""
+	}
+
+	if _, ok := lang_data[data]; ok {
+		if safe {
+			return lang_data[data]
+		} else {
+			return HTML_escape(lang_data[data])
+		}
+	} else {
+		return data + " (" + language + ")"
+	}
+}

+ 163 - 0
route_go/route/tool/markdown.go

@@ -0,0 +1,163 @@
+package tool
+
+import (
+	"bytes"
+	"database/sql"
+	"log"
+	"net/url"
+	"regexp"
+	"strconv"
+	"strings"
+
+	"github.com/yuin/goldmark"
+	"github.com/yuin/goldmark/extension"
+	"github.com/yuin/goldmark/renderer/html"
+)
+
+func Markdown(db *sql.DB, data map[string]string) map[string]interface{} {
+	backlink := map[string]map[string]string{}
+	link_count := 0
+
+	raw_input := data["data"]
+
+	r := regexp.MustCompile(`\[\]\(([^\(\)]+)\)`)
+	raw_input = r.ReplaceAllStringFunc(raw_input, func(m string) string {
+		match := r.FindStringSubmatch(m)
+
+		return "[" + match[1] + "](" + match[1] + ")"
+	})
+
+	r = regexp.MustCompile(`\[([^\[\]]+)\]\(\)`)
+	raw_input = r.ReplaceAllStringFunc(raw_input, func(m string) string {
+		match := r.FindStringSubmatch(m)
+
+		return "[" + match[1] + "](" + match[1] + ")"
+	})
+
+	input := []byte(raw_input)
+	markdown := goldmark.New(
+		goldmark.WithExtensions(
+			extension.Strikethrough,
+			extension.Table,
+		),
+		goldmark.WithRendererOptions(
+			html.WithHardWraps(),
+		),
+	)
+
+	var buf bytes.Buffer
+	if err := markdown.Convert(input, &buf); err != nil {
+		panic(err)
+	}
+
+	string_data := buf.String()
+
+	code_stack := []int{}
+	code_stack_idx := 0
+	code_stack_end := map[string]string{}
+
+	r = regexp.MustCompile(`(<code>|<\/code>)`)
+	for idx := r.FindStringIndex(string_data); len(idx) != 0; idx = r.FindStringIndex(string_data) {
+		if string_data[idx[0]:idx[1]] == "<code>" {
+			code_stack = []int{idx[0], idx[1]}
+			string_data = strings.Replace(string_data, "<code>", "<0001>", 1)
+		} else {
+			string_data = strings.Replace(string_data, "<0001>", "<code>", -1)
+
+			code_stack_idx_str := strconv.Itoa(code_stack_idx)
+			code_stack_end["code_"+code_stack_idx_str] = string_data[code_stack[0]:idx[1]]
+			code_stack_idx++
+
+			string_data = string_data[:code_stack[0]] + "<code_" + code_stack_idx_str + ">" + string_data[idx[1]:]
+		}
+	}
+
+	// p := bluemonday.UGCPolicy()
+	// string_data := p.Sanitize(string_data)
+
+	r = regexp.MustCompile(`\[([^\[\]]+)\]\(([^\(\)]*)\)`)
+	string_data = r.ReplaceAllStringFunc(string_data, func(m string) string {
+		match := r.FindStringSubmatch(m)
+
+		link := match[2]
+		if link == "" {
+			link = match[1]
+		}
+
+		return "<a href=\"" + link + "\">" + match[1] + "</a>"
+	})
+
+	r = regexp.MustCompile(`<code_[0-9]+>`)
+	string_data = r.ReplaceAllStringFunc(string_data, func(m string) string {
+		m = strings.Replace(m, "<", "", 1)
+		m = strings.Replace(m, ">", "", 1)
+
+		return code_stack_end[m]
+	})
+
+	r = regexp.MustCompile(`<a href="([^"]+)"`)
+	string_data = r.ReplaceAllStringFunc(string_data, func(m string) string {
+		match := r.FindStringSubmatch(m)
+
+		m1, _ := regexp.MatchString(`^https?:\/\/`, match[1])
+		if m1 {
+			return "<a href=\"" + match[1] + "\" class=\"opennamu_link_out\" target=\"_blank\""
+		} else {
+			link := ""
+			link, _ = url.QueryUnescape(match[1])
+
+			if _, ok := backlink[link]; !ok {
+				backlink[link] = map[string]string{}
+			}
+
+			var exist string
+
+			stmt, err := db.Prepare(DB_change("select title from data where title = ?"))
+			if err != nil {
+				log.Fatal(err)
+			}
+			defer stmt.Close()
+
+			err = stmt.QueryRow(link).Scan(&exist)
+			if err != nil {
+				if err == sql.ErrNoRows {
+					exist = ""
+				} else {
+					log.Fatal(err)
+				}
+			}
+
+			backlink[link][""] = ""
+			link_count += 1
+
+			class := ""
+			if exist == "" {
+				class = "opennamu_not_exist_link"
+			}
+
+			return "<a href=\"/w/" + match[1] + "\" class=\"" + class + "\""
+		}
+	})
+
+	string_data = strings.Replace(string_data, "<ul>", "<ul class=\"opennamu_ul\">", -1)
+
+	end_backlink := [][]string{}
+	for k1, v1 := range backlink {
+		for k2, v2 := range v1 {
+			end_backlink = append(end_backlink, []string{
+				data["doc_name"],
+				k1,
+				k2,
+				v2,
+			})
+		}
+	}
+
+	end_data := make(map[string]interface{})
+	end_data["data"] = string_data
+	end_data["js_data"] = "opennamu_do_toc();"
+	end_data["backlink"] = end_backlink
+	end_data["link_count"] = link_count
+
+	return end_data
+}

+ 25 - 0
route_go/route/tool/monimark.go

@@ -0,0 +1,25 @@
+package tool
+
+import (
+	"strings"
+
+	"github.com/dlclark/regexp2"
+)
+
+// 모니마크 렌더러는 전체가 아니라 나무마크로 변환
+func Monimark(data string) string {
+	//
+	r := regexp2.MustCompile(`<<((?:(?!<<|>>)))>>`, 0)
+	for {
+		if m, _ := r.FindStringMatch(data); m != nil {
+			gps := m.Groups()
+			m_string := m.String()
+
+			data = strings.Replace(data, m_string, "[include("+gps[1].Captures[0].String()+")]", 1)
+		} else {
+			break
+		}
+	}
+
+	return data
+}

+ 227 - 0
route_go/route/tool/namumark.go

@@ -0,0 +1,227 @@
+package tool
+
+import (
+	"database/sql"
+	"html"
+	"log"
+	"regexp"
+	"strconv"
+	"strings"
+
+	"github.com/dlclark/regexp2"
+)
+
+type namumark struct {
+	db   *sql.DB
+	data map[string]string
+
+	render_data    string
+	render_data_js string
+
+	temp_data       map[string]string
+	temp_data_raw   map[string]string
+	temp_data_count int
+
+	backlink   [][]string
+	link_count int
+}
+
+func Namumark_new(db *sql.DB, data map[string]string) *namumark {
+	data_string := data["data"]
+	data_string = html.EscapeString(data_string)
+	data_string = strings.Replace(data_string, "\r", "", -1)
+	data_string = "\n" + data_string + "\n"
+
+	return &namumark{
+		db,
+		data,
+
+		data_string,
+		"",
+
+		map[string]string{},
+		map[string]string{},
+		0,
+
+		[][]string{},
+		0,
+	}
+}
+
+func (class *namumark) func_temp_save(data string, data_raw string) string {
+	name := "<temp_save_" + strconv.Itoa(class.temp_data_count) + ">"
+
+	class.temp_data[name] = data
+	class.temp_data_raw[name] = data_raw
+	class.temp_data_count += 1
+
+	return name
+}
+
+func (class namumark) func_temp_restore(data string, to_raw bool) string {
+	string_data := data
+
+	if to_raw {
+		for k, v := range class.temp_data_raw {
+			string_data = strings.Replace(string_data, k, v, 1)
+		}
+	} else {
+		for k, v := range class.temp_data {
+			string_data = strings.Replace(string_data, k, v, 1)
+		}
+	}
+
+	return string_data
+}
+
+func (class *namumark) render_text() {
+	string_data := class.render_data
+
+	r := regexp2.MustCompile(`&#39;&#39;&#39;((?:(?!&#39;&#39;&#39;).)+)&#39;&#39;&#39;`, 0)
+	for {
+		if m, _ := r.FindStringMatch(string_data); m != nil {
+			gps := m.Groups()
+			m_string := m.String()
+
+			temp_name := class.func_temp_save("<b>"+gps[1].Captures[0].String()+"</b>", m_string)
+			string_data = strings.Replace(string_data, m_string, temp_name, 1)
+		} else {
+			break
+		}
+	}
+
+	r = regexp2.MustCompile(`&#39;&#39;((?:(?!&#39;&#39;).)+)&#39;&#39;`, 0)
+	for {
+		if m, _ := r.FindStringMatch(string_data); m != nil {
+			gps := m.Groups()
+			m_string := m.String()
+
+			temp_name := class.func_temp_save("<i>"+gps[1].Captures[0].String()+"</i>", m_string)
+			string_data = strings.Replace(string_data, m_string, temp_name, 1)
+		} else {
+			break
+		}
+	}
+
+	r = regexp2.MustCompile(`__((?:(?!__).)+)__`, 0)
+	for {
+		if m, _ := r.FindStringMatch(string_data); m != nil {
+			gps := m.Groups()
+			m_string := m.String()
+
+			temp_name := class.func_temp_save("<u>"+gps[1].Captures[0].String()+"</u>", m_string)
+			string_data = strings.Replace(string_data, m_string, temp_name, 1)
+		} else {
+			break
+		}
+	}
+
+	r_list := []string{`\^\^\^((?:(?!\^\^\^).)+)\^\^\^`, `\^\^((?:(?!\^\^).)+)\^\^`}
+	for for_a := 0; for_a < len(r_list); for_a++ {
+		r = regexp2.MustCompile(r_list[for_a], 0)
+		for {
+			if m, _ := r.FindStringMatch(string_data); m != nil {
+				gps := m.Groups()
+				m_string := m.String()
+
+				temp_name := class.func_temp_save("<sup>"+gps[1].Captures[0].String()+"</sup>", m_string)
+				string_data = strings.Replace(string_data, m_string, temp_name, 1)
+			} else {
+				break
+			}
+		}
+	}
+
+	r_list = []string{`,,,((?:(?!,,,).)+),,,`, `,,((?:(?!,,).)+),,`}
+	for for_a := 0; for_a < len(r_list); for_a++ {
+		r = regexp2.MustCompile(r_list[for_a], 0)
+		for {
+			if m, _ := r.FindStringMatch(string_data); m != nil {
+				gps := m.Groups()
+				m_string := m.String()
+
+				temp_name := class.func_temp_save("<sub>"+gps[1].Captures[0].String()+"</sub>", m_string)
+				string_data = strings.Replace(string_data, m_string, temp_name, 1)
+			} else {
+				break
+			}
+		}
+	}
+
+	r_list = []string{`--((?:(?!--).)+)--`, `~~((?:(?!~~).)+)~~`}
+	for for_a := 0; for_a < len(r_list); for_a++ {
+		r = regexp2.MustCompile(r_list[for_a], 0)
+		for {
+			if m, _ := r.FindStringMatch(string_data); m != nil {
+				gps := m.Groups()
+				m_string := m.String()
+
+				temp_name := class.func_temp_save("<s>"+gps[1].Captures[0].String()+"</s>", m_string)
+				string_data = strings.Replace(string_data, m_string, temp_name, 1)
+			} else {
+				break
+			}
+		}
+	}
+
+	class.render_data = string_data
+}
+
+func (class *namumark) render_last() {
+	string_data := class.render_data
+
+	string_data = class.func_temp_restore(string_data, false)
+
+	r := regexp.MustCompile(`(\n| )+$`)
+	string_data = r.ReplaceAllString(string_data, "")
+
+	r = regexp.MustCompile(`^(\n| )+`)
+	string_data = r.ReplaceAllString(string_data, "")
+
+	r = regexp.MustCompile(`\n?<front_br>`)
+	string_data = r.ReplaceAllString(string_data, "")
+
+	r = regexp.MustCompile(`<back_br>\n?`)
+	string_data = r.ReplaceAllString(string_data, "")
+
+	string_data = strings.Replace(string_data, "\n", "<br>", -1)
+
+	class.render_data = string_data
+	class.render_data_js += "opennamu_do_toc();"
+}
+
+func (class *namumark) render_heading() {
+	string_data := class.render_data
+
+	r := regexp.MustCompile(`\n(?:(={1,6})(#?) ?([^\n]+))\n`)
+	string_data = r.ReplaceAllStringFunc(string_data, func(m string) string {
+		match := r.FindStringSubmatch(m)
+
+		r = regexp.MustCompile(` ?(#?={1,6}[^=]*)$`)
+		heading_data := r.ReplaceAllString(match[3], "")
+
+		heading_len := strconv.Itoa(len(match[1]))
+		heading_render := "<h" + heading_len + ">" + heading_data + "</h" + heading_len + ">"
+
+		temp_name := class.func_temp_save(heading_render, match[0])
+		return temp_name
+	})
+
+	class.render_data = string_data
+}
+
+func (class namumark) main() map[string]interface{} {
+	class.render_text()
+	class.render_heading()
+	class.render_last()
+
+	log.Default().Println(class.render_data)
+
+	end_data := make(map[string]interface{})
+	end_data["data"] = class.render_data
+	end_data["js_data"] = class.render_data_js
+	end_data["backlink"] = class.backlink
+	end_data["link_count"] = class.link_count
+
+	return end_data
+}

+ 176 - 0
route_go/route/tool/render.go

@@ -0,0 +1,176 @@
+package tool
+
+import (
+	"database/sql"
+	"log"
+	"strconv"
+	"time"
+)
+
+func Get_render(db *sql.DB, doc_name string, data string, render_type string) map[string]string {
+	var markup string
+
+	if render_type == "api_view" || render_type == "api_from" || render_type == "api_include" || render_type == "backlink" {
+		stmt, err := db.Prepare(DB_change("select set_data from data_set where doc_name = ? and set_name = 'document_markup'"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		err = stmt.QueryRow(doc_name).Scan(&markup)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				markup = ""
+			} else {
+				log.Fatal(err)
+			}
+		}
+	}
+
+	if markup == "" {
+		err := db.QueryRow(DB_change("select data from other where name = 'markup'")).Scan(&markup)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				markup = ""
+			} else {
+				log.Fatal(err)
+			}
+		}
+	}
+
+	if markup == "" || markup == "namumark_beta" {
+		markup = "namumark"
+	}
+
+	now_time := time.Now().UnixNano()
+	render_name := strconv.Itoa(int(now_time))
+
+	render_data := Get_render_direct(db, doc_name, data, markup, render_name, render_type)
+
+	return render_data
+}
+
+func Get_render_direct(db *sql.DB, doc_name string, data string, markup string, render_name string, render_type string) map[string]string {
+	from := ""
+	include := ""
+	backlink := ""
+	if render_type == "api_include" {
+		include = "1"
+	} else if render_type == "api_from" {
+		from = "1"
+	} else if render_type == "backlink" {
+		backlink = "1"
+	}
+
+	if render_type == "api_view" || render_type == "api_from" || render_type == "api_include" || render_type == "backlink" {
+		render_type = "view"
+	}
+
+	doc_data_set := map[string]string{
+		"doc_name":    doc_name,
+		"data":        data,
+		"render_name": render_name,
+		"render_type": render_type,
+		"from":        from,
+		"include":     include,
+	}
+
+	render_data := make(map[string]interface{})
+	if markup == "namumark" {
+		render_data_class := Namumark_new(db, doc_data_set)
+		render_data = render_data_class.main()
+	} else if markup == "markdown" {
+		render_data = Markdown(db, doc_data_set)
+	} else {
+		render_data["data"] = data
+		render_data["js_data"] = ""
+		render_data["backlink"] = [][]string{}
+	}
+
+	if backlink == "1" {
+		stmt, err := db.Prepare(DB_change("delete from back where link = ?"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		_, err = stmt.Exec(doc_name)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		stmt, err = db.Prepare(DB_change("delete from back where title = ? and type = 'no'"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		_, err = stmt.Exec(doc_name)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		stmt, err = db.Prepare(DB_change("delete from data_set where doc_name = ? and set_name = 'link_count'"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		_, err = stmt.Exec(doc_name)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		stmt, err = db.Prepare(DB_change("delete from data_set where doc_name = ? and set_name = 'doc_type'"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		_, err = stmt.Exec(doc_name)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		end_backlink := render_data["backlink"].([][]string)
+		for for_a := 0; for_a < len(end_backlink); for_a++ {
+			stmt, err := db.Prepare(DB_change("insert into back (link, title, type, data) values (?, ?, ?, ?)"))
+			if err != nil {
+				log.Fatal(err)
+			}
+			defer stmt.Close()
+
+			_, err = stmt.Exec(end_backlink[0], end_backlink[1], end_backlink[2])
+			if err != nil {
+				log.Fatal(err)
+			}
+		}
+
+		stmt, err = db.Prepare(DB_change("insert into data_set (doc_name, doc_rev, set_name, set_data) values (?, '', 'link_count', ?)"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		_, err = stmt.Exec(doc_name, render_data["link_count"].(int))
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		stmt, err = db.Prepare(DB_change("insert into data_set (doc_name, doc_rev, set_name, set_data) values (?, '', 'doc_type', ?)"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		_, err = stmt.Exec(doc_name, "")
+		if err != nil {
+			log.Fatal(err)
+		}
+	}
+
+	return map[string]string{
+		"data":    "<div id=\"opennamu_render_complete\">" + render_data["data"].(string) + "</div>",
+		"js_data": render_data["js_data"].(string),
+	}
+}

+ 25 - 0
route_go/route/tool/some_tool.go

@@ -0,0 +1,25 @@
+package tool
+
+import (
+	"crypto/sha256"
+	"encoding/hex"
+	"html/template"
+	"net/url"
+)
+
+func Sha224(data string) string {
+	hasher := sha256.New224()
+	hasher.Write([]byte(data))
+	hash_byte := hasher.Sum(nil)
+	hash_str := hex.EncodeToString(hash_byte)
+
+	return hash_str
+}
+
+func Url_parser(data string) string {
+	return url.QueryEscape(data)
+}
+
+func HTML_escape(data string) string {
+	return template.HTMLEscapeString(data)
+}

+ 46 - 0
route_go/windows_amd64.ps1

@@ -0,0 +1,46 @@
+$file_name = Read-Host "file_name "
+
+$to = $args[0]
+if($to -eq $null) {
+    $to = "all"
+}
+
+if($to -eq "linux_amd64" -or $to -eq "all") {
+    Write-Host "linux amd64"
+    $env:GOOS = "linux"
+    $env:GOARCH = "amd64"
+    $env:CGO_ENABLED = 0
+    go build $file_name.go
+    Remove-Item ".\bin\$file_name.amd64.bin"
+    Move-Item "opennamu" ".\bin\$file_name.amd64.bin"
+}
+
+if($to -eq "linux_arm64" -or $to -eq "all") {
+    Write-Host "linux arm64"
+    $env:GOOS = "linux"
+    $env:GOARCH = "arm64"
+    $env:CGO_ENABLED = 0
+    go build $file_name.go
+    Remove-Item ".\bin\$file_name.arm64.bin"
+    Move-Item "opennamu" ".\bin\$file_name.arm64.bin"
+}
+
+if($to -eq "windows_amd64" -or $to -eq "all") {
+    Write-Host "windows amd64"
+    $env:GOOS = "windows"
+    $env:GOARCH = "amd64"
+    $env:CGO_ENABLED = 0
+    go build $file_name.go
+    Remove-Item ".\bin\$file_name.amd64.exe"
+    Move-Item "opennamu.exe" ".\bin\$file_name.amd64.exe"
+}
+
+if($to -eq "windows_arm64" -or $to -eq "all") {
+    Write-Host "windows arm64"
+    $env:GOOS = "windows"
+    $env:GOARCH = "arm64"
+    $env:CGO_ENABLED = 0
+    go build $file_name.go
+    Remove-Item ".\bin\$file_name.arm64.exe"
+    Move-Item "opennamu.exe" ".\bin\$file_name.arm64.exe"
+}