From a12bc4cd245a6dec9a1e5657dad6aa7ee292641a Mon Sep 17 00:00:00 2001 From: <> Date: Wed, 12 Jul 2023 07:25:21 +0000 Subject: [PATCH] Deployed 3e7c219 with MkDocs version: 1.4.3 --- .nojekyll | 0 404.html | 326 + assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.220ee61c.min.js | 29 + assets/javascripts/bundle.220ee61c.min.js.map | 8 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.hy.min.js | 1 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.kn.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + assets/javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.te.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.74e28a9f.min.js | 42 + .../workers/search.74e28a9f.min.js.map | 8 + assets/stylesheets/main.26e3688c.min.css | 1 + assets/stylesheets/main.26e3688c.min.css.map | 1 + assets/stylesheets/palette.ecc896b0.min.css | 1 + .../stylesheets/palette.ecc896b0.min.css.map | 1 + convention/index.html | 498 ++ error/index.html | 1014 +++ gitflow/index.html | 461 ++ index.html | 406 + issue_strategy/index.html | 430 ++ search/search_index.json | 1 + sitemap.xml | 3 + sitemap.xml.gz | Bin 0 -> 127 bytes usage/index.html | 447 ++ 52 files changed, 10876 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.220ee61c.min.js create mode 100644 assets/javascripts/bundle.220ee61c.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.74e28a9f.min.js create mode 100644 assets/javascripts/workers/search.74e28a9f.min.js.map create mode 100644 assets/stylesheets/main.26e3688c.min.css create mode 100644 assets/stylesheets/main.26e3688c.min.css.map create mode 100644 assets/stylesheets/palette.ecc896b0.min.css create mode 100644 assets/stylesheets/palette.ecc896b0.min.css.map create mode 100644 convention/index.html create mode 100644 error/index.html create mode 100644 gitflow/index.html create mode 100644 index.html create mode 100644 issue_strategy/index.html create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz create mode 100644 usage/index.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/404.html b/404.html new file mode 100644 index 00000000..f40fa454 --- /dev/null +++ b/404.html @@ -0,0 +1,326 @@ + + + + + + + + + + + + + + + + + + 집현전 문서 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf13b9f9d978896599290a74f77d5dbe7d1655c GIT binary patch literal 1870 zcmV-U2eJ5xP)Gc)JR9QMau)O=X#!i9;T z37kk-upj^(fsR36MHs_+1RCI)NNu9}lD0S{B^g8PN?Ww(5|~L#Ng*g{WsqleV}|#l zz8@ri&cTzw_h33bHI+12+kK6WN$h#n5cD8OQt`5kw6p~9H3()bUQ8OS4Q4HTQ=1Ol z_JAocz`fLbT2^{`8n~UAo=#AUOf=SOq4pYkt;XbC&f#7lb$*7=$na!mWCQ`dBQsO0 zLFBSPj*N?#u5&pf2t4XjEGH|=pPQ8xh7tpx;US5Cx_Ju;!O`ya-yF`)b%TEt5>eP1ZX~}sjjA%FJF?h7cX8=b!DZl<6%Cv z*G0uvvU+vmnpLZ2paivG-(cd*y3$hCIcsZcYOGh{$&)A6*XX&kXZd3G8m)G$Zz-LV z^GF3VAW^Mdv!)4OM8EgqRiz~*Cji;uzl2uC9^=8I84vNp;ltJ|q-*uQwGp2ma6cY7 z;`%`!9UXO@fr&Ebapfs34OmS9^u6$)bJxrucutf>`dKPKT%%*d3XlFVKunp9 zasduxjrjs>f8V=D|J=XNZp;_Zy^WgQ$9WDjgY=z@stwiEBm9u5*|34&1Na8BMjjgf3+SHcr`5~>oz1Y?SW^=K z^bTyO6>Gar#P_W2gEMwq)ot3; zREHn~U&Dp0l6YT0&k-wLwYjb?5zGK`W6S2v+K>AM(95m2C20L|3m~rN8dprPr@t)5lsk9Hu*W z?pS990s;Ez=+Rj{x7p``4>+c0G5^pYnB1^!TL=(?HLHZ+HicG{~4F1d^5Awl_2!1jICM-!9eoLhbbT^;yHcefyTAaqRcY zmuctDopPT!%k+}x%lZRKnzykr2}}XfG_ne?nRQO~?%hkzo;@RN{P6o`&mMUWBYMTe z6i8ChtjX&gXl`nvrU>jah)2iNM%JdjqoaeaU%yVn!^70x-flljp6Q5tK}5}&X8&&G zX3fpb3E(!rH=zVI_9Gjl45w@{(ITqngWFe7@9{mX;tO25Z_8 zQHEpI+FkTU#4xu>RkN>b3Tnc3UpWzPXWm#o55GKF09j^Mh~)K7{QqbO_~(@CVq! zS<8954|P8mXN2MRs86xZ&Q4EfM@JB94b=(YGuk)s&^jiSF=t3*oNK3`rD{H`yQ?d; ztE=laAUoZx5?RC8*WKOj`%LXEkgDd>&^Q4M^z`%u0rg-It=hLCVsq!Z%^6eB-OvOT zFZ28TN&cRmgU}Elrnk43)!>Z1FCPL2K$7}gwzIc48NX}#!A1BpJP?#v5wkNprhV** z?Cpalt1oH&{r!o3eSKc&ap)iz2BTn_VV`4>9M^b3;(YY}4>#ML6{~(4mH+?%07*qo IM6N<$f(jP3KmY&$ literal 0 HcmV?d00001 diff --git a/assets/javascripts/bundle.220ee61c.min.js b/assets/javascripts/bundle.220ee61c.min.js new file mode 100644 index 00000000..116072a1 --- /dev/null +++ b/assets/javascripts/bundle.220ee61c.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Ci=Object.create;var gr=Object.defineProperty;var Ri=Object.getOwnPropertyDescriptor;var ki=Object.getOwnPropertyNames,Ht=Object.getOwnPropertySymbols,Hi=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,nn=Object.prototype.propertyIsEnumerable;var rn=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&rn(e,r,t[r]);if(Ht)for(var r of Ht(t))nn.call(t,r)&&rn(e,r,t[r]);return e};var on=(e,t)=>{var r={};for(var n in e)yr.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&Ht)for(var n of Ht(e))t.indexOf(n)<0&&nn.call(e,n)&&(r[n]=e[n]);return r};var Pt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Pi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ki(t))!yr.call(e,o)&&o!==r&&gr(e,o,{get:()=>t[o],enumerable:!(n=Ri(t,o))||n.enumerable});return e};var yt=(e,t,r)=>(r=e!=null?Ci(Hi(e)):{},Pi(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var sn=Pt((xr,an)=>{(function(e,t){typeof xr=="object"&&typeof an!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(xr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(O){return!!(O&&O!==document&&O.nodeName!=="HTML"&&O.nodeName!=="BODY"&&"classList"in O&&"contains"in O.classList)}function f(O){var Qe=O.type,De=O.tagName;return!!(De==="INPUT"&&s[Qe]&&!O.readOnly||De==="TEXTAREA"&&!O.readOnly||O.isContentEditable)}function c(O){O.classList.contains("focus-visible")||(O.classList.add("focus-visible"),O.setAttribute("data-focus-visible-added",""))}function u(O){O.hasAttribute("data-focus-visible-added")&&(O.classList.remove("focus-visible"),O.removeAttribute("data-focus-visible-added"))}function p(O){O.metaKey||O.altKey||O.ctrlKey||(a(r.activeElement)&&c(r.activeElement),n=!0)}function m(O){n=!1}function d(O){a(O.target)&&(n||f(O.target))&&c(O.target)}function h(O){a(O.target)&&(O.target.classList.contains("focus-visible")||O.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(O.target))}function v(O){document.visibilityState==="hidden"&&(o&&(n=!0),Y())}function Y(){document.addEventListener("mousemove",N),document.addEventListener("mousedown",N),document.addEventListener("mouseup",N),document.addEventListener("pointermove",N),document.addEventListener("pointerdown",N),document.addEventListener("pointerup",N),document.addEventListener("touchmove",N),document.addEventListener("touchstart",N),document.addEventListener("touchend",N)}function B(){document.removeEventListener("mousemove",N),document.removeEventListener("mousedown",N),document.removeEventListener("mouseup",N),document.removeEventListener("pointermove",N),document.removeEventListener("pointerdown",N),document.removeEventListener("pointerup",N),document.removeEventListener("touchmove",N),document.removeEventListener("touchstart",N),document.removeEventListener("touchend",N)}function N(O){O.target.nodeName&&O.target.nodeName.toLowerCase()==="html"||(n=!1,B())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("pointerdown",m,!0),document.addEventListener("touchstart",m,!0),document.addEventListener("visibilitychange",v,!0),Y(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var cn=Pt(Er=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(c){return!1}},r=t(),n=function(c){var u={next:function(){var p=c.shift();return{done:p===void 0,value:p}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(c){return encodeURIComponent(c).replace(/%20/g,"+")},i=function(c){return decodeURIComponent(String(c).replace(/\+/g," "))},s=function(){var c=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var m=typeof p;if(m!=="undefined")if(m==="string")p!==""&&this._fromString(p);else if(p instanceof c){var d=this;p.forEach(function(B,N){d.append(N,B)})}else if(p!==null&&m==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;hd[0]?1:0}),c._entries&&(c._entries={});for(var p=0;p1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(f,c){typeof f!="string"&&(f=String(f)),c&&typeof c!="string"&&(c=String(c));var u=document,p;if(c&&(e.location===void 0||c!==e.location.href)){c=c.toLowerCase(),u=document.implementation.createHTMLDocument(""),p=u.createElement("base"),p.href=c,u.head.appendChild(p);try{if(p.href.indexOf(c)!==0)throw new Error(p.href)}catch(O){throw new Error("URL unable to set base "+c+" due to "+O)}}var m=u.createElement("a");m.href=f,p&&(u.body.appendChild(m),m.href=m.href);var d=u.createElement("input");if(d.type="url",d.value=f,m.protocol===":"||!/:/.test(m.href)||!d.checkValidity()&&!c)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:m});var h=new e.URLSearchParams(this.search),v=!0,Y=!0,B=this;["append","delete","set"].forEach(function(O){var Qe=h[O];h[O]=function(){Qe.apply(h,arguments),v&&(Y=!1,B.search=h.toString(),Y=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var N=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==N&&(N=this.search,Y&&(v=!1,this.searchParams._fromString(this.search),v=!0))}})},s=i.prototype,a=function(f){Object.defineProperty(s,f,{get:function(){return this._anchorElement[f]},set:function(c){this._anchorElement[f]=c},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(f){a(f)}),Object.defineProperty(s,"search",{get:function(){return this._anchorElement.search},set:function(f){this._anchorElement.search=f,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(s,{toString:{get:function(){var f=this;return function(){return f.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(f){this._anchorElement.href=f,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(f){this._anchorElement.pathname=f},enumerable:!0},origin:{get:function(){var f={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],c=this._anchorElement.port!=f&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(c?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(f){},enumerable:!0},username:{get:function(){return""},set:function(f){},enumerable:!0}}),i.createObjectURL=function(f){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(f){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er)});var qr=Pt((Mt,Nr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Mt=="object"&&typeof Nr=="object"?Nr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Mt=="object"?Mt.ClipboardJS=r():t.ClipboardJS=r()})(Mt,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return Ai}});var s=i(279),a=i.n(s),f=i(370),c=i.n(f),u=i(817),p=i.n(u);function m(j){try{return document.execCommand(j)}catch(T){return!1}}var d=function(T){var E=p()(T);return m("cut"),E},h=d;function v(j){var T=document.documentElement.getAttribute("dir")==="rtl",E=document.createElement("textarea");E.style.fontSize="12pt",E.style.border="0",E.style.padding="0",E.style.margin="0",E.style.position="absolute",E.style[T?"right":"left"]="-9999px";var H=window.pageYOffset||document.documentElement.scrollTop;return E.style.top="".concat(H,"px"),E.setAttribute("readonly",""),E.value=j,E}var Y=function(T,E){var H=v(T);E.container.appendChild(H);var I=p()(H);return m("copy"),H.remove(),I},B=function(T){var E=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},H="";return typeof T=="string"?H=Y(T,E):T instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(T==null?void 0:T.type)?H=Y(T.value,E):(H=p()(T),m("copy")),H},N=B;function O(j){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?O=function(E){return typeof E}:O=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},O(j)}var Qe=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=T.action,H=E===void 0?"copy":E,I=T.container,q=T.target,Me=T.text;if(H!=="copy"&&H!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&O(q)==="object"&&q.nodeType===1){if(H==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(H==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Me)return N(Me,{container:I});if(q)return H==="cut"?h(q):N(q,{container:I})},De=Qe;function $e(j){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?$e=function(E){return typeof E}:$e=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},$e(j)}function Ei(j,T){if(!(j instanceof T))throw new TypeError("Cannot call a class as a function")}function tn(j,T){for(var E=0;E0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof I.action=="function"?I.action:this.defaultAction,this.target=typeof I.target=="function"?I.target:this.defaultTarget,this.text=typeof I.text=="function"?I.text:this.defaultText,this.container=$e(I.container)==="object"?I.container:document.body}},{key:"listenClick",value:function(I){var q=this;this.listener=c()(I,"click",function(Me){return q.onClick(Me)})}},{key:"onClick",value:function(I){var q=I.delegateTarget||I.currentTarget,Me=this.action(q)||"copy",kt=De({action:Me,container:this.container,target:this.target(q),text:this.text(q)});this.emit(kt?"success":"error",{action:Me,text:kt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(I){return vr("action",I)}},{key:"defaultTarget",value:function(I){var q=vr("target",I);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(I){return vr("text",I)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(I){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return N(I,q)}},{key:"cut",value:function(I){return h(I)}},{key:"isSupported",value:function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof I=="string"?[I]:I,Me=!!document.queryCommandSupported;return q.forEach(function(kt){Me=Me&&!!document.queryCommandSupported(kt)}),Me}}]),E}(a()),Ai=Li},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,f){for(;a&&a.nodeType!==o;){if(typeof a.matches=="function"&&a.matches(f))return a;a=a.parentNode}}n.exports=s},438:function(n,o,i){var s=i(828);function a(u,p,m,d,h){var v=c.apply(this,arguments);return u.addEventListener(m,v,h),{destroy:function(){u.removeEventListener(m,v,h)}}}function f(u,p,m,d,h){return typeof u.addEventListener=="function"?a.apply(null,arguments):typeof m=="function"?a.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return a(v,p,m,d,h)}))}function c(u,p,m,d){return function(h){h.delegateTarget=s(h.target,p),h.delegateTarget&&d.call(u,h)}}n.exports=f},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(n,o,i){var s=i(879),a=i(438);function f(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(h))throw new TypeError("Third argument must be a Function");if(s.node(m))return c(m,d,h);if(s.nodeList(m))return u(m,d,h);if(s.string(m))return p(m,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(m,d,h){return m.addEventListener(d,h),{destroy:function(){m.removeEventListener(d,h)}}}function u(m,d,h){return Array.prototype.forEach.call(m,function(v){v.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(m,function(v){v.removeEventListener(d,h)})}}}function p(m,d,h){return a(document.body,m,d,h)}n.exports=f},817:function(n){function o(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var f=window.getSelection(),c=document.createRange();c.selectNodeContents(i),f.removeAllRanges(),f.addRange(c),s=f.toString()}return s}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,s,a){var f=this.e||(this.e={});return(f[i]||(f[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var f=this;function c(){f.off(i,c),s.apply(a,arguments)}return c._=s,this.on(i,c,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),f=0,c=a.length;for(f;f{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var rs=/["'&<>]/;Yo.exports=ns;function ns(e){var t=""+e,r=rs.exec(t);if(!r)return t;var n,o="",i=0,s=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function W(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],s;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(a){s={error:a}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(s)throw s.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n1||a(m,d)})})}function a(m,d){try{f(n[m](d))}catch(h){p(i[0][3],h)}}function f(m){m.value instanceof et?Promise.resolve(m.value.v).then(c,u):p(i[0][2],m)}function c(m){a("next",m)}function u(m){a("throw",m)}function p(m,d){m(d),i.shift(),i.length&&a(i[0][0],i[0][1])}}function pn(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof Ee=="function"?Ee(e):e[Symbol.iterator](),r={},n("next"),n("throw"),n("return"),r[Symbol.asyncIterator]=function(){return this},r);function n(i){r[i]=e[i]&&function(s){return new Promise(function(a,f){s=e[i](s),o(a,f,s.done,s.value)})}}function o(i,s,a,f){Promise.resolve(f).then(function(c){i({value:c,done:a})},s)}}function C(e){return typeof e=="function"}function at(e){var t=function(n){Error.call(n),n.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var It=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(n,o){return o+1+") "+n.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function Ve(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ie=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,n,o,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Ee(s),f=a.next();!f.done;f=a.next()){var c=f.value;c.remove(this)}}catch(v){t={error:v}}finally{try{f&&!f.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var u=this.initialTeardown;if(C(u))try{u()}catch(v){i=v instanceof It?v.errors:[v]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var m=Ee(p),d=m.next();!d.done;d=m.next()){var h=d.value;try{ln(h)}catch(v){i=i!=null?i:[],v instanceof It?i=D(D([],W(i)),W(v.errors)):i.push(v)}}}catch(v){n={error:v}}finally{try{d&&!d.done&&(o=m.return)&&o.call(m)}finally{if(n)throw n.error}}}if(i)throw new It(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)ln(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Ve(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ve(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Sr=Ie.EMPTY;function jt(e){return e instanceof Ie||e&&"closed"in e&&C(e.remove)&&C(e.add)&&C(e.unsubscribe)}function ln(e){C(e)?e():e.unsubscribe()}var Le={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],n=2;n0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,s=o.isStopped,a=o.observers;return i||s?Sr:(this.currentObservers=null,a.push(r),new Ie(function(){n.currentObservers=null,Ve(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,s=n.isStopped;o?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,n){return new xn(r,n)},t}(F);var xn=function(e){ie(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Sr},t}(x);var Et={now:function(){return(Et.delegate||Date).now()},delegate:void 0};var wt=function(e){ie(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=Et);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,s=n._infiniteTimeWindow,a=n._timestampProvider,f=n._windowTime;o||(i.push(r),!s&&i.push(a.now()+f)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,s=o._buffer,a=s.slice(),f=0;f0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=ut.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var s=r.actions;n!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==n&&(ut.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Wt);var Sn=function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Dt);var Oe=new Sn(wn);var M=new F(function(e){return e.complete()});function Vt(e){return e&&C(e.schedule)}function Cr(e){return e[e.length-1]}function Ye(e){return C(Cr(e))?e.pop():void 0}function Te(e){return Vt(Cr(e))?e.pop():void 0}function zt(e,t){return typeof Cr(e)=="number"?e.pop():t}var pt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Nt(e){return C(e==null?void 0:e.then)}function qt(e){return C(e[ft])}function Kt(e){return Symbol.asyncIterator&&C(e==null?void 0:e[Symbol.asyncIterator])}function Qt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function zi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Yt=zi();function Gt(e){return C(e==null?void 0:e[Yt])}function Bt(e){return un(this,arguments,function(){var r,n,o,i;return $t(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,et(r.read())];case 3:return n=s.sent(),o=n.value,i=n.done,i?[4,et(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,et(o)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Jt(e){return C(e==null?void 0:e.getReader)}function U(e){if(e instanceof F)return e;if(e!=null){if(qt(e))return Ni(e);if(pt(e))return qi(e);if(Nt(e))return Ki(e);if(Kt(e))return On(e);if(Gt(e))return Qi(e);if(Jt(e))return Yi(e)}throw Qt(e)}function Ni(e){return new F(function(t){var r=e[ft]();if(C(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function qi(e){return new F(function(t){for(var r=0;r=2;return function(n){return n.pipe(e?A(function(o,i){return e(o,i,n)}):de,ge(1),r?He(t):Dn(function(){return new Zt}))}}function Vn(){for(var e=[],t=0;t=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new x}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,f=a===void 0?!0:a;return function(c){var u,p,m,d=0,h=!1,v=!1,Y=function(){p==null||p.unsubscribe(),p=void 0},B=function(){Y(),u=m=void 0,h=v=!1},N=function(){var O=u;B(),O==null||O.unsubscribe()};return y(function(O,Qe){d++,!v&&!h&&Y();var De=m=m!=null?m:r();Qe.add(function(){d--,d===0&&!v&&!h&&(p=$r(N,f))}),De.subscribe(Qe),!u&&d>0&&(u=new rt({next:function($e){return De.next($e)},error:function($e){v=!0,Y(),p=$r(B,o,$e),De.error($e)},complete:function(){h=!0,Y(),p=$r(B,s),De.complete()}}),U(O).subscribe(u))})(c)}}function $r(e,t){for(var r=[],n=2;ne.next(document)),e}function K(e,t=document){return Array.from(t.querySelectorAll(e))}function z(e,t=document){let r=ce(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ce(e,t=document){return t.querySelector(e)||void 0}function _e(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function tr(e){return L(b(document.body,"focusin"),b(document.body,"focusout")).pipe(ke(1),l(()=>{let t=_e();return typeof t!="undefined"?e.contains(t):!1}),V(e===_e()),J())}function Xe(e){return{x:e.offsetLeft,y:e.offsetTop}}function Kn(e){return L(b(window,"load"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>Xe(e)),V(Xe(e)))}function rr(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return L(b(e,"scroll"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>rr(e)),V(rr(e)))}var Yn=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!Wr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),va?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!Wr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=ba.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Gn=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Jn=typeof WeakMap!="undefined"?new WeakMap:new Yn,Xn=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=ga.getInstance(),n=new La(t,r,this);Jn.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){Xn.prototype[e]=function(){var t;return(t=Jn.get(this))[e].apply(t,arguments)}});var Aa=function(){return typeof nr.ResizeObserver!="undefined"?nr.ResizeObserver:Xn}(),Zn=Aa;var eo=new x,Ca=$(()=>k(new Zn(e=>{for(let t of e)eo.next(t)}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function he(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ye(e){return Ca.pipe(S(t=>t.observe(e)),g(t=>eo.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(()=>he(e)))),V(he(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ar(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var to=new x,Ra=$(()=>k(new IntersectionObserver(e=>{for(let t of e)to.next(t)},{threshold:0}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function sr(e){return Ra.pipe(S(t=>t.observe(e)),g(t=>to.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(({isIntersecting:r})=>r))))}function ro(e,t=16){return dt(e).pipe(l(({y:r})=>{let n=he(e),o=bt(e);return r>=o.height-n.height-t}),J())}var cr={drawer:z("[data-md-toggle=drawer]"),search:z("[data-md-toggle=search]")};function no(e){return cr[e].checked}function Ke(e,t){cr[e].checked!==t&&cr[e].click()}function Ue(e){let t=cr[e];return b(t,"change").pipe(l(()=>t.checked),V(t.checked))}function ka(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ha(){return L(b(window,"compositionstart").pipe(l(()=>!0)),b(window,"compositionend").pipe(l(()=>!1))).pipe(V(!1))}function oo(){let e=b(window,"keydown").pipe(A(t=>!(t.metaKey||t.ctrlKey)),l(t=>({mode:no("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),A(({mode:t,type:r})=>{if(t==="global"){let n=_e();if(typeof n!="undefined")return!ka(n,r)}return!0}),pe());return Ha().pipe(g(t=>t?M:e))}function le(){return new URL(location.href)}function ot(e){location.href=e.href}function io(){return new x}function ao(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)ao(e,r)}function _(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)ao(n,o);return n}function fr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function so(){return location.hash.substring(1)}function Dr(e){let t=_("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Pa(e){return L(b(window,"hashchange"),e).pipe(l(so),V(so()),A(t=>t.length>0),X(1))}function co(e){return Pa(e).pipe(l(t=>ce(`[id="${t}"]`)),A(t=>typeof t!="undefined"))}function Vr(e){let t=matchMedia(e);return er(r=>t.addListener(()=>r(t.matches))).pipe(V(t.matches))}function fo(){let e=matchMedia("print");return L(b(window,"beforeprint").pipe(l(()=>!0)),b(window,"afterprint").pipe(l(()=>!1))).pipe(V(e.matches))}function zr(e,t){return e.pipe(g(r=>r?t():M))}function ur(e,t={credentials:"same-origin"}){return ue(fetch(`${e}`,t)).pipe(fe(()=>M),g(r=>r.status!==200?Ot(()=>new Error(r.statusText)):k(r)))}function We(e,t){return ur(e,t).pipe(g(r=>r.json()),X(1))}function uo(e,t){let r=new DOMParser;return ur(e,t).pipe(g(n=>n.text()),l(n=>r.parseFromString(n,"text/xml")),X(1))}function pr(e){let t=_("script",{src:e});return $(()=>(document.head.appendChild(t),L(b(t,"load"),b(t,"error").pipe(g(()=>Ot(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(l(()=>{}),R(()=>document.head.removeChild(t)),ge(1))))}function po(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function lo(){return L(b(window,"scroll",{passive:!0}),b(window,"resize",{passive:!0})).pipe(l(po),V(po()))}function mo(){return{width:innerWidth,height:innerHeight}}function ho(){return b(window,"resize",{passive:!0}).pipe(l(mo),V(mo()))}function bo(){return G([lo(),ho()]).pipe(l(([e,t])=>({offset:e,size:t})),X(1))}function lr(e,{viewport$:t,header$:r}){let n=t.pipe(ee("size")),o=G([n,r]).pipe(l(()=>Xe(e)));return G([r,t,o]).pipe(l(([{height:i},{offset:s,size:a},{x:f,y:c}])=>({offset:{x:s.x-f,y:s.y-c+i},size:a})))}(()=>{function e(n,o){parent.postMessage(n,o||"*")}function t(...n){return n.reduce((o,i)=>o.then(()=>new Promise(s=>{let a=document.createElement("script");a.src=i,a.onload=s,document.body.appendChild(a)})),Promise.resolve())}var r=class extends EventTarget{constructor(n){super(),this.url=n,this.m=i=>{i.source===this.w&&(this.dispatchEvent(new MessageEvent("message",{data:i.data})),this.onmessage&&this.onmessage(i))},this.e=(i,s,a,f,c)=>{if(s===`${this.url}`){let u=new ErrorEvent("error",{message:i,filename:s,lineno:a,colno:f,error:c});this.dispatchEvent(u),this.onerror&&this.onerror(u)}};let o=document.createElement("iframe");o.hidden=!0,document.body.appendChild(this.iframe=o),this.w.document.open(),this.w.document.write(` + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Commit 전략

