0%

Javascript 패키지 매니저 pnpm, pnpm이란?, pnpm사용이유, pnpm 설치방법, pnpm 사용방법

Javascript 패키지 매니저 pnpm, pnpm이란?, pnpm사용이유, pnpm 설치방법, pnpm 사용방법이미지

pnpm이란? (Performent Node Package Manager

pnpm이란 한마디로 표현하면 “빠르고 효율적인 javscript 패키지 매니저”라고 할 수 있습니다.

pnpm 설치방법

아래와 같이 터미널에서 npm 명령어를 통해 pnpm을 설치할 수 있습니다.

1
npm install -g pnpm

npm 설치방법법은 https://nodejs.org/ 에서 설치파일을 다운 받아 nodejs를 설치하면 같이 설치됩니다.
자세한 내용은 http://localhost:4000/2023/07/08/202307081718582/ 를 참고할 수 있습니다.

pnpm 사용방법

대표적인 명령어들은 다음과 같은 명령어를 통해 pnpm을 사용할 수 있습니다.

1
2
3
pnpm install #의존성 패키지 인스톨
pnpm add #패키지 추가
pnpm # 명령어 실행

npm과 비교하면 다음과 같습니다.

pnpm 명령어npm 명령어
pnpm installnpm install
pnpm add [패키지명]npm i [패키지명]
pnpm [커맨드명]npm run [커맨드명]

pnpm사용이유, pnpm 특징

pnpm을 사용하는 가장 큰 이유는 빠르고, 효율적인 디스크 사용이 가능하기 때문입니다.
각 내용에 대한 상세 내용은 아래에서 설명하겠습니다.
그 외에도 모노레포 지원 등 여러 장점이 있긴 하지만, 가장 큰 장점에 대해서만 설명해보겠습니다.

pnpm특징 - 빠르다 : pnpm 속도 비교, benchmark, 벤치마크

pnpm 공식 github 레포에 따르면, pnpm은 다른 javascript 패키지매니저에 비해 최대 2배이상 빠릅니다.
( https://github.com/pnpm/pnpm )
아래는 공식 repo에 게시된 속도입니다.
각 명령어들을 처리하는 속도를 비교한 그래프로, 가로축은 실행시간을 의미합니다.
(짧을수록 빠름)이미지

왜 이렇게 빠르냐면, 아래 그림과 같이 각 dependency마다 설치가 병렬적으로 수행되기 때문입니다.이미지

npm 같은 경우, 모든 dependency를 resolve를 하고,
모든 패키지가 resolve되어야 fetch가 되고,
또 모든 패키지가 fetch 되어야 disk에 write되는 구조입니다.
하나의 패키지라도 처리되는 속도가 느려진다면 전체 속도도 크게 떨어지게 되겠지요.

이를 그림으로 표현하면 아래와 같습니다.이미지

pnpm특징 - 효율적인 디스크 사용.

npm/yarn 과 비교했을때, pnpm은 node_modules 폴더의 패키지는 중복으로 저장되지 않습니다
효율적인 디스크사용이 pnpm의 성능에도 크게 도움을 줍니다.
예를 들어 sample_1, sample_2, sample_n라는 프로젝트가 있다고 하고,
각 프로젝트가 pkg_1을 포함하고 있다고 합시다. pkg_1의 크기가 2MB라고 할때,
npm이나 yarn 의 경우는 아래와 같이 각 프로젝트별로 node_modules 폴더 안에 pkg_1을 포함하기에 총 6MB의 디스크를 차지하게 됩니다.이미지

@startuml

package sample_1{
package “node_modules” as n1{
component “pkg_1(2MB)” as a
}
}

package sample_2{
package “node_modules” as n2{
component “pkg_1(2MB)” as b
}
}

package sample_n{
package “node_modules” as n3{
component “pkg_1(2MB)” as c
}
}

sample_1 -[hidden]r-> sample_2

sample_2 -[hidden]r-> sample_n : …

center footer https://devscb.tistory.com

@enduml

반면, pnpm의 경우엔 별도의 저장소가 있고,(.pnpm_store) 각 프로젝트에서는 pkg_1에 대한 바로가기를 만듭니다. (엄밀히 표현하면 심볼릭링크, symbolic link) 따라서 4MB(2MB*2)의 크기만큼 중복된 저장공간을 효율화 할 수 있습니다. 프로젝트가 많을수록 이 효과는 더욱 커지게 됩니다.![이미지](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAApMAAAGNCAYAAABNIvqLAAAgAElEQVR4Xu2dCdhNVfvGn8qQIZIpKkMiylBpUBRS0iSUoYyRSopG31+D+pRGTUpKg0SFEilCyRSiiCgk85SppCIJ/+71fft8+z3Oec/e++xp7X2v63ovr/es4Vm/Z62z773Gww7+E4SBBEiABEiABEiABEiABBwQOIxi0gE1JiEBEiABEiABEiABElAEKCbZEEiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwToJh0jI4JSYAESIAESIAESIAEKCbZBkiABEiABEiABEiABBwTOERMTps2Tb7//nvBv9u2bXOccRgTlilTRgYPHiyFCxcOo3m0iQRyEBg/frwsWrRIPv3008iRqV27tvTv3z9y9WKFoklg5MiR8tVXX8n8+fMjV8GCBQvKk08+Kaeeemrk6sYK+UfgEDHZvXt3eemll2TUqFFSsmRJ/yzxoaShQ4fKm2++KQcPHvShNBZBAtkRaNiwoXrxueuuu7LLKISp77jjDjn66KNl6tSpIbSOJpHA/wisWbNGzjnnHOnWrZs0aNAgcmgWLlwo6I8//fSTlC5dOnL1Y4X8IXCImCxVqpQ88sgjcuONN/pjgc+ltGvXTipWrCgPP/ywzyWzOBKwTmDx4sVSs2ZNWb16tVSoUMF6Qk1iYoTnzDPPlE8++USaNGmiidU0M44EXnzxRTUI8fXXX0e2+h06dJDdu3fL+++/H9k6smLeEjhETB522GFqtCCKb2BAOWbMGHniiSfkyy+/9JYscyeBLAhgmQlGJqM8ig4Recopp8gzzzyTBSkmJQFvCfz73/9Wy76iPIo+YcIEadq0qaxcuVLKly/vLVDmHkkCsROTf/75p5q+nzNnjlSvXj2STmWl9CcQBzH57LPPyhtvvCEYhWUggbASiIOY3L9/v1SuXFl69+4tXbt2DasraFeICcROTMIXrVu3ljp16qh1IgwkEEYCcRCT2OiHRf8zZ86UevXqhdENtIkEJA5iEm7GmtAdO3ao/RIMJGCXQGjF5Ntvvy1PPfWUYBfdySefbLdeucYfMmSIvPfee4KhfQYSCCOBsIjJPXv2JF66MJJYoEABV3FdeOGFcv7556sHNgMJhJFAWMSk131x7Nixcv311ws2HBUtWjSMrqBNISYQaTEJQYoNN1988YXUrVs34QbsWjvuuONk3bp16l8GEggbgSiJSWx269Onj0Lct29feeCBBxK4sX75ww8/lNmzZ4fNBbSHBBSBuIhJiNXixYurpSdt2rSh90nAFoFIiknjDe6VV15RMJLFJP52ySWXyLXXXiudOnWyBYyRScAPAlERk8uXLxf0x9NOO03wO5aYDBw4MPFyh3M08dmSJUt4zp0fDYtl2CYQFzEJMF26dFF8Xn/9dducmCDeBDKKyXTCzDzaAGGGUUC81cyaNUtwVmXjxo3VNDUChs8HDRokkyZNkptuukmM6TLkgXVTCCNGjJBatWolprWTp7mxlqNt27Yqj3QCMdmVqR5eRpznnntO5s2bJ++88068WwBrH0oCqcSk0Z4hwIw+B+PN/cI88pfcv5AG66KaNWum6jx8+HCV1jx9hiku9DEjfxxobKwtNvot+rixxtHc9zOBNPpw+/btVblGqFGjhnTs2FHuvvvuTFnwcxLwnUAqMWnuA8YzDTNdeFlC/zT3L/xutS8affzqq68+ZDQ/1TS3nb6YKm/jO8CAivWSONd2/fr1vnNmgXoTyCgmIeqGDRuWEIvJ1TUaOKaLMX1lNG400hYtWqgHER5QyGfZsmXqIWSMFKKDjR49WgnIcuXK5XhoffDBB4k1k8ZnWFuFh1AmmwwbcxOTsOXcc8+VDRs2SKFChfT2Iq2PHIFkMZncz1JVOLm9m/sX4uNBh4cU+ik+Q19FXzIEo9FPDYGKpSEQeGYxiQdmjx49ZMCAAYk+a/T9TE5Itw4atmATzuTJkzNlwc9JwHcCyWIy3UuR2TBjUMVY82+1L27fvj1HPzWep3hmnnHGGVn1RbOYTP4OwEAQwq+//qouE+D5r743M+0LzCgmjcacPAJhHpkEBWNEJFUn2rhxoxqNNN7cjGku5GF8hoX9ZpE4ceLEhJg0HoTGGx/+bx7FTOeF3MQk0lSrVk0ee+yxxEiN9t5kBSJDINXIpNHnzKOPySP2AGB+WTP6Fw4kxouYMSpo7muGmDSLQqNvPvroo3LvvfcqrujDeMnDOmRzMM82pHOAYXvySAji45q6s88+W30XlC1bNjI+ZEWiQSBZTJpn68zt2TxzkPyMMj/rcuuLhpg0npFm4WoMzjjti8nPw3SDMpi5wFmTzz//fDQcyFr4QiCjmIQV5gcWOg9urjDWPhlvS+aRSUxzm9/IrIpJ82hJKjFpXmtlhU4mMfnQQw/J1q1b1fWRDCQQJgLp1kwaL3fGyxRu5TBmDpIfRFYfYMli0jydlkpM5jZTkczQyAuXBOR2MgNGRrAZ54YbbgiTG2gLCaTdgGNs8DQGWvAcMZ51CxYsUMu9Uj0H7YhJ4xl2zz33JGb6zGLSTl+0KibxjEe/N5agsQmQgBUClsQkMjJPs+E4D2O6ukSJEocMy9sRk8Y0N/LByAmm1jAEb54SS/4M4hYjJJkOV80kJufOnSstW7ZUI6YMJBAmArltwDG3688//zwxXY0XMPPpBXbFpDHNbYjSVA8wPCTNS1UgbhHMpyWYOZqn6dLFQXys00L5+D5gIIEwEchtA44xEzd06FC1L8AQev37908s4cLRdlb7YvI0t/k5mLwUzG5ftComt23bJrhWGc9HzBgwkIAVAhnFpPH2hcySF+Vjt7RxhACuRTPWTNoRk5iS27Jli1q0bJ5KT15flWrzgbHOI11FM4lJpMP1kXhw169f3wovxiEBXwikWzNpnFBgTHWb+wXEH9YdplpGYmWaG/eAG33RmLpGZZM34Ji/E5KP+kmGY45rfJZqqhsP5UsvvVTNFBx55JG+MGYhJGCFQLo1k8ZmUKM9mzfDoF8YAyVOxGTVqlXVqCZCqo1yxmY4O33RqphEmRCRl112mWD2joEErBDIKCatZOI0TvKaSaf5ZJMOu0iPPfZYNcXGQAJhIeDn0UBWNvf4wQUvdngAY20YAwmEhYCfRwNZGQDxgwum7DHaitFJBhKwQkBrMZlq80GmkZJkKHi7xBQbzrljIIGwENBNTCaPQFrZIJfMGue+Yv0mz7gLSyukHSCgm5hM3giEOqSaDcjNu1j7efzxx8uKFSvkpJNOYkMggYwEtBaTGWtnMQJGRL755ht1eDIDCYSBgG5i0g1mmKLHJQKbNm1yIzvmQQKuENBNTLpS6X8ywabaXr16Sc+ePd3KkvlEmECgYjIsXM855xxp2rSp3HfffWExiXbEnICfYjJMqPFih01FDRs2DJNZtCXGBPwUk2HCfP/996tju4y1oWGyjbaEj0BKMfnWW2/FahcXpujGjRsnuBWHgQRAoEKFCuonqGCISRyuH6eAczBr1qx5yFmWcWLAuuYkgFMA8ubNGxgWiMkJEyYInotxCjjlBDfZTZ06NU7VZl1zIdCgQYO0n6YUk6RJAiQgasq1d+/eUqVKFd9xGGLS94JZIAmEjABe6po3by7PPPNMIJZBTOLcxb/++iuQ8lkoCYSFAMQkfh588MFDTEopJj/99NNYHpUT5NtvWBoL7fgPAZx5eMstt0ijRo3UBi2/gyEm4/oAY1/0u8WFt7yxY8cqMYkD+mvXru27oRCTGJ3DczGOgX0xjl5PXefclnxwzSTbCQmkIRDkWqm4rplkYySBVASwhjbdiIjXxIL8HvC6bsyfBOwSwLr2gwcPWhuZxFtYbnPjdgtnfBLQkUCQDxGKSR1bDG32igDFpFdkmS8J2CNAMWmPF2OTgK/nyyXjpphkAySB/xGgmGRrIIFwEKCYDIcfaIVGBDgyqZGzaGqkCVBMRtq9rJxGBCgmNXIWTQ0HAYrJcPiBVpAAxSTbAAmEgwDFZDj8QCs0IkAxqZGzaGqkCVBMRtq9rJxGBCgmNXIWTQ0HAYrJcPiBVpAAxSTbAAmEgwDFZDj8QCs0IkAxqZGzaGqkCVBMRtq9rJxGBCgmNXIWTQ0HAYrJcPiBVpAAxSTbAAmEgwDFZDj8QCs0IkAxqZGzaGqkCVBMRtq9rJxGBCgmNXIWTQ0HAYrJcPiBVpAAxSTbAAmEgwDFZDj8QCs0IkAxqZGzaGqkCVBMRtq9rJxGBCgmNXIWTQ0HAYrJcPiBVpAAxSTbAAmEgwDFZDj8QCs0IkAxqZGzaGqkCVBMRtq9rJxGBCgmNXIWTQ0HAYrJcPiBVpAAxSTbAAmEgwDFZDj8QCs0IkAxqZGzaGqkCVBMRtq9rJxGBCgmNXIWTQ0HAYrJcPiBVpAAxSTbAAmEgwDFZDj8QCs0IkAxqZGzaGqkCVBMRtq9rJxGBCgmNXIWTQ0HAYrJcPiBVpAAxSTbAAmEgwDFZDj8QCs0IkAxqZGzaGqkCVBMRtq9rJxGBLQRk7NmzZJPP/1Upk+frhHe8JpavXp1eeqpp+TII48Mr5EhtSwOYnLNmjWqr7355psh9YJeZh111FHy7LPPSqVKlfQyPOTWxllMso+62zjZR7PjqYWYfO+996RVq1bSvn17fhln5+9EajCFkPz6669dyjE+2cRBTDZv3lwOHjwop59+enwc62FNt27dKi+99JKsXbtWypUr52FJ8co6zmKSfdTdts4+mh1PLcQkhGShQoVkyJAh2dWWqXMQqFOnjnTq1EluvvlmkrFBIOpi8rvvvhOMXG/ZskVKlSplgwyj5kagW7dusn79evn4448JyiUCcRWT7KMuNaCkbNhHnXPVQkwG+YXhHG34U7722msyZswYGT9+fPiNDZGFUReT06ZNE/Q5jEwyuEdgxYoVUqVKFZk8ebJcfPHF7mUc45yCfDZE/Xsgjs2KfdS51ykmnbPTPuWmTZukfPnyauqtbNmy2tfHrwpE/SFCMeldS7rkkkukZs2aar0yQ/YEKCb5wpd9K8qZA/uoM6IUk864RSbVRRddJO3atVPT3QzWCFBMWuPEWIcSeOaZZ+Stt96ShQsXEo8LBCgmKSZdaEY5smAfdUY01mJyz549cscdd8j5558vbdu2dUbQg1Rvv/22zJw5U+3+LFCgQNoSduzYoeyuW7euPPDAA44sefrpp2XBggWCMhmsEaCYtMYpVSycyvDwww+r9la8eHHnGbmY0o5NsBujiiNHjpSTTz7ZthXGWrfZs2fLueeeazs9E+QkQDHpvpi00x/8ao92bGIf9csrOcuhmIy5mPz++++lQYMGgmMmChYsGEwr1KxUiknnDrPzUHBeir2UdmzK9kEFyyCA8NOnTx97hjL2IQQoJikmkxsF+2gwXxQUkzEXk2h2Z555phrZvOqqq4JphZqVSjHp3GF2hJvzUuyltGOTGw+qxx9/XG16w+wDQ3YEKCYpJr0Qk+yj9vullmJy+fLl0rp1a7n66qsTb/fDhw9PTFUb07+TJk1SRNJ9ds8998iuXbtyTHPjwVKvXj2VDgtxc5uOQ9zu3btL48aNEwvqx44dK4MGDRKUfdNNNyWmqnOzCWVh6g8jFSgTP6gjprkxBY0yjGk12DNs2LDEtHTyNDc+xxpIBHP55nqZ/454EJK//PKLvPjii/ZbUAxTxFFMon1iFBthxIgRh/QNc7tL7jfGZ7Vq1ZJbbrlFPvjgg0S/MpaavPLKK4f01eSmZcTF3zGSbvSxM844Q7V1hC+++EIt+0BwYhNG57H05bjjjlP9wui3OOMWfS1ZTCb3a6P85HqZ7frmm28ENi9btszRVHkMu1zaKlNM/k9MhqGPpno2o2/jOYZ/0303pHrepvveYB8N5zeA9mISX/joRBBLaHzJDc1o3BCOeBgg7saNGxNCDcLREJuI26NHDxkwYIA6WNj8UEnlPkOgIX2LFi1UfDzkYAceFMgbDxE8OMx5JdtkiFIIxhIlSig7K1SoYFtMmkdYYC/ywUOwSZMmid9TrQ3F+i3EW7lyZThbacisiquYHD16tHqpQcDLnNGnzO0X6wjN/XH79u0q7sCBAxP9wOgjWDOJuMYLTXI+6cRkch8z9z+kSfUSZtUmOw8q4zvCWHNtftGbOHFi4qUv1dpQHBGEM+3wvcDgnADFZE4xGXQfNYtJ49nstk3so877i5cptRaTeEBhFML8JW5+eOEzY4QAIw0YFTEEFv5N3oBjHskwoCeP4pmdkeohagjVdevWJR6iEIjGAzXZJqPDGemw4ca8AcfOyKQxumm2sW/fvnL33XerhxbeDM2jtOZ4xxxzjDpzsn79+l62t0jkHVcxabTR3bt35+hH5hc0tF9zv8ANS8ZIOkRVqhceYwbBaBzmUTxzgzH3ZfQb48FlfA+Y7ejfv3/ipdGOTXYeVIaoXrRoUcJMjL5CcON7CC+T6WY30C/nzJkjn3zySST6RFCVoJjMKSaD7qPJfTLVTJoxyu/0e4N9NKjelnu5FJOmNZPmhm9lp2kYxaRZlCa73hDLqR5wt912mxQtWlQeeeSRcLbUEFlFMemumDQeLplcHFYxaYjZZPvNU+DJL3Fz585VL8KbN2+WkiVLZqo6P09DgGLSHzFptY+GVUyyj3r/FRI5MQlk5nWE5sZtTDebp8LM09zGtLUxMoL/IxhrsJLdYVVMVq1aNa1NxsiqcdxI8jS3eYTTsN+Y5kuua/J6rg8//FBQtvkIk3RTiRMmTJD77rtPsJ6LIXcCFJM5xWRyu0u1lMS83MNov8YIg9Ef8S9GMfHgSnUklh0xiXWZ5iN8rNpkTL2nWwpjrqvRV42juSAeUW7Xrl0TDSjZZnPLKly4sFqnzDNenX/jUExaE5N+9VE7YtKpTeyjzvuLlykjJybR0HLb7GI0dkxNtWnTRrG94oorEpt3zFPdmIrK7fxGq2ISD5vcbDIv1sc0GTb0YGOQcc6kMX1tfPbtt9+m3YBjnuo2RkMybf4BA1ydd/jhhwu44IYOhvQEKCZzikmQym2zi7lNok8Z65uT+6oxRZzu/EY7YtJYLmJsRksejc/NJvN3BJa5QPym24BjjmsuIzceRsvCbADuPx81ahS7m0MCFJPWxKRffdSOmMzGJvZRhx3Gw2RaikkPecQ6azwMGzVqJL169Yo1h0yVj6OYzMSEn9sngKOBmjZtKtu2bZM8efLYz4Ap1HmdOCf3wQcf9J1G1L8HfAcawgLZR607hWLSAqvkjTmZRlAsZBnKKKjn4MGDZfr06aG0LyxGRf0hEvTd3Mkj6fB7plmCsLQNu3bgCxjLUSAqGewToJh0/5xJK15gH7VCKV5xKCbj5e9ca4uzJrGre+3atepoJIbUBCgm2TLcIoAjxUqVKiUvv/yyW1nGKh+KyWDEZJwaGfuoNW9TTFrjFJtY5cuXl969e8vNN98cmzrbrSjFpF1ijJ+OwEcffaSOLFu/fj0hOSBAMUkx6aDZ2ErCPmoNF8WkNU6xiYUNR9jR/fHHH8emznYrSjFplxjj50YAX8JYm2XcvEVa1glQTFJMWm8tzmOyj2Zmp4WYxEHaX375peTLly9zjRgjKwIHDhwQHEqtY8CtItihf+utt3p6dl9cxCSOrmHwnsC+fftk79693hfkQQldunRRB7O3bNnSg9wzZxl3Mck+mrmNuBFj//796pITHcONN94oF110ked9VBsxCaGALy4G7wng1p1TTjnF+4JcLgFHuOCYFRz1hKlDr0JcxCRuaGHwnoCu/Q1kcMwTZjGCaitxF5NBcfe+V4SrBJ37KDbU4pIEnCXtZdBCTAb5heElfObtPgE/hJ4fZaQj48dOaz/KcN/zzDEoAniITJ06VR3R43cI8tkQ9e8Bv33J8rwjkE7ouVkixaSbNJlX4AT8+IL3owyKycCbEg2wSIBicqpFUu5F4wufeyzjkBPF5H+9HOTbZxwaWpTq6IfQ86MMiskotcpo14VikmIy2i1c/9pRTFJM6t+Kfa6BH0LPjzIoJn1uOCzOMQGKSYpJx42HCX0hQDFJMelLQ4tSIX4IPT/KoJiMUquMdl0oJikmo93C9a8dxSTFpP6t2Oca+CH0/CiDYtLnhsPiHBOgmKSYdNx4mNAXAhSTFJO+NLQoFeKH0POjDIrJKLXKaNeFYpJiMtotXP/aUUxSTOrfin2ugR9Cz48yKCZ9bjgszjEBikmKSceNhwl9IUAxmaWY/PbbbwVHKBw8yCunfGmxLhdSp04dOeecc2zl6ofQ86MMXcXka6+9Jn/88YctnzFyOAgcddRR0rlzZ9vGUEzqJSZfffVVbW85s904I5agaNGi0qlTJ9u1opjMQkz+9NNPMm7cOHW9HoOeBMaMGSPnnnuu4PYjq8EPoedHGTqKyeeee05at24thQoVsuouxgsRgZ07d8rYsWOlR48etqyimNRHTD7zzDPSoUMHXk1sq4WHJ/LWrVtl4sSJ6spgO4FiMgsx+eGHH8pZZ50lvLvUTpMLX1w83PDlZzX4IfT8KENHMfnCCy9Ix44drbqK8UJIYMiQIdKzZ09bllFM6iMmBw0aJG3btrXlX0YOFwHM/tx55522jKKYpJi01WCiGJliMqdX/bj5wmkZFJP690CKSes+1PGl8uWXX5brrrvOeiUZM3QEKCazcImTG3A4MpkFcBeTPvvss7J3717LOZYqVSrHui2KSYpJy42HEWX27NkyY8YMWySuvfZaKV++vEpDMWkdHcWkdVaM+T8C06dPlzlz5thCghmfMmXKqDQUk7bQ5YxMMZkFvICSzp8/X5U8atQoadasmeTNm1fOOOOMXK3BepAJEyZQTOZCyemooZ1m4LQMjkzaoexu3H379gk2HC5ZskTw+2mnnSZVq1aVggUL5lrQO++8I+effz7FpAN3UEw6gBbjJLt375alS5fKwoUL5YgjjpDq1atLjRo11LMxtzB06FBp0qQJxaQbbYdi0g2K/ubxxRdfyI4dO+TAgQNqsff+/fuladOmuRqBTVMUk7n7yanQs+N9p2VQTNqh7G5cCEhsrqhWrZo6vWLlypVy8803ZxSTw4cPp5h06AqKSYfgYpoMYhLLDE466SRFYNmyZXLHHXdkFJOYLaCYdKnRUEy6BNLHbCAmFy9eLNu2bZPixYvLCSecQDHpAn+nQs9O0U7LoJi0Q9nduIaYxIgHxCT+pZh0l3FybhST3vKNWu6GmMTACjbEYKCFYtJnL1NM+gzcheIWLFigchkxYoQ0b95c8ufPn3GamyOTmcE7FXqZc/5fDKdlUEzaoexuXDyoMNKBFzgISywpKVeunJQoUSLXgjgy6dwPFJPO2cUx5fbt22XdunXyzTffqJe9mjVrWlqKwpFJF1sLxaSLMH3KCiOT69evl127dgkOQ8YRTZzmzh6+U6Fnp2SnZVBM2qHsblxjZLJ06dJqZPKXX37hyKS7iA/JjWLSY8ARy94YmSxWrJgamcQeAY5M+uxkikmfgbtQHMTk2rVr5ddff5UiRYqoH4rJ7ME6FXp2SnZaBsWkHcruxjXEZMmSJdX0GV7iOM3tLuPk3CgmveUbtdwNMYlbbCAmMVJJMemzlykmfQbuQnGrV69Wubz55pty1VVXqd8x7ZZb+Pvvv7kBJwN7p0LPjkudlkExaYeyu3EhJjds2CBYXoLfcWsUprgz7ebGbRrcze3MFxSTzrjFNRXE5JYtW2TevHmSJ08eqVixotqhnWk390cffcQNOG41GopJt0j6n8/gwYNtFYpOZr4fmOdM5sTnVOjZcYLTMigm7VD2Ji7OmcTxQHbCJZdcwqOB7AD7b1yKSQfQmERwzuTy5cttkbjyyit5NJAtYmkiU0y6QVHPPCgmKSb1bLl6Ws1Dy637jWLSOivGdI8ADy3PgiXFZBbwNE9KMUkxqXkT1sp8iknr7qKYtM6KMd0jQDGZBUuKySzgaZ6UYpJiUvMmrJX5FJPW3UUxaZ0VY7pHgGIyC5YUk1nA0zwpxSTFpOZNWCvzKSatu4ti0jorxnSPAMVkFiwpJrOAp3lSikmKSc2bsFbmU0xadxfFpHVWjOkeAYrJLFhSTGYBT/OkFJMUk5o3Ya3Mp5i07i6KSeusGNM9AhSTWbCkmMwCnuZJKSYpJsstfw4AACAASURBVDVvwlqZTzFp3V0Uk9ZZMaZ7BCgms2AZBjE5atQodeh2nTp1sqiJtaQrVqyQyZMnS/fu3VWCn3/+WdCAbrvtNsEBpsl24PMbbrhBpkyZckgB9913n/Tq1Svx9yeffFL69euX+H/16tXVweLFixdPlFGgQAH1Oezo1KlTjnPrXn31VWnVqpV8+eWX6p5R/O5loJiMp5hM7gNetjHkPXDgQGncuLFUrlxZFWX0dxz+bfQ9o18Yn3ft2vUQs4z+ZOSTqg8ZfTL5OyVVPzbi+sWDYtJ6S4u7mPSrTRoe8aqP4lmGs1bNwXjOJZcZhj5KMWm9jx4SM2piEo13xowZOUQeKg2hd8EFFyhhZ0dMpkNrpbMPHTpUcCAqQqqHpjlv2I0AQW0Wk+nqk4XLE0kpJikms21He/bskccee0zat2+fEIvIE/1j2LBh0rt3b3njjTdsicl0NiU/fJLjocwffvhBLr/88oRgTfeCao5r7svp6pMtJ6SnmLROkWIy56CHdXKHxjT3RfNLWxB91Pycs9Of/eqjFJNZtLSoiEnjrebgwYNy0UUXJUYegcbcgL0cmTS7AfZgpLNjx445Rj/Nndkc39yxkkcmx48fr65wM0ZksnB3jqQUkxST2bQljP49//zzqm3ee++9ifYJQTZy5Ehp3bq1oL17NeqRbLu5n2Sa7TB/nuo7wei72fBJTksxaZ0mxWT2YhL9EC9za9eulRo1aqjfjedPUH3UGGA55phjDvleSG4dQfRRiknrffSQmH6JSTQM3J+JIW5cSWaeIjY3GowgImD62DxE3rNnT/V3c4dIVe3kBwM6Da6iw1Q1GnCqqbHrr79eja7gAYLptUaNGqmRRMQ3T4OnE4Kp7DDXKVMeyTYni0kro6BOmgDFZHTFpNHmfv/9dyX4zFPE5vaEtoY+h/aO9o3+BdGDPoAlH23atMm4/CRZLCa33+TlH6A+adIkJUKNJSTG1Bc+yyQEU7X15D6WWx7JcVP1r0yjJk76G8WkdWpxEJNO+igIGn3m6quvliJFiqiBk9wGGlI9f4Loo8n9LLc+FlQfpZi03kcDFZO42xaiDQ8tY9oZ01DGFz/WCSJgrSAaHuL2799fiTrEMadPV+XkBpvp/9msmTSLTrM9yR3VvBYkeZ0lPuvbt6/06dNH1RMhVfpM0+ROmgDFZLTFJB46eClDHzNPaW3YsEEt9cA6RmMq2uiTFSpUUP3PaLNG+tzaV/JDIdP/na6ZhA1m0WnYlPzCaAhSvBgmr7NMNY2dSkw6EbSZ+iDFZCZC//s8LmLSTh8FHbzsGS94aLfon3iW2hWTfvfRVILWeMlMfo4G2UcpJq330UDFpHlzi3ktIL64P/nkE6lWrVpirWOq0Tnzg8+OmDTWUSGN3WluczmZRhgR1zyyaqRNly5ZMBvxk+ue6mGZhcsTSSkmoy0mzS8g5i9o1PrRRx+Vww47LPGylqqNmV/47IhJ81QW0tmd5jaXlUnUpXugpkqHfnj33XerB7L54ZtKTHqxCY5i0vq3VlzEpJ0+mvwcsbq+N9Xzx88+ap79MAZMUn0v4G9B91GKSet9NNRismjRoomRSzwMEIwdzekWESdXKNVIZLKYTN5FbZ7mzm1XeW5i0lifkmpaMFW63EZaKSanydSpU7No1c6STps2TbDsA+tuvQpOy8BSDay/tRpye/AYYnLnzp2JUY1UI+RuicncprkzjbjnJibRT0aMGJH4zshNhKZ7oCENxWTqVuVkCZTV9pkpHsXkf174zH00+Rnoppj0qo+i/65Zs+aQDbGpxGQY+ijFZKaemcvnTr4wPvzwQznrrLOkcOHClks2N6pk4WWe5jYaXvKoHRr7pk2bUj44zEZkmtbOzeDkBxf+n+qIEnMeydNoqfK3MqJpTpdKTJo3NFiGniEiRyZzAnIq9Oz4w2kZTsSkeRTOLLzM09zmpSToY8Y0t7G2+Omnn7a9ZtLqesPkfpHbMVxmxslLRVLxzzSimdt3Bj4zb9qz49/c4nJk0jrJuIhJO33UWNNsDFigjd51113q+Llsp7nTecbLPmr1eyK3Fz585uaRghST1vvoITH9FpPGOYzpFtybR+yMDTEwGpsIVq1a5WgDjlUhZucBZAd5tmKSG3Ds0HYe16nQs1Oi0zKciMnnnntOIBxHjx6dY1OZuT2Zp4lxbJaxuB+j9Vjcf9lll2X8sk61AcfKl7zdfmGHs52+zA04qck6eTbY8VFuceMiJu32UTAzZtaMTanJx3Ilc023ASfoPpqtmLST3mq7pJi0SipFPCdfGE5HJrM5mDwbQWX1wWI1nl3cdh+aPBqI09zJbcyJmMw0hZypHTv9srba3q3Gy2Rnqs/t9GUeDUQxaSbg9IXv5Zdfluuuu85yc822/Wezlt5q2VbjWa60KaKd7xe/+ijFpBNP/jeNDmLSmBY/77zz5PTTT097c0w6DFbXlmSB0bOkPLTcM7SHZOz0IWLHQqdl+C0mzeuX8AVrvtkp3SkGZg5etls7vO3G9fK7gtPc1r0Rl5HJbF74zLN4+H5gH7XevtLFpJjMgmFYxWTy+ikr66SywBDLpFwzmdPtToWencbjtAw/xKR5jbCVtcB26s24vAHHThugmExNy7xRxspLnR3mjPufm+ruvPNOWyhwKoaXmzZhTLoyDvun4BzbRRERu1cbNGhgqxJuRPZLTLphK/NwlwDFZHTFpLsthbm5QYAjk9YpxkFMWqfBmH4RoJjMgjTFZBbwNE9KMUkxqXkT1sp8iknr7qKYtM6KMd0jQDGZBUuKySzgaZ6UYpJiUvMmrJX5FJPW3UUxaZ0VY7pHgGIyC5YUk1nA0zwpxSTFpOZNWCvzKSatu4ti0jorxnSPAMVkFiwpJrOAp3lSikmKSc2bsFbmU0xadxfFpHVWjOkeAYrJLFg6EZMTJ06USpUqSenSpbMomUmDJPDnn3/KlClT5Nprr7Vshh9f8H6Uka7CTndaWwb4T0SnZeDQfhwkzqAvgddff13uuOMOWxXQbXOmrcrlElnH74EXX3xROnTo4BYC5hMAAVymgluF7ATu5v4vLSdiEklxzVrjxo0lf/78drgz7j8ENm/eLGXKlAmMxd9//y2TJk2SW2+9VfLmzWvZDj++4P0oQ0cxiSvTihUrJtWqVbPsL0YMD4HFixcLzrBs166dLaMoJqfa4uVGZKcvfBAiZcuWzfVqQzfsYx7eEFiwYIHkyZNHrrnmGlsFUExmKSaRfObMmbJv3z5b4OMe+cCBA4Lz/BCaN28eiBg/4ogjpH79+rZd4YfQ86MMHcUkbMYtEOvXr7ftN10SDB8+XM4555xIPozLly+vZnPsBopJfcQkfLts2TLZtGmTXTcHFn/69OmyZcsWadWqVWA2hKXgE088USpUqGDbHIpJF8SkbepMkCCA9VNfffWVmvaqXLmyFmT8EHp+lKGrmNSikWRh5KOPPqpecurWrZtFLtFKSjGpl5jUqfWtXr1aTeniWsMgZ8p0YpbKVopJisnA2/DkyZNVR4agDOLAersA/BB6fpRBMWnX8/7Ef+aZZ+S0006TCy+80J8CNSiFYpJi0qtmeu+998q5554rV155pVdFxCJfikmKyVA09O+++06effZZwdrVtm3bhsKmdEb4IfT8KINiMpzNDC9WFStWlMsuuyycBgZgFcUkxaQXzW706NGyZMkSefDBB73IPlZ5UkxSTIamwe/cuVMJykKFCqlRSjubYvyshB9Cz48yKCb9bDXWy8JuZ2wyatGihfVEEY9JMUkx6XYTx/Q2njMvvPCCnHDCCW5nH7v8KCYpJkPX6AcPHiwYqURHd7IQ2OsK+SH0/CiDYtLrluIs/7ffflsOP/xwW8dVOStJn1QUkxSTbrfW//u//5N69erJFVdc4XbWscyPYpJiMpQNf/z48YLNOXfeeaecd955obLRD6HnRxkUk6FqVglj3n//ffntt994nqbJPRSTFJNu9tZ33nlH1qxZI1gvyeAOAYpJikl3WpIHuXzzzTdq2hsLo1u2bOlBCc6y9EPo+VEGxaQz/3ud6uOPP1ZHH3Xr1s3rorTJn2KSYtKtxoo1kv369RNcgFCqVCm3so19PhSTFJOh7gRbt25VghK3DN1+++2hsNUPoedHGRSToWhOhxjx2WefqU0BYWnvYaBEMUkx6VY77N69uzqQG5s9GdwjQDFJMelea/IwJ1zRtXbtWrWOErcrBBn8EHp+lEExGWQrSl82LkGYNWuWYE0Xw38IUExSTLrRF1566SXBhRm49YzBXQIUkxST7rYoD3MbM2aMvPfee0pQnnXWWR6WlHvWfgg9P8qgmAysCeVaMA7xnzBhAo8rMVGimKSYzLa34pabkSNHynPPPSf58uXLNjumTyJAMflfIHhjwfD3oEGDpGrVqmwoISWwfPly+eCDD9QNIUFszMGibXwhYR3nLbfc4hmlqItJgMNBwU2bNlX/MvyPAI4smTp1qnTu3JlY/iGAUVqsI50zZ04gPDAdissUgjiLMMjvgSj1URw7h/Nbr7vuOnWGK4O7BCDU586dq16CvQzpBOthB/8J5oKDfPvctm2b4Hy3SZMmCS64ZwgvAdypXbhwYTVdgV2vfoYqVaooEYkvpZIlS3pWdJAPEbR/PECTuqfrdR0xYoSMGzdO3n33Xdfz1jnDPHnyqLNWf/31V52r4ZrtvXr1UldL4sUjiBBnMRmVPlqkSBHZt2+f7NmzJ4gmFPky/eqjWojJyHs7ghXEtXPbt29XxweVKFEiUjWMg5iMlMNcrMz333+vdpq+8sorLubKrJwSiLOYdMosTOmGDx+ujgG6//77w2QWbXFAgGLSATQmsUYAU84YWoegrFWrlrVEGsSimNTASR6ZuGXLFundu7e88cYbHpXAbO0QoJi0QytccbE0Ai9lWCd59NFHh8s4WmObAMWkbWRMYIfAF198oY4P6tKlS2TuM6aYtNMCohUX09s4YxIHKzMET4BiMngfOLEAL2XYrHnXXXdJ7dq1nWTBNCEjQDEZModE0RxsWoCgrFGjhnTt2lX7KlJMau9CxxXYu3evWpM7evRox3kwoXsEKCbdY+lnTrjd5owzzlBnSjJEgwDFZDT8GPpa/PXXX0pQYpE13kiLFi0aepvTGUgxqa3rXDEc9wV/9NFH6nxFhmAJUEwGy99J6S+//LL88ccfalSSIToEKCaj40staoIF1ziqAILylFNO0cLmZCMpJrV0m2tGYzRl2LBhUqBAAdfyZEbOCFBMOuMWVCocI4VbpJ5++mnByR8M0SFAMRkdX2pTE5zTh93ePXr0kIsvvlgbuw1DKSa1c5mrBrdr105w6xM3DbiK1VFmFJOOsAWSaP78+fLEE0/IU089JeXLlw/EBhbqHQGKSe/YMudcCPzwww9KUOJQ7I4dO2rFimJSK3e5biw2k/Xr10+OPfZY1/NmhvYIUEza4xVU7I0bNwrOO7ztttukTp06QZnBcj0kQDHpIVxmnTsBrJuBoMR0B6a9dZk2pJiMd8vGbVz33HOPVKhQId4gQlB7iskQOCGDCTiQHEISN6M1a9Ys/AbTQkcEKCYdYWMiNwngzD5MgUBQnnTSSW5m7UleFJOeYNUmU2wcuPHGG+Xkk0/WxuaoGkoxGX7PPvroo+pGsiic5BF+2sFZSDEZHHuWbCKAqzJx9zoEJd5gwxwoJsPsHe9tw7EmrVu3jtRB/N5T86YEiklvuLqVKw4l//nnn9VB/wzRJkAxGW3/alW7JUuWqOODGjVqpM7yC2ugmAyrZ/yxq2/fvtKkSRM5++yz/SmQpaQlQDEZ3sYxatQo+eqrr+Txxx/nzu3wusk1yygmXUPJjNwg8MsvvyhBedRRR6lRyjx58riRrat5UEy6ilO7zLAjFRvHLrjgAu1sj5rBFJPh9Chmmt5//3157LHHpESJEuE0kla5SoBi0lWczMwtApgeWbp0qbrXu1y5cm5l60o+FJOuYNQ2k+eff16qVasmjRs31rYOUTGcYjJ8npw9e7agj2CtZKVKlcJnIC3yhADFpCdYmakbBHDLyFtvvaUEJUaCwhIoJsPiiWDswItO2bJl5corrwzGAJaaIEAxGa7GsGjRIrn//vvl4YcfltNOOy1cxtEaTwlQTHqKl5lnS2DBggVq2vuqq64KzT2uFJPZelXv9G+++aYUKlRIWrZsqXdFImA9xWR4nIizgyEke/bsKXXr1g2PYbTEFwIUk75gZiHZENiyZYsSlGXKlFFfVEEHismgPRBs+SNGjBCcnde+fftgDWHpQjEZjkawevVq6dOnj3Tq1EltoGSIHwGKyfj5XNsav/DCC7J+/Xpp27ZtoMeyUExq24RcMXzs2LGyfft2ueGGG1zJj5k4J0Ax6ZydWynXrl0rDz30kDouC6ccMMSTAMVkPP2uba1xXtm6devUTu8zzzwzkHpQTAaCPTSFvv3227Jy5Uo1EsMQLAGKyWD5Q0ji+/Dqq6+Wyy+/PFhjWHqgBCgmA8XPwp0QmDt3rrqGEWdRYi2l34Fi0m/i4Spv6tSpgrW8uAmHIVgCFJPB8V+1apXaaHPNNddQSAbnhtCUTDEZGlfQEDsENmzYoAQlrl+85ZZb7CTNOi7FZNYItc4AR59AUN53331a1yMKxlNMBuPFZcuWySOPPCLt2rXj1HYwLghdqRSToXMJDbJK4ODBg0pQ4rouHB9UvHhxq0mzikcxmRU+7RNjVHLMmDFqVIYhWAIUk/7zX7hwofTr10+6desmF154of8GsMRQEqCYDKVbaJQdAthdixsXsI6yZs2adpI6iksx6QhbZBJ9//33guOBnnzyycjUSdeKUEz667lZs2apW21wP/15553nb+EsLdQELIvJ66+/XrD9v3v37lKyZMlQV4rGxY8A7vX+4IMP5NJLL5WzzjrLMwBr1qyRkSNHqgOr/Z5eNyqFA9yxa7J+/fqe1ZMZpyewefNmNTIZlP/pm/8Q+Prrr9UI2RdffCGnnnqq71i+++47qVevnuCu9ho1avhevt8F4p7tzz77TO3aPvHEE/0unuWFmMCUKVMES8+GDBlyiJWH/TOFeND812nTpsnEiRPVgxQPVAYSCBsB3OONw6RxBuDu3bs9Ma9KlSpKRGDzT1AvVeiDEyZMULcDMfhP4IgjjlB3x+/cudP/wlliggDO+bz44osDPe9zwIABqi9iZiTKoUCBApI/f3757bffZP/+/VGuKuvmgEDnzp2lQ4cOKQc4DhGTDvJnEhLwncDevXvVAef4F9PeRYoU8d0GFhhtAjt27FBrdIcOHRrtirJ2JPAPAZzvi9H4Xr16ydFHH00mJGCLAMWkLVyMHDYCw4YNk5kzZypBWa1atbCZR3s0JvD7779Lly5d1CwNAwlElQBG3p9++mkpVqyYenliIAEnBCgmnVBjmlAR+Pzzz9VubwhKXvEVKtdobczff/+tztbDTTgMJBBFAthkhhmeBg0aqBvHGEjAKQGKSafkmC5UBHAeGr4U69atq9Z0MJCAGwSaNWsm77//vmCdLgMJRIkA9kYMGjRIbr/9dnX3OQMJZEOAYjIbekwbKgJYNA5BmTdvXjVKeeSRR4bKPhqjHwHsaH399delcOHC+hlPi0kgDYGBAwfKDz/8ID169JBKlSqREwlkTYBiMmuEzCBsBPDw/+abb5Sg5Bdl2Lyjlz0dO3ZUSyj8OihfLzq0VjcCmMHBaCRuFLv11lsFZwYykIAbBCgm3aDIPEJHAFM4r7zyihKUF1xwQejso0F6ELjxxhvlwQcflOOOO04Pg2klCaQh8N577wkufrj55pvVUUsMJOAmAYpJN2kyr1ARWLx4sZr2xhfntddeGyrbaIweBDAN2LNnT45w6+EuWpmCwI8//ihvvPGGWvbTtWtXKVOmDDmRgOsEKCZdR8oMw0QA93lDUBYtWlQde3H44YeHyTzaEnICOHOvU6dOcsopp4TcUppHAocSePvtt9WNYbjZ7oorriAiEvCMAMWkZ2iZcZgIYJ0QFpxDUJ5wwglhMo22hJjAAw88IM2bN5czzjgjxFbSNBLISQB3aw8fPlyNqGPdb1C3eNEv8SFAMRkfX8e+puPGjVNfsBCUderUiT0PAshMAHdC49iU8847L3NkxiCBgAmsWLFCrYvctm2bOjfynHPOCdgiFh8XAhSTcfE066kIzJ8/X12PV79+fbn66qtJhQRyJYCbQTAqyXP42FDCTGDTpk3qPNS5c+cKjrNq2rRpmM2lbREkQDEZQaeySrkT+Omnn9Q6SuzQxQYLBhJIRwCj2OXKlVMHOzOQQNgIQETihqYpU6ZIixYtpGXLlpIvX76wmUl7YkCAYjIGTmYVUxMYMGCAbNy4UR0fdOyxxxITCRxC4LXXXlNnTGLdJIM9Art375Z169YJBA9e4LZv3y64Bxp3nu/Zs0f27t0ruLLywIEDKuMjjjhCCaH8+fNLoUKF1EHx2Dh3zDHHSIkSJaRUqVJStmxZ9Xvcw8qVK+Xjjz+WmTNnylVXXSW4qemoo46KOxbWP0ACFJMBwmfRwRMYPXq0jBkzRgnK2rVrB28QLQgVAayxxVWKbdq0CZVdYTRm7dq1smTJEsHB2NjshnV75cuXVzMAeFmDCCxWrJgSiQULFlSiEWxxwsLBgwdl//79sm/fPvnzzz8FQhQ3Wv3666+CExmQ1+rVq9X/8RnyxA/EpfE7RpCjfusVprFxhu6qVavk8ssvVzu0wZKBBIImQDEZtAdYfuAEvvzyS3XLSbt27bjWKHBvhMsAHPT8xx9/qOOBGHISgACEuPn6669lwYIFamSxevXq6hilKlWqKCHpRYCYxIyC8YORz+XLl6uRT4jLE088Ue1ixr/40X3EbuvWrTJ16lT5/PPPpUiRItK4cWMeOu5Fw2KeWRGgmMwKHxNHhcD69euVoMRDsFu3blGpFuuRJYGPPvpITdPedNNNWeYUneQQj5henT17tuovZ599thrVP/744wOvJEbsjB9MBeP3o48+OiEsK1SoIPgpXbp04LbmZsCuXbtkzpw5giN+IJSxYfDCCy+UqlWrhtpuGhdfAhST8fU9a55EAGu3ICgxlYZpb6zVYog3gcmTJ8vSpUvVLThxDljrOGnSJPn000+VOIO4qVu3rhZ9BC+KEJWYJl+zZo36wWgzpsUhgPGDEU384HaYoKbKIX4XLlyoTpzAUgEcX4YjqerVqxfnpse6a0KAYlITR9FM/wi8++676qEJQVmjRg3/CmZJoSMwY8YMNUL0r3/9K3S2+WEQppJxPuv48eOlSZMmcskll0jlypX9KNrTMrAJCCITP8Z0+ebNmwU/2PyDzT74wWHfWOuJTVh4ucSaT4jpbAUnpuSxxhQCEutL8cKCKexatWqpo6jOPPNM3tblaQtg5m4ToJh0myjziwQBiAgcH4TpTTxEGeJJYN68eWrDQ58+fWIFAOv0cG4hjpzBTuErr7xSiag4BGz42bJli4ABRB9+duzYoTYC/fLLL2pH+mGHHaZ2mmM9Jn6wqQgiFJthIDTz5s2rUGG3OnauQ7wiHTYSIW9sPsKaUqzphDivVq0ad6nHoXFFuI4UkxF2LquWHQGMGkBQnn766dKlS5fsMmNqLQksWrRIRo4cKY8++qiW9ts1GjuqMTKPW1RwZuE111yjRBJDTgIQiFjXiB/sOse0OX6wOQifQUQiYLc6xCXEJsQ4RjmxXhP/ZyCBKBGgmIySN1kX1wngmBIIShxZgmlv3XeGug4o4hli88PgwYMFN+FEPWDH8LBhw6RmzZpy3XXXqWleBhIgARKwQoBi0golxok9gbfeekvtrISg5I7K+DQHbNZ46qmnZODAgZGtNHarDxkyRE3ldujQQU477bTI1pUVIwES8IYAxaQ3XJlrBAl89tln8vzzzytBiWM6GKJPADe33HffffL6669HsrI4+gh1w0hkq1atIllHVooESMB7AhST3jNmCREigF2XmPY+//zzpX379hGqGauSigA2Tdx6662Cm3CiFDAK+fLLL6uNITfeeKNUrFgxStVjXUiABHwmQDHpM3AWpz8BLLqHoMSOTIxS4l+GaBLAZgq8NGBnc1QClmu89NJL6jo+jEgykAAJkEC2BCgmsyXI9LEl8Nprrwl2+0JQ4ogPhugRwJWBOBbn448/jkTlsPZ3+vTp0r17d3WeIQMJkAAJuEGAYtINiswjtgQ++eQTefXVV5WgxNQ3Q/QIXH311fLOO+9oPQKN6WyMpuN8RNzmw1MJotdOWSMSCJIAxWSQ9Fl2JAh8++236hpGHG7epk2bSNSJlfgfAUwFDxo0SB1SrWP48ccfpX///nLuuedKx44ddawCbSYBEgg5AYrJkDuI5ulBABsaIChx7RpGKTECxBANAp07d5bHHntMHTatW/jyyy/lySeflJtvvlkaN26sm/m0lwRIQBMCFJOaOIpm6kEAGxtwc861116r7tdl0J9At27dpHfv3lKuXDmtKjN58mTBul7cK167dm2tbKexJEACehGgmNTLX7RWAwIffvihjBs3Th25cs4552hgMU3MjQBGmiEoq1Spog2osWPHCs6QhAg+6aSTtLGbhpIACehJgGJST7/R6pAT+Prrr9WGB2zeaNGiRcitpXm5EcA5k5deeqk6SkeHMGrUKLVj+/7775cyZcroYDJtJAES0JwAxaTmDqT54SWwefNmJShPOOEEue2228JrKC3LlcC///1vueyyy+Sss84KPamRI0eqaz/79OkjJUqUCL29NJAESCAaBCgmo+FH1iLEBHAFI4Qlpkt13MQRYrS+mPb4449L3bp1Q3/00+jRo2Xq1KkC8YuNYAwkQAIk4BcBikm/SLOcWBPADSpYSwlBycOi9WoKzz33nFSvXl0uuuii0Bo+fvx41b4efvhhvrCE1ks0jASiS4BiMrq+Zc1CRmDOnDnq+KAOHTqokWvZ7QAAIABJREFUW1UY9CCAO6yPP/54ueKKK0Jp8IwZM2Tw4MHSr18/KV++fChtpFEkQALRJkAxGW3/snYhI7B27Vq1jrJq1arq7D+/AtbSffXVVzJ//ny/itSqnK5du6a9p3rIkCFSpEgRtZkqbGHx4sVy7733qnMwMXrKQAIkQAJBEKCYDII6y4w1gb///lsJyl27dsmdd94pxYoV85THmjVr5Oyzz1YjomEdXfMUgIXMsfwA09hPPfXUIbHfffddOXDggLRt29ZCTv5F2bJli9xzzz0CIcyrPP3jzpJIgAQOJUAxyVZBAgERwH3PU6ZMUesovRxVevHFF+WFF16Q5cuXB1TT8BeLEVscMo+71nEtpjl88MEH8ssvv0iXLl1CVZFevXqpc0zDOGIaKlA0hgRIwHMCFJOeI2YBJJCeAM4DxCglDsW+5JJLPEGF3b3Tpk1TO30Z0hOAiDzllFPUulZzmDBhgmB095ZbbgkNPrwcHDx4UHr06BEam2gICZBAfAlQTMbX96x5SAj8+OOPSlAWKlRI3aPsdqCYtEYUPnjjjTcE6xDN4fPPP5eFCxeqJQlhCB9//LF6MXj66afDYA5tIAESIAGhmGQjIIEQEPj5558Fu4b379+vpr0LFy7smlUUk9ZQfv/993LqqafKzJkzpV69eolEOAQcI8jY6BJ0WLp0qboiEccVVahQIWhzWD4JkAAJKAIUk2wIJBAiAkOHDhUcIQRBefLJJ7tiGcWkdYwXXnih2swCZkbAekrctW7+m/Uc3YuJF42ePXtKs2bNQn3mpXs1Zk4kQAK6EKCY1MVTtDM2BD777DPBrTmYVm3YsGHW9Y6SmMQoYffu3QVHHbklts2An3jiCXX49+zZsxN//u677+Stt94SfBZkwDrJI444IlRrN4PkwbJJgATCQ4BiMjy+oCUkkCCAKVes4atfv760a9cuKzIUk9bxLVq0SE477TRZsmSJmvJGwJpWCDkI/KACdv2PHTtW2cFAAiRAAmEjQDEZNo/QHhL4L4Fff/1VCcoCBQqoae98+fI5YpNJTOIKPohXhBEjRkitWrUSI384Tqh169bq+Jk+ffqoOMOHD1dnLqb6rG/fvvLAAw/Inj17lM0I2Ak9adIkuemmm9RVkvgX4YsvvlB3XqcLsMtcJtYImtcyGnZgtNL4u9l2w4bVq1cLzmREHWCbOT520L/99ts57rKuUaOGdOzYUe6++25l2oYNG+SRRx5Ra1qDCFu3bpVbb71VHnroIbXbnIEESIAEwkaAYjJsHqE9JJBE4NVXX1U7jCHOKlasaJuPFTE5evRoJSDLlSuXEIEQsuvWrUuISQgxCDyIMQiw7du35/jMEGkQiRCNsBdCEnGXLVumBB8EYIsWLXKUAbGcHNJNZyf/3RC0AwcOVMIUZeHgcXNdDBuKFy+uBDCO0xkwYECirscdd5wSmUZAHbEJZ/LkyepPqCeE5ZtvvmmbvRsJIGRPOukkadOmjRvZMQ8SIAEScJ0AxaTrSJkhCbhPAGcdvv7660qEmUfnrJRkRUxu3LgxMQoKQTZs2LAcgtEs1tJ9tmPHDjVi2b59+4RgNIRasuiDYDOXmVwPIz7+bl4fmSwmzbYaYhEjqbDXELRmsYj4ycsGMFJqjACjPFw7iRuDYF/ZsmXlt99+U7fMYNTW7zB+/HglbB9//HG/i2Z5JEACJGCZAMWkZVSMSALBEsB6PoieSy+9VI0IWg12xWSq0UcrYtIQgLjizxh9dComUTdjmvqVV14RY/rcDTFpiGGIz3QBn2HDzQ033CD79u2TVq1ayZgxY6widyUepuZxmD3OHsXIJAMJkAAJhJUAxWRYPUO7SCAFAUy5QlBC7Fg9RDtZTJpHEDGSCPFoTHOXKFFCjS5iyhhTv6mmkZNHJo21iKmmmLMRk0b1zaOYCxYsUCOzxnpL89S6Mc1t2FewYEE1kmsemUyOj/8jJK/dvOuuu9QUPbggNG3aVIlJ7Kb2K2A0EutEOb3tF3GWQwIk4JQAxaRTckxHAgESwEjhqlWrpHPnzoldx+nMsSImIc4wEobRT/OmFCtismrVqmoqGsHYFGOMKjoVk5k21WC00uoGnOQ1keapbmPEM5kdyscIMDa/HHnkkWpkEmsmIVD9CLj+Eru3cTg5AwmQAAmEnQDFZNg9RPtIIA0BiI2JEycqQYk1flbFZHK8TOsX0+WbLDSj5qjDDjtMjUxiyr5Dhw5K2B1zzDGeVxPT6jfeeKM6oBzHFDGQAAmQQNgJUEyG3UO0jwRyIYDNIpj2btmypTRv3jxlTLtrJq0Cd0NMGlPuODrICOlGC63a5Va8a6+9Vo1EYuPTLbfcojbhnH766W5lnzYf3A++e/dudRwQAwmQAAnoQIBiUgcv0UYSyIXApk2blKAsX758SgESZjEZZsfiaKBOnToJ+N52221q/eWJJ57oqckrV65Ud2/jOKiiRYt6WhYzJwESIAG3CFBMukWS+ZBAwAQwDYt1jxA9pUqVSliTSUwGbHaoi8dU9+effy44mgnLCapVq+apvVhygEPTcf82AwmQAAnoQoBiUhdP0U4SsEDgvffek48++kgJSmNKFmISYmjo0KEWcmAUMwGcmVm7dm3Zu3ev2kVeqVIlzwAtXbpUpk6dyru3/yHcoEEDzzgzYxIgAfcJUEy6z5Q5kkCgBGbPni3PPPOMXH/99XL55ZcLxCTOKsQ6PAZnBI466iglKP/66y9nGVhIhWlt7IL3sgwLZoQiCpYTYNPTgw8+GAp7aAQJkEDuBCgm2UJIIIIEcEYi1lGeeuqpsnnzZjXi9dlnn0Wwpv5UCUsIzjzzTM9GzLArf86cOUr4M4hMmTJF7WZfsmQJcZAACWhAgGJSAyfRRBJwQgBHzEBQ4sGMEa8ZM2Y4yYZp/iHwwgsvSOXKlaVJkyae8OjSpYtamlC9enVP8tcxU6xXxUsQp7x19B5tjhsBism4eZz1jR0B3KCCm2NwgwtGKhnsE8Duamxquuqqq+wnzpAC54UuW7ZM/u///s/1vHXOkGJSZ+/R9rgRoJiMm8dZ39gRwNTp+PHjpUyZMtK9e3dp3Lhx7BhkW+G33npL8ufPb+tOdCtlHjx4UDp27KiursTIJ8P/CFBMsjWQgD4EKCb18RUtJQFHBIyjgQYPHqw25uTLl0+ef/55R3nFNdGoUaPUUgEIPzcDRotXrFghvXr1cjPbSORFMRkJN7ISMSFAMRkTR7Oa8SVgPmdy+/bt8vLLLysYd955p293TetOf9y4cfLTTz+paw7dDDgU/d5775UqVaq4mW0k8qKYjIQbWYmYEKCYjImjWc34Ekh1aPmQIUMEVzFi0wenVzO3DVz3iOsje/TokTmyxRgff/yxfPvtt0pMMhxKgGKSrYIE9CFAMamPr2gpCTgikO4GHFwXOHDgQCUouWM2d7TTp0+XuXPnujodfdNNN6nrL3HjDQPFJNsACehMgGJSZ+/RdhKwQCC36xS/++47dXxQw4YNpW3bthZyi2cUCEmIb2yUcSPgikYce4PrExlSE+DIJFsGCehDgGJSH1/RUhJwRCDT3dw7d+5UgrJQoUJqlDJv3ryOyolyooULFwququzXr58r1bzrrrukZcuWUqdOHVfyi2ImFJNR9CrrFFUCFJNR9SzrRQL/JZBJTBqgsNsbI5UQlBUqVCA/EwGcA/naa69J//79s+Yyf/58wVFD3FGfO0qKyaybGjMgAd8IUEz6hpoFkUAwBKyKSViH8yixOQeCsm7dusEYHMJSV69eLU8//bS8+OKLWVv3yCOPqKsZvbpNJ2sDQ5IBxWRIHEEzSMACAYpJC5AYhQR0JmBHTKKemNLFeZRXXHGFtGrVSuequ2Y77jfHekmMTmYT1q5dK/fdd58MHz48m2xikZZiMhZuZiUjQoBiMiKOZDVIIB0Bu2IS+WzdulWtoyxdurTcfvvtsYf7yy+/qGOBhg0blhWLV155Ra1NbdeuXVb5xCExxWQcvMw6RoUAxWRUPMl6kEAaAk7EpJEVpnVxQ8u//vUvKVu2bGwZ79ixQ41MvvTSS44Z7N27V6677jp1aHzJkiUd5xOXhBSTcfE06xkFAhSTUfAi60ACuRDIRkwiW1z5h53MWEd51llnxZL1gQMHpFmzZoKbcJwGHFL+/fffu3pWpVNbdEhHMamDl2gjCfyHAMUkWwIJRJxAtmISeObNm6emvVu3bq1EVRxDixYtZMSIEepucyehZ8+egusTTz/9dCfJY5eGYjJ2LmeFNSZAMamx82g6CVgh4IaYRDkbN25UgrJixYrSvXt3K0VHKs61114rWPNYpEgR2/VavHixSuvGbnDbhWuagGJSU8fR7FgSoJiMpdtZ6TgRcEtMGswgKLdt2yZ33nmnlChRIjYor7/+ennyyScdrXd87rnnpHz58tK8efPY8Mq2ohST2RJkehLwjwDFpH+sWRIJBELAbTGJSowcOVImTJigBGWtWrUCqZffhXbr1k3uvfdeOeGEE2wVvWfPHmnTpo06qLxo0aK20sY5MsVknL3PuutGgGJSN4/RXhKwScALMQkTvvjiCzXt3aVLF7nssstsWqVfdByRhOn9ypUr2zL+k08+kW+//VbtiGewToBi0jorxiSBoAlQTAbtAZZPAh4T8EpMwmzcDANBWaNGDbXTe9KkSTJx4kSPaxRM9j/99JMcffTRcuSRR9oyAOmwzrJgwYK20iHNhx9+aCtNlCJTTEbJm6xL1AlQTEbdw6xf7Al4KSYB96+//pJ+/frJ0KFDpU6dOlKtWrVIMp89e7ZUqlRJHeRuNfz2229qBPfSSy+1miQRb9q0aYKfgwcP2k4bhQQUk1HwIusQFwIUk3HxNOsZWwJei0mAxWHeL7zwgtSrV0+dR3nKKadEjvdjjz0m559/vqqj1fD2228L1kzecMMNVpPkiIf70S+44AJB2XELFJNx8zjrqzMBikmdvUfbScACAT/EpFFGnz59ZOzYsepe74svvtiCdfpEwXR+zZo1pVGjRpaNxqYdrLU8+eSTLacxR8Qd3hDnK1eudHQkkaNCQ5KIYjIkjqAZJGCBAMWkBUiMQgI6E/BTTE6dOlV++OEHeeaZZ9SUNw7pjkrA6CuO97n88sstVWnZsmUyYMCArK5gxBFMONcTSwiuvvpqS+VGJRLFZFQ8yXrEgQDFZBy8zDrGmoDfYhKw//jjDyUoDz/8cHV8UIECBbT3wRtvvKGO9rEq6hAft+W0a9cuq7rj1iFs/MGh53EKFJNx8jbrqjsBikndPUj7SSADgSDEpGESBNX8+fPVVO1JJ53kyFdYdzhz5ky1azxIUfrOO+8o+6+77jqZNWuWPPzwwwLbihcvnrJeXbt2VfXG6CSCU/vB8JFHHpFVq1Y54qdrIopJXT1Hu+NIgGIyjl5nnWNFIEgxCdA4LmjQoEFKWNWvX982+7CIydGjR8uvv/4qnTt3zigmjSnup59+WtU7GzGJayyPP/54deTSJZdcYpufrgkoJnX1HO2OIwGKyTh6nXWOFYGgxSRgL1myRI3MYfMKRvbshLCIyfHjx8vatWvllltuySgmcdsNjvRp1apV1mISrHANI44l6t+/vx10WselmNTafTQ+ZgQoJmPmcFY3fgSCEJM4DscYkVuzZo0ancTd1scee6wUK1ZMsMv57rvvTqwD7Nu3rzzwwAMJ52AKGTvDMRKHn+XLlyemiXfs2CFt27ZVeSLgHEccoZMqIB3WHGKdI/JDwNrDBQsWqH+RtzFVbdhsrE1Mtun++++X559/Xok6CMoPPvhApUWAPe3bt1f/oswmTZrIo48+Ks2aNTtETGKK3DheyFy+YeuiRYty2IX8X375ZTW6i8/iEigm4+Jp1jMKBCgmo+BF1oEEciEQpJiEkITgwrQvBBSEH0YpR4wYoe64hnDbvXu3EmEQhBCUEFu4thD3f5coUUJ9VqFCBSUmESBScd4j/o68hw0blnbtollMIm+IVExXI28ECM177rlH5YXPMKWMcpJtQj4YHWzYsKEaHYQNRt2SxSR2tEM4w7Yzzjgjh5hct26d9OjRQ62jLFeunPrsuOOOU8La+N0sqg234qahE088UebNm6duGopDoJiMg5dZx6gQoJiMiidZDxJIQyBIMQmhBHFkiLqBAwdK1apV1TmUefLkUesPIbzMQg5izRB12HBjnuaGGIMANI/Q1apVS4nDVGc5msuFWDWLT7MIxEiieXQRn5ltwigkRgfPO+88eeKJJ3JMcyeLyRdffFGNYL755puHiEnkk7y7+6abblICFvXG6GnyiKjhVhy1hJt0HnzwwVi0dYrJWLiZlYwIAYrJiDiS1SCBdATCKCYh3GrXrq12KGMKeunSpQkBaUVMQpSmm9o2c3BTTOKGHwhXjKaad3Mni0lM4c+YMUMGDx6cUkzmNpJqTIGnEsgYzYRoRpw4BIrJOHiZdYwKAYrJqHiS9SABTUYmzVO/vXv3VqNy06dPV1O9xtT1U089lXKaO3n6GesnMdqHY3hSBatiskWLFjmmo41yjHWQEHANGjSQli1byuuvv55jmrtgwYKJKerbbrtNjboiPqb0k6e5sVbTmO6HGDaEoVkYJ9ts1At/x6jujz/+qNZtRj1QTEbdw6xflAhQTEbJm6wLCaQgELaRSQin5M0u2KhSuXJlJcpwQDf+xQggRugaN24su3btSmzAyW2jSnL1rYpJiNhMG3B69eolr776quzcuVNNRUMIGpt3jBHF/Pnzq/WcuLkGo6fJYtKYtjemuo0p7UxlG/XCOkuIbqy7jHqgmIy6h1m/KBGgmIySN1kXEgiJmHTiCIwwYnMMhOSZZ57pJAtP00AgQlAOGTIkbTmYosf93RDAXgSsqcQmHJw5GfVAMRl1D7N+USJAMRklb7IuJKCxmITpc+fOVdcw4izKq666yrI/zaOVRqLhw4eraXO3AkZHsVnm3XffTZsl7MbaynS34mRrC3bCY7QWwvaYY47JNrtQp6eYDLV7aBwJ5CBAMckGQQIRJxDENHc2SNevX6+mtHH9Is5zDEv466+/pE2bNmqNZqoAoYdpcOzk9jIcccQRMnTo0Kzv/PbSRjfypph0gyLzIAF/CFBM+sOZpZBAYAR0E5MAdeDAASUof/75Z7nzzjs9G+mz65SmTZvK2LFj5fDDDz8kKdZP7tu3Tzp16mQ3W1vxb7jhBnUOpnFXuK3EGkWmmNTIWTQ19gQoJmPfBAgg6gR0FJOGT3C4OW66wTpKrEUMOmA3N0YFsYM7OeDwc2yswTS0lwGbfS677DJ1T3iUA8VklL3LukWNAMVk1DzK+pBAEgG/xCSO8/EiYFoXu6T3798ve/fu9aIIy3liN/aff/6p7t02BwgffIYRQz/CH3/84XkxGAHFdY/XXHON52WlKoBiMhDsLJQEHBGgmHSEjYlIQB8CfonJcePGyUsvveQJmIULF8q0adPUOkqc4xhUwO03EFnJG2wWL14sX3/9tbrNx4+A8yqrVavmaVE4+xMboiZMmOBpOekyp5gMBDsLJQFHBCgmHWFjIhLQh4BfYhJiD/dSexUwKol1lPgX095FihTxqqi0+d56661y1113ScWKFWXOnDmCKw4henDVYqlSpQSHn0clwJ+4izx5FNav+lFM+kWa5ZBA9gQoJrNnyBxIINQEoiImDci4jnDmzJlKUBqjc5s2bVKCDoeAux0wGlmjRg21ThEHhmNkEsfy4DpIiK233npLunfvruzByCmOKUp1T7jbdnmdH8Wk14SZPwlEhwDFZHR8yZqQQEoCUROTqOTnn3+uRil79uwpF110keDYHmx8wRmVl156qast4YEHHpBRo0bJoEGDZMqUKWqaHWVjqvnII49U1yvi/xCV/fr1UxuGEB+31egcKCZ19h5tJwF/CVBM+subpZGA7wSiKCYBESOAEHHnnnuudOzYUY0UYsTw008/dZUxDiu/4IILVJ6nnXaaYPPL/PnzlajEMUG4radEiRKyceNGWblypWAk086B664a62JmFJMuwmRWJBBxAhSTEXcwq0cCURWT8Ozvv/+uRiPz5Mkj33zzjWCjDv5/5ZVXuup43BP+2GOPSb58+dSaTWzAwdWJOAMT/8f5khgdxZ3ZmAqPQqCYjIIXWQcS8IcAxaQ/nFkKCQRGIKpicufOnWqUEAeb48Bw7Cb/5Zdf1PrGyZMnu8obZzo2atRIjT4iYKMNxCRGLDds2KD+hvWTUTpInGLS1SbEzEgg0gQoJiPtXlaOBESiKiY7d+6sjq75+++/BWdRQkgiYJc3ppqbNWvmqvuxwQf5FipUSF588UVp0KCBKgM2lClTRq2TxAacqASKyah4kvUgAe8JUEx6z5glkECgBKIqJnGI+aJFi9QPzkJctWqVmmrevn27VK5cWXBOIo6XcStgJBSjj0cddZTMmDFDZYvNOe+//75au9mkSRO3igpFPhSToXADjSABLQhQTGrhJhpJAs4JhFlMQviNHDlSrTnMNuBmmp9++knWrFkjy5Ytk9atW0uxYsWyzTZHekyfQ6BefPHF6u/Y0Y2pb7fXaLpq9D+ZYYMQrnq0Eygm7dBiXBKINwGKyXj7n7WPAYEwi0lslsG5jQzeEoDAnjdvni3WFJPe+oS5k0CUCFBMRsmbrAsJpCAQVjG5bt06Wbp0qTrah8F7Aq+++qq6vcdqoJi0SorxSIAEKCbZBkgg4gTCLCYxHY0rCRm8J0Ax6T1jlkACcSVAMRlXz7PesSFAMRkNV2OT0bfffmurMt26dZOiRYuqNBSTttAxMgmQgA0CFJM2YDEqCehIgGJSR6/9z+Zt27YJlgTMmTNHbaSpVKmSuu0nU8D1j9h0QzGZiRQ/JwESyJYAxWS2BJmeBEJOgGIy5A7KYB7EJM6wPOGEE9ROciwNuOeeezJWauDAgRSTGSkxAgmQgBsEKCbdoMg8SCDEBCgmQ+wcC6YZYhJXR+bNm1dwvibFpAVwjEICJOAbAYpJ31CzIBIIhgDFZDDc3Sp1xYoVsmvXrsQ0Nw5ktzLNzZFJtzzAfEiABDIRoJjMRIifk4DmBCgm9XagMTJZoEABdW3k1q1bOTKpt0tpPQlEjgDFZORcygqRQE4CFJN6twhDTObLl0+JyR07dlBM6u1SWk8CkSNAMRk5l7JCJEAxGaU2ADGJ9ZK4a7xUqVJSunRpKVeuXMYqYtMOd3NnxMQIJEACLhCgmHQBIrMggTAT4MhkmL1j3TacM7lhwwbrCf6JifvJeTSQLWSMTAIk4IAAxaQDaExCAjoRoJjUyVve2cpDy71jy5xJIO4EKCbj3gJY/8gToJiMvIstVZBi0hImRiIBEnBAgGLSATQmIQGdCFBM6uQt72ylmPSOLXMmgbgToJiMewtg/SNPgGIy8i62VEGKSUuYGIkESMABAYpJB9CYhAR0IkAxqZO3vLOVYtI7tsyZBOJOgGIy7i2A9Y88AYrJyLvYUgUpJi1hYiQSIAEHBCgmHUBjEhLQiQDFpE7e8s5Wiknv2DJnEog7AYrJuLcA1j/yBOIiJnFINw7zrlOnTuR96qSCFJNOqDENCZCAFQIUk1YoMQ4JaEyAYtK+87788kuZMWOG9OrVK0fiJ598Ui644AKpUqWK3HDDDTJlyhRp1KiRvPbaa3LMMcfIihUrpFOnTtKzZ09p1apVjrTIc8SIEfLYY4/Jnj17EukR6frrr1d/R8C/7du3l8qVK9s3PJcUFJOu4mRmJEACJgIUk2wOJBBxAhST1h38888/K5F38OBBueiii6R79+6JxBCDCBj5nDp1qtSqVUsJSLPwNMTkWWedpURhgQIFVBqIx969eyfEIv7ft29f6dOnj8oDo6oIEKCw4aOPPpKOHTtaN9xCTIpJC5AYhQRIwBEBiklH2JiIBPQhECUxCbE2ZswY2bRpkwwZMiTHqKB5mhsjiAgYWYTYu+SSS9T/MWKIAGFnCL1UnkQ5kydPTohJiL8XXnhBCU2IP3Mwx8Xvw4YNk8KFC0vz5s0To4v4+6xZs2Tr1q1y2223KXFpFpMDBw6Uxo0bJ+In/9+N1kYx6QZF5kECJJCKAMUk2wUJRJxA1MQkBCLEIqaBzaOChphct26d8ihG+SDiMELYv3//xAjg7Nmzc4waWhGTyeLSnMaY+saIpSEmGzZsKF999VVimhzisHbt2mrq3BCTxjQ58rrvvvtyTKl7sf6TYjLiHZ3VI4EACVBMBgifRZOAHwSiJibNI4aYEjZG+D777DP55JNPpFq1aglhBrEJcWmsXzTEnt2RSaT74Ycf5PLLL0+4zJi6btOmTWLTj5H/7bffrtZRQjAiYNr6yiuvVH9LNTKZvEYz2W432gnFpBsUmQcJkABHJtkGSCCGBOImJosWLZoYeTSvRYTr3RKTyMc8Qmo0K3P+ixYtUn+GmMUuc2zaSScmIYqNzzD9TjEpcthhh6m1qQ0aNIhhr2WVSUAvAhyZ1MtftJYEbBOImphMnrZes2aNEnbmaW7jb8nT3JiSxnpL8+aYVECTp7WT/59uTaNZTGLk8rnnnpPSpUtL586d1TrJdGISths2wx7zZh/bDk+TgCOTbpFkPiRAAskEKCbZJkgg4gSiJiaxwWXJkiXqWB7jSB2M5pnXGeJ3Y20kppi7du2qvPz888/LqlWrHG3AGTlypLRu3Vrlg2lybAAygmHHhg0b1AYcYxo9eZe2WUya10ya64E8uQGHI5MR/1pi9SJGgGIyYg5ldUggmUDUxKR5zaRdb+e2kSZTXl5siklVJo8G+g8VTnNnapH8nATCQ4BiMjy+oCUk4AkBisn/YDU2zJx33nnqDEnzyCA+T95RnewMpPfqQHGjLC/L4DS3J92LmZIACeDl75/DeQ+SBAmQQHQJxFlMGoeQY0rcimCMbisQoZiMsndZNxIIlgDFZLD8WToJeE4gSmLSc1gRLoBiMsLOZdVIIGAPB1L9AAALRElEQVQCFJMBO4DFk4DXBCgmvSasR/4Uk3r4iVaSgI4EKCZ19BptJgEbBCgmbcCKcFSKyQg7l1UjgYAJUEwG7AAWTwJeE6CY9JqwHvlTTOrhJ1pJAjoSoJjU0Wu0mQRsEKCYtAErwlEpJiPsXFaNBAImQDEZsANYPAl4TSCsYnLLli3qppeGDRt6jYD5/0OAYpLNgARIwCsCFJNekWW+JBASAmEVk8Dz7LPPytlnny0lS5YMCa1omjFr1ix1P3ijRo0sV3DatGlK6Ad1ehwPLbfsKkYkgcAJUEwG7gIaQALeEgizmETN58+fL7t27fIWQsxzr1atmhx77LG2KFBM2sLFyCQQawIUk7F2PysfBwJhF5Nx8IGOdaSY1NFrtJkEgiFAMRkMd5ZKAr4RoJj0DXWkCqKYjJQ7WRkS8JQAxaSneJk5CQRPgGIyeB/oaAHFpI5eo80kEAwBislguLNUEvCNAMWkb6gjVRDFZKTcycqQgKcEKCY9xcvMSSB4AhSTwftARwsoJnX0Gm0mgWAIUEwGw52lkoBvBCgmfUMdqYIoJiPlTlaGBDwlQDHpKV5mTgLBE6CYDN4HOlpAMamj12gzCQRDgGIyGO4slQR8I0Ax6RvqSBVEMRkpd7IyJOApAYpJT/EycxIIngDFZPA+0NECikkdvUabSSAYAhSTwXBnqSTgGwGKSd9QR6ogislIuZOVIQFPCVBMeoqXmZNA8AT8EJPfffed1KtXT/r27Ss1atQIvtK0IGsCkydPls2bN8uQIUOyzstJBryb2wk1piGBYAhQTAbDnaWSgG8E/BCTqMyAAQNkwoQJMmnSJN/qxoK8I/DQQw9JgwYNpH79+t4VkkvOFJOBYGehJOCIAMWkI2xMRAL6EPBLTOpDhJbqQIBiUgcv0UYS+A8Bikm2BBKIOAGKyYg7OKLVo5iMqGNZrUgSoJiMpFtZKRL4HwGKSbYGHQlQTOroNdocVwIUk3H1POsdGwIUk7FxdaQqSjEZKXeyMhEnQDEZcQezeiRAMck2oCMBikkdvUab40qAYjKunme9Y0OAYjI2ro5URSkmI+VOVibiBCgmI+5gVo8EKCbZBnQkQDGpo9doc1wJUEzG1fOsd2wIUEzGxtWRqijFZKTcycpEnADFZMQdzOqRAMUk24COBCgmdfQabY4rAYrJuHqe9Y4NAYrJ2Lg6UhWlmIyUO1mZiBOgmIy4g1k9EqCYZBvQkQDFpI5eo81xJUAxGVfPs96xIUAxGRtXR6qiFJORcicrE3ECFJMRdzCrRwIUk2wDOhKgmNTRa7Q5rgQoJuPqedY7NgQoJmPj6khVlGIyUu5kZSJOgGIy4g5m9UiAYpJtQEcCFJM6eo02x5UAxWRcPc96x4YAxWRsXB2pilJMRsqdrEzECVBMRtzBrB4JUEyyDehIgGJSR6/R5rgSoJiMq+dZ79gQoJiMjasjVVGKyUi5k5WJOAGKyYg7mNUjAYpJtgEdCVBM6ug12hxXAhSTcfU86x0bAhSTsXF1pCpKMRkpd7IyESdAMRlxB7N6JEAxyTagIwGKSR29RpvjSoBiMq6eZ71jQ4BiMjaujlRFKSYj5U5WJuIEKCYj7mBWjwQoJtkGdCRAMamj12hzXAlQTMbV86x3bAh89913Uq9ePenbt6/UqFEjNvVmRfUlMG/ePBkwYICsXLlS8ufPr29FaDkJxIQAxWRMHM1qxpsAHswTJkyQSZMmxRsEa68Fgfbt28tFF10kHTp00MJeGkkCcSdAMRn3FsD6kwAJkAAJkAAJkEAWBCgms4DHpCRAAiRAAiRAAiQQdwIUk3FvAaw/CZAACZAACZAACWRBgGIyC3hMSgIkQAIkQAIkQAJxJ0AxGfcWwPqTAAmQAAmQAAmQQBYEKCazgMekJEACJEACJEACJBB3AhSTcW8BrD8JkAAJkAAJkAAJZEGAYjILeExKAiSQmsCiRYvUB7Vq1UpE2LNnjzqA+vDDDxf8XqBAAdv4vvnmGylbtqyULl1azL8jo9WrV8vGjRvVAe1Ow86dO2XOnDly6aWXHpLFX3/9pf528OBBmTVrltStWzfHgdp///237N+/n4dsO4XPdCRAAtoSoJjU1nU0nATCSwBi8sCBA3LiiScmROMnn3wiZ5xxhhQuXFhmzJihxFiRIkWUOINQg9DMly+fqtRvv/0mefPmVf/ft2+f+mz37t3y5ZdfSv369WXv3r2J33Ht3u+//y7btm2TzZs3KzGJ/BDnqKOOUumQT548edTfjjjiCGUbBC0+h7j9448/VLkoC2KyYcOGShgWKlRI/R3xv/76a/Uv6oDPIIYhIJEW8X788UfZsGGDKv/II4+UP//8M2GDIaCNMvA5bDIEqlFv/N9sFzggLfJH2bAf/6IOqA/qBp6Iw0ACJEACQRGgmAyKPMslgQgTgJhcsmSJEpPr1q2T888/X6ZOnSqVK1eWY445RubOnatGLSHGFi9eLFWqVFHxzjvvPPn++++VeIRIOvbYY2XLli1y+umnq78jnHLKKYnfkf/48ePluOOOU0KuRIkSqkwIP/wOYVayZEmVX9WqVeXTTz+VSpUqKduQBvnjdwhDlIe/4Zagk046SXbt2qU+r127thJ9sB9iE//HqOjZZ58t06dPlxNOOEGKFi0qO3bsUGK2Tp066vf169dL8eLF1Whpo0aN1A1EpUqVkmLFiqn8zj33XMUBf6tYsaJ8++23smrVKjXyinJRX4hIiFKITfAaN26csh95o0x8DoF58cUXR7g1sWokQAJhJ0AxGXYP0T4S0JCAeZobo4kQchjxg4DCqNznn38uF154oSxfvlyNtEEs/vDDD2qEcfv27WrEEKLNGLHDSCCEG4QahKHxOwQk0mC00JjmhvjCqCbywN3OKBP/VqtWTVasWKHE5uzZs9XfMbq3dOlSNdqJgGluTGFffvnlasQRv0MIYiTQqNPJJ5+s7IeYnDZtmrIdAs8oH/lOmTJFjbxC7H311VdqBBYjl6gz8po5c6aqH5gY+ZvTbN26NWEXhCfqW7NmTVmwYIGagsd96xDAEJ4GS3BlIAESIIEgCFBMBkGdZZJAxAmYxeS8efPUyGMmMYk0EFrVq1eXtWvXCtJB1BUsWFCNOm7atEkJOPPvhgCFmMSoHkYBIU4hHDHiZwQINUwFY2T0+OOPV6N9EGgQYBBrxsieWUz+/PPPaoSzcePGKptkMQlhCDEKOzECCpGK8iEmJ0+enJjGRx5HH320EstIgzIhMDFFjb9jxBFi2ZwGYhLlwS7YB/FZo0YNmT9/vhKTy5YtU6K6TJkyFJMR70usHgnoQIBiUgcv0UYS0IxAKjGJv2GaGGsKP/vsMzUNjZFHTHOXL19erZPEKB2mkI21iBBQEIkQbRCkmLLGaKHxO0Qhpo8xnfzTTz+p6WFMGWPkEaN2CBdccIEamYSoa968uZqCxogoprExygjhamycwf8h6jB1jZFJCD2sxYTog60Qgeecc46yGcLWqBPKh1BFWow4QhRD+OHvmIbGKCXWiRpiEnlOnDhRmjZtqkQm8gcbjDiijuBhjLrCtnLlyqkfY3MQxaRmHYLmkkDECVBMRtzBrB4JhJlAql3fyfb++uuvsnDhQjUVbf49zPXKZBvEJEQkRCYDCZAACehOgGJSdw/SfhLQmIB5U43G1bBlOkZCsfYRI7QYhWQgARIgAd0JUEzq7kHaTwIkQAIkQAIkQAIBEqCYDBA+iyYBEiABEiABEiAB3QlQTOruQdpPAiRAAiRAAiRAAgESoJgMED6LJgESIAESIAESIAHdCVBM6u5B2k8CJEACJEACJEACARKgmAwQPosmARIgARIgARIgAd0J/D/nwuVzwUi6NQAAAABJRU5ErkJggg==)
@startuml

package sample_1{
package “node_modules” as n1{
component “pkg_1(바로가기)” as a
}
}

package sample_2{
package “node_modules” as n2{
component “pkg_1(바로가기)” as b
}
}

package sample_n{
package “node_modules” as n3{
component “pkg_1(바로가기)” as c
}
}

package .pnpm_store{
package “node_modules” as n4{
component “pkg_1(2MB)” as d
}
}

a -> d
b -> d
c -> d

sample_1 -[hidden]r-> sample_2

sample_2 -[hidden]r-> sample_n : …
sample_2 -[hidden]d-> .pnpm_store
center footer https://devscb.tistory.com

@enduml

총평

front end쪽 개발은 사이드로 하고 있어서, 어떤 변화가 있는지 잘 못 따라 잡았는데,
최근에 우연히, 운좋게 pnpm을 알게 되었습니다.
한번 실제로 써보니 확실히 더 빠르게 프로젝트를 셋업할 수 있었습니다.
그리고 항상 node_modules 폴더 크기가 너무커서 불필요 프로젝트를 삭제할때마다 시간이 오래걸렸는데,
이 부분도 크게 향상되어서 만족스러웠습니다.
앞으로는 npm이나 yarn 을 쓰지 않고 pnpm을 쓰도록 해야겠습니다.

#pnpm,#node,#package,#manager,#javascript,#자바스크립트,#노드,#패키지,#매니저,#패키지매니저