+

commit의 기준

+
    +
  • commit은 아래 커밋 타입에 맞게 commit들을 분리한다.
  • +
+

commit의 타입

+
    +
  • FEAT: 기능을 추가 또는 수정
  • +
  • ENV: 개발 환경을 추가 또는 수정 (eslint 변경, dockerfile 변경 등)
  • +
  • FIX: 버그를 해결
  • +
  • DOCS: 문서를 수정 (README.md 변경, swagger)
  • +
  • STYLE: 코드 스타일 변경 (prettier, npm run lint 등)
  • +
  • REFACT: 코드를 리팩토링, 기능은 같고 코드가 변경
  • +
  • TEST: 테스트 코드를 추가 또는 수정
  • +
  • MERGE: 풀 리퀘스트 머지할 경우
  • +
  • CHORE: 단순오타
  • +
  • WIP: working in process 아직 작업중인 내용
  • +
+

commit 예시

+
ex)
+FIX: 모델 validation 오류 수정
+
+- Book title 제목 default 값 추가
+- User intra 최소 길이 0으로 변경
+
+ex)
+FEAT: 로그인 기능 추가
+
+- auth/ api 추가
+
+ex)
+TEST: bookController 테스트 코드 추가 
+
+- 책 제목에 대한 유효성 테스트 추가
+
+

네이밍

+

변수명, 함수명, 칼럼명, 파일명camelCase를 사용한다.
+클래스명, 타입명PascalCase를 사용한다.
+테이블명snake_case를 사용한다.

+

ts파일의 import

+

().service.ts 파일을 import할 때는 카멜케이스로 ()Service라고 import한다.
+e.g.) users.service.ts를 import할 경우 import * as usersService from ../users/users.service.ts같이 적는다.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/error/index.html b/error/index.html new file mode 100644 index 00000000..6e56cbf2 --- /dev/null +++ b/error/index.html @@ -0,0 +1,1014 @@ + + + + + + + + + + + + + + + + + + + + + + 에러 코드 (Error code) - 집현전 문서 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ + + + +

에러 코드 (Error code)

+

Common Error Code (0번대)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Error CodeConstant NameDescription
0UNKNOWN_ERRORunknown error
1QUERY_EXECUTION_FAILEDexecuteQuery SQL 에러
2INVALID_INPUT유효하지 않은 인자 (req , param, body에 잘못된 인자가 들어왔을 때)
42CLIENT_AUTH_FAILEDClient authentication failed due to unknown client, no client authentication included, or unsupported authentication method.
+
+

Auth Error Code (100번대)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Error CodeConstant NameDescription
100NO_AUTHORIZATION권한이 없을때
101NO_USER해당 토큰의 유저가 DB에 없을때
102NO_TOKEN토큰이 발급되지 않았을때
103NO_INPUT로그인시 ID, PW 파라미터가 없을때
104WRONG_PASSWORD비밀번호가 일치하지 않을때(로그인 실패)
105ALREADY_AUTHENTICATED이미 인증된 회원의 경우(또 인증할 경우)
107NO_ID해당 ID가 존재하지 않을때(로그인 실패)
108EXPIRATION_TOKEN토큰이 만료되었을 경우
109TOKEN_NOT_VALID토큰이 유효하지 않을때
110NON_AFFECTEDUPDATE 실패
111ANOTHER_ACCOUNT_AUTHENTICATED다른 계정에 이미 42 intra가 연동되어 있는 경우
(105번은 이미 인증된 회원인 경우이고 111번은 42 계정을 다른 계정에 또 연결하는 경우)
112ACCESS_DENIED42 API 사용에 대해 동의를 하지 않았을 경우
+
+

User Error Code (200번대)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Error CodeConstant NameDescription
203EMAIL_OVERLAPemail 중복. (이미 있는 email 로 가입)
204NICKNAME_OVERLAPnickname 중복. (이미 있는 nickname 입력)
205INVALIDATE_PASSWORD잘못된 password 형식
206INVALID_ROLE유효하지 않은 role 값입니다.
207SLACK_OVERLAP슬랙 ID가 중복
208INTRA_AUTHENTICATE_SUCCESS42 인증 완료 ( 에러 메세지는 아닌데, 인증 완료시 Front한테 상태값을 전달해서 메세지를 띄우기 위한 코드 입니다 )
+
+

Books Error Code (300번대)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Error CodeConstant NameDescription
301SLACKID_OVERLAP슬랙 ID가 중복됨
302NO_ISBN네이버 Open API에서 ISBN검색 결과가 없음
303ISBN_SEARCH_FAILED국립중앙 도서관 API에서 ISBN 검색이 실패
304NO_BOOK_INFO_IDbook_info table에 존재하지 않는 ID를 조회하려고 함
305CALL_SIGN_OVERLAP등록하려는 callSign는 이미 있는 callSign임
306INVALID_CALL_SIGN유효하지 않는 callsign
307NO_BOOK_ID없는 BOOK_ID를 조회하려고 함
308FAIL_CREATE_BOOK_BY_UNEXPECTED예상치 못한 에러로 책 정보 insert에 실패함
309INVALID_CATEGORY_ID보내준 카테고리 ID에 해당하는 callsign을 찾을 수 없음
310ISBN_SEARCH_FAILED_IN_NAVER네이버 Open API에서 ISBN검색 자체가 실패함
311INVALID_PUBDATE_FORNAT입력한 pubdate가 알맞은 형식이 아님. 기대하는 형식 "20220807"
312FAIL_PATCH_BOOK_BY_UNEXPECTED예상치 못한 에러로 bookInfo patch 가 실패함
313NO_BOOK_INFO_DATA입력한 data가 없음(적어도 하나의 데이터는 필수)
+
+

Lendings Error Code (400번대)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Error CodeConstant NameDescription
401NO_USER_ID 유저 없음
402NO_PERMISSION권환 없음
403LENDING_OVERLOAD2권 이상 대출
404LENDING_OVERDUE연체 중
405ON_LENDING대출 중
406ON_RESERVATION예약된 책
407LOST_BOOK분실된 책
408DAMAGED_BOOK파손된 책
410NONEXISTENT_LENDING존재하지 않는 대출
411ALREADY_RETURNED이미 반납 처리된 대출
+
+

Reservation Error Code (500번대)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Error CodeConstant NameDescription
501INVALID_INFO_IDbook_info_id가 유효하지 않음
502AT_PENALTY대출 제한 중
503NOT_LENDED대출 가능
504ALREADY_RESERVED이미 예약 중
505ALREADY_LENDED이미 대출 중
506MORE_THAN_TWO_RESERVATIONS두 개 이상 예약 중
507NO_MATCHING_USER해당 유저 아님
508RESERVATION_NOT_EXIST예약 ID 존재하지 않음
509NOT_RESERVED예약 상태가 아님
+
+

Likes (600번대)

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Error CodeConstant NameDescription
601INVALID_INFO_ID_LIKESbookInfoId가 유효하지 않음
602ALREADY_LIKES좋아요 데이터가 이미 존재함
603NONEXISTENT_LIKESbookInfoId가 유효하지 않음
+
+

history (700번대)

+ + + + + + + + + + + + + + + +
Error CodeConstant NameDescription
700UNAUTHORIZED사서권한이 없는 사람이 모든 대출/반납 기록을 조회하려고함
+
+

reviews (800번대)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Error CodeConstant NameDescription
800INVALID_INPUT_REVIEWS유효하지 않은 양식의 reviews
801UNAUTHORIZED_REVIEWSreviews를 수정/삭제할 권한이 없음
804NOT_FOUND_REVIEWS존재하지 않는 reviewsId
805DISABLED_REVIEWSDisabled 된 review
810INVALID_INPUT_REVIEWS_ID유효하지 않은 양식의 reviewsId
811INVALID_INPUT_REVIEWS_CONTENT유효하지 않은 양식의 reviews content
+
+

tags (900번대)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Error CodeConstant NameDescription
900INVALID_INPUT_TAGS유효하지 않은 양식의 tags
901UNAUTHORIZED_TAGStags를 수정/삭제할 권한이 없음
902ALREADY_EXISTING_TAGS이미 존재하는 내용의 태그
904NOT_FOUND_TAGS존재하지 않는 tagId
910INVALID_INPUT_TAG_ID유효하지 않은 양식의 tagId
+
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/gitflow/index.html b/gitflow/index.html new file mode 100644 index 00000000..464c4630 --- /dev/null +++ b/gitflow/index.html @@ -0,0 +1,461 @@ + + + + + + + + + + + + + + + + + + + + + + Git Flow Strategy - 집현전 문서 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Git Flow Strategy

+

main 브랜치

+
    +
  • 완성된 기능들이 들어있는 가장 최신의 브랜치입니다. develop 브랜치에서만 푸시를 받습니다.
  • +
+

develop 브랜치

+
    +
  • 개발중인 기능들이 이슈 단위로 완료되어 들어오는 브랜치입니다. issue 브랜치에서 푸시를 받습니다.
  • +
+

issue 브랜치 (eg. 42-issue-추가)

+
    +
  • 개별 이슈에 대한 개발이 진행되는 브랜치입니다.
  • +
  • 이슈에서 create_branch 기능을 이용하여 자동으로 생성합시다.
  • +
  • 여러 이슈로 이루어진 이슈는 여러 이슈를 가진 이슈로 묶어 Umbrella issue 로 관리합니다. [이슈 전략 페이지로 링크]
  • +
  • 이슈를 해결한 후 pull request 를 생성합니다.
  • +
  • 리뷰를 받은 후 squash merge 로 develop 브랜치에 merge 합니다.
  • +
+

개인 브랜치

+

둘 이상의 인원이 하나의 issue 브랜치에서 작업할 경우에 issue/23_jolim같은 방식으로 이름지어서 푸시합니다.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..4d3a3a24 --- /dev/null +++ b/index.html @@ -0,0 +1,406 @@ + + + + + + + + + + + + + + + + + + + + 집현전 문서 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Welcome to Jiphyeonjeon Dev

+

문서 추가하는 방법

+
    +
  • docs 폴더 아래에 파일을 추가한다. 파일명은 영어로 한다.
  • +
  • 반드시 # 으로 제목을 추가한다. 목차의 이름이 된다. 한글로 해도 된다.
  • +
  • 로컬에서 어떻게 보일지 테스트해보고 싶으면 mkdocs 를 설치해서 실행해보면 된다.
  • +
  • 디렉토리 내부에 파일을 만들수도 있다. 단 디렉토리 이름은 영어로 해야 한다.
  • +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/issue_strategy/index.html b/issue_strategy/index.html new file mode 100644 index 00000000..13aa124c --- /dev/null +++ b/issue_strategy/index.html @@ -0,0 +1,430 @@ + + + + + + + + + + + + + + + + + + + + + + 이슈 전략 - 집현전 문서 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

이슈 전략

+

여러 이슈를 관리하는 이슈 ☂️

+
    +
  • 제목에 :open_unbrella: 라는 ☂️ 모양의 이모지를 붙이고 label 도 umbrella 이슈로 설정해주세요
  • +
  • 하나의 이슈는 하나의 풀 리퀘스트로 만들어지는데, 규모가 큰 이슈의 경우 umbrella 이슈로 묶어서 관리합니다.
  • +
  • umbrella 이슈 내부에서 체크리스트에 이슈를 링킹할 수 있습니다.
  • +
  • 링킹하는 방법은 - [ ] #'이슈번호' 를 입력하면 링크할 수 있습니다.
  • +
  • 여러 이슈를 묶은 이슈는 issue 페이지 우측 하단의 pin 기능을 활용하여 쉽게 찾아가도록 합시다.
  • +
+

개별 이슈

+
    +
  • 개별 이슈의 이름은 자유롭게 설정합니다. 그리고 어떤 이슈인지 자세히 명세하도록 합니다.
  • +
  • 개별 이슈마다 브랜치 생성은 깃허브 우측의 브랜치 자동생성 기능을 이용하도록 합시다.
  • +
  • 개별 이슈들은 각각 브랜치 안에서 관리하고 squash merge 를 이용해서 develop 브랜치에 pull request 를 날리도록 합시다!
  • +
+

참고: 415 이슈

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 00000000..20ba7efa --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":[" "]},"docs":[{"location":"","title":"Welcome to Jiphyeonjeon Dev","text":""},{"location":"#_1","title":"\ubb38\uc11c \ucd94\uac00\ud558\ub294 \ubc29\ubc95","text":"
  • docs \ud3f4\ub354 \uc544\ub798\uc5d0 \ud30c\uc77c\uc744 \ucd94\uac00\ud55c\ub2e4. \ud30c\uc77c\uba85\uc740 \uc601\uc5b4\ub85c \ud55c\ub2e4.
  • \ubc18\ub4dc\uc2dc # \uc73c\ub85c \uc81c\ubaa9\uc744 \ucd94\uac00\ud55c\ub2e4. \ubaa9\ucc28\uc758 \uc774\ub984\uc774 \ub41c\ub2e4. \ud55c\uae00\ub85c \ud574\ub3c4 \ub41c\ub2e4.
  • \ub85c\uceec\uc5d0\uc11c \uc5b4\ub5bb\uac8c \ubcf4\uc77c\uc9c0 \ud14c\uc2a4\ud2b8\ud574\ubcf4\uace0 \uc2f6\uc73c\uba74 mkdocs \ub97c \uc124\uce58\ud574\uc11c \uc2e4\ud589\ud574\ubcf4\uba74 \ub41c\ub2e4.
  • \ub514\ub809\ud1a0\ub9ac \ub0b4\ubd80\uc5d0 \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc218\ub3c4 \uc788\ub2e4. \ub2e8 \ub514\ub809\ud1a0\ub9ac \uc774\ub984\uc740 \uc601\uc5b4\ub85c \ud574\uc57c \ud55c\ub2e4.
"},{"location":"convention/","title":"Commit \uc804\ub7b5","text":""},{"location":"convention/#commit_1","title":"commit\uc758 \uae30\uc900","text":"
  • commit\uc740 \uc544\ub798 \ucee4\ubc0b \ud0c0\uc785\uc5d0 \ub9de\uac8c commit\ub4e4\uc744 \ubd84\ub9ac\ud55c\ub2e4.
"},{"location":"convention/#commit_2","title":"commit\uc758 \ud0c0\uc785","text":"
  • FEAT: \uae30\ub2a5\uc744 \ucd94\uac00 \ub610\ub294 \uc218\uc815
  • ENV: \uac1c\ubc1c \ud658\uacbd\uc744 \ucd94\uac00 \ub610\ub294 \uc218\uc815 (eslint \ubcc0\uacbd, dockerfile \ubcc0\uacbd \ub4f1)
  • FIX: \ubc84\uadf8\ub97c \ud574\uacb0
  • DOCS: \ubb38\uc11c\ub97c \uc218\uc815 (README.md \ubcc0\uacbd, swagger)
  • STYLE: \ucf54\ub4dc \uc2a4\ud0c0\uc77c \ubcc0\uacbd (prettier, npm run lint \ub4f1)
  • REFACT: \ucf54\ub4dc\ub97c \ub9ac\ud329\ud1a0\ub9c1, \uae30\ub2a5\uc740 \uac19\uace0 \ucf54\ub4dc\uac00 \ubcc0\uacbd
  • TEST: \ud14c\uc2a4\ud2b8 \ucf54\ub4dc\ub97c \ucd94\uac00 \ub610\ub294 \uc218\uc815
  • MERGE: \ud480 \ub9ac\ud018\uc2a4\ud2b8 \uba38\uc9c0\ud560 \uacbd\uc6b0
  • CHORE: \ub2e8\uc21c\uc624\ud0c0
  • WIP: working in process \uc544\uc9c1 \uc791\uc5c5\uc911\uc778 \ub0b4\uc6a9
"},{"location":"convention/#commit_3","title":"commit \uc608\uc2dc","text":"
ex)\nFIX: \ubaa8\ub378 validation \uc624\ub958 \uc218\uc815\n\n- Book title \uc81c\ubaa9 default \uac12 \ucd94\uac00\n- User intra \ucd5c\uc18c \uae38\uc774 0\uc73c\ub85c \ubcc0\uacbd\n\nex)\nFEAT: \ub85c\uadf8\uc778 \uae30\ub2a5 \ucd94\uac00\n\n- auth/ api \ucd94\uac00\n\nex)\nTEST: bookController \ud14c\uc2a4\ud2b8 \ucf54\ub4dc \ucd94\uac00 \n\n- \ucc45 \uc81c\ubaa9\uc5d0 \ub300\ud55c \uc720\ud6a8\uc131 \ud14c\uc2a4\ud2b8 \ucd94\uac00\n
"},{"location":"convention/#_1","title":"\ub124\uc774\ubc0d","text":"

\ubcc0\uc218\uba85, \ud568\uc218\uba85, \uce7c\ub7fc\uba85, \ud30c\uc77c\uba85\uc740 camelCase\ub97c \uc0ac\uc6a9\ud55c\ub2e4. \ud074\ub798\uc2a4\uba85, \ud0c0\uc785\uba85\uc740 PascalCase\ub97c \uc0ac\uc6a9\ud55c\ub2e4. \ud14c\uc774\ube14\uba85\uc740 snake_case\ub97c \uc0ac\uc6a9\ud55c\ub2e4.

"},{"location":"convention/#ts-import","title":"ts\ud30c\uc77c\uc758 import","text":"

().service.ts \ud30c\uc77c\uc744 import\ud560 \ub54c\ub294 \uce74\uba5c\ucf00\uc774\uc2a4\ub85c ()Service\ub77c\uace0 import\ud55c\ub2e4. e.g.) users.service.ts\ub97c import\ud560 \uacbd\uc6b0 import * as usersService from ../users/users.service.ts\uac19\uc774 \uc801\ub294\ub2e4.

"},{"location":"error/","title":"\uc5d0\ub7ec \ucf54\ub4dc (Error code)","text":""},{"location":"error/#common-error-code-0","title":"Common Error Code (0\ubc88\ub300)","text":"Error Code Constant Name Description 0 UNKNOWN_ERROR unknown error 1 QUERY_EXECUTION_FAILED executeQuery SQL \uc5d0\ub7ec 2 INVALID_INPUT \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc778\uc790 (req , param, body\uc5d0 \uc798\ubabb\ub41c \uc778\uc790\uac00 \ub4e4\uc5b4\uc654\uc744 \ub54c) 42 CLIENT_AUTH_FAILED Client authentication failed due to unknown client, no client authentication included, or unsupported authentication method."},{"location":"error/#auth-error-code-100","title":"Auth Error Code (100\ubc88\ub300)","text":"Error Code Constant Name Description 100 NO_AUTHORIZATION \uad8c\ud55c\uc774 \uc5c6\uc744\ub54c 101 NO_USER \ud574\ub2f9 \ud1a0\ud070\uc758 \uc720\uc800\uac00 DB\uc5d0 \uc5c6\uc744\ub54c 102 NO_TOKEN \ud1a0\ud070\uc774 \ubc1c\uae09\ub418\uc9c0 \uc54a\uc558\uc744\ub54c 103 NO_INPUT \ub85c\uadf8\uc778\uc2dc ID, PW \ud30c\ub77c\ubbf8\ud130\uac00 \uc5c6\uc744\ub54c 104 WRONG_PASSWORD \ube44\ubc00\ubc88\ud638\uac00 \uc77c\uce58\ud558\uc9c0 \uc54a\uc744\ub54c(\ub85c\uadf8\uc778 \uc2e4\ud328) 105 ALREADY_AUTHENTICATED \uc774\ubbf8 \uc778\uc99d\ub41c \ud68c\uc6d0\uc758 \uacbd\uc6b0(\ub610 \uc778\uc99d\ud560 \uacbd\uc6b0) 107 NO_ID \ud574\ub2f9 ID\uac00 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc744\ub54c(\ub85c\uadf8\uc778 \uc2e4\ud328) 108 EXPIRATION_TOKEN \ud1a0\ud070\uc774 \ub9cc\ub8cc\ub418\uc5c8\uc744 \uacbd\uc6b0 109 TOKEN_NOT_VALID \ud1a0\ud070\uc774 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc744\ub54c 110 NON_AFFECTED UPDATE \uc2e4\ud328 111 ANOTHER_ACCOUNT_AUTHENTICATED \ub2e4\ub978 \uacc4\uc815\uc5d0 \uc774\ubbf8 42 intra\uac00 \uc5f0\ub3d9\ub418\uc5b4 \uc788\ub294 \uacbd\uc6b0 (105\ubc88\uc740 \uc774\ubbf8 \uc778\uc99d\ub41c \ud68c\uc6d0\uc778 \uacbd\uc6b0\uc774\uace0 111\ubc88\uc740 42 \uacc4\uc815\uc744 \ub2e4\ub978 \uacc4\uc815\uc5d0 \ub610 \uc5f0\uacb0\ud558\ub294 \uacbd\uc6b0) 112 ACCESS_DENIED 42 API \uc0ac\uc6a9\uc5d0 \ub300\ud574 \ub3d9\uc758\ub97c \ud558\uc9c0 \uc54a\uc558\uc744 \uacbd\uc6b0"},{"location":"error/#user-error-code-200","title":"User Error Code (200\ubc88\ub300)","text":"Error Code Constant Name Description 203 EMAIL_OVERLAP email \uc911\ubcf5. (\uc774\ubbf8 \uc788\ub294 email \ub85c \uac00\uc785) 204 NICKNAME_OVERLAP nickname \uc911\ubcf5. (\uc774\ubbf8 \uc788\ub294 nickname \uc785\ub825) 205 INVALIDATE_PASSWORD \uc798\ubabb\ub41c password \ud615\uc2dd 206 INVALID_ROLE \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 role \uac12\uc785\ub2c8\ub2e4. 207 SLACK_OVERLAP \uc2ac\ub799 ID\uac00 \uc911\ubcf5 208 INTRA_AUTHENTICATE_SUCCESS 42 \uc778\uc99d \uc644\ub8cc ( \uc5d0\ub7ec \uba54\uc138\uc9c0\ub294 \uc544\ub2cc\ub370, \uc778\uc99d \uc644\ub8cc\uc2dc Front\ud55c\ud14c \uc0c1\ud0dc\uac12\uc744 \uc804\ub2ec\ud574\uc11c \uba54\uc138\uc9c0\ub97c \ub744\uc6b0\uae30 \uc704\ud55c \ucf54\ub4dc \uc785\ub2c8\ub2e4 )"},{"location":"error/#books-error-code-300","title":"Books Error Code (300\ubc88\ub300)","text":"Error Code Constant Name Description 301 SLACKID_OVERLAP \uc2ac\ub799 ID\uac00 \uc911\ubcf5\ub428 302 NO_ISBN \ub124\uc774\ubc84 Open API\uc5d0\uc11c ISBN\uac80\uc0c9 \uacb0\uacfc\uac00 \uc5c6\uc74c 303 ISBN_SEARCH_FAILED \uad6d\ub9bd\uc911\uc559 \ub3c4\uc11c\uad00 API\uc5d0\uc11c ISBN \uac80\uc0c9\uc774 \uc2e4\ud328 304 NO_BOOK_INFO_ID book_info table\uc5d0 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294 ID\ub97c \uc870\ud68c\ud558\ub824\uace0 \ud568 305 CALL_SIGN_OVERLAP \ub4f1\ub85d\ud558\ub824\ub294 callSign\ub294 \uc774\ubbf8 \uc788\ub294 callSign\uc784 306 INVALID_CALL_SIGN \uc720\ud6a8\ud558\uc9c0 \uc54a\ub294 callsign 307 NO_BOOK_ID \uc5c6\ub294 BOOK_ID\ub97c \uc870\ud68c\ud558\ub824\uace0 \ud568 308 FAIL_CREATE_BOOK_BY_UNEXPECTED \uc608\uc0c1\uce58 \ubabb\ud55c \uc5d0\ub7ec\ub85c \ucc45 \uc815\ubcf4 insert\uc5d0 \uc2e4\ud328\ud568 309 INVALID_CATEGORY_ID \ubcf4\ub0b4\uc900 \uce74\ud14c\uace0\ub9ac ID\uc5d0 \ud574\ub2f9\ud558\ub294 callsign\uc744 \ucc3e\uc744 \uc218 \uc5c6\uc74c 310 ISBN_SEARCH_FAILED_IN_NAVER \ub124\uc774\ubc84 Open API\uc5d0\uc11c ISBN\uac80\uc0c9 \uc790\uccb4\uac00 \uc2e4\ud328\ud568 311 INVALID_PUBDATE_FORNAT \uc785\ub825\ud55c pubdate\uac00 \uc54c\ub9de\uc740 \ud615\uc2dd\uc774 \uc544\ub2d8. \uae30\ub300\ud558\ub294 \ud615\uc2dd \"20220807\" 312 FAIL_PATCH_BOOK_BY_UNEXPECTED \uc608\uc0c1\uce58 \ubabb\ud55c \uc5d0\ub7ec\ub85c bookInfo patch \uac00 \uc2e4\ud328\ud568 313 NO_BOOK_INFO_DATA \uc785\ub825\ud55c data\uac00 \uc5c6\uc74c(\uc801\uc5b4\ub3c4 \ud558\ub098\uc758 \ub370\uc774\ud130\ub294 \ud544\uc218)"},{"location":"error/#lendings-error-code-400","title":"Lendings Error Code (400\ubc88\ub300)","text":"Error Code Constant Name Description 401 NO_USER_ID \b \uc720\uc800 \uc5c6\uc74c 402 NO_PERMISSION \uad8c\ud658 \uc5c6\uc74c 403 LENDING_OVERLOAD 2\uad8c \uc774\uc0c1 \ub300\ucd9c 404 LENDING_OVERDUE \uc5f0\uccb4 \uc911 405 ON_LENDING \ub300\ucd9c \uc911 406 ON_RESERVATION \uc608\uc57d\ub41c \ucc45 407 LOST_BOOK \ubd84\uc2e4\ub41c \ucc45 408 DAMAGED_BOOK \ud30c\uc190\ub41c \ucc45 410 NONEXISTENT_LENDING \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294 \ub300\ucd9c 411 ALREADY_RETURNED \uc774\ubbf8 \ubc18\ub0a9 \ucc98\ub9ac\ub41c \ub300\ucd9c"},{"location":"error/#reservation-error-code-500","title":"Reservation Error Code (500\ubc88\ub300)","text":"Error Code Constant Name Description 501 INVALID_INFO_ID \bbook_info_id\uac00 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc74c 502 AT_PENALTY \b\ub300\ucd9c \uc81c\ud55c \uc911 503 NOT_LENDED \ub300\ucd9c \uac00\ub2a5 504 ALREADY_RESERVED \uc774\ubbf8 \uc608\uc57d \uc911 505 ALREADY_LENDED \uc774\ubbf8 \ub300\ucd9c \uc911 506 MORE_THAN_TWO_RESERVATIONS \ub450 \uac1c \uc774\uc0c1 \uc608\uc57d \uc911 507 NO_MATCHING_USER \ud574\ub2f9 \uc720\uc800 \uc544\ub2d8 508 RESERVATION_NOT_EXIST \uc608\uc57d ID \uc874\uc7ac\ud558\uc9c0 \uc54a\uc74c 509 NOT_RESERVED \uc608\uc57d \uc0c1\ud0dc\uac00 \uc544\ub2d8"},{"location":"error/#likes-600","title":"Likes (600\ubc88\ub300)","text":"Error Code Constant Name Description 601 INVALID_INFO_ID_LIKES bookInfoId\uac00 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc74c 602 ALREADY_LIKES \uc88b\uc544\uc694 \ub370\uc774\ud130\uac00 \uc774\ubbf8 \uc874\uc7ac\ud568 603 NONEXISTENT_LIKES bookInfoId\uac00 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc74c"},{"location":"error/#history-700","title":"history (700\ubc88\ub300)","text":"Error Code Constant Name Description 700 UNAUTHORIZED \uc0ac\uc11c\uad8c\ud55c\uc774 \uc5c6\ub294 \uc0ac\ub78c\uc774 \ubaa8\ub4e0 \ub300\ucd9c/\ubc18\ub0a9 \uae30\ub85d\uc744 \uc870\ud68c\ud558\ub824\uace0\ud568"},{"location":"error/#reviews-800","title":"reviews (800\ubc88\ub300)","text":"Error Code Constant Name Description 800 INVALID_INPUT_REVIEWS \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc591\uc2dd\uc758 reviews 801 UNAUTHORIZED_REVIEWS reviews\ub97c \uc218\uc815/\uc0ad\uc81c\ud560 \uad8c\ud55c\uc774 \uc5c6\uc74c 804 NOT_FOUND_REVIEWS \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294 reviewsId 805 DISABLED_REVIEWS Disabled \ub41c review 810 INVALID_INPUT_REVIEWS_ID \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc591\uc2dd\uc758 reviewsId 811 INVALID_INPUT_REVIEWS_CONTENT \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc591\uc2dd\uc758 reviews content"},{"location":"error/#tags-900","title":"tags (900\ubc88\ub300)","text":"Error Code Constant Name Description 900 INVALID_INPUT_TAGS \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc591\uc2dd\uc758 tags 901 UNAUTHORIZED_TAGS tags\ub97c \uc218\uc815/\uc0ad\uc81c\ud560 \uad8c\ud55c\uc774 \uc5c6\uc74c 902 ALREADY_EXISTING_TAGS \uc774\ubbf8 \uc874\uc7ac\ud558\ub294 \ub0b4\uc6a9\uc758 \ud0dc\uadf8 904 NOT_FOUND_TAGS \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294 tagId 910 INVALID_INPUT_TAG_ID \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc591\uc2dd\uc758 tagId"},{"location":"gitflow/","title":"Git Flow Strategy","text":""},{"location":"gitflow/#main","title":"main \ube0c\ub79c\uce58","text":"
  • \uc644\uc131\ub41c \uae30\ub2a5\ub4e4\uc774 \ub4e4\uc5b4\uc788\ub294 \uac00\uc7a5 \ucd5c\uc2e0\uc758 \ube0c\ub79c\uce58\uc785\ub2c8\ub2e4. develop \ube0c\ub79c\uce58\uc5d0\uc11c\ub9cc \ud478\uc2dc\ub97c \ubc1b\uc2b5\ub2c8\ub2e4.
"},{"location":"gitflow/#develop","title":"develop \ube0c\ub79c\uce58","text":"
  • \uac1c\ubc1c\uc911\uc778 \uae30\ub2a5\ub4e4\uc774 \uc774\uc288 \ub2e8\uc704\ub85c \uc644\ub8cc\ub418\uc5b4 \ub4e4\uc5b4\uc624\ub294 \ube0c\ub79c\uce58\uc785\ub2c8\ub2e4. issue \ube0c\ub79c\uce58\uc5d0\uc11c \ud478\uc2dc\ub97c \ubc1b\uc2b5\ub2c8\ub2e4.
"},{"location":"gitflow/#issue-eg-42-issue-","title":"issue \ube0c\ub79c\uce58 (eg. 42-issue-\ucd94\uac00)","text":"
  • \uac1c\ubcc4 \uc774\uc288\uc5d0 \ub300\ud55c \uac1c\ubc1c\uc774 \uc9c4\ud589\ub418\ub294 \ube0c\ub79c\uce58\uc785\ub2c8\ub2e4.
  • \uc774\uc288\uc5d0\uc11c create_branch \uae30\ub2a5\uc744 \uc774\uc6a9\ud558\uc5ec \uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ud569\uc2dc\ub2e4.
  • \uc5ec\ub7ec \uc774\uc288\ub85c \uc774\ub8e8\uc5b4\uc9c4 \uc774\uc288\ub294 \uc5ec\ub7ec \uc774\uc288\ub97c \uac00\uc9c4 \uc774\uc288\ub85c \ubb36\uc5b4 Umbrella issue \ub85c \uad00\ub9ac\ud569\ub2c8\ub2e4. [\uc774\uc288 \uc804\ub7b5 \ud398\uc774\uc9c0\ub85c \ub9c1\ud06c]
  • \uc774\uc288\ub97c \ud574\uacb0\ud55c \ud6c4 pull request \ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.
  • \ub9ac\ubdf0\ub97c \ubc1b\uc740 \ud6c4 squash merge \ub85c develop \ube0c\ub79c\uce58\uc5d0 merge \ud569\ub2c8\ub2e4.
"},{"location":"gitflow/#_1","title":"\uac1c\uc778 \ube0c\ub79c\uce58","text":"

\ub458 \uc774\uc0c1\uc758 \uc778\uc6d0\uc774 \ud558\ub098\uc758 issue \ube0c\ub79c\uce58\uc5d0\uc11c \uc791\uc5c5\ud560 \uacbd\uc6b0\uc5d0 issue/23_jolim\uac19\uc740 \ubc29\uc2dd\uc73c\ub85c \uc774\ub984\uc9c0\uc5b4\uc11c \ud478\uc2dc\ud569\ub2c8\ub2e4.

"},{"location":"issue_strategy/","title":"\uc774\uc288 \uc804\ub7b5","text":""},{"location":"issue_strategy/#_2","title":"\uc5ec\ub7ec \uc774\uc288\ub97c \uad00\ub9ac\ud558\ub294 \uc774\uc288 \u2602\ufe0f","text":"
  • \uc81c\ubaa9\uc5d0 :open_unbrella: \ub77c\ub294 \u2602\ufe0f \ubaa8\uc591\uc758 \uc774\ubaa8\uc9c0\ub97c \ubd99\uc774\uace0 label \ub3c4 umbrella \uc774\uc288\ub85c \uc124\uc815\ud574\uc8fc\uc138\uc694
  • \ud558\ub098\uc758 \uc774\uc288\ub294 \ud558\ub098\uc758 \ud480 \ub9ac\ud018\uc2a4\ud2b8\ub85c \ub9cc\ub4e4\uc5b4\uc9c0\ub294\ub370, \uaddc\ubaa8\uac00 \ud070 \uc774\uc288\uc758 \uacbd\uc6b0 umbrella \uc774\uc288\ub85c \ubb36\uc5b4\uc11c \uad00\ub9ac\ud569\ub2c8\ub2e4.
  • umbrella \uc774\uc288 \ub0b4\ubd80\uc5d0\uc11c \uccb4\ud06c\ub9ac\uc2a4\ud2b8\uc5d0 \uc774\uc288\ub97c \ub9c1\ud0b9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
  • \ub9c1\ud0b9\ud558\ub294 \ubc29\ubc95\uc740 - [ ] #'\uc774\uc288\ubc88\ud638' \ub97c \uc785\ub825\ud558\uba74 \ub9c1\ud06c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
  • \uc5ec\ub7ec \uc774\uc288\ub97c \ubb36\uc740 \uc774\uc288\ub294 issue \ud398\uc774\uc9c0 \uc6b0\uce21 \ud558\ub2e8\uc758 pin \uae30\ub2a5\uc744 \ud65c\uc6a9\ud558\uc5ec \uc27d\uac8c \ucc3e\uc544\uac00\ub3c4\ub85d \ud569\uc2dc\ub2e4.
"},{"location":"issue_strategy/#_3","title":"\uac1c\ubcc4 \uc774\uc288","text":"
  • \uac1c\ubcc4 \uc774\uc288\uc758 \uc774\ub984\uc740 \uc790\uc720\ub86d\uac8c \uc124\uc815\ud569\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \uc5b4\ub5a4 \uc774\uc288\uc778\uc9c0 \uc790\uc138\ud788 \uba85\uc138\ud558\ub3c4\ub85d \ud569\ub2c8\ub2e4.
  • \uac1c\ubcc4 \uc774\uc288\ub9c8\ub2e4 \ube0c\ub79c\uce58 \uc0dd\uc131\uc740 \uae43\ud5c8\ube0c \uc6b0\uce21\uc758 \ube0c\ub79c\uce58 \uc790\ub3d9\uc0dd\uc131 \uae30\ub2a5\uc744 \uc774\uc6a9\ud558\ub3c4\ub85d \ud569\uc2dc\ub2e4.
  • \uac1c\ubcc4 \uc774\uc288\ub4e4\uc740 \uac01\uac01 \ube0c\ub79c\uce58 \uc548\uc5d0\uc11c \uad00\ub9ac\ud558\uace0 squash merge \ub97c \uc774\uc6a9\ud574\uc11c develop \ube0c\ub79c\uce58\uc5d0 pull request \ub97c \ub0a0\ub9ac\ub3c4\ub85d \ud569\uc2dc\ub2e4!

\ucc38\uace0: 415 \uc774\uc288

"},{"location":"usage/","title":"How to use Mkdocs","text":""},{"location":"usage/#_1","title":"\ub85c\uceec\uc5d0\uc11c \uc815\uc801 \ud398\uc774\uc9c0 \ube4c\ub4dc","text":"
  1. working directory\uc758 \ub8e8\ud2b8 \ub514\ub809\ud1a0\ub9ac\uc5d0 docs/ \uc0dd\uc131
  2. mkdocs \uc124\uce58 (mkdocs \uacf5\uc2dd\ubb38\uc11c \ucc38\uc870)
  3. \ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131 mkdocs new [\ud504\ub85c\uc81d\ud2b8 \uc774\ub984]
  4. \ube4c\ub4dc mkdocs build
    • site \ub514\ub809\ud1a0\ub9ac\uc5d0 \uc815\uc801 \ud398\uc774\uc9c0 \uc0dd\uc131
  5. \uc2e4\ud589 mkdocs run
"},{"location":"usage/#github","title":"github \uc5d0 \uc815\uc801 \ud398\uc774\uc9c0 \ubc30\ud3ec\ubc95","text":"

... \ub85c\uceec\uc5d0\uc11c \uc815\uc801 \ud398\uc774\uc9c0 \ube4c\ub4dc\ud558\ub294 \uac83\uae4c\uc9c0\ub294 \ub611\uac19\uc740\ub370 1. mkdocs gh-pages \uba85\ub839\uc744 \ub0b4\ub9ac\uba74 \uc18c\uc18d\ub41c \ub808\ud3ec\uc9c0\ud1a0\ub9ac\uc758 gh-pages \ub514\ub809\ud1a0\ub9ac\uc5d0 \uc815\uc801 \uc0ac\uc774\ud2b8\ub97c \ubc30\ud3ec\ud574\ubc84\ub9bc 2. github -> setting -> github pages \uc5d0 branch \ub97c gh-pages

"},{"location":"usage/#github_1","title":"github \uc5d0 \uc815\uc801 \ud398\uc774\uc9c0 \uc790\ub3d9 \ubc30\ud3ec","text":"

\uc55e\uc5d0\uc11c \uc54c\uc544\ubcf8 \ubc30\ud3ec\ubc95\uc740 \uc9c1\uc811 \ube4c\ub4dc\ud558\uace0 \ubc30\ud3ec\uae4c\uc9c0 \ud574\uc57c \ud55c\ub2e4. \ub9e4\uc6b0 \uadc0\ucc2e\uc74c. github action \uc744 \ud1b5\ud574 \ud2b9\uc815 \ud2b8\ub9ac\uac70\uac00 \ubc1c\uc0dd\ud558\uba74 \uc790\ub3d9\uc73c\ub85c \ube4c\ub4dc - \ubc30\ud3ec\ub97c \ud558\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc74c. \uc774\ub97c \uc704\ud574\uc11c\ub294 .github/workflows/ \ub514\ub809\ud1a0\ub9ac\uc5d0 .yml \ud30c\uc77c \uc791\uc131 ( github action \uc744 \uc791\ub3d9\uc2dc\ud0ac \ud30c\uc77c ) \ud574\uc57c\ud55c\ub2e4. yml \uc758 \uc608\uc2dc\ub294.. \ub514\ub809\ud1a0\ub9ac \ucc38\uc870.

"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000..0f8724ef --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..a65070f209f0c83280f8c5c4dafe0e8a17608e9c GIT binary patch literal 127 zcmV-_0D%7=iwFo|Rjy)_WXo8&M?ytk3HC}0~zlG)Vu + + + + + + + + + + + + + + + + + + How to use Mkdocs - 집현전 문서 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ + + + +

How to use Mkdocs

+

로컬에서 정적 페이지 빌드

+
    +
  1. working directory의 루트 디렉토리에 docs/ 생성
  2. +
  3. mkdocs 설치 (mkdocs 공식문서 참조)
  4. +
  5. 프로젝트 생성 mkdocs new [프로젝트 이름]
  6. +
  7. 빌드 mkdocs build
      +
    • site 디렉토리에 정적 페이지 생성
    • +
    +
  8. +
  9. 실행 mkdocs run
  10. +
+

github 에 정적 페이지 배포법

+

... 로컬에서 정적 페이지 빌드하는 것까지는 똑같은데 +1. mkdocs gh-pages 명령을 내리면 소속된 레포지토리의 gh-pages 디렉토리에 정적 사이트를 배포해버림 +2. github -> setting -> github pages 에 branch 를 gh-pages

+

github 에 정적 페이지 자동 배포

+

앞에서 알아본 배포법은 직접 빌드하고 배포까지 해야 한다. 매우 귀찮음. +github action 을 통해 특정 트리거가 발생하면 자동으로 빌드 - 배포를 하도록 만들 수 있음. +이를 위해서는 .github/workflows/ 디렉토리에 .yml 파일 작성 ( github action 을 작동시킬 파일 ) 해야한다. +yml 의 예시는.. 디렉토리 참조.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file