From 70ae984024b92fd062d9e6ee70ac669313401197 Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 18 Oct 2023 12:34:25 +0200 Subject: [PATCH 01/60] Requirements / Mention GN minimal release I should have done it before releasing 1.2.0... --- requirements.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.in b/requirements.in index 7a5392d7..5fe981cb 100644 --- a/requirements.in +++ b/requirements.in @@ -1,2 +1,2 @@ staticmap==0.5.5 -geonature>=2.12.0 \ No newline at end of file +geonature>=2.13.3 From abc6574590502f478919657b1dd11e76f654b485 Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Tue, 23 Apr 2024 14:09:27 +0200 Subject: [PATCH 02/60] feat: update lint configuration to match geontautre 2.14 --- frontend/.nvmrc | 1 + frontend/.prettierignore | 0 frontend/.prettierrc | 6 +++++- frontend/package-lock.json | 14 +++++++------- frontend/package.json | 2 +- lint.sh | 11 +++++++++++ pyproject.toml | 21 ++++++++++++++++++++- 7 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 frontend/.nvmrc create mode 100644 frontend/.prettierignore create mode 100755 lint.sh diff --git a/frontend/.nvmrc b/frontend/.nvmrc new file mode 100644 index 00000000..112a2eae --- /dev/null +++ b/frontend/.nvmrc @@ -0,0 +1 @@ +lts/gallium \ No newline at end of file diff --git a/frontend/.prettierignore b/frontend/.prettierignore new file mode 100644 index 00000000..e69de29b diff --git a/frontend/.prettierrc b/frontend/.prettierrc index 86e01b23..11da2cd8 100644 --- a/frontend/.prettierrc +++ b/frontend/.prettierrc @@ -4,5 +4,9 @@ "useTabs": false, "tabWidth": 2, "semi": true, - "bracketSpacing": true + "bracketSpacing": true, + "trailingComma": "es5", + "singleAttributePerLine": true, + "bracketSameLine": false, + "htmlWhitespaceSensitivity": "ignore" } \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json index db58fdc3..5f93d4e9 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -17,7 +17,7 @@ "pbf": "^3.2.1" }, "devDependencies": { - "prettier": "^3.0.3" + "prettier": "~3.1.0" } }, "node_modules/@angular/common": { @@ -219,9 +219,9 @@ "deprecated": "This module has moved: please install @mapbox/point-geometry instead" }, "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -549,9 +549,9 @@ "integrity": "sha512-tXK8bY2l3/CPkyO7+UbOWbVjCpKoYY4t6uY3AYYy4Bagd4Z942gLeQOgtHICwBwgPf8dI6fw4VqKwzSNgvlw4A==" }, "prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true }, "protocol-buffers-schema": { diff --git a/frontend/package.json b/frontend/package.json index 97bef457..5c3944ab 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,6 +19,6 @@ "pbf": "^3.2.1" }, "devDependencies": { - "prettier": "^3.0.3" + "prettier": "~3.1.0" } } diff --git a/lint.sh b/lint.sh new file mode 100755 index 00000000..f9399ad1 --- /dev/null +++ b/lint.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +# backend +black . + +# frontend +cd frontend +source ~/.nvm/nvm.sh +nvm use +npm run format +cd .. diff --git a/pyproject.toml b/pyproject.toml index 71429910..b4a29d0c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,4 +14,23 @@ omit = [ ] [tool.black] -line-length = 99 \ No newline at end of file +line-length = 100 +exclude =''' +( + /( + \.eggs # exclude a few common directories in the + | \.git # root of the project + | \.hg + | \.mypy_cache + | \.tox + | \.venv + | _build + | buck-out + | build + | dist + | node_modules + | venv + | dependencies + )/ +) +''' \ No newline at end of file From 019860f5d3375ad0e9127e696a2eea3f6ddcdcd5 Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Tue, 23 Apr 2024 14:11:37 +0200 Subject: [PATCH 03/60] lint: run linter --- backend/gn_module_zh/blueprint.py | 4 +-- backend/gn_module_zh/forms.py | 10 +++---- backend/gn_module_zh/geometry.py | 6 ++-- backend/gn_module_zh/hierarchy.py | 20 +++++++------ .../migrations/01cb1aaa2062_init_zh.py | 1 + .../migrations/22b14fc3abe0_set_srid.py | 1 + .../migrations/26d6515219fe_add_indexes.py | 5 ++-- .../510677623a13_declare_permisision.py | 1 + .../migrations/643743e807f6_add_atlas_view.py | 1 + .../migrations/b4e1775f1e7c_sample_data.py | 1 + backend/gn_module_zh/model/cards.py | 29 +++++-------------- backend/gn_module_zh/model/zh.py | 8 +++-- backend/gn_module_zh/model/zh_schema.py | 4 +-- frontend/app/services/zh-data.service.ts | 14 ++++----- .../tabs/tab1/zh-form-tab1.component.ts | 12 ++++---- .../tabs/tab3/zh-form-tab3.component.ts | 8 ++--- .../tabs/tab5/zh-form-tab5.component.ts | 4 +-- .../tabs/tab6/zh-form-tab6.component.ts | 4 +-- 18 files changed, 61 insertions(+), 72 deletions(-) diff --git a/backend/gn_module_zh/blueprint.py b/backend/gn_module_zh/blueprint.py index 7d109ad3..8641583b 100644 --- a/backend/gn_module_zh/blueprint.py +++ b/backend/gn_module_zh/blueprint.py @@ -595,9 +595,7 @@ def get_tab_data(id_tab): ) # select active geo refs in config - active_geo_refs = [ - ref for ref in blueprint.config["ref_geo_referentiels"] if ref["active"] - ] + active_geo_refs = [ref for ref in blueprint.config["ref_geo_referentiels"] if ref["active"]] intersection = None # Check on geometry that should always exist (PATCH or POST) if len(form_data["geom"]["geometry"]["coordinates"]) == 0: diff --git a/backend/gn_module_zh/forms.py b/backend/gn_module_zh/forms.py index 52f97f29..560081a8 100644 --- a/backend/gn_module_zh/forms.py +++ b/backend/gn_module_zh/forms.py @@ -281,9 +281,7 @@ def update_zh_tab0(form_data, polygon, area, info_role, zh_date, geo_refs): # update pr_zh.cor_lim_list id_lim_list, ef_area = ( - DB.session.query(TZH.id_lim_list, TZH.ef_area) - .filter(TZH.id_zh == form_data["id_zh"]) - .one() + DB.session.query(TZH.id_lim_list, TZH.ef_area).filter(TZH.id_zh == form_data["id_zh"]).one() ) DB.session.query(CorLimList).filter(CorLimList.id_lim_list == id_lim_list).delete() @@ -844,9 +842,9 @@ def update_zh_tab6(data): TZH.update_author: data["update_author"], TZH.update_date: data["update_date"], TZH.is_other_inventory: is_other_inventory, - TZH.remark_is_other_inventory: data["remark_is_other_inventory"] - if is_other_inventory - else None, + TZH.remark_is_other_inventory: ( + data["remark_is_other_inventory"] if is_other_inventory else None + ), } ) DB.session.flush() diff --git a/backend/gn_module_zh/geometry.py b/backend/gn_module_zh/geometry.py index 652e9310..76851ad2 100644 --- a/backend/gn_module_zh/geometry.py +++ b/backend/gn_module_zh/geometry.py @@ -13,9 +13,9 @@ def set_geom(geometry, id_zh=None): if not id_zh: id_zh = 0 # SetSRID for POSTGIS < 3.0 compat - polygon = DB.session.query( - func.ST_SetSRID(func.ST_GeomFromGeoJSON(str(geometry)), 4326) - ).one()[0] + polygon = DB.session.query(func.ST_SetSRID(func.ST_GeomFromGeoJSON(str(geometry)), 4326)).one()[ + 0 + ] q_zh = ( DB.session.query(TZH) .filter( diff --git a/backend/gn_module_zh/hierarchy.py b/backend/gn_module_zh/hierarchy.py index 0cfa91c7..4cd861dd 100644 --- a/backend/gn_module_zh/hierarchy.py +++ b/backend/gn_module_zh/hierarchy.py @@ -934,9 +934,11 @@ def __str__(self): "qualification": self.__get_qualif_mnemo(), "knowledge": self.__get_knowledge_mnemo(), "name": self.__get_rule_name(), - "note": Hierarchy.get_str_note(self.note, self.denominator) - if self.active - else "Non paramétrée", + "note": ( + Hierarchy.get_str_note(self.note, self.denominator) + if self.active + else "Non paramétrée" + ), } @@ -973,9 +975,11 @@ def get_note(value): filter( None, [ - (float(item["note"].split("/")[0])) - if item["note"] is not None - else None + ( + (float(item["note"].split("/")[0])) + if item["note"] is not None + else None + ) for item in value if item["active"] ], @@ -1213,9 +1217,7 @@ def __check_if_rules(self): def get_denom(rb_id, col_name): rb_name = DB.session.query(TRiverBasin).filter(TRiverBasin.id_rb == rb_id).one().name return getattr( - DB.session.query(RbNotesSummary) - .filter(RbNotesSummary.bassin_versant == rb_name) - .one(), + DB.session.query(RbNotesSummary).filter(RbNotesSummary.bassin_versant == rb_name).one(), col_name, ) diff --git a/backend/gn_module_zh/migrations/01cb1aaa2062_init_zh.py b/backend/gn_module_zh/migrations/01cb1aaa2062_init_zh.py index 93e26c91..dc88a0b6 100644 --- a/backend/gn_module_zh/migrations/01cb1aaa2062_init_zh.py +++ b/backend/gn_module_zh/migrations/01cb1aaa2062_init_zh.py @@ -5,6 +5,7 @@ Create Date: 2023-03-27 11:54:34.602380 """ + import importlib from alembic import op diff --git a/backend/gn_module_zh/migrations/22b14fc3abe0_set_srid.py b/backend/gn_module_zh/migrations/22b14fc3abe0_set_srid.py index 2f71367e..1ca7dcdf 100644 --- a/backend/gn_module_zh/migrations/22b14fc3abe0_set_srid.py +++ b/backend/gn_module_zh/migrations/22b14fc3abe0_set_srid.py @@ -5,6 +5,7 @@ Create Date: 2023-04-19 14:58:14.295664 """ + from alembic import op import sqlalchemy as sa diff --git a/backend/gn_module_zh/migrations/26d6515219fe_add_indexes.py b/backend/gn_module_zh/migrations/26d6515219fe_add_indexes.py index a3728a02..a27ad87a 100644 --- a/backend/gn_module_zh/migrations/26d6515219fe_add_indexes.py +++ b/backend/gn_module_zh/migrations/26d6515219fe_add_indexes.py @@ -5,6 +5,7 @@ Create Date: 2023-06-05 12:07:39.416188 """ + from alembic import op import sqlalchemy as sa @@ -20,9 +21,7 @@ def upgrade(): op.create_index("index_t_zh_id_sdage", table_name="t_zh", columns=["id_sdage"], schema=SCHEMA) - op.create_index( - "index_t_zh_id_thread", table_name="t_zh", columns=["id_thread"], schema=SCHEMA - ) + op.create_index("index_t_zh_id_thread", table_name="t_zh", columns=["id_thread"], schema=SCHEMA) op.create_index( "index_t_zh_id_diag_bio", table_name="t_zh", columns=["id_diag_bio"], schema=SCHEMA ) diff --git a/backend/gn_module_zh/migrations/510677623a13_declare_permisision.py b/backend/gn_module_zh/migrations/510677623a13_declare_permisision.py index e4deb880..c9cf52e0 100644 --- a/backend/gn_module_zh/migrations/510677623a13_declare_permisision.py +++ b/backend/gn_module_zh/migrations/510677623a13_declare_permisision.py @@ -5,6 +5,7 @@ Create Date: 2023-05-25 15:33:36.262722 """ + from alembic import op import sqlalchemy as sa diff --git a/backend/gn_module_zh/migrations/643743e807f6_add_atlas_view.py b/backend/gn_module_zh/migrations/643743e807f6_add_atlas_view.py index e5f3555c..572acc99 100644 --- a/backend/gn_module_zh/migrations/643743e807f6_add_atlas_view.py +++ b/backend/gn_module_zh/migrations/643743e807f6_add_atlas_view.py @@ -5,6 +5,7 @@ Create Date: 2023-06-05 12:20:36.897280 """ + from alembic import op import sqlalchemy as sa diff --git a/backend/gn_module_zh/migrations/b4e1775f1e7c_sample_data.py b/backend/gn_module_zh/migrations/b4e1775f1e7c_sample_data.py index 4a64c82e..fa35508d 100644 --- a/backend/gn_module_zh/migrations/b4e1775f1e7c_sample_data.py +++ b/backend/gn_module_zh/migrations/b4e1775f1e7c_sample_data.py @@ -5,6 +5,7 @@ Create Date: 2023-03-27 13:32:22.741263 """ + import importlib from alembic import op diff --git a/backend/gn_module_zh/model/cards.py b/backend/gn_module_zh/model/cards.py index 6b2e1347..ea67101e 100644 --- a/backend/gn_module_zh/model/cards.py +++ b/backend/gn_module_zh/model/cards.py @@ -207,9 +207,7 @@ def __get_author(self, type="authors"): if getattr(self.zh, type).prenom_role is not None else "" ) - nom = ( - getattr(self.zh, type).nom_role if getattr(self.zh, type).nom_role is not None else "" - ) + nom = getattr(self.zh, type).nom_role if getattr(self.zh, type).nom_role is not None else "" return prenom + " " + nom.upper() def __get_organism(self, type="authors"): @@ -485,8 +483,7 @@ def __str__(self): return { "presentation": self.presentation.__str__(), "espace": [ - f"{cd} - {label}" - for cd, label in Utils.get_cd_and_mnemo(self.id_corine_landcovers) + f"{cd} - {label}" for cd, label in Utils.get_cd_and_mnemo(self.id_corine_landcovers) ], "usage": self.use.__str__(), "basin": self.basin.__str__(), @@ -868,9 +865,7 @@ def hydro(self): @hydro.setter def hydro(self, val): self.__hydro = [ - Function( - v["id_function"], v["id_qualification"], v["id_knowledge"], v["justification"] - ) + Function(v["id_function"], v["id_qualification"], v["id_knowledge"], v["justification"]) for v in val ] @@ -881,9 +876,7 @@ def bio(self): @bio.setter def bio(self, value): self.__bio = [ - Function( - v["id_function"], v["id_qualification"], v["id_knowledge"], v["justification"] - ) + Function(v["id_function"], v["id_qualification"], v["id_knowledge"], v["justification"]) for v in value ] @@ -911,9 +904,7 @@ def interet_patrim(self): @interet_patrim.setter def interet_patrim(self, val): self.__interet_patrim = [ - Function( - i["id_function"], i["id_qualification"], i["id_knowledge"], i["justification"] - ) + Function(i["id_function"], i["id_qualification"], i["id_knowledge"], i["justification"]) for i in val ] @@ -924,18 +915,14 @@ def val_soc_eco(self): @val_soc_eco.setter def val_soc_eco(self, val): self.__val_soc_eco = [ - Function( - i["id_function"], i["id_qualification"], i["id_knowledge"], i["justification"] - ) + Function(i["id_function"], i["id_qualification"], i["id_knowledge"], i["justification"]) for i in val ] @interet_patrim.setter def interet_patrim(self, val): self.__interet_patrim = [ - Function( - i["id_function"], i["id_qualification"], i["id_knowledge"], i["justification"] - ) + Function(i["id_function"], i["id_qualification"], i["id_knowledge"], i["justification"]) for i in val ] @@ -1092,7 +1079,7 @@ def __set_localisation(self): self.info.localisation = Localisation( self.id_zh, self.properties["geo_info"]["regions"], - self.properties["geo_info"]["departments"] + self.properties["geo_info"]["departments"], # self.ref_geo_config ) diff --git a/backend/gn_module_zh/model/zh.py b/backend/gn_module_zh/model/zh.py index 6efaba8e..404759a3 100644 --- a/backend/gn_module_zh/model/zh.py +++ b/backend/gn_module_zh/model/zh.py @@ -165,9 +165,11 @@ def get_instruments(self): "instruments": [ { "id_instrument": instrument.id_instrument, - "instrument_date": instrument.instrument_date.date().strftime("%d/%m/%Y") - if instrument.instrument_date - else None, + "instrument_date": ( + instrument.instrument_date.date().strftime("%d/%m/%Y") + if instrument.instrument_date + else None + ), } for instrument in ZH.get_data_by_id(TInstruments, self.zh.id_zh) ] diff --git a/backend/gn_module_zh/model/zh_schema.py b/backend/gn_module_zh/model/zh_schema.py index 1defeb29..e8e2ba19 100644 --- a/backend/gn_module_zh/model/zh_schema.py +++ b/backend/gn_module_zh/model/zh_schema.py @@ -680,9 +680,7 @@ class TActivity(DB.Model): class TOutflow(DB.Model): __tablename__ = "t_outflow" __table_args__ = {"schema": "pr_zh"} - id_outflow = DB.Column( - DB.Integer, ForeignKey(TNomenclatures.id_nomenclature), primary_key=True - ) + id_outflow = DB.Column(DB.Integer, ForeignKey(TNomenclatures.id_nomenclature), primary_key=True) id_zh = DB.Column(DB.Integer, ForeignKey(TZH.id_zh), primary_key=True) id_permanance = DB.Column( DB.Integer, diff --git a/frontend/app/services/zh-data.service.ts b/frontend/app/services/zh-data.service.ts index d08fd57d..bcca0ad7 100644 --- a/frontend/app/services/zh-data.service.ts +++ b/frontend/app/services/zh-data.service.ts @@ -16,7 +16,7 @@ export class ZhDataService { constructor( private _api: HttpClient, - public config: ConfigService, + public config: ConfigService ) {} setCurrentZh(zh: any) { @@ -47,7 +47,7 @@ export class ZhDataService { autocompletBib(search_title: string) { return this._api.get( - `${this.config.API_ENDPOINT}/zones_humides/references/autocomplete?search_title=${search_title}`, + `${this.config.API_ENDPOINT}/zones_humides/references/autocomplete?search_title=${search_title}` ); } @@ -57,7 +57,7 @@ export class ZhDataService { getHabitatByCorine(corineId: string) { return this._api.get( - `${this.config.API_ENDPOINT}/zones_humides/forms/cahierhab/${corineId}`, + `${this.config.API_ENDPOINT}/zones_humides/forms/cahierhab/${corineId}` ); } @@ -72,7 +72,7 @@ export class ZhDataService { map((municipalities: any) => { municipalities.map((item) => (item.disabled = false)); return municipalities; - }), + }) ); } @@ -82,7 +82,7 @@ export class ZhDataService { getZhDetails(zhId: number) { return this._api.get( - `${this.config.API_ENDPOINT}/zones_humides/${zhId}/complete_card`, + `${this.config.API_ENDPOINT}/zones_humides/${zhId}/complete_card` ); } @@ -107,7 +107,7 @@ export class ZhDataService { postMainPicture(zhId: number, mediaId: number) { return this._api.patch( `${this.config.API_ENDPOINT}/zones_humides/${zhId}/main_pict/${mediaId}`, - {}, + {} ); } @@ -117,7 +117,7 @@ export class ZhDataService { getHierZh(zhId: string) { return this._api.get( - `${this.config.API_ENDPOINT}/zones_humides/${zhId}/hierarchy`, + `${this.config.API_ENDPOINT}/zones_humides/${zhId}/hierarchy` ); } diff --git a/frontend/app/zh-forms/tabs/tab1/zh-form-tab1.component.ts b/frontend/app/zh-forms/tabs/tab1/zh-form-tab1.component.ts index 26aa3f16..841d3624 100755 --- a/frontend/app/zh-forms/tabs/tab1/zh-form-tab1.component.ts +++ b/frontend/app/zh-forms/tabs/tab1/zh-form-tab1.component.ts @@ -47,7 +47,7 @@ export class ZhFormTab1Component implements OnInit { private _tabService: TabsService, private _error: ErrorTranslatorService, public ngbModal: NgbModal, - private _config: ConfigService, + private _config: ConfigService ) {} ngOnInit() { @@ -168,7 +168,7 @@ export class ZhFormTab1Component implements OnInit { this._toastr.error(frontMsg, '', { positionClass: 'toast-top-right', }); - }, + } ); } } @@ -182,13 +182,13 @@ export class ZhFormTab1Component implements OnInit { map((res: any) => res.filter((r) => { return !this.listBib.map((bib) => bib.id_reference).includes(r.id_reference); - }), + }) ), catchError(() => { return of([]); - }), - ), - ), + }) + ) + ) ); formatter = (result: any) => `${result.title}`; diff --git a/frontend/app/zh-forms/tabs/tab3/zh-form-tab3.component.ts b/frontend/app/zh-forms/tabs/tab3/zh-form-tab3.component.ts index 18f16c40..2abd4bc8 100755 --- a/frontend/app/zh-forms/tabs/tab3/zh-form-tab3.component.ts +++ b/frontend/app/zh-forms/tabs/tab3/zh-form-tab3.component.ts @@ -469,8 +469,8 @@ export class ZhFormTab3Component implements OnInit { a.human_activity.mnemonique.slice(0, 2) > b.human_activity.mnemonique.slice(0, 2) ? 1 : b.human_activity.mnemonique.slice(0, 2) > a.human_activity.mnemonique.slice(0, 2) - ? -1 - : 0 + ? -1 + : 0 ); } @@ -480,8 +480,8 @@ export class ZhFormTab3Component implements OnInit { a.mnemonique.slice(0, 2) > b.mnemonique.slice(0, 2) ? 1 : b.mnemonique.slice(0, 2) > a.mnemonique.slice(0, 2) - ? -1 - : 0 + ? -1 + : 0 ); } return impacts; diff --git a/frontend/app/zh-forms/tabs/tab5/zh-form-tab5.component.ts b/frontend/app/zh-forms/tabs/tab5/zh-form-tab5.component.ts index 72a3294a..b4efaa9e 100755 --- a/frontend/app/zh-forms/tabs/tab5/zh-form-tab5.component.ts +++ b/frontend/app/zh-forms/tabs/tab5/zh-form-tab5.component.ts @@ -1162,8 +1162,8 @@ export class ZhFormTab5Component implements OnInit { a.function.mnemonique.slice(0, 2) > b.function.mnemonique.slice(0, 2) ? 1 : b.function.mnemonique.slice(0, 2) > a.function.mnemonique.slice(0, 2) - ? -1 - : 0 + ? -1 + : 0 ); } diff --git a/frontend/app/zh-forms/tabs/tab6/zh-form-tab6.component.ts b/frontend/app/zh-forms/tabs/tab6/zh-form-tab6.component.ts index 2310ffe4..3df38a8c 100755 --- a/frontend/app/zh-forms/tabs/tab6/zh-form-tab6.component.ts +++ b/frontend/app/zh-forms/tabs/tab6/zh-form-tab6.component.ts @@ -1041,8 +1041,8 @@ export class ZhFormTab6Component implements OnInit { a.area.municipality_name > b.area.municipality_name ? 1 : b.area.municipality_name > a.area.municipality_name - ? -1 - : 0 + ? -1 + : 0 ); } From 6ea0e1c7c3b9dc9ff652837debc39c414e285b59 Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Mon, 15 Apr 2024 18:32:16 +0200 Subject: [PATCH 04/60] fix wrong rb name in tab9 --- frontend/app/services/hierarchy.service.ts | 6 +++--- frontend/app/zh-forms/tabs/tab9/zh-form-tab9.component.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/app/services/hierarchy.service.ts b/frontend/app/services/hierarchy.service.ts index b65536e4..8f2359a6 100644 --- a/frontend/app/services/hierarchy.service.ts +++ b/frontend/app/services/hierarchy.service.ts @@ -38,8 +38,9 @@ export class HierarchyService { } // get current zone humides - getHierarchy(zhId) { + getHierarchy(zhId, rb_name) { this.isLoading = true; + this.rb_name = rb_name; this._dataService.getHierZh(zhId).subscribe( (data: HierarchyModel) => { this.items = this.setItems(data); @@ -65,8 +66,7 @@ export class HierarchyService { this.items = []; return; } - this.rb_name = data.river_basin_name; - + this.items = [{ name: '', active: true, qualification: '', knowledge: '', note: '' }]; // cat 1 diff --git a/frontend/app/zh-forms/tabs/tab9/zh-form-tab9.component.ts b/frontend/app/zh-forms/tabs/tab9/zh-form-tab9.component.ts index 25fbc1ba..e63a04d8 100755 --- a/frontend/app/zh-forms/tabs/tab9/zh-form-tab9.component.ts +++ b/frontend/app/zh-forms/tabs/tab9/zh-form-tab9.component.ts @@ -37,7 +37,7 @@ export class ZhFormTab9Component implements OnInit { this.$_currentZhSub = this._dataService.currentZh.subscribe((zh: any) => { if (zh) { this.currentZh = zh; - this.hierarchy.getHierarchy(zh.id); + this.hierarchy.getHierarchy(zh.id, zh.properties.bassin_versant); } }); } From efd152e47e245c8ceaa7443e67fa870cb17ac6a1 Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Sun, 7 Apr 2024 09:24:46 +0200 Subject: [PATCH 05/60] fix hierarchy __str__ error --- backend/gn_module_zh/model/cards.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/gn_module_zh/model/cards.py b/backend/gn_module_zh/model/cards.py index ea67101e..90ffc3ce 100644 --- a/backend/gn_module_zh/model/cards.py +++ b/backend/gn_module_zh/model/cards.py @@ -1198,7 +1198,7 @@ def __set_statuses(self): return self.status.__str__() def __set_hierarchy(self): - return self.hierarchy.__str__() if self.hierarchy is not None else None + return self.hierarchy.as_dict() if self.hierarchy is not None else None def __set_evaluation(self): self.__set_main_functions() From 95d76d3954d0caefe8ad8331a1f3ff46821a1a1d Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Fri, 5 Apr 2024 18:05:33 +0200 Subject: [PATCH 06/60] fix bug media json --- backend/gn_module_zh/blueprint.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/backend/gn_module_zh/blueprint.py b/backend/gn_module_zh/blueprint.py index 8641583b..429b9a9d 100644 --- a/backend/gn_module_zh/blueprint.py +++ b/backend/gn_module_zh/blueprint.py @@ -748,13 +748,11 @@ def patch_file(id_media): DB.session.commit() - return jsonify( - { - "media_path": upload_resp["media_path"], - "secured_file_name": upload_resp["secured_file_name"], - "id_media": upload_resp["id_media"], - } - ) + return { + "media_path": upload_resp["media_path"], + "secured_file_name": upload_resp["secured_file_name"], + "id_media": upload_resp["id_media"], + } @blueprint.route("/", methods=["DELETE"]) From a601d1706af8b133bfe403f654fc544ee6f506ac Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Fri, 5 Apr 2024 14:07:38 +0200 Subject: [PATCH 07/60] fix errors in sample data --- .../migrations/data/insert_into_fake_data.sql | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/gn_module_zh/migrations/data/insert_into_fake_data.sql b/backend/gn_module_zh/migrations/data/insert_into_fake_data.sql index 32fe2c5a..2d05fd0a 100644 --- a/backend/gn_module_zh/migrations/data/insert_into_fake_data.sql +++ b/backend/gn_module_zh/migrations/data/insert_into_fake_data.sql @@ -13,7 +13,7 @@ INSERT INTO pr_zh.t_river_basin (id_rb, name, geom, id_climate_class, id_river_f ( 1, 'Calavon - DU_13_07', - '01030000A0E610000001000000C7030000AB2A6F3046D3154066DF8D97F6E8454000000000204D0ABF70E8A6C955D31540721A441022E9454000000000804D0ABF1862F5679CD315408DCF200F9BE9454000000000204E0ABF6FBE00BF35D4154075A28EA8F1E9454000000000004F0ABFA32AF943DCCF15409C7E90CC43EA454000000000604F0ABF2513C9E3F5CC1540CC58AF099EEA45400000000060500ABF50059E5715D01540DC1163E236EB45400000000080510ABFDF4A266CB0CE15407F203611BFEB45400000000040520ABF7EA69A827ACA1540CE9A6BF8DCEB45400000000080520ABF74A9C7B4FFC515408904ACE00BEC45400000000000530ABF25097D9DD1C215401962A9F43FEC45400000000060530ABF0A1343AA26BF1540F3945D1E0CEC45400000000000530ABFF9D92509ECBC15400CAFC3163CEC45400000000040530ABF8E58E019ACB51540CF770CC557EC454000000000A0530ABF26B5C01FB7AE154037AC102C61EC454000000000A0530ABFC2658BCD5BA91540BA1C350764EC454000000000A0530ABF0A81F4DC66A21540D44F50F662EC45400000000080530ABF4C94B4581F9A1540CFC59BB060EC45400000000080530ABFA1E9279976931540C4B2FAA84FEC45400000000080530ABFC0C3A181619015404833460427EC45400000000020530ABF8D8F08FAB78D154003327BEC05EC454000000000C0520ABFDBFEC8E4188B1540FABC2E45D1EB45400000000080520ABF3FEF8FFBBD881540DE6EF759D0EB454000000000A0520ABFD9EB3523BB861540BECD8380FBEB454000000000E0520ABFFB5F724B81821540E22E7BE22BEC45400000000060530ABFC90BCEFF1D801540CA054D645AEC454000000000C0530ABFEDA1E7C4ED7D1540826E4A0A07EC45400000000020530ABFD53A8B0F6178154090EB860516EC45400000000000530ABFB425E29984721540BB4A121AB4EB45400000000060520ABFB79D1341BD6F15406F125DEF97EB45400000000060520ABF9C9E74979A6B1540DC9AE16E84EB45400000000020520ABF5FDDDB35B46B1540339A0BEA33EB45400000000080510ABFB6B14D36B268154094C389961BEB45400000000040510ABF9DB9A0B089671540D838D06AFFEA454000000000E0500ABFF7FE8EBBE7671540F5B3215CCBEA454000000000A0500ABFAB4327491D661540B4D5B396A3EA45400000000060500ABF0566B49942651540C5DCD2904EEA454000000000E04F0ABFB482F86C906715406B29C0E4D9E9454000000000E04E0ABF6F59AA6FCB641540D58B9CAE8CE9454000000000204E0ABF9799C652296115403B000F5893E9454000000000604E0ABFF7995B442B5F1540904D9D47D1E9454000000000C04E0ABF5A565AB0D15B154026E9DF94D3E9454000000000E04E0ABF89D72AFD7958154002FB3591EEE9454000000000404F0ABFB902B545475615408E6EE960FDE9454000000000204F0ABFCA3CE47E69551540F8909917F5E9454000000000004F0ABFE39CCC2398541540276D49F8C2E9454000000000A04E0ABF53DF3D1095511540EFC785A650E9454000000000E04D0ABFEFFB845E4D50154079638B571EE9454000000000804D0ABFEFC6AFEABB491540C1279E9DD3E8454000000000004D0ABFEE5161DFD348154048E7895D6DE8454000000000204C0ABF8DCCF278F9441540F007B06908E8454000000000404B0ABFF19B0F8EE2431540EE950930BCE7454000000000E04A0ABF72A21260054215405CDBDED0A2E7454000000000804A0ABF0759792D373F1540481D9DC280E7454000000000404A0ABFF8617AD6803D1540E5C8807364E7454000000000404A0ABF0F1B657C813C1540AA8E9CA047E7454000000000E0490ABF1C89F2C1483A15403C4DF47B52E7454000000000004A0ABF429CC1FA613815406716EF6833E7454000000000C0490ABFE2D5360992351540745FC6373DE7454000000000004A0ABFA0DCEAA8E63315408573467D29E7454000000000A0490ABF2A74D65E38321540C29A7D7D4CE7454000000000E0490ABFAD67B0885E30154086B6F15D47E7454000000000404A0ABFFB72335EDA2E154057A0792C45E7454000000000204A0ABFA48B3FA78F2D154063FE975747E7454000000000E0490ABF783A51A9202C15401D601C1F45E7454000000000E0490ABF2C81862DA52A1540C502F7A748E7454000000000204A0ABFB716A96D6129154083EC03D333E7454000000000C0490ABF249DBD501628154003C8C25C1EE745400000000080490ABF1F51E3E017271540059BDD2106E745400000000060490ABFD768879812261540BA55F8FFF4E645400000000060490ABF43B3F1F5A0241540C0F7595CE5E645400000000000490ABFEF1B69AEC4211540FD95FA43BBE6454000000000A0480ABF80692B56E52015402A8B338AACE6454000000000C0480ABF7D995FB2C81F15400BC8F7B5CFE645400000000000490ABFC9E3F7198B1E154075F02201CEE645400000000040490ABFE4A10AA91A1D1540C5E6F9A0DDE645400000000040490ABF38F61956161C15408A2D8E46C9E645400000000040490ABFD4DB0FC8191B1540EBC031CAB6E6454000000000C0480ABF90311D056E1A15401EE48B3DA4E6454000000000A0480ABFA493D7B188191540270FD16877E645400000000060480ABF2A1132DC63181540320564666BE645400000000040480ABF6761A456E2161540759E85D35BE645400000000040480ABF551133601D16154056C4E8565CE645400000000020480ABFA9CAEF6A9E141540717CF0606BE645400000000040480ABF7F5C59323A1415400853E4377CE645400000000060480ABF8099AF04D3131540B052B9C684E645400000000060480ABF901A861016131540A4CFC21DB5E6454000000000C0480ABF95C15B4C8F111540F778DFB2AEE6454000000000C0480ABFE45DF4BEE11015400503A406ADE6454000000000A0480ABF9C5891A0DE0F1540C03C3CD1ADE6454000000000C0480ABFA5948704A30E154053D8080FA8E645400000000060480ABFACE5B0B0F30C154002B2B117A0E645400000000080480ABF6B56A405B70B154095E405F996E645400000000080480ABF2A8C3C73760A1540C425D5DC8DE645400000000060480ABFD79E64F84209154017DD56FD86E6454000000000A0480ABF7A394169D9071540B25D111B7FE645400000000080480ABFDD26D21A92061540B404746779E645400000000060480ABF5BB7EA9667051540B6A13F1A75E645400000000060480ABF757F8FBA23041540DAF588EA6DE645400000000040480ABF6AA0E81EF402154043C2DBD965E645400000000040480ABF84B472F3DC011540890607C85DE645400000000040480ABF3DF15DFFCD0015408136C8E454E645400000000000480ABF3760E651D8FE1440379E588241E6454000000000E0470ABF6CC0964BBBFD14401DAC404B35E645400000000000480ABFCBCE021CD2FC14401842DBF422E6454000000000E0470ABFCBCE5B32DEFB1440CDBC25DE15E6454000000000A0470ABFD9C3264A04FB1440DCC0F6B00BE6454000000000A0470ABFBD7EB0F161F91440BAE19011FBE545400000000080470ABFB78C1E2D87F71440904687C7F8E5454000000000A0470ABF37ADD1B090F614405FDF494CFAE545400000000080470ABFDD900CD033F51440A1C5019DFDE5454000000000A0470ABF407CA1D0FBF3144006918E1800E645400000000040470ABFAECB985CC3F21440325A922A02E645400000000060470ABF02A1738FB6F114400F4173770AE6454000000000A0470ABF1D3B3845D0F01440AAD0D72617E6454000000000C0470ABF4F24529250EF14405D2796D51FE6454000000000A0470ABF491F223DB4EE1440F17A8D0F21E6454000000000C0470ABF93BB6C4CABED144027EFBCC11DE6454000000000E0470ABF7919E1D3C1EB1440067F220914E6454000000000A0470ABF90983C80FDEA1440E9D9BB290DE6454000000000C0470ABFC84E6B0085E914401AE1855F08E6454000000000C0470ABF9505188262E81440B2F7EB8102E645400000000020470ABF76D3D919DDE61440D2EC7C1AFEE5454000000000A0470ABFED4912C0EEE41440C8FA94C5FDE545400000000080470ABFEF245B6674E31440FA15A887FEE545400000000080470ABF807DBDC15DE2144072A06A8403E6454000000000A0470ABFA3C135865CE114406A42E44E0AE645400000000060470ABF3CD22E025ADF1440C0814D250BE645400000000080470ABF15C940E31FD71440C34851543CE645400000000000480ABF14C997A9BFD51440D73B9B8F2EE6454000000000C0470ABF2A1E7392AFD4144064709CE423E6454000000000E0470ABFC9F57D345FD31440504EB46A0FE645400000000080470ABF98D8021B21D2144036EA9FE20BE645400000000080470ABF475D5C6806D11440C288911E1DE6454000000000A0470ABFDD642C2FA3CE1440173C34B215E6454000000000A0470ABFF297909641CD1440C0917E090FE645400000000060470ABFE52D7B4D2BCC1440904A3FE20EE6454000000000A0470ABF5DBF768464CA144073964D2523E645400000000080470ABF74A1A2A675C9144081797F3A27E6454000000000E0470ABF5F4E446FBAC81440D7539E7A36E6454000000000E0470ABFC226269A61C81440E24A062F4EE645400000000020480ABF56C6CF0D06C71440B20BB0DE54E645400000000060480ABF5E81C74C32C61440E38E5FB650E645400000000040480ABF35647CCE5BC514409067CC6D51E645400000000020480ABF5833C58B6FC41440AF917F194EE645400000000040480ABF2E3C0F10A1C314406EFB890059E645400000000000480ABF2796CAAA97C214401339841C64E645400000000060480ABF1D4E8EA010C21440E9E46D4EA1E6454000000000A0480ABFE3E32537BAC11440CBC9BFEFBFE645400000000020490ABF1B4D0E9BA3BF1440F4F27BDDCAE6454000000000E0480ABF0F60C17280BE144071CDDF90DFE645400000000040490ABF882A5D1121BD1440AECA7AED0BE745400000000080490ABF7522FAABAFBB14404DA4425F1DE7454000000000C0490ABFCBBD272F00BA1440C286B74E1FE7454000000000A0490ABF36B460ECFDB71440D033CFCF1AE745400000000080490ABFC42018EF56B61440FA857ACB0CE745400000000080490ABF39DCC3A850B41440822608632DE7454000000000C0490ABF53EB19A13AB31440F4FC301F3CE7454000000000004A0ABFBCE83FD035B11440A1AE179734E7454000000000C0490ABF71A592208DAF14402E95BAD42DE7454000000000E0490ABF40B6557ACBAD144023B8574933E7454000000000A0490ABF1A0CD80197AC1440EAF7A7D644E7454000000000004A0ABFA46A7231C5AA1440BF8F491D50E7454000000000E0490ABF917B131F94A91440782C014947E7454000000000E0490ABF34C33F119EA714402E2B50F93EE7454000000000C0490ABF3EDAB472C7A51440D0D7294F47E7454000000000204A0ABF31E1BECA80A4144021F664F63AE7454000000000E0490ABFC1B0C64A23A31440246937CD32E7454000000000E0490ABF6385B9E87FA1144001F3C0492CE7454000000000C0490ABFABB40EBA2EA0144054B2BB1719E7454000000000C0490ABF282F6B342E9E1440E31D3D520DE745400000000060490ABFD84F6C4DC99C1440CAAFD46EF8E645400000000060490ABFB8B091684E9B1440BBDB3DF209E745400000000040490ABF51CA7618439B14407E8CFA7827E7454000000000A0490ABF2F88B274EC9A14409136F1FB46E7454000000000E0490ABF95AB6197449A1440F85ED60F57E7454000000000004A0ABF56F835B892991440CF119ECB6BE7454000000000004A0ABFF10846A6759814408AB6BC1594E7454000000000804A0ABF2822A945FE961440B751DEB0B4E7454000000000A04A0ABF9D61D4727495144028C57E5DDDE7454000000000E04A0ABF9EFD0DB1C5931440A4C2E83DE6E7454000000000004B0ABFD5478F38F7911440CE53F600FEE7454000000000404B0ABFC51118FC5F9114409A9C4AAC45E8454000000000C04B0ABF8ED7B26A0C9114406DE45B9E6FE8454000000000204C0ABF80894E72539214404E3789B590E8454000000000404C0ABFE7105626C49114404FA304D7B3E8454000000000A04C0ABF4908B366C58F1440F7BCF077EEE8454000000000004D0ABFFD5DBA4C368F1440535BAB9415E9454000000000A04D0ABF9EBA48D80C8D14408EE326404FE9454000000000C04D0ABF4390C2121A8C1440CD9507087BE9454000000000204E0ABFA6B9B15D178B1440694FDC26A9E9454000000000604E0ABFE31EA78145891440B4D10FC2B2E9454000000000804E0ABFEAEE76BF158714401D69129DD7E9454000000000C04E0ABFBB4F7CB550851440FE60E1D8EFE9454000000000E04E0ABFC3AF7050718314408BF71C8DE8E9454000000000A04E0ABFD8D8461346811440996BDF4300EA454000000000204F0ABF721FB58E418014402AFF8AB4F0E9454000000000004F0ABFE95E2C3EEE7D14407EABE429D7E9454000000000E04E0ABFDD031667DC7B1440738096BBB5E9454000000000C04E0ABFA29FB2BEF97914400218CA8E9AE9454000000000204E0ABF092651C0327814408F5B6EB09AE9454000000000404E0ABF0950B48E6F761440EBE4038DA6E9454000000000404E0ABF33FB87DC3E751440B8469464A2E9454000000000604E0ABFDD2EBC928573144029E6940687E9454000000000404E0ABFA16A63193F7214403BA030F281E9454000000000404E0ABF9C5B40E0B970144067E932AC75E9454000000000004E0ABFB5C8E7F1156F1440CF9619355FE9454000000000C04D0ABFFD17745CE96E14402498BB754AE9454000000000E04D0ABF658DB95C626E1440BBD8F70128E9454000000000804D0ABF784DB05C686D14406D740BDF26E9454000000000C04D0ABF49FBC916FC6B1440E6EFC07D29E9454000000000804D0ABF184F8FFBA06A1440B8498C1B25E9454000000000804D0ABF73A28346A069144060CF30662EE9454000000000C04D0ABF2BD3BB6C7A681440CB71DA2C3CE9454000000000A04D0ABF9C86CE5D6C651440A8841B652EE9454000000000804D0ABF0ED5AF1644631440542C50591EE9454000000000804D0ABF8F95ACFD2762144019FFE1112CE9454000000000404D0ABF55914E6EF0601440DCF1DC133FE9454000000000804D0ABFB7681B348B60144011C790406EE9454000000000004E0ABF9E555CB4575F144083003A2C8FE9454000000000204E0ABFFD4C133FA05E14409032FD48ACE9454000000000A04E0ABF008DF69D535D1440AF8C54EFCAE9454000000000A04E0ABF5A3FC4ED545C1440391DAF15EDE9454000000000204F0ABFF2DA50806B5B14408FB8F4A010EA454000000000204F0ABF8A1492DC725A1440ABDF8AA72BEA454000000000604F0ABF54F6C9FD335914401691DB7048EA454000000000A04F0ABFD955B9ABDC571440D588784165EA454000000000E04F0ABF791082DF9356144091298D047CEA45400000000020500ABFBD40EDC7DC541440CA662DE896EA45400000000040500ABFC2C0B8C6B85414404A8011A598EA45400000000020500ABF2015AABE9853144039EAB093A6EA45400000000060500ABF324179906A521440E60AF34FB6EA45400000000060500ABF26C7340F295214404C2128BEB9EA45400000000060500ABF1A97F6BE6B501440E6C4370ACFEA45400000000080500ABFA08301B2304E14403BF91C54EAEA454000000000E0500ABF35547B83C04D14405B931DB2EEEA45400000000000510ABF636682D6384C1440A76519EFFDEA45400000000020510ABF7700204EFA4A1440673288580BEB45400000000020510ABF69FD67AE864A14401A26E63810EB45400000000020510ABF3BE5CDAC6448144009FE98722BEB45400000000060510ABFDEC5859537461440C852EFF83FEB45400000000080510ABFCEB71A665044144001E0370255EB454000000000C0510ABF12860DC7D94114405CAAA9446BEB454000000000C0510ABF3124F922683F1440743CC50483EB45400000000020520ABF00FB0B70A83D1440AA0839D39CEB45400000000020520ABFE19CC8BF0D3C14404F130E13ADEB45400000000080520ABFB42971D3CD391440788ABA52BBEB45400000000080520ABF1A0C93CAA9371440E1FCFCF0C7EB45400000000080520ABFC2585AE90E36144074BB5D64CDEB45400000000080520ABFB8F5E95945341440F872321DCEEB45400000000040520ABF2F8975955A311440B9D20F73C3EB454000000000A0520ABFB2177E9E192F14402BD79ECDBAEB45400000000060520ABFE3A559651C2D1440A16E6B92B7EB45400000000080520ABFCE589B376E2B144053BF40D5B4EB45400000000040520ABF7645590A3B291440A9E69FE5AFEB45400000000040520ABF748EDEDE5A27144079EA0633A8EB45400000000080520ABF627B872F102514404BB16BFBA9EB45400000000080520ABF81E54416E8221440893F0038D6EB454000000000C0520ABF28514B03251F144089CE25B5A9EB45400000000040520ABFC48C2C9C7B1F144079D89DCC76EB45400000000000520ABFD2F95BC12F1E1440D3F8AEA674EB454000000000C0510ABF1B3551AA091C14408A8F06E0BDEB45400000000080520ABF6F2FCA0EFC1A1440CCE7C22914EC45400000000020530ABF1CC2B2303A19144062556A2D29EC45400000000040530ABFAFFABB3AB017144087A2A9AD1FEC45400000000040530ABFA71DD4358B161440F615AB49F4EB454000000000E0520ABFBA2EFF0FA81514406FD675C7DEEB454000000000E0520ABF5CA685B4A81414405C9FA2E9F7EB454000000000E0520ABF8AB886271213144016F7276902EC454000000000E0520ABF197ECB902E0B14405327D9EF32EC45400000000020530ABF4921F323390A14407AFD63B53DEC45400000000080530ABF263CCFD4AC0814406AB75F0F52EC45400000000080530ABF36BDE1E99506144021AD2DFA6AEC454000000000C0530ABF2DF142173804144096A3B54182EC45400000000000540ABFA92780E9F50214401867211D97EC45400000000000540ABF2E7D0FE0B30014405C54615AC1EC45400000000060540ABF751F344F1EFF13408BCCEB98DDEC454000000000C0540ABF567FF1DF73FD13408DAC80E3F9EC454000000000E0540ABFA269F146BFFB134073E7645D11ED45400000000000550ABF06E5B8F4A0F91340B5F473CC22ED45400000000000550ABF207CE8AD99F61340F106759C5BED454000000000A0550ABFFEEA5C90DBF313403E2905647CED454000000000C0550ABFE1EE806E83F21340301BA3A486ED454000000000E0550ABFDB8C239AFBF2134065AB78D39FED45400000000040560ABF5FBC3C2D3AF3134041C49515B0ED45400000000040560ABFD73441B557F31340577B1DCCE7ED454000000000C0560ABF857F74C4B2F21340741A93C937EE45400000000020570ABF45449F6067F413406882DC68B9EE45400000000020580ABF5184820D79F6134079643F5DC7EE45400000000040580ABFE62774F040FB13402B3FEA87E9EE45400000000080580ABF10EF3B23D2031440551669A10EEF454000000000E0580ABFEA52A63233041440232765CA36EF45400000000000590ABF4F4AE8E7BD09144003F3916473EF454000000000A0590ABF8C34F64E43101440E588740BD4EF454000000000405A0ABF552F92DAF4141440DA09512226F0454000000000E05A0ABF6C42F7E1EA1914409912F443E2EF454000000000605A0ABFA68AF033BD1C1440D8E83F2CC1EF454000000000405A0ABF6E8B2D66EE201440A580A4158BEF454000000000A0590ABF3C6B3A4BEF22144080F0FE3F82EF454000000000A0590ABF37517D74A7281440F428BB9091EF454000000000C0590ABFEE53745DF02D144001038F22ACEF454000000000005A0ABF452AEDFE3B311440B36EF285AEEF454000000000205A0ABF1614EF27F9391440E759283FE9EF454000000000605A0ABF23B0690B20401440FB536549F6EF454000000000C05A0ABF472AC54B82461440E7800E2FE8EF454000000000605A0ABF575998B41D4E1440D393EA8DB9EF454000000000E0590ABFE55A6A248D5614400705755279EF45400000000080590ABF16BD0752215F14409CE1114F4EEF454000000000A0590ABFDF83E0814A681440E27E2F7338EF45400000000020590ABF3FD52D44516F1440304CDCFD50EF45400000000040590ABF831870E57A731440D66EBAD872EF45400000000080590ABFDEEA584BE073144010FDCAC87EEF454000000000C0590ABF72DA5F12177C1440651E4A1136F0454000000000005B0ABF687F6F02FF8014406CEED661A5F0454000000000E05B0ABFFEB8E6F7728214408B9CA0C6D7F0454000000000405C0ABF005F5199EE821440F37B8E453BF1454000000000205D0ABFC5844F356C81144091C5B780ECF1454000000000405E0ABF46EDE5D5548114403C0718A117F2454000000000805E0ABF58923CD443841440F046DFC55BF2454000000000205F0ABF075B545A388914408C9FA238C0F245400000000000600ABFF93483A3408B1440686AE00310F345400000000040600ABFC3C9097E4E8B144071D08D053BF3454000000000C0600ABFDE65F9B935891440763889F464F345400000000020610ABF91DDDEADE5871440851063CB75F345400000000040610ABF0056846828881440BDF60D3281F345400000000040610ABF2AD882ABB28B144030E526CA8DF3454000000000A0610ABF0A68C2DB27901440F21A2A1ACCF3454000000000E0610ABF56B350A0189214403CDE2ADD08F445400000000080620ABFB08123AEC7901440FEAAC92E73F445400000000020630ABFF41CC49F1D8F14405BD5416690F445400000000040630ABF80F635E48C8E14405C58C29AA3F4454000000000A0630ABF84A9E309DC8E14407623F810B0F4454000000000A0630ABFC4FD25439991144016EB9F9BB6F4454000000000A0630ABFE19062056D951440716DEF26D4F4454000000000E0630ABFFF4B5F07CC9814400451711941F5454000000000C0640ABF7463FFCDFA991440DBF6FAAF6AF545400000000020650ABFDD9FF11CD29B1440049BFB179DF545400000000060650ABFE33F9AD40B9C1440E4C58611BAF5454000000000C0650ABFBBFAF986B29914408BED77BE19F645400000000020660ABFE5E5F5F9959A1440B9E29A4074F645400000000000670ABF5085FBA1C79B14404BD9565CEBF645400000000020680ABFB91D3A78139C14405750D5E416F745400000000020680ABF46BCB6D9019B1440B23296A646F7454000000000A0680ABF779CEF6E749C14408889DD01EDF7454000000000C0690ABF066895DF189C1440C1AC48F281F8454000000000C06A0ABF8780E6ADED99144027C12622F7F8454000000000E06B0ABF11005BA022991440D0D9C91D19F9454000000000406C0ABF385AC39127991440B7D1DE571AF9454000000000406C0ABF7A0BE0656799144052E0EB3161F9454000000000A06C0ABF96E00D9AE99714406F8D0526ABF9454000000000206D0ABF2D9BF9E7F69614405406F12BC4F9454000000000206D0ABF8DF34CCC5F9A1440A375B0ECDAF9454000000000A06D0ABFBA0584A6969F14407FF0732B13FA454000000000C06D0ABF3F8A997FFFA3144062F4CE5355FA454000000000806E0ABFF8208A6E0EA614408963D2F46DFA454000000000A06E0ABFF23F201849A9144075CC359C73FA454000000000A06E0ABF25A1F61FF9AD1440C89E969C55FA454000000000606E0ABFCDED5B84BCB11440125C083E17FA454000000000206E0ABF2E62DC19FFB3144030189636F8F9454000000000C06D0ABF6F10859CA0B51440F9A79FA6EFF9454000000000C06D0ABFFC50593D19BA14404F7C2A7F11FA454000000000E06D0ABF5CDB82FEBFBB14406CBB090F1AFA454000000000E06D0ABFB54C1DBB50BE1440C2F33DCA01FA454000000000E06D0ABFFA2D6303D3C01440B03D839BDDF9454000000000A06D0ABFD5F841BF3BC21440859BF273D7F9454000000000A06D0ABF24418BDEE5C71440A8903AE615FA454000000000E06D0ABF5629BCA432CB14403BB5495C69FA454000000000A06E0ABF115043843CCD1440D0E29A13EFFA454000000000A06F0ABF17390CA8AED114405BD3C79A3DFB45400000000040700ABF4B784F3B85D31440A97E20B5AEFB454000000000E0700ABFB32359CC01D714405BDBAE2AC2FB45400000000020710ABF1CD37D9FD3D914406870148F07FC454000000000C0710ABFC607018617DD144044274B442CFC45400000000000720ABF4C5EADB3A5DF1440644B3378E0FB45400000000040710ABF0F9E5F7245E2144023CD6D962BFC454000000000E0710ABF160D23AC50E4144094253C1A61FC45400000000040720ABFEA59C9BA3DE514402478C7F8F0FC45400000000020730ABF127144AE9FE7144088497FDC15FD454000000000C0730ABF026F56B2ABED1440CA91630071FD45400000000020740ABF5D78247272F114405CC558E6BFFD454000000000C0740ABF1DF4FCBEBCF81440F1C33515A7FE454000000000A0760ABF79309683D7FC1440DB734D66C5FE454000000000C0760ABF38CBB9C1DB0015401B8EBE3B11FF45400000000060770ABFD445860B55021540146EA9C820FF454000000000C0770ABF6D015EE7A6031540E9A06EDA15FF45400000000080770ABF1E7CDE42A70915409B7837E791FF45400000000060780ABF5C43CA4CEC0C15408EE3E7AD85FF45400000000040780ABF3A64B7E88F151540E5A3DA5169FF45400000000040780ABF1C0EDE39AE181540AB2B8B2142FF454000000000C0770ABF5B05FCB626191540AABEF0F523FF45400000000080770ABFB7A808943B1B1540E5DEB9A948FF454000000000E0770ABF33278D46972215402DBADAD567FF45400000000020780ABF54A82ED03A25154070986A6EB4FF454000000000A0780ABF84477C91D02915406349402AABFF454000000000C0780ABF6973AAE1F528154013ABAE1EDBFF45400000000000790ABF663A48E1F827154017A631330D0046400000000080790ABFE71AD2E11F2915402B8F6BBC5C00464000000000007A0ABF17577B05EF2D1540CA25F7350201464000000000407B0ABFCBC58CAF2F321540D58515866501464000000000207C0ABFFFA925F1F533154040C49674B201464000000000807C0ABF323E7FF1D33515400A2CF070D901464000000000C07C0ABF52F89588993715403EE3A22E2B02464000000000807D0ABF13C1CA99A7391540C0473E296602464000000000E07D0ABF1453CCD5513C15401289DB518F02464000000000407E0ABF19905BB70A3E1540CB9D43D0DC02464000000000C07E0ABFD2750F9B3142154095E5B95FFB02464000000000E07E0ABF6BBBE0FDCD441540E1780DFA3703464000000000807F0ABF95B731B61C4715402B4CF1DA4903464000000000A07F0ABFD13D6182234A1540F2E7E9351803464000000000407F0ABFF8E842B5CD4D154066F68038E702464000000000E07E0ABF8B9B4D43A350154074A4A94CF102464000000000007F0ABF116DC6260054154084F8630E0803464000000000207F0ABF2D07743BE958154057CF84BB4F03464000000000A07F0ABFEB0C17C47D5A154079B6BB525603464000000000A07F0ABF92C6DD5499601540F0E965FD5003464000000000807F0ABFE93F59DA016215407854EFF95C03464000000000C07F0ABFDF0CEE6250651540CF3268488F0346400000000000800ABFA9A4BBD86E6A1540330316118F0346400000000040800ABF20D53FA7446C154073B4A971CD0346400000000080800ABFE9C1CE980A711540C079FD58240446400000000020810ABF3AFAA982847415406C362E1B7A04464000000000E0810ABF61DF6AAFB6741540B1B8FF61470546400000000040830ABF47A9684D4E7A15406881B5D76A05464000000000A0830ABF2EAE8DE4207F1540F4D0AE68130546400000000000830ABF735DFEA7668215401DBC7B7F1D0546400000000000830ABFEAEA9515BC86154088B1C78AD90446400000000080820ABF1A0A0135148B1540CFF183D69E0446400000000020820ABF6D05FFADE68B1540084979726804464000000000C0810ABF95C4E6658A8C15406B00843C300446400000000040810ABF362EA2C9018C1540CFF97BCA0304464000000000E0800ABFB3716F5F6D8D1540180C95FCE003464000000000C0800ABF8FCF9AD1B4901540DFE7BC73A40346400000000040800ABFF084D2A2AE9515400EB95C19A50346400000000040800ABFCF6A57E8DE98154030AEA6B6B40346400000000060800ABFD0A59BEA019D154022A824134C03464000000000C07F0ABFE0BB9E7898A015401FD12D847603464000000000E07F0ABF9367E6903CA51540991DD2E0B80346400000000060800ABF8A86AD0CA2A715404D9B1BB8300446400000000080810ABFDEDB778D6AAC15407B30F8F03A0446400000000040810ABFD6998E491CAF1540A46B33F0890446400000000020820ABFEB09859A91B01540D39E06DBD50446400000000080820ABFB26ADF2978B21540317BC08C7B04464000000000C0810ABF8874587EB0B515400AA8B436E703464000000000E0800ABF63098105ECB9154008C7DBB13903464000000000807F0ABF57D24BFF4BBE1540CFBBFB427502464000000000207E0ABF48F7701BB2C215404299E67F0002464000000000007D0ABF77E38BEDD9C415403C6A8215A401464000000000607C0ABFBAA4EA5AE6C5154049B5DB052501464000000000807B0ABF5C33F1E1B0C71540D0CA81EFC200464000000000A07A0ABFA55BE1EBA6CB1540C0E317582E00464000000000C0790ABFF11F01F188CD1540D9F60FBE2700464000000000C0790ABF094D1C1684D0154059B1EC282E00464000000000A0790ABF242C5AF668D215409F18095E2600464000000000A0790ABFD2CC0B93B5D51540060413362700464000000000C0790ABF03E265F9D1D715409E4A36883D00464000000000C0790ABFA6B4F1692CD9154090240E2D050046400000000060790ABFE4F4B879F5D81540ED0CA445E0FF45400000000020790ABF3F3396E6CFD615409FE6FCDD81FF45400000000040780ABF052AB7F98CD71540D2704A8745FF45400000000000780ABFB42E057B30D81540D3384EB020FF454000000000A0770ABF91403929FFDA1540D71B013519FF45400000000080770ABFDA94F8DA0BDE1540E1944B80DDFE45400000000020770ABFC68FE27BB2DE15408280FEBE5DFE45400000000040760ABF0AA2930FBAE215407247C2E6C3FE454000000000C0760ABFFBAABB450BE715405D2D7AB8DDFE45400000000020770ABF38219BB899EA15403E007AD3E6FE45400000000040770ABF795F10F57EED15400F9B0755B3FE45400000000080760ABFFC524B7A63EE154054191DED4EFE45400000000000760ABFF9B10E00BAF015401641BDD95DFD45400000000020740ABF9C10FC8DB2F51540A4A9A1D289FD45400000000080740ABF076E3112B6F415407469470B6AFE45400000000060760ABF87E79B483EF4154099F2ADB8DDFE45400000000000770ABF19C76A8D25F41540D559508C2EFF454000000000C0770ABF3F47986AD5F3154096D8D49558FF45400000000020780ABFB7E72BE2B5F315407C18CB1077FF45400000000040780ABFC69F27AEB8F31540111B91FC8EFF45400000000060780ABFA12DD36A58F315406C10031D1A0046400000000080790ABF779DC93909F11540B257F3997C00464000000000607A0ABF8A99B38DADEF1540DC75F397B600464000000000C07A0ABFE36AE6E5F1EC1540855B9775EF00464000000000207B0ABF032AAD5DDCEB15401AB681CB2D01464000000000807B0ABF3F131051AAEA15401F37F19CA001464000000000607C0ABF294498642EE915404B9ED48E1502464000000000807D0ABF76877B08B4E515409D25330F9D02464000000000407E0ABFDF00E9066BE215402DD369D00303464000000000E07E0ABF1C58D165EEDF1540EB5F3E875A03464000000000C07F0ABFCD23DC2FE5DC1540549D1DB2B10346400000000080800ABF6FADDF87CDD9154028FED0C12E0446400000000040810ABFBAE9908800D71540DDEEF9178C0446400000000000820ABF9A2E37B455D31540F11BC00EE30446400000000080820ABFCDB0E7AAE8D0154049F792A5230546400000000040830ABF223109A139D0154073B4B2245405464000000000A0830ABF7EF797D79FD015400141A43A910546400000000020840ABF907961CB21D31540671F0B84CF0546400000000080840ABFDD92BBEEC8DA15407B68D85AFE05464000000000C0840ABF5BD5B96FE5DE1540E094C911580646400000000080850ABFE4145009E3E21540334C32398E06464000000000A0850ABF1B8C1F58C3E01540F77DD1CA9B0746400000000000880ABFC988CBCA8EDC15402D72115A1E08464000000000C0880ABF212891D2CDE015405D14BE255D0846400000000040890ABF4C313F3B0AE415405335AFC1DC08464000000000808A0ABF50B205ECE4E71540B49B2DD90609464000000000A08A0ABFC0996E9B9EEA1540963A434CFF08464000000000608A0ABFC5A188C7EFEC1540CF2DD4D1690846400000000080890ABF47FFAAA77CEF1540E5DA65C16E0846400000000080890ABFC4C7079749F3154097FEDDBE5E0846400000000040890ABF888BCEC8D7F5154073115F0E6D08464000000000A0890ABFCB55BF9246FA15408658FC3FED08464000000000408A0ABFA67EED1BC9FD15405545D391C508464000000000208A0ABF06CCEC3119FF154069D13D41A808464000000000208A0ABFF6E3269CF801164002509A389F08464000000000C0890ABFAAF5E91CC6041640A8E5F120D008464000000000408A0ABFB52B69E33A051640E1D7D3ED1D09464000000000E08A0ABF2C67DA28830A1640ED23E5A83009464000000000E08A0ABFDDFFC610E30D1640025EB6A85D09464000000000208B0ABFB541AF6C8B151640319F11249709464000000000A08B0ABF7D8EEFC1AE17164086E4A686ED09464000000000408C0ABFBE726A5DA21B1640EBF151161A0A464000000000A08C0ABF7054A0A959221640962D2D59EE09464000000000408C0ABF534884BB05251640ACD5F8F6090A464000000000608C0ABFAF7327125E27164067F16228EA09464000000000408C0ABF74EE85B51B291640A7DC7945140A464000000000808C0ABFF67CD254F82A1640A9E036CE4A0A464000000000208D0ABF81ECA641DE301640383A4C9D8B0A464000000000808D0ABFD1196A39D23216400DBB9926630A464000000000408D0ABFEDED08D402351640F1400D41220A464000000000C08C0ABF4411173E16381640237FAFFE2A0A464000000000E08C0ABFE2D526DDED3A164092630FA39E0A464000000000808D0ABF95D436C3B93F16400B477283EA0A464000000000208E0ABF6F95E8F2724616405145EF11CD0A464000000000008E0ABF173CA720DB4D1640AA2257BBBC0A464000000000C08D0ABF85767FB2ED501640CE3748D0450B464000000000008F0ABF1F245DC9CF521640885381809B0B464000000000E08F0ABF4790EEEDD0511640FFDD5976EE0B46400000000000900ABFC02B7F877B5316400BB7DCD5410C46400000000000910ABF3DA637C04A57164089DFC24AE30C464000000000E0910ABFBFD68369985B1640ABF221BD640D464000000000E0920ABF0B5F7968B35C1640998D5126DC0D464000000000C0930ABF09621E68A55A1640E09901544B0E46400000000080940ABF8A71A5740C5B16404C7ABF5C850E46400000000020950ABF321D0FF5935B164062A4CC63EC0E464000000000E0950ABF7EE2CEC1F45B16406E3242E5440F464000000000A0960ABFD3E6532AD861164088C4B8EA780F464000000000E0960ABFF2847A093D6516403271E79C3C1046400000000020980ABFAA73E2A8B069164056ADCE3DA71046400000000060990ABFAEDC8CDD446A16402BCEC75B7311464000000000E09A0ABFCA9B667FD46C16404C374A9A5D12464000000000A09C0ABFFC01C3A3916F16404C168227BA12464000000000209D0ABF317BFFF3E86C1640C22AA83A3613464000000000009E0ABF5697F9FF6D6A1640C7E114749513464000000000A09E0ABF1D3FB28D6469164014B670B5C113464000000000209F0ABF91CEF23C516C164017CA5F0DB013464000000000409F0ABF3C82159C297516407D5C79406A13464000000000809E0ABF141998807C781640886AD0DA6513464000000000609E0ABFE6218FFABE7C1640E7B8AA884613464000000000409E0ABF7BBE0CDB6E8016404E7258D24113464000000000409E0ABF7C843304778516400CCFFDE73E13464000000000009E0ABF706322EDB7891640A4748DE14613464000000000409E0ABF1CB4BDD2648F1640508D478F2413464000000000C09D0ABF83BC33D73B931640E4832A301913464000000000E09D0ABF33AE83774D9516401292ED86FB12464000000000A09D0ABFEE04698441941640E8958694AF12464000000000209D0ABF722C333114961640259E34811112464000000000009C0ABFC780DC7DAA9616408215E7ADBB11464000000000209B0ABF39ED71D801961640710D4DDD4811464000000000A09A0ABF2569AA4D5B9316402417FF6D0911464000000000E0990ABF57049E74BE901640A374A449FF10464000000000C0990ABF2383E2C2A98E164096A1609D921046400000000000990ABFDA9A0542568F164055A38056441046400000000080980ABF48C85469B28E1640FE081385F80F464000000000E0970ABFD47BBC03778E1640804672A5AA0F46400000000060970ABFCDDE8950C88E1640E1D8AD76520F46400000000080960ABF0321D51501901640D4A51C63FC0E46400000000000960ABF5E8DE159E88F1640DF2C3369790E46400000000020950ABF5C463BDD4C8D1640D2CD16133F0E46400000000060940ABFE2D250F3628D16407CAA08390C0E46400000000040940ABF392FC290798E164021A6DF28E20D464000000000E0930ABF375F1D0E598F16407E2D7CE8B70D464000000000A0930ABF766951DEB98F164052BAD0B4790D46400000000000930ABF2B7A926508911640BF822A74400D464000000000A0920ABF7B6668C3829116400B9F72F0130D46400000000060920ABFE58FE140F99016407A23B761DE0C464000000000E0910ABFB7CD58051A941640859A4756E10C46400000000000920ABFC782848D4F95164056D7BF6A9D0C46400000000080910ABFF0D5BAC1979516401004605D6D0C464000000000E0900ABFC5EE3BA3A9961640D734D0DF4C0C46400000000000910ABF7133A525489716406941C679140C46400000000080900ABF127E3D84D396164018BD3CFFDC0B46400000000020900ABFEC49334D50981640826BB7F9970B464000000000A08F0ABF55C654621C981640AF7F7A894E0B464000000000E08E0ABF0EA26ACE9F95164075ABA8CB650B464000000000008F0ABFA65E7563E7931640C3DCEFDC670B464000000000208F0ABF77FEA8AE28921640AE10B302590B464000000000208F0ABF2CD091E3ED901640CC68B8724D0B464000000000008F0ABFCA5E321738901640E8B5220D320B464000000000008F0ABFEF7E0041D38F16406AFCEE2A140B464000000000A08E0ABF6D8F2C5B958F1640D4F319C5F10A464000000000808E0ABF53917E8C179016407F69CF42980A464000000000808D0ABF004C0D0A3E8F1640553038B6480A464000000000008D0ABF4F699BD06A8E1640B590560D0A0A464000000000808C0ABFA083EF35AF8E16408AFC37AFCF09464000000000408C0ABF5C19C459448E1640621F49508C09464000000000A08B0ABF6EF5ABA1598D16403108FC5D3A09464000000000E08A0ABFC2035E2DA08D1640135EE51ED608464000000000408A0ABFF8432BDD328F1640FFE4DE519F08464000000000E0890ABF7FFB059E548F164061760CD2490846400000000020890ABF71B673F6018E164081F07B7CE70746400000000080880ABFE526AC8B0E8D1640250D23868807464000000000C0870ABF0E601446E38B1640750B20B42A07464000000000E0860ABFB1884F9E218B1640DB4C8733ED0646400000000080860ABFA0840B96B68A1640A19C6A06C10646400000000000860ABF32EA7401A58A16400E3929479B0646400000000000860ABF3FC5BDF9F28A16400B5E7CA06C0646400000000080850ABFF0E24ABC6C8B16407B1E259E370646400000000020850ABF96B883AF508D16401203F4C5FE05464000000000C0840ABFD0D416B58B8F164030F0790CC60546400000000040840ABF27B3AF61EB92164072263467A50546400000000000840ABF022CCAE500961640AB19FA118605464000000000C0830ABF34222E96D997164083843FC25705464000000000A0830ABF77917FBDF698164040894B0A3B0546400000000040830ABF557948E8689A164043F103560E0546400000000000830ABF94988F547C9A164068546E59E504464000000000C0820ABF6D1D21ECEF9A16406B05FF2DA70446400000000040820ABFC6D167A7299C1640B37E61AF590446400000000080810ABFA39C2212909C16409503797C450446400000000080810ABF874DFC2D999D1640DDD4E84F240446400000000060810ABF9AB12F57A29D1640A44BC20FFB03464000000000C0800ABF0C9A291C979D16406F1B38F0DC03464000000000A0800ABFE135BF6DFE9D164025E577D7A90346400000000020800ABF26637B4EE69D1640B2FB0A256903464000000000A07F0ABFFD8713348E9E16406B5107B64903464000000000A07F0ABFAE33B47BE29E16406FF086652503464000000000607F0ABF33511D99869F164037E605C71103464000000000207F0ABFB6909EFDEA9F164091258EBF0203464000000000607F0ABFAF0728CEA89F1640AEA226EDE902464000000000E07E0ABFA3BAB8BB779F164046BADA00D402464000000000C07E0ABF9448BF91A89F16400A511633BF02464000000000A07E0ABF357A8C32C09F1640D74AC2D7A602464000000000807E0ABFB75FEB0308A01640FE1C6F208C02464000000000207E0ABFA535F7998AA016406DB2D45D7602464000000000207E0ABF102C97D7B6A016405FBBF9625402464000000000007E0ABF884E920565A01640AC6AF2A61102464000000000407D0ABFF49E980041A01640D407E4DDF201464000000000407D0ABFF524EA205B9F16409FAD7ABBC301464000000000C07C0ABFCDB10B4EA39E1640746A0F9B8B01464000000000407C0ABF25ABEC07589E1640956B1C3C5B01464000000000C07B0ABF626AD2A6679E16409856D1462E01464000000000807B0ABF8A800EAF509E164077C973990601464000000000407B0ABF0C8650B2AA9E16402376A3EBDA00464000000000007B0ABF80D2E6A3B99F1640EAC89CD3B300464000000000A07A0ABFD6BDD5BD38A0164058C23CD96900464000000000407A0ABF5BBD8870A69F1640582507862900464000000000A0790ABFD990CC08639E1640BEC2AD7BFFFF45400000000060790ABF4EE871E5C49D16404C96D6BCD5FF45400000000000790ABF4705BCA1759D164016B23711BBFF454000000000C0780ABFEDE629C4429D164063CBB70B85FF45400000000060780ABFDA1548C1319D16409F7E20875DFF45400000000020780ABF53F77CEA169D1640D20AF6DB3DFF454000000000C0770ABF36EFB653AA9D16405EF5A54932FF454000000000E0770ABF0C8FC529FF9D1640EBDCE38425FF454000000000A0770ABFE680B7016F9E1640B8275E8A1EFF45400000000080770ABF00B494443E9F164084C84B2312FF454000000000A0770ABFAFB07DDFDF9F164046D070F50DFF45400000000080770ABF52C1693359A01640EDB591600BFF454000000000A0770ABF591BCB19F2A016401C524AC705FF45400000000080770ABFED8AF64009A21640B59B60CD0AFF45400000000060770ABF71DD0162FEA216401F6D2C450CFF45400000000080770ABFA066A01D19A416407D8056DF1AFF45400000000080770ABF575FE60392A51640C2E8EEB235FF454000000000E0770ABFB2DAB660A9A61640421F006325FF45400000000080770ABF91E3D04A26A516401876F92CF7FE45400000000080770ABF9E12848AC0A41640537A44A1E4FE45400000000060770ABFCB73B51EE1A31640A2C59E7CDCFE45400000000000770ABF0E0B619BE7A21640E3A24A42CFFE45400000000020770ABFFAAE624E3BA2164046E0A8C2B6FE454000000000C0760ABF38C7BB89C9A116409AF7B3C5A1FE454000000000C0760ABF700FF8D821A11640098AFAB27FFE45400000000080760ABF5C5B4F8C54A01640EBADAC6E50FE45400000000020760ABFD4C8C95AEA9F16407C3EF0AE3AFE454000000000E0750ABFBE3B97F44E9F16404212C09B23FE454000000000C0750ABF373F2693519E16402807BF361FFE454000000000E0750ABF2286BBE1B29C16401924B15014FE45400000000080750ABF03EE17652F9A1640DEE118881FFE454000000000A0750ABFEC8718FFAC9716402E994A2A40FE454000000000E0750ABFA582833DD79716406BD12AB927FE454000000000E0750ABFE9BAF8C7AD971640415054620EFE454000000000A0750ABF3863D1622D96164044E512C2FEFD45400000000040750ABFBDBEBCC9DE951640E118B864E8FD45400000000060750ABF8066391D639516401233B267C1FD454000000000E0740ABF4C7592D2E694164096109977A9FD454000000000A0740ABF40124803859216409301EE979EFD454000000000A0740ABF56C8F8CBFE9216402AEE916F8DFD45400000000080740ABF910704B230931640C02C5FE069FD45400000000060740ABF434231F54F921640F4A835F947FD45400000000020740ABF99717444AD91164063F21C1A33FD45400000000000740ABF74D0B373A3911640C12964A218FD454000000000A0730ABFC59CC26531921640AAFF498DDFFC45400000000040730ABF1DE165C845921640B6562962BEFC45400000000020730ABF5FAE9108C1911640CEEB0713A2FC454000000000E0720ABF31B148DB35931640007221A975FC45400000000080720ABF0B000B61CB9316407173FF0F51FC45400000000040720ABFDBAA085C6C94164096F8BA0129FC45400000000000720ABF1BC574E9A0941640057B7C1618FC454000000000C0710ABF5F497C9DC49416409651753DFBFB45400000000040710ABFE3011425399516407A1296B3E5FB45400000000080710ABF2BB174877E9516407BF874ABCAFB45400000000060710ABF495D7178599516402BF40329AEFB45400000000040710ABFA4CE6C8AFA9416406EEC7CFC95FB454000000000E0700ABFD0EB67AFA79416401B07273C7AFB454000000000A0700ABF9107687E1E94164078A4D5566CFB45400000000080700ABFEAAB1F26DA931640805EDD4F3FFB45400000000020700ABFFB4B257D7C931640B650A0692BFB45400000000040700ABFEE6E95EC699216406CC8C71900FB454000000000A06F0ABFDEA1A82E799116404D4656F5D6FA454000000000606F0ABF6B40786EA2901640BBCBC57CBBFA454000000000006F0ABF9B574ECF228F164095E8777E96FA454000000000E06E0ABF9AB9D026208D16402F4C66E74FFA454000000000606E0ABF62CDED60AA8C164090A299DB2EFA454000000000206E0ABFD3648BD39D8C1640ACDB01EF0CFA454000000000206E0ABFCC9578FAC78C1640F4ED5925EDF9454000000000C06D0ABFFF580A934F8C16402C1302B8B7F9454000000000206D0ABFA35CC1DFB48C1640A8F2F9587EF9454000000000E06C0ABF04A13F1B698B16404BCC673756F9454000000000806C0ABFE3765EF13D8A1640220560A83EF9454000000000606C0ABF8D0EEE6AD089164058025D7C10F9454000000000006C0ABF7D1FF17648891640D14DBE64E2F8454000000000E06B0ABFC73D241DE78816402166CFD8B8F8454000000000606B0ABF34E8F179B78716404792FE008EF8454000000000206B0ABFE77D18B9C78616405D7BF2C35AF8454000000000A06A0ABF1115D1520E861640BE9D0A9B29F8454000000000406A0ABFB228462FBB85164055FC5D09F4F7454000000000E0690ABFA0A200BE5E851640768FE7BEB0F745400000000040690ABFE011C98DAD85164003BF4F088AF745400000000020690ABF418AA282078616406C38936254F7454000000000C0680ABFE07DCBC321861640475251EB24F7454000000000A0680ABFD330AF8281861640322EE0240DF745400000000020680ABF5C4C243F6A871640844684FBF3F645400000000020680ABF10626F9B0D881640D28AF38CE1F6454000000000C0670ABFD96AC22B3B8A16401A83C22613F745400000000020680ABF4D2ABCBB328B1640671B6D2631F745400000000080680ABFDCF33027178D1640156F202550F745400000000080680ABFDD55FD3FD98F1640818E44692EF745400000000040680ABF866411D0B491164046ACB4E31BF745400000000020680ABF3593746AD49216401DE0A3800CF745400000000060680ABF19F76A69FC921640871CE616DFF6454000000000C0670ABFA8F2E9DB5693164090491FE8BAF645400000000080670ABF0A12EF11A4931640C78C00B38BF645400000000040670ABF405C430C759316403F576D0E73F6454000000000E0660ABFA11B099FEA93164055D6EA8A4AF6454000000000C0660ABF6A515CCE66941640922365A135F6454000000000A0660ABF8623A75D4C9516402F02CFB525F645400000000060660ABFDB1FC24730961640AD0550160CF645400000000080660ABF62D531064C971640F6A13571F2F545400000000020660ABFAC09688396991640CB5F223BF3F5454000000000E0650ABF3891BE3F5B9B16409DCCD688D6F5454000000000E0650ABFC2B93A3F499C16404F1F9446C1F5454000000000A0650ABF5B37B4DB339C1640E5464E5AA0F545400000000060650ABF47B7FC26029C16407CDA076F81F545400000000020650ABF715E61879D9B164079FD2AA070F545400000000020650ABFB56160945B9B1640F7B3FA1158F545400000000000650ABF69262665AE9A1640CA57064137F5454000000000A0640ABFC7085C305F9A16405C80709D13F545400000000040640ABFFD7CE50B499A1640072EA283F1F445400000000040640ABF4C2AF426919A16402D6A0F19CFF4454000000000E0630ABFC873F592629B16403950544BACF4454000000000A0630ABFBF661A98EB9B16401E220AD581F445400000000060630ABFEE4A4E903C9B1640BA2C5D845FF445400000000060630ABF6E863726199B16406396473033F4454000000000A0620ABF47B3345FF69A16403C2DD09108F445400000000060620ABFB6E368C88E9A1640BA9BBFE0D8F345400000000020620ABF9AB2C997019A16407A9EB8FCBEF3454000000000C0610ABF6EAA313C24991640D9488FEC9AF3454000000000A0610ABF645802C2779516408C1B4CB228F3454000000000E0600ABF74A6EEC48596164066A0E636EBF245400000000000600ABFA36864C171971640786E643FB7F2454000000000C05F0ABF000F74F7B098164049534A8197F2454000000000A05F0ABF95A22DA95B9A1640DA7127B481F2454000000000605F0ABF054627A77C9B164075797A9676F2454000000000605F0ABF27C9782C779C1640564CF9D869F2454000000000205F0ABFF437AB88DE9D1640AF73CAC969F2454000000000605F0ABF08C2AF7D0F9F16403964AA9957F2454000000000205F0ABFB107D3DC54A016401A1A95B623F2454000000000C05E0ABFEF28FD52DDA116409035D45FFEF1454000000000805E0ABF9D1C0C6C97A31640C2284722CBF1454000000000205E0ABF22F073ECADA61640792F26BFAAF1454000000000C05D0ABF06F650A1F2A81640C46C8C5C85F1454000000000805D0ABFD0573C877BAA16404052625146F1454000000000405D0ABF732C041721AC1640183A45A718F1454000000000C05C0ABF568FC00B4BAC16406A0CB85AF5F0454000000000A05C0ABFCEA0FD09B2AC164040E9E2F5D2F0454000000000405C0ABFB7F2F14ECFAD1640DE81B0FDC5F0454000000000205C0ABFC3D96C805FAF16401843ABC2C2F0454000000000205C0ABF75E32249C8AF1640913FCAA0D8F0454000000000405C0ABFBAEAF27507B41640BA28C5A1E1F0454000000000205C0ABFFF0C79AF71B516405AFB0026FFF0454000000000605C0ABFE5F71C2DFFB81640C7592DEC19F1454000000000A05C0ABF2F65B56A6DBB1640376BE67827F1454000000000A05C0ABFB6061C33ECBD1640A47FCD0812F1454000000000C05C0ABF2A24564C3FBF1640BC5683430AF1454000000000E05C0ABFE10B370C6DC016402FA2114001F1454000000000A05C0ABFE36ABF68E6C116406C1E2240E9F0454000000000A05C0ABFAD665C58ACC11640792772BBD9F0454000000000605C0ABFB701E4C39EBF16408AA96372CBF0454000000000405C0ABFFE4CB8E5E5BD164075498E6B9EF0454000000000C05B0ABF9DA0705E10BE1640E7B6BC9570F0454000000000805B0ABF5FF71E23DDBD16406159DC3E5FF0454000000000405B0ABF611392A2ADBC1640728610B341F0454000000000205B0ABF00B9ADBA85BC16401F0406671AF0454000000000C05A0ABF61151F4B34BA16407B4F3A8408F0454000000000C05A0ABFC9E64B3CB8B9164006981C66BFEF454000000000205A0ABFA578203C02B8164063B909E6B9EF454000000000205A0ABFD4F54605ACB5164037DAF7289BEF454000000000C0590ABFD103A27C6CB51640C42BDBBD77EF454000000000C0590ABF14F4B6A837B616403BFA9CB739EF45400000000040590ABF256741BCFAB7164006004A1420EF454000000000E0580ABFD62D3EF271BB164087F17643E5EE45400000000060580ABFC287FB7B65BE16408E068F49BCEE45400000000040580ABFFE1158898CBD16400D4255D191EE454000000000E0570ABF497000B2C0BC1640D5ABC40064EE454000000000A0570ABFA8E6EE297CBC16405C50A0C43DEE45400000000020570ABF25543DDC5EBC1640DAC3A3B90AEE454000000000E0560ABFB76928D7EABB1640F3D7112BDCED45400000000080560ABF9C1A0C298FBB164015A70FCAA9ED45400000000020560ABF3484E612AFBB1640536C0FB374ED454000000000A0550ABF5FE2A1A933BC16402403CE6045ED45400000000040550ABF0F705F68E0C0164026AC5CD4F3EC454000000000A0540ABF9CAA7A3CCAC116404F31F3E0D8EC454000000000A0540ABF9091F55054C316405D4B7B1AB2EC45400000000040540ABF6D49F8A031C31640AB91A9D98AEC45400000000020540ABFBD71EA989BBF1640306860EB85EC454000000000C0530ABF2A819674AABA16407C5C08D586EC454000000000E0530ABFBDCC1799C4BA1640CB29675249EC454000000000A0530ABF318D519CD1BA164036030C2236EC45400000000080530ABF419A234D63BB164077EEFE0107EC454000000000C0520ABFA8BF63F095BC1640052025B3AEEB45400000000020520ABFAC12C4E423BC164001A3FE8EB1EB45400000000060520ABF2E2E26AF3CBB16409DF7051CAEEB45400000000040520ABFDE180C4FDAB9164044E2F18BADEB45400000000060520ABF5CED830A9DB8164067427BAAADEB45400000000040520ABF22F8780C0CB816401D98430FA7EB45400000000040520ABFFAE004D46AB7164020A27BDFA5EB45400000000060520ABFB7EAD47E77B61640619648BDB9EB45400000000060520ABF857A22E1EAB4164007173658CFEB45400000000080520ABFCEDA4570E1B41640C7CAFF1AA9EB45400000000060520ABFEEF03AB92CB51640803B7BA889EB45400000000040520ABF6ABF197A01B51640E7C0D25C5FEB454000000000A0510ABF1DB4B947DDB41640B9E633D54EEB45400000000060510ABF2E7623769AB41640DC3EE5F447EB454000000000A0510ABF36771E17DCB2164096C87EE527EB45400000000040510ABF6F326192C9B11640ED6267080DEB45400000000020510ABFA81005567DAF1640B7C7B0FA0DEB45400000000020510ABF4207A00980AD16404F2B5DC109EB45400000000000510ABFFD95A86297AB16401C78A193F9EA454000000000E0500ABFC5E49C3B38AA164058F5EAD5EAEA45400000000000510ABFA220F2B3B7A81640600979A3DCEA454000000000E0500ABF7DC94BB672A716403D4C8730D4EA454000000000C0500ABF19ADB4C885A616404C48468BC6EA45400000000080500ABF5689CA5E9DA516401017EB00B0EA45400000000040500ABFCB2B4880C7A41640F1DB16D695EA45400000000060500ABF43FF1D45D8A31640C3BBBDF881EA45400000000040500ABF4D82321D4FA216405D34C3E260EA454000000000C04F0ABF8BF29BB906A216404718857747EA454000000000A04F0ABF7EA4BF14DCA116404C2B025E2DEA454000000000804F0ABFF15937FBD6A116408624C2A91FEA454000000000604F0ABFB8ED9AEB16A116400A06B428F1E9454000000000E04E0ABF64ABC0167B9F164094A08343E8E9454000000000204F0ABF066BBDD1E39D1640292AD42EFDE9454000000000204F0ABFD56E6BF0C09B1640CDAF480144EA454000000000A04F0ABF7A6F07C8799A16404A10DAF26CEA454000000000E04F0ABFEFD84EE5A6961640514478B374EA45400000000020500ABF20317AC838931640519FCD3170EA454000000000E04F0ABF9BF10CAA6391164053B8CA5D5AEA454000000000A04F0ABF7D720A4FAB8F16402FD888F315EA454000000000404F0ABF474A85D34E8F164083E163BB03EA454000000000404F0ABF10DBD893348F1640AF2B9A85F2E9454000000000004F0ABF35C4CA32DF8D1640AF422959F3E9454000000000004F0ABF1563F890728A1640418E486FF4E9454000000000404F0ABF2E5AFC9784881640D14426760AEA454000000000004F0ABF1A99B06F4A871640E0C429810DEA454000000000404F0ABF8BB48B2A83861640D7C6969D1AEA454000000000604F0ABF50CAC3698085164077CF615827EA454000000000604F0ABFBE180DE1E1831640B921D7033EEA454000000000804F0ABFC2DD1DD163821640428D6A9F69EA45400000000000500ABFF376D1C3B68116404331E5BB6AEA454000000000E04F0ABF90B6CFBA3E7F1640D1A71F425BEA454000000000E04F0ABF6650F66DE77C1640DB4364CD26EA454000000000804F0ABFB83AA908C47716403562866E3EEA454000000000804F0ABF603D07FA7E75164037A4A2C9E0E9454000000000A04E0ABFEF08516FD374164070E0B372EAE9454000000000E04E0ABF860493D51D721640F67A70B2FDE9454000000000204F0ABF5E4E262477701640D0A04ABC01EA454000000000204F0ABF85CF8403D56E1640104897AC06EA454000000000404F0ABFC37E61BE6B6D164054F5950803EA454000000000204F0ABF11B3CB41EA6B16400F6E6E1408EA454000000000204F0ABFA5234B4A516A1640605F463AFBE9454000000000404F0ABF2ACAC3BD3A6916405F1AA1BEE2E9454000000000E04E0ABF7EFFFFE4F46616409C3595A5BBE9454000000000A04E0ABF9B0A00D27D641640416EBCA2E9E9454000000000E04E0ABFE47E9BE5C8621640E42ECD203BEA454000000000A04F0ABF1DE05F3D4C601640CF5356914BEA454000000000804F0ABF5D4C62B2185F16407419CCD846EA454000000000C04F0ABFB0952C5F515E164019AB3ADF31EA454000000000404F0ABF4ECBA7F50C5D16400824ED3EF0E9454000000000204F0ABFA5015A49185B1640D8F9DC5BC5E9454000000000A04E0ABFBF162828E95916402D102C8CD7E9454000000000E04E0ABFBDA4F118B8571640434B3EEEE6E9454000000000004F0ABF6D3D2C1E9D531640C5E7A46114EA454000000000404F0ABF19EEBD69484F1640BC4BCC8945EA454000000000A04F0ABFD8541BF36B4B1640D7710AE344EA454000000000A04F0ABF64A70CB3054916402F11F9442EEA454000000000604F0ABF38F28459E3451640C315708EFBE9454000000000004F0ABFC930A758F34416409A3DA2F9CEE9454000000000E04E0ABF420944571945164076C7876378E9454000000000004E0ABF00493B319F411640560AC010F6E8454000000000004D0ABFABFA25236D3D1640CA1DAEE02BE9454000000000804D0ABF4E41C1ABE33A1640BA4A51F5EAE8454000000000204D0ABF2FA6B92E4C371640C34E8E5DC0E8454000000000C04C0ABF6681FCC8523416401F6118B19FE8454000000000604C0ABF732312671E3316405D6F12AB7FE8454000000000404C0ABFE2B054FBDE31164081AECB8B81E8454000000000404C0ABFD266E6FDF22E16408261C96A90E8454000000000604C0ABF4780C1960D2C164060CDD5039AE8454000000000804C0ABF67B05CF19629164048EE9159A4E8454000000000804C0ABF544C663500271640CEE1174FB9E8454000000000804C0ABFCC96C7BE74251640CB7ACC38C3E8454000000000C04C0ABF6EEFEEA66B2216401EA085B7B2E8454000000000C04C0ABF530C24D6EB211640B07BDC87B3E8454000000000804C0ABFEF5D938ABB20164003F71620C9E8454000000000A04C0ABF08B2A2C3331F1640C2AB52C2E5E8454000000000004D0ABF8B93C255541D164056BB5E58EDE8454000000000204D0ABFBF47C4548C1A164024DA651DF9E8454000000000204D0ABFA6B12B15291716408DC49C38FEE8454000000000404D0ABFF81423177B1416408CE87B1EEEE8454000000000404D0ABF9B1C1DE7CE11164010234107E4E8454000000000004D0ABFF3BAD1C5F50C16406B73EC67CCE8454000000000C04C0ABF89452623B00B16402BA070B1D5E8454000000000C04C0ABFA7F40655F00A164080FC5982DFE8454000000000004D0ABF754D747C980916403B3386BADEE8454000000000E04C0ABFCD9A71230A09164000F5834DDBE8454000000000404D0ABF1D0A2EA321061640267145F8D2E8454000000000004D0ABF20107E9BA9021640236D02A3B8E8454000000000C04C0ABF1CAA9E41300116403904149DBDE8454000000000C04C0ABF2A71BBE1C9FE1540E12CA234B8E8454000000000C04C0ABF18DD3ED678FC15407B599CECB6E8454000000000A04C0ABFF57B110DBEFA1540BCDE5704CCE8454000000000C04C0ABF5FCAE9FDBAF9154016F420D9C3E8454000000000C04C0ABF4802072E77F71540B1EDCEA6BBE8454000000000A04C0ABF07A7B10467F515405B1FB9C4C3E8454000000000C04C0ABF20A09BD62EF315407BAC5B94B6E8454000000000A04C0ABF3315F2A876F1154086863FD1BBE8454000000000804C0ABFC4E8569D44EF15403D0280DEB6E8454000000000E04C0ABFD8B3BCFB6FEE1540D66C521FAEE8454000000000804C0ABFAB6A5AC860ED1540BD5B844BABE8454000000000804C0ABF07B51B3117EC15400C3A9F56A8E8454000000000A04C0ABF7CB50B821CEB154011FA148C94E8454000000000804C0ABFA534B2EA81E91540F1B49C7C7BE8454000000000404C0ABFBC10228969E81540FE6056F470E8454000000000204C0ABF7570FA3874E61540E227C9DD81E8454000000000604C0ABF8F0F4592DCE41540927979775DE8454000000000E04B0ABF1DA7864482E3154011E7967166E8454000000000004C0ABF8785EA8E0CE01540AD68FC0867E8454000000000204C0ABF08DCA3C131DE154071B3037C64E8454000000000E04B0ABF41651C788FDD1540754F5048ADE8454000000000A04C0ABFF3F8259F71DB1540E0BD81A4C3E8454000000000E04C0ABFEBADEA9175D91540ECC90608E6E8454000000000004D0ABF4689D63EE0D51540C7C9E77CDAE8454000000000204D0ABFAB2A6F3046D3154066DF8D97F6E8454000000000204D0ABF', + ST_Force2D('01030000A0E610000001000000C7030000AB2A6F3046D3154066DF8D97F6E8454000000000204D0ABF70E8A6C955D31540721A441022E9454000000000804D0ABF1862F5679CD315408DCF200F9BE9454000000000204E0ABF6FBE00BF35D4154075A28EA8F1E9454000000000004F0ABFA32AF943DCCF15409C7E90CC43EA454000000000604F0ABF2513C9E3F5CC1540CC58AF099EEA45400000000060500ABF50059E5715D01540DC1163E236EB45400000000080510ABFDF4A266CB0CE15407F203611BFEB45400000000040520ABF7EA69A827ACA1540CE9A6BF8DCEB45400000000080520ABF74A9C7B4FFC515408904ACE00BEC45400000000000530ABF25097D9DD1C215401962A9F43FEC45400000000060530ABF0A1343AA26BF1540F3945D1E0CEC45400000000000530ABFF9D92509ECBC15400CAFC3163CEC45400000000040530ABF8E58E019ACB51540CF770CC557EC454000000000A0530ABF26B5C01FB7AE154037AC102C61EC454000000000A0530ABFC2658BCD5BA91540BA1C350764EC454000000000A0530ABF0A81F4DC66A21540D44F50F662EC45400000000080530ABF4C94B4581F9A1540CFC59BB060EC45400000000080530ABFA1E9279976931540C4B2FAA84FEC45400000000080530ABFC0C3A181619015404833460427EC45400000000020530ABF8D8F08FAB78D154003327BEC05EC454000000000C0520ABFDBFEC8E4188B1540FABC2E45D1EB45400000000080520ABF3FEF8FFBBD881540DE6EF759D0EB454000000000A0520ABFD9EB3523BB861540BECD8380FBEB454000000000E0520ABFFB5F724B81821540E22E7BE22BEC45400000000060530ABFC90BCEFF1D801540CA054D645AEC454000000000C0530ABFEDA1E7C4ED7D1540826E4A0A07EC45400000000020530ABFD53A8B0F6178154090EB860516EC45400000000000530ABFB425E29984721540BB4A121AB4EB45400000000060520ABFB79D1341BD6F15406F125DEF97EB45400000000060520ABF9C9E74979A6B1540DC9AE16E84EB45400000000020520ABF5FDDDB35B46B1540339A0BEA33EB45400000000080510ABFB6B14D36B268154094C389961BEB45400000000040510ABF9DB9A0B089671540D838D06AFFEA454000000000E0500ABFF7FE8EBBE7671540F5B3215CCBEA454000000000A0500ABFAB4327491D661540B4D5B396A3EA45400000000060500ABF0566B49942651540C5DCD2904EEA454000000000E04F0ABFB482F86C906715406B29C0E4D9E9454000000000E04E0ABF6F59AA6FCB641540D58B9CAE8CE9454000000000204E0ABF9799C652296115403B000F5893E9454000000000604E0ABFF7995B442B5F1540904D9D47D1E9454000000000C04E0ABF5A565AB0D15B154026E9DF94D3E9454000000000E04E0ABF89D72AFD7958154002FB3591EEE9454000000000404F0ABFB902B545475615408E6EE960FDE9454000000000204F0ABFCA3CE47E69551540F8909917F5E9454000000000004F0ABFE39CCC2398541540276D49F8C2E9454000000000A04E0ABF53DF3D1095511540EFC785A650E9454000000000E04D0ABFEFFB845E4D50154079638B571EE9454000000000804D0ABFEFC6AFEABB491540C1279E9DD3E8454000000000004D0ABFEE5161DFD348154048E7895D6DE8454000000000204C0ABF8DCCF278F9441540F007B06908E8454000000000404B0ABFF19B0F8EE2431540EE950930BCE7454000000000E04A0ABF72A21260054215405CDBDED0A2E7454000000000804A0ABF0759792D373F1540481D9DC280E7454000000000404A0ABFF8617AD6803D1540E5C8807364E7454000000000404A0ABF0F1B657C813C1540AA8E9CA047E7454000000000E0490ABF1C89F2C1483A15403C4DF47B52E7454000000000004A0ABF429CC1FA613815406716EF6833E7454000000000C0490ABFE2D5360992351540745FC6373DE7454000000000004A0ABFA0DCEAA8E63315408573467D29E7454000000000A0490ABF2A74D65E38321540C29A7D7D4CE7454000000000E0490ABFAD67B0885E30154086B6F15D47E7454000000000404A0ABFFB72335EDA2E154057A0792C45E7454000000000204A0ABFA48B3FA78F2D154063FE975747E7454000000000E0490ABF783A51A9202C15401D601C1F45E7454000000000E0490ABF2C81862DA52A1540C502F7A748E7454000000000204A0ABFB716A96D6129154083EC03D333E7454000000000C0490ABF249DBD501628154003C8C25C1EE745400000000080490ABF1F51E3E017271540059BDD2106E745400000000060490ABFD768879812261540BA55F8FFF4E645400000000060490ABF43B3F1F5A0241540C0F7595CE5E645400000000000490ABFEF1B69AEC4211540FD95FA43BBE6454000000000A0480ABF80692B56E52015402A8B338AACE6454000000000C0480ABF7D995FB2C81F15400BC8F7B5CFE645400000000000490ABFC9E3F7198B1E154075F02201CEE645400000000040490ABFE4A10AA91A1D1540C5E6F9A0DDE645400000000040490ABF38F61956161C15408A2D8E46C9E645400000000040490ABFD4DB0FC8191B1540EBC031CAB6E6454000000000C0480ABF90311D056E1A15401EE48B3DA4E6454000000000A0480ABFA493D7B188191540270FD16877E645400000000060480ABF2A1132DC63181540320564666BE645400000000040480ABF6761A456E2161540759E85D35BE645400000000040480ABF551133601D16154056C4E8565CE645400000000020480ABFA9CAEF6A9E141540717CF0606BE645400000000040480ABF7F5C59323A1415400853E4377CE645400000000060480ABF8099AF04D3131540B052B9C684E645400000000060480ABF901A861016131540A4CFC21DB5E6454000000000C0480ABF95C15B4C8F111540F778DFB2AEE6454000000000C0480ABFE45DF4BEE11015400503A406ADE6454000000000A0480ABF9C5891A0DE0F1540C03C3CD1ADE6454000000000C0480ABFA5948704A30E154053D8080FA8E645400000000060480ABFACE5B0B0F30C154002B2B117A0E645400000000080480ABF6B56A405B70B154095E405F996E645400000000080480ABF2A8C3C73760A1540C425D5DC8DE645400000000060480ABFD79E64F84209154017DD56FD86E6454000000000A0480ABF7A394169D9071540B25D111B7FE645400000000080480ABFDD26D21A92061540B404746779E645400000000060480ABF5BB7EA9667051540B6A13F1A75E645400000000060480ABF757F8FBA23041540DAF588EA6DE645400000000040480ABF6AA0E81EF402154043C2DBD965E645400000000040480ABF84B472F3DC011540890607C85DE645400000000040480ABF3DF15DFFCD0015408136C8E454E645400000000000480ABF3760E651D8FE1440379E588241E6454000000000E0470ABF6CC0964BBBFD14401DAC404B35E645400000000000480ABFCBCE021CD2FC14401842DBF422E6454000000000E0470ABFCBCE5B32DEFB1440CDBC25DE15E6454000000000A0470ABFD9C3264A04FB1440DCC0F6B00BE6454000000000A0470ABFBD7EB0F161F91440BAE19011FBE545400000000080470ABFB78C1E2D87F71440904687C7F8E5454000000000A0470ABF37ADD1B090F614405FDF494CFAE545400000000080470ABFDD900CD033F51440A1C5019DFDE5454000000000A0470ABF407CA1D0FBF3144006918E1800E645400000000040470ABFAECB985CC3F21440325A922A02E645400000000060470ABF02A1738FB6F114400F4173770AE6454000000000A0470ABF1D3B3845D0F01440AAD0D72617E6454000000000C0470ABF4F24529250EF14405D2796D51FE6454000000000A0470ABF491F223DB4EE1440F17A8D0F21E6454000000000C0470ABF93BB6C4CABED144027EFBCC11DE6454000000000E0470ABF7919E1D3C1EB1440067F220914E6454000000000A0470ABF90983C80FDEA1440E9D9BB290DE6454000000000C0470ABFC84E6B0085E914401AE1855F08E6454000000000C0470ABF9505188262E81440B2F7EB8102E645400000000020470ABF76D3D919DDE61440D2EC7C1AFEE5454000000000A0470ABFED4912C0EEE41440C8FA94C5FDE545400000000080470ABFEF245B6674E31440FA15A887FEE545400000000080470ABF807DBDC15DE2144072A06A8403E6454000000000A0470ABFA3C135865CE114406A42E44E0AE645400000000060470ABF3CD22E025ADF1440C0814D250BE645400000000080470ABF15C940E31FD71440C34851543CE645400000000000480ABF14C997A9BFD51440D73B9B8F2EE6454000000000C0470ABF2A1E7392AFD4144064709CE423E6454000000000E0470ABFC9F57D345FD31440504EB46A0FE645400000000080470ABF98D8021B21D2144036EA9FE20BE645400000000080470ABF475D5C6806D11440C288911E1DE6454000000000A0470ABFDD642C2FA3CE1440173C34B215E6454000000000A0470ABFF297909641CD1440C0917E090FE645400000000060470ABFE52D7B4D2BCC1440904A3FE20EE6454000000000A0470ABF5DBF768464CA144073964D2523E645400000000080470ABF74A1A2A675C9144081797F3A27E6454000000000E0470ABF5F4E446FBAC81440D7539E7A36E6454000000000E0470ABFC226269A61C81440E24A062F4EE645400000000020480ABF56C6CF0D06C71440B20BB0DE54E645400000000060480ABF5E81C74C32C61440E38E5FB650E645400000000040480ABF35647CCE5BC514409067CC6D51E645400000000020480ABF5833C58B6FC41440AF917F194EE645400000000040480ABF2E3C0F10A1C314406EFB890059E645400000000000480ABF2796CAAA97C214401339841C64E645400000000060480ABF1D4E8EA010C21440E9E46D4EA1E6454000000000A0480ABFE3E32537BAC11440CBC9BFEFBFE645400000000020490ABF1B4D0E9BA3BF1440F4F27BDDCAE6454000000000E0480ABF0F60C17280BE144071CDDF90DFE645400000000040490ABF882A5D1121BD1440AECA7AED0BE745400000000080490ABF7522FAABAFBB14404DA4425F1DE7454000000000C0490ABFCBBD272F00BA1440C286B74E1FE7454000000000A0490ABF36B460ECFDB71440D033CFCF1AE745400000000080490ABFC42018EF56B61440FA857ACB0CE745400000000080490ABF39DCC3A850B41440822608632DE7454000000000C0490ABF53EB19A13AB31440F4FC301F3CE7454000000000004A0ABFBCE83FD035B11440A1AE179734E7454000000000C0490ABF71A592208DAF14402E95BAD42DE7454000000000E0490ABF40B6557ACBAD144023B8574933E7454000000000A0490ABF1A0CD80197AC1440EAF7A7D644E7454000000000004A0ABFA46A7231C5AA1440BF8F491D50E7454000000000E0490ABF917B131F94A91440782C014947E7454000000000E0490ABF34C33F119EA714402E2B50F93EE7454000000000C0490ABF3EDAB472C7A51440D0D7294F47E7454000000000204A0ABF31E1BECA80A4144021F664F63AE7454000000000E0490ABFC1B0C64A23A31440246937CD32E7454000000000E0490ABF6385B9E87FA1144001F3C0492CE7454000000000C0490ABFABB40EBA2EA0144054B2BB1719E7454000000000C0490ABF282F6B342E9E1440E31D3D520DE745400000000060490ABFD84F6C4DC99C1440CAAFD46EF8E645400000000060490ABFB8B091684E9B1440BBDB3DF209E745400000000040490ABF51CA7618439B14407E8CFA7827E7454000000000A0490ABF2F88B274EC9A14409136F1FB46E7454000000000E0490ABF95AB6197449A1440F85ED60F57E7454000000000004A0ABF56F835B892991440CF119ECB6BE7454000000000004A0ABFF10846A6759814408AB6BC1594E7454000000000804A0ABF2822A945FE961440B751DEB0B4E7454000000000A04A0ABF9D61D4727495144028C57E5DDDE7454000000000E04A0ABF9EFD0DB1C5931440A4C2E83DE6E7454000000000004B0ABFD5478F38F7911440CE53F600FEE7454000000000404B0ABFC51118FC5F9114409A9C4AAC45E8454000000000C04B0ABF8ED7B26A0C9114406DE45B9E6FE8454000000000204C0ABF80894E72539214404E3789B590E8454000000000404C0ABFE7105626C49114404FA304D7B3E8454000000000A04C0ABF4908B366C58F1440F7BCF077EEE8454000000000004D0ABFFD5DBA4C368F1440535BAB9415E9454000000000A04D0ABF9EBA48D80C8D14408EE326404FE9454000000000C04D0ABF4390C2121A8C1440CD9507087BE9454000000000204E0ABFA6B9B15D178B1440694FDC26A9E9454000000000604E0ABFE31EA78145891440B4D10FC2B2E9454000000000804E0ABFEAEE76BF158714401D69129DD7E9454000000000C04E0ABFBB4F7CB550851440FE60E1D8EFE9454000000000E04E0ABFC3AF7050718314408BF71C8DE8E9454000000000A04E0ABFD8D8461346811440996BDF4300EA454000000000204F0ABF721FB58E418014402AFF8AB4F0E9454000000000004F0ABFE95E2C3EEE7D14407EABE429D7E9454000000000E04E0ABFDD031667DC7B1440738096BBB5E9454000000000C04E0ABFA29FB2BEF97914400218CA8E9AE9454000000000204E0ABF092651C0327814408F5B6EB09AE9454000000000404E0ABF0950B48E6F761440EBE4038DA6E9454000000000404E0ABF33FB87DC3E751440B8469464A2E9454000000000604E0ABFDD2EBC928573144029E6940687E9454000000000404E0ABFA16A63193F7214403BA030F281E9454000000000404E0ABF9C5B40E0B970144067E932AC75E9454000000000004E0ABFB5C8E7F1156F1440CF9619355FE9454000000000C04D0ABFFD17745CE96E14402498BB754AE9454000000000E04D0ABF658DB95C626E1440BBD8F70128E9454000000000804D0ABF784DB05C686D14406D740BDF26E9454000000000C04D0ABF49FBC916FC6B1440E6EFC07D29E9454000000000804D0ABF184F8FFBA06A1440B8498C1B25E9454000000000804D0ABF73A28346A069144060CF30662EE9454000000000C04D0ABF2BD3BB6C7A681440CB71DA2C3CE9454000000000A04D0ABF9C86CE5D6C651440A8841B652EE9454000000000804D0ABF0ED5AF1644631440542C50591EE9454000000000804D0ABF8F95ACFD2762144019FFE1112CE9454000000000404D0ABF55914E6EF0601440DCF1DC133FE9454000000000804D0ABFB7681B348B60144011C790406EE9454000000000004E0ABF9E555CB4575F144083003A2C8FE9454000000000204E0ABFFD4C133FA05E14409032FD48ACE9454000000000A04E0ABF008DF69D535D1440AF8C54EFCAE9454000000000A04E0ABF5A3FC4ED545C1440391DAF15EDE9454000000000204F0ABFF2DA50806B5B14408FB8F4A010EA454000000000204F0ABF8A1492DC725A1440ABDF8AA72BEA454000000000604F0ABF54F6C9FD335914401691DB7048EA454000000000A04F0ABFD955B9ABDC571440D588784165EA454000000000E04F0ABF791082DF9356144091298D047CEA45400000000020500ABFBD40EDC7DC541440CA662DE896EA45400000000040500ABFC2C0B8C6B85414404A8011A598EA45400000000020500ABF2015AABE9853144039EAB093A6EA45400000000060500ABF324179906A521440E60AF34FB6EA45400000000060500ABF26C7340F295214404C2128BEB9EA45400000000060500ABF1A97F6BE6B501440E6C4370ACFEA45400000000080500ABFA08301B2304E14403BF91C54EAEA454000000000E0500ABF35547B83C04D14405B931DB2EEEA45400000000000510ABF636682D6384C1440A76519EFFDEA45400000000020510ABF7700204EFA4A1440673288580BEB45400000000020510ABF69FD67AE864A14401A26E63810EB45400000000020510ABF3BE5CDAC6448144009FE98722BEB45400000000060510ABFDEC5859537461440C852EFF83FEB45400000000080510ABFCEB71A665044144001E0370255EB454000000000C0510ABF12860DC7D94114405CAAA9446BEB454000000000C0510ABF3124F922683F1440743CC50483EB45400000000020520ABF00FB0B70A83D1440AA0839D39CEB45400000000020520ABFE19CC8BF0D3C14404F130E13ADEB45400000000080520ABFB42971D3CD391440788ABA52BBEB45400000000080520ABF1A0C93CAA9371440E1FCFCF0C7EB45400000000080520ABFC2585AE90E36144074BB5D64CDEB45400000000080520ABFB8F5E95945341440F872321DCEEB45400000000040520ABF2F8975955A311440B9D20F73C3EB454000000000A0520ABFB2177E9E192F14402BD79ECDBAEB45400000000060520ABFE3A559651C2D1440A16E6B92B7EB45400000000080520ABFCE589B376E2B144053BF40D5B4EB45400000000040520ABF7645590A3B291440A9E69FE5AFEB45400000000040520ABF748EDEDE5A27144079EA0633A8EB45400000000080520ABF627B872F102514404BB16BFBA9EB45400000000080520ABF81E54416E8221440893F0038D6EB454000000000C0520ABF28514B03251F144089CE25B5A9EB45400000000040520ABFC48C2C9C7B1F144079D89DCC76EB45400000000000520ABFD2F95BC12F1E1440D3F8AEA674EB454000000000C0510ABF1B3551AA091C14408A8F06E0BDEB45400000000080520ABF6F2FCA0EFC1A1440CCE7C22914EC45400000000020530ABF1CC2B2303A19144062556A2D29EC45400000000040530ABFAFFABB3AB017144087A2A9AD1FEC45400000000040530ABFA71DD4358B161440F615AB49F4EB454000000000E0520ABFBA2EFF0FA81514406FD675C7DEEB454000000000E0520ABF5CA685B4A81414405C9FA2E9F7EB454000000000E0520ABF8AB886271213144016F7276902EC454000000000E0520ABF197ECB902E0B14405327D9EF32EC45400000000020530ABF4921F323390A14407AFD63B53DEC45400000000080530ABF263CCFD4AC0814406AB75F0F52EC45400000000080530ABF36BDE1E99506144021AD2DFA6AEC454000000000C0530ABF2DF142173804144096A3B54182EC45400000000000540ABFA92780E9F50214401867211D97EC45400000000000540ABF2E7D0FE0B30014405C54615AC1EC45400000000060540ABF751F344F1EFF13408BCCEB98DDEC454000000000C0540ABF567FF1DF73FD13408DAC80E3F9EC454000000000E0540ABFA269F146BFFB134073E7645D11ED45400000000000550ABF06E5B8F4A0F91340B5F473CC22ED45400000000000550ABF207CE8AD99F61340F106759C5BED454000000000A0550ABFFEEA5C90DBF313403E2905647CED454000000000C0550ABFE1EE806E83F21340301BA3A486ED454000000000E0550ABFDB8C239AFBF2134065AB78D39FED45400000000040560ABF5FBC3C2D3AF3134041C49515B0ED45400000000040560ABFD73441B557F31340577B1DCCE7ED454000000000C0560ABF857F74C4B2F21340741A93C937EE45400000000020570ABF45449F6067F413406882DC68B9EE45400000000020580ABF5184820D79F6134079643F5DC7EE45400000000040580ABFE62774F040FB13402B3FEA87E9EE45400000000080580ABF10EF3B23D2031440551669A10EEF454000000000E0580ABFEA52A63233041440232765CA36EF45400000000000590ABF4F4AE8E7BD09144003F3916473EF454000000000A0590ABF8C34F64E43101440E588740BD4EF454000000000405A0ABF552F92DAF4141440DA09512226F0454000000000E05A0ABF6C42F7E1EA1914409912F443E2EF454000000000605A0ABFA68AF033BD1C1440D8E83F2CC1EF454000000000405A0ABF6E8B2D66EE201440A580A4158BEF454000000000A0590ABF3C6B3A4BEF22144080F0FE3F82EF454000000000A0590ABF37517D74A7281440F428BB9091EF454000000000C0590ABFEE53745DF02D144001038F22ACEF454000000000005A0ABF452AEDFE3B311440B36EF285AEEF454000000000205A0ABF1614EF27F9391440E759283FE9EF454000000000605A0ABF23B0690B20401440FB536549F6EF454000000000C05A0ABF472AC54B82461440E7800E2FE8EF454000000000605A0ABF575998B41D4E1440D393EA8DB9EF454000000000E0590ABFE55A6A248D5614400705755279EF45400000000080590ABF16BD0752215F14409CE1114F4EEF454000000000A0590ABFDF83E0814A681440E27E2F7338EF45400000000020590ABF3FD52D44516F1440304CDCFD50EF45400000000040590ABF831870E57A731440D66EBAD872EF45400000000080590ABFDEEA584BE073144010FDCAC87EEF454000000000C0590ABF72DA5F12177C1440651E4A1136F0454000000000005B0ABF687F6F02FF8014406CEED661A5F0454000000000E05B0ABFFEB8E6F7728214408B9CA0C6D7F0454000000000405C0ABF005F5199EE821440F37B8E453BF1454000000000205D0ABFC5844F356C81144091C5B780ECF1454000000000405E0ABF46EDE5D5548114403C0718A117F2454000000000805E0ABF58923CD443841440F046DFC55BF2454000000000205F0ABF075B545A388914408C9FA238C0F245400000000000600ABFF93483A3408B1440686AE00310F345400000000040600ABFC3C9097E4E8B144071D08D053BF3454000000000C0600ABFDE65F9B935891440763889F464F345400000000020610ABF91DDDEADE5871440851063CB75F345400000000040610ABF0056846828881440BDF60D3281F345400000000040610ABF2AD882ABB28B144030E526CA8DF3454000000000A0610ABF0A68C2DB27901440F21A2A1ACCF3454000000000E0610ABF56B350A0189214403CDE2ADD08F445400000000080620ABFB08123AEC7901440FEAAC92E73F445400000000020630ABFF41CC49F1D8F14405BD5416690F445400000000040630ABF80F635E48C8E14405C58C29AA3F4454000000000A0630ABF84A9E309DC8E14407623F810B0F4454000000000A0630ABFC4FD25439991144016EB9F9BB6F4454000000000A0630ABFE19062056D951440716DEF26D4F4454000000000E0630ABFFF4B5F07CC9814400451711941F5454000000000C0640ABF7463FFCDFA991440DBF6FAAF6AF545400000000020650ABFDD9FF11CD29B1440049BFB179DF545400000000060650ABFE33F9AD40B9C1440E4C58611BAF5454000000000C0650ABFBBFAF986B29914408BED77BE19F645400000000020660ABFE5E5F5F9959A1440B9E29A4074F645400000000000670ABF5085FBA1C79B14404BD9565CEBF645400000000020680ABFB91D3A78139C14405750D5E416F745400000000020680ABF46BCB6D9019B1440B23296A646F7454000000000A0680ABF779CEF6E749C14408889DD01EDF7454000000000C0690ABF066895DF189C1440C1AC48F281F8454000000000C06A0ABF8780E6ADED99144027C12622F7F8454000000000E06B0ABF11005BA022991440D0D9C91D19F9454000000000406C0ABF385AC39127991440B7D1DE571AF9454000000000406C0ABF7A0BE0656799144052E0EB3161F9454000000000A06C0ABF96E00D9AE99714406F8D0526ABF9454000000000206D0ABF2D9BF9E7F69614405406F12BC4F9454000000000206D0ABF8DF34CCC5F9A1440A375B0ECDAF9454000000000A06D0ABFBA0584A6969F14407FF0732B13FA454000000000C06D0ABF3F8A997FFFA3144062F4CE5355FA454000000000806E0ABFF8208A6E0EA614408963D2F46DFA454000000000A06E0ABFF23F201849A9144075CC359C73FA454000000000A06E0ABF25A1F61FF9AD1440C89E969C55FA454000000000606E0ABFCDED5B84BCB11440125C083E17FA454000000000206E0ABF2E62DC19FFB3144030189636F8F9454000000000C06D0ABF6F10859CA0B51440F9A79FA6EFF9454000000000C06D0ABFFC50593D19BA14404F7C2A7F11FA454000000000E06D0ABF5CDB82FEBFBB14406CBB090F1AFA454000000000E06D0ABFB54C1DBB50BE1440C2F33DCA01FA454000000000E06D0ABFFA2D6303D3C01440B03D839BDDF9454000000000A06D0ABFD5F841BF3BC21440859BF273D7F9454000000000A06D0ABF24418BDEE5C71440A8903AE615FA454000000000E06D0ABF5629BCA432CB14403BB5495C69FA454000000000A06E0ABF115043843CCD1440D0E29A13EFFA454000000000A06F0ABF17390CA8AED114405BD3C79A3DFB45400000000040700ABF4B784F3B85D31440A97E20B5AEFB454000000000E0700ABFB32359CC01D714405BDBAE2AC2FB45400000000020710ABF1CD37D9FD3D914406870148F07FC454000000000C0710ABFC607018617DD144044274B442CFC45400000000000720ABF4C5EADB3A5DF1440644B3378E0FB45400000000040710ABF0F9E5F7245E2144023CD6D962BFC454000000000E0710ABF160D23AC50E4144094253C1A61FC45400000000040720ABFEA59C9BA3DE514402478C7F8F0FC45400000000020730ABF127144AE9FE7144088497FDC15FD454000000000C0730ABF026F56B2ABED1440CA91630071FD45400000000020740ABF5D78247272F114405CC558E6BFFD454000000000C0740ABF1DF4FCBEBCF81440F1C33515A7FE454000000000A0760ABF79309683D7FC1440DB734D66C5FE454000000000C0760ABF38CBB9C1DB0015401B8EBE3B11FF45400000000060770ABFD445860B55021540146EA9C820FF454000000000C0770ABF6D015EE7A6031540E9A06EDA15FF45400000000080770ABF1E7CDE42A70915409B7837E791FF45400000000060780ABF5C43CA4CEC0C15408EE3E7AD85FF45400000000040780ABF3A64B7E88F151540E5A3DA5169FF45400000000040780ABF1C0EDE39AE181540AB2B8B2142FF454000000000C0770ABF5B05FCB626191540AABEF0F523FF45400000000080770ABFB7A808943B1B1540E5DEB9A948FF454000000000E0770ABF33278D46972215402DBADAD567FF45400000000020780ABF54A82ED03A25154070986A6EB4FF454000000000A0780ABF84477C91D02915406349402AABFF454000000000C0780ABF6973AAE1F528154013ABAE1EDBFF45400000000000790ABF663A48E1F827154017A631330D0046400000000080790ABFE71AD2E11F2915402B8F6BBC5C00464000000000007A0ABF17577B05EF2D1540CA25F7350201464000000000407B0ABFCBC58CAF2F321540D58515866501464000000000207C0ABFFFA925F1F533154040C49674B201464000000000807C0ABF323E7FF1D33515400A2CF070D901464000000000C07C0ABF52F89588993715403EE3A22E2B02464000000000807D0ABF13C1CA99A7391540C0473E296602464000000000E07D0ABF1453CCD5513C15401289DB518F02464000000000407E0ABF19905BB70A3E1540CB9D43D0DC02464000000000C07E0ABFD2750F9B3142154095E5B95FFB02464000000000E07E0ABF6BBBE0FDCD441540E1780DFA3703464000000000807F0ABF95B731B61C4715402B4CF1DA4903464000000000A07F0ABFD13D6182234A1540F2E7E9351803464000000000407F0ABFF8E842B5CD4D154066F68038E702464000000000E07E0ABF8B9B4D43A350154074A4A94CF102464000000000007F0ABF116DC6260054154084F8630E0803464000000000207F0ABF2D07743BE958154057CF84BB4F03464000000000A07F0ABFEB0C17C47D5A154079B6BB525603464000000000A07F0ABF92C6DD5499601540F0E965FD5003464000000000807F0ABFE93F59DA016215407854EFF95C03464000000000C07F0ABFDF0CEE6250651540CF3268488F0346400000000000800ABFA9A4BBD86E6A1540330316118F0346400000000040800ABF20D53FA7446C154073B4A971CD0346400000000080800ABFE9C1CE980A711540C079FD58240446400000000020810ABF3AFAA982847415406C362E1B7A04464000000000E0810ABF61DF6AAFB6741540B1B8FF61470546400000000040830ABF47A9684D4E7A15406881B5D76A05464000000000A0830ABF2EAE8DE4207F1540F4D0AE68130546400000000000830ABF735DFEA7668215401DBC7B7F1D0546400000000000830ABFEAEA9515BC86154088B1C78AD90446400000000080820ABF1A0A0135148B1540CFF183D69E0446400000000020820ABF6D05FFADE68B1540084979726804464000000000C0810ABF95C4E6658A8C15406B00843C300446400000000040810ABF362EA2C9018C1540CFF97BCA0304464000000000E0800ABFB3716F5F6D8D1540180C95FCE003464000000000C0800ABF8FCF9AD1B4901540DFE7BC73A40346400000000040800ABFF084D2A2AE9515400EB95C19A50346400000000040800ABFCF6A57E8DE98154030AEA6B6B40346400000000060800ABFD0A59BEA019D154022A824134C03464000000000C07F0ABFE0BB9E7898A015401FD12D847603464000000000E07F0ABF9367E6903CA51540991DD2E0B80346400000000060800ABF8A86AD0CA2A715404D9B1BB8300446400000000080810ABFDEDB778D6AAC15407B30F8F03A0446400000000040810ABFD6998E491CAF1540A46B33F0890446400000000020820ABFEB09859A91B01540D39E06DBD50446400000000080820ABFB26ADF2978B21540317BC08C7B04464000000000C0810ABF8874587EB0B515400AA8B436E703464000000000E0800ABF63098105ECB9154008C7DBB13903464000000000807F0ABF57D24BFF4BBE1540CFBBFB427502464000000000207E0ABF48F7701BB2C215404299E67F0002464000000000007D0ABF77E38BEDD9C415403C6A8215A401464000000000607C0ABFBAA4EA5AE6C5154049B5DB052501464000000000807B0ABF5C33F1E1B0C71540D0CA81EFC200464000000000A07A0ABFA55BE1EBA6CB1540C0E317582E00464000000000C0790ABFF11F01F188CD1540D9F60FBE2700464000000000C0790ABF094D1C1684D0154059B1EC282E00464000000000A0790ABF242C5AF668D215409F18095E2600464000000000A0790ABFD2CC0B93B5D51540060413362700464000000000C0790ABF03E265F9D1D715409E4A36883D00464000000000C0790ABFA6B4F1692CD9154090240E2D050046400000000060790ABFE4F4B879F5D81540ED0CA445E0FF45400000000020790ABF3F3396E6CFD615409FE6FCDD81FF45400000000040780ABF052AB7F98CD71540D2704A8745FF45400000000000780ABFB42E057B30D81540D3384EB020FF454000000000A0770ABF91403929FFDA1540D71B013519FF45400000000080770ABFDA94F8DA0BDE1540E1944B80DDFE45400000000020770ABFC68FE27BB2DE15408280FEBE5DFE45400000000040760ABF0AA2930FBAE215407247C2E6C3FE454000000000C0760ABFFBAABB450BE715405D2D7AB8DDFE45400000000020770ABF38219BB899EA15403E007AD3E6FE45400000000040770ABF795F10F57EED15400F9B0755B3FE45400000000080760ABFFC524B7A63EE154054191DED4EFE45400000000000760ABFF9B10E00BAF015401641BDD95DFD45400000000020740ABF9C10FC8DB2F51540A4A9A1D289FD45400000000080740ABF076E3112B6F415407469470B6AFE45400000000060760ABF87E79B483EF4154099F2ADB8DDFE45400000000000770ABF19C76A8D25F41540D559508C2EFF454000000000C0770ABF3F47986AD5F3154096D8D49558FF45400000000020780ABFB7E72BE2B5F315407C18CB1077FF45400000000040780ABFC69F27AEB8F31540111B91FC8EFF45400000000060780ABFA12DD36A58F315406C10031D1A0046400000000080790ABF779DC93909F11540B257F3997C00464000000000607A0ABF8A99B38DADEF1540DC75F397B600464000000000C07A0ABFE36AE6E5F1EC1540855B9775EF00464000000000207B0ABF032AAD5DDCEB15401AB681CB2D01464000000000807B0ABF3F131051AAEA15401F37F19CA001464000000000607C0ABF294498642EE915404B9ED48E1502464000000000807D0ABF76877B08B4E515409D25330F9D02464000000000407E0ABFDF00E9066BE215402DD369D00303464000000000E07E0ABF1C58D165EEDF1540EB5F3E875A03464000000000C07F0ABFCD23DC2FE5DC1540549D1DB2B10346400000000080800ABF6FADDF87CDD9154028FED0C12E0446400000000040810ABFBAE9908800D71540DDEEF9178C0446400000000000820ABF9A2E37B455D31540F11BC00EE30446400000000080820ABFCDB0E7AAE8D0154049F792A5230546400000000040830ABF223109A139D0154073B4B2245405464000000000A0830ABF7EF797D79FD015400141A43A910546400000000020840ABF907961CB21D31540671F0B84CF0546400000000080840ABFDD92BBEEC8DA15407B68D85AFE05464000000000C0840ABF5BD5B96FE5DE1540E094C911580646400000000080850ABFE4145009E3E21540334C32398E06464000000000A0850ABF1B8C1F58C3E01540F77DD1CA9B0746400000000000880ABFC988CBCA8EDC15402D72115A1E08464000000000C0880ABF212891D2CDE015405D14BE255D0846400000000040890ABF4C313F3B0AE415405335AFC1DC08464000000000808A0ABF50B205ECE4E71540B49B2DD90609464000000000A08A0ABFC0996E9B9EEA1540963A434CFF08464000000000608A0ABFC5A188C7EFEC1540CF2DD4D1690846400000000080890ABF47FFAAA77CEF1540E5DA65C16E0846400000000080890ABFC4C7079749F3154097FEDDBE5E0846400000000040890ABF888BCEC8D7F5154073115F0E6D08464000000000A0890ABFCB55BF9246FA15408658FC3FED08464000000000408A0ABFA67EED1BC9FD15405545D391C508464000000000208A0ABF06CCEC3119FF154069D13D41A808464000000000208A0ABFF6E3269CF801164002509A389F08464000000000C0890ABFAAF5E91CC6041640A8E5F120D008464000000000408A0ABFB52B69E33A051640E1D7D3ED1D09464000000000E08A0ABF2C67DA28830A1640ED23E5A83009464000000000E08A0ABFDDFFC610E30D1640025EB6A85D09464000000000208B0ABFB541AF6C8B151640319F11249709464000000000A08B0ABF7D8EEFC1AE17164086E4A686ED09464000000000408C0ABFBE726A5DA21B1640EBF151161A0A464000000000A08C0ABF7054A0A959221640962D2D59EE09464000000000408C0ABF534884BB05251640ACD5F8F6090A464000000000608C0ABFAF7327125E27164067F16228EA09464000000000408C0ABF74EE85B51B291640A7DC7945140A464000000000808C0ABFF67CD254F82A1640A9E036CE4A0A464000000000208D0ABF81ECA641DE301640383A4C9D8B0A464000000000808D0ABFD1196A39D23216400DBB9926630A464000000000408D0ABFEDED08D402351640F1400D41220A464000000000C08C0ABF4411173E16381640237FAFFE2A0A464000000000E08C0ABFE2D526DDED3A164092630FA39E0A464000000000808D0ABF95D436C3B93F16400B477283EA0A464000000000208E0ABF6F95E8F2724616405145EF11CD0A464000000000008E0ABF173CA720DB4D1640AA2257BBBC0A464000000000C08D0ABF85767FB2ED501640CE3748D0450B464000000000008F0ABF1F245DC9CF521640885381809B0B464000000000E08F0ABF4790EEEDD0511640FFDD5976EE0B46400000000000900ABFC02B7F877B5316400BB7DCD5410C46400000000000910ABF3DA637C04A57164089DFC24AE30C464000000000E0910ABFBFD68369985B1640ABF221BD640D464000000000E0920ABF0B5F7968B35C1640998D5126DC0D464000000000C0930ABF09621E68A55A1640E09901544B0E46400000000080940ABF8A71A5740C5B16404C7ABF5C850E46400000000020950ABF321D0FF5935B164062A4CC63EC0E464000000000E0950ABF7EE2CEC1F45B16406E3242E5440F464000000000A0960ABFD3E6532AD861164088C4B8EA780F464000000000E0960ABFF2847A093D6516403271E79C3C1046400000000020980ABFAA73E2A8B069164056ADCE3DA71046400000000060990ABFAEDC8CDD446A16402BCEC75B7311464000000000E09A0ABFCA9B667FD46C16404C374A9A5D12464000000000A09C0ABFFC01C3A3916F16404C168227BA12464000000000209D0ABF317BFFF3E86C1640C22AA83A3613464000000000009E0ABF5697F9FF6D6A1640C7E114749513464000000000A09E0ABF1D3FB28D6469164014B670B5C113464000000000209F0ABF91CEF23C516C164017CA5F0DB013464000000000409F0ABF3C82159C297516407D5C79406A13464000000000809E0ABF141998807C781640886AD0DA6513464000000000609E0ABFE6218FFABE7C1640E7B8AA884613464000000000409E0ABF7BBE0CDB6E8016404E7258D24113464000000000409E0ABF7C843304778516400CCFFDE73E13464000000000009E0ABF706322EDB7891640A4748DE14613464000000000409E0ABF1CB4BDD2648F1640508D478F2413464000000000C09D0ABF83BC33D73B931640E4832A301913464000000000E09D0ABF33AE83774D9516401292ED86FB12464000000000A09D0ABFEE04698441941640E8958694AF12464000000000209D0ABF722C333114961640259E34811112464000000000009C0ABFC780DC7DAA9616408215E7ADBB11464000000000209B0ABF39ED71D801961640710D4DDD4811464000000000A09A0ABF2569AA4D5B9316402417FF6D0911464000000000E0990ABF57049E74BE901640A374A449FF10464000000000C0990ABF2383E2C2A98E164096A1609D921046400000000000990ABFDA9A0542568F164055A38056441046400000000080980ABF48C85469B28E1640FE081385F80F464000000000E0970ABFD47BBC03778E1640804672A5AA0F46400000000060970ABFCDDE8950C88E1640E1D8AD76520F46400000000080960ABF0321D51501901640D4A51C63FC0E46400000000000960ABF5E8DE159E88F1640DF2C3369790E46400000000020950ABF5C463BDD4C8D1640D2CD16133F0E46400000000060940ABFE2D250F3628D16407CAA08390C0E46400000000040940ABF392FC290798E164021A6DF28E20D464000000000E0930ABF375F1D0E598F16407E2D7CE8B70D464000000000A0930ABF766951DEB98F164052BAD0B4790D46400000000000930ABF2B7A926508911640BF822A74400D464000000000A0920ABF7B6668C3829116400B9F72F0130D46400000000060920ABFE58FE140F99016407A23B761DE0C464000000000E0910ABFB7CD58051A941640859A4756E10C46400000000000920ABFC782848D4F95164056D7BF6A9D0C46400000000080910ABFF0D5BAC1979516401004605D6D0C464000000000E0900ABFC5EE3BA3A9961640D734D0DF4C0C46400000000000910ABF7133A525489716406941C679140C46400000000080900ABF127E3D84D396164018BD3CFFDC0B46400000000020900ABFEC49334D50981640826BB7F9970B464000000000A08F0ABF55C654621C981640AF7F7A894E0B464000000000E08E0ABF0EA26ACE9F95164075ABA8CB650B464000000000008F0ABFA65E7563E7931640C3DCEFDC670B464000000000208F0ABF77FEA8AE28921640AE10B302590B464000000000208F0ABF2CD091E3ED901640CC68B8724D0B464000000000008F0ABFCA5E321738901640E8B5220D320B464000000000008F0ABFEF7E0041D38F16406AFCEE2A140B464000000000A08E0ABF6D8F2C5B958F1640D4F319C5F10A464000000000808E0ABF53917E8C179016407F69CF42980A464000000000808D0ABF004C0D0A3E8F1640553038B6480A464000000000008D0ABF4F699BD06A8E1640B590560D0A0A464000000000808C0ABFA083EF35AF8E16408AFC37AFCF09464000000000408C0ABF5C19C459448E1640621F49508C09464000000000A08B0ABF6EF5ABA1598D16403108FC5D3A09464000000000E08A0ABFC2035E2DA08D1640135EE51ED608464000000000408A0ABFF8432BDD328F1640FFE4DE519F08464000000000E0890ABF7FFB059E548F164061760CD2490846400000000020890ABF71B673F6018E164081F07B7CE70746400000000080880ABFE526AC8B0E8D1640250D23868807464000000000C0870ABF0E601446E38B1640750B20B42A07464000000000E0860ABFB1884F9E218B1640DB4C8733ED0646400000000080860ABFA0840B96B68A1640A19C6A06C10646400000000000860ABF32EA7401A58A16400E3929479B0646400000000000860ABF3FC5BDF9F28A16400B5E7CA06C0646400000000080850ABFF0E24ABC6C8B16407B1E259E370646400000000020850ABF96B883AF508D16401203F4C5FE05464000000000C0840ABFD0D416B58B8F164030F0790CC60546400000000040840ABF27B3AF61EB92164072263467A50546400000000000840ABF022CCAE500961640AB19FA118605464000000000C0830ABF34222E96D997164083843FC25705464000000000A0830ABF77917FBDF698164040894B0A3B0546400000000040830ABF557948E8689A164043F103560E0546400000000000830ABF94988F547C9A164068546E59E504464000000000C0820ABF6D1D21ECEF9A16406B05FF2DA70446400000000040820ABFC6D167A7299C1640B37E61AF590446400000000080810ABFA39C2212909C16409503797C450446400000000080810ABF874DFC2D999D1640DDD4E84F240446400000000060810ABF9AB12F57A29D1640A44BC20FFB03464000000000C0800ABF0C9A291C979D16406F1B38F0DC03464000000000A0800ABFE135BF6DFE9D164025E577D7A90346400000000020800ABF26637B4EE69D1640B2FB0A256903464000000000A07F0ABFFD8713348E9E16406B5107B64903464000000000A07F0ABFAE33B47BE29E16406FF086652503464000000000607F0ABF33511D99869F164037E605C71103464000000000207F0ABFB6909EFDEA9F164091258EBF0203464000000000607F0ABFAF0728CEA89F1640AEA226EDE902464000000000E07E0ABFA3BAB8BB779F164046BADA00D402464000000000C07E0ABF9448BF91A89F16400A511633BF02464000000000A07E0ABF357A8C32C09F1640D74AC2D7A602464000000000807E0ABFB75FEB0308A01640FE1C6F208C02464000000000207E0ABFA535F7998AA016406DB2D45D7602464000000000207E0ABF102C97D7B6A016405FBBF9625402464000000000007E0ABF884E920565A01640AC6AF2A61102464000000000407D0ABFF49E980041A01640D407E4DDF201464000000000407D0ABFF524EA205B9F16409FAD7ABBC301464000000000C07C0ABFCDB10B4EA39E1640746A0F9B8B01464000000000407C0ABF25ABEC07589E1640956B1C3C5B01464000000000C07B0ABF626AD2A6679E16409856D1462E01464000000000807B0ABF8A800EAF509E164077C973990601464000000000407B0ABF0C8650B2AA9E16402376A3EBDA00464000000000007B0ABF80D2E6A3B99F1640EAC89CD3B300464000000000A07A0ABFD6BDD5BD38A0164058C23CD96900464000000000407A0ABF5BBD8870A69F1640582507862900464000000000A0790ABFD990CC08639E1640BEC2AD7BFFFF45400000000060790ABF4EE871E5C49D16404C96D6BCD5FF45400000000000790ABF4705BCA1759D164016B23711BBFF454000000000C0780ABFEDE629C4429D164063CBB70B85FF45400000000060780ABFDA1548C1319D16409F7E20875DFF45400000000020780ABF53F77CEA169D1640D20AF6DB3DFF454000000000C0770ABF36EFB653AA9D16405EF5A54932FF454000000000E0770ABF0C8FC529FF9D1640EBDCE38425FF454000000000A0770ABFE680B7016F9E1640B8275E8A1EFF45400000000080770ABF00B494443E9F164084C84B2312FF454000000000A0770ABFAFB07DDFDF9F164046D070F50DFF45400000000080770ABF52C1693359A01640EDB591600BFF454000000000A0770ABF591BCB19F2A016401C524AC705FF45400000000080770ABFED8AF64009A21640B59B60CD0AFF45400000000060770ABF71DD0162FEA216401F6D2C450CFF45400000000080770ABFA066A01D19A416407D8056DF1AFF45400000000080770ABF575FE60392A51640C2E8EEB235FF454000000000E0770ABFB2DAB660A9A61640421F006325FF45400000000080770ABF91E3D04A26A516401876F92CF7FE45400000000080770ABF9E12848AC0A41640537A44A1E4FE45400000000060770ABFCB73B51EE1A31640A2C59E7CDCFE45400000000000770ABF0E0B619BE7A21640E3A24A42CFFE45400000000020770ABFFAAE624E3BA2164046E0A8C2B6FE454000000000C0760ABF38C7BB89C9A116409AF7B3C5A1FE454000000000C0760ABF700FF8D821A11640098AFAB27FFE45400000000080760ABF5C5B4F8C54A01640EBADAC6E50FE45400000000020760ABFD4C8C95AEA9F16407C3EF0AE3AFE454000000000E0750ABFBE3B97F44E9F16404212C09B23FE454000000000C0750ABF373F2693519E16402807BF361FFE454000000000E0750ABF2286BBE1B29C16401924B15014FE45400000000080750ABF03EE17652F9A1640DEE118881FFE454000000000A0750ABFEC8718FFAC9716402E994A2A40FE454000000000E0750ABFA582833DD79716406BD12AB927FE454000000000E0750ABFE9BAF8C7AD971640415054620EFE454000000000A0750ABF3863D1622D96164044E512C2FEFD45400000000040750ABFBDBEBCC9DE951640E118B864E8FD45400000000060750ABF8066391D639516401233B267C1FD454000000000E0740ABF4C7592D2E694164096109977A9FD454000000000A0740ABF40124803859216409301EE979EFD454000000000A0740ABF56C8F8CBFE9216402AEE916F8DFD45400000000080740ABF910704B230931640C02C5FE069FD45400000000060740ABF434231F54F921640F4A835F947FD45400000000020740ABF99717444AD91164063F21C1A33FD45400000000000740ABF74D0B373A3911640C12964A218FD454000000000A0730ABFC59CC26531921640AAFF498DDFFC45400000000040730ABF1DE165C845921640B6562962BEFC45400000000020730ABF5FAE9108C1911640CEEB0713A2FC454000000000E0720ABF31B148DB35931640007221A975FC45400000000080720ABF0B000B61CB9316407173FF0F51FC45400000000040720ABFDBAA085C6C94164096F8BA0129FC45400000000000720ABF1BC574E9A0941640057B7C1618FC454000000000C0710ABF5F497C9DC49416409651753DFBFB45400000000040710ABFE3011425399516407A1296B3E5FB45400000000080710ABF2BB174877E9516407BF874ABCAFB45400000000060710ABF495D7178599516402BF40329AEFB45400000000040710ABFA4CE6C8AFA9416406EEC7CFC95FB454000000000E0700ABFD0EB67AFA79416401B07273C7AFB454000000000A0700ABF9107687E1E94164078A4D5566CFB45400000000080700ABFEAAB1F26DA931640805EDD4F3FFB45400000000020700ABFFB4B257D7C931640B650A0692BFB45400000000040700ABFEE6E95EC699216406CC8C71900FB454000000000A06F0ABFDEA1A82E799116404D4656F5D6FA454000000000606F0ABF6B40786EA2901640BBCBC57CBBFA454000000000006F0ABF9B574ECF228F164095E8777E96FA454000000000E06E0ABF9AB9D026208D16402F4C66E74FFA454000000000606E0ABF62CDED60AA8C164090A299DB2EFA454000000000206E0ABFD3648BD39D8C1640ACDB01EF0CFA454000000000206E0ABFCC9578FAC78C1640F4ED5925EDF9454000000000C06D0ABFFF580A934F8C16402C1302B8B7F9454000000000206D0ABFA35CC1DFB48C1640A8F2F9587EF9454000000000E06C0ABF04A13F1B698B16404BCC673756F9454000000000806C0ABFE3765EF13D8A1640220560A83EF9454000000000606C0ABF8D0EEE6AD089164058025D7C10F9454000000000006C0ABF7D1FF17648891640D14DBE64E2F8454000000000E06B0ABFC73D241DE78816402166CFD8B8F8454000000000606B0ABF34E8F179B78716404792FE008EF8454000000000206B0ABFE77D18B9C78616405D7BF2C35AF8454000000000A06A0ABF1115D1520E861640BE9D0A9B29F8454000000000406A0ABFB228462FBB85164055FC5D09F4F7454000000000E0690ABFA0A200BE5E851640768FE7BEB0F745400000000040690ABFE011C98DAD85164003BF4F088AF745400000000020690ABF418AA282078616406C38936254F7454000000000C0680ABFE07DCBC321861640475251EB24F7454000000000A0680ABFD330AF8281861640322EE0240DF745400000000020680ABF5C4C243F6A871640844684FBF3F645400000000020680ABF10626F9B0D881640D28AF38CE1F6454000000000C0670ABFD96AC22B3B8A16401A83C22613F745400000000020680ABF4D2ABCBB328B1640671B6D2631F745400000000080680ABFDCF33027178D1640156F202550F745400000000080680ABFDD55FD3FD98F1640818E44692EF745400000000040680ABF866411D0B491164046ACB4E31BF745400000000020680ABF3593746AD49216401DE0A3800CF745400000000060680ABF19F76A69FC921640871CE616DFF6454000000000C0670ABFA8F2E9DB5693164090491FE8BAF645400000000080670ABF0A12EF11A4931640C78C00B38BF645400000000040670ABF405C430C759316403F576D0E73F6454000000000E0660ABFA11B099FEA93164055D6EA8A4AF6454000000000C0660ABF6A515CCE66941640922365A135F6454000000000A0660ABF8623A75D4C9516402F02CFB525F645400000000060660ABFDB1FC24730961640AD0550160CF645400000000080660ABF62D531064C971640F6A13571F2F545400000000020660ABFAC09688396991640CB5F223BF3F5454000000000E0650ABF3891BE3F5B9B16409DCCD688D6F5454000000000E0650ABFC2B93A3F499C16404F1F9446C1F5454000000000A0650ABF5B37B4DB339C1640E5464E5AA0F545400000000060650ABF47B7FC26029C16407CDA076F81F545400000000020650ABF715E61879D9B164079FD2AA070F545400000000020650ABFB56160945B9B1640F7B3FA1158F545400000000000650ABF69262665AE9A1640CA57064137F5454000000000A0640ABFC7085C305F9A16405C80709D13F545400000000040640ABFFD7CE50B499A1640072EA283F1F445400000000040640ABF4C2AF426919A16402D6A0F19CFF4454000000000E0630ABFC873F592629B16403950544BACF4454000000000A0630ABFBF661A98EB9B16401E220AD581F445400000000060630ABFEE4A4E903C9B1640BA2C5D845FF445400000000060630ABF6E863726199B16406396473033F4454000000000A0620ABF47B3345FF69A16403C2DD09108F445400000000060620ABFB6E368C88E9A1640BA9BBFE0D8F345400000000020620ABF9AB2C997019A16407A9EB8FCBEF3454000000000C0610ABF6EAA313C24991640D9488FEC9AF3454000000000A0610ABF645802C2779516408C1B4CB228F3454000000000E0600ABF74A6EEC48596164066A0E636EBF245400000000000600ABFA36864C171971640786E643FB7F2454000000000C05F0ABF000F74F7B098164049534A8197F2454000000000A05F0ABF95A22DA95B9A1640DA7127B481F2454000000000605F0ABF054627A77C9B164075797A9676F2454000000000605F0ABF27C9782C779C1640564CF9D869F2454000000000205F0ABFF437AB88DE9D1640AF73CAC969F2454000000000605F0ABF08C2AF7D0F9F16403964AA9957F2454000000000205F0ABFB107D3DC54A016401A1A95B623F2454000000000C05E0ABFEF28FD52DDA116409035D45FFEF1454000000000805E0ABF9D1C0C6C97A31640C2284722CBF1454000000000205E0ABF22F073ECADA61640792F26BFAAF1454000000000C05D0ABF06F650A1F2A81640C46C8C5C85F1454000000000805D0ABFD0573C877BAA16404052625146F1454000000000405D0ABF732C041721AC1640183A45A718F1454000000000C05C0ABF568FC00B4BAC16406A0CB85AF5F0454000000000A05C0ABFCEA0FD09B2AC164040E9E2F5D2F0454000000000405C0ABFB7F2F14ECFAD1640DE81B0FDC5F0454000000000205C0ABFC3D96C805FAF16401843ABC2C2F0454000000000205C0ABF75E32249C8AF1640913FCAA0D8F0454000000000405C0ABFBAEAF27507B41640BA28C5A1E1F0454000000000205C0ABFFF0C79AF71B516405AFB0026FFF0454000000000605C0ABFE5F71C2DFFB81640C7592DEC19F1454000000000A05C0ABF2F65B56A6DBB1640376BE67827F1454000000000A05C0ABFB6061C33ECBD1640A47FCD0812F1454000000000C05C0ABF2A24564C3FBF1640BC5683430AF1454000000000E05C0ABFE10B370C6DC016402FA2114001F1454000000000A05C0ABFE36ABF68E6C116406C1E2240E9F0454000000000A05C0ABFAD665C58ACC11640792772BBD9F0454000000000605C0ABFB701E4C39EBF16408AA96372CBF0454000000000405C0ABFFE4CB8E5E5BD164075498E6B9EF0454000000000C05B0ABF9DA0705E10BE1640E7B6BC9570F0454000000000805B0ABF5FF71E23DDBD16406159DC3E5FF0454000000000405B0ABF611392A2ADBC1640728610B341F0454000000000205B0ABF00B9ADBA85BC16401F0406671AF0454000000000C05A0ABF61151F4B34BA16407B4F3A8408F0454000000000C05A0ABFC9E64B3CB8B9164006981C66BFEF454000000000205A0ABFA578203C02B8164063B909E6B9EF454000000000205A0ABFD4F54605ACB5164037DAF7289BEF454000000000C0590ABFD103A27C6CB51640C42BDBBD77EF454000000000C0590ABF14F4B6A837B616403BFA9CB739EF45400000000040590ABF256741BCFAB7164006004A1420EF454000000000E0580ABFD62D3EF271BB164087F17643E5EE45400000000060580ABFC287FB7B65BE16408E068F49BCEE45400000000040580ABFFE1158898CBD16400D4255D191EE454000000000E0570ABF497000B2C0BC1640D5ABC40064EE454000000000A0570ABFA8E6EE297CBC16405C50A0C43DEE45400000000020570ABF25543DDC5EBC1640DAC3A3B90AEE454000000000E0560ABFB76928D7EABB1640F3D7112BDCED45400000000080560ABF9C1A0C298FBB164015A70FCAA9ED45400000000020560ABF3484E612AFBB1640536C0FB374ED454000000000A0550ABF5FE2A1A933BC16402403CE6045ED45400000000040550ABF0F705F68E0C0164026AC5CD4F3EC454000000000A0540ABF9CAA7A3CCAC116404F31F3E0D8EC454000000000A0540ABF9091F55054C316405D4B7B1AB2EC45400000000040540ABF6D49F8A031C31640AB91A9D98AEC45400000000020540ABFBD71EA989BBF1640306860EB85EC454000000000C0530ABF2A819674AABA16407C5C08D586EC454000000000E0530ABFBDCC1799C4BA1640CB29675249EC454000000000A0530ABF318D519CD1BA164036030C2236EC45400000000080530ABF419A234D63BB164077EEFE0107EC454000000000C0520ABFA8BF63F095BC1640052025B3AEEB45400000000020520ABFAC12C4E423BC164001A3FE8EB1EB45400000000060520ABF2E2E26AF3CBB16409DF7051CAEEB45400000000040520ABFDE180C4FDAB9164044E2F18BADEB45400000000060520ABF5CED830A9DB8164067427BAAADEB45400000000040520ABF22F8780C0CB816401D98430FA7EB45400000000040520ABFFAE004D46AB7164020A27BDFA5EB45400000000060520ABFB7EAD47E77B61640619648BDB9EB45400000000060520ABF857A22E1EAB4164007173658CFEB45400000000080520ABFCEDA4570E1B41640C7CAFF1AA9EB45400000000060520ABFEEF03AB92CB51640803B7BA889EB45400000000040520ABF6ABF197A01B51640E7C0D25C5FEB454000000000A0510ABF1DB4B947DDB41640B9E633D54EEB45400000000060510ABF2E7623769AB41640DC3EE5F447EB454000000000A0510ABF36771E17DCB2164096C87EE527EB45400000000040510ABF6F326192C9B11640ED6267080DEB45400000000020510ABFA81005567DAF1640B7C7B0FA0DEB45400000000020510ABF4207A00980AD16404F2B5DC109EB45400000000000510ABFFD95A86297AB16401C78A193F9EA454000000000E0500ABFC5E49C3B38AA164058F5EAD5EAEA45400000000000510ABFA220F2B3B7A81640600979A3DCEA454000000000E0500ABF7DC94BB672A716403D4C8730D4EA454000000000C0500ABF19ADB4C885A616404C48468BC6EA45400000000080500ABF5689CA5E9DA516401017EB00B0EA45400000000040500ABFCB2B4880C7A41640F1DB16D695EA45400000000060500ABF43FF1D45D8A31640C3BBBDF881EA45400000000040500ABF4D82321D4FA216405D34C3E260EA454000000000C04F0ABF8BF29BB906A216404718857747EA454000000000A04F0ABF7EA4BF14DCA116404C2B025E2DEA454000000000804F0ABFF15937FBD6A116408624C2A91FEA454000000000604F0ABFB8ED9AEB16A116400A06B428F1E9454000000000E04E0ABF64ABC0167B9F164094A08343E8E9454000000000204F0ABF066BBDD1E39D1640292AD42EFDE9454000000000204F0ABFD56E6BF0C09B1640CDAF480144EA454000000000A04F0ABF7A6F07C8799A16404A10DAF26CEA454000000000E04F0ABFEFD84EE5A6961640514478B374EA45400000000020500ABF20317AC838931640519FCD3170EA454000000000E04F0ABF9BF10CAA6391164053B8CA5D5AEA454000000000A04F0ABF7D720A4FAB8F16402FD888F315EA454000000000404F0ABF474A85D34E8F164083E163BB03EA454000000000404F0ABF10DBD893348F1640AF2B9A85F2E9454000000000004F0ABF35C4CA32DF8D1640AF422959F3E9454000000000004F0ABF1563F890728A1640418E486FF4E9454000000000404F0ABF2E5AFC9784881640D14426760AEA454000000000004F0ABF1A99B06F4A871640E0C429810DEA454000000000404F0ABF8BB48B2A83861640D7C6969D1AEA454000000000604F0ABF50CAC3698085164077CF615827EA454000000000604F0ABFBE180DE1E1831640B921D7033EEA454000000000804F0ABFC2DD1DD163821640428D6A9F69EA45400000000000500ABFF376D1C3B68116404331E5BB6AEA454000000000E04F0ABF90B6CFBA3E7F1640D1A71F425BEA454000000000E04F0ABF6650F66DE77C1640DB4364CD26EA454000000000804F0ABFB83AA908C47716403562866E3EEA454000000000804F0ABF603D07FA7E75164037A4A2C9E0E9454000000000A04E0ABFEF08516FD374164070E0B372EAE9454000000000E04E0ABF860493D51D721640F67A70B2FDE9454000000000204F0ABF5E4E262477701640D0A04ABC01EA454000000000204F0ABF85CF8403D56E1640104897AC06EA454000000000404F0ABFC37E61BE6B6D164054F5950803EA454000000000204F0ABF11B3CB41EA6B16400F6E6E1408EA454000000000204F0ABFA5234B4A516A1640605F463AFBE9454000000000404F0ABF2ACAC3BD3A6916405F1AA1BEE2E9454000000000E04E0ABF7EFFFFE4F46616409C3595A5BBE9454000000000A04E0ABF9B0A00D27D641640416EBCA2E9E9454000000000E04E0ABFE47E9BE5C8621640E42ECD203BEA454000000000A04F0ABF1DE05F3D4C601640CF5356914BEA454000000000804F0ABF5D4C62B2185F16407419CCD846EA454000000000C04F0ABFB0952C5F515E164019AB3ADF31EA454000000000404F0ABF4ECBA7F50C5D16400824ED3EF0E9454000000000204F0ABFA5015A49185B1640D8F9DC5BC5E9454000000000A04E0ABFBF162828E95916402D102C8CD7E9454000000000E04E0ABFBDA4F118B8571640434B3EEEE6E9454000000000004F0ABF6D3D2C1E9D531640C5E7A46114EA454000000000404F0ABF19EEBD69484F1640BC4BCC8945EA454000000000A04F0ABFD8541BF36B4B1640D7710AE344EA454000000000A04F0ABF64A70CB3054916402F11F9442EEA454000000000604F0ABF38F28459E3451640C315708EFBE9454000000000004F0ABFC930A758F34416409A3DA2F9CEE9454000000000E04E0ABF420944571945164076C7876378E9454000000000004E0ABF00493B319F411640560AC010F6E8454000000000004D0ABFABFA25236D3D1640CA1DAEE02BE9454000000000804D0ABF4E41C1ABE33A1640BA4A51F5EAE8454000000000204D0ABF2FA6B92E4C371640C34E8E5DC0E8454000000000C04C0ABF6681FCC8523416401F6118B19FE8454000000000604C0ABF732312671E3316405D6F12AB7FE8454000000000404C0ABFE2B054FBDE31164081AECB8B81E8454000000000404C0ABFD266E6FDF22E16408261C96A90E8454000000000604C0ABF4780C1960D2C164060CDD5039AE8454000000000804C0ABF67B05CF19629164048EE9159A4E8454000000000804C0ABF544C663500271640CEE1174FB9E8454000000000804C0ABFCC96C7BE74251640CB7ACC38C3E8454000000000C04C0ABF6EEFEEA66B2216401EA085B7B2E8454000000000C04C0ABF530C24D6EB211640B07BDC87B3E8454000000000804C0ABFEF5D938ABB20164003F71620C9E8454000000000A04C0ABF08B2A2C3331F1640C2AB52C2E5E8454000000000004D0ABF8B93C255541D164056BB5E58EDE8454000000000204D0ABFBF47C4548C1A164024DA651DF9E8454000000000204D0ABFA6B12B15291716408DC49C38FEE8454000000000404D0ABFF81423177B1416408CE87B1EEEE8454000000000404D0ABF9B1C1DE7CE11164010234107E4E8454000000000004D0ABFF3BAD1C5F50C16406B73EC67CCE8454000000000C04C0ABF89452623B00B16402BA070B1D5E8454000000000C04C0ABFA7F40655F00A164080FC5982DFE8454000000000004D0ABF754D747C980916403B3386BADEE8454000000000E04C0ABFCD9A71230A09164000F5834DDBE8454000000000404D0ABF1D0A2EA321061640267145F8D2E8454000000000004D0ABF20107E9BA9021640236D02A3B8E8454000000000C04C0ABF1CAA9E41300116403904149DBDE8454000000000C04C0ABF2A71BBE1C9FE1540E12CA234B8E8454000000000C04C0ABF18DD3ED678FC15407B599CECB6E8454000000000A04C0ABFF57B110DBEFA1540BCDE5704CCE8454000000000C04C0ABF5FCAE9FDBAF9154016F420D9C3E8454000000000C04C0ABF4802072E77F71540B1EDCEA6BBE8454000000000A04C0ABF07A7B10467F515405B1FB9C4C3E8454000000000C04C0ABF20A09BD62EF315407BAC5B94B6E8454000000000A04C0ABF3315F2A876F1154086863FD1BBE8454000000000804C0ABFC4E8569D44EF15403D0280DEB6E8454000000000E04C0ABFD8B3BCFB6FEE1540D66C521FAEE8454000000000804C0ABFAB6A5AC860ED1540BD5B844BABE8454000000000804C0ABF07B51B3117EC15400C3A9F56A8E8454000000000A04C0ABF7CB50B821CEB154011FA148C94E8454000000000804C0ABFA534B2EA81E91540F1B49C7C7BE8454000000000404C0ABFBC10228969E81540FE6056F470E8454000000000204C0ABF7570FA3874E61540E227C9DD81E8454000000000604C0ABF8F0F4592DCE41540927979775DE8454000000000E04B0ABF1DA7864482E3154011E7967166E8454000000000004C0ABF8785EA8E0CE01540AD68FC0867E8454000000000204C0ABF08DCA3C131DE154071B3037C64E8454000000000E04B0ABF41651C788FDD1540754F5048ADE8454000000000A04C0ABFF3F8259F71DB1540E0BD81A4C3E8454000000000E04C0ABFEBADEA9175D91540ECC90608E6E8454000000000004D0ABF4689D63EE0D51540C7C9E77CDAE8454000000000204D0ABFAB2A6F3046D3154066DF8D97F6E8454000000000204D0ABF'), NULL, NULL ); @@ -22,15 +22,15 @@ INSERT INTO pr_zh.t_river_basin (id_rb, name, geom, id_climate_class, id_river_f INSERT INTO pr_zh.t_hydro_area (id_hydro, name, geom) VALUES (12, 'Les Sorgues', - '01060000E0E61000000100000001030000C001000000E7000000FCC2CA9301F41340F975B69796FF45400000000060780ABF000000000000000021375C019EEF1340F96D08C574FF45400000000040780ABF00000000000000009A87CF3976ED1340AE52D01054FF45400000000000780ABF00000000000000008E307E9E57F013403117B4BF2BFF454000000000C0770ABF00000000000000001198F7D957FC134011F1CADC33FF454000000000A0770ABF00000000000000003051D0375C0214400F40B008E7FE45400000000000770ABF00000000000000009475662F2F06144031A3D01806FF45400000000040770ABF0000000000000000651279C3B0081440EED8FCB1FEFE45400000000040770ABF00000000000000004364DD45B90C14400094D5D9A3FE454000000000A0760ABF00000000000000001C47E9693F141440F83E2381B4FE45400000000000770ABF00000000000000004E8FFCA42B1F14400F5D44D0E4FE45400000000000770ABF00000000000000004C643A141F281440A69B3BAF0EFF45400000000060770ABF0000000000000000D19D211B9B30144003E3D20439FF454000000000C0770ABF000000000000000076828665B536144060FF4A2243FF454000000000E0770ABF0000000000000000150A202C543814408C0E2D533EFF45400000000000780ABF0000000000000000ECD6FF77DF3A144094D4F8AF36FF454000000000C0770ABF000000000000000034E67EF0B93D144065F6471B0BFF45400000000060770ABF0000000000000000A37C220C5C3F14402E085DDFD4FE45400000000020770ABF00000000000000007AE51F1C304314406025E13D38FE454000000000E0750ABF000000000000000072C28723E14614402A1066DFEBFD45400000000040750ABF0000000000000000CF1DF9B1AB4B144079B33401B1FD45400000000000750ABF00000000000000001E328C28645114405994853588FD454000000000A0740ABF00000000000000000DE9D1BEA1571440AD450FCA67FD45400000000080740ABF00000000000000004BB86E7E745C1440DDAB0D193BFD45400000000020740ABF0000000000000000C1D8147AF05E14406283A4A019FD454000000000C0730ABF000000000000000097E4D635ED6114400DA3D9D4A4FC45400000000020730ABF00000000000000003E6E7F4D7C631440804D5A336AFC45400000000080720ABF0000000000000000E298B450B76614405435C2C42BFC45400000000020720ABF00000000000000003A4E4F0AF46B14406FAD5EDFE5FB45400000000060710ABF0000000000000000200238EF3E6F1440AB88B39DD3FB45400000000040710ABF00000000000000005378E88F947214402F41367198FB454000000000E0700ABF0000000000000000950991AEA0761440336E7D1328FB45400000000000700ABF00000000000000006887EFEDCB791440EDACF39FB5FA454000000000406F0ABF0000000000000000EBE76FEC097C1440BE15578067FA454000000000806E0ABF0000000000000000DFFE8CB79B7E144001AC0E8257FA454000000000406E0ABF00000000000000004EF9C93C76831440D376777977FA454000000000A06E0ABF00000000000000006BD191CE2B8614409C0D866283FA454000000000A06E0ABF000000000000000094864631218B1440B31BAF8444FA454000000000606E0ABF000000000000000073C14B14419014402AD127C0E9F9454000000000C06D0ABF00000000000000009BBE8520EA931440EE726DC6BFF9454000000000806D0ABF00000000000000002D9BF9E7F69614405406F12BC4F9454000000000206D0ABF000000000000000096E00D9AE99714406F8D0526ABF9454000000000206D0ABF00000000000000007A0BE0656799144052E0EB3161F9454000000000A06C0ABF0000000000000000385AC39127991440B7D1DE571AF9454000000000406C0ABF000000000000000011005BA022991440D0D9C91D19F9454000000000406C0ABF00000000000000008780E6ADED99144027C12622F7F8454000000000E06B0ABF0000000000000000066895DF189C1440C1AC48F281F8454000000000C06A0ABF0000000000000000779CEF6E749C14408889DD01EDF7454000000000C0690ABF000000000000000046BCB6D9019B1440B23296A646F7454000000000A0680ABF0000000000000000B91D3A78139C14405750D5E416F745400000000020680ABF00000000000000005085FBA1C79B14404BD9565CEBF645400000000020680ABF0000000000000000E5E5F5F9959A1440B9E29A4074F645400000000000670ABF0000000000000000BBFAF986B29914408BED77BE19F645400000000020660ABF0000000000000000E33F9AD40B9C1440E4C58611BAF5454000000000C0650ABF0000000000000000DD9FF11CD29B1440049BFB179DF545400000000060650ABF00000000000000007463FFCDFA991440DBF6FAAF6AF545400000000020650ABF0000000000000000FF4B5F07CC9814400451711941F5454000000000C0640ABF0000000000000000E19062056D951440716DEF26D4F4454000000000E0630ABF0000000000000000C4FD25439991144016EB9F9BB6F4454000000000A0630ABF000000000000000084A9E309DC8E14407623F810B0F4454000000000A0630ABF000000000000000080F635E48C8E14405C58C29AA3F4454000000000A0630ABF0000000000000000F41CC49F1D8F14405BD5416690F445400000000040630ABF0000000000000000B08123AEC7901440FEAAC92E73F445400000000020630ABF000000000000000056B350A0189214403CDE2ADD08F445400000000080620ABF00000000000000000A68C2DB27901440F21A2A1ACCF3454000000000E0610ABF00000000000000002AD882ABB28B144030E526CA8DF3454000000000A0610ABF00000000000000000056846828881440BDF60D3281F345400000000040610ABF000000000000000091DDDEADE5871440851063CB75F345400000000040610ABF0000000000000000DE65F9B935891440763889F464F345400000000020610ABF0000000000000000C3C9097E4E8B144071D08D053BF3454000000000C0600ABF0000000000000000F93483A3408B1440686AE00310F345400000000040600ABF0000000000000000075B545A388914408C9FA238C0F245400000000000600ABF000000000000000058923CD443841440F046DFC55BF2454000000000205F0ABF000000000000000046EDE5D5548114403C0718A117F2454000000000805E0ABF0000000000000000C5844F356C81144091C5B780ECF1454000000000405E0ABF0000000000000000005F5199EE821440F37B8E453BF1454000000000205D0ABF0000000000000000FEB8E6F7728214408B9CA0C6D7F0454000000000405C0ABF0000000000000000687F6F02FF8014406CEED661A5F0454000000000E05B0ABF000000000000000072DA5F12177C1440651E4A1136F0454000000000005B0ABF0000000000000000DEEA584BE073144010FDCAC87EEF454000000000C0590ABF0000000000000000831870E57A731440D66EBAD872EF45400000000080590ABF00000000000000003FD52D44516F1440304CDCFD50EF45400000000040590ABF0000000000000000DF83E0814A681440E27E2F7338EF45400000000020590ABF000000000000000016BD0752215F14409CE1114F4EEF454000000000A0590ABF0000000000000000E55A6A248D5614400705755279EF45400000000080590ABF0000000000000000575998B41D4E1440D393EA8DB9EF454000000000E0590ABF0000000000000000472AC54B82461440E7800E2FE8EF454000000000605A0ABF000000000000000023B0690B20401440FB536549F6EF454000000000C05A0ABF00000000000000001614EF27F9391440E759283FE9EF454000000000605A0ABF0000000000000000452AEDFE3B311440B36EF285AEEF454000000000205A0ABF0000000000000000EE53745DF02D144001038F22ACEF454000000000005A0ABF000000000000000037517D74A7281440F428BB9091EF454000000000C0590ABF00000000000000003C6B3A4BEF22144080F0FE3F82EF454000000000A0590ABF00000000000000006E8B2D66EE201440A580A4158BEF454000000000A0590ABF0000000000000000A68AF033BD1C1440D8E83F2CC1EF454000000000405A0ABF00000000000000006C42F7E1EA1914409912F443E2EF454000000000605A0ABF0000000000000000552F92DAF4141440DA09512226F0454000000000E05A0ABF0000000000000000C5E53150FA1214406916611C49F0454000000000405B0ABF000000000000000038DA1349D00C1440A455569A87F0454000000000805B0ABF0000000000000000BDCC296185031440ADEAEC0BDEF0454000000000605C0ABF000000000000000072ED6E1115F913403FC6A95F68F1454000000000405D0ABF00000000000000003A3AA1D266F113409E63E018E8F1454000000000605E0ABF0000000000000000B8604EB38BEE13404F2876F505F2454000000000805E0ABF000000000000000050041A7433EA134063568ADF65F2454000000000605F0ABF000000000000000076419C7715E61340A10A9C40A2F2454000000000C05F0ABF0000000000000000DBBC5839ECE21340E606809FD0F245400000000020600ABF00000000000000009F32DB51E5E013406E4A056CE9F245400000000060600ABF0000000000000000A533DEC0E3D913409C2C5A1C3FF3454000000000E0600ABF0000000000000000F9D0F90D7BD413409A089A9785F345400000000060610ABF000000000000000048688D57A3D213406BC315EA7CF345400000000080610ABF0000000000000000E87571E91AC91340F07DFDBE77F345400000000060610ABF00000000000000000A3C9A60BAC11340B8B90CDE56F345400000000000610ABF0000000000000000F82CF80824BC1340E4468B2115F345400000000080600ABF0000000000000000D7FAF6DFF3B913409E04A34DF5F245400000000080600ABF0000000000000000B6C41DBD26BA1340234384A60FF3454000000000A0600ABF000000000000000086C5A73F0FBA1340B03A9B4136F3454000000000A0600ABF0000000000000000510C8EB9F3B913408F0453A35DF3454000000000E0600ABF0000000000000000F1B433244DB91340171906E178F345400000000020610ABF000000000000000095F1E6C51BB913405602B27289F345400000000060610ABF00000000000000005F9409A96CB81340DC5C3324A2F345400000000080610ABF0000000000000000D2570A92FDB713408EC409E7C5F3454000000000C0610ABF0000000000000000AADD936DFEB71340CC523312ECF345400000000020620ABF0000000000000000CC407FFA64B813401AF147AC0BF445400000000040620ABF00000000000000005D5D16E959B913402A9D02F533F4454000000000C0620ABF0000000000000000EF49106B4CBA134099ABD73F53F4454000000000E0620ABF0000000000000000BF71DACE04BB134009B3720B70F445400000000040630ABF00000000000000005282C1CCE6BB134091CD30A1A0F445400000000060630ABF0000000000000000B26241F03BBC134047144C1CBCF4454000000000C0630ABF0000000000000000EC5D3424D9BC1340BB868AB8DFF4454000000000E0630ABF0000000000000000B98DCDBB18BD13402419E88FF7F445400000000040640ABF0000000000000000595D941857BD1340723B07DD0AF545400000000080640ABF00000000000000001067B92D0BBE1340A7D5565027F5454000000000E0640ABF0000000000000000A511DD3390BE1340BBF4AA583CF5454000000000C0640ABF000000000000000065A340006ABF13405010D3995AF545400000000000650ABF00000000000000004CACE8D13BC013409C31AAB37AF545400000000040650ABF00000000000000004514C12ED3C01340D1DC924E98F545400000000060650ABF0000000000000000BB3DD73871C11340CA366B0BC0F545400000000080650ABF000000000000000073A7DBF480C113408C1BF84DDEF5454000000000C0650ABF0000000000000000460A1FFEA8C1134002B584AEFAF545400000000000660ABF0000000000000000591A3FA6AFC1134068A6CC9115F645400000000080660ABF0000000000000000DF87418E55C11340C161DEDA28F645400000000060660ABF0000000000000000237F1A6A5DC013409776741548F6454000000000C0660ABF0000000000000000035D2FF865BF13402A771EE869F645400000000000670ABF00000000000000002B489D4CC4BE134061FD01CB87F645400000000020670ABF00000000000000000156974603BF1340F74C3554AFF645400000000060670ABF00000000000000004B53442C42BF13403133535CD5F6454000000000E0670ABF0000000000000000B9162DA879BF1340B83B56F1FCF645400000000020680ABF0000000000000000848527AE8DBF1340A7400CCA1DF745400000000060680ABF000000000000000073E3207F9ABF1340EEA9E1F340F745400000000080680ABF000000000000000012796F247ABF1340005497EC64F7454000000000C0680ABF000000000000000070ED217247BF1340C0E8225192F745400000000020690ABF00000000000000006403E6B09FBE1340FA24445DBAF745400000000080690ABF0000000000000000563CF71452BE1340F23C4DABDDF7454000000000A0690ABF0000000000000000CDE060AEA6BD1340ABC7621FF7F7454000000000C0690ABF000000000000000083146EF229BD13406243EA4715F8454000000000206A0ABF00000000000000008B107F8E95BC13408E75A6AF25F8454000000000406A0ABF0000000000000000D4F8FE4767BC1340B625874C33F8454000000000406A0ABF00000000000000007732611D05BB1340AE8674646BF8454000000000A06A0ABF0000000000000000B380D1CCB5B91340A12E77F695F8454000000000006B0ABF0000000000000000BE22BE83A1B513408BC5F8E0D1F8454000000000A06B0ABF0000000000000000D16A924B61B3134086E5C486F9F8454000000000E06B0ABF0000000000000000DD8E504313B11340352AF9E048F9454000000000606C0ABF00000000000000005BD4CA64A6B013400C3857627BF9454000000000C06C0ABF0000000000000000441CBDE96CB0134092A81973E8F9454000000000606D0ABF0000000000000000A0BA1126B6AF1340151F487A3BFA454000000000206E0ABF0000000000000000BE45CC3022AE1340FF5248B57EFA454000000000A06E0ABF0000000000000000C6D05D9DA8AB13405407AD2BDEFA454000000000806F0ABF000000000000000051F01E6551A6134004B01D4264FB45400000000060700ABF00000000000000007182EFB45CA113404E6DDBEBAFFB45400000000040710ABF0000000000000000DA015E5D3A9C1340C0151991CCFB45400000000060710ABF000000000000000017B7B399479913404AA05D66F1FB45400000000080710ABF00000000000000003F8738F889971340DC9A84822CFC45400000000000720ABF000000000000000047219CFCD4971340839B6A43AFFC454000000000E0720ABF0000000000000000790683D6309813403F5A806E21FD454000000000C0730ABF0000000000000000A7FAB156BB9713400BB1F7565FFD45400000000020740ABF000000000000000043F8BB00D49413401F289777D3FD454000000000E0740ABF0000000000000000058CEC7CF89113408A20A76039FE454000000000E0750ABF0000000000000000B1CF288C15911340255E72FD58FE45400000000060760ABF000000000000000091B5B9A8C28C134020BCEF1BD0FE45400000000020770ABF000000000000000093078158118913404463169106FF45400000000080770ABF00000000000000005F7D6694828D1340DC29B25715FF45400000000080770ABF0000000000000000F243B708668E1340ABB11B0B1AFF45400000000080770ABF0000000000000000A1A73522B39113404A0A17992BFF454000000000A0770ABF00000000000000006C050BC7519713406BDD48F97EFF45400000000040780ABF0000000000000000723F7E98F09A1340E356287F090046400000000060790ABF00000000000000000436414D069C134033D0004F0101464000000000607B0ABF00000000000000005CF6CA382C9B134091ACFAAE0802464000000000607D0ABF00000000000000005D613EE5BE971340268314BEB402464000000000A07E0ABF00000000000000000719574A8A951340A44FEF7FB70346400000000040800ABF0000000000000000CD9118C35595134001401B3E8004464000000000C0810ABF0000000000000000B92940E27E981340DABC7CE2F804464000000000C0820ABF0000000000000000544C01D64199134061111BDCF30446400000000000830ABF0000000000000000124034DEFE991340AB3EF197E804464000000000C0820ABF000000000000000055F06EE1619A1340F9776A96DF04464000000000A0820ABF0000000000000000C2D8FD44E29A1340C24B9A22AF0446400000000020820ABF000000000000000049D34AB0A29A13401FF161797C0446400000000000820ABF0000000000000000A0A72103059A134090B698645B04464000000000A0810ABF0000000000000000BE34EB1DAC99134088ABEF384E04464000000000A0810ABF00000000000000004D3C044DE69B1340DCC9C8DF3B0446400000000040810ABF00000000000000005A92A676A39E13401CBE37B92D0446400000000040810ABF00000000000000004ED7135365A313402E200203350446400000000060810ABF0000000000000000E05361F4F2A813405479A5B05504464000000000C0810ABF0000000000000000BA4E7A4971B11340E7626E5E830446400000000000820ABF00000000000000000D6B36D3F5B81340BBC3CD84A70446400000000040820ABF000000000000000072B9472DDBBF134060996B1AD90446400000000080820ABF0000000000000000166AF15EFCC3134099FEFDE2EC04464000000000C0820ABF00000000000000003ACE17F58FC813403C2E48F4040546400000000000830ABF0000000000000000E4A20A1DF6CC13404FE8C6E01B0546400000000040830ABF00000000000000008932DC6B0EC913409FC13D56D90446400000000080820ABF00000000000000001D9D6038C6BE1340ED2D16256004464000000000C0810ABF0000000000000000782C852E73B61340F1684F3E2E0446400000000020810ABF000000000000000076EEC4B426B11340171056EA0D0446400000000040810ABF0000000000000000B3BEBE9B8CB0134003F729F9080446400000000040810ABF0000000000000000B18D69583DAF1340E044BB2CFE03464000000000E0800ABF000000000000000046B9B8D2FAAE1340933BCB4FFB03464000000000E0800ABF0000000000000000DC4CAABC06AF1340C45BC565F903464000000000E0800ABF0000000000000000850FC9C5B4B1134095740E83F50346407147DC11E77D0ABF000000000000000030E46F6787B4134086522760F10346400000000000810ABF0000000000000000830713E6C3B9134024A2FDD6DC03464000000000A0800ABF0000000000000000C1FC7C4EF6BD134088CAFDB6DE03464000000000C0800ABF0000000000000000F9AC012AFCBD13406A5DD54EDE03464032381F8333810ABF000000000000000088E1CBCDD4C21340338DCEE73F0346407147DC11E77D0ABF00000000000000009AFE42DE84CA1340E89651E70D0346407147DC11E77D0ABF0000000000000000A5B24708E3CB1340C53FC3A60E0346407147DC11E77D0ABF0000000000000000271F12E347DD1340E083501D180346407147DC11E77D0ABF0000000000000000814BA883A4E6134087C53669F40146407147DC11E77D0ABF0000000000000000FC6F0C2BCCF313403D5567535A0046407147DC11E77D0ABF000000000000000055D7DEF5FAF613400220A8D6AFFF45407147DC11E77D0ABF0000000000000000E7D2C4647DF713408E61248B94FF45407147DC11E77D0ABF0000000000000000853532E681F71340DCB9147C93FF45402F90C6FC4C780ABF0000000000000000FCC2CA9301F41340F975B69796FF45400000000060780ABF0000000000000000' + ST_Force2D('01060000E0E61000000100000001030000C001000000E7000000FCC2CA9301F41340F975B69796FF45400000000060780ABF000000000000000021375C019EEF1340F96D08C574FF45400000000040780ABF00000000000000009A87CF3976ED1340AE52D01054FF45400000000000780ABF00000000000000008E307E9E57F013403117B4BF2BFF454000000000C0770ABF00000000000000001198F7D957FC134011F1CADC33FF454000000000A0770ABF00000000000000003051D0375C0214400F40B008E7FE45400000000000770ABF00000000000000009475662F2F06144031A3D01806FF45400000000040770ABF0000000000000000651279C3B0081440EED8FCB1FEFE45400000000040770ABF00000000000000004364DD45B90C14400094D5D9A3FE454000000000A0760ABF00000000000000001C47E9693F141440F83E2381B4FE45400000000000770ABF00000000000000004E8FFCA42B1F14400F5D44D0E4FE45400000000000770ABF00000000000000004C643A141F281440A69B3BAF0EFF45400000000060770ABF0000000000000000D19D211B9B30144003E3D20439FF454000000000C0770ABF000000000000000076828665B536144060FF4A2243FF454000000000E0770ABF0000000000000000150A202C543814408C0E2D533EFF45400000000000780ABF0000000000000000ECD6FF77DF3A144094D4F8AF36FF454000000000C0770ABF000000000000000034E67EF0B93D144065F6471B0BFF45400000000060770ABF0000000000000000A37C220C5C3F14402E085DDFD4FE45400000000020770ABF00000000000000007AE51F1C304314406025E13D38FE454000000000E0750ABF000000000000000072C28723E14614402A1066DFEBFD45400000000040750ABF0000000000000000CF1DF9B1AB4B144079B33401B1FD45400000000000750ABF00000000000000001E328C28645114405994853588FD454000000000A0740ABF00000000000000000DE9D1BEA1571440AD450FCA67FD45400000000080740ABF00000000000000004BB86E7E745C1440DDAB0D193BFD45400000000020740ABF0000000000000000C1D8147AF05E14406283A4A019FD454000000000C0730ABF000000000000000097E4D635ED6114400DA3D9D4A4FC45400000000020730ABF00000000000000003E6E7F4D7C631440804D5A336AFC45400000000080720ABF0000000000000000E298B450B76614405435C2C42BFC45400000000020720ABF00000000000000003A4E4F0AF46B14406FAD5EDFE5FB45400000000060710ABF0000000000000000200238EF3E6F1440AB88B39DD3FB45400000000040710ABF00000000000000005378E88F947214402F41367198FB454000000000E0700ABF0000000000000000950991AEA0761440336E7D1328FB45400000000000700ABF00000000000000006887EFEDCB791440EDACF39FB5FA454000000000406F0ABF0000000000000000EBE76FEC097C1440BE15578067FA454000000000806E0ABF0000000000000000DFFE8CB79B7E144001AC0E8257FA454000000000406E0ABF00000000000000004EF9C93C76831440D376777977FA454000000000A06E0ABF00000000000000006BD191CE2B8614409C0D866283FA454000000000A06E0ABF000000000000000094864631218B1440B31BAF8444FA454000000000606E0ABF000000000000000073C14B14419014402AD127C0E9F9454000000000C06D0ABF00000000000000009BBE8520EA931440EE726DC6BFF9454000000000806D0ABF00000000000000002D9BF9E7F69614405406F12BC4F9454000000000206D0ABF000000000000000096E00D9AE99714406F8D0526ABF9454000000000206D0ABF00000000000000007A0BE0656799144052E0EB3161F9454000000000A06C0ABF0000000000000000385AC39127991440B7D1DE571AF9454000000000406C0ABF000000000000000011005BA022991440D0D9C91D19F9454000000000406C0ABF00000000000000008780E6ADED99144027C12622F7F8454000000000E06B0ABF0000000000000000066895DF189C1440C1AC48F281F8454000000000C06A0ABF0000000000000000779CEF6E749C14408889DD01EDF7454000000000C0690ABF000000000000000046BCB6D9019B1440B23296A646F7454000000000A0680ABF0000000000000000B91D3A78139C14405750D5E416F745400000000020680ABF00000000000000005085FBA1C79B14404BD9565CEBF645400000000020680ABF0000000000000000E5E5F5F9959A1440B9E29A4074F645400000000000670ABF0000000000000000BBFAF986B29914408BED77BE19F645400000000020660ABF0000000000000000E33F9AD40B9C1440E4C58611BAF5454000000000C0650ABF0000000000000000DD9FF11CD29B1440049BFB179DF545400000000060650ABF00000000000000007463FFCDFA991440DBF6FAAF6AF545400000000020650ABF0000000000000000FF4B5F07CC9814400451711941F5454000000000C0640ABF0000000000000000E19062056D951440716DEF26D4F4454000000000E0630ABF0000000000000000C4FD25439991144016EB9F9BB6F4454000000000A0630ABF000000000000000084A9E309DC8E14407623F810B0F4454000000000A0630ABF000000000000000080F635E48C8E14405C58C29AA3F4454000000000A0630ABF0000000000000000F41CC49F1D8F14405BD5416690F445400000000040630ABF0000000000000000B08123AEC7901440FEAAC92E73F445400000000020630ABF000000000000000056B350A0189214403CDE2ADD08F445400000000080620ABF00000000000000000A68C2DB27901440F21A2A1ACCF3454000000000E0610ABF00000000000000002AD882ABB28B144030E526CA8DF3454000000000A0610ABF00000000000000000056846828881440BDF60D3281F345400000000040610ABF000000000000000091DDDEADE5871440851063CB75F345400000000040610ABF0000000000000000DE65F9B935891440763889F464F345400000000020610ABF0000000000000000C3C9097E4E8B144071D08D053BF3454000000000C0600ABF0000000000000000F93483A3408B1440686AE00310F345400000000040600ABF0000000000000000075B545A388914408C9FA238C0F245400000000000600ABF000000000000000058923CD443841440F046DFC55BF2454000000000205F0ABF000000000000000046EDE5D5548114403C0718A117F2454000000000805E0ABF0000000000000000C5844F356C81144091C5B780ECF1454000000000405E0ABF0000000000000000005F5199EE821440F37B8E453BF1454000000000205D0ABF0000000000000000FEB8E6F7728214408B9CA0C6D7F0454000000000405C0ABF0000000000000000687F6F02FF8014406CEED661A5F0454000000000E05B0ABF000000000000000072DA5F12177C1440651E4A1136F0454000000000005B0ABF0000000000000000DEEA584BE073144010FDCAC87EEF454000000000C0590ABF0000000000000000831870E57A731440D66EBAD872EF45400000000080590ABF00000000000000003FD52D44516F1440304CDCFD50EF45400000000040590ABF0000000000000000DF83E0814A681440E27E2F7338EF45400000000020590ABF000000000000000016BD0752215F14409CE1114F4EEF454000000000A0590ABF0000000000000000E55A6A248D5614400705755279EF45400000000080590ABF0000000000000000575998B41D4E1440D393EA8DB9EF454000000000E0590ABF0000000000000000472AC54B82461440E7800E2FE8EF454000000000605A0ABF000000000000000023B0690B20401440FB536549F6EF454000000000C05A0ABF00000000000000001614EF27F9391440E759283FE9EF454000000000605A0ABF0000000000000000452AEDFE3B311440B36EF285AEEF454000000000205A0ABF0000000000000000EE53745DF02D144001038F22ACEF454000000000005A0ABF000000000000000037517D74A7281440F428BB9091EF454000000000C0590ABF00000000000000003C6B3A4BEF22144080F0FE3F82EF454000000000A0590ABF00000000000000006E8B2D66EE201440A580A4158BEF454000000000A0590ABF0000000000000000A68AF033BD1C1440D8E83F2CC1EF454000000000405A0ABF00000000000000006C42F7E1EA1914409912F443E2EF454000000000605A0ABF0000000000000000552F92DAF4141440DA09512226F0454000000000E05A0ABF0000000000000000C5E53150FA1214406916611C49F0454000000000405B0ABF000000000000000038DA1349D00C1440A455569A87F0454000000000805B0ABF0000000000000000BDCC296185031440ADEAEC0BDEF0454000000000605C0ABF000000000000000072ED6E1115F913403FC6A95F68F1454000000000405D0ABF00000000000000003A3AA1D266F113409E63E018E8F1454000000000605E0ABF0000000000000000B8604EB38BEE13404F2876F505F2454000000000805E0ABF000000000000000050041A7433EA134063568ADF65F2454000000000605F0ABF000000000000000076419C7715E61340A10A9C40A2F2454000000000C05F0ABF0000000000000000DBBC5839ECE21340E606809FD0F245400000000020600ABF00000000000000009F32DB51E5E013406E4A056CE9F245400000000060600ABF0000000000000000A533DEC0E3D913409C2C5A1C3FF3454000000000E0600ABF0000000000000000F9D0F90D7BD413409A089A9785F345400000000060610ABF000000000000000048688D57A3D213406BC315EA7CF345400000000080610ABF0000000000000000E87571E91AC91340F07DFDBE77F345400000000060610ABF00000000000000000A3C9A60BAC11340B8B90CDE56F345400000000000610ABF0000000000000000F82CF80824BC1340E4468B2115F345400000000080600ABF0000000000000000D7FAF6DFF3B913409E04A34DF5F245400000000080600ABF0000000000000000B6C41DBD26BA1340234384A60FF3454000000000A0600ABF000000000000000086C5A73F0FBA1340B03A9B4136F3454000000000A0600ABF0000000000000000510C8EB9F3B913408F0453A35DF3454000000000E0600ABF0000000000000000F1B433244DB91340171906E178F345400000000020610ABF000000000000000095F1E6C51BB913405602B27289F345400000000060610ABF00000000000000005F9409A96CB81340DC5C3324A2F345400000000080610ABF0000000000000000D2570A92FDB713408EC409E7C5F3454000000000C0610ABF0000000000000000AADD936DFEB71340CC523312ECF345400000000020620ABF0000000000000000CC407FFA64B813401AF147AC0BF445400000000040620ABF00000000000000005D5D16E959B913402A9D02F533F4454000000000C0620ABF0000000000000000EF49106B4CBA134099ABD73F53F4454000000000E0620ABF0000000000000000BF71DACE04BB134009B3720B70F445400000000040630ABF00000000000000005282C1CCE6BB134091CD30A1A0F445400000000060630ABF0000000000000000B26241F03BBC134047144C1CBCF4454000000000C0630ABF0000000000000000EC5D3424D9BC1340BB868AB8DFF4454000000000E0630ABF0000000000000000B98DCDBB18BD13402419E88FF7F445400000000040640ABF0000000000000000595D941857BD1340723B07DD0AF545400000000080640ABF00000000000000001067B92D0BBE1340A7D5565027F5454000000000E0640ABF0000000000000000A511DD3390BE1340BBF4AA583CF5454000000000C0640ABF000000000000000065A340006ABF13405010D3995AF545400000000000650ABF00000000000000004CACE8D13BC013409C31AAB37AF545400000000040650ABF00000000000000004514C12ED3C01340D1DC924E98F545400000000060650ABF0000000000000000BB3DD73871C11340CA366B0BC0F545400000000080650ABF000000000000000073A7DBF480C113408C1BF84DDEF5454000000000C0650ABF0000000000000000460A1FFEA8C1134002B584AEFAF545400000000000660ABF0000000000000000591A3FA6AFC1134068A6CC9115F645400000000080660ABF0000000000000000DF87418E55C11340C161DEDA28F645400000000060660ABF0000000000000000237F1A6A5DC013409776741548F6454000000000C0660ABF0000000000000000035D2FF865BF13402A771EE869F645400000000000670ABF00000000000000002B489D4CC4BE134061FD01CB87F645400000000020670ABF00000000000000000156974603BF1340F74C3554AFF645400000000060670ABF00000000000000004B53442C42BF13403133535CD5F6454000000000E0670ABF0000000000000000B9162DA879BF1340B83B56F1FCF645400000000020680ABF0000000000000000848527AE8DBF1340A7400CCA1DF745400000000060680ABF000000000000000073E3207F9ABF1340EEA9E1F340F745400000000080680ABF000000000000000012796F247ABF1340005497EC64F7454000000000C0680ABF000000000000000070ED217247BF1340C0E8225192F745400000000020690ABF00000000000000006403E6B09FBE1340FA24445DBAF745400000000080690ABF0000000000000000563CF71452BE1340F23C4DABDDF7454000000000A0690ABF0000000000000000CDE060AEA6BD1340ABC7621FF7F7454000000000C0690ABF000000000000000083146EF229BD13406243EA4715F8454000000000206A0ABF00000000000000008B107F8E95BC13408E75A6AF25F8454000000000406A0ABF0000000000000000D4F8FE4767BC1340B625874C33F8454000000000406A0ABF00000000000000007732611D05BB1340AE8674646BF8454000000000A06A0ABF0000000000000000B380D1CCB5B91340A12E77F695F8454000000000006B0ABF0000000000000000BE22BE83A1B513408BC5F8E0D1F8454000000000A06B0ABF0000000000000000D16A924B61B3134086E5C486F9F8454000000000E06B0ABF0000000000000000DD8E504313B11340352AF9E048F9454000000000606C0ABF00000000000000005BD4CA64A6B013400C3857627BF9454000000000C06C0ABF0000000000000000441CBDE96CB0134092A81973E8F9454000000000606D0ABF0000000000000000A0BA1126B6AF1340151F487A3BFA454000000000206E0ABF0000000000000000BE45CC3022AE1340FF5248B57EFA454000000000A06E0ABF0000000000000000C6D05D9DA8AB13405407AD2BDEFA454000000000806F0ABF000000000000000051F01E6551A6134004B01D4264FB45400000000060700ABF00000000000000007182EFB45CA113404E6DDBEBAFFB45400000000040710ABF0000000000000000DA015E5D3A9C1340C0151991CCFB45400000000060710ABF000000000000000017B7B399479913404AA05D66F1FB45400000000080710ABF00000000000000003F8738F889971340DC9A84822CFC45400000000000720ABF000000000000000047219CFCD4971340839B6A43AFFC454000000000E0720ABF0000000000000000790683D6309813403F5A806E21FD454000000000C0730ABF0000000000000000A7FAB156BB9713400BB1F7565FFD45400000000020740ABF000000000000000043F8BB00D49413401F289777D3FD454000000000E0740ABF0000000000000000058CEC7CF89113408A20A76039FE454000000000E0750ABF0000000000000000B1CF288C15911340255E72FD58FE45400000000060760ABF000000000000000091B5B9A8C28C134020BCEF1BD0FE45400000000020770ABF000000000000000093078158118913404463169106FF45400000000080770ABF00000000000000005F7D6694828D1340DC29B25715FF45400000000080770ABF0000000000000000F243B708668E1340ABB11B0B1AFF45400000000080770ABF0000000000000000A1A73522B39113404A0A17992BFF454000000000A0770ABF00000000000000006C050BC7519713406BDD48F97EFF45400000000040780ABF0000000000000000723F7E98F09A1340E356287F090046400000000060790ABF00000000000000000436414D069C134033D0004F0101464000000000607B0ABF00000000000000005CF6CA382C9B134091ACFAAE0802464000000000607D0ABF00000000000000005D613EE5BE971340268314BEB402464000000000A07E0ABF00000000000000000719574A8A951340A44FEF7FB70346400000000040800ABF0000000000000000CD9118C35595134001401B3E8004464000000000C0810ABF0000000000000000B92940E27E981340DABC7CE2F804464000000000C0820ABF0000000000000000544C01D64199134061111BDCF30446400000000000830ABF0000000000000000124034DEFE991340AB3EF197E804464000000000C0820ABF000000000000000055F06EE1619A1340F9776A96DF04464000000000A0820ABF0000000000000000C2D8FD44E29A1340C24B9A22AF0446400000000020820ABF000000000000000049D34AB0A29A13401FF161797C0446400000000000820ABF0000000000000000A0A72103059A134090B698645B04464000000000A0810ABF0000000000000000BE34EB1DAC99134088ABEF384E04464000000000A0810ABF00000000000000004D3C044DE69B1340DCC9C8DF3B0446400000000040810ABF00000000000000005A92A676A39E13401CBE37B92D0446400000000040810ABF00000000000000004ED7135365A313402E200203350446400000000060810ABF0000000000000000E05361F4F2A813405479A5B05504464000000000C0810ABF0000000000000000BA4E7A4971B11340E7626E5E830446400000000000820ABF00000000000000000D6B36D3F5B81340BBC3CD84A70446400000000040820ABF000000000000000072B9472DDBBF134060996B1AD90446400000000080820ABF0000000000000000166AF15EFCC3134099FEFDE2EC04464000000000C0820ABF00000000000000003ACE17F58FC813403C2E48F4040546400000000000830ABF0000000000000000E4A20A1DF6CC13404FE8C6E01B0546400000000040830ABF00000000000000008932DC6B0EC913409FC13D56D90446400000000080820ABF00000000000000001D9D6038C6BE1340ED2D16256004464000000000C0810ABF0000000000000000782C852E73B61340F1684F3E2E0446400000000020810ABF000000000000000076EEC4B426B11340171056EA0D0446400000000040810ABF0000000000000000B3BEBE9B8CB0134003F729F9080446400000000040810ABF0000000000000000B18D69583DAF1340E044BB2CFE03464000000000E0800ABF000000000000000046B9B8D2FAAE1340933BCB4FFB03464000000000E0800ABF0000000000000000DC4CAABC06AF1340C45BC565F903464000000000E0800ABF0000000000000000850FC9C5B4B1134095740E83F50346407147DC11E77D0ABF000000000000000030E46F6787B4134086522760F10346400000000000810ABF0000000000000000830713E6C3B9134024A2FDD6DC03464000000000A0800ABF0000000000000000C1FC7C4EF6BD134088CAFDB6DE03464000000000C0800ABF0000000000000000F9AC012AFCBD13406A5DD54EDE03464032381F8333810ABF000000000000000088E1CBCDD4C21340338DCEE73F0346407147DC11E77D0ABF00000000000000009AFE42DE84CA1340E89651E70D0346407147DC11E77D0ABF0000000000000000A5B24708E3CB1340C53FC3A60E0346407147DC11E77D0ABF0000000000000000271F12E347DD1340E083501D180346407147DC11E77D0ABF0000000000000000814BA883A4E6134087C53669F40146407147DC11E77D0ABF0000000000000000FC6F0C2BCCF313403D5567535A0046407147DC11E77D0ABF000000000000000055D7DEF5FAF613400220A8D6AFFF45407147DC11E77D0ABF0000000000000000E7D2C4647DF713408E61248B94FF45407147DC11E77D0ABF0000000000000000853532E681F71340DCB9147C93FF45402F90C6FC4C780ABF0000000000000000FCC2CA9301F41340F975B69796FF45400000000060780ABF0000000000000000') ), (53, 'La Durance de Mallemort au Coulon', - '01060000E0E61000000100000001030000C001000000E9020000D0AD4D1038D913406652F4AC98DD45400000000040370ABF00000000000000009F10BD10CAD913404A07FCC8A1DD45400000000080370ABF00000000000000002F9A7FA252DA13407FA1DFF3B7DD454000000000A0370ABF0000000000000000D58660EB6DDA1340EA486B3CD4DD454000000000C0370ABF000000000000000043A3E63C93DB1340AC9C5061ECDD45400000000000380ABF00000000000000007312721DDCDC13402CD495DCF1DD454000000000E0370ABF00000000000000006D32025B75DD134079A0048203DE45400000000040380ABF0000000000000000C9F97C347CDD1340236B59B217DE45400000000020380ABF000000000000000090C5A668F4DD1340F15D9B8727DE45400000000040380ABF0000000000000000E1783E8188DD13409ECC053149DE454000000000C0380ABF00000000000000006674D0C6B8DD13406B5C96BC6ADE45400000000000390ABF00000000000000000FC3487B71DF1340183B8C7B61DE454000000000E0380ABF0000000000000000B61B839E54E113408A9E0F8564DE45400000000000390ABF0000000000000000807B44CAA9E213409C427D6154DE454000000000A0380ABF0000000000000000D3F38F416DE31340754638F053DE454000000000C0380ABF0000000000000000F0834B0BB7E413404DA1C9EE4ADE454000000000E0380ABF00000000000000000AE53056FEE61340CEC858D53ADE454000000000A0380ABF000000000000000093424552EEE613409D7CB3A862DE454000000000E0380ABF0000000000000000D612C0C570E81340AD2AB620B2DE45400000000080390ABF00000000000000008613A4007DE81340048E7F741ADF454000000000203A0ABF00000000000000005A848CE964EB13406A88B58A31DF454000000000803A0ABF0000000000000000637D1D300FED13408A2C711C3EDF454000000000A03A0ABF00000000000000009B14025517EE13400A6A2D3D3BDF454000000000403A0ABF00000000000000009B64B5060FF01340F99988D734DF454000000000603A0ABF00000000000000004B3EC9968DF11340C9E8BCFC39DF454000000000603A0ABF0000000000000000444041E179F213402FADFB3249DF454000000000803A0ABF0000000000000000F5BDF91536F3134007BD2F915EDF454000000000A03A0ABF000000000000000021CA096B08F41340492BC25A69DF454000000000E03A0ABF00000000000000002F74ECB11AF5134019FE6C796CDF454000000000C03A0ABF000000000000000027D0302901F61340F6F79BB266DF454000000000E03A0ABF0000000000000000E02D1E2200F71340A6EA111960DF454000000000A03A0ABF00000000000000000C66B30741F813407C5346953ADF454000000000603A0ABF000000000000000034ECAC5C3FF91340EF1686B631DF454000000000603A0ABF00000000000000006B09D7CD1BFA134058DD253425DF454000000000203A0ABF00000000000000003FFC54FD63FA1340D70E97C71CDF454000000000203A0ABF00000000000000005F075E27DEFA13408FDB0C0215DF454000000000403A0ABF000000000000000055265C7857FB1340128F3F330ADF454000000000203A0ABF0000000000000000540C731DB7FB134094659E35FDDE454000000000003A0ABF00000000000000001992BEF707FC13400A304488F5DE454000000000E0390ABF000000000000000008837F7C58FC1340FE3C8DD3EDDE454000000000E0390ABF0000000000000000001EFE4104FD13407198E03AE4DE454000000000A0390ABF00000000000000006195447ED4FD1340A5BF7A84D9DE454000000000C0390ABF00000000000000000720431BB1FE1340F5F060AFCDDE45400000000060390ABF00000000000000005AA14AA0F0FF134023A84CBEC1DE45400000000080390ABF0000000000000000CC99AC0003011440CD591852B7DE45400000000080390ABF0000000000000000A7A5A717CC0114406F02D800B6DE45400000000080390ABF000000000000000044304DD04B021440B0F017D6B8DE45400000000080390ABF00000000000000003726ECC48E021440715DF37EBFDE454000000000C0390ABF00000000000000003EF40BED69031440D798A28ECBDE454000000000C0390ABF0000000000000000E47D7B302504144060767143DCDE45400000000080390ABF00000000000000002D1B2920D804144019975E78E6DE454000000000003A0ABF000000000000000087D79C793B051440EFACD9CB03DF454000000000203A0ABF00000000000000007E5BA64763051440CA55C1B01DDF454000000000603A0ABF0000000000000000BA274EFD1C051440A3B2979B39DF454000000000803A0ABF0000000000000000FFFF3F3EFC0414407137242150DF454000000000803A0ABF0000000000000000752172DF7F0614405E6CA0A75BDF454000000000C03A0ABF00000000000000001B62D55A5B071440A9E0401B6BDF454000000000A03A0ABF0000000000000000DEED6B7D2908144047CA1D6179DF454000000000003B0ABF00000000000000000D141F15080914404F384A554EDF454000000000C03A0ABF0000000000000000812BED96D70914409D89A8504ADF454000000000A03A0ABF00000000000000008A052CCBD50A14403A5485514ADF454000000000803A0ABF0000000000000000EDF09073910B1440A5B6792A45DF454000000000A03A0ABF00000000000000004C84DDCB570D144065E0EB4055DF454000000000A03A0ABF00000000000000009B47E6FF6F0E14403CC36F3B6CDF454000000000C03A0ABF00000000000000002BFC4EB23D1014406F1B43407FDF454000000000003B0ABF0000000000000000EF70F1B5BD0F144003527A51B5DF454000000000803B0ABF0000000000000000465AD537330F14405013E338DDDF454000000000C03B0ABF00000000000000003BDDFCD1FF0E1440648F41C4F6DF454000000000E03B0ABF0000000000000000C5EC04FCE80F1440CD2EA80E0DE0454000000000E03B0ABF0000000000000000963D295F85111440BA349C4B26E0454000000000403C0ABF00000000000000009DD92EF498111440E068416A4BE0454000000000603C0ABF00000000000000008818B7A416121440819CE6D95CE0454000000000E03C0ABF0000000000000000EFD2E60B7D1214406F6221E576E0454000000000C03C0ABF00000000000000008377ECDD3F13144046D898F2A0E0454000000000403D0ABF0000000000000000A00C4FBBD013144034818DAFC4E0454000000000803D0ABF0000000000000000469AAD9C47141440EACA2DB3E1E0454000000000A03D0ABF0000000000000000BB52B2D1EC151440B6344247FEE0454000000000E03D0ABF000000000000000011C37EB5F91714404639C01A21E1454000000000403E0ABF0000000000000000C636BB095C1A1440F9DF2B8045E1454000000000403E0ABF00000000000000009979E66EE0191440DB61840A75E1454000000000A03E0ABF0000000000000000ECFEE4982B1914400F7F35CF9CE1454000000000E03E0ABF0000000000000000D3018E6FFD191440C4FEF069BCE1454000000000203F0ABF0000000000000000C061CB1D471A1440CC755E8CCAE1454000000000603F0ABF000000000000000021434BE1881A1440F812D92AD7E1454000000000C03F0ABF000000000000000069BF204CFB1A1440583CD09DEEE1454000000000803F0ABF0000000000000000A2E418FFED1A1440CB81C7C505E2454000000000E03F0ABF000000000000000094C79F1F4D1B1440DC47079129E245400000000000400ABF00000000000000001DB2CE08101D1440FFFD9FE444E245400000000060400ABF00000000000000007410FD27FC1E14409EC1136765E245400000000080400ABF00000000000000005A8DCDC2DD1E1440201C6F728FE245400000000000410ABF00000000000000009DB7A414AE1E144029466BF6B5E245400000000020410ABF000000000000000075E56F953720144033D4034EBDE245400000000020410ABF00000000000000005490D3CA4721144051FDC565CEE245400000000080410ABF0000000000000000927729EC7D221440A262144FF2E2454000000000C0410ABF000000000000000015054FD3F9221440FA43EB801FE345400000000020420ABF0000000000000000038A8B21AF221440385F0BB943E345400000000040420ABF000000000000000070CCDDCE30221440018E069651E345400000000060420ABF00000000000000000B6FC4C067211440032537A96CE345400000000080420ABF0000000000000000C5BD37FF2E241440BE2F4AF0A6E345400000000000430ABF00000000000000007E135E0D9F241440626726C6DCE345400000000060430ABF00000000000000008A6125A35C251440061C7B54F0E345400000000080430ABF00000000000000000AF90FFFF1231440DB3AE1721CE4454000000000E0430ABF0000000000000000376675DFBA221440FA39517D2EE445400000000000440ABF0000000000000000D9FBC27607221440967766913DE445400000000020440ABF0000000000000000EF9E7995AE211440E38C94C155E445400000000020440ABF00000000000000002D7A0A0CB8211440C752390977E4454000000000A0440ABF0000000000000000587CA531FB211440C009C570A0E4454000000000C0440ABF000000000000000066224FC1CF21144024FBFDF3BEE445400000000020450ABF00000000000000005BF117A47C20144050840F80DBE445400000000020450ABF0000000000000000AD423154B01F144047978222EAE445400000000060450ABF0000000000000000E8BD7002E71E1440AB59F62B02E545400000000080450ABF0000000000000000903E2074DC1E1440649338CB19E5454000000000C0450ABF0000000000000000AC4C645C511F14403F510E5736E5454000000000E0450ABF00000000000000006DC4D999CA1F14408A716BC74FE545400000000040460ABF00000000000000001956D55F51201440DCFB20C180E545400000000060460ABF00000000000000003C33CFC45D2014402514A1C19FE545400000000080460ABF00000000000000006796790FAF201440331C22A7D1E545400000000020470ABF000000000000000009B0D007592014409897B0F3F3E545400000000080470ABF00000000000000003DE7BE801D2014405A9241A916E645400000000080470ABF00000000000000008942A3C09A21144073A080963BE645400000000000480ABF00000000000000004A00BA530322144055B053BF4CE6454000000000E0470ABF0000000000000000B1123838D222144004670FD05CE645400000000020480ABF000000000000000082A34FEB8C2314403FD0C2BE6BE645400000000040480ABF00000000000000007B55D4A96F2214405FA36ECB9FE6454000000000A0480ABF0000000000000000101F739821211440DD08A9BDB1E6454000000000E0480ABF0000000000000000617DB5238B221440AD58E18DD2E645400000000000490ABF00000000000000009B377F900623144097A9A1F1E6E645400000000040490ABF00000000000000003EF6ED48A82214404D008D070AE745400000000060490ABF0000000000000000010A3A0AD92414404A5E21C21FE7454000000000C0490ABF0000000000000000A64D592C902514402054E1182AE7454000000000A0490ABF0000000000000000BD53AA988B27144056AB234549E7454000000000E0490ABF00000000000000001A1BA138622714402B471B2558E7454000000000204A0ABF00000000000000000C87EF19FC261440234E27AE77E7454000000000404A0ABF00000000000000003216EDF022261440CECFE32E9FE7454000000000A04A0ABF0000000000000000E6FE638272251440E9B5EE8EC5E7454000000000E04A0ABF000000000000000037EBC648C024144085C5A03BE2E7454000000000004B0ABF000000000000000090A9C3E92A2414404B7D488CFFE7454000000000604B0ABF0000000000000000F9E5B9A890231440AB62E1C01BE8454000000000604B0ABF0000000000000000717278AA32231440E24C9D2732E8454000000000A04B0ABF00000000000000000ADABF7A7B2214407AF7613043E8454000000000E04B0ABF0000000000000000102A09135D211440EBFF3B0568E8454000000000E04B0ABF0000000000000000B3DC2BCB2A201440DB72D9328FE8454000000000404C0ABF000000000000000083F70FD9761F144097D97592B2E8454000000000A04C0ABF0000000000000000D62F534EA91E14404DABA734D4E8454000000000E04C0ABF000000000000000013220C92431D1440CDF8E9E5F5E8454000000000204D0ABF000000000000000040025A0E091C14405D5A4ABE13E9454000000000404D0ABF00000000000000003C8F4BD5981A1440BDD044103BE9454000000000C04D0ABF0000000000000000D5E06B40D1181440B83AAE1B60E9454000000000E04D0ABF00000000000000008B12EA7BFC1614407F17482D79E9454000000000004E0ABF000000000000000078AF907F11151440AEE1EF7C8DE9454000000000604E0ABF0000000000000000D085AF97011314405859A736AEE9454000000000804E0ABF00000000000000009D2C8E4158111440E7679DEDC1E9454000000000A04E0ABF0000000000000000D9BFDAD02C0F14408A3E1948DBE9454000000000004F0ABF00000000000000005F9B909B1B0D1440046D6C8DF7E9454000000000004F0ABF00000000000000000F22F2F0820B144045F561B30CEA454000000000404F0ABF0000000000000000409682EE7309144046079A912EEA454000000000604F0ABF00000000000000006962EAFC1D081440878F1C9844EA454000000000C04F0ABF0000000000000000840C7A9C7A0614406DFF4DA95EEA45400000000000500ABF0000000000000000A3AB450D26041440261F7D9A82EA45400000000020500ABF0000000000000000F5380B27DC0214408C3CB8FAA1EA45400000000060500ABF000000000000000049D490E78200144000DD2FEDCEEA454000000000A0500ABF00000000000000008AF5C0C614FF1340FF732CBFF1EA454000000000C0500ABF000000000000000045D6874E22FE1340CE46787D0AEB45400000000040510ABF00000000000000001613CF7ABDFC1340C5850A2D2FEB45400000000080510ABF00000000000000009D9307B73EFB13407F28781752EB45400000000080510ABF000000000000000009A7FDD270FA134076CE32A767EB45400000000000520ABF0000000000000000D6CC19304EF913401CE83EA98DEB45400000000000520ABF0000000000000000267C1862E7F7134098065A75B9EB454000000000A0520ABF0000000000000000E435332707F7134074D7B158E0EB454000000000C0520ABF000000000000000096DB0F3DF4F51340C8D1706604EC45400000000000530ABF0000000000000000A14695F7DEF41340D0EA927137EC45400000000060530ABF0000000000000000BE13B646FEF3134034812A5467EC45400000000080530ABF0000000000000000835D57E11BF313405DB9AC7893EC45400000000060540ABF00000000000000004B8FFB0A2CF21340C5A3700CBDEC45400000000060540ABF00000000000000001EEDFDB42DF1134008B6EF41E0EC45400000000080540ABF0000000000000000BB074C8048F01340CCA60DA811ED45400000000000550ABF0000000000000000557BADD997F0134010FDBB6551ED454000000000A0550ABF00000000000000000D4711C2BBF113400763D43571ED45400000000080550ABF0000000000000000E1EE806E83F21340301BA3A486ED454000000000E0550ABF0000000000000000FEEA5C90DBF313403E2905647CED454000000000C0550ABF0000000000000000207CE8AD99F61340F106759C5BED454000000000A0550ABF000000000000000006E5B8F4A0F91340B5F473CC22ED45400000000000550ABF0000000000000000A269F146BFFB134073E7645D11ED45400000000000550ABF0000000000000000567FF1DF73FD13408DAC80E3F9EC454000000000E0540ABF0000000000000000751F344F1EFF13408BCCEB98DDEC454000000000C0540ABF00000000000000002E7D0FE0B30014405C54615AC1EC45400000000060540ABF0000000000000000A92780E9F50214401867211D97EC45400000000000540ABF00000000000000002DF142173804144096A3B54182EC45400000000000540ABF000000000000000036BDE1E99506144021AD2DFA6AEC454000000000C0530ABF0000000000000000263CCFD4AC0814406AB75F0F52EC45400000000080530ABF00000000000000004921F323390A14407AFD63B53DEC45400000000080530ABF0000000000000000197ECB902E0B14405327D9EF32EC45400000000020530ABF00000000000000008AB886271213144016F7276902EC454000000000E0520ABF00000000000000005CA685B4A81414405C9FA2E9F7EB454000000000E0520ABF0000000000000000BA2EFF0FA81514406FD675C7DEEB454000000000E0520ABF0000000000000000A71DD4358B161440F615AB49F4EB454000000000E0520ABF0000000000000000AFFABB3AB017144087A2A9AD1FEC45400000000040530ABF00000000000000001CC2B2303A19144062556A2D29EC45400000000040530ABF00000000000000006F2FCA0EFC1A1440CCE7C22914EC45400000000020530ABF00000000000000001B3551AA091C14408A8F06E0BDEB45400000000080520ABF0000000000000000D2F95BC12F1E1440D3F8AEA674EB454000000000C0510ABF0000000000000000C48C2C9C7B1F144079D89DCC76EB45400000000000520ABF000000000000000028514B03251F144089CE25B5A9EB45400000000040520ABF000000000000000081E54416E8221440893F0038D6EB454000000000C0520ABF0000000000000000627B872F102514404BB16BFBA9EB45400000000080520ABF0000000000000000748EDEDE5A27144079EA0633A8EB45400000000080520ABF00000000000000007645590A3B291440A9E69FE5AFEB45400000000040520ABF0000000000000000CE589B376E2B144053BF40D5B4EB45400000000040520ABF0000000000000000E3A559651C2D1440A16E6B92B7EB45400000000080520ABF0000000000000000B2177E9E192F14402BD79ECDBAEB45400000000060520ABF00000000000000002F8975955A311440B9D20F73C3EB454000000000A0520ABF0000000000000000B8F5E95945341440F872321DCEEB45400000000040520ABF0000000000000000C2585AE90E36144074BB5D64CDEB45400000000080520ABF00000000000000001A0C93CAA9371440E1FCFCF0C7EB45400000000080520ABF0000000000000000B42971D3CD391440788ABA52BBEB45400000000080520ABF0000000000000000E19CC8BF0D3C14404F130E13ADEB45400000000080520ABF000000000000000000FB0B70A83D1440AA0839D39CEB45400000000020520ABF00000000000000003124F922683F1440743CC50483EB45400000000020520ABF000000000000000012860DC7D94114405CAAA9446BEB454000000000C0510ABF0000000000000000CEB71A665044144001E0370255EB454000000000C0510ABF0000000000000000DEC5859537461440C852EFF83FEB45400000000080510ABF00000000000000003BE5CDAC6448144009FE98722BEB45400000000060510ABF000000000000000069FD67AE864A14401A26E63810EB45400000000020510ABF00000000000000007700204EFA4A1440673288580BEB45400000000020510ABF0000000000000000636682D6384C1440A76519EFFDEA45400000000020510ABF000000000000000035547B83C04D14405B931DB2EEEA45400000000000510ABF0000000000000000A08301B2304E14403BF91C54EAEA454000000000E0500ABF00000000000000001A97F6BE6B501440E6C4370ACFEA45400000000080500ABF000000000000000026C7340F295214404C2128BEB9EA45400000000060500ABF0000000000000000324179906A521440E60AF34FB6EA45400000000060500ABF00000000000000002015AABE9853144039EAB093A6EA45400000000060500ABF0000000000000000C2C0B8C6B85414404A8011A598EA45400000000020500ABF0000000000000000BD40EDC7DC541440CA662DE896EA45400000000040500ABF0000000000000000791082DF9356144091298D047CEA45400000000020500ABF0000000000000000D955B9ABDC571440D588784165EA454000000000E04F0ABF000000000000000054F6C9FD335914401691DB7048EA454000000000A04F0ABF00000000000000008A1492DC725A1440ABDF8AA72BEA454000000000604F0ABF0000000000000000F2DA50806B5B14408FB8F4A010EA454000000000204F0ABF00000000000000005A3FC4ED545C1440391DAF15EDE9454000000000204F0ABF0000000000000000008DF69D535D1440AF8C54EFCAE9454000000000A04E0ABF0000000000000000FD4C133FA05E14409032FD48ACE9454000000000A04E0ABF00000000000000009E555CB4575F144083003A2C8FE9454000000000204E0ABF0000000000000000B7681B348B60144011C790406EE9454000000000004E0ABF000000000000000055914E6EF0601440DCF1DC133FE9454000000000804D0ABF00000000000000008F95ACFD2762144019FFE1112CE9454000000000404D0ABF00000000000000000ED5AF1644631440542C50591EE9454000000000804D0ABF00000000000000009C86CE5D6C651440A8841B652EE9454000000000804D0ABF00000000000000002BD3BB6C7A681440CB71DA2C3CE9454000000000A04D0ABF000000000000000073A28346A069144060CF30662EE9454000000000C04D0ABF0000000000000000184F8FFBA06A1440B8498C1B25E9454000000000804D0ABF000000000000000049FBC916FC6B1440E6EFC07D29E9454000000000804D0ABF0000000000000000784DB05C686D14406D740BDF26E9454000000000C04D0ABF0000000000000000658DB95C626E1440BBD8F70128E9454000000000804D0ABF0000000000000000FD17745CE96E14402498BB754AE9454000000000E04D0ABF0000000000000000B5C8E7F1156F1440CF9619355FE9454000000000C04D0ABF00000000000000009C5B40E0B970144067E932AC75E9454000000000004E0ABF0000000000000000A16A63193F7214403BA030F281E9454000000000404E0ABF0000000000000000DD2EBC928573144029E6940687E9454000000000404E0ABF000000000000000033FB87DC3E751440B8469464A2E9454000000000604E0ABF00000000000000000950B48E6F761440EBE4038DA6E9454000000000404E0ABF0000000000000000092651C0327814408F5B6EB09AE9454000000000404E0ABF0000000000000000A29FB2BEF97914400218CA8E9AE9454000000000204E0ABF0000000000000000DD031667DC7B1440738096BBB5E9454000000000C04E0ABF0000000000000000E95E2C3EEE7D14407EABE429D7E9454000000000E04E0ABF0000000000000000721FB58E418014402AFF8AB4F0E9454000000000004F0ABF0000000000000000D8D8461346811440996BDF4300EA454000000000204F0ABF0000000000000000C3AF7050718314408BF71C8DE8E9454000000000A04E0ABF0000000000000000BB4F7CB550851440FE60E1D8EFE9454000000000E04E0ABF0000000000000000EAEE76BF158714401D69129DD7E9454000000000C04E0ABF0000000000000000E31EA78145891440B4D10FC2B2E9454000000000804E0ABF0000000000000000A6B9B15D178B1440694FDC26A9E9454000000000604E0ABF00000000000000004390C2121A8C1440CD9507087BE9454000000000204E0ABF00000000000000009EBA48D80C8D14408EE326404FE9454000000000C04D0ABF0000000000000000FD5DBA4C368F1440535BAB9415E9454000000000A04D0ABF00000000000000004908B366C58F1440F7BCF077EEE8454000000000004D0ABF0000000000000000E7105626C49114404FA304D7B3E8454000000000A04C0ABF000000000000000080894E72539214404E3789B590E8454000000000404C0ABF00000000000000008ED7B26A0C9114406DE45B9E6FE8454000000000204C0ABF0000000000000000C51118FC5F9114409A9C4AAC45E8454000000000C04B0ABF0000000000000000D5478F38F7911440CE53F600FEE7454000000000404B0ABF00000000000000009EFD0DB1C5931440A4C2E83DE6E7454000000000004B0ABF00000000000000009D61D4727495144028C57E5DDDE7454000000000E04A0ABF00000000000000002822A945FE961440B751DEB0B4E7454000000000A04A0ABF0000000000000000F10846A6759814408AB6BC1594E7454000000000804A0ABF000000000000000056F835B892991440CF119ECB6BE7454000000000004A0ABF000000000000000095AB6197449A1440F85ED60F57E7454000000000004A0ABF00000000000000002F88B274EC9A14409136F1FB46E7454000000000E0490ABF000000000000000051CA7618439B14407E8CFA7827E7454000000000A0490ABF0000000000000000B8B091684E9B1440BBDB3DF209E745400000000040490ABF0000000000000000D84F6C4DC99C1440CAAFD46EF8E645400000000060490ABF0000000000000000282F6B342E9E1440E31D3D520DE745400000000060490ABF0000000000000000ABB40EBA2EA0144054B2BB1719E7454000000000C0490ABF00000000000000006385B9E87FA1144001F3C0492CE7454000000000C0490ABF0000000000000000C1B0C64A23A31440246937CD32E7454000000000E0490ABF000000000000000031E1BECA80A4144021F664F63AE7454000000000E0490ABF00000000000000003EDAB472C7A51440D0D7294F47E7454000000000204A0ABF000000000000000034C33F119EA714402E2B50F93EE7454000000000C0490ABF0000000000000000917B131F94A91440782C014947E7454000000000E0490ABF0000000000000000A46A7231C5AA1440BF8F491D50E7454000000000E0490ABF00000000000000001A0CD80197AC1440EAF7A7D644E7454000000000004A0ABF000000000000000040B6557ACBAD144023B8574933E7454000000000A0490ABF000000000000000071A592208DAF14402E95BAD42DE7454000000000E0490ABF0000000000000000BCE83FD035B11440A1AE179734E7454000000000C0490ABF000000000000000053EB19A13AB31440F4FC301F3CE7454000000000004A0ABF000000000000000039DCC3A850B41440822608632DE7454000000000C0490ABF0000000000000000C42018EF56B61440FA857ACB0CE745400000000080490ABF000000000000000036B460ECFDB71440D033CFCF1AE745400000000080490ABF0000000000000000CBBD272F00BA1440C286B74E1FE7454000000000A0490ABF00000000000000007522FAABAFBB14404DA4425F1DE7454000000000C0490ABF0000000000000000882A5D1121BD1440AECA7AED0BE745400000000080490ABF00000000000000000F60C17280BE144071CDDF90DFE645400000000040490ABF00000000000000001B4D0E9BA3BF1440F4F27BDDCAE6454000000000E0480ABF0000000000000000E3E32537BAC11440CBC9BFEFBFE645400000000020490ABF00000000000000001D4E8EA010C21440E9E46D4EA1E6454000000000A0480ABF00000000000000002796CAAA97C214401339841C64E645400000000060480ABF00000000000000002E3C0F10A1C314406EFB890059E645400000000000480ABF00000000000000005833C58B6FC41440AF917F194EE645400000000040480ABF000000000000000035647CCE5BC514409067CC6D51E645400000000020480ABF00000000000000005E81C74C32C61440E38E5FB650E645400000000040480ABF000000000000000056C6CF0D06C71440B20BB0DE54E645400000000060480ABF0000000000000000C226269A61C81440E24A062F4EE645400000000020480ABF00000000000000005F4E446FBAC81440D7539E7A36E6454000000000E0470ABF000000000000000074A1A2A675C9144081797F3A27E6454000000000E0470ABF00000000000000005DBF768464CA144073964D2523E645400000000080470ABF0000000000000000E52D7B4D2BCC1440904A3FE20EE6454000000000A0470ABF0000000000000000F297909641CD1440C0917E090FE645400000000060470ABF0000000000000000DD642C2FA3CE1440173C34B215E6454000000000A0470ABF0000000000000000475D5C6806D11440C288911E1DE6454000000000A0470ABF000000000000000098D8021B21D2144036EA9FE20BE645400000000080470ABF0000000000000000C9F57D345FD31440504EB46A0FE645400000000080470ABF00000000000000002A1E7392AFD4144064709CE423E6454000000000E0470ABF000000000000000014C997A9BFD51440D73B9B8F2EE6454000000000C0470ABF000000000000000015C940E31FD71440C34851543CE645400000000000480ABF00000000000000003CD22E025ADF1440C0814D250BE645400000000080470ABF000000000000000049C9FBB32ADF1440D04CD597EEE545400000000060470ABF000000000000000025F34CC382DE144003AC66F1C0E545400000000020470ABF000000000000000089732F67F2DD1440869B7545A0E5454000000000C0460ABF0000000000000000A6B1FAA9A6DD144061F67E8085E545400000000080460ABF0000000000000000074093FA2FDD14407508E19E79E5454000000000A0460ABF0000000000000000BF32D754D6DB14409FDAB9A479E545400000000060460ABF00000000000000002E426AB565DA144098A0858A6DE545400000000080460ABF0000000000000000AE9A8B16D4D81440BE8FC17B54E545400000000040460ABF00000000000000004126C66B20D7144042D7C18C48E545400000000020460ABF00000000000000003B929E253FD61440B86EFC4F3AE545400000000020460ABF00000000000000001D76B069A0D51440F64990392AE545400000000000460ABF000000000000000007D5CDEDA2D5144005D7CDBC12E5454000000000A0450ABF0000000000000000C586507A2AD614404895A86EF7E445400000000040450ABF00000000000000000646AF89F4D6144040D6C837DAE445400000000040450ABF000000000000000062E11F51E3D6144099CCD711C1E445400000000040450ABF0000000000000000DEEC211F8DD614403A5C4A07A5E4454000000000E0440ABF00000000000000008353AB4B52D614406DA9DC9180E4454000000000A0440ABF00000000000000006C80F51D01D614404827C0C561E445400000000020440ABF0000000000000000587A418550D714407D2770444AE445400000000020440ABF00000000000000007BDEB2C37CD614407C901ED02FE445400000000000440ABF000000000000000014D4F0B589D6144001D6232C01E445400000000080430ABF0000000000000000494E31718CD614402919B9CCDEE345400000000060430ABF000000000000000073BFDEB8FED51440BE72A800BEE345400000000040430ABF0000000000000000C5B05C493AD6144002F8406AA1E345400000000000430ABF0000000000000000CEF5F3C698D61440A66010D07FE3454000000000C0420ABF0000000000000000D4FE724B34D71440BB36B6755BE345400000000060420ABF00000000000000007383B0760CD81440F68392BD3EE345400000000020420ABF0000000000000000B1AFA78959DA14400C1B191C23E3454000000000E0410ABF0000000000000000116BED908FDA1440952039D0F6E2454000000000A0410ABF00000000000000002D2269DE25DA1440DC4BB681D3E245400000000060410ABF00000000000000001CFAFF6055DA14400E4D9582ADE245400000000020410ABF0000000000000000CA1189E9CAD914408C96F40C94E2454000000000C0400ABF0000000000000000FB94BE7F01D81440C06EC7F976E2454000000000C0400ABF0000000000000000ADDBA42E49D614407D723B8B5DE245400000000080400ABF0000000000000000DD48C933B9D514408A37EF784BE245400000000080400ABF0000000000000000C4F7703741D61440A5E15D3125E2454000000000E03F0ABF000000000000000073A38A44B4D6144019C77EC516E2454000000000E03F0ABF0000000000000000896E6FA7EFD6144071920F1702E2454000000000C03F0ABF0000000000000000F92836B33DD7144060EA2CB7D9E1454000000000A03F0ABF0000000000000000B7103B5CBFD614405D027996C3E1454000000000403F0ABF0000000000000000FD2AE3D426D5144030E2D651B7E1454000000000403F0ABF00000000000000004BEA0844B3D31440511F6D12C8E1454000000000203F0ABF00000000000000005DF7D39367D214403D3F7D52A0E1454000000000203F0ABF0000000000000000A5F3DDD84CD114408C6299FA8CE1454000000000E03E0ABF0000000000000000F745AE8129D114407356E61C74E1454000000000A03E0ABF0000000000000000BD6C11CEC7CF14403658440D66E1454000000000A03E0ABF00000000000000003F9D7ABA80CE144026A5678F54E1454000000000803E0ABF0000000000000000F6A8190822CD1440DF4623D248E1454000000000603E0ABF0000000000000000AA6FB017C7CC144004F396AE39E1454000000000203E0ABF00000000000000007D99F57C08CC1440B219AFA82EE1454000000000603E0ABF0000000000000000E507617220CA14405387B0C52FE1454000000000403E0ABF0000000000000000CC44F8BFA8C91440FB2E5C4320E1454000000000003E0ABF0000000000000000301CD9E98CC7144009C9FFB328E1454000000000203E0ABF00000000000000009C9516DE54C514403BF5E58B20E1454000000000003E0ABF0000000000000000F8F5A9D277C41440E254CDA30FE1454000000000003E0ABF00000000000000003D2CF7C8CFC31440C0D99C33F9E0454000000000C03D0ABF00000000000000003AE308D76BC2144065D409A6E3E0454000000000C03D0ABF00000000000000003AAEB59CF9C214408303B7FBBFE0454000000000603D0ABF0000000000000000B4EF33CDDDC11440A2BBC0DCA8E0454000000000203D0ABF000000000000000005AD36F809C114404AF9A52297E0454000000000203D0ABF0000000000000000B157F48039C01440BFA353EB77E0454000000000C03C0ABF0000000000000000E0D86C1F86BF144018E1FE0A59E0454000000000803C0ABF00000000000000009B18331EBDBE1440B887E69037E0454000000000403C0ABF00000000000000005C4F4C6608BE1440E769CE3413E0454000000000203C0ABF00000000000000009DB2F83A59BE144020B5616FF1DF454000000000C03B0ABF0000000000000000FEDE762325C014401840EE1CDFDF454000000000E03B0ABF000000000000000048836815F9C21440466B8E5DC3DF454000000000803B0ABF00000000000000009586810654C5144045D5BF1C99DF454000000000403B0ABF00000000000000006458426A2FC81440E62D89C44FDF454000000000803A0ABF00000000000000005BFD950EE4C814406C74B25814DF454000000000403A0ABF0000000000000000B29F907561C41440E0CDB32014DF454000000000203A0ABF000000000000000022D5DF11E3C314407D7A85BE01DF454000000000E0390ABF0000000000000000C421E52206C414401F2199F392DE45400000000060390ABF00000000000000001AF478554DBF1440CB53864B67DE454000000000E0380ABF00000000000000004802816252BB14403FEBC87B46DE454000000000E0380ABF0000000000000000FD8E8086D7BA1440DFF328340ADE45400000000040380ABF00000000000000008B2282F4BEBA1440F7B9D388F7DD45400000000000380ABF0000000000000000D66E44888CBA144054D36D33F1DD45400000000020380ABF00000000000000005AB7DF27DCB814405B99BA75BFDD454000000000A0370ABF0000000000000000680AC6FF48B914401CDBFDA8ABDD45400000000080370ABF000000000000000083EAA0F13BBA1440950AA3698FDD45400000000020370ABF000000000000000042AC7ED7B1BA1440083C643D68DD45400000000000370ABF00000000000000005D4C6BC8EEBA14402C8A3F9649DD454000000000C0360ABF00000000000000009611ADDB31BC1440B13401DE20DD454000000000A0360ABF00000000000000006844FE546FBC14407A69C6FEF3DC45400000000020360ABF0000000000000000ABFC6016DFBC1440A803825AD2DC454000000000E0350ABF00000000000000007A1C401AF6BC1440EAF2668FA9DC45400000000060350ABF00000000000000004AFACA4211BD1440B4F2518A91DC45400000000060350ABF0000000000000000F207A57D49BD144037CF68DA58DC45400000000020350ABF0000000000000000B2266B7482BD1440DD72DFA133DC454000000000C0340ABF0000000000000000A200DCC581BD1440C9EF4E3B0EDC45400000000060340ABF0000000000000000CC85F6C07ABD1440CE006E34D6DB45400000000000340ABF0000000000000000A71C334480BD144058A8A0E5C1DB45400000000000340ABF0000000000000000762C7ED775BD14401A2B5C03A4DB454000000000A0330ABF0000000000000000416E9DE95CBD1440F775832D80DB45400000000080330ABF0000000000000000D3D7972616BD1440A55EA8C871DB45400000000020330ABF00000000000000004D679F4FFABC14406108B5CC4ADB45400000000000330ABF000000000000000000A71760E9BC14405EE7148D37DB454000000000E0320ABF0000000000000000E1786CF6DFBC1440611C14E81BDB45400000000080320ABF0000000000000000EB6A7E97DDBC14402999DE06F2DA45400000000040320ABF0000000000000000D951C948C0BC144098CD5369D9DA45400000000020320ABF0000000000000000C76CC6F0C5BC1440E37236B6B7DA454000000000C0310ABF00000000000000004AE7B51E69BD14404B40811493DA45400000000080310ABF00000000000000001B1DC91696BF14403CB4B1C569DA45400000000060310ABF0000000000000000F560A608ADC21440C78B68EB30DA454000000000C0300ABF0000000000000000748ECE203BC414409AE7B9D5FED945400000000060300ABF00000000000000004CEAED68BCC414402249C0F6C5D9454000000000C02F0ABF00000000000000003A94CD7ECAC31440F8BE7CD69DD9454000000000A02F0ABF0000000000000000BA4F92B86AC21440BD2FCFC094D9454000000000E02F0ABF00000000000000009A01CD1EC7C114404D5DFE715DD9454000000000402F0ABF00000000000000008E020D458BBF1440D16E24BD55D9454000000000002F0ABF0000000000000000690A6E8667BD1440814E274260D9454000000000602F0ABF0000000000000000D7FE2F4333BC144099FFC2556ED9454000000000402F0ABF0000000000000000231882C0CABB1440DB9A260B8FD9454000000000A02F0ABF0000000000000000D10FAE95CBBA1440302520D093D9454000000000A02F0ABF000000000000000018985E6936BA14400E586AB98CD9454000000000402F0ABF000000000000000047D88E4931B91440CD1B5D1380D9454000000000A02F0ABF0000000000000000EE3CCBAA63B814409BED151D74D9454000000000402F0ABF0000000000000000F37114FEB7B714405DAC26EC5ED9454000000000402F0ABF0000000000000000E75198A4F4B61440F16A07374ED9454000000000002F0ABF00000000000000002BAF426565B6144072D8B6A33CD9454000000000002F0ABF00000000000000008F4F58CB7AB51440A26B97732FD9454000000000C02E0ABF0000000000000000203B2CB395B41440EF5B898727D9454000000000802E0ABF0000000000000000B70C8CF0B4B3144015BF43F31FD9454000000000002F0ABF000000000000000093C6D197D3B214406133195D15D9454000000000C02E0ABF0000000000000000A0C83D03C2B1144057EA32CB0FD9454000000000C02E0ABF0000000000000000E68EFA5EDAB0144093225C3D0BD9454000000000A02E0ABF0000000000000000D14BF75BD1AF1440D3B9FF0706D9454000000000802E0ABF00000000000000007C23552CBAAE14406F4277B307D9454000000000802E0ABF0000000000000000BCD03D68A5AD1440BA62FA6703D9454000000000A02E0ABF0000000000000000A0A0C0B0ACAC144043B5CE8401D9454000000000602E0ABF00000000000000005B79114286AB1440707E18F2FDD8454000000000602E0ABF000000000000000046F4CDF795AA1440B0ACAEBBF8D8454000000000802E0ABF0000000000000000C3C514FF9BA9144097E963B0F2D8454000000000402E0ABF00000000000000002003553067A814407F209DE2EED8454000000000602E0ABF00000000000000004FB0DFB0CBA71440BC92E6E4F0D8454000000000202E0ABF0000000000000000E719C00B4EA71440350969AEF2D8454000000000A02E0ABF00000000000000002150647566A61440FE6A4ABBF4D8454000000000A02E0ABF00000000000000004C2ADEF875A514404C47CA87C0D8454000000000202E0ABF0000000000000000839A2CDF0BA51440D37A1FC89DD8454000000000002E0ABF000000000000000072A49DB03BA41440431629368AD8454000000000E02D0ABF00000000000000007FD55DAFA1A31440D2044B6D79D8454000000000A02D0ABF00000000000000005BD388E190A21440D9076D955ED8454000000000202D0ABF00000000000000001261B4D4DAA114404F43C01055D8454000000000202D0ABF0000000000000000A0491257F5A01440FDA74D4446D8454000000000002D0ABF0000000000000000C4ADE00110A0144031AE740F39D8454000000000002D0ABF0000000000000000CE25DEB0B99E14401AB5B0C330D8454000000000002D0ABF00000000000000004CA3CFA3949D1440D0DA8BBA32D8454000000000202D0ABF000000000000000030C9D490749C144027CEFD2F37D8454000000000202D0ABF00000000000000005C38B3409E9B144032DBA7763BD8454000000000202D0ABF0000000000000000C98AB97C9C9A1440DED1A83B41D8454000000000402D0ABF0000000000000000377CFD19AB9914409BC1E12844D8454000000000202D0ABF00000000000000004520C6D038981440D101BD564FD8454000000000402D0ABF000000000000000005E8DB534E971440AFBD01C462D8454000000000602D0ABF0000000000000000A95E3ED28B96144065B8AD636CD8454000000000802D0ABF00000000000000005DEBA99CFF951440C0E874D073D8454000000000802D0ABF0000000000000000CFE0B9621A95144034917F826ED8454000000000802D0ABF000000000000000023AD617D96941440A5F5FFD053D8454000000000402D0ABF00000000000000004F4276C8EE93144014D7C1B85BD8454000000000402D0ABF000000000000000026A43986E49214405E95F3F65BD8454000000000602D0ABF0000000000000000086EFA8D18911440AB9763BB77D8454000000000602D0ABF00000000000000007B30C2B4599014401EE94D657ED8454000000000802D0ABF00000000000000009BF78627A28F14408BB67F3E8ED8454000000000E02D0ABF00000000000000006C5A9EE3918E14400EE917E298D8454000000000C02D0ABF0000000000000000ECE1FD04DC8D1440B79B0E249FD8454000000000C02D0ABF000000000000000026BC70CEEB8C1440C32B3251A9D8454000000000E02D0ABF0000000000000000527B1C75E38B144026E5DCB6B8D8454000000000E02D0ABF0000000000000000502D4228428A1440704D0FF6C9D8454000000000402E0ABF0000000000000000921A10C7988814403C68FBC4DFD8454000000000402E0ABF000000000000000090CFB8CF05881440954B6C7ECFD8454000000000202E0ABF0000000000000000D23248DEC287144096CA51EDC6D8454000000000002E0ABF0000000000000000B04C036D55871440EDC6B955BAD8454000000000202E0ABF000000000000000047070BDEEA8614408DB83C0AA7D8454000000000002E0ABF0000000000000000A94733FC1A8714400CC30C1090D8454000000000C02D0ABF00000000000000005BAC4B6EA58614408CD13CCB86D8454000000000802D0ABF0000000000000000C4FAC9F9A2851440A42C249681D8454000000000A02D0ABF0000000000000000D9C19CAAFE8414400655015E76D8454000000000802D0ABF0000000000000000BA9FFAA9FA831440F7799A3186D8454000000000802D0ABF000000000000000023525566F982144003C4E418A9D8454000000000002E0ABF0000000000000000A05B0EA48581144085DE69738CD8454000000000A02D0ABF00000000000000006C1D4830838014405FD3EF3D87D8454000000000A02D0ABF0000000000000000FB6666C7017F1440EE06C0D078D8454000000000802D0ABF000000000000000097492067407D1440270D86267BD8454000000000602D0ABF0000000000000000B070A177317C1440B444239E6BD8454000000000C02D0ABF000000000000000018AA325DFA7A14408FF92F446FD8454000000000802D0ABF0000000000000000A9EFAC066C771440C4EE22095BD8454000000000402D0ABF000000000000000063BE5880397814404567DFC685D8454000000000A02D0ABF00000000000000000B86123121781440B7F2F770A0D8454000000000E02D0ABF0000000000000000FC4179B79B761440AF7DE16FB2D8454000000000E02D0ABF0000000000000000349852988D791440273D2949E6D8454000000000602E0ABF000000000000000014B1AB0AF5791440DA9227F10DD9454000000000802E0ABF0000000000000000314827819A791440F4861DBE5DD9454000000000402F0ABF0000000000000000085F246EBC781440E83CFCD667D9454000000000202F0ABF00000000000000002A138F1F9C771440B5C5A2A26AD9454000000000602F0ABF000000000000000020986C06727714409F9A0C7478D9454000000000602F0ABF00000000000000002E890342CF761440ECD704C180D9454000000000802F0ABF0000000000000000E5A9FCAE0C761440DF6946F97AD9454000000000802F0ABF0000000000000000B4B8B173707514401028F7286BD9454000000000402F0ABF000000000000000042487DCBDD7414400FFA96576CD9454000000000402F0ABF0000000000000000AA778462A77314403FDF5C7E72D9454000000000602F0ABF00000000000000007F974A05D7721440311E83208BD9454000000000802F0ABF0000000000000000B73B60200072144062FB7F888CD9454000000000802F0ABF0000000000000000D25BAC024871144068C4F2538BD9454000000000A02F0ABF00000000000000000042DBAE36701440366888A092D9454000000000C02F0ABF0000000000000000848BE0A5696F1440FF401DB297D9454000000000A02F0ABF00000000000000005E25A0FDC76E1440AFFE615794D9454000000000A02F0ABF000000000000000002ED70BCEC6D144071CE439E98D9454000000000A02F0ABF0000000000000000C9BE2BB9256D1440CAA0A4AFA2D9454000000000C02F0ABF000000000000000005B93768376C1440EC10AE16A4D9454000000000C02F0ABF0000000000000000FD629962AD6B1440F2CC1C3394D9454000000000C02F0ABF00000000000000002D3E5F5BBC6A1440C2D087DC9BD945400000000000300ABF00000000000000008C27E222D26914404A216B348CD9454000000000A02F0ABF0000000000000000C80EC255B26814409FFAC53F81D9454000000000A02F0ABF00000000000000003B1CF8271F6814408830EC2C90D9454000000000A02F0ABF0000000000000000C2F329FEEC6614400A488BDAA4D9454000000000A02F0ABF0000000000000000100ACD7B1E66144034657EAAB6D9454000000000E02F0ABF000000000000000076BCBA6704651440707F17CCBAD945400000000000300ABF00000000000000000958BE7BFC631440151CA5BCBED945400000000000300ABF00000000000000005D266931786314403DB4F25BC2D945400000000000300ABF0000000000000000CDCBB214E2621440F60F7652C7D9454000000000E02F0ABF0000000000000000C7642037AD621440F5D5BA7FCED945400000000000300ABF0000000000000000B9CE459AF061144074AD0E63CCD945400000000020300ABF0000000000000000936F7F4A8560144046283141D5D945400000000040300ABF00000000000000009D218CDEB05F1440D1B4AD7AD8D9454000000000C02F0ABF0000000000000000022D751EE95E144009E5A2E2DDD945400000000040300ABF0000000000000000A8750890495E1440C4B65699E0D945400000000020300ABF000000000000000025531664D75D14407AD851E9E3D945400000000060300ABF0000000000000000842C7906715D1440658D6137E4D945400000000060300ABF0000000000000000DA79EF76315D14406CF1E5BFE3D945400000000060300ABF00000000000000002C9555DD015D14407E14CD5CE3D945400000000060300ABF0000000000000000798FE4FF575C144041B7AFD9E0D945400000000040300ABF0000000000000000D776220DD05B14407C8DCBC2DFD945400000000040300ABF000000000000000002637DD2155B1440AC0394C8DBD945400000000020300ABF0000000000000000628C7EF8735A14408F295ABFD7D945400000000020300ABF000000000000000041251EADC9591440488EE5A3D2D945400000000000300ABF0000000000000000B3839F99DC5814406DAC6948CED945400000000000300ABF000000000000000094BDF31D6258144040B1F0A1CDD945400000000040300ABF00000000000000004756D3259A5714404B58D64CD2D945400000000000300ABF0000000000000000E620A8C44E571440F415B662DAD945400000000040300ABF0000000000000000EFC1A24C29571440B1DD6C54E5D945400000000020300ABF0000000000000000FC0A080C11571440A50DBE19F2D945400000000060300ABF0000000000000000877655567E56144041E3F5AB01DA45400000000040300ABF00000000000000004EC42019385614403AD09BE60CDA45400000000080300ABF0000000000000000355B16CB4F561440F992AEE717DA454000000000A0300ABF000000000000000036CB0B7246561440BB333C4022DA454000000000C0300ABF0000000000000000A4285A2551561440E168F4122BDA454000000000C0300ABF0000000000000000C62D5A3BFB551440C60210CE29DA454000000000E0300ABF000000000000000022C4D0DC9855144074593F1727DA454000000000C0300ABF000000000000000082024ACE5E551440604F573023DA454000000000E0300ABF0000000000000000D330A3FAFD541440EC8F0F5C18DA454000000000A0300ABF00000000000000001A38D8DE9F541440A36F147409DA45400000000060300ABF00000000000000007BB02ABCE9531440629BA2F50DDA454000000000A0300ABF0000000000000000CA48FB86655314409B8C224415DA454000000000A0300ABF00000000000000006F2FE518C9521440B5D4AFBD0FDA454000000000A0300ABF00000000000000005DDF6DC124521440D88EF4BA08DA454000000000A0300ABF00000000000000004DFCC85CC6511440CB8358D2F8D945400000000080300ABF0000000000000000CB69CEBBF84F1440FA0E6406F4D945400000000080300ABF0000000000000000FEB33BB20F4F1440C843853FF1D945400000000040300ABF0000000000000000327048E2644D1440B08EA8B5C9D945400000000040300ABF0000000000000000842BCE54314E144079DC056C93D9454000000000802F0ABF0000000000000000B11695E3144D14408EE38A9087D9454000000000802F0ABF0000000000000000B38A91E14A4C1440A6D9B4947FD9454000000000A02F0ABF000000000000000089F4E217864A1440F5477A998AD9454000000000802F0ABF00000000000000005C4A8185E048144045344E3D92D9454000000000A02F0ABF00000000000000004E2E4C43164814405393041F99D9454000000000802F0ABF0000000000000000C6A356FDD6461440E829F4DE81D9454000000000802F0ABF000000000000000099DD41C6EF4414406D3792C65DD9454000000000402F0ABF00000000000000002C054F3043441440A330C9B074D9454000000000602F0ABF00000000000000003CCEC771CD4214408939AC6A85D9454000000000A02F0ABF0000000000000000BBA43A58BA411440B7180C5A8CD9454000000000A02F0ABF0000000000000000681F72FCC2401440AB21DE3D90D9454000000000602F0ABF0000000000000000658A422F473F14408F85D7FA8BD9454000000000A02F0ABF0000000000000000519D435F8E3E14404600FFA079D9454000000000802F0ABF000000000000000021CA482B773D1440ECFC5DBE7ED9454000000000802F0ABF0000000000000000B2F9CBB3793C144047CCAEAA89D9454000000000A02F0ABF0000000000000000BDECACEA363B14402C7DC106A2D9454000000000802F0ABF0000000000000000CDC69F485C3A14406289102BA5D9454000000000A02F0ABF00000000000000008005EBA3E3391440A38701509DD9454000000000C02F0ABF0000000000000000D228156BB93914402E51EAFC98D9454000000000A02F0ABF00000000000000000A5939136C3914407CCE2BCCA6D9454000000000E02F0ABF000000000000000016F162BB4639144017937954B2D945400000000000300ABF000000000000000031A2F0CF10391440188DCCE6BDD9454000000000E02F0ABF00000000000000007AA448AA953814406A4C0884C8D945400000000020300ABF0000000000000000C2CECD4AAD3714402A5F8E99D5D945400000000040300ABF00000000000000001525A6D7D2361440EF2E218ADAD945400000000020300ABF000000000000000024ACF9BDD8351440E4816388E2D945400000000060300ABF000000000000000074C937BE5C351440B8B9EF32EAD945400000000040300ABF0000000000000000C86C5B1E05341440E3D07CDBF3D945400000000060300ABF00000000000000002A69065B103214403E5807B410DA45400000000080300ABF0000000000000000D6C2FAFBB930144051B01EC81EDA454000000000A0300ABF0000000000000000CBCFE97FBC2F14405FB3B54B36DA454000000000E0300ABF000000000000000058FCE62EBB2E144089E4DDB242DA454000000000E0300ABF0000000000000000E18E47C3762D1440FEE633CB46DA454000000000E0300ABF000000000000000056BB745F182C14403E61D0D638DA454000000000A0300ABF00000000000000002BAF1C11452B14405C10153449DA454000000000E0300ABF0000000000000000AAAF62BC922A14405218250752DA45400000000000310ABF0000000000000000033A4F378C291440CF8FE63454DA45400000000000310ABF0000000000000000F114D8F509291440CE11B18562DA45400000000040310ABF0000000000000000EFA9399AA02814406CA3AE9B72DA45400000000060310ABF0000000000000000B966563E22281440B1231AEA80DA45400000000080310ABF0000000000000000E778CFCE92271440A36023F190DA45400000000080310ABF00000000000000008F8C8B9F03271440C117A16E9EDA454000000000C0310ABF0000000000000000AC79ADC4BB25144029401D1783DA45400000000080310ABF0000000000000000F4239A73A1251440B23962EB98DA45400000000060310ABF0000000000000000188F5A2D242414409088BB39C4DA454000000000E0310ABF00000000000000007A73E325A2231440539A5CFDDFDA45400000000020320ABF00000000000000007C9822F81E231440FD5AD124F3DA45400000000040320ABF0000000000000000C59CE76394221440738BF2C00FDB45400000000060320ABF0000000000000000E7DD9B90C52114407D6C4C0420DB454000000000A0320ABF000000000000000078FF27750021144082C4BA5541DB454000000000C0320ABF0000000000000000AE42E6CA6B201440E3FCBAA64BDB45400000000020330ABF00000000000000005EF0011C18221440EF07D5DB5FDB45400000000000330ABF0000000000000000279A75DF3D221440AF2C64F867DB45400000000000330ABF0000000000000000EA52E3C6092214407779B0D777DB45400000000020330ABF00000000000000004543F1474421144008C2236294DB454000000000A0330ABF0000000000000000D994B61C8C211440073682A5AFDB454000000000A0330ABF00000000000000002F4B5D3870211440374E1EB7C5DB454000000000C0330ABF000000000000000005E7A68C53211440C3049D2BD2DB454000000000E0330ABF0000000000000000BB1409451E211440602D6C09DFDB45400000000020340ABF00000000000000000E9CB977D5201440C202C230EEDB45400000000020340ABF0000000000000000B5A881A25A2014404603C24EFBDB45400000000020340ABF000000000000000038CE54F9941F1440C91C3FB302DC45400000000040340ABF00000000000000004111086EF01E1440AE43B86A06DC45400000000040340ABF00000000000000001B0E22AC541E14405D260B1721DC454000000000A0340ABF00000000000000008037D4DB601D1440B2FC674D16DC45400000000060340ABF0000000000000000BD7AC952271C1440BA46400C12DC454000000000A0340ABF000000000000000048E81601641B1440D28F47C629DC45400000000080340ABF0000000000000000D4A2F5C0D41A14402693F94E47DC454000000000C0340ABF00000000000000009F64BE7DC8191440A0C26D3252DC45400000000000350ABF00000000000000003160B51AD818144095FDC41F58DC45400000000000350ABF0000000000000000D02056C9CA171440A98B494C5FDC45400000000020350ABF000000000000000083E22EA85C1614400F4EC7FD66DC45400000000000350ABF00000000000000000C8F05B3D214144021263E2F58DC454000000000E0340ABF0000000000000000E29EA5B5B1131440E1B760ED48DC454000000000E0340ABF0000000000000000A14E1C29EE1214409A8BCBF632DC454000000000A0340ABF0000000000000000F5A9E301DC111440262D4F8416DC454000000000A0340ABF00000000000000001AD88D2144111440F1FC476805DC45400000000060340ABF0000000000000000B6F0EECA9110144041279584F8DB45400000000040340ABF0000000000000000D4DC0788830F14400E2557FCEADB45400000000020340ABF0000000000000000EC2646C1810E1440BA0A5447E8DB45400000000040340ABF00000000000000008D1B7B656A0D144064A350C4DADB45400000000000340ABF000000000000000038EC5E40F60B1440D31E3285DFDB45400000000000340ABF00000000000000005EB511EB2E0B144059CBD01FE9DB45400000000020340ABF000000000000000098BB35E2530A1440F24D5E9DEEDB45400000000020340ABF00000000000000005AFD568DA60914402DF50559F2DB45400000000020340ABF000000000000000063E462D7A50814400F057C97F4DB45400000000060340ABF000000000000000046577E60EE071440C2AF37D7F5DB45400000000040340ABF0000000000000000AE5EA2A32507144048835876FADB45400000000020340ABF00000000000000006409159240061440B5B8DEABFCDB45400000000020340ABF00000000000000001788CF584105144071B1DD1103DC45400000000060340ABF00000000000000002AE5B68B800414402CB17F8303DC45400000000040340ABF00000000000000003C2CC980A503144039DBA10009DC45400000000040340ABF000000000000000078EC6486F10214408C2009B816DC454000000000A0340ABF0000000000000000B22EAF613C0214408BDB6C4720DC454000000000C0340ABF00000000000000002F50B5D27701144065A191DF33DC454000000000A0340ABF00000000000000002E3B0301DF0014406ACD7CD83FDC454000000000E0340ABF0000000000000000119F00283C001440E03C968948DC454000000000E0340ABF0000000000000000EBA80D5E6BFF13409E4C152952DC454000000000E0340ABF0000000000000000DD23467F92FE13403598184F5EDC45400000000000350ABF000000000000000017E510FC48FD1340819C4C3963DC45400000000000350ABF0000000000000000CC479D4C7FFC1340813A1F8364DC454000000000E0340ABF00000000000000001ACA03C26DFB134086C81CCE6BDC45400000000000350ABF00000000000000004F153734A0FA134068D8FB1181DC45400000000060350ABF00000000000000005A75FB8BF6F913403A578D1092DC45400000000080350ABF00000000000000001C68C0F34AF91340FD4D44489DDC454000000000A0350ABF0000000000000000B3BB26CA3DF8134093EB1C58B4DC454000000000A0350ABF0000000000000000CCE5C52E6EF61340056F2C0AC6DC454000000000A0350ABF00000000000000000B2F78E045F6134073151912DADC454000000000C0350ABF000000000000000012A995101FF61340CFD555A0EDDC45400000000000360ABF0000000000000000102B0C0D86F51340D01055ADF6DC45400000000060360ABF0000000000000000D787129901F513404BF4442001DD45400000000040360ABF000000000000000094EF9B516DF41340B073A12C0DDD45400000000020360ABF0000000000000000D2E95B18F0F3134029C4875206DD45400000000060360ABF0000000000000000B5A7AD9E26F31340DCFB196F08DD45400000000040360ABF0000000000000000DE218BE4B0F21340C1D060830EDD45400000000040360ABF0000000000000000E90D2B39DEF1134097B8378011DD45400000000040360ABF0000000000000000213D6C5CD4F01340AB273EC213DD45400000000060360ABF0000000000000000E63E2B03D6EF13408BF0EC821DDD45400000000060360ABF0000000000000000DD4CBE12FCEE1340E201C22627DD45400000000080360ABF00000000000000002CDC178744EE1340C300897230DD45400000000080360ABF000000000000000084C2A5FC46ED13407334F7EA34DD454000000000A0360ABF000000000000000033E2942855EC1340C9F7053638DD454000000000A0360ABF0000000000000000704F88864AEB13407C2F643C3BDD454000000000C0360ABF0000000000000000FE10581B35EA1340F60E39CC42DD454000000000A0360ABF0000000000000000182B1B605CE91340BB34DE0F31DD45400000000080360ABF00000000000000002F5C2D4752E81340817BF47D32DD454000000000A0360ABF00000000000000006A03BBB26CE7134052BC540333DD45400000000060360ABF0000000000000000AC0504C63EE613408D364EDB37DD454000000000A0360ABF0000000000000000FC07BFCD47E513401F1E4B933CDD454000000000C0360ABF00000000000000002B515B8781E41340F31BB6534ADD454000000000A0360ABF00000000000000007EF342AD22E4134084F66F2960DD454000000000E0360ABF00000000000000007A5D6B9767E41340B0CB59F973DD454000000000E0360ABF00000000000000008E6E4D9B3CE313405DBFE12D74DD45400000000020370ABF0000000000000000C59537939DE2134022CEB5C47CDD45400000000020370ABF0000000000000000BBC2D147EFE11340E0A2180589DD45400000000020370ABF0000000000000000A967B14748E1134001496A217EDD45400000000020370ABF000000000000000076CAC5D5B3E0134057C7EC157FDD45400000000020370ABF0000000000000000EC65FAC7CCDF1340B58885068CDD45400000000040370ABF00000000000000008CA630F03ADF13407994F2D96BDD45400000000000370ABF0000000000000000AC20E1D770DE1340E79DA61754DD454000000000C0360ABF0000000000000000E0DBA65282DD1340C13C9CDA45DD454000000000C0360ABF000000000000000040C640A99FDC1340BA0EB5154BDD454000000000E0360ABF00000000000000003654B76924DC1340F189EE8A4CDD454000000000C0360ABF0000000000000000383448437DDB1340438B383555DD454000000000E0360ABF0000000000000000AF5EF301E1DA1340EB47712656DD454000000000C0360ABF00000000000000005CC7DE4A22DA1340DF1A571750DD454000000000C0360ABF0000000000000000E9DA2E0CC8D9134008797B3E53DD454000000000C0360ABF0000000000000000CBD8420A92D91340510A0FE263DD454000000000E0360ABF0000000000000000E1519F10B8D91340CD2530E277DD45400000000040370ABF0000000000000000F9717D6296D913400ADFAA748BDD45400000000040370ABF0000000000000000D0AD4D1038D913406652F4AC98DD45400000000040370ABF0000000000000000' + ST_Force2D('01060000E0E61000000100000001030000C001000000E9020000D0AD4D1038D913406652F4AC98DD45400000000040370ABF00000000000000009F10BD10CAD913404A07FCC8A1DD45400000000080370ABF00000000000000002F9A7FA252DA13407FA1DFF3B7DD454000000000A0370ABF0000000000000000D58660EB6DDA1340EA486B3CD4DD454000000000C0370ABF000000000000000043A3E63C93DB1340AC9C5061ECDD45400000000000380ABF00000000000000007312721DDCDC13402CD495DCF1DD454000000000E0370ABF00000000000000006D32025B75DD134079A0048203DE45400000000040380ABF0000000000000000C9F97C347CDD1340236B59B217DE45400000000020380ABF000000000000000090C5A668F4DD1340F15D9B8727DE45400000000040380ABF0000000000000000E1783E8188DD13409ECC053149DE454000000000C0380ABF00000000000000006674D0C6B8DD13406B5C96BC6ADE45400000000000390ABF00000000000000000FC3487B71DF1340183B8C7B61DE454000000000E0380ABF0000000000000000B61B839E54E113408A9E0F8564DE45400000000000390ABF0000000000000000807B44CAA9E213409C427D6154DE454000000000A0380ABF0000000000000000D3F38F416DE31340754638F053DE454000000000C0380ABF0000000000000000F0834B0BB7E413404DA1C9EE4ADE454000000000E0380ABF00000000000000000AE53056FEE61340CEC858D53ADE454000000000A0380ABF000000000000000093424552EEE613409D7CB3A862DE454000000000E0380ABF0000000000000000D612C0C570E81340AD2AB620B2DE45400000000080390ABF00000000000000008613A4007DE81340048E7F741ADF454000000000203A0ABF00000000000000005A848CE964EB13406A88B58A31DF454000000000803A0ABF0000000000000000637D1D300FED13408A2C711C3EDF454000000000A03A0ABF00000000000000009B14025517EE13400A6A2D3D3BDF454000000000403A0ABF00000000000000009B64B5060FF01340F99988D734DF454000000000603A0ABF00000000000000004B3EC9968DF11340C9E8BCFC39DF454000000000603A0ABF0000000000000000444041E179F213402FADFB3249DF454000000000803A0ABF0000000000000000F5BDF91536F3134007BD2F915EDF454000000000A03A0ABF000000000000000021CA096B08F41340492BC25A69DF454000000000E03A0ABF00000000000000002F74ECB11AF5134019FE6C796CDF454000000000C03A0ABF000000000000000027D0302901F61340F6F79BB266DF454000000000E03A0ABF0000000000000000E02D1E2200F71340A6EA111960DF454000000000A03A0ABF00000000000000000C66B30741F813407C5346953ADF454000000000603A0ABF000000000000000034ECAC5C3FF91340EF1686B631DF454000000000603A0ABF00000000000000006B09D7CD1BFA134058DD253425DF454000000000203A0ABF00000000000000003FFC54FD63FA1340D70E97C71CDF454000000000203A0ABF00000000000000005F075E27DEFA13408FDB0C0215DF454000000000403A0ABF000000000000000055265C7857FB1340128F3F330ADF454000000000203A0ABF0000000000000000540C731DB7FB134094659E35FDDE454000000000003A0ABF00000000000000001992BEF707FC13400A304488F5DE454000000000E0390ABF000000000000000008837F7C58FC1340FE3C8DD3EDDE454000000000E0390ABF0000000000000000001EFE4104FD13407198E03AE4DE454000000000A0390ABF00000000000000006195447ED4FD1340A5BF7A84D9DE454000000000C0390ABF00000000000000000720431BB1FE1340F5F060AFCDDE45400000000060390ABF00000000000000005AA14AA0F0FF134023A84CBEC1DE45400000000080390ABF0000000000000000CC99AC0003011440CD591852B7DE45400000000080390ABF0000000000000000A7A5A717CC0114406F02D800B6DE45400000000080390ABF000000000000000044304DD04B021440B0F017D6B8DE45400000000080390ABF00000000000000003726ECC48E021440715DF37EBFDE454000000000C0390ABF00000000000000003EF40BED69031440D798A28ECBDE454000000000C0390ABF0000000000000000E47D7B302504144060767143DCDE45400000000080390ABF00000000000000002D1B2920D804144019975E78E6DE454000000000003A0ABF000000000000000087D79C793B051440EFACD9CB03DF454000000000203A0ABF00000000000000007E5BA64763051440CA55C1B01DDF454000000000603A0ABF0000000000000000BA274EFD1C051440A3B2979B39DF454000000000803A0ABF0000000000000000FFFF3F3EFC0414407137242150DF454000000000803A0ABF0000000000000000752172DF7F0614405E6CA0A75BDF454000000000C03A0ABF00000000000000001B62D55A5B071440A9E0401B6BDF454000000000A03A0ABF0000000000000000DEED6B7D2908144047CA1D6179DF454000000000003B0ABF00000000000000000D141F15080914404F384A554EDF454000000000C03A0ABF0000000000000000812BED96D70914409D89A8504ADF454000000000A03A0ABF00000000000000008A052CCBD50A14403A5485514ADF454000000000803A0ABF0000000000000000EDF09073910B1440A5B6792A45DF454000000000A03A0ABF00000000000000004C84DDCB570D144065E0EB4055DF454000000000A03A0ABF00000000000000009B47E6FF6F0E14403CC36F3B6CDF454000000000C03A0ABF00000000000000002BFC4EB23D1014406F1B43407FDF454000000000003B0ABF0000000000000000EF70F1B5BD0F144003527A51B5DF454000000000803B0ABF0000000000000000465AD537330F14405013E338DDDF454000000000C03B0ABF00000000000000003BDDFCD1FF0E1440648F41C4F6DF454000000000E03B0ABF0000000000000000C5EC04FCE80F1440CD2EA80E0DE0454000000000E03B0ABF0000000000000000963D295F85111440BA349C4B26E0454000000000403C0ABF00000000000000009DD92EF498111440E068416A4BE0454000000000603C0ABF00000000000000008818B7A416121440819CE6D95CE0454000000000E03C0ABF0000000000000000EFD2E60B7D1214406F6221E576E0454000000000C03C0ABF00000000000000008377ECDD3F13144046D898F2A0E0454000000000403D0ABF0000000000000000A00C4FBBD013144034818DAFC4E0454000000000803D0ABF0000000000000000469AAD9C47141440EACA2DB3E1E0454000000000A03D0ABF0000000000000000BB52B2D1EC151440B6344247FEE0454000000000E03D0ABF000000000000000011C37EB5F91714404639C01A21E1454000000000403E0ABF0000000000000000C636BB095C1A1440F9DF2B8045E1454000000000403E0ABF00000000000000009979E66EE0191440DB61840A75E1454000000000A03E0ABF0000000000000000ECFEE4982B1914400F7F35CF9CE1454000000000E03E0ABF0000000000000000D3018E6FFD191440C4FEF069BCE1454000000000203F0ABF0000000000000000C061CB1D471A1440CC755E8CCAE1454000000000603F0ABF000000000000000021434BE1881A1440F812D92AD7E1454000000000C03F0ABF000000000000000069BF204CFB1A1440583CD09DEEE1454000000000803F0ABF0000000000000000A2E418FFED1A1440CB81C7C505E2454000000000E03F0ABF000000000000000094C79F1F4D1B1440DC47079129E245400000000000400ABF00000000000000001DB2CE08101D1440FFFD9FE444E245400000000060400ABF00000000000000007410FD27FC1E14409EC1136765E245400000000080400ABF00000000000000005A8DCDC2DD1E1440201C6F728FE245400000000000410ABF00000000000000009DB7A414AE1E144029466BF6B5E245400000000020410ABF000000000000000075E56F953720144033D4034EBDE245400000000020410ABF00000000000000005490D3CA4721144051FDC565CEE245400000000080410ABF0000000000000000927729EC7D221440A262144FF2E2454000000000C0410ABF000000000000000015054FD3F9221440FA43EB801FE345400000000020420ABF0000000000000000038A8B21AF221440385F0BB943E345400000000040420ABF000000000000000070CCDDCE30221440018E069651E345400000000060420ABF00000000000000000B6FC4C067211440032537A96CE345400000000080420ABF0000000000000000C5BD37FF2E241440BE2F4AF0A6E345400000000000430ABF00000000000000007E135E0D9F241440626726C6DCE345400000000060430ABF00000000000000008A6125A35C251440061C7B54F0E345400000000080430ABF00000000000000000AF90FFFF1231440DB3AE1721CE4454000000000E0430ABF0000000000000000376675DFBA221440FA39517D2EE445400000000000440ABF0000000000000000D9FBC27607221440967766913DE445400000000020440ABF0000000000000000EF9E7995AE211440E38C94C155E445400000000020440ABF00000000000000002D7A0A0CB8211440C752390977E4454000000000A0440ABF0000000000000000587CA531FB211440C009C570A0E4454000000000C0440ABF000000000000000066224FC1CF21144024FBFDF3BEE445400000000020450ABF00000000000000005BF117A47C20144050840F80DBE445400000000020450ABF0000000000000000AD423154B01F144047978222EAE445400000000060450ABF0000000000000000E8BD7002E71E1440AB59F62B02E545400000000080450ABF0000000000000000903E2074DC1E1440649338CB19E5454000000000C0450ABF0000000000000000AC4C645C511F14403F510E5736E5454000000000E0450ABF00000000000000006DC4D999CA1F14408A716BC74FE545400000000040460ABF00000000000000001956D55F51201440DCFB20C180E545400000000060460ABF00000000000000003C33CFC45D2014402514A1C19FE545400000000080460ABF00000000000000006796790FAF201440331C22A7D1E545400000000020470ABF000000000000000009B0D007592014409897B0F3F3E545400000000080470ABF00000000000000003DE7BE801D2014405A9241A916E645400000000080470ABF00000000000000008942A3C09A21144073A080963BE645400000000000480ABF00000000000000004A00BA530322144055B053BF4CE6454000000000E0470ABF0000000000000000B1123838D222144004670FD05CE645400000000020480ABF000000000000000082A34FEB8C2314403FD0C2BE6BE645400000000040480ABF00000000000000007B55D4A96F2214405FA36ECB9FE6454000000000A0480ABF0000000000000000101F739821211440DD08A9BDB1E6454000000000E0480ABF0000000000000000617DB5238B221440AD58E18DD2E645400000000000490ABF00000000000000009B377F900623144097A9A1F1E6E645400000000040490ABF00000000000000003EF6ED48A82214404D008D070AE745400000000060490ABF0000000000000000010A3A0AD92414404A5E21C21FE7454000000000C0490ABF0000000000000000A64D592C902514402054E1182AE7454000000000A0490ABF0000000000000000BD53AA988B27144056AB234549E7454000000000E0490ABF00000000000000001A1BA138622714402B471B2558E7454000000000204A0ABF00000000000000000C87EF19FC261440234E27AE77E7454000000000404A0ABF00000000000000003216EDF022261440CECFE32E9FE7454000000000A04A0ABF0000000000000000E6FE638272251440E9B5EE8EC5E7454000000000E04A0ABF000000000000000037EBC648C024144085C5A03BE2E7454000000000004B0ABF000000000000000090A9C3E92A2414404B7D488CFFE7454000000000604B0ABF0000000000000000F9E5B9A890231440AB62E1C01BE8454000000000604B0ABF0000000000000000717278AA32231440E24C9D2732E8454000000000A04B0ABF00000000000000000ADABF7A7B2214407AF7613043E8454000000000E04B0ABF0000000000000000102A09135D211440EBFF3B0568E8454000000000E04B0ABF0000000000000000B3DC2BCB2A201440DB72D9328FE8454000000000404C0ABF000000000000000083F70FD9761F144097D97592B2E8454000000000A04C0ABF0000000000000000D62F534EA91E14404DABA734D4E8454000000000E04C0ABF000000000000000013220C92431D1440CDF8E9E5F5E8454000000000204D0ABF000000000000000040025A0E091C14405D5A4ABE13E9454000000000404D0ABF00000000000000003C8F4BD5981A1440BDD044103BE9454000000000C04D0ABF0000000000000000D5E06B40D1181440B83AAE1B60E9454000000000E04D0ABF00000000000000008B12EA7BFC1614407F17482D79E9454000000000004E0ABF000000000000000078AF907F11151440AEE1EF7C8DE9454000000000604E0ABF0000000000000000D085AF97011314405859A736AEE9454000000000804E0ABF00000000000000009D2C8E4158111440E7679DEDC1E9454000000000A04E0ABF0000000000000000D9BFDAD02C0F14408A3E1948DBE9454000000000004F0ABF00000000000000005F9B909B1B0D1440046D6C8DF7E9454000000000004F0ABF00000000000000000F22F2F0820B144045F561B30CEA454000000000404F0ABF0000000000000000409682EE7309144046079A912EEA454000000000604F0ABF00000000000000006962EAFC1D081440878F1C9844EA454000000000C04F0ABF0000000000000000840C7A9C7A0614406DFF4DA95EEA45400000000000500ABF0000000000000000A3AB450D26041440261F7D9A82EA45400000000020500ABF0000000000000000F5380B27DC0214408C3CB8FAA1EA45400000000060500ABF000000000000000049D490E78200144000DD2FEDCEEA454000000000A0500ABF00000000000000008AF5C0C614FF1340FF732CBFF1EA454000000000C0500ABF000000000000000045D6874E22FE1340CE46787D0AEB45400000000040510ABF00000000000000001613CF7ABDFC1340C5850A2D2FEB45400000000080510ABF00000000000000009D9307B73EFB13407F28781752EB45400000000080510ABF000000000000000009A7FDD270FA134076CE32A767EB45400000000000520ABF0000000000000000D6CC19304EF913401CE83EA98DEB45400000000000520ABF0000000000000000267C1862E7F7134098065A75B9EB454000000000A0520ABF0000000000000000E435332707F7134074D7B158E0EB454000000000C0520ABF000000000000000096DB0F3DF4F51340C8D1706604EC45400000000000530ABF0000000000000000A14695F7DEF41340D0EA927137EC45400000000060530ABF0000000000000000BE13B646FEF3134034812A5467EC45400000000080530ABF0000000000000000835D57E11BF313405DB9AC7893EC45400000000060540ABF00000000000000004B8FFB0A2CF21340C5A3700CBDEC45400000000060540ABF00000000000000001EEDFDB42DF1134008B6EF41E0EC45400000000080540ABF0000000000000000BB074C8048F01340CCA60DA811ED45400000000000550ABF0000000000000000557BADD997F0134010FDBB6551ED454000000000A0550ABF00000000000000000D4711C2BBF113400763D43571ED45400000000080550ABF0000000000000000E1EE806E83F21340301BA3A486ED454000000000E0550ABF0000000000000000FEEA5C90DBF313403E2905647CED454000000000C0550ABF0000000000000000207CE8AD99F61340F106759C5BED454000000000A0550ABF000000000000000006E5B8F4A0F91340B5F473CC22ED45400000000000550ABF0000000000000000A269F146BFFB134073E7645D11ED45400000000000550ABF0000000000000000567FF1DF73FD13408DAC80E3F9EC454000000000E0540ABF0000000000000000751F344F1EFF13408BCCEB98DDEC454000000000C0540ABF00000000000000002E7D0FE0B30014405C54615AC1EC45400000000060540ABF0000000000000000A92780E9F50214401867211D97EC45400000000000540ABF00000000000000002DF142173804144096A3B54182EC45400000000000540ABF000000000000000036BDE1E99506144021AD2DFA6AEC454000000000C0530ABF0000000000000000263CCFD4AC0814406AB75F0F52EC45400000000080530ABF00000000000000004921F323390A14407AFD63B53DEC45400000000080530ABF0000000000000000197ECB902E0B14405327D9EF32EC45400000000020530ABF00000000000000008AB886271213144016F7276902EC454000000000E0520ABF00000000000000005CA685B4A81414405C9FA2E9F7EB454000000000E0520ABF0000000000000000BA2EFF0FA81514406FD675C7DEEB454000000000E0520ABF0000000000000000A71DD4358B161440F615AB49F4EB454000000000E0520ABF0000000000000000AFFABB3AB017144087A2A9AD1FEC45400000000040530ABF00000000000000001CC2B2303A19144062556A2D29EC45400000000040530ABF00000000000000006F2FCA0EFC1A1440CCE7C22914EC45400000000020530ABF00000000000000001B3551AA091C14408A8F06E0BDEB45400000000080520ABF0000000000000000D2F95BC12F1E1440D3F8AEA674EB454000000000C0510ABF0000000000000000C48C2C9C7B1F144079D89DCC76EB45400000000000520ABF000000000000000028514B03251F144089CE25B5A9EB45400000000040520ABF000000000000000081E54416E8221440893F0038D6EB454000000000C0520ABF0000000000000000627B872F102514404BB16BFBA9EB45400000000080520ABF0000000000000000748EDEDE5A27144079EA0633A8EB45400000000080520ABF00000000000000007645590A3B291440A9E69FE5AFEB45400000000040520ABF0000000000000000CE589B376E2B144053BF40D5B4EB45400000000040520ABF0000000000000000E3A559651C2D1440A16E6B92B7EB45400000000080520ABF0000000000000000B2177E9E192F14402BD79ECDBAEB45400000000060520ABF00000000000000002F8975955A311440B9D20F73C3EB454000000000A0520ABF0000000000000000B8F5E95945341440F872321DCEEB45400000000040520ABF0000000000000000C2585AE90E36144074BB5D64CDEB45400000000080520ABF00000000000000001A0C93CAA9371440E1FCFCF0C7EB45400000000080520ABF0000000000000000B42971D3CD391440788ABA52BBEB45400000000080520ABF0000000000000000E19CC8BF0D3C14404F130E13ADEB45400000000080520ABF000000000000000000FB0B70A83D1440AA0839D39CEB45400000000020520ABF00000000000000003124F922683F1440743CC50483EB45400000000020520ABF000000000000000012860DC7D94114405CAAA9446BEB454000000000C0510ABF0000000000000000CEB71A665044144001E0370255EB454000000000C0510ABF0000000000000000DEC5859537461440C852EFF83FEB45400000000080510ABF00000000000000003BE5CDAC6448144009FE98722BEB45400000000060510ABF000000000000000069FD67AE864A14401A26E63810EB45400000000020510ABF00000000000000007700204EFA4A1440673288580BEB45400000000020510ABF0000000000000000636682D6384C1440A76519EFFDEA45400000000020510ABF000000000000000035547B83C04D14405B931DB2EEEA45400000000000510ABF0000000000000000A08301B2304E14403BF91C54EAEA454000000000E0500ABF00000000000000001A97F6BE6B501440E6C4370ACFEA45400000000080500ABF000000000000000026C7340F295214404C2128BEB9EA45400000000060500ABF0000000000000000324179906A521440E60AF34FB6EA45400000000060500ABF00000000000000002015AABE9853144039EAB093A6EA45400000000060500ABF0000000000000000C2C0B8C6B85414404A8011A598EA45400000000020500ABF0000000000000000BD40EDC7DC541440CA662DE896EA45400000000040500ABF0000000000000000791082DF9356144091298D047CEA45400000000020500ABF0000000000000000D955B9ABDC571440D588784165EA454000000000E04F0ABF000000000000000054F6C9FD335914401691DB7048EA454000000000A04F0ABF00000000000000008A1492DC725A1440ABDF8AA72BEA454000000000604F0ABF0000000000000000F2DA50806B5B14408FB8F4A010EA454000000000204F0ABF00000000000000005A3FC4ED545C1440391DAF15EDE9454000000000204F0ABF0000000000000000008DF69D535D1440AF8C54EFCAE9454000000000A04E0ABF0000000000000000FD4C133FA05E14409032FD48ACE9454000000000A04E0ABF00000000000000009E555CB4575F144083003A2C8FE9454000000000204E0ABF0000000000000000B7681B348B60144011C790406EE9454000000000004E0ABF000000000000000055914E6EF0601440DCF1DC133FE9454000000000804D0ABF00000000000000008F95ACFD2762144019FFE1112CE9454000000000404D0ABF00000000000000000ED5AF1644631440542C50591EE9454000000000804D0ABF00000000000000009C86CE5D6C651440A8841B652EE9454000000000804D0ABF00000000000000002BD3BB6C7A681440CB71DA2C3CE9454000000000A04D0ABF000000000000000073A28346A069144060CF30662EE9454000000000C04D0ABF0000000000000000184F8FFBA06A1440B8498C1B25E9454000000000804D0ABF000000000000000049FBC916FC6B1440E6EFC07D29E9454000000000804D0ABF0000000000000000784DB05C686D14406D740BDF26E9454000000000C04D0ABF0000000000000000658DB95C626E1440BBD8F70128E9454000000000804D0ABF0000000000000000FD17745CE96E14402498BB754AE9454000000000E04D0ABF0000000000000000B5C8E7F1156F1440CF9619355FE9454000000000C04D0ABF00000000000000009C5B40E0B970144067E932AC75E9454000000000004E0ABF0000000000000000A16A63193F7214403BA030F281E9454000000000404E0ABF0000000000000000DD2EBC928573144029E6940687E9454000000000404E0ABF000000000000000033FB87DC3E751440B8469464A2E9454000000000604E0ABF00000000000000000950B48E6F761440EBE4038DA6E9454000000000404E0ABF0000000000000000092651C0327814408F5B6EB09AE9454000000000404E0ABF0000000000000000A29FB2BEF97914400218CA8E9AE9454000000000204E0ABF0000000000000000DD031667DC7B1440738096BBB5E9454000000000C04E0ABF0000000000000000E95E2C3EEE7D14407EABE429D7E9454000000000E04E0ABF0000000000000000721FB58E418014402AFF8AB4F0E9454000000000004F0ABF0000000000000000D8D8461346811440996BDF4300EA454000000000204F0ABF0000000000000000C3AF7050718314408BF71C8DE8E9454000000000A04E0ABF0000000000000000BB4F7CB550851440FE60E1D8EFE9454000000000E04E0ABF0000000000000000EAEE76BF158714401D69129DD7E9454000000000C04E0ABF0000000000000000E31EA78145891440B4D10FC2B2E9454000000000804E0ABF0000000000000000A6B9B15D178B1440694FDC26A9E9454000000000604E0ABF00000000000000004390C2121A8C1440CD9507087BE9454000000000204E0ABF00000000000000009EBA48D80C8D14408EE326404FE9454000000000C04D0ABF0000000000000000FD5DBA4C368F1440535BAB9415E9454000000000A04D0ABF00000000000000004908B366C58F1440F7BCF077EEE8454000000000004D0ABF0000000000000000E7105626C49114404FA304D7B3E8454000000000A04C0ABF000000000000000080894E72539214404E3789B590E8454000000000404C0ABF00000000000000008ED7B26A0C9114406DE45B9E6FE8454000000000204C0ABF0000000000000000C51118FC5F9114409A9C4AAC45E8454000000000C04B0ABF0000000000000000D5478F38F7911440CE53F600FEE7454000000000404B0ABF00000000000000009EFD0DB1C5931440A4C2E83DE6E7454000000000004B0ABF00000000000000009D61D4727495144028C57E5DDDE7454000000000E04A0ABF00000000000000002822A945FE961440B751DEB0B4E7454000000000A04A0ABF0000000000000000F10846A6759814408AB6BC1594E7454000000000804A0ABF000000000000000056F835B892991440CF119ECB6BE7454000000000004A0ABF000000000000000095AB6197449A1440F85ED60F57E7454000000000004A0ABF00000000000000002F88B274EC9A14409136F1FB46E7454000000000E0490ABF000000000000000051CA7618439B14407E8CFA7827E7454000000000A0490ABF0000000000000000B8B091684E9B1440BBDB3DF209E745400000000040490ABF0000000000000000D84F6C4DC99C1440CAAFD46EF8E645400000000060490ABF0000000000000000282F6B342E9E1440E31D3D520DE745400000000060490ABF0000000000000000ABB40EBA2EA0144054B2BB1719E7454000000000C0490ABF00000000000000006385B9E87FA1144001F3C0492CE7454000000000C0490ABF0000000000000000C1B0C64A23A31440246937CD32E7454000000000E0490ABF000000000000000031E1BECA80A4144021F664F63AE7454000000000E0490ABF00000000000000003EDAB472C7A51440D0D7294F47E7454000000000204A0ABF000000000000000034C33F119EA714402E2B50F93EE7454000000000C0490ABF0000000000000000917B131F94A91440782C014947E7454000000000E0490ABF0000000000000000A46A7231C5AA1440BF8F491D50E7454000000000E0490ABF00000000000000001A0CD80197AC1440EAF7A7D644E7454000000000004A0ABF000000000000000040B6557ACBAD144023B8574933E7454000000000A0490ABF000000000000000071A592208DAF14402E95BAD42DE7454000000000E0490ABF0000000000000000BCE83FD035B11440A1AE179734E7454000000000C0490ABF000000000000000053EB19A13AB31440F4FC301F3CE7454000000000004A0ABF000000000000000039DCC3A850B41440822608632DE7454000000000C0490ABF0000000000000000C42018EF56B61440FA857ACB0CE745400000000080490ABF000000000000000036B460ECFDB71440D033CFCF1AE745400000000080490ABF0000000000000000CBBD272F00BA1440C286B74E1FE7454000000000A0490ABF00000000000000007522FAABAFBB14404DA4425F1DE7454000000000C0490ABF0000000000000000882A5D1121BD1440AECA7AED0BE745400000000080490ABF00000000000000000F60C17280BE144071CDDF90DFE645400000000040490ABF00000000000000001B4D0E9BA3BF1440F4F27BDDCAE6454000000000E0480ABF0000000000000000E3E32537BAC11440CBC9BFEFBFE645400000000020490ABF00000000000000001D4E8EA010C21440E9E46D4EA1E6454000000000A0480ABF00000000000000002796CAAA97C214401339841C64E645400000000060480ABF00000000000000002E3C0F10A1C314406EFB890059E645400000000000480ABF00000000000000005833C58B6FC41440AF917F194EE645400000000040480ABF000000000000000035647CCE5BC514409067CC6D51E645400000000020480ABF00000000000000005E81C74C32C61440E38E5FB650E645400000000040480ABF000000000000000056C6CF0D06C71440B20BB0DE54E645400000000060480ABF0000000000000000C226269A61C81440E24A062F4EE645400000000020480ABF00000000000000005F4E446FBAC81440D7539E7A36E6454000000000E0470ABF000000000000000074A1A2A675C9144081797F3A27E6454000000000E0470ABF00000000000000005DBF768464CA144073964D2523E645400000000080470ABF0000000000000000E52D7B4D2BCC1440904A3FE20EE6454000000000A0470ABF0000000000000000F297909641CD1440C0917E090FE645400000000060470ABF0000000000000000DD642C2FA3CE1440173C34B215E6454000000000A0470ABF0000000000000000475D5C6806D11440C288911E1DE6454000000000A0470ABF000000000000000098D8021B21D2144036EA9FE20BE645400000000080470ABF0000000000000000C9F57D345FD31440504EB46A0FE645400000000080470ABF00000000000000002A1E7392AFD4144064709CE423E6454000000000E0470ABF000000000000000014C997A9BFD51440D73B9B8F2EE6454000000000C0470ABF000000000000000015C940E31FD71440C34851543CE645400000000000480ABF00000000000000003CD22E025ADF1440C0814D250BE645400000000080470ABF000000000000000049C9FBB32ADF1440D04CD597EEE545400000000060470ABF000000000000000025F34CC382DE144003AC66F1C0E545400000000020470ABF000000000000000089732F67F2DD1440869B7545A0E5454000000000C0460ABF0000000000000000A6B1FAA9A6DD144061F67E8085E545400000000080460ABF0000000000000000074093FA2FDD14407508E19E79E5454000000000A0460ABF0000000000000000BF32D754D6DB14409FDAB9A479E545400000000060460ABF00000000000000002E426AB565DA144098A0858A6DE545400000000080460ABF0000000000000000AE9A8B16D4D81440BE8FC17B54E545400000000040460ABF00000000000000004126C66B20D7144042D7C18C48E545400000000020460ABF00000000000000003B929E253FD61440B86EFC4F3AE545400000000020460ABF00000000000000001D76B069A0D51440F64990392AE545400000000000460ABF000000000000000007D5CDEDA2D5144005D7CDBC12E5454000000000A0450ABF0000000000000000C586507A2AD614404895A86EF7E445400000000040450ABF00000000000000000646AF89F4D6144040D6C837DAE445400000000040450ABF000000000000000062E11F51E3D6144099CCD711C1E445400000000040450ABF0000000000000000DEEC211F8DD614403A5C4A07A5E4454000000000E0440ABF00000000000000008353AB4B52D614406DA9DC9180E4454000000000A0440ABF00000000000000006C80F51D01D614404827C0C561E445400000000020440ABF0000000000000000587A418550D714407D2770444AE445400000000020440ABF00000000000000007BDEB2C37CD614407C901ED02FE445400000000000440ABF000000000000000014D4F0B589D6144001D6232C01E445400000000080430ABF0000000000000000494E31718CD614402919B9CCDEE345400000000060430ABF000000000000000073BFDEB8FED51440BE72A800BEE345400000000040430ABF0000000000000000C5B05C493AD6144002F8406AA1E345400000000000430ABF0000000000000000CEF5F3C698D61440A66010D07FE3454000000000C0420ABF0000000000000000D4FE724B34D71440BB36B6755BE345400000000060420ABF00000000000000007383B0760CD81440F68392BD3EE345400000000020420ABF0000000000000000B1AFA78959DA14400C1B191C23E3454000000000E0410ABF0000000000000000116BED908FDA1440952039D0F6E2454000000000A0410ABF00000000000000002D2269DE25DA1440DC4BB681D3E245400000000060410ABF00000000000000001CFAFF6055DA14400E4D9582ADE245400000000020410ABF0000000000000000CA1189E9CAD914408C96F40C94E2454000000000C0400ABF0000000000000000FB94BE7F01D81440C06EC7F976E2454000000000C0400ABF0000000000000000ADDBA42E49D614407D723B8B5DE245400000000080400ABF0000000000000000DD48C933B9D514408A37EF784BE245400000000080400ABF0000000000000000C4F7703741D61440A5E15D3125E2454000000000E03F0ABF000000000000000073A38A44B4D6144019C77EC516E2454000000000E03F0ABF0000000000000000896E6FA7EFD6144071920F1702E2454000000000C03F0ABF0000000000000000F92836B33DD7144060EA2CB7D9E1454000000000A03F0ABF0000000000000000B7103B5CBFD614405D027996C3E1454000000000403F0ABF0000000000000000FD2AE3D426D5144030E2D651B7E1454000000000403F0ABF00000000000000004BEA0844B3D31440511F6D12C8E1454000000000203F0ABF00000000000000005DF7D39367D214403D3F7D52A0E1454000000000203F0ABF0000000000000000A5F3DDD84CD114408C6299FA8CE1454000000000E03E0ABF0000000000000000F745AE8129D114407356E61C74E1454000000000A03E0ABF0000000000000000BD6C11CEC7CF14403658440D66E1454000000000A03E0ABF00000000000000003F9D7ABA80CE144026A5678F54E1454000000000803E0ABF0000000000000000F6A8190822CD1440DF4623D248E1454000000000603E0ABF0000000000000000AA6FB017C7CC144004F396AE39E1454000000000203E0ABF00000000000000007D99F57C08CC1440B219AFA82EE1454000000000603E0ABF0000000000000000E507617220CA14405387B0C52FE1454000000000403E0ABF0000000000000000CC44F8BFA8C91440FB2E5C4320E1454000000000003E0ABF0000000000000000301CD9E98CC7144009C9FFB328E1454000000000203E0ABF00000000000000009C9516DE54C514403BF5E58B20E1454000000000003E0ABF0000000000000000F8F5A9D277C41440E254CDA30FE1454000000000003E0ABF00000000000000003D2CF7C8CFC31440C0D99C33F9E0454000000000C03D0ABF00000000000000003AE308D76BC2144065D409A6E3E0454000000000C03D0ABF00000000000000003AAEB59CF9C214408303B7FBBFE0454000000000603D0ABF0000000000000000B4EF33CDDDC11440A2BBC0DCA8E0454000000000203D0ABF000000000000000005AD36F809C114404AF9A52297E0454000000000203D0ABF0000000000000000B157F48039C01440BFA353EB77E0454000000000C03C0ABF0000000000000000E0D86C1F86BF144018E1FE0A59E0454000000000803C0ABF00000000000000009B18331EBDBE1440B887E69037E0454000000000403C0ABF00000000000000005C4F4C6608BE1440E769CE3413E0454000000000203C0ABF00000000000000009DB2F83A59BE144020B5616FF1DF454000000000C03B0ABF0000000000000000FEDE762325C014401840EE1CDFDF454000000000E03B0ABF000000000000000048836815F9C21440466B8E5DC3DF454000000000803B0ABF00000000000000009586810654C5144045D5BF1C99DF454000000000403B0ABF00000000000000006458426A2FC81440E62D89C44FDF454000000000803A0ABF00000000000000005BFD950EE4C814406C74B25814DF454000000000403A0ABF0000000000000000B29F907561C41440E0CDB32014DF454000000000203A0ABF000000000000000022D5DF11E3C314407D7A85BE01DF454000000000E0390ABF0000000000000000C421E52206C414401F2199F392DE45400000000060390ABF00000000000000001AF478554DBF1440CB53864B67DE454000000000E0380ABF00000000000000004802816252BB14403FEBC87B46DE454000000000E0380ABF0000000000000000FD8E8086D7BA1440DFF328340ADE45400000000040380ABF00000000000000008B2282F4BEBA1440F7B9D388F7DD45400000000000380ABF0000000000000000D66E44888CBA144054D36D33F1DD45400000000020380ABF00000000000000005AB7DF27DCB814405B99BA75BFDD454000000000A0370ABF0000000000000000680AC6FF48B914401CDBFDA8ABDD45400000000080370ABF000000000000000083EAA0F13BBA1440950AA3698FDD45400000000020370ABF000000000000000042AC7ED7B1BA1440083C643D68DD45400000000000370ABF00000000000000005D4C6BC8EEBA14402C8A3F9649DD454000000000C0360ABF00000000000000009611ADDB31BC1440B13401DE20DD454000000000A0360ABF00000000000000006844FE546FBC14407A69C6FEF3DC45400000000020360ABF0000000000000000ABFC6016DFBC1440A803825AD2DC454000000000E0350ABF00000000000000007A1C401AF6BC1440EAF2668FA9DC45400000000060350ABF00000000000000004AFACA4211BD1440B4F2518A91DC45400000000060350ABF0000000000000000F207A57D49BD144037CF68DA58DC45400000000020350ABF0000000000000000B2266B7482BD1440DD72DFA133DC454000000000C0340ABF0000000000000000A200DCC581BD1440C9EF4E3B0EDC45400000000060340ABF0000000000000000CC85F6C07ABD1440CE006E34D6DB45400000000000340ABF0000000000000000A71C334480BD144058A8A0E5C1DB45400000000000340ABF0000000000000000762C7ED775BD14401A2B5C03A4DB454000000000A0330ABF0000000000000000416E9DE95CBD1440F775832D80DB45400000000080330ABF0000000000000000D3D7972616BD1440A55EA8C871DB45400000000020330ABF00000000000000004D679F4FFABC14406108B5CC4ADB45400000000000330ABF000000000000000000A71760E9BC14405EE7148D37DB454000000000E0320ABF0000000000000000E1786CF6DFBC1440611C14E81BDB45400000000080320ABF0000000000000000EB6A7E97DDBC14402999DE06F2DA45400000000040320ABF0000000000000000D951C948C0BC144098CD5369D9DA45400000000020320ABF0000000000000000C76CC6F0C5BC1440E37236B6B7DA454000000000C0310ABF00000000000000004AE7B51E69BD14404B40811493DA45400000000080310ABF00000000000000001B1DC91696BF14403CB4B1C569DA45400000000060310ABF0000000000000000F560A608ADC21440C78B68EB30DA454000000000C0300ABF0000000000000000748ECE203BC414409AE7B9D5FED945400000000060300ABF00000000000000004CEAED68BCC414402249C0F6C5D9454000000000C02F0ABF00000000000000003A94CD7ECAC31440F8BE7CD69DD9454000000000A02F0ABF0000000000000000BA4F92B86AC21440BD2FCFC094D9454000000000E02F0ABF00000000000000009A01CD1EC7C114404D5DFE715DD9454000000000402F0ABF00000000000000008E020D458BBF1440D16E24BD55D9454000000000002F0ABF0000000000000000690A6E8667BD1440814E274260D9454000000000602F0ABF0000000000000000D7FE2F4333BC144099FFC2556ED9454000000000402F0ABF0000000000000000231882C0CABB1440DB9A260B8FD9454000000000A02F0ABF0000000000000000D10FAE95CBBA1440302520D093D9454000000000A02F0ABF000000000000000018985E6936BA14400E586AB98CD9454000000000402F0ABF000000000000000047D88E4931B91440CD1B5D1380D9454000000000A02F0ABF0000000000000000EE3CCBAA63B814409BED151D74D9454000000000402F0ABF0000000000000000F37114FEB7B714405DAC26EC5ED9454000000000402F0ABF0000000000000000E75198A4F4B61440F16A07374ED9454000000000002F0ABF00000000000000002BAF426565B6144072D8B6A33CD9454000000000002F0ABF00000000000000008F4F58CB7AB51440A26B97732FD9454000000000C02E0ABF0000000000000000203B2CB395B41440EF5B898727D9454000000000802E0ABF0000000000000000B70C8CF0B4B3144015BF43F31FD9454000000000002F0ABF000000000000000093C6D197D3B214406133195D15D9454000000000C02E0ABF0000000000000000A0C83D03C2B1144057EA32CB0FD9454000000000C02E0ABF0000000000000000E68EFA5EDAB0144093225C3D0BD9454000000000A02E0ABF0000000000000000D14BF75BD1AF1440D3B9FF0706D9454000000000802E0ABF00000000000000007C23552CBAAE14406F4277B307D9454000000000802E0ABF0000000000000000BCD03D68A5AD1440BA62FA6703D9454000000000A02E0ABF0000000000000000A0A0C0B0ACAC144043B5CE8401D9454000000000602E0ABF00000000000000005B79114286AB1440707E18F2FDD8454000000000602E0ABF000000000000000046F4CDF795AA1440B0ACAEBBF8D8454000000000802E0ABF0000000000000000C3C514FF9BA9144097E963B0F2D8454000000000402E0ABF00000000000000002003553067A814407F209DE2EED8454000000000602E0ABF00000000000000004FB0DFB0CBA71440BC92E6E4F0D8454000000000202E0ABF0000000000000000E719C00B4EA71440350969AEF2D8454000000000A02E0ABF00000000000000002150647566A61440FE6A4ABBF4D8454000000000A02E0ABF00000000000000004C2ADEF875A514404C47CA87C0D8454000000000202E0ABF0000000000000000839A2CDF0BA51440D37A1FC89DD8454000000000002E0ABF000000000000000072A49DB03BA41440431629368AD8454000000000E02D0ABF00000000000000007FD55DAFA1A31440D2044B6D79D8454000000000A02D0ABF00000000000000005BD388E190A21440D9076D955ED8454000000000202D0ABF00000000000000001261B4D4DAA114404F43C01055D8454000000000202D0ABF0000000000000000A0491257F5A01440FDA74D4446D8454000000000002D0ABF0000000000000000C4ADE00110A0144031AE740F39D8454000000000002D0ABF0000000000000000CE25DEB0B99E14401AB5B0C330D8454000000000002D0ABF00000000000000004CA3CFA3949D1440D0DA8BBA32D8454000000000202D0ABF000000000000000030C9D490749C144027CEFD2F37D8454000000000202D0ABF00000000000000005C38B3409E9B144032DBA7763BD8454000000000202D0ABF0000000000000000C98AB97C9C9A1440DED1A83B41D8454000000000402D0ABF0000000000000000377CFD19AB9914409BC1E12844D8454000000000202D0ABF00000000000000004520C6D038981440D101BD564FD8454000000000402D0ABF000000000000000005E8DB534E971440AFBD01C462D8454000000000602D0ABF0000000000000000A95E3ED28B96144065B8AD636CD8454000000000802D0ABF00000000000000005DEBA99CFF951440C0E874D073D8454000000000802D0ABF0000000000000000CFE0B9621A95144034917F826ED8454000000000802D0ABF000000000000000023AD617D96941440A5F5FFD053D8454000000000402D0ABF00000000000000004F4276C8EE93144014D7C1B85BD8454000000000402D0ABF000000000000000026A43986E49214405E95F3F65BD8454000000000602D0ABF0000000000000000086EFA8D18911440AB9763BB77D8454000000000602D0ABF00000000000000007B30C2B4599014401EE94D657ED8454000000000802D0ABF00000000000000009BF78627A28F14408BB67F3E8ED8454000000000E02D0ABF00000000000000006C5A9EE3918E14400EE917E298D8454000000000C02D0ABF0000000000000000ECE1FD04DC8D1440B79B0E249FD8454000000000C02D0ABF000000000000000026BC70CEEB8C1440C32B3251A9D8454000000000E02D0ABF0000000000000000527B1C75E38B144026E5DCB6B8D8454000000000E02D0ABF0000000000000000502D4228428A1440704D0FF6C9D8454000000000402E0ABF0000000000000000921A10C7988814403C68FBC4DFD8454000000000402E0ABF000000000000000090CFB8CF05881440954B6C7ECFD8454000000000202E0ABF0000000000000000D23248DEC287144096CA51EDC6D8454000000000002E0ABF0000000000000000B04C036D55871440EDC6B955BAD8454000000000202E0ABF000000000000000047070BDEEA8614408DB83C0AA7D8454000000000002E0ABF0000000000000000A94733FC1A8714400CC30C1090D8454000000000C02D0ABF00000000000000005BAC4B6EA58614408CD13CCB86D8454000000000802D0ABF0000000000000000C4FAC9F9A2851440A42C249681D8454000000000A02D0ABF0000000000000000D9C19CAAFE8414400655015E76D8454000000000802D0ABF0000000000000000BA9FFAA9FA831440F7799A3186D8454000000000802D0ABF000000000000000023525566F982144003C4E418A9D8454000000000002E0ABF0000000000000000A05B0EA48581144085DE69738CD8454000000000A02D0ABF00000000000000006C1D4830838014405FD3EF3D87D8454000000000A02D0ABF0000000000000000FB6666C7017F1440EE06C0D078D8454000000000802D0ABF000000000000000097492067407D1440270D86267BD8454000000000602D0ABF0000000000000000B070A177317C1440B444239E6BD8454000000000C02D0ABF000000000000000018AA325DFA7A14408FF92F446FD8454000000000802D0ABF0000000000000000A9EFAC066C771440C4EE22095BD8454000000000402D0ABF000000000000000063BE5880397814404567DFC685D8454000000000A02D0ABF00000000000000000B86123121781440B7F2F770A0D8454000000000E02D0ABF0000000000000000FC4179B79B761440AF7DE16FB2D8454000000000E02D0ABF0000000000000000349852988D791440273D2949E6D8454000000000602E0ABF000000000000000014B1AB0AF5791440DA9227F10DD9454000000000802E0ABF0000000000000000314827819A791440F4861DBE5DD9454000000000402F0ABF0000000000000000085F246EBC781440E83CFCD667D9454000000000202F0ABF00000000000000002A138F1F9C771440B5C5A2A26AD9454000000000602F0ABF000000000000000020986C06727714409F9A0C7478D9454000000000602F0ABF00000000000000002E890342CF761440ECD704C180D9454000000000802F0ABF0000000000000000E5A9FCAE0C761440DF6946F97AD9454000000000802F0ABF0000000000000000B4B8B173707514401028F7286BD9454000000000402F0ABF000000000000000042487DCBDD7414400FFA96576CD9454000000000402F0ABF0000000000000000AA778462A77314403FDF5C7E72D9454000000000602F0ABF00000000000000007F974A05D7721440311E83208BD9454000000000802F0ABF0000000000000000B73B60200072144062FB7F888CD9454000000000802F0ABF0000000000000000D25BAC024871144068C4F2538BD9454000000000A02F0ABF00000000000000000042DBAE36701440366888A092D9454000000000C02F0ABF0000000000000000848BE0A5696F1440FF401DB297D9454000000000A02F0ABF00000000000000005E25A0FDC76E1440AFFE615794D9454000000000A02F0ABF000000000000000002ED70BCEC6D144071CE439E98D9454000000000A02F0ABF0000000000000000C9BE2BB9256D1440CAA0A4AFA2D9454000000000C02F0ABF000000000000000005B93768376C1440EC10AE16A4D9454000000000C02F0ABF0000000000000000FD629962AD6B1440F2CC1C3394D9454000000000C02F0ABF00000000000000002D3E5F5BBC6A1440C2D087DC9BD945400000000000300ABF00000000000000008C27E222D26914404A216B348CD9454000000000A02F0ABF0000000000000000C80EC255B26814409FFAC53F81D9454000000000A02F0ABF00000000000000003B1CF8271F6814408830EC2C90D9454000000000A02F0ABF0000000000000000C2F329FEEC6614400A488BDAA4D9454000000000A02F0ABF0000000000000000100ACD7B1E66144034657EAAB6D9454000000000E02F0ABF000000000000000076BCBA6704651440707F17CCBAD945400000000000300ABF00000000000000000958BE7BFC631440151CA5BCBED945400000000000300ABF00000000000000005D266931786314403DB4F25BC2D945400000000000300ABF0000000000000000CDCBB214E2621440F60F7652C7D9454000000000E02F0ABF0000000000000000C7642037AD621440F5D5BA7FCED945400000000000300ABF0000000000000000B9CE459AF061144074AD0E63CCD945400000000020300ABF0000000000000000936F7F4A8560144046283141D5D945400000000040300ABF00000000000000009D218CDEB05F1440D1B4AD7AD8D9454000000000C02F0ABF0000000000000000022D751EE95E144009E5A2E2DDD945400000000040300ABF0000000000000000A8750890495E1440C4B65699E0D945400000000020300ABF000000000000000025531664D75D14407AD851E9E3D945400000000060300ABF0000000000000000842C7906715D1440658D6137E4D945400000000060300ABF0000000000000000DA79EF76315D14406CF1E5BFE3D945400000000060300ABF00000000000000002C9555DD015D14407E14CD5CE3D945400000000060300ABF0000000000000000798FE4FF575C144041B7AFD9E0D945400000000040300ABF0000000000000000D776220DD05B14407C8DCBC2DFD945400000000040300ABF000000000000000002637DD2155B1440AC0394C8DBD945400000000020300ABF0000000000000000628C7EF8735A14408F295ABFD7D945400000000020300ABF000000000000000041251EADC9591440488EE5A3D2D945400000000000300ABF0000000000000000B3839F99DC5814406DAC6948CED945400000000000300ABF000000000000000094BDF31D6258144040B1F0A1CDD945400000000040300ABF00000000000000004756D3259A5714404B58D64CD2D945400000000000300ABF0000000000000000E620A8C44E571440F415B662DAD945400000000040300ABF0000000000000000EFC1A24C29571440B1DD6C54E5D945400000000020300ABF0000000000000000FC0A080C11571440A50DBE19F2D945400000000060300ABF0000000000000000877655567E56144041E3F5AB01DA45400000000040300ABF00000000000000004EC42019385614403AD09BE60CDA45400000000080300ABF0000000000000000355B16CB4F561440F992AEE717DA454000000000A0300ABF000000000000000036CB0B7246561440BB333C4022DA454000000000C0300ABF0000000000000000A4285A2551561440E168F4122BDA454000000000C0300ABF0000000000000000C62D5A3BFB551440C60210CE29DA454000000000E0300ABF000000000000000022C4D0DC9855144074593F1727DA454000000000C0300ABF000000000000000082024ACE5E551440604F573023DA454000000000E0300ABF0000000000000000D330A3FAFD541440EC8F0F5C18DA454000000000A0300ABF00000000000000001A38D8DE9F541440A36F147409DA45400000000060300ABF00000000000000007BB02ABCE9531440629BA2F50DDA454000000000A0300ABF0000000000000000CA48FB86655314409B8C224415DA454000000000A0300ABF00000000000000006F2FE518C9521440B5D4AFBD0FDA454000000000A0300ABF00000000000000005DDF6DC124521440D88EF4BA08DA454000000000A0300ABF00000000000000004DFCC85CC6511440CB8358D2F8D945400000000080300ABF0000000000000000CB69CEBBF84F1440FA0E6406F4D945400000000080300ABF0000000000000000FEB33BB20F4F1440C843853FF1D945400000000040300ABF0000000000000000327048E2644D1440B08EA8B5C9D945400000000040300ABF0000000000000000842BCE54314E144079DC056C93D9454000000000802F0ABF0000000000000000B11695E3144D14408EE38A9087D9454000000000802F0ABF0000000000000000B38A91E14A4C1440A6D9B4947FD9454000000000A02F0ABF000000000000000089F4E217864A1440F5477A998AD9454000000000802F0ABF00000000000000005C4A8185E048144045344E3D92D9454000000000A02F0ABF00000000000000004E2E4C43164814405393041F99D9454000000000802F0ABF0000000000000000C6A356FDD6461440E829F4DE81D9454000000000802F0ABF000000000000000099DD41C6EF4414406D3792C65DD9454000000000402F0ABF00000000000000002C054F3043441440A330C9B074D9454000000000602F0ABF00000000000000003CCEC771CD4214408939AC6A85D9454000000000A02F0ABF0000000000000000BBA43A58BA411440B7180C5A8CD9454000000000A02F0ABF0000000000000000681F72FCC2401440AB21DE3D90D9454000000000602F0ABF0000000000000000658A422F473F14408F85D7FA8BD9454000000000A02F0ABF0000000000000000519D435F8E3E14404600FFA079D9454000000000802F0ABF000000000000000021CA482B773D1440ECFC5DBE7ED9454000000000802F0ABF0000000000000000B2F9CBB3793C144047CCAEAA89D9454000000000A02F0ABF0000000000000000BDECACEA363B14402C7DC106A2D9454000000000802F0ABF0000000000000000CDC69F485C3A14406289102BA5D9454000000000A02F0ABF00000000000000008005EBA3E3391440A38701509DD9454000000000C02F0ABF0000000000000000D228156BB93914402E51EAFC98D9454000000000A02F0ABF00000000000000000A5939136C3914407CCE2BCCA6D9454000000000E02F0ABF000000000000000016F162BB4639144017937954B2D945400000000000300ABF000000000000000031A2F0CF10391440188DCCE6BDD9454000000000E02F0ABF00000000000000007AA448AA953814406A4C0884C8D945400000000020300ABF0000000000000000C2CECD4AAD3714402A5F8E99D5D945400000000040300ABF00000000000000001525A6D7D2361440EF2E218ADAD945400000000020300ABF000000000000000024ACF9BDD8351440E4816388E2D945400000000060300ABF000000000000000074C937BE5C351440B8B9EF32EAD945400000000040300ABF0000000000000000C86C5B1E05341440E3D07CDBF3D945400000000060300ABF00000000000000002A69065B103214403E5807B410DA45400000000080300ABF0000000000000000D6C2FAFBB930144051B01EC81EDA454000000000A0300ABF0000000000000000CBCFE97FBC2F14405FB3B54B36DA454000000000E0300ABF000000000000000058FCE62EBB2E144089E4DDB242DA454000000000E0300ABF0000000000000000E18E47C3762D1440FEE633CB46DA454000000000E0300ABF000000000000000056BB745F182C14403E61D0D638DA454000000000A0300ABF00000000000000002BAF1C11452B14405C10153449DA454000000000E0300ABF0000000000000000AAAF62BC922A14405218250752DA45400000000000310ABF0000000000000000033A4F378C291440CF8FE63454DA45400000000000310ABF0000000000000000F114D8F509291440CE11B18562DA45400000000040310ABF0000000000000000EFA9399AA02814406CA3AE9B72DA45400000000060310ABF0000000000000000B966563E22281440B1231AEA80DA45400000000080310ABF0000000000000000E778CFCE92271440A36023F190DA45400000000080310ABF00000000000000008F8C8B9F03271440C117A16E9EDA454000000000C0310ABF0000000000000000AC79ADC4BB25144029401D1783DA45400000000080310ABF0000000000000000F4239A73A1251440B23962EB98DA45400000000060310ABF0000000000000000188F5A2D242414409088BB39C4DA454000000000E0310ABF00000000000000007A73E325A2231440539A5CFDDFDA45400000000020320ABF00000000000000007C9822F81E231440FD5AD124F3DA45400000000040320ABF0000000000000000C59CE76394221440738BF2C00FDB45400000000060320ABF0000000000000000E7DD9B90C52114407D6C4C0420DB454000000000A0320ABF000000000000000078FF27750021144082C4BA5541DB454000000000C0320ABF0000000000000000AE42E6CA6B201440E3FCBAA64BDB45400000000020330ABF00000000000000005EF0011C18221440EF07D5DB5FDB45400000000000330ABF0000000000000000279A75DF3D221440AF2C64F867DB45400000000000330ABF0000000000000000EA52E3C6092214407779B0D777DB45400000000020330ABF00000000000000004543F1474421144008C2236294DB454000000000A0330ABF0000000000000000D994B61C8C211440073682A5AFDB454000000000A0330ABF00000000000000002F4B5D3870211440374E1EB7C5DB454000000000C0330ABF000000000000000005E7A68C53211440C3049D2BD2DB454000000000E0330ABF0000000000000000BB1409451E211440602D6C09DFDB45400000000020340ABF00000000000000000E9CB977D5201440C202C230EEDB45400000000020340ABF0000000000000000B5A881A25A2014404603C24EFBDB45400000000020340ABF000000000000000038CE54F9941F1440C91C3FB302DC45400000000040340ABF00000000000000004111086EF01E1440AE43B86A06DC45400000000040340ABF00000000000000001B0E22AC541E14405D260B1721DC454000000000A0340ABF00000000000000008037D4DB601D1440B2FC674D16DC45400000000060340ABF0000000000000000BD7AC952271C1440BA46400C12DC454000000000A0340ABF000000000000000048E81601641B1440D28F47C629DC45400000000080340ABF0000000000000000D4A2F5C0D41A14402693F94E47DC454000000000C0340ABF00000000000000009F64BE7DC8191440A0C26D3252DC45400000000000350ABF00000000000000003160B51AD818144095FDC41F58DC45400000000000350ABF0000000000000000D02056C9CA171440A98B494C5FDC45400000000020350ABF000000000000000083E22EA85C1614400F4EC7FD66DC45400000000000350ABF00000000000000000C8F05B3D214144021263E2F58DC454000000000E0340ABF0000000000000000E29EA5B5B1131440E1B760ED48DC454000000000E0340ABF0000000000000000A14E1C29EE1214409A8BCBF632DC454000000000A0340ABF0000000000000000F5A9E301DC111440262D4F8416DC454000000000A0340ABF00000000000000001AD88D2144111440F1FC476805DC45400000000060340ABF0000000000000000B6F0EECA9110144041279584F8DB45400000000040340ABF0000000000000000D4DC0788830F14400E2557FCEADB45400000000020340ABF0000000000000000EC2646C1810E1440BA0A5447E8DB45400000000040340ABF00000000000000008D1B7B656A0D144064A350C4DADB45400000000000340ABF000000000000000038EC5E40F60B1440D31E3285DFDB45400000000000340ABF00000000000000005EB511EB2E0B144059CBD01FE9DB45400000000020340ABF000000000000000098BB35E2530A1440F24D5E9DEEDB45400000000020340ABF00000000000000005AFD568DA60914402DF50559F2DB45400000000020340ABF000000000000000063E462D7A50814400F057C97F4DB45400000000060340ABF000000000000000046577E60EE071440C2AF37D7F5DB45400000000040340ABF0000000000000000AE5EA2A32507144048835876FADB45400000000020340ABF00000000000000006409159240061440B5B8DEABFCDB45400000000020340ABF00000000000000001788CF584105144071B1DD1103DC45400000000060340ABF00000000000000002AE5B68B800414402CB17F8303DC45400000000040340ABF00000000000000003C2CC980A503144039DBA10009DC45400000000040340ABF000000000000000078EC6486F10214408C2009B816DC454000000000A0340ABF0000000000000000B22EAF613C0214408BDB6C4720DC454000000000C0340ABF00000000000000002F50B5D27701144065A191DF33DC454000000000A0340ABF00000000000000002E3B0301DF0014406ACD7CD83FDC454000000000E0340ABF0000000000000000119F00283C001440E03C968948DC454000000000E0340ABF0000000000000000EBA80D5E6BFF13409E4C152952DC454000000000E0340ABF0000000000000000DD23467F92FE13403598184F5EDC45400000000000350ABF000000000000000017E510FC48FD1340819C4C3963DC45400000000000350ABF0000000000000000CC479D4C7FFC1340813A1F8364DC454000000000E0340ABF00000000000000001ACA03C26DFB134086C81CCE6BDC45400000000000350ABF00000000000000004F153734A0FA134068D8FB1181DC45400000000060350ABF00000000000000005A75FB8BF6F913403A578D1092DC45400000000080350ABF00000000000000001C68C0F34AF91340FD4D44489DDC454000000000A0350ABF0000000000000000B3BB26CA3DF8134093EB1C58B4DC454000000000A0350ABF0000000000000000CCE5C52E6EF61340056F2C0AC6DC454000000000A0350ABF00000000000000000B2F78E045F6134073151912DADC454000000000C0350ABF000000000000000012A995101FF61340CFD555A0EDDC45400000000000360ABF0000000000000000102B0C0D86F51340D01055ADF6DC45400000000060360ABF0000000000000000D787129901F513404BF4442001DD45400000000040360ABF000000000000000094EF9B516DF41340B073A12C0DDD45400000000020360ABF0000000000000000D2E95B18F0F3134029C4875206DD45400000000060360ABF0000000000000000B5A7AD9E26F31340DCFB196F08DD45400000000040360ABF0000000000000000DE218BE4B0F21340C1D060830EDD45400000000040360ABF0000000000000000E90D2B39DEF1134097B8378011DD45400000000040360ABF0000000000000000213D6C5CD4F01340AB273EC213DD45400000000060360ABF0000000000000000E63E2B03D6EF13408BF0EC821DDD45400000000060360ABF0000000000000000DD4CBE12FCEE1340E201C22627DD45400000000080360ABF00000000000000002CDC178744EE1340C300897230DD45400000000080360ABF000000000000000084C2A5FC46ED13407334F7EA34DD454000000000A0360ABF000000000000000033E2942855EC1340C9F7053638DD454000000000A0360ABF0000000000000000704F88864AEB13407C2F643C3BDD454000000000C0360ABF0000000000000000FE10581B35EA1340F60E39CC42DD454000000000A0360ABF0000000000000000182B1B605CE91340BB34DE0F31DD45400000000080360ABF00000000000000002F5C2D4752E81340817BF47D32DD454000000000A0360ABF00000000000000006A03BBB26CE7134052BC540333DD45400000000060360ABF0000000000000000AC0504C63EE613408D364EDB37DD454000000000A0360ABF0000000000000000FC07BFCD47E513401F1E4B933CDD454000000000C0360ABF00000000000000002B515B8781E41340F31BB6534ADD454000000000A0360ABF00000000000000007EF342AD22E4134084F66F2960DD454000000000E0360ABF00000000000000007A5D6B9767E41340B0CB59F973DD454000000000E0360ABF00000000000000008E6E4D9B3CE313405DBFE12D74DD45400000000020370ABF0000000000000000C59537939DE2134022CEB5C47CDD45400000000020370ABF0000000000000000BBC2D147EFE11340E0A2180589DD45400000000020370ABF0000000000000000A967B14748E1134001496A217EDD45400000000020370ABF000000000000000076CAC5D5B3E0134057C7EC157FDD45400000000020370ABF0000000000000000EC65FAC7CCDF1340B58885068CDD45400000000040370ABF00000000000000008CA630F03ADF13407994F2D96BDD45400000000000370ABF0000000000000000AC20E1D770DE1340E79DA61754DD454000000000C0360ABF0000000000000000E0DBA65282DD1340C13C9CDA45DD454000000000C0360ABF000000000000000040C640A99FDC1340BA0EB5154BDD454000000000E0360ABF00000000000000003654B76924DC1340F189EE8A4CDD454000000000C0360ABF0000000000000000383448437DDB1340438B383555DD454000000000E0360ABF0000000000000000AF5EF301E1DA1340EB47712656DD454000000000C0360ABF00000000000000005CC7DE4A22DA1340DF1A571750DD454000000000C0360ABF0000000000000000E9DA2E0CC8D9134008797B3E53DD454000000000C0360ABF0000000000000000CBD8420A92D91340510A0FE263DD454000000000E0360ABF0000000000000000E1519F10B8D91340CD2530E277DD45400000000040370ABF0000000000000000F9717D6296D913400ADFAA748BDD45400000000040370ABF0000000000000000D0AD4D1038D913406652F4AC98DD45400000000040370ABF0000000000000000') ), (84, 'Le Coulon du ravin de la Prée au Grand Vallat inclus', - '01060000E0E61000000100000001030000C00100000081010000645802C2779516408C1B4CB228F3454000000000E0600ABF0000000000000000343C5EC4A094164054C96BB215F3454000000000A0600ABF0000000000000000D133C6F22E941640C2D93793FBF245400000000060600ABF00000000000000005196BDF2519316400206FB55D8F245400000000020600ABF000000000000000032BDEA3C5F921640EC599121C7F245400000000000600ABF00000000000000006727882DFD9116408D339B67A4F2454000000000C05F0ABF0000000000000000F12650D4F29016405D8EA09485F2454000000000A05F0ABF0000000000000000CA23DA39329016405874D82363F2454000000000005F0ABF00000000000000006C3B5EAB708F164028DBA8A323F2454000000000E05E0ABF00000000000000009B513F5F548E164083C241AEEEF1454000000000405E0ABF000000000000000023643E66388D1640837FFA0AD5F1454000000000205E0ABF00000000000000002A451FA9358C1640893822F2B1F1454000000000E05D0ABF0000000000000000CF6405365C8B16400D304A1B98F1454000000000A05D0ABF00000000000000007583E324378A164080F3C6A37DF1454000000000605D0ABF000000000000000006B7797767891640D18B5F7B65F1454000000000405D0ABF0000000000000000AB512E00F1881640C3CA8E0A52F1454000000000205D0ABF0000000000000000F6C328198A881640BC20E3333FF1454000000000205D0ABF0000000000000000F1565052F18616405FF0F04F51F1454000000000E05C0ABF00000000000000008593DF458F8516401EC1554862F1454000000000405D0ABF0000000000000000010ADC043D841640BBD15AF670F1454000000000A05D0ABF00000000000000007B7AAC406282164087E4093579F1454000000000405D0ABF00000000000000009241418EA5811640E1D1576A6EF1454000000000205D0ABF0000000000000000DBE272D6CB801640A08B990661F1454000000000405D0ABF00000000000000006B844ED9377F1640A8A2D15F67F1454000000000805D0ABF0000000000000000ED2684828C7D1640FE5F00747BF1454000000000405D0ABF00000000000000005F19A0DE4D7D1640B493FEC551F1454000000000005D0ABF00000000000000006309FB817F7C1640E704FE2C3CF1454000000000205D0ABF00000000000000006EAF8BB7677B1640B1F0B1C92CF1454000000000E05C0ABF0000000000000000685C2884CA7A1640566B1A2D1CF1454000000000C05C0ABF0000000000000000BACD1785AB791640CF802821F9F0454000000000605C0ABF000000000000000014EF3157A17816407DBBBBFBDCF0454000000000405C0ABF0000000000000000C11DBAF5FC761640B876266BF0F0454000000000405C0ABF000000000000000038BAF23D14751640BB1684CBE8F0454000000000205C0ABF0000000000000000772704660C731640924BA7D8E8F0454000000000205C0ABF0000000000000000F30962B8D1711640CA517A20DCF0454000000000205C0ABF000000000000000019AF68609E7016408DA88824CDF0454000000000405C0ABF000000000000000094165122F26E1640BD0ACBE5B3F0454000000000005C0ABF0000000000000000BB10F279DE6C164071B2385CD8F0454000000000005C0ABF00000000000000008B11D358826A1640A05E595BD6F0454000000000205C0ABF0000000000000000BC8FE8EC1D691640B709378ECAF0454000000000205C0ABF0000000000000000DD8C7D9C3168164024EAF2F2C5F0454000000000205C0ABF000000000000000070FA247128671640AEF4BDE6B8F0454000000000205C0ABF000000000000000089607015AB6416401BC9B6B69FF0454000000000E05B0ABF0000000000000000CC682AA70E6316406386CA18C9F0454000000000405C0ABF000000000000000015356249BD611640186755C0F0F0454000000000805C0ABF00000000000000004296E6C3416116409DA247EA0DF1454000000000805C0ABF0000000000000000315F5A5B505F1640F3B034061DF1454000000000A05C0ABF0000000000000000AA4DE7091F5D164075EF6EEC1DF1454000000000C05C0ABF00000000000000004F503840CB5B1640AD1D4E1112F1454000000000A05C0ABF0000000000000000C9101B0DB35A1640CACF64061FF1454000000000005D0ABF00000000000000003D08BF9059591640469ED9A640F1454000000000E05C0ABF000000000000000055314D7855581640F2ECE75E3AF1454000000000005D0ABF000000000000000014BA2EED6C571640A365121441F1454000000000005D0ABF000000000000000013EC8E06EC5616408381406B50F1454000000000405D0ABF00000000000000002EB45CC7AF541640261E04725EF1454000000000605D0ABF0000000000000000795CA62785521640C026F21367F1454000000000605D0ABF000000000000000046A6C378DB4F1640FAA10BF373F1454000000000805D0ABF000000000000000039F07C34E24C1640C6F85A6614F2454000000000805E0ABF0000000000000000B1C64003F441164002B71B92CCF245400000000020600ABF0000000000000000A9EE6E8F4A3E1640499A7D7A0AF345400000000060600ABF0000000000000000AB4EB52A873A1640D7DED62A5CF3454000000000E0600ABF00000000000000004E63E09028361640D75805BB83F345400000000040610ABF000000000000000010BB2089342E16403F7E70DCCEF345400000000020620ABF00000000000000000DD19A166E2D16402221509BE8F345400000000020620ABF00000000000000005FA437023E2D1640BBE4DA1437F4454000000000A0620ABF0000000000000000E50493E2E12C1640A73E7EDE62F445400000000000630ABF000000000000000055E219092A2D1640D283E5ECADF4454000000000A0630ABF0000000000000000DFF84A664E2D16405EBC42A5CAF4454000000000E0630ABF00000000000000008CFF30A4302F1640AFCEE326E5F445400000000000640ABF0000000000000000E7D6C9E8D5301640C4A6F25525F545400000000080640ABF00000000000000008E2D200CFC3116402B7C620371F545400000000020650ABF000000000000000066ED79A8273516405F7C1496B9F5454000000000A0650ABF0000000000000000B37ED3A631371640A25276C70FF645400000000020660ABF0000000000000000CDFC78D2A23516407F7230663AF6454000000000A0660ABF0000000000000000AB0F4ECE68351640AED9A0D16DF6454000000000E0660ABF0000000000000000E4250AAB223716409F26CC6BBAF645400000000080670ABF00000000000000004FFA5553013716402985B4E96EF7454000000000E0680ABF00000000000000005C1B40EBBF361640102164CECAF745400000000080690ABF00000000000000004E7B5523293416403C72A6816AF8454000000000E06A0ABF00000000000000004E12A639A6311640DC8C2FA0E7F8454000000000A06B0ABF0000000000000000E8A47DCDD32F16402E7B05904BF9454000000000606C0ABF00000000000000006A39EC4BB12F16406721FCF9C0F9454000000000206D0ABF000000000000000009A314DBB730164060D697DC1DFA454000000000406E0ABF000000000000000010CB9C35942D1640BE2B35D463FA454000000000406E0ABF00000000000000008B0E5883F92E1640F7DBBC8AD7FA454000000000606F0ABF0000000000000000B9FFC6F2102C16404162E0EF0EFB454000000000A06F0ABF00000000000000002DEDCC4A1F291640692DB29D3BFB45400000000040700ABF0000000000000000149EC50F8B2716409B09BFF685FB454000000000C0700ABF0000000000000000016A3ED365251640548027F8E3FB45400000000080710ABF0000000000000000BC500CF56F231640E118FC020AFC454000000000C0710ABF00000000000000003A938E7B851E164061EC77D21CFC454000000000C0710ABF0000000000000000AEF4CAE0D91616402823F65822FC454000000000E0710ABF0000000000000000BAEC316290131640CF06EAC451FC45400000000020720ABF0000000000000000060100A494111640B2F03A0A61FC45400000000060720ABF000000000000000040E6F301A40F1640BC6E554071FC45400000000060720ABF00000000000000008AE16DDAE70C1640EDC788E78CFC454000000000C0720ABF00000000000000001BC2C0E838091640AB23B2CD81FC454000000000A0720ABF0000000000000000A876358DA2071640CA26E4A19AFC454000000000C0720ABF00000000000000002B5815D67E051640BFA34F4C95FC454000000000A0720ABF0000000000000000753159C65B041640CD6192FC9FFC454000000000E0720ABF000000000000000002E9D0AA15021640533A9B5DB6FC454000000000E0720ABF0000000000000000E33647595F001640297D57B0B1FC454000000000E0720ABF0000000000000000F2E71102A0FE1540A771AFF7B2FC45400000000000730ABF000000000000000014ABF04ED8FC15407158652CBBFC454000000000E0720ABF000000000000000071C57E38A2FA15400FE91994C4FC45400000000020730ABF00000000000000000BC0FCA315FA1540121788CA14FD454000000000A0730ABF0000000000000000A387BD968FF815407EE57A5933FD45400000000000740ABF0000000000000000809CB253D7F615406B906A1E55FD45400000000020740ABF00000000000000001A65F5DE0AF61540852F2F4777FD45400000000080740ABF00000000000000009C10FC8DB2F51540A4A9A1D289FD45400000000080740ABF0000000000000000076E3112B6F415407469470B6AFE45400000000060760ABF000000000000000087E79B483EF4154099F2ADB8DDFE45400000000000770ABF000000000000000019C76A8D25F41540D559508C2EFF454000000000C0770ABF00000000000000003F47986AD5F3154096D8D49558FF45400000000020780ABF0000000000000000B7E72BE2B5F315407C18CB1077FF45400000000040780ABF0000000000000000C69F27AEB8F31540111B91FC8EFF45400000000060780ABF0000000000000000A12DD36A58F315406C10031D1A0046400000000080790ABF0000000000000000779DC93909F11540B257F3997C00464000000000607A0ABF00000000000000008A99B38DADEF1540DC75F397B600464000000000C07A0ABF0000000000000000E36AE6E5F1EC1540855B9775EF00464000000000207B0ABF0000000000000000032AAD5DDCEB15401AB681CB2D01464000000000807B0ABF00000000000000003F131051AAEA15401F37F19CA001464000000000607C0ABF0000000000000000294498642EE915404B9ED48E1502464000000000807D0ABF000000000000000076877B08B4E515409D25330F9D02464000000000407E0ABF0000000000000000DF00E9066BE215402DD369D00303464000000000E07E0ABF00000000000000001C58D165EEDF1540EB5F3E875A03464000000000C07F0ABF0000000000000000CD23DC2FE5DC1540549D1DB2B10346400000000080800ABF00000000000000006FADDF87CDD9154028FED0C12E0446400000000040810ABF0000000000000000BAE9908800D71540DDEEF9178C0446400000000000820ABF00000000000000009A2E37B455D31540F11BC00EE30446400000000080820ABF0000000000000000CDB0E7AAE8D0154049F792A5230546400000000040830ABF0000000000000000223109A139D0154073B4B2245405464000000000A0830ABF00000000000000007EF797D79FD015400141A43A910546400000000020840ABF0000000000000000907961CB21D31540671F0B84CF0546400000000080840ABF0000000000000000DD92BBEEC8DA15407B68D85AFE05464000000000C0840ABF00000000000000005BD5B96FE5DE1540E094C911580646400000000080850ABF0000000000000000E4145009E3E21540334C32398E06464000000000A0850ABF00000000000000001B8C1F58C3E01540F77DD1CA9B0746400000000000880ABF0000000000000000C988CBCA8EDC15402D72115A1E08464000000000C0880ABF0000000000000000212891D2CDE015405D14BE255D0846400000000040890ABF00000000000000004C313F3B0AE415405335AFC1DC08464000000000808A0ABF000000000000000050B205ECE4E71540B49B2DD90609464000000000A08A0ABF0000000000000000C0996E9B9EEA1540963A434CFF08464000000000608A0ABF0000000000000000C5A188C7EFEC1540CF2DD4D1690846400000000080890ABF000000000000000047FFAAA77CEF1540E5DA65C16E0846400000000080890ABF0000000000000000C4C7079749F3154097FEDDBE5E0846400000000040890ABF0000000000000000888BCEC8D7F5154073115F0E6D08464000000000A0890ABF0000000000000000CB55BF9246FA15408658FC3FED08464000000000408A0ABF0000000000000000A67EED1BC9FD15405545D391C508464000000000208A0ABF000000000000000006CCEC3119FF154069D13D41A808464000000000208A0ABF0000000000000000F6E3269CF801164002509A389F08464000000000C0890ABF0000000000000000AAF5E91CC6041640A8E5F120D008464000000000408A0ABF0000000000000000B52B69E33A051640E1D7D3ED1D09464000000000E08A0ABF00000000000000002C67DA28830A1640ED23E5A83009464000000000E08A0ABF0000000000000000DDFFC610E30D1640025EB6A85D09464000000000208B0ABF0000000000000000B541AF6C8B151640319F11249709464000000000A08B0ABF00000000000000007D8EEFC1AE17164086E4A686ED09464000000000408C0ABF0000000000000000BE726A5DA21B1640EBF151161A0A464000000000A08C0ABF00000000000000007054A0A959221640962D2D59EE09464000000000408C0ABF0000000000000000534884BB05251640ACD5F8F6090A464000000000608C0ABF0000000000000000AF7327125E27164067F16228EA09464000000000408C0ABF000000000000000074EE85B51B291640A7DC7945140A464000000000808C0ABF0000000000000000F67CD254F82A1640A9E036CE4A0A464000000000208D0ABF000000000000000081ECA641DE301640383A4C9D8B0A464000000000808D0ABF0000000000000000D1196A39D23216400DBB9926630A464000000000408D0ABF0000000000000000EDED08D402351640F1400D41220A464000000000C08C0ABF00000000000000004411173E16381640237FAFFE2A0A464000000000E08C0ABF0000000000000000E2D526DDED3A164092630FA39E0A464000000000808D0ABF000000000000000095D436C3B93F16400B477283EA0A464000000000208E0ABF00000000000000006F95E8F2724616405145EF11CD0A464000000000008E0ABF0000000000000000173CA720DB4D1640AA2257BBBC0A464000000000C08D0ABF000000000000000085767FB2ED501640CE3748D0450B464000000000008F0ABF00000000000000001F245DC9CF521640885381809B0B464000000000E08F0ABF00000000000000004790EEEDD0511640FFDD5976EE0B46400000000000900ABF0000000000000000C02B7F877B5316400BB7DCD5410C46400000000000910ABF00000000000000003DA637C04A57164089DFC24AE30C464000000000E0910ABF0000000000000000BFD68369985B1640ABF221BD640D464000000000E0920ABF00000000000000000B5F7968B35C1640998D5126DC0D464000000000C0930ABF000000000000000009621E68A55A1640E09901544B0E46400000000080940ABF00000000000000008A71A5740C5B16404C7ABF5C850E46400000000020950ABF0000000000000000321D0FF5935B164062A4CC63EC0E464000000000E0950ABF00000000000000007EE2CEC1F45B16406E3242E5440F464000000000A0960ABF0000000000000000D3E6532AD861164088C4B8EA780F464000000000E0960ABF0000000000000000F2847A093D6516403271E79C3C1046400000000020980ABF0000000000000000AA73E2A8B069164056ADCE3DA71046400000000060990ABF0000000000000000AEDC8CDD446A16402BCEC75B7311464000000000E09A0ABF0000000000000000CA9B667FD46C16404C374A9A5D12464000000000A09C0ABF0000000000000000FC01C3A3916F16404C168227BA12464000000000209D0ABF0000000000000000317BFFF3E86C1640C22AA83A3613464000000000009E0ABF00000000000000005697F9FF6D6A1640C7E114749513464000000000A09E0ABF00000000000000001D3FB28D6469164014B670B5C113464000000000209F0ABF000000000000000091CEF23C516C164017CA5F0DB013464000000000409F0ABF00000000000000003C82159C297516407D5C79406A13464000000000809E0ABF0000000000000000141998807C781640886AD0DA6513464000000000609E0ABF0000000000000000E6218FFABE7C1640E7B8AA884613464000000000409E0ABF00000000000000007BBE0CDB6E8016404E7258D24113464000000000409E0ABF00000000000000007C843304778516400CCFFDE73E13464000000000009E0ABF0000000000000000706322EDB7891640A4748DE14613464000000000409E0ABF0000000000000000BCFEFCF8F7851640A97DBF3B2F13464000000000209E0ABF000000000000000070DA8894B6841640FB6541E6F912464000000000C09D0ABF00000000000000000D3C0C06247F164087EFB258BF12464000000000209D0ABF00000000000000003ECD9720EE7F164048FCB53E5512464000000000409C0ABF00000000000000000F4975E9107F1640EF90C00CEA11464000000000809B0ABF0000000000000000929DB4CACC7C1640CE9FF168CA11464000000000409B0ABF00000000000000005C8BC32E66771640C0C6C8683311464000000000409A0ABF00000000000000003BB5CBA158771640F4480923B11046400000000060990ABF000000000000000031FEFACC6777164062CF84CF0B1046400000000060980ABF000000000000000016E8FE339E791640884D9262A80F46400000000040970ABF0000000000000000A7853294037B16408BFFE1CCF80E46400000000000960ABF000000000000000022AA4A62B47A1640D160404BAF0E46400000000040950ABF00000000000000004EAF3AFBC976164004E91CCB480E46400000000080940ABF00000000000000008DCFAFFF177616405235F2F6DB0D464000000000A0930ABF0000000000000000CE6728ABB178164076D39F67850D46400000000060930ABF0000000000000000F7E3B27AA87616400247AC67250D464000000000A0920ABF0000000000000000CDF6EFDB2276164088BEF48ABB0C464000000000C0910ABF0000000000000000962E0A2F08751640B81BA8A5610C46400000000000910ABF0000000000000000A90414EEC4731640346DCF16260C46400000000080900ABF00000000000000004538C599727116403AA29D65AC0B464000000000A08F0ABF00000000000000009951884FAA691640BB9A6480730B464000000000008F0ABF0000000000000000DC7C238F9A681640E9D7B8114F0B464000000000008F0ABF00000000000000007A4ACAAF4D6816408C826A3AF20A464000000000808E0ABF0000000000000000C802E04800641640B8C00CBEB90A464000000000E08D0ABF0000000000000000719FF459025E1640AB1737686E0A464000000000608D0ABF00000000000000001D5BEC762D5C1640CEFDDE45060A464000000000A08C0ABF00000000000000004C202208F75C16403AD9249A8209464000000000608B0ABF000000000000000056D79328FC5C164031765C78E008464000000000208A0ABF0000000000000000A6138E920D5A1640D98EF63B9F08464000000000E0890ABF0000000000000000A4A467A6705916407348B0EE170846400000000000890ABF0000000000000000C881353CB059164045F4C1D08A07464000000000A0870ABF0000000000000000FC741BE67259164054ACBBC01207464000000000E0860ABF00000000000000007FBE8893CE591640AE1C17CF9406464000000000E0850ABF0000000000000000CF7B0DE05F5816400CFE14D95106464000000000A0850ABF00000000000000004AA273C7A1581640034A22E6CC0546400000000040840ABF00000000000000009C29FE037E571640BE45C79A9D0546400000000020840ABF0000000000000000C061F309BB55164084C25726860546400000000000840ABF0000000000000000DC73A8C979531640C9AF25B77805464000000000E0830ABF0000000000000000A07D8A3AC04E16402C27888E2E0546400000000000830ABF00000000000000003DBD8283D64B1640F8DADAD9F404464000000000C0820ABF00000000000000002E26D1E8D64C1640F24BA7DEAD0446400000000080820ABF000000000000000059124630C14A16400E86E3CC440446400000000080810ABF00000000000000003FC2B918664B16403F14DDDABE0346400000000040800ABF0000000000000000DD98A035B24B164017CF50FE930346400000000020800ABF00000000000000006EEB203EE84A1640A7DB20933503464000000000407F0ABF0000000000000000B0B37523D449164063FC3250B202464000000000607E0ABF0000000000000000B1605C316A47164009946CD70802464000000000407D0ABF000000000000000042FC14C0B547164095EFEFFC2801464000000000A07B0ABF000000000000000070FAED15C6461640C3A3E11BA200464000000000607A0ABF00000000000000009409DDD28E45164016929AD63B0046400000000080790ABF0000000000000000BA9205B255481640CC7375AFF7FF45400000000020790ABF00000000000000000F28B288864A1640AA635AC6EDFF45400000000020790ABF000000000000000041F2C3335A4D1640374C9C5DC2FF454000000000E0780ABF000000000000000084F5145B2F4F16402683722064FF45400000000020780ABF000000000000000030D35122824F16409387F02C1AFF454000000000A0770ABF0000000000000000E8B91CC61E511640CD21C940F4FE45400000000060770ABF00000000000000000F7CE2D6F2501640DE3BB347CBFE45400000000000770ABF0000000000000000C162B7A19E55164016DC742886FE45400000000060760ABF000000000000000015E65FAF6E5D1640FE30334641FE454000000000E0750ABF0000000000000000CD7ABD1DBB571640AFC5FCCAB0FD45400000000000750ABF000000000000000018786D189A561640C01190BB79FD45400000000040740ABF0000000000000000981E3543A05516406E71AFC82DFD45400000000000740ABF0000000000000000DD1BE3D81F5A1640C5C9BA7CF0FC45400000000060730ABF00000000000000001C92034EAE5E1640A1AB1E71ECFC45400000000060730ABF00000000000000000E95D8C116621640E7B0DB5245FD45400000000020740ABF000000000000000015A7B73F88631640E5403C901AFD454000000000C0730ABF00000000000000003E2A278F2E6516403AFE56C706FD45400000000080730ABF00000000000000002B31FBA6326616409A700E83ECFC454000000000A0730ABF0000000000000000257169556E671640B3471ADBDEFC45400000000060730ABF000000000000000083E83E6DDB6916408E0E8A25FFFC45400000000060730ABF000000000000000022CBA6B6E36B164022FFF06524FD454000000000E0730ABF0000000000000000AAE413F4336D16404AEBFCBA26FD454000000000E0730ABF0000000000000000DF40FB6B9F6E1640155CBFC13EFD454000000000E0730ABF0000000000000000D355B208C16F16409FB212B657FD45400000000000740ABF0000000000000000C8211308B870164051E1682761FD45400000000020740ABF000000000000000066F3BF178D7316409434B35857FD45400000000000740ABF00000000000000003CCC0402FB7416408DCD426441FD45400000000020740ABF000000000000000024FD6241527616401591D36639FD45400000000020740ABF000000000000000007E372D03A7716404642A9563DFD454000000000E0730ABF000000000000000073EA0B9DC0771640252606C054FD45400000000040740ABF00000000000000000169765355781640E565DBEE72FD45400000000080740ABF00000000000000004256E85DF27816408255FB138DFD45400000000080740ABF0000000000000000F94ED4AE427916406C94737BA7FD454000000000E0740ABF0000000000000000FC74377E037C164052B9DDC7A4FD454000000000E0740ABF00000000000000000D661D7AF27D1640D76C0A4FB9FD45400000000000750ABF0000000000000000AE36A506CF7D164015673053DDFD45400000000040750ABF000000000000000087B7FB5BAC7E164045318FDFF0FD45400000000040750ABF0000000000000000AE4DA2E17F801640D522CAC209FE45400000000080750ABF0000000000000000C6BD1223C8811640CCC6A98A1BFE454000000000A0750ABF0000000000000000B01F1179FF8216402082C0FA29FE45400000000080750ABF000000000000000066A1A20D72841640CBC378E73DFE454000000000E0750ABF0000000000000000607C76398B8516401668126C49FE45400000000000760ABF00000000000000008B4A4125CD8616401B22B5B953FE45400000000020760ABF0000000000000000B510E7E999881640471059CF64FE45400000000020760ABF000000000000000096D32AE4318A164081D5C89374FE45400000000060760ABF0000000000000000EA9259CE3C8C1640B2C7BD9660FE45400000000040760ABF0000000000000000091A8110E18D16403598402A41FE45400000000000760ABF000000000000000024D4522A6A8E16407FDFDCFD26FE454000000000C0750ABF00000000000000001AFD6396008F1640E29DDBA904FE45400000000060750ABF0000000000000000FA697AEF048F1640DFC8F447E4FD45400000000020750ABF00000000000000003EBB0C68F58E1640B9B16D5EBAFD45400000000000750ABF0000000000000000CF05A90F3F8F16408DF9AC93A4FD454000000000A0740ABF000000000000000092F1583424901640E3F47F768EFD454000000000C0740ABF00000000000000009534819A0891164086015CFD87FD45400000000080740ABF000000000000000040124803859216409301EE979EFD454000000000A0740ABF000000000000000056C8F8CBFE9216402AEE916F8DFD45400000000080740ABF0000000000000000910704B230931640C02C5FE069FD45400000000060740ABF0000000000000000434231F54F921640F4A835F947FD45400000000020740ABF000000000000000099717444AD91164063F21C1A33FD45400000000000740ABF000000000000000074D0B373A3911640C12964A218FD454000000000A0730ABF0000000000000000C59CC26531921640AAFF498DDFFC45400000000040730ABF00000000000000001DE165C845921640B6562962BEFC45400000000020730ABF00000000000000005FAE9108C1911640CEEB0713A2FC454000000000E0720ABF000000000000000031B148DB35931640007221A975FC45400000000080720ABF00000000000000000B000B61CB9316407173FF0F51FC45400000000040720ABF0000000000000000DBAA085C6C94164096F8BA0129FC45400000000000720ABF00000000000000001BC574E9A0941640057B7C1618FC454000000000C0710ABF00000000000000005F497C9DC49416409651753DFBFB45400000000040710ABF0000000000000000E3011425399516407A1296B3E5FB45400000000080710ABF00000000000000002BB174877E9516407BF874ABCAFB45400000000060710ABF0000000000000000495D7178599516402BF40329AEFB45400000000040710ABF0000000000000000A4CE6C8AFA9416406EEC7CFC95FB454000000000E0700ABF0000000000000000D0EB67AFA79416401B07273C7AFB454000000000A0700ABF00000000000000009107687E1E94164078A4D5566CFB45400000000080700ABF0000000000000000EAAB1F26DA931640805EDD4F3FFB45400000000020700ABF0000000000000000FB4B257D7C931640B650A0692BFB45400000000040700ABF0000000000000000EE6E95EC699216406CC8C71900FB454000000000A06F0ABF0000000000000000DEA1A82E799116404D4656F5D6FA454000000000606F0ABF00000000000000006B40786EA2901640BBCBC57CBBFA454000000000006F0ABF00000000000000009B574ECF228F164095E8777E96FA454000000000E06E0ABF00000000000000009AB9D026208D16402F4C66E74FFA454000000000606E0ABF000000000000000062CDED60AA8C164090A299DB2EFA454000000000206E0ABF0000000000000000D3648BD39D8C1640ACDB01EF0CFA454000000000206E0ABF0000000000000000CC9578FAC78C1640F4ED5925EDF9454000000000C06D0ABF0000000000000000FF580A934F8C16402C1302B8B7F9454000000000206D0ABF0000000000000000A35CC1DFB48C1640A8F2F9587EF9454000000000E06C0ABF000000000000000004A13F1B698B16404BCC673756F9454000000000806C0ABF0000000000000000E3765EF13D8A1640220560A83EF9454000000000606C0ABF00000000000000008D0EEE6AD089164058025D7C10F9454000000000006C0ABF00000000000000007D1FF17648891640D14DBE64E2F8454000000000E06B0ABF0000000000000000C73D241DE78816402166CFD8B8F8454000000000606B0ABF000000000000000034E8F179B78716404792FE008EF8454000000000206B0ABF0000000000000000E77D18B9C78616405D7BF2C35AF8454000000000A06A0ABF00000000000000001115D1520E861640BE9D0A9B29F8454000000000406A0ABF0000000000000000B228462FBB85164055FC5D09F4F7454000000000E0690ABF0000000000000000A0A200BE5E851640768FE7BEB0F745400000000040690ABF0000000000000000E011C98DAD85164003BF4F088AF745400000000020690ABF0000000000000000418AA282078616406C38936254F7454000000000C0680ABF0000000000000000E07DCBC321861640475251EB24F7454000000000A0680ABF0000000000000000D330AF8281861640322EE0240DF745400000000020680ABF00000000000000005C4C243F6A871640844684FBF3F645400000000020680ABF000000000000000010626F9B0D881640D28AF38CE1F6454000000000C0670ABF0000000000000000D96AC22B3B8A16401A83C22613F745400000000020680ABF00000000000000004D2ABCBB328B1640671B6D2631F745400000000080680ABF0000000000000000DCF33027178D1640156F202550F745400000000080680ABF0000000000000000DD55FD3FD98F1640818E44692EF745400000000040680ABF0000000000000000866411D0B491164046ACB4E31BF745400000000020680ABF00000000000000003593746AD49216401DE0A3800CF745400000000060680ABF000000000000000019F76A69FC921640871CE616DFF6454000000000C0670ABF0000000000000000A8F2E9DB5693164090491FE8BAF645400000000080670ABF00000000000000000A12EF11A4931640C78C00B38BF645400000000040670ABF0000000000000000405C430C759316403F576D0E73F6454000000000E0660ABF0000000000000000A11B099FEA93164055D6EA8A4AF6454000000000C0660ABF00000000000000006A515CCE66941640922365A135F6454000000000A0660ABF00000000000000008623A75D4C9516402F02CFB525F645400000000060660ABF0000000000000000DB1FC24730961640AD0550160CF645400000000080660ABF000000000000000062D531064C971640F6A13571F2F545400000000020660ABF0000000000000000AC09688396991640CB5F223BF3F5454000000000E0650ABF00000000000000003891BE3F5B9B16409DCCD688D6F5454000000000E0650ABF0000000000000000C2B93A3F499C16404F1F9446C1F5454000000000A0650ABF00000000000000005B37B4DB339C1640E5464E5AA0F545400000000060650ABF000000000000000047B7FC26029C16407CDA076F81F545400000000020650ABF0000000000000000715E61879D9B164079FD2AA070F545400000000020650ABF0000000000000000B56160945B9B1640F7B3FA1158F545400000000000650ABF000000000000000069262665AE9A1640CA57064137F5454000000000A0640ABF0000000000000000C7085C305F9A16405C80709D13F545400000000040640ABF0000000000000000FD7CE50B499A1640072EA283F1F445400000000040640ABF00000000000000004C2AF426919A16402D6A0F19CFF4454000000000E0630ABF0000000000000000C873F592629B16403950544BACF4454000000000A0630ABF0000000000000000BF661A98EB9B16401E220AD581F445400000000060630ABF0000000000000000EE4A4E903C9B1640BA2C5D845FF445400000000060630ABF00000000000000006E863726199B16406396473033F4454000000000A0620ABF000000000000000047B3345FF69A16403C2DD09108F445400000000060620ABF0000000000000000B6E368C88E9A1640BA9BBFE0D8F345400000000020620ABF00000000000000009AB2C997019A16407A9EB8FCBEF3454000000000C0610ABF00000000000000006EAA313C24991640D9488FEC9AF3454000000000A0610ABF0000000000000000645802C2779516408C1B4CB228F3454000000000E0600ABF0000000000000000' + ST_Force2D('01060000E0E61000000100000001030000C00100000081010000645802C2779516408C1B4CB228F3454000000000E0600ABF0000000000000000343C5EC4A094164054C96BB215F3454000000000A0600ABF0000000000000000D133C6F22E941640C2D93793FBF245400000000060600ABF00000000000000005196BDF2519316400206FB55D8F245400000000020600ABF000000000000000032BDEA3C5F921640EC599121C7F245400000000000600ABF00000000000000006727882DFD9116408D339B67A4F2454000000000C05F0ABF0000000000000000F12650D4F29016405D8EA09485F2454000000000A05F0ABF0000000000000000CA23DA39329016405874D82363F2454000000000005F0ABF00000000000000006C3B5EAB708F164028DBA8A323F2454000000000E05E0ABF00000000000000009B513F5F548E164083C241AEEEF1454000000000405E0ABF000000000000000023643E66388D1640837FFA0AD5F1454000000000205E0ABF00000000000000002A451FA9358C1640893822F2B1F1454000000000E05D0ABF0000000000000000CF6405365C8B16400D304A1B98F1454000000000A05D0ABF00000000000000007583E324378A164080F3C6A37DF1454000000000605D0ABF000000000000000006B7797767891640D18B5F7B65F1454000000000405D0ABF0000000000000000AB512E00F1881640C3CA8E0A52F1454000000000205D0ABF0000000000000000F6C328198A881640BC20E3333FF1454000000000205D0ABF0000000000000000F1565052F18616405FF0F04F51F1454000000000E05C0ABF00000000000000008593DF458F8516401EC1554862F1454000000000405D0ABF0000000000000000010ADC043D841640BBD15AF670F1454000000000A05D0ABF00000000000000007B7AAC406282164087E4093579F1454000000000405D0ABF00000000000000009241418EA5811640E1D1576A6EF1454000000000205D0ABF0000000000000000DBE272D6CB801640A08B990661F1454000000000405D0ABF00000000000000006B844ED9377F1640A8A2D15F67F1454000000000805D0ABF0000000000000000ED2684828C7D1640FE5F00747BF1454000000000405D0ABF00000000000000005F19A0DE4D7D1640B493FEC551F1454000000000005D0ABF00000000000000006309FB817F7C1640E704FE2C3CF1454000000000205D0ABF00000000000000006EAF8BB7677B1640B1F0B1C92CF1454000000000E05C0ABF0000000000000000685C2884CA7A1640566B1A2D1CF1454000000000C05C0ABF0000000000000000BACD1785AB791640CF802821F9F0454000000000605C0ABF000000000000000014EF3157A17816407DBBBBFBDCF0454000000000405C0ABF0000000000000000C11DBAF5FC761640B876266BF0F0454000000000405C0ABF000000000000000038BAF23D14751640BB1684CBE8F0454000000000205C0ABF0000000000000000772704660C731640924BA7D8E8F0454000000000205C0ABF0000000000000000F30962B8D1711640CA517A20DCF0454000000000205C0ABF000000000000000019AF68609E7016408DA88824CDF0454000000000405C0ABF000000000000000094165122F26E1640BD0ACBE5B3F0454000000000005C0ABF0000000000000000BB10F279DE6C164071B2385CD8F0454000000000005C0ABF00000000000000008B11D358826A1640A05E595BD6F0454000000000205C0ABF0000000000000000BC8FE8EC1D691640B709378ECAF0454000000000205C0ABF0000000000000000DD8C7D9C3168164024EAF2F2C5F0454000000000205C0ABF000000000000000070FA247128671640AEF4BDE6B8F0454000000000205C0ABF000000000000000089607015AB6416401BC9B6B69FF0454000000000E05B0ABF0000000000000000CC682AA70E6316406386CA18C9F0454000000000405C0ABF000000000000000015356249BD611640186755C0F0F0454000000000805C0ABF00000000000000004296E6C3416116409DA247EA0DF1454000000000805C0ABF0000000000000000315F5A5B505F1640F3B034061DF1454000000000A05C0ABF0000000000000000AA4DE7091F5D164075EF6EEC1DF1454000000000C05C0ABF00000000000000004F503840CB5B1640AD1D4E1112F1454000000000A05C0ABF0000000000000000C9101B0DB35A1640CACF64061FF1454000000000005D0ABF00000000000000003D08BF9059591640469ED9A640F1454000000000E05C0ABF000000000000000055314D7855581640F2ECE75E3AF1454000000000005D0ABF000000000000000014BA2EED6C571640A365121441F1454000000000005D0ABF000000000000000013EC8E06EC5616408381406B50F1454000000000405D0ABF00000000000000002EB45CC7AF541640261E04725EF1454000000000605D0ABF0000000000000000795CA62785521640C026F21367F1454000000000605D0ABF000000000000000046A6C378DB4F1640FAA10BF373F1454000000000805D0ABF000000000000000039F07C34E24C1640C6F85A6614F2454000000000805E0ABF0000000000000000B1C64003F441164002B71B92CCF245400000000020600ABF0000000000000000A9EE6E8F4A3E1640499A7D7A0AF345400000000060600ABF0000000000000000AB4EB52A873A1640D7DED62A5CF3454000000000E0600ABF00000000000000004E63E09028361640D75805BB83F345400000000040610ABF000000000000000010BB2089342E16403F7E70DCCEF345400000000020620ABF00000000000000000DD19A166E2D16402221509BE8F345400000000020620ABF00000000000000005FA437023E2D1640BBE4DA1437F4454000000000A0620ABF0000000000000000E50493E2E12C1640A73E7EDE62F445400000000000630ABF000000000000000055E219092A2D1640D283E5ECADF4454000000000A0630ABF0000000000000000DFF84A664E2D16405EBC42A5CAF4454000000000E0630ABF00000000000000008CFF30A4302F1640AFCEE326E5F445400000000000640ABF0000000000000000E7D6C9E8D5301640C4A6F25525F545400000000080640ABF00000000000000008E2D200CFC3116402B7C620371F545400000000020650ABF000000000000000066ED79A8273516405F7C1496B9F5454000000000A0650ABF0000000000000000B37ED3A631371640A25276C70FF645400000000020660ABF0000000000000000CDFC78D2A23516407F7230663AF6454000000000A0660ABF0000000000000000AB0F4ECE68351640AED9A0D16DF6454000000000E0660ABF0000000000000000E4250AAB223716409F26CC6BBAF645400000000080670ABF00000000000000004FFA5553013716402985B4E96EF7454000000000E0680ABF00000000000000005C1B40EBBF361640102164CECAF745400000000080690ABF00000000000000004E7B5523293416403C72A6816AF8454000000000E06A0ABF00000000000000004E12A639A6311640DC8C2FA0E7F8454000000000A06B0ABF0000000000000000E8A47DCDD32F16402E7B05904BF9454000000000606C0ABF00000000000000006A39EC4BB12F16406721FCF9C0F9454000000000206D0ABF000000000000000009A314DBB730164060D697DC1DFA454000000000406E0ABF000000000000000010CB9C35942D1640BE2B35D463FA454000000000406E0ABF00000000000000008B0E5883F92E1640F7DBBC8AD7FA454000000000606F0ABF0000000000000000B9FFC6F2102C16404162E0EF0EFB454000000000A06F0ABF00000000000000002DEDCC4A1F291640692DB29D3BFB45400000000040700ABF0000000000000000149EC50F8B2716409B09BFF685FB454000000000C0700ABF0000000000000000016A3ED365251640548027F8E3FB45400000000080710ABF0000000000000000BC500CF56F231640E118FC020AFC454000000000C0710ABF00000000000000003A938E7B851E164061EC77D21CFC454000000000C0710ABF0000000000000000AEF4CAE0D91616402823F65822FC454000000000E0710ABF0000000000000000BAEC316290131640CF06EAC451FC45400000000020720ABF0000000000000000060100A494111640B2F03A0A61FC45400000000060720ABF000000000000000040E6F301A40F1640BC6E554071FC45400000000060720ABF00000000000000008AE16DDAE70C1640EDC788E78CFC454000000000C0720ABF00000000000000001BC2C0E838091640AB23B2CD81FC454000000000A0720ABF0000000000000000A876358DA2071640CA26E4A19AFC454000000000C0720ABF00000000000000002B5815D67E051640BFA34F4C95FC454000000000A0720ABF0000000000000000753159C65B041640CD6192FC9FFC454000000000E0720ABF000000000000000002E9D0AA15021640533A9B5DB6FC454000000000E0720ABF0000000000000000E33647595F001640297D57B0B1FC454000000000E0720ABF0000000000000000F2E71102A0FE1540A771AFF7B2FC45400000000000730ABF000000000000000014ABF04ED8FC15407158652CBBFC454000000000E0720ABF000000000000000071C57E38A2FA15400FE91994C4FC45400000000020730ABF00000000000000000BC0FCA315FA1540121788CA14FD454000000000A0730ABF0000000000000000A387BD968FF815407EE57A5933FD45400000000000740ABF0000000000000000809CB253D7F615406B906A1E55FD45400000000020740ABF00000000000000001A65F5DE0AF61540852F2F4777FD45400000000080740ABF00000000000000009C10FC8DB2F51540A4A9A1D289FD45400000000080740ABF0000000000000000076E3112B6F415407469470B6AFE45400000000060760ABF000000000000000087E79B483EF4154099F2ADB8DDFE45400000000000770ABF000000000000000019C76A8D25F41540D559508C2EFF454000000000C0770ABF00000000000000003F47986AD5F3154096D8D49558FF45400000000020780ABF0000000000000000B7E72BE2B5F315407C18CB1077FF45400000000040780ABF0000000000000000C69F27AEB8F31540111B91FC8EFF45400000000060780ABF0000000000000000A12DD36A58F315406C10031D1A0046400000000080790ABF0000000000000000779DC93909F11540B257F3997C00464000000000607A0ABF00000000000000008A99B38DADEF1540DC75F397B600464000000000C07A0ABF0000000000000000E36AE6E5F1EC1540855B9775EF00464000000000207B0ABF0000000000000000032AAD5DDCEB15401AB681CB2D01464000000000807B0ABF00000000000000003F131051AAEA15401F37F19CA001464000000000607C0ABF0000000000000000294498642EE915404B9ED48E1502464000000000807D0ABF000000000000000076877B08B4E515409D25330F9D02464000000000407E0ABF0000000000000000DF00E9066BE215402DD369D00303464000000000E07E0ABF00000000000000001C58D165EEDF1540EB5F3E875A03464000000000C07F0ABF0000000000000000CD23DC2FE5DC1540549D1DB2B10346400000000080800ABF00000000000000006FADDF87CDD9154028FED0C12E0446400000000040810ABF0000000000000000BAE9908800D71540DDEEF9178C0446400000000000820ABF00000000000000009A2E37B455D31540F11BC00EE30446400000000080820ABF0000000000000000CDB0E7AAE8D0154049F792A5230546400000000040830ABF0000000000000000223109A139D0154073B4B2245405464000000000A0830ABF00000000000000007EF797D79FD015400141A43A910546400000000020840ABF0000000000000000907961CB21D31540671F0B84CF0546400000000080840ABF0000000000000000DD92BBEEC8DA15407B68D85AFE05464000000000C0840ABF00000000000000005BD5B96FE5DE1540E094C911580646400000000080850ABF0000000000000000E4145009E3E21540334C32398E06464000000000A0850ABF00000000000000001B8C1F58C3E01540F77DD1CA9B0746400000000000880ABF0000000000000000C988CBCA8EDC15402D72115A1E08464000000000C0880ABF0000000000000000212891D2CDE015405D14BE255D0846400000000040890ABF00000000000000004C313F3B0AE415405335AFC1DC08464000000000808A0ABF000000000000000050B205ECE4E71540B49B2DD90609464000000000A08A0ABF0000000000000000C0996E9B9EEA1540963A434CFF08464000000000608A0ABF0000000000000000C5A188C7EFEC1540CF2DD4D1690846400000000080890ABF000000000000000047FFAAA77CEF1540E5DA65C16E0846400000000080890ABF0000000000000000C4C7079749F3154097FEDDBE5E0846400000000040890ABF0000000000000000888BCEC8D7F5154073115F0E6D08464000000000A0890ABF0000000000000000CB55BF9246FA15408658FC3FED08464000000000408A0ABF0000000000000000A67EED1BC9FD15405545D391C508464000000000208A0ABF000000000000000006CCEC3119FF154069D13D41A808464000000000208A0ABF0000000000000000F6E3269CF801164002509A389F08464000000000C0890ABF0000000000000000AAF5E91CC6041640A8E5F120D008464000000000408A0ABF0000000000000000B52B69E33A051640E1D7D3ED1D09464000000000E08A0ABF00000000000000002C67DA28830A1640ED23E5A83009464000000000E08A0ABF0000000000000000DDFFC610E30D1640025EB6A85D09464000000000208B0ABF0000000000000000B541AF6C8B151640319F11249709464000000000A08B0ABF00000000000000007D8EEFC1AE17164086E4A686ED09464000000000408C0ABF0000000000000000BE726A5DA21B1640EBF151161A0A464000000000A08C0ABF00000000000000007054A0A959221640962D2D59EE09464000000000408C0ABF0000000000000000534884BB05251640ACD5F8F6090A464000000000608C0ABF0000000000000000AF7327125E27164067F16228EA09464000000000408C0ABF000000000000000074EE85B51B291640A7DC7945140A464000000000808C0ABF0000000000000000F67CD254F82A1640A9E036CE4A0A464000000000208D0ABF000000000000000081ECA641DE301640383A4C9D8B0A464000000000808D0ABF0000000000000000D1196A39D23216400DBB9926630A464000000000408D0ABF0000000000000000EDED08D402351640F1400D41220A464000000000C08C0ABF00000000000000004411173E16381640237FAFFE2A0A464000000000E08C0ABF0000000000000000E2D526DDED3A164092630FA39E0A464000000000808D0ABF000000000000000095D436C3B93F16400B477283EA0A464000000000208E0ABF00000000000000006F95E8F2724616405145EF11CD0A464000000000008E0ABF0000000000000000173CA720DB4D1640AA2257BBBC0A464000000000C08D0ABF000000000000000085767FB2ED501640CE3748D0450B464000000000008F0ABF00000000000000001F245DC9CF521640885381809B0B464000000000E08F0ABF00000000000000004790EEEDD0511640FFDD5976EE0B46400000000000900ABF0000000000000000C02B7F877B5316400BB7DCD5410C46400000000000910ABF00000000000000003DA637C04A57164089DFC24AE30C464000000000E0910ABF0000000000000000BFD68369985B1640ABF221BD640D464000000000E0920ABF00000000000000000B5F7968B35C1640998D5126DC0D464000000000C0930ABF000000000000000009621E68A55A1640E09901544B0E46400000000080940ABF00000000000000008A71A5740C5B16404C7ABF5C850E46400000000020950ABF0000000000000000321D0FF5935B164062A4CC63EC0E464000000000E0950ABF00000000000000007EE2CEC1F45B16406E3242E5440F464000000000A0960ABF0000000000000000D3E6532AD861164088C4B8EA780F464000000000E0960ABF0000000000000000F2847A093D6516403271E79C3C1046400000000020980ABF0000000000000000AA73E2A8B069164056ADCE3DA71046400000000060990ABF0000000000000000AEDC8CDD446A16402BCEC75B7311464000000000E09A0ABF0000000000000000CA9B667FD46C16404C374A9A5D12464000000000A09C0ABF0000000000000000FC01C3A3916F16404C168227BA12464000000000209D0ABF0000000000000000317BFFF3E86C1640C22AA83A3613464000000000009E0ABF00000000000000005697F9FF6D6A1640C7E114749513464000000000A09E0ABF00000000000000001D3FB28D6469164014B670B5C113464000000000209F0ABF000000000000000091CEF23C516C164017CA5F0DB013464000000000409F0ABF00000000000000003C82159C297516407D5C79406A13464000000000809E0ABF0000000000000000141998807C781640886AD0DA6513464000000000609E0ABF0000000000000000E6218FFABE7C1640E7B8AA884613464000000000409E0ABF00000000000000007BBE0CDB6E8016404E7258D24113464000000000409E0ABF00000000000000007C843304778516400CCFFDE73E13464000000000009E0ABF0000000000000000706322EDB7891640A4748DE14613464000000000409E0ABF0000000000000000BCFEFCF8F7851640A97DBF3B2F13464000000000209E0ABF000000000000000070DA8894B6841640FB6541E6F912464000000000C09D0ABF00000000000000000D3C0C06247F164087EFB258BF12464000000000209D0ABF00000000000000003ECD9720EE7F164048FCB53E5512464000000000409C0ABF00000000000000000F4975E9107F1640EF90C00CEA11464000000000809B0ABF0000000000000000929DB4CACC7C1640CE9FF168CA11464000000000409B0ABF00000000000000005C8BC32E66771640C0C6C8683311464000000000409A0ABF00000000000000003BB5CBA158771640F4480923B11046400000000060990ABF000000000000000031FEFACC6777164062CF84CF0B1046400000000060980ABF000000000000000016E8FE339E791640884D9262A80F46400000000040970ABF0000000000000000A7853294037B16408BFFE1CCF80E46400000000000960ABF000000000000000022AA4A62B47A1640D160404BAF0E46400000000040950ABF00000000000000004EAF3AFBC976164004E91CCB480E46400000000080940ABF00000000000000008DCFAFFF177616405235F2F6DB0D464000000000A0930ABF0000000000000000CE6728ABB178164076D39F67850D46400000000060930ABF0000000000000000F7E3B27AA87616400247AC67250D464000000000A0920ABF0000000000000000CDF6EFDB2276164088BEF48ABB0C464000000000C0910ABF0000000000000000962E0A2F08751640B81BA8A5610C46400000000000910ABF0000000000000000A90414EEC4731640346DCF16260C46400000000080900ABF00000000000000004538C599727116403AA29D65AC0B464000000000A08F0ABF00000000000000009951884FAA691640BB9A6480730B464000000000008F0ABF0000000000000000DC7C238F9A681640E9D7B8114F0B464000000000008F0ABF00000000000000007A4ACAAF4D6816408C826A3AF20A464000000000808E0ABF0000000000000000C802E04800641640B8C00CBEB90A464000000000E08D0ABF0000000000000000719FF459025E1640AB1737686E0A464000000000608D0ABF00000000000000001D5BEC762D5C1640CEFDDE45060A464000000000A08C0ABF00000000000000004C202208F75C16403AD9249A8209464000000000608B0ABF000000000000000056D79328FC5C164031765C78E008464000000000208A0ABF0000000000000000A6138E920D5A1640D98EF63B9F08464000000000E0890ABF0000000000000000A4A467A6705916407348B0EE170846400000000000890ABF0000000000000000C881353CB059164045F4C1D08A07464000000000A0870ABF0000000000000000FC741BE67259164054ACBBC01207464000000000E0860ABF00000000000000007FBE8893CE591640AE1C17CF9406464000000000E0850ABF0000000000000000CF7B0DE05F5816400CFE14D95106464000000000A0850ABF00000000000000004AA273C7A1581640034A22E6CC0546400000000040840ABF00000000000000009C29FE037E571640BE45C79A9D0546400000000020840ABF0000000000000000C061F309BB55164084C25726860546400000000000840ABF0000000000000000DC73A8C979531640C9AF25B77805464000000000E0830ABF0000000000000000A07D8A3AC04E16402C27888E2E0546400000000000830ABF00000000000000003DBD8283D64B1640F8DADAD9F404464000000000C0820ABF00000000000000002E26D1E8D64C1640F24BA7DEAD0446400000000080820ABF000000000000000059124630C14A16400E86E3CC440446400000000080810ABF00000000000000003FC2B918664B16403F14DDDABE0346400000000040800ABF0000000000000000DD98A035B24B164017CF50FE930346400000000020800ABF00000000000000006EEB203EE84A1640A7DB20933503464000000000407F0ABF0000000000000000B0B37523D449164063FC3250B202464000000000607E0ABF0000000000000000B1605C316A47164009946CD70802464000000000407D0ABF000000000000000042FC14C0B547164095EFEFFC2801464000000000A07B0ABF000000000000000070FAED15C6461640C3A3E11BA200464000000000607A0ABF00000000000000009409DDD28E45164016929AD63B0046400000000080790ABF0000000000000000BA9205B255481640CC7375AFF7FF45400000000020790ABF00000000000000000F28B288864A1640AA635AC6EDFF45400000000020790ABF000000000000000041F2C3335A4D1640374C9C5DC2FF454000000000E0780ABF000000000000000084F5145B2F4F16402683722064FF45400000000020780ABF000000000000000030D35122824F16409387F02C1AFF454000000000A0770ABF0000000000000000E8B91CC61E511640CD21C940F4FE45400000000060770ABF00000000000000000F7CE2D6F2501640DE3BB347CBFE45400000000000770ABF0000000000000000C162B7A19E55164016DC742886FE45400000000060760ABF000000000000000015E65FAF6E5D1640FE30334641FE454000000000E0750ABF0000000000000000CD7ABD1DBB571640AFC5FCCAB0FD45400000000000750ABF000000000000000018786D189A561640C01190BB79FD45400000000040740ABF0000000000000000981E3543A05516406E71AFC82DFD45400000000000740ABF0000000000000000DD1BE3D81F5A1640C5C9BA7CF0FC45400000000060730ABF00000000000000001C92034EAE5E1640A1AB1E71ECFC45400000000060730ABF00000000000000000E95D8C116621640E7B0DB5245FD45400000000020740ABF000000000000000015A7B73F88631640E5403C901AFD454000000000C0730ABF00000000000000003E2A278F2E6516403AFE56C706FD45400000000080730ABF00000000000000002B31FBA6326616409A700E83ECFC454000000000A0730ABF0000000000000000257169556E671640B3471ADBDEFC45400000000060730ABF000000000000000083E83E6DDB6916408E0E8A25FFFC45400000000060730ABF000000000000000022CBA6B6E36B164022FFF06524FD454000000000E0730ABF0000000000000000AAE413F4336D16404AEBFCBA26FD454000000000E0730ABF0000000000000000DF40FB6B9F6E1640155CBFC13EFD454000000000E0730ABF0000000000000000D355B208C16F16409FB212B657FD45400000000000740ABF0000000000000000C8211308B870164051E1682761FD45400000000020740ABF000000000000000066F3BF178D7316409434B35857FD45400000000000740ABF00000000000000003CCC0402FB7416408DCD426441FD45400000000020740ABF000000000000000024FD6241527616401591D36639FD45400000000020740ABF000000000000000007E372D03A7716404642A9563DFD454000000000E0730ABF000000000000000073EA0B9DC0771640252606C054FD45400000000040740ABF00000000000000000169765355781640E565DBEE72FD45400000000080740ABF00000000000000004256E85DF27816408255FB138DFD45400000000080740ABF0000000000000000F94ED4AE427916406C94737BA7FD454000000000E0740ABF0000000000000000FC74377E037C164052B9DDC7A4FD454000000000E0740ABF00000000000000000D661D7AF27D1640D76C0A4FB9FD45400000000000750ABF0000000000000000AE36A506CF7D164015673053DDFD45400000000040750ABF000000000000000087B7FB5BAC7E164045318FDFF0FD45400000000040750ABF0000000000000000AE4DA2E17F801640D522CAC209FE45400000000080750ABF0000000000000000C6BD1223C8811640CCC6A98A1BFE454000000000A0750ABF0000000000000000B01F1179FF8216402082C0FA29FE45400000000080750ABF000000000000000066A1A20D72841640CBC378E73DFE454000000000E0750ABF0000000000000000607C76398B8516401668126C49FE45400000000000760ABF00000000000000008B4A4125CD8616401B22B5B953FE45400000000020760ABF0000000000000000B510E7E999881640471059CF64FE45400000000020760ABF000000000000000096D32AE4318A164081D5C89374FE45400000000060760ABF0000000000000000EA9259CE3C8C1640B2C7BD9660FE45400000000040760ABF0000000000000000091A8110E18D16403598402A41FE45400000000000760ABF000000000000000024D4522A6A8E16407FDFDCFD26FE454000000000C0750ABF00000000000000001AFD6396008F1640E29DDBA904FE45400000000060750ABF0000000000000000FA697AEF048F1640DFC8F447E4FD45400000000020750ABF00000000000000003EBB0C68F58E1640B9B16D5EBAFD45400000000000750ABF0000000000000000CF05A90F3F8F16408DF9AC93A4FD454000000000A0740ABF000000000000000092F1583424901640E3F47F768EFD454000000000C0740ABF00000000000000009534819A0891164086015CFD87FD45400000000080740ABF000000000000000040124803859216409301EE979EFD454000000000A0740ABF000000000000000056C8F8CBFE9216402AEE916F8DFD45400000000080740ABF0000000000000000910704B230931640C02C5FE069FD45400000000060740ABF0000000000000000434231F54F921640F4A835F947FD45400000000020740ABF000000000000000099717444AD91164063F21C1A33FD45400000000000740ABF000000000000000074D0B373A3911640C12964A218FD454000000000A0730ABF0000000000000000C59CC26531921640AAFF498DDFFC45400000000040730ABF00000000000000001DE165C845921640B6562962BEFC45400000000020730ABF00000000000000005FAE9108C1911640CEEB0713A2FC454000000000E0720ABF000000000000000031B148DB35931640007221A975FC45400000000080720ABF00000000000000000B000B61CB9316407173FF0F51FC45400000000040720ABF0000000000000000DBAA085C6C94164096F8BA0129FC45400000000000720ABF00000000000000001BC574E9A0941640057B7C1618FC454000000000C0710ABF00000000000000005F497C9DC49416409651753DFBFB45400000000040710ABF0000000000000000E3011425399516407A1296B3E5FB45400000000080710ABF00000000000000002BB174877E9516407BF874ABCAFB45400000000060710ABF0000000000000000495D7178599516402BF40329AEFB45400000000040710ABF0000000000000000A4CE6C8AFA9416406EEC7CFC95FB454000000000E0700ABF0000000000000000D0EB67AFA79416401B07273C7AFB454000000000A0700ABF00000000000000009107687E1E94164078A4D5566CFB45400000000080700ABF0000000000000000EAAB1F26DA931640805EDD4F3FFB45400000000020700ABF0000000000000000FB4B257D7C931640B650A0692BFB45400000000040700ABF0000000000000000EE6E95EC699216406CC8C71900FB454000000000A06F0ABF0000000000000000DEA1A82E799116404D4656F5D6FA454000000000606F0ABF00000000000000006B40786EA2901640BBCBC57CBBFA454000000000006F0ABF00000000000000009B574ECF228F164095E8777E96FA454000000000E06E0ABF00000000000000009AB9D026208D16402F4C66E74FFA454000000000606E0ABF000000000000000062CDED60AA8C164090A299DB2EFA454000000000206E0ABF0000000000000000D3648BD39D8C1640ACDB01EF0CFA454000000000206E0ABF0000000000000000CC9578FAC78C1640F4ED5925EDF9454000000000C06D0ABF0000000000000000FF580A934F8C16402C1302B8B7F9454000000000206D0ABF0000000000000000A35CC1DFB48C1640A8F2F9587EF9454000000000E06C0ABF000000000000000004A13F1B698B16404BCC673756F9454000000000806C0ABF0000000000000000E3765EF13D8A1640220560A83EF9454000000000606C0ABF00000000000000008D0EEE6AD089164058025D7C10F9454000000000006C0ABF00000000000000007D1FF17648891640D14DBE64E2F8454000000000E06B0ABF0000000000000000C73D241DE78816402166CFD8B8F8454000000000606B0ABF000000000000000034E8F179B78716404792FE008EF8454000000000206B0ABF0000000000000000E77D18B9C78616405D7BF2C35AF8454000000000A06A0ABF00000000000000001115D1520E861640BE9D0A9B29F8454000000000406A0ABF0000000000000000B228462FBB85164055FC5D09F4F7454000000000E0690ABF0000000000000000A0A200BE5E851640768FE7BEB0F745400000000040690ABF0000000000000000E011C98DAD85164003BF4F088AF745400000000020690ABF0000000000000000418AA282078616406C38936254F7454000000000C0680ABF0000000000000000E07DCBC321861640475251EB24F7454000000000A0680ABF0000000000000000D330AF8281861640322EE0240DF745400000000020680ABF00000000000000005C4C243F6A871640844684FBF3F645400000000020680ABF000000000000000010626F9B0D881640D28AF38CE1F6454000000000C0670ABF0000000000000000D96AC22B3B8A16401A83C22613F745400000000020680ABF00000000000000004D2ABCBB328B1640671B6D2631F745400000000080680ABF0000000000000000DCF33027178D1640156F202550F745400000000080680ABF0000000000000000DD55FD3FD98F1640818E44692EF745400000000040680ABF0000000000000000866411D0B491164046ACB4E31BF745400000000020680ABF00000000000000003593746AD49216401DE0A3800CF745400000000060680ABF000000000000000019F76A69FC921640871CE616DFF6454000000000C0670ABF0000000000000000A8F2E9DB5693164090491FE8BAF645400000000080670ABF00000000000000000A12EF11A4931640C78C00B38BF645400000000040670ABF0000000000000000405C430C759316403F576D0E73F6454000000000E0660ABF0000000000000000A11B099FEA93164055D6EA8A4AF6454000000000C0660ABF00000000000000006A515CCE66941640922365A135F6454000000000A0660ABF00000000000000008623A75D4C9516402F02CFB525F645400000000060660ABF0000000000000000DB1FC24730961640AD0550160CF645400000000080660ABF000000000000000062D531064C971640F6A13571F2F545400000000020660ABF0000000000000000AC09688396991640CB5F223BF3F5454000000000E0650ABF00000000000000003891BE3F5B9B16409DCCD688D6F5454000000000E0650ABF0000000000000000C2B93A3F499C16404F1F9446C1F5454000000000A0650ABF00000000000000005B37B4DB339C1640E5464E5AA0F545400000000060650ABF000000000000000047B7FC26029C16407CDA076F81F545400000000020650ABF0000000000000000715E61879D9B164079FD2AA070F545400000000020650ABF0000000000000000B56160945B9B1640F7B3FA1158F545400000000000650ABF000000000000000069262665AE9A1640CA57064137F5454000000000A0640ABF0000000000000000C7085C305F9A16405C80709D13F545400000000040640ABF0000000000000000FD7CE50B499A1640072EA283F1F445400000000040640ABF00000000000000004C2AF426919A16402D6A0F19CFF4454000000000E0630ABF0000000000000000C873F592629B16403950544BACF4454000000000A0630ABF0000000000000000BF661A98EB9B16401E220AD581F445400000000060630ABF0000000000000000EE4A4E903C9B1640BA2C5D845FF445400000000060630ABF00000000000000006E863726199B16406396473033F4454000000000A0620ABF000000000000000047B3345FF69A16403C2DD09108F445400000000060620ABF0000000000000000B6E368C88E9A1640BA9BBFE0D8F345400000000020620ABF00000000000000009AB2C997019A16407A9EB8FCBEF3454000000000C0610ABF00000000000000006EAA313C24991640D9488FEC9AF3454000000000A0610ABF0000000000000000645802C2779516408C1B4CB228F3454000000000E0600ABF0000000000000000') ) ; @@ -45,7 +45,7 @@ INSERT INTO pr_zh.t_hydro_area (id_hydro, name, geom) VALUES INSERT INTO pr_zh.t_references(id_reference,ref_number,reference,authors,pub_year,title,editor,editor_location) VALUES (1, 29, 'Charte PNRL - VBM', 'Parc naturel régional du Luberon', 2009, 'Secteur de Valeur Biologique Majeure (VBM) : "Le Calavon"', 'PNR Luberon', 'APT'), (2, 32, 'DOCOB FR9301587 "Le Calavon et l''Encrème"', 'Groupe de Chiroptères de Provence - F. ALBALAT', 2013, 'Inventaire et cartographie des Chiroptères d''intérêt communautaire du site Natura 2000 FR9301587 "Le Calavon et l''Encrème"', 'GCP', 'APT') -; +ON CONFLICT DO NOTHING; --------------- From e7f516f9dee1d05a789fe39e35be82490ce1f529 Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Tue, 21 May 2024 16:27:29 +0200 Subject: [PATCH 08/60] feat: improve zh sample data + add delete fake data --- .../migrations/b4e1775f1e7c_sample_data.py | 5 +- .../migrations/data/delete_fake_data.sql | 19 ++ .../migrations/data/insert_into_fake_data.sql | 271 ++++++++---------- .../data/insert_into_pr_zh_schema.sql | 18 +- 4 files changed, 159 insertions(+), 154 deletions(-) create mode 100644 backend/gn_module_zh/migrations/data/delete_fake_data.sql diff --git a/backend/gn_module_zh/migrations/b4e1775f1e7c_sample_data.py b/backend/gn_module_zh/migrations/b4e1775f1e7c_sample_data.py index fa35508d..202619ef 100644 --- a/backend/gn_module_zh/migrations/b4e1775f1e7c_sample_data.py +++ b/backend/gn_module_zh/migrations/b4e1775f1e7c_sample_data.py @@ -28,4 +28,7 @@ def upgrade(): def downgrade(): - pass + data = text( + importlib.resources.read_text("gn_module_zh.migrations.data", "delete_fake_data.sql") + ) + op.get_bind().execute(data) diff --git a/backend/gn_module_zh/migrations/data/delete_fake_data.sql b/backend/gn_module_zh/migrations/data/delete_fake_data.sql new file mode 100644 index 00000000..bc1a78ef --- /dev/null +++ b/backend/gn_module_zh/migrations/data/delete_fake_data.sql @@ -0,0 +1,19 @@ +BEGIN; + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SET check_function_bodies = false; +SET client_min_messages = warning; + + +DELETE FROM pr_zh.cor_zh_notes WHERE cor_rule_id > 1000000; +DELETE FROM pr_zh.t_items WHERE val_id > 1000000; +DELETE FROM pr_zh.cor_rb_rules WHERE rb_id > 1000000; + +DELETE FROM pr_zh.cor_zh_rb WHERE id_rb > 1000000; +DELETE FROM pr_zh.t_river_basin WHERE id_rb > 1000000; +DELETE FROM pr_zh.t_hydro_area WHERE id_hydro > 1000000; + +COMMIT; \ No newline at end of file diff --git a/backend/gn_module_zh/migrations/data/insert_into_fake_data.sql b/backend/gn_module_zh/migrations/data/insert_into_fake_data.sql index 2d05fd0a..40bfd53f 100644 --- a/backend/gn_module_zh/migrations/data/insert_into_fake_data.sql +++ b/backend/gn_module_zh/migrations/data/insert_into_fake_data.sql @@ -11,8 +11,8 @@ SET client_min_messages = warning; -- insert Calavon River Basin (departments 84 and 04) as an example INSERT INTO pr_zh.t_river_basin (id_rb, name, geom, id_climate_class, id_river_flow) VALUES ( - 1, - 'Calavon - DU_13_07', + 1000001, + 'SAMPLE - Calavon - DU_13_07', ST_Force2D('01030000A0E610000001000000C7030000AB2A6F3046D3154066DF8D97F6E8454000000000204D0ABF70E8A6C955D31540721A441022E9454000000000804D0ABF1862F5679CD315408DCF200F9BE9454000000000204E0ABF6FBE00BF35D4154075A28EA8F1E9454000000000004F0ABFA32AF943DCCF15409C7E90CC43EA454000000000604F0ABF2513C9E3F5CC1540CC58AF099EEA45400000000060500ABF50059E5715D01540DC1163E236EB45400000000080510ABFDF4A266CB0CE15407F203611BFEB45400000000040520ABF7EA69A827ACA1540CE9A6BF8DCEB45400000000080520ABF74A9C7B4FFC515408904ACE00BEC45400000000000530ABF25097D9DD1C215401962A9F43FEC45400000000060530ABF0A1343AA26BF1540F3945D1E0CEC45400000000000530ABFF9D92509ECBC15400CAFC3163CEC45400000000040530ABF8E58E019ACB51540CF770CC557EC454000000000A0530ABF26B5C01FB7AE154037AC102C61EC454000000000A0530ABFC2658BCD5BA91540BA1C350764EC454000000000A0530ABF0A81F4DC66A21540D44F50F662EC45400000000080530ABF4C94B4581F9A1540CFC59BB060EC45400000000080530ABFA1E9279976931540C4B2FAA84FEC45400000000080530ABFC0C3A181619015404833460427EC45400000000020530ABF8D8F08FAB78D154003327BEC05EC454000000000C0520ABFDBFEC8E4188B1540FABC2E45D1EB45400000000080520ABF3FEF8FFBBD881540DE6EF759D0EB454000000000A0520ABFD9EB3523BB861540BECD8380FBEB454000000000E0520ABFFB5F724B81821540E22E7BE22BEC45400000000060530ABFC90BCEFF1D801540CA054D645AEC454000000000C0530ABFEDA1E7C4ED7D1540826E4A0A07EC45400000000020530ABFD53A8B0F6178154090EB860516EC45400000000000530ABFB425E29984721540BB4A121AB4EB45400000000060520ABFB79D1341BD6F15406F125DEF97EB45400000000060520ABF9C9E74979A6B1540DC9AE16E84EB45400000000020520ABF5FDDDB35B46B1540339A0BEA33EB45400000000080510ABFB6B14D36B268154094C389961BEB45400000000040510ABF9DB9A0B089671540D838D06AFFEA454000000000E0500ABFF7FE8EBBE7671540F5B3215CCBEA454000000000A0500ABFAB4327491D661540B4D5B396A3EA45400000000060500ABF0566B49942651540C5DCD2904EEA454000000000E04F0ABFB482F86C906715406B29C0E4D9E9454000000000E04E0ABF6F59AA6FCB641540D58B9CAE8CE9454000000000204E0ABF9799C652296115403B000F5893E9454000000000604E0ABFF7995B442B5F1540904D9D47D1E9454000000000C04E0ABF5A565AB0D15B154026E9DF94D3E9454000000000E04E0ABF89D72AFD7958154002FB3591EEE9454000000000404F0ABFB902B545475615408E6EE960FDE9454000000000204F0ABFCA3CE47E69551540F8909917F5E9454000000000004F0ABFE39CCC2398541540276D49F8C2E9454000000000A04E0ABF53DF3D1095511540EFC785A650E9454000000000E04D0ABFEFFB845E4D50154079638B571EE9454000000000804D0ABFEFC6AFEABB491540C1279E9DD3E8454000000000004D0ABFEE5161DFD348154048E7895D6DE8454000000000204C0ABF8DCCF278F9441540F007B06908E8454000000000404B0ABFF19B0F8EE2431540EE950930BCE7454000000000E04A0ABF72A21260054215405CDBDED0A2E7454000000000804A0ABF0759792D373F1540481D9DC280E7454000000000404A0ABFF8617AD6803D1540E5C8807364E7454000000000404A0ABF0F1B657C813C1540AA8E9CA047E7454000000000E0490ABF1C89F2C1483A15403C4DF47B52E7454000000000004A0ABF429CC1FA613815406716EF6833E7454000000000C0490ABFE2D5360992351540745FC6373DE7454000000000004A0ABFA0DCEAA8E63315408573467D29E7454000000000A0490ABF2A74D65E38321540C29A7D7D4CE7454000000000E0490ABFAD67B0885E30154086B6F15D47E7454000000000404A0ABFFB72335EDA2E154057A0792C45E7454000000000204A0ABFA48B3FA78F2D154063FE975747E7454000000000E0490ABF783A51A9202C15401D601C1F45E7454000000000E0490ABF2C81862DA52A1540C502F7A748E7454000000000204A0ABFB716A96D6129154083EC03D333E7454000000000C0490ABF249DBD501628154003C8C25C1EE745400000000080490ABF1F51E3E017271540059BDD2106E745400000000060490ABFD768879812261540BA55F8FFF4E645400000000060490ABF43B3F1F5A0241540C0F7595CE5E645400000000000490ABFEF1B69AEC4211540FD95FA43BBE6454000000000A0480ABF80692B56E52015402A8B338AACE6454000000000C0480ABF7D995FB2C81F15400BC8F7B5CFE645400000000000490ABFC9E3F7198B1E154075F02201CEE645400000000040490ABFE4A10AA91A1D1540C5E6F9A0DDE645400000000040490ABF38F61956161C15408A2D8E46C9E645400000000040490ABFD4DB0FC8191B1540EBC031CAB6E6454000000000C0480ABF90311D056E1A15401EE48B3DA4E6454000000000A0480ABFA493D7B188191540270FD16877E645400000000060480ABF2A1132DC63181540320564666BE645400000000040480ABF6761A456E2161540759E85D35BE645400000000040480ABF551133601D16154056C4E8565CE645400000000020480ABFA9CAEF6A9E141540717CF0606BE645400000000040480ABF7F5C59323A1415400853E4377CE645400000000060480ABF8099AF04D3131540B052B9C684E645400000000060480ABF901A861016131540A4CFC21DB5E6454000000000C0480ABF95C15B4C8F111540F778DFB2AEE6454000000000C0480ABFE45DF4BEE11015400503A406ADE6454000000000A0480ABF9C5891A0DE0F1540C03C3CD1ADE6454000000000C0480ABFA5948704A30E154053D8080FA8E645400000000060480ABFACE5B0B0F30C154002B2B117A0E645400000000080480ABF6B56A405B70B154095E405F996E645400000000080480ABF2A8C3C73760A1540C425D5DC8DE645400000000060480ABFD79E64F84209154017DD56FD86E6454000000000A0480ABF7A394169D9071540B25D111B7FE645400000000080480ABFDD26D21A92061540B404746779E645400000000060480ABF5BB7EA9667051540B6A13F1A75E645400000000060480ABF757F8FBA23041540DAF588EA6DE645400000000040480ABF6AA0E81EF402154043C2DBD965E645400000000040480ABF84B472F3DC011540890607C85DE645400000000040480ABF3DF15DFFCD0015408136C8E454E645400000000000480ABF3760E651D8FE1440379E588241E6454000000000E0470ABF6CC0964BBBFD14401DAC404B35E645400000000000480ABFCBCE021CD2FC14401842DBF422E6454000000000E0470ABFCBCE5B32DEFB1440CDBC25DE15E6454000000000A0470ABFD9C3264A04FB1440DCC0F6B00BE6454000000000A0470ABFBD7EB0F161F91440BAE19011FBE545400000000080470ABFB78C1E2D87F71440904687C7F8E5454000000000A0470ABF37ADD1B090F614405FDF494CFAE545400000000080470ABFDD900CD033F51440A1C5019DFDE5454000000000A0470ABF407CA1D0FBF3144006918E1800E645400000000040470ABFAECB985CC3F21440325A922A02E645400000000060470ABF02A1738FB6F114400F4173770AE6454000000000A0470ABF1D3B3845D0F01440AAD0D72617E6454000000000C0470ABF4F24529250EF14405D2796D51FE6454000000000A0470ABF491F223DB4EE1440F17A8D0F21E6454000000000C0470ABF93BB6C4CABED144027EFBCC11DE6454000000000E0470ABF7919E1D3C1EB1440067F220914E6454000000000A0470ABF90983C80FDEA1440E9D9BB290DE6454000000000C0470ABFC84E6B0085E914401AE1855F08E6454000000000C0470ABF9505188262E81440B2F7EB8102E645400000000020470ABF76D3D919DDE61440D2EC7C1AFEE5454000000000A0470ABFED4912C0EEE41440C8FA94C5FDE545400000000080470ABFEF245B6674E31440FA15A887FEE545400000000080470ABF807DBDC15DE2144072A06A8403E6454000000000A0470ABFA3C135865CE114406A42E44E0AE645400000000060470ABF3CD22E025ADF1440C0814D250BE645400000000080470ABF15C940E31FD71440C34851543CE645400000000000480ABF14C997A9BFD51440D73B9B8F2EE6454000000000C0470ABF2A1E7392AFD4144064709CE423E6454000000000E0470ABFC9F57D345FD31440504EB46A0FE645400000000080470ABF98D8021B21D2144036EA9FE20BE645400000000080470ABF475D5C6806D11440C288911E1DE6454000000000A0470ABFDD642C2FA3CE1440173C34B215E6454000000000A0470ABFF297909641CD1440C0917E090FE645400000000060470ABFE52D7B4D2BCC1440904A3FE20EE6454000000000A0470ABF5DBF768464CA144073964D2523E645400000000080470ABF74A1A2A675C9144081797F3A27E6454000000000E0470ABF5F4E446FBAC81440D7539E7A36E6454000000000E0470ABFC226269A61C81440E24A062F4EE645400000000020480ABF56C6CF0D06C71440B20BB0DE54E645400000000060480ABF5E81C74C32C61440E38E5FB650E645400000000040480ABF35647CCE5BC514409067CC6D51E645400000000020480ABF5833C58B6FC41440AF917F194EE645400000000040480ABF2E3C0F10A1C314406EFB890059E645400000000000480ABF2796CAAA97C214401339841C64E645400000000060480ABF1D4E8EA010C21440E9E46D4EA1E6454000000000A0480ABFE3E32537BAC11440CBC9BFEFBFE645400000000020490ABF1B4D0E9BA3BF1440F4F27BDDCAE6454000000000E0480ABF0F60C17280BE144071CDDF90DFE645400000000040490ABF882A5D1121BD1440AECA7AED0BE745400000000080490ABF7522FAABAFBB14404DA4425F1DE7454000000000C0490ABFCBBD272F00BA1440C286B74E1FE7454000000000A0490ABF36B460ECFDB71440D033CFCF1AE745400000000080490ABFC42018EF56B61440FA857ACB0CE745400000000080490ABF39DCC3A850B41440822608632DE7454000000000C0490ABF53EB19A13AB31440F4FC301F3CE7454000000000004A0ABFBCE83FD035B11440A1AE179734E7454000000000C0490ABF71A592208DAF14402E95BAD42DE7454000000000E0490ABF40B6557ACBAD144023B8574933E7454000000000A0490ABF1A0CD80197AC1440EAF7A7D644E7454000000000004A0ABFA46A7231C5AA1440BF8F491D50E7454000000000E0490ABF917B131F94A91440782C014947E7454000000000E0490ABF34C33F119EA714402E2B50F93EE7454000000000C0490ABF3EDAB472C7A51440D0D7294F47E7454000000000204A0ABF31E1BECA80A4144021F664F63AE7454000000000E0490ABFC1B0C64A23A31440246937CD32E7454000000000E0490ABF6385B9E87FA1144001F3C0492CE7454000000000C0490ABFABB40EBA2EA0144054B2BB1719E7454000000000C0490ABF282F6B342E9E1440E31D3D520DE745400000000060490ABFD84F6C4DC99C1440CAAFD46EF8E645400000000060490ABFB8B091684E9B1440BBDB3DF209E745400000000040490ABF51CA7618439B14407E8CFA7827E7454000000000A0490ABF2F88B274EC9A14409136F1FB46E7454000000000E0490ABF95AB6197449A1440F85ED60F57E7454000000000004A0ABF56F835B892991440CF119ECB6BE7454000000000004A0ABFF10846A6759814408AB6BC1594E7454000000000804A0ABF2822A945FE961440B751DEB0B4E7454000000000A04A0ABF9D61D4727495144028C57E5DDDE7454000000000E04A0ABF9EFD0DB1C5931440A4C2E83DE6E7454000000000004B0ABFD5478F38F7911440CE53F600FEE7454000000000404B0ABFC51118FC5F9114409A9C4AAC45E8454000000000C04B0ABF8ED7B26A0C9114406DE45B9E6FE8454000000000204C0ABF80894E72539214404E3789B590E8454000000000404C0ABFE7105626C49114404FA304D7B3E8454000000000A04C0ABF4908B366C58F1440F7BCF077EEE8454000000000004D0ABFFD5DBA4C368F1440535BAB9415E9454000000000A04D0ABF9EBA48D80C8D14408EE326404FE9454000000000C04D0ABF4390C2121A8C1440CD9507087BE9454000000000204E0ABFA6B9B15D178B1440694FDC26A9E9454000000000604E0ABFE31EA78145891440B4D10FC2B2E9454000000000804E0ABFEAEE76BF158714401D69129DD7E9454000000000C04E0ABFBB4F7CB550851440FE60E1D8EFE9454000000000E04E0ABFC3AF7050718314408BF71C8DE8E9454000000000A04E0ABFD8D8461346811440996BDF4300EA454000000000204F0ABF721FB58E418014402AFF8AB4F0E9454000000000004F0ABFE95E2C3EEE7D14407EABE429D7E9454000000000E04E0ABFDD031667DC7B1440738096BBB5E9454000000000C04E0ABFA29FB2BEF97914400218CA8E9AE9454000000000204E0ABF092651C0327814408F5B6EB09AE9454000000000404E0ABF0950B48E6F761440EBE4038DA6E9454000000000404E0ABF33FB87DC3E751440B8469464A2E9454000000000604E0ABFDD2EBC928573144029E6940687E9454000000000404E0ABFA16A63193F7214403BA030F281E9454000000000404E0ABF9C5B40E0B970144067E932AC75E9454000000000004E0ABFB5C8E7F1156F1440CF9619355FE9454000000000C04D0ABFFD17745CE96E14402498BB754AE9454000000000E04D0ABF658DB95C626E1440BBD8F70128E9454000000000804D0ABF784DB05C686D14406D740BDF26E9454000000000C04D0ABF49FBC916FC6B1440E6EFC07D29E9454000000000804D0ABF184F8FFBA06A1440B8498C1B25E9454000000000804D0ABF73A28346A069144060CF30662EE9454000000000C04D0ABF2BD3BB6C7A681440CB71DA2C3CE9454000000000A04D0ABF9C86CE5D6C651440A8841B652EE9454000000000804D0ABF0ED5AF1644631440542C50591EE9454000000000804D0ABF8F95ACFD2762144019FFE1112CE9454000000000404D0ABF55914E6EF0601440DCF1DC133FE9454000000000804D0ABFB7681B348B60144011C790406EE9454000000000004E0ABF9E555CB4575F144083003A2C8FE9454000000000204E0ABFFD4C133FA05E14409032FD48ACE9454000000000A04E0ABF008DF69D535D1440AF8C54EFCAE9454000000000A04E0ABF5A3FC4ED545C1440391DAF15EDE9454000000000204F0ABFF2DA50806B5B14408FB8F4A010EA454000000000204F0ABF8A1492DC725A1440ABDF8AA72BEA454000000000604F0ABF54F6C9FD335914401691DB7048EA454000000000A04F0ABFD955B9ABDC571440D588784165EA454000000000E04F0ABF791082DF9356144091298D047CEA45400000000020500ABFBD40EDC7DC541440CA662DE896EA45400000000040500ABFC2C0B8C6B85414404A8011A598EA45400000000020500ABF2015AABE9853144039EAB093A6EA45400000000060500ABF324179906A521440E60AF34FB6EA45400000000060500ABF26C7340F295214404C2128BEB9EA45400000000060500ABF1A97F6BE6B501440E6C4370ACFEA45400000000080500ABFA08301B2304E14403BF91C54EAEA454000000000E0500ABF35547B83C04D14405B931DB2EEEA45400000000000510ABF636682D6384C1440A76519EFFDEA45400000000020510ABF7700204EFA4A1440673288580BEB45400000000020510ABF69FD67AE864A14401A26E63810EB45400000000020510ABF3BE5CDAC6448144009FE98722BEB45400000000060510ABFDEC5859537461440C852EFF83FEB45400000000080510ABFCEB71A665044144001E0370255EB454000000000C0510ABF12860DC7D94114405CAAA9446BEB454000000000C0510ABF3124F922683F1440743CC50483EB45400000000020520ABF00FB0B70A83D1440AA0839D39CEB45400000000020520ABFE19CC8BF0D3C14404F130E13ADEB45400000000080520ABFB42971D3CD391440788ABA52BBEB45400000000080520ABF1A0C93CAA9371440E1FCFCF0C7EB45400000000080520ABFC2585AE90E36144074BB5D64CDEB45400000000080520ABFB8F5E95945341440F872321DCEEB45400000000040520ABF2F8975955A311440B9D20F73C3EB454000000000A0520ABFB2177E9E192F14402BD79ECDBAEB45400000000060520ABFE3A559651C2D1440A16E6B92B7EB45400000000080520ABFCE589B376E2B144053BF40D5B4EB45400000000040520ABF7645590A3B291440A9E69FE5AFEB45400000000040520ABF748EDEDE5A27144079EA0633A8EB45400000000080520ABF627B872F102514404BB16BFBA9EB45400000000080520ABF81E54416E8221440893F0038D6EB454000000000C0520ABF28514B03251F144089CE25B5A9EB45400000000040520ABFC48C2C9C7B1F144079D89DCC76EB45400000000000520ABFD2F95BC12F1E1440D3F8AEA674EB454000000000C0510ABF1B3551AA091C14408A8F06E0BDEB45400000000080520ABF6F2FCA0EFC1A1440CCE7C22914EC45400000000020530ABF1CC2B2303A19144062556A2D29EC45400000000040530ABFAFFABB3AB017144087A2A9AD1FEC45400000000040530ABFA71DD4358B161440F615AB49F4EB454000000000E0520ABFBA2EFF0FA81514406FD675C7DEEB454000000000E0520ABF5CA685B4A81414405C9FA2E9F7EB454000000000E0520ABF8AB886271213144016F7276902EC454000000000E0520ABF197ECB902E0B14405327D9EF32EC45400000000020530ABF4921F323390A14407AFD63B53DEC45400000000080530ABF263CCFD4AC0814406AB75F0F52EC45400000000080530ABF36BDE1E99506144021AD2DFA6AEC454000000000C0530ABF2DF142173804144096A3B54182EC45400000000000540ABFA92780E9F50214401867211D97EC45400000000000540ABF2E7D0FE0B30014405C54615AC1EC45400000000060540ABF751F344F1EFF13408BCCEB98DDEC454000000000C0540ABF567FF1DF73FD13408DAC80E3F9EC454000000000E0540ABFA269F146BFFB134073E7645D11ED45400000000000550ABF06E5B8F4A0F91340B5F473CC22ED45400000000000550ABF207CE8AD99F61340F106759C5BED454000000000A0550ABFFEEA5C90DBF313403E2905647CED454000000000C0550ABFE1EE806E83F21340301BA3A486ED454000000000E0550ABFDB8C239AFBF2134065AB78D39FED45400000000040560ABF5FBC3C2D3AF3134041C49515B0ED45400000000040560ABFD73441B557F31340577B1DCCE7ED454000000000C0560ABF857F74C4B2F21340741A93C937EE45400000000020570ABF45449F6067F413406882DC68B9EE45400000000020580ABF5184820D79F6134079643F5DC7EE45400000000040580ABFE62774F040FB13402B3FEA87E9EE45400000000080580ABF10EF3B23D2031440551669A10EEF454000000000E0580ABFEA52A63233041440232765CA36EF45400000000000590ABF4F4AE8E7BD09144003F3916473EF454000000000A0590ABF8C34F64E43101440E588740BD4EF454000000000405A0ABF552F92DAF4141440DA09512226F0454000000000E05A0ABF6C42F7E1EA1914409912F443E2EF454000000000605A0ABFA68AF033BD1C1440D8E83F2CC1EF454000000000405A0ABF6E8B2D66EE201440A580A4158BEF454000000000A0590ABF3C6B3A4BEF22144080F0FE3F82EF454000000000A0590ABF37517D74A7281440F428BB9091EF454000000000C0590ABFEE53745DF02D144001038F22ACEF454000000000005A0ABF452AEDFE3B311440B36EF285AEEF454000000000205A0ABF1614EF27F9391440E759283FE9EF454000000000605A0ABF23B0690B20401440FB536549F6EF454000000000C05A0ABF472AC54B82461440E7800E2FE8EF454000000000605A0ABF575998B41D4E1440D393EA8DB9EF454000000000E0590ABFE55A6A248D5614400705755279EF45400000000080590ABF16BD0752215F14409CE1114F4EEF454000000000A0590ABFDF83E0814A681440E27E2F7338EF45400000000020590ABF3FD52D44516F1440304CDCFD50EF45400000000040590ABF831870E57A731440D66EBAD872EF45400000000080590ABFDEEA584BE073144010FDCAC87EEF454000000000C0590ABF72DA5F12177C1440651E4A1136F0454000000000005B0ABF687F6F02FF8014406CEED661A5F0454000000000E05B0ABFFEB8E6F7728214408B9CA0C6D7F0454000000000405C0ABF005F5199EE821440F37B8E453BF1454000000000205D0ABFC5844F356C81144091C5B780ECF1454000000000405E0ABF46EDE5D5548114403C0718A117F2454000000000805E0ABF58923CD443841440F046DFC55BF2454000000000205F0ABF075B545A388914408C9FA238C0F245400000000000600ABFF93483A3408B1440686AE00310F345400000000040600ABFC3C9097E4E8B144071D08D053BF3454000000000C0600ABFDE65F9B935891440763889F464F345400000000020610ABF91DDDEADE5871440851063CB75F345400000000040610ABF0056846828881440BDF60D3281F345400000000040610ABF2AD882ABB28B144030E526CA8DF3454000000000A0610ABF0A68C2DB27901440F21A2A1ACCF3454000000000E0610ABF56B350A0189214403CDE2ADD08F445400000000080620ABFB08123AEC7901440FEAAC92E73F445400000000020630ABFF41CC49F1D8F14405BD5416690F445400000000040630ABF80F635E48C8E14405C58C29AA3F4454000000000A0630ABF84A9E309DC8E14407623F810B0F4454000000000A0630ABFC4FD25439991144016EB9F9BB6F4454000000000A0630ABFE19062056D951440716DEF26D4F4454000000000E0630ABFFF4B5F07CC9814400451711941F5454000000000C0640ABF7463FFCDFA991440DBF6FAAF6AF545400000000020650ABFDD9FF11CD29B1440049BFB179DF545400000000060650ABFE33F9AD40B9C1440E4C58611BAF5454000000000C0650ABFBBFAF986B29914408BED77BE19F645400000000020660ABFE5E5F5F9959A1440B9E29A4074F645400000000000670ABF5085FBA1C79B14404BD9565CEBF645400000000020680ABFB91D3A78139C14405750D5E416F745400000000020680ABF46BCB6D9019B1440B23296A646F7454000000000A0680ABF779CEF6E749C14408889DD01EDF7454000000000C0690ABF066895DF189C1440C1AC48F281F8454000000000C06A0ABF8780E6ADED99144027C12622F7F8454000000000E06B0ABF11005BA022991440D0D9C91D19F9454000000000406C0ABF385AC39127991440B7D1DE571AF9454000000000406C0ABF7A0BE0656799144052E0EB3161F9454000000000A06C0ABF96E00D9AE99714406F8D0526ABF9454000000000206D0ABF2D9BF9E7F69614405406F12BC4F9454000000000206D0ABF8DF34CCC5F9A1440A375B0ECDAF9454000000000A06D0ABFBA0584A6969F14407FF0732B13FA454000000000C06D0ABF3F8A997FFFA3144062F4CE5355FA454000000000806E0ABFF8208A6E0EA614408963D2F46DFA454000000000A06E0ABFF23F201849A9144075CC359C73FA454000000000A06E0ABF25A1F61FF9AD1440C89E969C55FA454000000000606E0ABFCDED5B84BCB11440125C083E17FA454000000000206E0ABF2E62DC19FFB3144030189636F8F9454000000000C06D0ABF6F10859CA0B51440F9A79FA6EFF9454000000000C06D0ABFFC50593D19BA14404F7C2A7F11FA454000000000E06D0ABF5CDB82FEBFBB14406CBB090F1AFA454000000000E06D0ABFB54C1DBB50BE1440C2F33DCA01FA454000000000E06D0ABFFA2D6303D3C01440B03D839BDDF9454000000000A06D0ABFD5F841BF3BC21440859BF273D7F9454000000000A06D0ABF24418BDEE5C71440A8903AE615FA454000000000E06D0ABF5629BCA432CB14403BB5495C69FA454000000000A06E0ABF115043843CCD1440D0E29A13EFFA454000000000A06F0ABF17390CA8AED114405BD3C79A3DFB45400000000040700ABF4B784F3B85D31440A97E20B5AEFB454000000000E0700ABFB32359CC01D714405BDBAE2AC2FB45400000000020710ABF1CD37D9FD3D914406870148F07FC454000000000C0710ABFC607018617DD144044274B442CFC45400000000000720ABF4C5EADB3A5DF1440644B3378E0FB45400000000040710ABF0F9E5F7245E2144023CD6D962BFC454000000000E0710ABF160D23AC50E4144094253C1A61FC45400000000040720ABFEA59C9BA3DE514402478C7F8F0FC45400000000020730ABF127144AE9FE7144088497FDC15FD454000000000C0730ABF026F56B2ABED1440CA91630071FD45400000000020740ABF5D78247272F114405CC558E6BFFD454000000000C0740ABF1DF4FCBEBCF81440F1C33515A7FE454000000000A0760ABF79309683D7FC1440DB734D66C5FE454000000000C0760ABF38CBB9C1DB0015401B8EBE3B11FF45400000000060770ABFD445860B55021540146EA9C820FF454000000000C0770ABF6D015EE7A6031540E9A06EDA15FF45400000000080770ABF1E7CDE42A70915409B7837E791FF45400000000060780ABF5C43CA4CEC0C15408EE3E7AD85FF45400000000040780ABF3A64B7E88F151540E5A3DA5169FF45400000000040780ABF1C0EDE39AE181540AB2B8B2142FF454000000000C0770ABF5B05FCB626191540AABEF0F523FF45400000000080770ABFB7A808943B1B1540E5DEB9A948FF454000000000E0770ABF33278D46972215402DBADAD567FF45400000000020780ABF54A82ED03A25154070986A6EB4FF454000000000A0780ABF84477C91D02915406349402AABFF454000000000C0780ABF6973AAE1F528154013ABAE1EDBFF45400000000000790ABF663A48E1F827154017A631330D0046400000000080790ABFE71AD2E11F2915402B8F6BBC5C00464000000000007A0ABF17577B05EF2D1540CA25F7350201464000000000407B0ABFCBC58CAF2F321540D58515866501464000000000207C0ABFFFA925F1F533154040C49674B201464000000000807C0ABF323E7FF1D33515400A2CF070D901464000000000C07C0ABF52F89588993715403EE3A22E2B02464000000000807D0ABF13C1CA99A7391540C0473E296602464000000000E07D0ABF1453CCD5513C15401289DB518F02464000000000407E0ABF19905BB70A3E1540CB9D43D0DC02464000000000C07E0ABFD2750F9B3142154095E5B95FFB02464000000000E07E0ABF6BBBE0FDCD441540E1780DFA3703464000000000807F0ABF95B731B61C4715402B4CF1DA4903464000000000A07F0ABFD13D6182234A1540F2E7E9351803464000000000407F0ABFF8E842B5CD4D154066F68038E702464000000000E07E0ABF8B9B4D43A350154074A4A94CF102464000000000007F0ABF116DC6260054154084F8630E0803464000000000207F0ABF2D07743BE958154057CF84BB4F03464000000000A07F0ABFEB0C17C47D5A154079B6BB525603464000000000A07F0ABF92C6DD5499601540F0E965FD5003464000000000807F0ABFE93F59DA016215407854EFF95C03464000000000C07F0ABFDF0CEE6250651540CF3268488F0346400000000000800ABFA9A4BBD86E6A1540330316118F0346400000000040800ABF20D53FA7446C154073B4A971CD0346400000000080800ABFE9C1CE980A711540C079FD58240446400000000020810ABF3AFAA982847415406C362E1B7A04464000000000E0810ABF61DF6AAFB6741540B1B8FF61470546400000000040830ABF47A9684D4E7A15406881B5D76A05464000000000A0830ABF2EAE8DE4207F1540F4D0AE68130546400000000000830ABF735DFEA7668215401DBC7B7F1D0546400000000000830ABFEAEA9515BC86154088B1C78AD90446400000000080820ABF1A0A0135148B1540CFF183D69E0446400000000020820ABF6D05FFADE68B1540084979726804464000000000C0810ABF95C4E6658A8C15406B00843C300446400000000040810ABF362EA2C9018C1540CFF97BCA0304464000000000E0800ABFB3716F5F6D8D1540180C95FCE003464000000000C0800ABF8FCF9AD1B4901540DFE7BC73A40346400000000040800ABFF084D2A2AE9515400EB95C19A50346400000000040800ABFCF6A57E8DE98154030AEA6B6B40346400000000060800ABFD0A59BEA019D154022A824134C03464000000000C07F0ABFE0BB9E7898A015401FD12D847603464000000000E07F0ABF9367E6903CA51540991DD2E0B80346400000000060800ABF8A86AD0CA2A715404D9B1BB8300446400000000080810ABFDEDB778D6AAC15407B30F8F03A0446400000000040810ABFD6998E491CAF1540A46B33F0890446400000000020820ABFEB09859A91B01540D39E06DBD50446400000000080820ABFB26ADF2978B21540317BC08C7B04464000000000C0810ABF8874587EB0B515400AA8B436E703464000000000E0800ABF63098105ECB9154008C7DBB13903464000000000807F0ABF57D24BFF4BBE1540CFBBFB427502464000000000207E0ABF48F7701BB2C215404299E67F0002464000000000007D0ABF77E38BEDD9C415403C6A8215A401464000000000607C0ABFBAA4EA5AE6C5154049B5DB052501464000000000807B0ABF5C33F1E1B0C71540D0CA81EFC200464000000000A07A0ABFA55BE1EBA6CB1540C0E317582E00464000000000C0790ABFF11F01F188CD1540D9F60FBE2700464000000000C0790ABF094D1C1684D0154059B1EC282E00464000000000A0790ABF242C5AF668D215409F18095E2600464000000000A0790ABFD2CC0B93B5D51540060413362700464000000000C0790ABF03E265F9D1D715409E4A36883D00464000000000C0790ABFA6B4F1692CD9154090240E2D050046400000000060790ABFE4F4B879F5D81540ED0CA445E0FF45400000000020790ABF3F3396E6CFD615409FE6FCDD81FF45400000000040780ABF052AB7F98CD71540D2704A8745FF45400000000000780ABFB42E057B30D81540D3384EB020FF454000000000A0770ABF91403929FFDA1540D71B013519FF45400000000080770ABFDA94F8DA0BDE1540E1944B80DDFE45400000000020770ABFC68FE27BB2DE15408280FEBE5DFE45400000000040760ABF0AA2930FBAE215407247C2E6C3FE454000000000C0760ABFFBAABB450BE715405D2D7AB8DDFE45400000000020770ABF38219BB899EA15403E007AD3E6FE45400000000040770ABF795F10F57EED15400F9B0755B3FE45400000000080760ABFFC524B7A63EE154054191DED4EFE45400000000000760ABFF9B10E00BAF015401641BDD95DFD45400000000020740ABF9C10FC8DB2F51540A4A9A1D289FD45400000000080740ABF076E3112B6F415407469470B6AFE45400000000060760ABF87E79B483EF4154099F2ADB8DDFE45400000000000770ABF19C76A8D25F41540D559508C2EFF454000000000C0770ABF3F47986AD5F3154096D8D49558FF45400000000020780ABFB7E72BE2B5F315407C18CB1077FF45400000000040780ABFC69F27AEB8F31540111B91FC8EFF45400000000060780ABFA12DD36A58F315406C10031D1A0046400000000080790ABF779DC93909F11540B257F3997C00464000000000607A0ABF8A99B38DADEF1540DC75F397B600464000000000C07A0ABFE36AE6E5F1EC1540855B9775EF00464000000000207B0ABF032AAD5DDCEB15401AB681CB2D01464000000000807B0ABF3F131051AAEA15401F37F19CA001464000000000607C0ABF294498642EE915404B9ED48E1502464000000000807D0ABF76877B08B4E515409D25330F9D02464000000000407E0ABFDF00E9066BE215402DD369D00303464000000000E07E0ABF1C58D165EEDF1540EB5F3E875A03464000000000C07F0ABFCD23DC2FE5DC1540549D1DB2B10346400000000080800ABF6FADDF87CDD9154028FED0C12E0446400000000040810ABFBAE9908800D71540DDEEF9178C0446400000000000820ABF9A2E37B455D31540F11BC00EE30446400000000080820ABFCDB0E7AAE8D0154049F792A5230546400000000040830ABF223109A139D0154073B4B2245405464000000000A0830ABF7EF797D79FD015400141A43A910546400000000020840ABF907961CB21D31540671F0B84CF0546400000000080840ABFDD92BBEEC8DA15407B68D85AFE05464000000000C0840ABF5BD5B96FE5DE1540E094C911580646400000000080850ABFE4145009E3E21540334C32398E06464000000000A0850ABF1B8C1F58C3E01540F77DD1CA9B0746400000000000880ABFC988CBCA8EDC15402D72115A1E08464000000000C0880ABF212891D2CDE015405D14BE255D0846400000000040890ABF4C313F3B0AE415405335AFC1DC08464000000000808A0ABF50B205ECE4E71540B49B2DD90609464000000000A08A0ABFC0996E9B9EEA1540963A434CFF08464000000000608A0ABFC5A188C7EFEC1540CF2DD4D1690846400000000080890ABF47FFAAA77CEF1540E5DA65C16E0846400000000080890ABFC4C7079749F3154097FEDDBE5E0846400000000040890ABF888BCEC8D7F5154073115F0E6D08464000000000A0890ABFCB55BF9246FA15408658FC3FED08464000000000408A0ABFA67EED1BC9FD15405545D391C508464000000000208A0ABF06CCEC3119FF154069D13D41A808464000000000208A0ABFF6E3269CF801164002509A389F08464000000000C0890ABFAAF5E91CC6041640A8E5F120D008464000000000408A0ABFB52B69E33A051640E1D7D3ED1D09464000000000E08A0ABF2C67DA28830A1640ED23E5A83009464000000000E08A0ABFDDFFC610E30D1640025EB6A85D09464000000000208B0ABFB541AF6C8B151640319F11249709464000000000A08B0ABF7D8EEFC1AE17164086E4A686ED09464000000000408C0ABFBE726A5DA21B1640EBF151161A0A464000000000A08C0ABF7054A0A959221640962D2D59EE09464000000000408C0ABF534884BB05251640ACD5F8F6090A464000000000608C0ABFAF7327125E27164067F16228EA09464000000000408C0ABF74EE85B51B291640A7DC7945140A464000000000808C0ABFF67CD254F82A1640A9E036CE4A0A464000000000208D0ABF81ECA641DE301640383A4C9D8B0A464000000000808D0ABFD1196A39D23216400DBB9926630A464000000000408D0ABFEDED08D402351640F1400D41220A464000000000C08C0ABF4411173E16381640237FAFFE2A0A464000000000E08C0ABFE2D526DDED3A164092630FA39E0A464000000000808D0ABF95D436C3B93F16400B477283EA0A464000000000208E0ABF6F95E8F2724616405145EF11CD0A464000000000008E0ABF173CA720DB4D1640AA2257BBBC0A464000000000C08D0ABF85767FB2ED501640CE3748D0450B464000000000008F0ABF1F245DC9CF521640885381809B0B464000000000E08F0ABF4790EEEDD0511640FFDD5976EE0B46400000000000900ABFC02B7F877B5316400BB7DCD5410C46400000000000910ABF3DA637C04A57164089DFC24AE30C464000000000E0910ABFBFD68369985B1640ABF221BD640D464000000000E0920ABF0B5F7968B35C1640998D5126DC0D464000000000C0930ABF09621E68A55A1640E09901544B0E46400000000080940ABF8A71A5740C5B16404C7ABF5C850E46400000000020950ABF321D0FF5935B164062A4CC63EC0E464000000000E0950ABF7EE2CEC1F45B16406E3242E5440F464000000000A0960ABFD3E6532AD861164088C4B8EA780F464000000000E0960ABFF2847A093D6516403271E79C3C1046400000000020980ABFAA73E2A8B069164056ADCE3DA71046400000000060990ABFAEDC8CDD446A16402BCEC75B7311464000000000E09A0ABFCA9B667FD46C16404C374A9A5D12464000000000A09C0ABFFC01C3A3916F16404C168227BA12464000000000209D0ABF317BFFF3E86C1640C22AA83A3613464000000000009E0ABF5697F9FF6D6A1640C7E114749513464000000000A09E0ABF1D3FB28D6469164014B670B5C113464000000000209F0ABF91CEF23C516C164017CA5F0DB013464000000000409F0ABF3C82159C297516407D5C79406A13464000000000809E0ABF141998807C781640886AD0DA6513464000000000609E0ABFE6218FFABE7C1640E7B8AA884613464000000000409E0ABF7BBE0CDB6E8016404E7258D24113464000000000409E0ABF7C843304778516400CCFFDE73E13464000000000009E0ABF706322EDB7891640A4748DE14613464000000000409E0ABF1CB4BDD2648F1640508D478F2413464000000000C09D0ABF83BC33D73B931640E4832A301913464000000000E09D0ABF33AE83774D9516401292ED86FB12464000000000A09D0ABFEE04698441941640E8958694AF12464000000000209D0ABF722C333114961640259E34811112464000000000009C0ABFC780DC7DAA9616408215E7ADBB11464000000000209B0ABF39ED71D801961640710D4DDD4811464000000000A09A0ABF2569AA4D5B9316402417FF6D0911464000000000E0990ABF57049E74BE901640A374A449FF10464000000000C0990ABF2383E2C2A98E164096A1609D921046400000000000990ABFDA9A0542568F164055A38056441046400000000080980ABF48C85469B28E1640FE081385F80F464000000000E0970ABFD47BBC03778E1640804672A5AA0F46400000000060970ABFCDDE8950C88E1640E1D8AD76520F46400000000080960ABF0321D51501901640D4A51C63FC0E46400000000000960ABF5E8DE159E88F1640DF2C3369790E46400000000020950ABF5C463BDD4C8D1640D2CD16133F0E46400000000060940ABFE2D250F3628D16407CAA08390C0E46400000000040940ABF392FC290798E164021A6DF28E20D464000000000E0930ABF375F1D0E598F16407E2D7CE8B70D464000000000A0930ABF766951DEB98F164052BAD0B4790D46400000000000930ABF2B7A926508911640BF822A74400D464000000000A0920ABF7B6668C3829116400B9F72F0130D46400000000060920ABFE58FE140F99016407A23B761DE0C464000000000E0910ABFB7CD58051A941640859A4756E10C46400000000000920ABFC782848D4F95164056D7BF6A9D0C46400000000080910ABFF0D5BAC1979516401004605D6D0C464000000000E0900ABFC5EE3BA3A9961640D734D0DF4C0C46400000000000910ABF7133A525489716406941C679140C46400000000080900ABF127E3D84D396164018BD3CFFDC0B46400000000020900ABFEC49334D50981640826BB7F9970B464000000000A08F0ABF55C654621C981640AF7F7A894E0B464000000000E08E0ABF0EA26ACE9F95164075ABA8CB650B464000000000008F0ABFA65E7563E7931640C3DCEFDC670B464000000000208F0ABF77FEA8AE28921640AE10B302590B464000000000208F0ABF2CD091E3ED901640CC68B8724D0B464000000000008F0ABFCA5E321738901640E8B5220D320B464000000000008F0ABFEF7E0041D38F16406AFCEE2A140B464000000000A08E0ABF6D8F2C5B958F1640D4F319C5F10A464000000000808E0ABF53917E8C179016407F69CF42980A464000000000808D0ABF004C0D0A3E8F1640553038B6480A464000000000008D0ABF4F699BD06A8E1640B590560D0A0A464000000000808C0ABFA083EF35AF8E16408AFC37AFCF09464000000000408C0ABF5C19C459448E1640621F49508C09464000000000A08B0ABF6EF5ABA1598D16403108FC5D3A09464000000000E08A0ABFC2035E2DA08D1640135EE51ED608464000000000408A0ABFF8432BDD328F1640FFE4DE519F08464000000000E0890ABF7FFB059E548F164061760CD2490846400000000020890ABF71B673F6018E164081F07B7CE70746400000000080880ABFE526AC8B0E8D1640250D23868807464000000000C0870ABF0E601446E38B1640750B20B42A07464000000000E0860ABFB1884F9E218B1640DB4C8733ED0646400000000080860ABFA0840B96B68A1640A19C6A06C10646400000000000860ABF32EA7401A58A16400E3929479B0646400000000000860ABF3FC5BDF9F28A16400B5E7CA06C0646400000000080850ABFF0E24ABC6C8B16407B1E259E370646400000000020850ABF96B883AF508D16401203F4C5FE05464000000000C0840ABFD0D416B58B8F164030F0790CC60546400000000040840ABF27B3AF61EB92164072263467A50546400000000000840ABF022CCAE500961640AB19FA118605464000000000C0830ABF34222E96D997164083843FC25705464000000000A0830ABF77917FBDF698164040894B0A3B0546400000000040830ABF557948E8689A164043F103560E0546400000000000830ABF94988F547C9A164068546E59E504464000000000C0820ABF6D1D21ECEF9A16406B05FF2DA70446400000000040820ABFC6D167A7299C1640B37E61AF590446400000000080810ABFA39C2212909C16409503797C450446400000000080810ABF874DFC2D999D1640DDD4E84F240446400000000060810ABF9AB12F57A29D1640A44BC20FFB03464000000000C0800ABF0C9A291C979D16406F1B38F0DC03464000000000A0800ABFE135BF6DFE9D164025E577D7A90346400000000020800ABF26637B4EE69D1640B2FB0A256903464000000000A07F0ABFFD8713348E9E16406B5107B64903464000000000A07F0ABFAE33B47BE29E16406FF086652503464000000000607F0ABF33511D99869F164037E605C71103464000000000207F0ABFB6909EFDEA9F164091258EBF0203464000000000607F0ABFAF0728CEA89F1640AEA226EDE902464000000000E07E0ABFA3BAB8BB779F164046BADA00D402464000000000C07E0ABF9448BF91A89F16400A511633BF02464000000000A07E0ABF357A8C32C09F1640D74AC2D7A602464000000000807E0ABFB75FEB0308A01640FE1C6F208C02464000000000207E0ABFA535F7998AA016406DB2D45D7602464000000000207E0ABF102C97D7B6A016405FBBF9625402464000000000007E0ABF884E920565A01640AC6AF2A61102464000000000407D0ABFF49E980041A01640D407E4DDF201464000000000407D0ABFF524EA205B9F16409FAD7ABBC301464000000000C07C0ABFCDB10B4EA39E1640746A0F9B8B01464000000000407C0ABF25ABEC07589E1640956B1C3C5B01464000000000C07B0ABF626AD2A6679E16409856D1462E01464000000000807B0ABF8A800EAF509E164077C973990601464000000000407B0ABF0C8650B2AA9E16402376A3EBDA00464000000000007B0ABF80D2E6A3B99F1640EAC89CD3B300464000000000A07A0ABFD6BDD5BD38A0164058C23CD96900464000000000407A0ABF5BBD8870A69F1640582507862900464000000000A0790ABFD990CC08639E1640BEC2AD7BFFFF45400000000060790ABF4EE871E5C49D16404C96D6BCD5FF45400000000000790ABF4705BCA1759D164016B23711BBFF454000000000C0780ABFEDE629C4429D164063CBB70B85FF45400000000060780ABFDA1548C1319D16409F7E20875DFF45400000000020780ABF53F77CEA169D1640D20AF6DB3DFF454000000000C0770ABF36EFB653AA9D16405EF5A54932FF454000000000E0770ABF0C8FC529FF9D1640EBDCE38425FF454000000000A0770ABFE680B7016F9E1640B8275E8A1EFF45400000000080770ABF00B494443E9F164084C84B2312FF454000000000A0770ABFAFB07DDFDF9F164046D070F50DFF45400000000080770ABF52C1693359A01640EDB591600BFF454000000000A0770ABF591BCB19F2A016401C524AC705FF45400000000080770ABFED8AF64009A21640B59B60CD0AFF45400000000060770ABF71DD0162FEA216401F6D2C450CFF45400000000080770ABFA066A01D19A416407D8056DF1AFF45400000000080770ABF575FE60392A51640C2E8EEB235FF454000000000E0770ABFB2DAB660A9A61640421F006325FF45400000000080770ABF91E3D04A26A516401876F92CF7FE45400000000080770ABF9E12848AC0A41640537A44A1E4FE45400000000060770ABFCB73B51EE1A31640A2C59E7CDCFE45400000000000770ABF0E0B619BE7A21640E3A24A42CFFE45400000000020770ABFFAAE624E3BA2164046E0A8C2B6FE454000000000C0760ABF38C7BB89C9A116409AF7B3C5A1FE454000000000C0760ABF700FF8D821A11640098AFAB27FFE45400000000080760ABF5C5B4F8C54A01640EBADAC6E50FE45400000000020760ABFD4C8C95AEA9F16407C3EF0AE3AFE454000000000E0750ABFBE3B97F44E9F16404212C09B23FE454000000000C0750ABF373F2693519E16402807BF361FFE454000000000E0750ABF2286BBE1B29C16401924B15014FE45400000000080750ABF03EE17652F9A1640DEE118881FFE454000000000A0750ABFEC8718FFAC9716402E994A2A40FE454000000000E0750ABFA582833DD79716406BD12AB927FE454000000000E0750ABFE9BAF8C7AD971640415054620EFE454000000000A0750ABF3863D1622D96164044E512C2FEFD45400000000040750ABFBDBEBCC9DE951640E118B864E8FD45400000000060750ABF8066391D639516401233B267C1FD454000000000E0740ABF4C7592D2E694164096109977A9FD454000000000A0740ABF40124803859216409301EE979EFD454000000000A0740ABF56C8F8CBFE9216402AEE916F8DFD45400000000080740ABF910704B230931640C02C5FE069FD45400000000060740ABF434231F54F921640F4A835F947FD45400000000020740ABF99717444AD91164063F21C1A33FD45400000000000740ABF74D0B373A3911640C12964A218FD454000000000A0730ABFC59CC26531921640AAFF498DDFFC45400000000040730ABF1DE165C845921640B6562962BEFC45400000000020730ABF5FAE9108C1911640CEEB0713A2FC454000000000E0720ABF31B148DB35931640007221A975FC45400000000080720ABF0B000B61CB9316407173FF0F51FC45400000000040720ABFDBAA085C6C94164096F8BA0129FC45400000000000720ABF1BC574E9A0941640057B7C1618FC454000000000C0710ABF5F497C9DC49416409651753DFBFB45400000000040710ABFE3011425399516407A1296B3E5FB45400000000080710ABF2BB174877E9516407BF874ABCAFB45400000000060710ABF495D7178599516402BF40329AEFB45400000000040710ABFA4CE6C8AFA9416406EEC7CFC95FB454000000000E0700ABFD0EB67AFA79416401B07273C7AFB454000000000A0700ABF9107687E1E94164078A4D5566CFB45400000000080700ABFEAAB1F26DA931640805EDD4F3FFB45400000000020700ABFFB4B257D7C931640B650A0692BFB45400000000040700ABFEE6E95EC699216406CC8C71900FB454000000000A06F0ABFDEA1A82E799116404D4656F5D6FA454000000000606F0ABF6B40786EA2901640BBCBC57CBBFA454000000000006F0ABF9B574ECF228F164095E8777E96FA454000000000E06E0ABF9AB9D026208D16402F4C66E74FFA454000000000606E0ABF62CDED60AA8C164090A299DB2EFA454000000000206E0ABFD3648BD39D8C1640ACDB01EF0CFA454000000000206E0ABFCC9578FAC78C1640F4ED5925EDF9454000000000C06D0ABFFF580A934F8C16402C1302B8B7F9454000000000206D0ABFA35CC1DFB48C1640A8F2F9587EF9454000000000E06C0ABF04A13F1B698B16404BCC673756F9454000000000806C0ABFE3765EF13D8A1640220560A83EF9454000000000606C0ABF8D0EEE6AD089164058025D7C10F9454000000000006C0ABF7D1FF17648891640D14DBE64E2F8454000000000E06B0ABFC73D241DE78816402166CFD8B8F8454000000000606B0ABF34E8F179B78716404792FE008EF8454000000000206B0ABFE77D18B9C78616405D7BF2C35AF8454000000000A06A0ABF1115D1520E861640BE9D0A9B29F8454000000000406A0ABFB228462FBB85164055FC5D09F4F7454000000000E0690ABFA0A200BE5E851640768FE7BEB0F745400000000040690ABFE011C98DAD85164003BF4F088AF745400000000020690ABF418AA282078616406C38936254F7454000000000C0680ABFE07DCBC321861640475251EB24F7454000000000A0680ABFD330AF8281861640322EE0240DF745400000000020680ABF5C4C243F6A871640844684FBF3F645400000000020680ABF10626F9B0D881640D28AF38CE1F6454000000000C0670ABFD96AC22B3B8A16401A83C22613F745400000000020680ABF4D2ABCBB328B1640671B6D2631F745400000000080680ABFDCF33027178D1640156F202550F745400000000080680ABFDD55FD3FD98F1640818E44692EF745400000000040680ABF866411D0B491164046ACB4E31BF745400000000020680ABF3593746AD49216401DE0A3800CF745400000000060680ABF19F76A69FC921640871CE616DFF6454000000000C0670ABFA8F2E9DB5693164090491FE8BAF645400000000080670ABF0A12EF11A4931640C78C00B38BF645400000000040670ABF405C430C759316403F576D0E73F6454000000000E0660ABFA11B099FEA93164055D6EA8A4AF6454000000000C0660ABF6A515CCE66941640922365A135F6454000000000A0660ABF8623A75D4C9516402F02CFB525F645400000000060660ABFDB1FC24730961640AD0550160CF645400000000080660ABF62D531064C971640F6A13571F2F545400000000020660ABFAC09688396991640CB5F223BF3F5454000000000E0650ABF3891BE3F5B9B16409DCCD688D6F5454000000000E0650ABFC2B93A3F499C16404F1F9446C1F5454000000000A0650ABF5B37B4DB339C1640E5464E5AA0F545400000000060650ABF47B7FC26029C16407CDA076F81F545400000000020650ABF715E61879D9B164079FD2AA070F545400000000020650ABFB56160945B9B1640F7B3FA1158F545400000000000650ABF69262665AE9A1640CA57064137F5454000000000A0640ABFC7085C305F9A16405C80709D13F545400000000040640ABFFD7CE50B499A1640072EA283F1F445400000000040640ABF4C2AF426919A16402D6A0F19CFF4454000000000E0630ABFC873F592629B16403950544BACF4454000000000A0630ABFBF661A98EB9B16401E220AD581F445400000000060630ABFEE4A4E903C9B1640BA2C5D845FF445400000000060630ABF6E863726199B16406396473033F4454000000000A0620ABF47B3345FF69A16403C2DD09108F445400000000060620ABFB6E368C88E9A1640BA9BBFE0D8F345400000000020620ABF9AB2C997019A16407A9EB8FCBEF3454000000000C0610ABF6EAA313C24991640D9488FEC9AF3454000000000A0610ABF645802C2779516408C1B4CB228F3454000000000E0600ABF74A6EEC48596164066A0E636EBF245400000000000600ABFA36864C171971640786E643FB7F2454000000000C05F0ABF000F74F7B098164049534A8197F2454000000000A05F0ABF95A22DA95B9A1640DA7127B481F2454000000000605F0ABF054627A77C9B164075797A9676F2454000000000605F0ABF27C9782C779C1640564CF9D869F2454000000000205F0ABFF437AB88DE9D1640AF73CAC969F2454000000000605F0ABF08C2AF7D0F9F16403964AA9957F2454000000000205F0ABFB107D3DC54A016401A1A95B623F2454000000000C05E0ABFEF28FD52DDA116409035D45FFEF1454000000000805E0ABF9D1C0C6C97A31640C2284722CBF1454000000000205E0ABF22F073ECADA61640792F26BFAAF1454000000000C05D0ABF06F650A1F2A81640C46C8C5C85F1454000000000805D0ABFD0573C877BAA16404052625146F1454000000000405D0ABF732C041721AC1640183A45A718F1454000000000C05C0ABF568FC00B4BAC16406A0CB85AF5F0454000000000A05C0ABFCEA0FD09B2AC164040E9E2F5D2F0454000000000405C0ABFB7F2F14ECFAD1640DE81B0FDC5F0454000000000205C0ABFC3D96C805FAF16401843ABC2C2F0454000000000205C0ABF75E32249C8AF1640913FCAA0D8F0454000000000405C0ABFBAEAF27507B41640BA28C5A1E1F0454000000000205C0ABFFF0C79AF71B516405AFB0026FFF0454000000000605C0ABFE5F71C2DFFB81640C7592DEC19F1454000000000A05C0ABF2F65B56A6DBB1640376BE67827F1454000000000A05C0ABFB6061C33ECBD1640A47FCD0812F1454000000000C05C0ABF2A24564C3FBF1640BC5683430AF1454000000000E05C0ABFE10B370C6DC016402FA2114001F1454000000000A05C0ABFE36ABF68E6C116406C1E2240E9F0454000000000A05C0ABFAD665C58ACC11640792772BBD9F0454000000000605C0ABFB701E4C39EBF16408AA96372CBF0454000000000405C0ABFFE4CB8E5E5BD164075498E6B9EF0454000000000C05B0ABF9DA0705E10BE1640E7B6BC9570F0454000000000805B0ABF5FF71E23DDBD16406159DC3E5FF0454000000000405B0ABF611392A2ADBC1640728610B341F0454000000000205B0ABF00B9ADBA85BC16401F0406671AF0454000000000C05A0ABF61151F4B34BA16407B4F3A8408F0454000000000C05A0ABFC9E64B3CB8B9164006981C66BFEF454000000000205A0ABFA578203C02B8164063B909E6B9EF454000000000205A0ABFD4F54605ACB5164037DAF7289BEF454000000000C0590ABFD103A27C6CB51640C42BDBBD77EF454000000000C0590ABF14F4B6A837B616403BFA9CB739EF45400000000040590ABF256741BCFAB7164006004A1420EF454000000000E0580ABFD62D3EF271BB164087F17643E5EE45400000000060580ABFC287FB7B65BE16408E068F49BCEE45400000000040580ABFFE1158898CBD16400D4255D191EE454000000000E0570ABF497000B2C0BC1640D5ABC40064EE454000000000A0570ABFA8E6EE297CBC16405C50A0C43DEE45400000000020570ABF25543DDC5EBC1640DAC3A3B90AEE454000000000E0560ABFB76928D7EABB1640F3D7112BDCED45400000000080560ABF9C1A0C298FBB164015A70FCAA9ED45400000000020560ABF3484E612AFBB1640536C0FB374ED454000000000A0550ABF5FE2A1A933BC16402403CE6045ED45400000000040550ABF0F705F68E0C0164026AC5CD4F3EC454000000000A0540ABF9CAA7A3CCAC116404F31F3E0D8EC454000000000A0540ABF9091F55054C316405D4B7B1AB2EC45400000000040540ABF6D49F8A031C31640AB91A9D98AEC45400000000020540ABFBD71EA989BBF1640306860EB85EC454000000000C0530ABF2A819674AABA16407C5C08D586EC454000000000E0530ABFBDCC1799C4BA1640CB29675249EC454000000000A0530ABF318D519CD1BA164036030C2236EC45400000000080530ABF419A234D63BB164077EEFE0107EC454000000000C0520ABFA8BF63F095BC1640052025B3AEEB45400000000020520ABFAC12C4E423BC164001A3FE8EB1EB45400000000060520ABF2E2E26AF3CBB16409DF7051CAEEB45400000000040520ABFDE180C4FDAB9164044E2F18BADEB45400000000060520ABF5CED830A9DB8164067427BAAADEB45400000000040520ABF22F8780C0CB816401D98430FA7EB45400000000040520ABFFAE004D46AB7164020A27BDFA5EB45400000000060520ABFB7EAD47E77B61640619648BDB9EB45400000000060520ABF857A22E1EAB4164007173658CFEB45400000000080520ABFCEDA4570E1B41640C7CAFF1AA9EB45400000000060520ABFEEF03AB92CB51640803B7BA889EB45400000000040520ABF6ABF197A01B51640E7C0D25C5FEB454000000000A0510ABF1DB4B947DDB41640B9E633D54EEB45400000000060510ABF2E7623769AB41640DC3EE5F447EB454000000000A0510ABF36771E17DCB2164096C87EE527EB45400000000040510ABF6F326192C9B11640ED6267080DEB45400000000020510ABFA81005567DAF1640B7C7B0FA0DEB45400000000020510ABF4207A00980AD16404F2B5DC109EB45400000000000510ABFFD95A86297AB16401C78A193F9EA454000000000E0500ABFC5E49C3B38AA164058F5EAD5EAEA45400000000000510ABFA220F2B3B7A81640600979A3DCEA454000000000E0500ABF7DC94BB672A716403D4C8730D4EA454000000000C0500ABF19ADB4C885A616404C48468BC6EA45400000000080500ABF5689CA5E9DA516401017EB00B0EA45400000000040500ABFCB2B4880C7A41640F1DB16D695EA45400000000060500ABF43FF1D45D8A31640C3BBBDF881EA45400000000040500ABF4D82321D4FA216405D34C3E260EA454000000000C04F0ABF8BF29BB906A216404718857747EA454000000000A04F0ABF7EA4BF14DCA116404C2B025E2DEA454000000000804F0ABFF15937FBD6A116408624C2A91FEA454000000000604F0ABFB8ED9AEB16A116400A06B428F1E9454000000000E04E0ABF64ABC0167B9F164094A08343E8E9454000000000204F0ABF066BBDD1E39D1640292AD42EFDE9454000000000204F0ABFD56E6BF0C09B1640CDAF480144EA454000000000A04F0ABF7A6F07C8799A16404A10DAF26CEA454000000000E04F0ABFEFD84EE5A6961640514478B374EA45400000000020500ABF20317AC838931640519FCD3170EA454000000000E04F0ABF9BF10CAA6391164053B8CA5D5AEA454000000000A04F0ABF7D720A4FAB8F16402FD888F315EA454000000000404F0ABF474A85D34E8F164083E163BB03EA454000000000404F0ABF10DBD893348F1640AF2B9A85F2E9454000000000004F0ABF35C4CA32DF8D1640AF422959F3E9454000000000004F0ABF1563F890728A1640418E486FF4E9454000000000404F0ABF2E5AFC9784881640D14426760AEA454000000000004F0ABF1A99B06F4A871640E0C429810DEA454000000000404F0ABF8BB48B2A83861640D7C6969D1AEA454000000000604F0ABF50CAC3698085164077CF615827EA454000000000604F0ABFBE180DE1E1831640B921D7033EEA454000000000804F0ABFC2DD1DD163821640428D6A9F69EA45400000000000500ABFF376D1C3B68116404331E5BB6AEA454000000000E04F0ABF90B6CFBA3E7F1640D1A71F425BEA454000000000E04F0ABF6650F66DE77C1640DB4364CD26EA454000000000804F0ABFB83AA908C47716403562866E3EEA454000000000804F0ABF603D07FA7E75164037A4A2C9E0E9454000000000A04E0ABFEF08516FD374164070E0B372EAE9454000000000E04E0ABF860493D51D721640F67A70B2FDE9454000000000204F0ABF5E4E262477701640D0A04ABC01EA454000000000204F0ABF85CF8403D56E1640104897AC06EA454000000000404F0ABFC37E61BE6B6D164054F5950803EA454000000000204F0ABF11B3CB41EA6B16400F6E6E1408EA454000000000204F0ABFA5234B4A516A1640605F463AFBE9454000000000404F0ABF2ACAC3BD3A6916405F1AA1BEE2E9454000000000E04E0ABF7EFFFFE4F46616409C3595A5BBE9454000000000A04E0ABF9B0A00D27D641640416EBCA2E9E9454000000000E04E0ABFE47E9BE5C8621640E42ECD203BEA454000000000A04F0ABF1DE05F3D4C601640CF5356914BEA454000000000804F0ABF5D4C62B2185F16407419CCD846EA454000000000C04F0ABFB0952C5F515E164019AB3ADF31EA454000000000404F0ABF4ECBA7F50C5D16400824ED3EF0E9454000000000204F0ABFA5015A49185B1640D8F9DC5BC5E9454000000000A04E0ABFBF162828E95916402D102C8CD7E9454000000000E04E0ABFBDA4F118B8571640434B3EEEE6E9454000000000004F0ABF6D3D2C1E9D531640C5E7A46114EA454000000000404F0ABF19EEBD69484F1640BC4BCC8945EA454000000000A04F0ABFD8541BF36B4B1640D7710AE344EA454000000000A04F0ABF64A70CB3054916402F11F9442EEA454000000000604F0ABF38F28459E3451640C315708EFBE9454000000000004F0ABFC930A758F34416409A3DA2F9CEE9454000000000E04E0ABF420944571945164076C7876378E9454000000000004E0ABF00493B319F411640560AC010F6E8454000000000004D0ABFABFA25236D3D1640CA1DAEE02BE9454000000000804D0ABF4E41C1ABE33A1640BA4A51F5EAE8454000000000204D0ABF2FA6B92E4C371640C34E8E5DC0E8454000000000C04C0ABF6681FCC8523416401F6118B19FE8454000000000604C0ABF732312671E3316405D6F12AB7FE8454000000000404C0ABFE2B054FBDE31164081AECB8B81E8454000000000404C0ABFD266E6FDF22E16408261C96A90E8454000000000604C0ABF4780C1960D2C164060CDD5039AE8454000000000804C0ABF67B05CF19629164048EE9159A4E8454000000000804C0ABF544C663500271640CEE1174FB9E8454000000000804C0ABFCC96C7BE74251640CB7ACC38C3E8454000000000C04C0ABF6EEFEEA66B2216401EA085B7B2E8454000000000C04C0ABF530C24D6EB211640B07BDC87B3E8454000000000804C0ABFEF5D938ABB20164003F71620C9E8454000000000A04C0ABF08B2A2C3331F1640C2AB52C2E5E8454000000000004D0ABF8B93C255541D164056BB5E58EDE8454000000000204D0ABFBF47C4548C1A164024DA651DF9E8454000000000204D0ABFA6B12B15291716408DC49C38FEE8454000000000404D0ABFF81423177B1416408CE87B1EEEE8454000000000404D0ABF9B1C1DE7CE11164010234107E4E8454000000000004D0ABFF3BAD1C5F50C16406B73EC67CCE8454000000000C04C0ABF89452623B00B16402BA070B1D5E8454000000000C04C0ABFA7F40655F00A164080FC5982DFE8454000000000004D0ABF754D747C980916403B3386BADEE8454000000000E04C0ABFCD9A71230A09164000F5834DDBE8454000000000404D0ABF1D0A2EA321061640267145F8D2E8454000000000004D0ABF20107E9BA9021640236D02A3B8E8454000000000C04C0ABF1CAA9E41300116403904149DBDE8454000000000C04C0ABF2A71BBE1C9FE1540E12CA234B8E8454000000000C04C0ABF18DD3ED678FC15407B599CECB6E8454000000000A04C0ABFF57B110DBEFA1540BCDE5704CCE8454000000000C04C0ABF5FCAE9FDBAF9154016F420D9C3E8454000000000C04C0ABF4802072E77F71540B1EDCEA6BBE8454000000000A04C0ABF07A7B10467F515405B1FB9C4C3E8454000000000C04C0ABF20A09BD62EF315407BAC5B94B6E8454000000000A04C0ABF3315F2A876F1154086863FD1BBE8454000000000804C0ABFC4E8569D44EF15403D0280DEB6E8454000000000E04C0ABFD8B3BCFB6FEE1540D66C521FAEE8454000000000804C0ABFAB6A5AC860ED1540BD5B844BABE8454000000000804C0ABF07B51B3117EC15400C3A9F56A8E8454000000000A04C0ABF7CB50B821CEB154011FA148C94E8454000000000804C0ABFA534B2EA81E91540F1B49C7C7BE8454000000000404C0ABFBC10228969E81540FE6056F470E8454000000000204C0ABF7570FA3874E61540E227C9DD81E8454000000000604C0ABF8F0F4592DCE41540927979775DE8454000000000E04B0ABF1DA7864482E3154011E7967166E8454000000000004C0ABF8785EA8E0CE01540AD68FC0867E8454000000000204C0ABF08DCA3C131DE154071B3037C64E8454000000000E04B0ABF41651C788FDD1540754F5048ADE8454000000000A04C0ABFF3F8259F71DB1540E0BD81A4C3E8454000000000E04C0ABFEBADEA9175D91540ECC90608E6E8454000000000004D0ABF4689D63EE0D51540C7C9E77CDAE8454000000000204D0ABFAB2A6F3046D3154066DF8D97F6E8454000000000204D0ABF'), NULL, NULL @@ -20,16 +20,16 @@ INSERT INTO pr_zh.t_river_basin (id_rb, name, geom, id_climate_class, id_river_f -- insert some hydro areas which interects Calao River Basin as an example INSERT INTO pr_zh.t_hydro_area (id_hydro, name, geom) VALUES -(12, - 'Les Sorgues', +(1000001, + 'SAMPLE - Les Sorgues', ST_Force2D('01060000E0E61000000100000001030000C001000000E7000000FCC2CA9301F41340F975B69796FF45400000000060780ABF000000000000000021375C019EEF1340F96D08C574FF45400000000040780ABF00000000000000009A87CF3976ED1340AE52D01054FF45400000000000780ABF00000000000000008E307E9E57F013403117B4BF2BFF454000000000C0770ABF00000000000000001198F7D957FC134011F1CADC33FF454000000000A0770ABF00000000000000003051D0375C0214400F40B008E7FE45400000000000770ABF00000000000000009475662F2F06144031A3D01806FF45400000000040770ABF0000000000000000651279C3B0081440EED8FCB1FEFE45400000000040770ABF00000000000000004364DD45B90C14400094D5D9A3FE454000000000A0760ABF00000000000000001C47E9693F141440F83E2381B4FE45400000000000770ABF00000000000000004E8FFCA42B1F14400F5D44D0E4FE45400000000000770ABF00000000000000004C643A141F281440A69B3BAF0EFF45400000000060770ABF0000000000000000D19D211B9B30144003E3D20439FF454000000000C0770ABF000000000000000076828665B536144060FF4A2243FF454000000000E0770ABF0000000000000000150A202C543814408C0E2D533EFF45400000000000780ABF0000000000000000ECD6FF77DF3A144094D4F8AF36FF454000000000C0770ABF000000000000000034E67EF0B93D144065F6471B0BFF45400000000060770ABF0000000000000000A37C220C5C3F14402E085DDFD4FE45400000000020770ABF00000000000000007AE51F1C304314406025E13D38FE454000000000E0750ABF000000000000000072C28723E14614402A1066DFEBFD45400000000040750ABF0000000000000000CF1DF9B1AB4B144079B33401B1FD45400000000000750ABF00000000000000001E328C28645114405994853588FD454000000000A0740ABF00000000000000000DE9D1BEA1571440AD450FCA67FD45400000000080740ABF00000000000000004BB86E7E745C1440DDAB0D193BFD45400000000020740ABF0000000000000000C1D8147AF05E14406283A4A019FD454000000000C0730ABF000000000000000097E4D635ED6114400DA3D9D4A4FC45400000000020730ABF00000000000000003E6E7F4D7C631440804D5A336AFC45400000000080720ABF0000000000000000E298B450B76614405435C2C42BFC45400000000020720ABF00000000000000003A4E4F0AF46B14406FAD5EDFE5FB45400000000060710ABF0000000000000000200238EF3E6F1440AB88B39DD3FB45400000000040710ABF00000000000000005378E88F947214402F41367198FB454000000000E0700ABF0000000000000000950991AEA0761440336E7D1328FB45400000000000700ABF00000000000000006887EFEDCB791440EDACF39FB5FA454000000000406F0ABF0000000000000000EBE76FEC097C1440BE15578067FA454000000000806E0ABF0000000000000000DFFE8CB79B7E144001AC0E8257FA454000000000406E0ABF00000000000000004EF9C93C76831440D376777977FA454000000000A06E0ABF00000000000000006BD191CE2B8614409C0D866283FA454000000000A06E0ABF000000000000000094864631218B1440B31BAF8444FA454000000000606E0ABF000000000000000073C14B14419014402AD127C0E9F9454000000000C06D0ABF00000000000000009BBE8520EA931440EE726DC6BFF9454000000000806D0ABF00000000000000002D9BF9E7F69614405406F12BC4F9454000000000206D0ABF000000000000000096E00D9AE99714406F8D0526ABF9454000000000206D0ABF00000000000000007A0BE0656799144052E0EB3161F9454000000000A06C0ABF0000000000000000385AC39127991440B7D1DE571AF9454000000000406C0ABF000000000000000011005BA022991440D0D9C91D19F9454000000000406C0ABF00000000000000008780E6ADED99144027C12622F7F8454000000000E06B0ABF0000000000000000066895DF189C1440C1AC48F281F8454000000000C06A0ABF0000000000000000779CEF6E749C14408889DD01EDF7454000000000C0690ABF000000000000000046BCB6D9019B1440B23296A646F7454000000000A0680ABF0000000000000000B91D3A78139C14405750D5E416F745400000000020680ABF00000000000000005085FBA1C79B14404BD9565CEBF645400000000020680ABF0000000000000000E5E5F5F9959A1440B9E29A4074F645400000000000670ABF0000000000000000BBFAF986B29914408BED77BE19F645400000000020660ABF0000000000000000E33F9AD40B9C1440E4C58611BAF5454000000000C0650ABF0000000000000000DD9FF11CD29B1440049BFB179DF545400000000060650ABF00000000000000007463FFCDFA991440DBF6FAAF6AF545400000000020650ABF0000000000000000FF4B5F07CC9814400451711941F5454000000000C0640ABF0000000000000000E19062056D951440716DEF26D4F4454000000000E0630ABF0000000000000000C4FD25439991144016EB9F9BB6F4454000000000A0630ABF000000000000000084A9E309DC8E14407623F810B0F4454000000000A0630ABF000000000000000080F635E48C8E14405C58C29AA3F4454000000000A0630ABF0000000000000000F41CC49F1D8F14405BD5416690F445400000000040630ABF0000000000000000B08123AEC7901440FEAAC92E73F445400000000020630ABF000000000000000056B350A0189214403CDE2ADD08F445400000000080620ABF00000000000000000A68C2DB27901440F21A2A1ACCF3454000000000E0610ABF00000000000000002AD882ABB28B144030E526CA8DF3454000000000A0610ABF00000000000000000056846828881440BDF60D3281F345400000000040610ABF000000000000000091DDDEADE5871440851063CB75F345400000000040610ABF0000000000000000DE65F9B935891440763889F464F345400000000020610ABF0000000000000000C3C9097E4E8B144071D08D053BF3454000000000C0600ABF0000000000000000F93483A3408B1440686AE00310F345400000000040600ABF0000000000000000075B545A388914408C9FA238C0F245400000000000600ABF000000000000000058923CD443841440F046DFC55BF2454000000000205F0ABF000000000000000046EDE5D5548114403C0718A117F2454000000000805E0ABF0000000000000000C5844F356C81144091C5B780ECF1454000000000405E0ABF0000000000000000005F5199EE821440F37B8E453BF1454000000000205D0ABF0000000000000000FEB8E6F7728214408B9CA0C6D7F0454000000000405C0ABF0000000000000000687F6F02FF8014406CEED661A5F0454000000000E05B0ABF000000000000000072DA5F12177C1440651E4A1136F0454000000000005B0ABF0000000000000000DEEA584BE073144010FDCAC87EEF454000000000C0590ABF0000000000000000831870E57A731440D66EBAD872EF45400000000080590ABF00000000000000003FD52D44516F1440304CDCFD50EF45400000000040590ABF0000000000000000DF83E0814A681440E27E2F7338EF45400000000020590ABF000000000000000016BD0752215F14409CE1114F4EEF454000000000A0590ABF0000000000000000E55A6A248D5614400705755279EF45400000000080590ABF0000000000000000575998B41D4E1440D393EA8DB9EF454000000000E0590ABF0000000000000000472AC54B82461440E7800E2FE8EF454000000000605A0ABF000000000000000023B0690B20401440FB536549F6EF454000000000C05A0ABF00000000000000001614EF27F9391440E759283FE9EF454000000000605A0ABF0000000000000000452AEDFE3B311440B36EF285AEEF454000000000205A0ABF0000000000000000EE53745DF02D144001038F22ACEF454000000000005A0ABF000000000000000037517D74A7281440F428BB9091EF454000000000C0590ABF00000000000000003C6B3A4BEF22144080F0FE3F82EF454000000000A0590ABF00000000000000006E8B2D66EE201440A580A4158BEF454000000000A0590ABF0000000000000000A68AF033BD1C1440D8E83F2CC1EF454000000000405A0ABF00000000000000006C42F7E1EA1914409912F443E2EF454000000000605A0ABF0000000000000000552F92DAF4141440DA09512226F0454000000000E05A0ABF0000000000000000C5E53150FA1214406916611C49F0454000000000405B0ABF000000000000000038DA1349D00C1440A455569A87F0454000000000805B0ABF0000000000000000BDCC296185031440ADEAEC0BDEF0454000000000605C0ABF000000000000000072ED6E1115F913403FC6A95F68F1454000000000405D0ABF00000000000000003A3AA1D266F113409E63E018E8F1454000000000605E0ABF0000000000000000B8604EB38BEE13404F2876F505F2454000000000805E0ABF000000000000000050041A7433EA134063568ADF65F2454000000000605F0ABF000000000000000076419C7715E61340A10A9C40A2F2454000000000C05F0ABF0000000000000000DBBC5839ECE21340E606809FD0F245400000000020600ABF00000000000000009F32DB51E5E013406E4A056CE9F245400000000060600ABF0000000000000000A533DEC0E3D913409C2C5A1C3FF3454000000000E0600ABF0000000000000000F9D0F90D7BD413409A089A9785F345400000000060610ABF000000000000000048688D57A3D213406BC315EA7CF345400000000080610ABF0000000000000000E87571E91AC91340F07DFDBE77F345400000000060610ABF00000000000000000A3C9A60BAC11340B8B90CDE56F345400000000000610ABF0000000000000000F82CF80824BC1340E4468B2115F345400000000080600ABF0000000000000000D7FAF6DFF3B913409E04A34DF5F245400000000080600ABF0000000000000000B6C41DBD26BA1340234384A60FF3454000000000A0600ABF000000000000000086C5A73F0FBA1340B03A9B4136F3454000000000A0600ABF0000000000000000510C8EB9F3B913408F0453A35DF3454000000000E0600ABF0000000000000000F1B433244DB91340171906E178F345400000000020610ABF000000000000000095F1E6C51BB913405602B27289F345400000000060610ABF00000000000000005F9409A96CB81340DC5C3324A2F345400000000080610ABF0000000000000000D2570A92FDB713408EC409E7C5F3454000000000C0610ABF0000000000000000AADD936DFEB71340CC523312ECF345400000000020620ABF0000000000000000CC407FFA64B813401AF147AC0BF445400000000040620ABF00000000000000005D5D16E959B913402A9D02F533F4454000000000C0620ABF0000000000000000EF49106B4CBA134099ABD73F53F4454000000000E0620ABF0000000000000000BF71DACE04BB134009B3720B70F445400000000040630ABF00000000000000005282C1CCE6BB134091CD30A1A0F445400000000060630ABF0000000000000000B26241F03BBC134047144C1CBCF4454000000000C0630ABF0000000000000000EC5D3424D9BC1340BB868AB8DFF4454000000000E0630ABF0000000000000000B98DCDBB18BD13402419E88FF7F445400000000040640ABF0000000000000000595D941857BD1340723B07DD0AF545400000000080640ABF00000000000000001067B92D0BBE1340A7D5565027F5454000000000E0640ABF0000000000000000A511DD3390BE1340BBF4AA583CF5454000000000C0640ABF000000000000000065A340006ABF13405010D3995AF545400000000000650ABF00000000000000004CACE8D13BC013409C31AAB37AF545400000000040650ABF00000000000000004514C12ED3C01340D1DC924E98F545400000000060650ABF0000000000000000BB3DD73871C11340CA366B0BC0F545400000000080650ABF000000000000000073A7DBF480C113408C1BF84DDEF5454000000000C0650ABF0000000000000000460A1FFEA8C1134002B584AEFAF545400000000000660ABF0000000000000000591A3FA6AFC1134068A6CC9115F645400000000080660ABF0000000000000000DF87418E55C11340C161DEDA28F645400000000060660ABF0000000000000000237F1A6A5DC013409776741548F6454000000000C0660ABF0000000000000000035D2FF865BF13402A771EE869F645400000000000670ABF00000000000000002B489D4CC4BE134061FD01CB87F645400000000020670ABF00000000000000000156974603BF1340F74C3554AFF645400000000060670ABF00000000000000004B53442C42BF13403133535CD5F6454000000000E0670ABF0000000000000000B9162DA879BF1340B83B56F1FCF645400000000020680ABF0000000000000000848527AE8DBF1340A7400CCA1DF745400000000060680ABF000000000000000073E3207F9ABF1340EEA9E1F340F745400000000080680ABF000000000000000012796F247ABF1340005497EC64F7454000000000C0680ABF000000000000000070ED217247BF1340C0E8225192F745400000000020690ABF00000000000000006403E6B09FBE1340FA24445DBAF745400000000080690ABF0000000000000000563CF71452BE1340F23C4DABDDF7454000000000A0690ABF0000000000000000CDE060AEA6BD1340ABC7621FF7F7454000000000C0690ABF000000000000000083146EF229BD13406243EA4715F8454000000000206A0ABF00000000000000008B107F8E95BC13408E75A6AF25F8454000000000406A0ABF0000000000000000D4F8FE4767BC1340B625874C33F8454000000000406A0ABF00000000000000007732611D05BB1340AE8674646BF8454000000000A06A0ABF0000000000000000B380D1CCB5B91340A12E77F695F8454000000000006B0ABF0000000000000000BE22BE83A1B513408BC5F8E0D1F8454000000000A06B0ABF0000000000000000D16A924B61B3134086E5C486F9F8454000000000E06B0ABF0000000000000000DD8E504313B11340352AF9E048F9454000000000606C0ABF00000000000000005BD4CA64A6B013400C3857627BF9454000000000C06C0ABF0000000000000000441CBDE96CB0134092A81973E8F9454000000000606D0ABF0000000000000000A0BA1126B6AF1340151F487A3BFA454000000000206E0ABF0000000000000000BE45CC3022AE1340FF5248B57EFA454000000000A06E0ABF0000000000000000C6D05D9DA8AB13405407AD2BDEFA454000000000806F0ABF000000000000000051F01E6551A6134004B01D4264FB45400000000060700ABF00000000000000007182EFB45CA113404E6DDBEBAFFB45400000000040710ABF0000000000000000DA015E5D3A9C1340C0151991CCFB45400000000060710ABF000000000000000017B7B399479913404AA05D66F1FB45400000000080710ABF00000000000000003F8738F889971340DC9A84822CFC45400000000000720ABF000000000000000047219CFCD4971340839B6A43AFFC454000000000E0720ABF0000000000000000790683D6309813403F5A806E21FD454000000000C0730ABF0000000000000000A7FAB156BB9713400BB1F7565FFD45400000000020740ABF000000000000000043F8BB00D49413401F289777D3FD454000000000E0740ABF0000000000000000058CEC7CF89113408A20A76039FE454000000000E0750ABF0000000000000000B1CF288C15911340255E72FD58FE45400000000060760ABF000000000000000091B5B9A8C28C134020BCEF1BD0FE45400000000020770ABF000000000000000093078158118913404463169106FF45400000000080770ABF00000000000000005F7D6694828D1340DC29B25715FF45400000000080770ABF0000000000000000F243B708668E1340ABB11B0B1AFF45400000000080770ABF0000000000000000A1A73522B39113404A0A17992BFF454000000000A0770ABF00000000000000006C050BC7519713406BDD48F97EFF45400000000040780ABF0000000000000000723F7E98F09A1340E356287F090046400000000060790ABF00000000000000000436414D069C134033D0004F0101464000000000607B0ABF00000000000000005CF6CA382C9B134091ACFAAE0802464000000000607D0ABF00000000000000005D613EE5BE971340268314BEB402464000000000A07E0ABF00000000000000000719574A8A951340A44FEF7FB70346400000000040800ABF0000000000000000CD9118C35595134001401B3E8004464000000000C0810ABF0000000000000000B92940E27E981340DABC7CE2F804464000000000C0820ABF0000000000000000544C01D64199134061111BDCF30446400000000000830ABF0000000000000000124034DEFE991340AB3EF197E804464000000000C0820ABF000000000000000055F06EE1619A1340F9776A96DF04464000000000A0820ABF0000000000000000C2D8FD44E29A1340C24B9A22AF0446400000000020820ABF000000000000000049D34AB0A29A13401FF161797C0446400000000000820ABF0000000000000000A0A72103059A134090B698645B04464000000000A0810ABF0000000000000000BE34EB1DAC99134088ABEF384E04464000000000A0810ABF00000000000000004D3C044DE69B1340DCC9C8DF3B0446400000000040810ABF00000000000000005A92A676A39E13401CBE37B92D0446400000000040810ABF00000000000000004ED7135365A313402E200203350446400000000060810ABF0000000000000000E05361F4F2A813405479A5B05504464000000000C0810ABF0000000000000000BA4E7A4971B11340E7626E5E830446400000000000820ABF00000000000000000D6B36D3F5B81340BBC3CD84A70446400000000040820ABF000000000000000072B9472DDBBF134060996B1AD90446400000000080820ABF0000000000000000166AF15EFCC3134099FEFDE2EC04464000000000C0820ABF00000000000000003ACE17F58FC813403C2E48F4040546400000000000830ABF0000000000000000E4A20A1DF6CC13404FE8C6E01B0546400000000040830ABF00000000000000008932DC6B0EC913409FC13D56D90446400000000080820ABF00000000000000001D9D6038C6BE1340ED2D16256004464000000000C0810ABF0000000000000000782C852E73B61340F1684F3E2E0446400000000020810ABF000000000000000076EEC4B426B11340171056EA0D0446400000000040810ABF0000000000000000B3BEBE9B8CB0134003F729F9080446400000000040810ABF0000000000000000B18D69583DAF1340E044BB2CFE03464000000000E0800ABF000000000000000046B9B8D2FAAE1340933BCB4FFB03464000000000E0800ABF0000000000000000DC4CAABC06AF1340C45BC565F903464000000000E0800ABF0000000000000000850FC9C5B4B1134095740E83F50346407147DC11E77D0ABF000000000000000030E46F6787B4134086522760F10346400000000000810ABF0000000000000000830713E6C3B9134024A2FDD6DC03464000000000A0800ABF0000000000000000C1FC7C4EF6BD134088CAFDB6DE03464000000000C0800ABF0000000000000000F9AC012AFCBD13406A5DD54EDE03464032381F8333810ABF000000000000000088E1CBCDD4C21340338DCEE73F0346407147DC11E77D0ABF00000000000000009AFE42DE84CA1340E89651E70D0346407147DC11E77D0ABF0000000000000000A5B24708E3CB1340C53FC3A60E0346407147DC11E77D0ABF0000000000000000271F12E347DD1340E083501D180346407147DC11E77D0ABF0000000000000000814BA883A4E6134087C53669F40146407147DC11E77D0ABF0000000000000000FC6F0C2BCCF313403D5567535A0046407147DC11E77D0ABF000000000000000055D7DEF5FAF613400220A8D6AFFF45407147DC11E77D0ABF0000000000000000E7D2C4647DF713408E61248B94FF45407147DC11E77D0ABF0000000000000000853532E681F71340DCB9147C93FF45402F90C6FC4C780ABF0000000000000000FCC2CA9301F41340F975B69796FF45400000000060780ABF0000000000000000') ), -(53, - 'La Durance de Mallemort au Coulon', +(1000002, + 'SAMPLE - La Durance de Mallemort au Coulon', ST_Force2D('01060000E0E61000000100000001030000C001000000E9020000D0AD4D1038D913406652F4AC98DD45400000000040370ABF00000000000000009F10BD10CAD913404A07FCC8A1DD45400000000080370ABF00000000000000002F9A7FA252DA13407FA1DFF3B7DD454000000000A0370ABF0000000000000000D58660EB6DDA1340EA486B3CD4DD454000000000C0370ABF000000000000000043A3E63C93DB1340AC9C5061ECDD45400000000000380ABF00000000000000007312721DDCDC13402CD495DCF1DD454000000000E0370ABF00000000000000006D32025B75DD134079A0048203DE45400000000040380ABF0000000000000000C9F97C347CDD1340236B59B217DE45400000000020380ABF000000000000000090C5A668F4DD1340F15D9B8727DE45400000000040380ABF0000000000000000E1783E8188DD13409ECC053149DE454000000000C0380ABF00000000000000006674D0C6B8DD13406B5C96BC6ADE45400000000000390ABF00000000000000000FC3487B71DF1340183B8C7B61DE454000000000E0380ABF0000000000000000B61B839E54E113408A9E0F8564DE45400000000000390ABF0000000000000000807B44CAA9E213409C427D6154DE454000000000A0380ABF0000000000000000D3F38F416DE31340754638F053DE454000000000C0380ABF0000000000000000F0834B0BB7E413404DA1C9EE4ADE454000000000E0380ABF00000000000000000AE53056FEE61340CEC858D53ADE454000000000A0380ABF000000000000000093424552EEE613409D7CB3A862DE454000000000E0380ABF0000000000000000D612C0C570E81340AD2AB620B2DE45400000000080390ABF00000000000000008613A4007DE81340048E7F741ADF454000000000203A0ABF00000000000000005A848CE964EB13406A88B58A31DF454000000000803A0ABF0000000000000000637D1D300FED13408A2C711C3EDF454000000000A03A0ABF00000000000000009B14025517EE13400A6A2D3D3BDF454000000000403A0ABF00000000000000009B64B5060FF01340F99988D734DF454000000000603A0ABF00000000000000004B3EC9968DF11340C9E8BCFC39DF454000000000603A0ABF0000000000000000444041E179F213402FADFB3249DF454000000000803A0ABF0000000000000000F5BDF91536F3134007BD2F915EDF454000000000A03A0ABF000000000000000021CA096B08F41340492BC25A69DF454000000000E03A0ABF00000000000000002F74ECB11AF5134019FE6C796CDF454000000000C03A0ABF000000000000000027D0302901F61340F6F79BB266DF454000000000E03A0ABF0000000000000000E02D1E2200F71340A6EA111960DF454000000000A03A0ABF00000000000000000C66B30741F813407C5346953ADF454000000000603A0ABF000000000000000034ECAC5C3FF91340EF1686B631DF454000000000603A0ABF00000000000000006B09D7CD1BFA134058DD253425DF454000000000203A0ABF00000000000000003FFC54FD63FA1340D70E97C71CDF454000000000203A0ABF00000000000000005F075E27DEFA13408FDB0C0215DF454000000000403A0ABF000000000000000055265C7857FB1340128F3F330ADF454000000000203A0ABF0000000000000000540C731DB7FB134094659E35FDDE454000000000003A0ABF00000000000000001992BEF707FC13400A304488F5DE454000000000E0390ABF000000000000000008837F7C58FC1340FE3C8DD3EDDE454000000000E0390ABF0000000000000000001EFE4104FD13407198E03AE4DE454000000000A0390ABF00000000000000006195447ED4FD1340A5BF7A84D9DE454000000000C0390ABF00000000000000000720431BB1FE1340F5F060AFCDDE45400000000060390ABF00000000000000005AA14AA0F0FF134023A84CBEC1DE45400000000080390ABF0000000000000000CC99AC0003011440CD591852B7DE45400000000080390ABF0000000000000000A7A5A717CC0114406F02D800B6DE45400000000080390ABF000000000000000044304DD04B021440B0F017D6B8DE45400000000080390ABF00000000000000003726ECC48E021440715DF37EBFDE454000000000C0390ABF00000000000000003EF40BED69031440D798A28ECBDE454000000000C0390ABF0000000000000000E47D7B302504144060767143DCDE45400000000080390ABF00000000000000002D1B2920D804144019975E78E6DE454000000000003A0ABF000000000000000087D79C793B051440EFACD9CB03DF454000000000203A0ABF00000000000000007E5BA64763051440CA55C1B01DDF454000000000603A0ABF0000000000000000BA274EFD1C051440A3B2979B39DF454000000000803A0ABF0000000000000000FFFF3F3EFC0414407137242150DF454000000000803A0ABF0000000000000000752172DF7F0614405E6CA0A75BDF454000000000C03A0ABF00000000000000001B62D55A5B071440A9E0401B6BDF454000000000A03A0ABF0000000000000000DEED6B7D2908144047CA1D6179DF454000000000003B0ABF00000000000000000D141F15080914404F384A554EDF454000000000C03A0ABF0000000000000000812BED96D70914409D89A8504ADF454000000000A03A0ABF00000000000000008A052CCBD50A14403A5485514ADF454000000000803A0ABF0000000000000000EDF09073910B1440A5B6792A45DF454000000000A03A0ABF00000000000000004C84DDCB570D144065E0EB4055DF454000000000A03A0ABF00000000000000009B47E6FF6F0E14403CC36F3B6CDF454000000000C03A0ABF00000000000000002BFC4EB23D1014406F1B43407FDF454000000000003B0ABF0000000000000000EF70F1B5BD0F144003527A51B5DF454000000000803B0ABF0000000000000000465AD537330F14405013E338DDDF454000000000C03B0ABF00000000000000003BDDFCD1FF0E1440648F41C4F6DF454000000000E03B0ABF0000000000000000C5EC04FCE80F1440CD2EA80E0DE0454000000000E03B0ABF0000000000000000963D295F85111440BA349C4B26E0454000000000403C0ABF00000000000000009DD92EF498111440E068416A4BE0454000000000603C0ABF00000000000000008818B7A416121440819CE6D95CE0454000000000E03C0ABF0000000000000000EFD2E60B7D1214406F6221E576E0454000000000C03C0ABF00000000000000008377ECDD3F13144046D898F2A0E0454000000000403D0ABF0000000000000000A00C4FBBD013144034818DAFC4E0454000000000803D0ABF0000000000000000469AAD9C47141440EACA2DB3E1E0454000000000A03D0ABF0000000000000000BB52B2D1EC151440B6344247FEE0454000000000E03D0ABF000000000000000011C37EB5F91714404639C01A21E1454000000000403E0ABF0000000000000000C636BB095C1A1440F9DF2B8045E1454000000000403E0ABF00000000000000009979E66EE0191440DB61840A75E1454000000000A03E0ABF0000000000000000ECFEE4982B1914400F7F35CF9CE1454000000000E03E0ABF0000000000000000D3018E6FFD191440C4FEF069BCE1454000000000203F0ABF0000000000000000C061CB1D471A1440CC755E8CCAE1454000000000603F0ABF000000000000000021434BE1881A1440F812D92AD7E1454000000000C03F0ABF000000000000000069BF204CFB1A1440583CD09DEEE1454000000000803F0ABF0000000000000000A2E418FFED1A1440CB81C7C505E2454000000000E03F0ABF000000000000000094C79F1F4D1B1440DC47079129E245400000000000400ABF00000000000000001DB2CE08101D1440FFFD9FE444E245400000000060400ABF00000000000000007410FD27FC1E14409EC1136765E245400000000080400ABF00000000000000005A8DCDC2DD1E1440201C6F728FE245400000000000410ABF00000000000000009DB7A414AE1E144029466BF6B5E245400000000020410ABF000000000000000075E56F953720144033D4034EBDE245400000000020410ABF00000000000000005490D3CA4721144051FDC565CEE245400000000080410ABF0000000000000000927729EC7D221440A262144FF2E2454000000000C0410ABF000000000000000015054FD3F9221440FA43EB801FE345400000000020420ABF0000000000000000038A8B21AF221440385F0BB943E345400000000040420ABF000000000000000070CCDDCE30221440018E069651E345400000000060420ABF00000000000000000B6FC4C067211440032537A96CE345400000000080420ABF0000000000000000C5BD37FF2E241440BE2F4AF0A6E345400000000000430ABF00000000000000007E135E0D9F241440626726C6DCE345400000000060430ABF00000000000000008A6125A35C251440061C7B54F0E345400000000080430ABF00000000000000000AF90FFFF1231440DB3AE1721CE4454000000000E0430ABF0000000000000000376675DFBA221440FA39517D2EE445400000000000440ABF0000000000000000D9FBC27607221440967766913DE445400000000020440ABF0000000000000000EF9E7995AE211440E38C94C155E445400000000020440ABF00000000000000002D7A0A0CB8211440C752390977E4454000000000A0440ABF0000000000000000587CA531FB211440C009C570A0E4454000000000C0440ABF000000000000000066224FC1CF21144024FBFDF3BEE445400000000020450ABF00000000000000005BF117A47C20144050840F80DBE445400000000020450ABF0000000000000000AD423154B01F144047978222EAE445400000000060450ABF0000000000000000E8BD7002E71E1440AB59F62B02E545400000000080450ABF0000000000000000903E2074DC1E1440649338CB19E5454000000000C0450ABF0000000000000000AC4C645C511F14403F510E5736E5454000000000E0450ABF00000000000000006DC4D999CA1F14408A716BC74FE545400000000040460ABF00000000000000001956D55F51201440DCFB20C180E545400000000060460ABF00000000000000003C33CFC45D2014402514A1C19FE545400000000080460ABF00000000000000006796790FAF201440331C22A7D1E545400000000020470ABF000000000000000009B0D007592014409897B0F3F3E545400000000080470ABF00000000000000003DE7BE801D2014405A9241A916E645400000000080470ABF00000000000000008942A3C09A21144073A080963BE645400000000000480ABF00000000000000004A00BA530322144055B053BF4CE6454000000000E0470ABF0000000000000000B1123838D222144004670FD05CE645400000000020480ABF000000000000000082A34FEB8C2314403FD0C2BE6BE645400000000040480ABF00000000000000007B55D4A96F2214405FA36ECB9FE6454000000000A0480ABF0000000000000000101F739821211440DD08A9BDB1E6454000000000E0480ABF0000000000000000617DB5238B221440AD58E18DD2E645400000000000490ABF00000000000000009B377F900623144097A9A1F1E6E645400000000040490ABF00000000000000003EF6ED48A82214404D008D070AE745400000000060490ABF0000000000000000010A3A0AD92414404A5E21C21FE7454000000000C0490ABF0000000000000000A64D592C902514402054E1182AE7454000000000A0490ABF0000000000000000BD53AA988B27144056AB234549E7454000000000E0490ABF00000000000000001A1BA138622714402B471B2558E7454000000000204A0ABF00000000000000000C87EF19FC261440234E27AE77E7454000000000404A0ABF00000000000000003216EDF022261440CECFE32E9FE7454000000000A04A0ABF0000000000000000E6FE638272251440E9B5EE8EC5E7454000000000E04A0ABF000000000000000037EBC648C024144085C5A03BE2E7454000000000004B0ABF000000000000000090A9C3E92A2414404B7D488CFFE7454000000000604B0ABF0000000000000000F9E5B9A890231440AB62E1C01BE8454000000000604B0ABF0000000000000000717278AA32231440E24C9D2732E8454000000000A04B0ABF00000000000000000ADABF7A7B2214407AF7613043E8454000000000E04B0ABF0000000000000000102A09135D211440EBFF3B0568E8454000000000E04B0ABF0000000000000000B3DC2BCB2A201440DB72D9328FE8454000000000404C0ABF000000000000000083F70FD9761F144097D97592B2E8454000000000A04C0ABF0000000000000000D62F534EA91E14404DABA734D4E8454000000000E04C0ABF000000000000000013220C92431D1440CDF8E9E5F5E8454000000000204D0ABF000000000000000040025A0E091C14405D5A4ABE13E9454000000000404D0ABF00000000000000003C8F4BD5981A1440BDD044103BE9454000000000C04D0ABF0000000000000000D5E06B40D1181440B83AAE1B60E9454000000000E04D0ABF00000000000000008B12EA7BFC1614407F17482D79E9454000000000004E0ABF000000000000000078AF907F11151440AEE1EF7C8DE9454000000000604E0ABF0000000000000000D085AF97011314405859A736AEE9454000000000804E0ABF00000000000000009D2C8E4158111440E7679DEDC1E9454000000000A04E0ABF0000000000000000D9BFDAD02C0F14408A3E1948DBE9454000000000004F0ABF00000000000000005F9B909B1B0D1440046D6C8DF7E9454000000000004F0ABF00000000000000000F22F2F0820B144045F561B30CEA454000000000404F0ABF0000000000000000409682EE7309144046079A912EEA454000000000604F0ABF00000000000000006962EAFC1D081440878F1C9844EA454000000000C04F0ABF0000000000000000840C7A9C7A0614406DFF4DA95EEA45400000000000500ABF0000000000000000A3AB450D26041440261F7D9A82EA45400000000020500ABF0000000000000000F5380B27DC0214408C3CB8FAA1EA45400000000060500ABF000000000000000049D490E78200144000DD2FEDCEEA454000000000A0500ABF00000000000000008AF5C0C614FF1340FF732CBFF1EA454000000000C0500ABF000000000000000045D6874E22FE1340CE46787D0AEB45400000000040510ABF00000000000000001613CF7ABDFC1340C5850A2D2FEB45400000000080510ABF00000000000000009D9307B73EFB13407F28781752EB45400000000080510ABF000000000000000009A7FDD270FA134076CE32A767EB45400000000000520ABF0000000000000000D6CC19304EF913401CE83EA98DEB45400000000000520ABF0000000000000000267C1862E7F7134098065A75B9EB454000000000A0520ABF0000000000000000E435332707F7134074D7B158E0EB454000000000C0520ABF000000000000000096DB0F3DF4F51340C8D1706604EC45400000000000530ABF0000000000000000A14695F7DEF41340D0EA927137EC45400000000060530ABF0000000000000000BE13B646FEF3134034812A5467EC45400000000080530ABF0000000000000000835D57E11BF313405DB9AC7893EC45400000000060540ABF00000000000000004B8FFB0A2CF21340C5A3700CBDEC45400000000060540ABF00000000000000001EEDFDB42DF1134008B6EF41E0EC45400000000080540ABF0000000000000000BB074C8048F01340CCA60DA811ED45400000000000550ABF0000000000000000557BADD997F0134010FDBB6551ED454000000000A0550ABF00000000000000000D4711C2BBF113400763D43571ED45400000000080550ABF0000000000000000E1EE806E83F21340301BA3A486ED454000000000E0550ABF0000000000000000FEEA5C90DBF313403E2905647CED454000000000C0550ABF0000000000000000207CE8AD99F61340F106759C5BED454000000000A0550ABF000000000000000006E5B8F4A0F91340B5F473CC22ED45400000000000550ABF0000000000000000A269F146BFFB134073E7645D11ED45400000000000550ABF0000000000000000567FF1DF73FD13408DAC80E3F9EC454000000000E0540ABF0000000000000000751F344F1EFF13408BCCEB98DDEC454000000000C0540ABF00000000000000002E7D0FE0B30014405C54615AC1EC45400000000060540ABF0000000000000000A92780E9F50214401867211D97EC45400000000000540ABF00000000000000002DF142173804144096A3B54182EC45400000000000540ABF000000000000000036BDE1E99506144021AD2DFA6AEC454000000000C0530ABF0000000000000000263CCFD4AC0814406AB75F0F52EC45400000000080530ABF00000000000000004921F323390A14407AFD63B53DEC45400000000080530ABF0000000000000000197ECB902E0B14405327D9EF32EC45400000000020530ABF00000000000000008AB886271213144016F7276902EC454000000000E0520ABF00000000000000005CA685B4A81414405C9FA2E9F7EB454000000000E0520ABF0000000000000000BA2EFF0FA81514406FD675C7DEEB454000000000E0520ABF0000000000000000A71DD4358B161440F615AB49F4EB454000000000E0520ABF0000000000000000AFFABB3AB017144087A2A9AD1FEC45400000000040530ABF00000000000000001CC2B2303A19144062556A2D29EC45400000000040530ABF00000000000000006F2FCA0EFC1A1440CCE7C22914EC45400000000020530ABF00000000000000001B3551AA091C14408A8F06E0BDEB45400000000080520ABF0000000000000000D2F95BC12F1E1440D3F8AEA674EB454000000000C0510ABF0000000000000000C48C2C9C7B1F144079D89DCC76EB45400000000000520ABF000000000000000028514B03251F144089CE25B5A9EB45400000000040520ABF000000000000000081E54416E8221440893F0038D6EB454000000000C0520ABF0000000000000000627B872F102514404BB16BFBA9EB45400000000080520ABF0000000000000000748EDEDE5A27144079EA0633A8EB45400000000080520ABF00000000000000007645590A3B291440A9E69FE5AFEB45400000000040520ABF0000000000000000CE589B376E2B144053BF40D5B4EB45400000000040520ABF0000000000000000E3A559651C2D1440A16E6B92B7EB45400000000080520ABF0000000000000000B2177E9E192F14402BD79ECDBAEB45400000000060520ABF00000000000000002F8975955A311440B9D20F73C3EB454000000000A0520ABF0000000000000000B8F5E95945341440F872321DCEEB45400000000040520ABF0000000000000000C2585AE90E36144074BB5D64CDEB45400000000080520ABF00000000000000001A0C93CAA9371440E1FCFCF0C7EB45400000000080520ABF0000000000000000B42971D3CD391440788ABA52BBEB45400000000080520ABF0000000000000000E19CC8BF0D3C14404F130E13ADEB45400000000080520ABF000000000000000000FB0B70A83D1440AA0839D39CEB45400000000020520ABF00000000000000003124F922683F1440743CC50483EB45400000000020520ABF000000000000000012860DC7D94114405CAAA9446BEB454000000000C0510ABF0000000000000000CEB71A665044144001E0370255EB454000000000C0510ABF0000000000000000DEC5859537461440C852EFF83FEB45400000000080510ABF00000000000000003BE5CDAC6448144009FE98722BEB45400000000060510ABF000000000000000069FD67AE864A14401A26E63810EB45400000000020510ABF00000000000000007700204EFA4A1440673288580BEB45400000000020510ABF0000000000000000636682D6384C1440A76519EFFDEA45400000000020510ABF000000000000000035547B83C04D14405B931DB2EEEA45400000000000510ABF0000000000000000A08301B2304E14403BF91C54EAEA454000000000E0500ABF00000000000000001A97F6BE6B501440E6C4370ACFEA45400000000080500ABF000000000000000026C7340F295214404C2128BEB9EA45400000000060500ABF0000000000000000324179906A521440E60AF34FB6EA45400000000060500ABF00000000000000002015AABE9853144039EAB093A6EA45400000000060500ABF0000000000000000C2C0B8C6B85414404A8011A598EA45400000000020500ABF0000000000000000BD40EDC7DC541440CA662DE896EA45400000000040500ABF0000000000000000791082DF9356144091298D047CEA45400000000020500ABF0000000000000000D955B9ABDC571440D588784165EA454000000000E04F0ABF000000000000000054F6C9FD335914401691DB7048EA454000000000A04F0ABF00000000000000008A1492DC725A1440ABDF8AA72BEA454000000000604F0ABF0000000000000000F2DA50806B5B14408FB8F4A010EA454000000000204F0ABF00000000000000005A3FC4ED545C1440391DAF15EDE9454000000000204F0ABF0000000000000000008DF69D535D1440AF8C54EFCAE9454000000000A04E0ABF0000000000000000FD4C133FA05E14409032FD48ACE9454000000000A04E0ABF00000000000000009E555CB4575F144083003A2C8FE9454000000000204E0ABF0000000000000000B7681B348B60144011C790406EE9454000000000004E0ABF000000000000000055914E6EF0601440DCF1DC133FE9454000000000804D0ABF00000000000000008F95ACFD2762144019FFE1112CE9454000000000404D0ABF00000000000000000ED5AF1644631440542C50591EE9454000000000804D0ABF00000000000000009C86CE5D6C651440A8841B652EE9454000000000804D0ABF00000000000000002BD3BB6C7A681440CB71DA2C3CE9454000000000A04D0ABF000000000000000073A28346A069144060CF30662EE9454000000000C04D0ABF0000000000000000184F8FFBA06A1440B8498C1B25E9454000000000804D0ABF000000000000000049FBC916FC6B1440E6EFC07D29E9454000000000804D0ABF0000000000000000784DB05C686D14406D740BDF26E9454000000000C04D0ABF0000000000000000658DB95C626E1440BBD8F70128E9454000000000804D0ABF0000000000000000FD17745CE96E14402498BB754AE9454000000000E04D0ABF0000000000000000B5C8E7F1156F1440CF9619355FE9454000000000C04D0ABF00000000000000009C5B40E0B970144067E932AC75E9454000000000004E0ABF0000000000000000A16A63193F7214403BA030F281E9454000000000404E0ABF0000000000000000DD2EBC928573144029E6940687E9454000000000404E0ABF000000000000000033FB87DC3E751440B8469464A2E9454000000000604E0ABF00000000000000000950B48E6F761440EBE4038DA6E9454000000000404E0ABF0000000000000000092651C0327814408F5B6EB09AE9454000000000404E0ABF0000000000000000A29FB2BEF97914400218CA8E9AE9454000000000204E0ABF0000000000000000DD031667DC7B1440738096BBB5E9454000000000C04E0ABF0000000000000000E95E2C3EEE7D14407EABE429D7E9454000000000E04E0ABF0000000000000000721FB58E418014402AFF8AB4F0E9454000000000004F0ABF0000000000000000D8D8461346811440996BDF4300EA454000000000204F0ABF0000000000000000C3AF7050718314408BF71C8DE8E9454000000000A04E0ABF0000000000000000BB4F7CB550851440FE60E1D8EFE9454000000000E04E0ABF0000000000000000EAEE76BF158714401D69129DD7E9454000000000C04E0ABF0000000000000000E31EA78145891440B4D10FC2B2E9454000000000804E0ABF0000000000000000A6B9B15D178B1440694FDC26A9E9454000000000604E0ABF00000000000000004390C2121A8C1440CD9507087BE9454000000000204E0ABF00000000000000009EBA48D80C8D14408EE326404FE9454000000000C04D0ABF0000000000000000FD5DBA4C368F1440535BAB9415E9454000000000A04D0ABF00000000000000004908B366C58F1440F7BCF077EEE8454000000000004D0ABF0000000000000000E7105626C49114404FA304D7B3E8454000000000A04C0ABF000000000000000080894E72539214404E3789B590E8454000000000404C0ABF00000000000000008ED7B26A0C9114406DE45B9E6FE8454000000000204C0ABF0000000000000000C51118FC5F9114409A9C4AAC45E8454000000000C04B0ABF0000000000000000D5478F38F7911440CE53F600FEE7454000000000404B0ABF00000000000000009EFD0DB1C5931440A4C2E83DE6E7454000000000004B0ABF00000000000000009D61D4727495144028C57E5DDDE7454000000000E04A0ABF00000000000000002822A945FE961440B751DEB0B4E7454000000000A04A0ABF0000000000000000F10846A6759814408AB6BC1594E7454000000000804A0ABF000000000000000056F835B892991440CF119ECB6BE7454000000000004A0ABF000000000000000095AB6197449A1440F85ED60F57E7454000000000004A0ABF00000000000000002F88B274EC9A14409136F1FB46E7454000000000E0490ABF000000000000000051CA7618439B14407E8CFA7827E7454000000000A0490ABF0000000000000000B8B091684E9B1440BBDB3DF209E745400000000040490ABF0000000000000000D84F6C4DC99C1440CAAFD46EF8E645400000000060490ABF0000000000000000282F6B342E9E1440E31D3D520DE745400000000060490ABF0000000000000000ABB40EBA2EA0144054B2BB1719E7454000000000C0490ABF00000000000000006385B9E87FA1144001F3C0492CE7454000000000C0490ABF0000000000000000C1B0C64A23A31440246937CD32E7454000000000E0490ABF000000000000000031E1BECA80A4144021F664F63AE7454000000000E0490ABF00000000000000003EDAB472C7A51440D0D7294F47E7454000000000204A0ABF000000000000000034C33F119EA714402E2B50F93EE7454000000000C0490ABF0000000000000000917B131F94A91440782C014947E7454000000000E0490ABF0000000000000000A46A7231C5AA1440BF8F491D50E7454000000000E0490ABF00000000000000001A0CD80197AC1440EAF7A7D644E7454000000000004A0ABF000000000000000040B6557ACBAD144023B8574933E7454000000000A0490ABF000000000000000071A592208DAF14402E95BAD42DE7454000000000E0490ABF0000000000000000BCE83FD035B11440A1AE179734E7454000000000C0490ABF000000000000000053EB19A13AB31440F4FC301F3CE7454000000000004A0ABF000000000000000039DCC3A850B41440822608632DE7454000000000C0490ABF0000000000000000C42018EF56B61440FA857ACB0CE745400000000080490ABF000000000000000036B460ECFDB71440D033CFCF1AE745400000000080490ABF0000000000000000CBBD272F00BA1440C286B74E1FE7454000000000A0490ABF00000000000000007522FAABAFBB14404DA4425F1DE7454000000000C0490ABF0000000000000000882A5D1121BD1440AECA7AED0BE745400000000080490ABF00000000000000000F60C17280BE144071CDDF90DFE645400000000040490ABF00000000000000001B4D0E9BA3BF1440F4F27BDDCAE6454000000000E0480ABF0000000000000000E3E32537BAC11440CBC9BFEFBFE645400000000020490ABF00000000000000001D4E8EA010C21440E9E46D4EA1E6454000000000A0480ABF00000000000000002796CAAA97C214401339841C64E645400000000060480ABF00000000000000002E3C0F10A1C314406EFB890059E645400000000000480ABF00000000000000005833C58B6FC41440AF917F194EE645400000000040480ABF000000000000000035647CCE5BC514409067CC6D51E645400000000020480ABF00000000000000005E81C74C32C61440E38E5FB650E645400000000040480ABF000000000000000056C6CF0D06C71440B20BB0DE54E645400000000060480ABF0000000000000000C226269A61C81440E24A062F4EE645400000000020480ABF00000000000000005F4E446FBAC81440D7539E7A36E6454000000000E0470ABF000000000000000074A1A2A675C9144081797F3A27E6454000000000E0470ABF00000000000000005DBF768464CA144073964D2523E645400000000080470ABF0000000000000000E52D7B4D2BCC1440904A3FE20EE6454000000000A0470ABF0000000000000000F297909641CD1440C0917E090FE645400000000060470ABF0000000000000000DD642C2FA3CE1440173C34B215E6454000000000A0470ABF0000000000000000475D5C6806D11440C288911E1DE6454000000000A0470ABF000000000000000098D8021B21D2144036EA9FE20BE645400000000080470ABF0000000000000000C9F57D345FD31440504EB46A0FE645400000000080470ABF00000000000000002A1E7392AFD4144064709CE423E6454000000000E0470ABF000000000000000014C997A9BFD51440D73B9B8F2EE6454000000000C0470ABF000000000000000015C940E31FD71440C34851543CE645400000000000480ABF00000000000000003CD22E025ADF1440C0814D250BE645400000000080470ABF000000000000000049C9FBB32ADF1440D04CD597EEE545400000000060470ABF000000000000000025F34CC382DE144003AC66F1C0E545400000000020470ABF000000000000000089732F67F2DD1440869B7545A0E5454000000000C0460ABF0000000000000000A6B1FAA9A6DD144061F67E8085E545400000000080460ABF0000000000000000074093FA2FDD14407508E19E79E5454000000000A0460ABF0000000000000000BF32D754D6DB14409FDAB9A479E545400000000060460ABF00000000000000002E426AB565DA144098A0858A6DE545400000000080460ABF0000000000000000AE9A8B16D4D81440BE8FC17B54E545400000000040460ABF00000000000000004126C66B20D7144042D7C18C48E545400000000020460ABF00000000000000003B929E253FD61440B86EFC4F3AE545400000000020460ABF00000000000000001D76B069A0D51440F64990392AE545400000000000460ABF000000000000000007D5CDEDA2D5144005D7CDBC12E5454000000000A0450ABF0000000000000000C586507A2AD614404895A86EF7E445400000000040450ABF00000000000000000646AF89F4D6144040D6C837DAE445400000000040450ABF000000000000000062E11F51E3D6144099CCD711C1E445400000000040450ABF0000000000000000DEEC211F8DD614403A5C4A07A5E4454000000000E0440ABF00000000000000008353AB4B52D614406DA9DC9180E4454000000000A0440ABF00000000000000006C80F51D01D614404827C0C561E445400000000020440ABF0000000000000000587A418550D714407D2770444AE445400000000020440ABF00000000000000007BDEB2C37CD614407C901ED02FE445400000000000440ABF000000000000000014D4F0B589D6144001D6232C01E445400000000080430ABF0000000000000000494E31718CD614402919B9CCDEE345400000000060430ABF000000000000000073BFDEB8FED51440BE72A800BEE345400000000040430ABF0000000000000000C5B05C493AD6144002F8406AA1E345400000000000430ABF0000000000000000CEF5F3C698D61440A66010D07FE3454000000000C0420ABF0000000000000000D4FE724B34D71440BB36B6755BE345400000000060420ABF00000000000000007383B0760CD81440F68392BD3EE345400000000020420ABF0000000000000000B1AFA78959DA14400C1B191C23E3454000000000E0410ABF0000000000000000116BED908FDA1440952039D0F6E2454000000000A0410ABF00000000000000002D2269DE25DA1440DC4BB681D3E245400000000060410ABF00000000000000001CFAFF6055DA14400E4D9582ADE245400000000020410ABF0000000000000000CA1189E9CAD914408C96F40C94E2454000000000C0400ABF0000000000000000FB94BE7F01D81440C06EC7F976E2454000000000C0400ABF0000000000000000ADDBA42E49D614407D723B8B5DE245400000000080400ABF0000000000000000DD48C933B9D514408A37EF784BE245400000000080400ABF0000000000000000C4F7703741D61440A5E15D3125E2454000000000E03F0ABF000000000000000073A38A44B4D6144019C77EC516E2454000000000E03F0ABF0000000000000000896E6FA7EFD6144071920F1702E2454000000000C03F0ABF0000000000000000F92836B33DD7144060EA2CB7D9E1454000000000A03F0ABF0000000000000000B7103B5CBFD614405D027996C3E1454000000000403F0ABF0000000000000000FD2AE3D426D5144030E2D651B7E1454000000000403F0ABF00000000000000004BEA0844B3D31440511F6D12C8E1454000000000203F0ABF00000000000000005DF7D39367D214403D3F7D52A0E1454000000000203F0ABF0000000000000000A5F3DDD84CD114408C6299FA8CE1454000000000E03E0ABF0000000000000000F745AE8129D114407356E61C74E1454000000000A03E0ABF0000000000000000BD6C11CEC7CF14403658440D66E1454000000000A03E0ABF00000000000000003F9D7ABA80CE144026A5678F54E1454000000000803E0ABF0000000000000000F6A8190822CD1440DF4623D248E1454000000000603E0ABF0000000000000000AA6FB017C7CC144004F396AE39E1454000000000203E0ABF00000000000000007D99F57C08CC1440B219AFA82EE1454000000000603E0ABF0000000000000000E507617220CA14405387B0C52FE1454000000000403E0ABF0000000000000000CC44F8BFA8C91440FB2E5C4320E1454000000000003E0ABF0000000000000000301CD9E98CC7144009C9FFB328E1454000000000203E0ABF00000000000000009C9516DE54C514403BF5E58B20E1454000000000003E0ABF0000000000000000F8F5A9D277C41440E254CDA30FE1454000000000003E0ABF00000000000000003D2CF7C8CFC31440C0D99C33F9E0454000000000C03D0ABF00000000000000003AE308D76BC2144065D409A6E3E0454000000000C03D0ABF00000000000000003AAEB59CF9C214408303B7FBBFE0454000000000603D0ABF0000000000000000B4EF33CDDDC11440A2BBC0DCA8E0454000000000203D0ABF000000000000000005AD36F809C114404AF9A52297E0454000000000203D0ABF0000000000000000B157F48039C01440BFA353EB77E0454000000000C03C0ABF0000000000000000E0D86C1F86BF144018E1FE0A59E0454000000000803C0ABF00000000000000009B18331EBDBE1440B887E69037E0454000000000403C0ABF00000000000000005C4F4C6608BE1440E769CE3413E0454000000000203C0ABF00000000000000009DB2F83A59BE144020B5616FF1DF454000000000C03B0ABF0000000000000000FEDE762325C014401840EE1CDFDF454000000000E03B0ABF000000000000000048836815F9C21440466B8E5DC3DF454000000000803B0ABF00000000000000009586810654C5144045D5BF1C99DF454000000000403B0ABF00000000000000006458426A2FC81440E62D89C44FDF454000000000803A0ABF00000000000000005BFD950EE4C814406C74B25814DF454000000000403A0ABF0000000000000000B29F907561C41440E0CDB32014DF454000000000203A0ABF000000000000000022D5DF11E3C314407D7A85BE01DF454000000000E0390ABF0000000000000000C421E52206C414401F2199F392DE45400000000060390ABF00000000000000001AF478554DBF1440CB53864B67DE454000000000E0380ABF00000000000000004802816252BB14403FEBC87B46DE454000000000E0380ABF0000000000000000FD8E8086D7BA1440DFF328340ADE45400000000040380ABF00000000000000008B2282F4BEBA1440F7B9D388F7DD45400000000000380ABF0000000000000000D66E44888CBA144054D36D33F1DD45400000000020380ABF00000000000000005AB7DF27DCB814405B99BA75BFDD454000000000A0370ABF0000000000000000680AC6FF48B914401CDBFDA8ABDD45400000000080370ABF000000000000000083EAA0F13BBA1440950AA3698FDD45400000000020370ABF000000000000000042AC7ED7B1BA1440083C643D68DD45400000000000370ABF00000000000000005D4C6BC8EEBA14402C8A3F9649DD454000000000C0360ABF00000000000000009611ADDB31BC1440B13401DE20DD454000000000A0360ABF00000000000000006844FE546FBC14407A69C6FEF3DC45400000000020360ABF0000000000000000ABFC6016DFBC1440A803825AD2DC454000000000E0350ABF00000000000000007A1C401AF6BC1440EAF2668FA9DC45400000000060350ABF00000000000000004AFACA4211BD1440B4F2518A91DC45400000000060350ABF0000000000000000F207A57D49BD144037CF68DA58DC45400000000020350ABF0000000000000000B2266B7482BD1440DD72DFA133DC454000000000C0340ABF0000000000000000A200DCC581BD1440C9EF4E3B0EDC45400000000060340ABF0000000000000000CC85F6C07ABD1440CE006E34D6DB45400000000000340ABF0000000000000000A71C334480BD144058A8A0E5C1DB45400000000000340ABF0000000000000000762C7ED775BD14401A2B5C03A4DB454000000000A0330ABF0000000000000000416E9DE95CBD1440F775832D80DB45400000000080330ABF0000000000000000D3D7972616BD1440A55EA8C871DB45400000000020330ABF00000000000000004D679F4FFABC14406108B5CC4ADB45400000000000330ABF000000000000000000A71760E9BC14405EE7148D37DB454000000000E0320ABF0000000000000000E1786CF6DFBC1440611C14E81BDB45400000000080320ABF0000000000000000EB6A7E97DDBC14402999DE06F2DA45400000000040320ABF0000000000000000D951C948C0BC144098CD5369D9DA45400000000020320ABF0000000000000000C76CC6F0C5BC1440E37236B6B7DA454000000000C0310ABF00000000000000004AE7B51E69BD14404B40811493DA45400000000080310ABF00000000000000001B1DC91696BF14403CB4B1C569DA45400000000060310ABF0000000000000000F560A608ADC21440C78B68EB30DA454000000000C0300ABF0000000000000000748ECE203BC414409AE7B9D5FED945400000000060300ABF00000000000000004CEAED68BCC414402249C0F6C5D9454000000000C02F0ABF00000000000000003A94CD7ECAC31440F8BE7CD69DD9454000000000A02F0ABF0000000000000000BA4F92B86AC21440BD2FCFC094D9454000000000E02F0ABF00000000000000009A01CD1EC7C114404D5DFE715DD9454000000000402F0ABF00000000000000008E020D458BBF1440D16E24BD55D9454000000000002F0ABF0000000000000000690A6E8667BD1440814E274260D9454000000000602F0ABF0000000000000000D7FE2F4333BC144099FFC2556ED9454000000000402F0ABF0000000000000000231882C0CABB1440DB9A260B8FD9454000000000A02F0ABF0000000000000000D10FAE95CBBA1440302520D093D9454000000000A02F0ABF000000000000000018985E6936BA14400E586AB98CD9454000000000402F0ABF000000000000000047D88E4931B91440CD1B5D1380D9454000000000A02F0ABF0000000000000000EE3CCBAA63B814409BED151D74D9454000000000402F0ABF0000000000000000F37114FEB7B714405DAC26EC5ED9454000000000402F0ABF0000000000000000E75198A4F4B61440F16A07374ED9454000000000002F0ABF00000000000000002BAF426565B6144072D8B6A33CD9454000000000002F0ABF00000000000000008F4F58CB7AB51440A26B97732FD9454000000000C02E0ABF0000000000000000203B2CB395B41440EF5B898727D9454000000000802E0ABF0000000000000000B70C8CF0B4B3144015BF43F31FD9454000000000002F0ABF000000000000000093C6D197D3B214406133195D15D9454000000000C02E0ABF0000000000000000A0C83D03C2B1144057EA32CB0FD9454000000000C02E0ABF0000000000000000E68EFA5EDAB0144093225C3D0BD9454000000000A02E0ABF0000000000000000D14BF75BD1AF1440D3B9FF0706D9454000000000802E0ABF00000000000000007C23552CBAAE14406F4277B307D9454000000000802E0ABF0000000000000000BCD03D68A5AD1440BA62FA6703D9454000000000A02E0ABF0000000000000000A0A0C0B0ACAC144043B5CE8401D9454000000000602E0ABF00000000000000005B79114286AB1440707E18F2FDD8454000000000602E0ABF000000000000000046F4CDF795AA1440B0ACAEBBF8D8454000000000802E0ABF0000000000000000C3C514FF9BA9144097E963B0F2D8454000000000402E0ABF00000000000000002003553067A814407F209DE2EED8454000000000602E0ABF00000000000000004FB0DFB0CBA71440BC92E6E4F0D8454000000000202E0ABF0000000000000000E719C00B4EA71440350969AEF2D8454000000000A02E0ABF00000000000000002150647566A61440FE6A4ABBF4D8454000000000A02E0ABF00000000000000004C2ADEF875A514404C47CA87C0D8454000000000202E0ABF0000000000000000839A2CDF0BA51440D37A1FC89DD8454000000000002E0ABF000000000000000072A49DB03BA41440431629368AD8454000000000E02D0ABF00000000000000007FD55DAFA1A31440D2044B6D79D8454000000000A02D0ABF00000000000000005BD388E190A21440D9076D955ED8454000000000202D0ABF00000000000000001261B4D4DAA114404F43C01055D8454000000000202D0ABF0000000000000000A0491257F5A01440FDA74D4446D8454000000000002D0ABF0000000000000000C4ADE00110A0144031AE740F39D8454000000000002D0ABF0000000000000000CE25DEB0B99E14401AB5B0C330D8454000000000002D0ABF00000000000000004CA3CFA3949D1440D0DA8BBA32D8454000000000202D0ABF000000000000000030C9D490749C144027CEFD2F37D8454000000000202D0ABF00000000000000005C38B3409E9B144032DBA7763BD8454000000000202D0ABF0000000000000000C98AB97C9C9A1440DED1A83B41D8454000000000402D0ABF0000000000000000377CFD19AB9914409BC1E12844D8454000000000202D0ABF00000000000000004520C6D038981440D101BD564FD8454000000000402D0ABF000000000000000005E8DB534E971440AFBD01C462D8454000000000602D0ABF0000000000000000A95E3ED28B96144065B8AD636CD8454000000000802D0ABF00000000000000005DEBA99CFF951440C0E874D073D8454000000000802D0ABF0000000000000000CFE0B9621A95144034917F826ED8454000000000802D0ABF000000000000000023AD617D96941440A5F5FFD053D8454000000000402D0ABF00000000000000004F4276C8EE93144014D7C1B85BD8454000000000402D0ABF000000000000000026A43986E49214405E95F3F65BD8454000000000602D0ABF0000000000000000086EFA8D18911440AB9763BB77D8454000000000602D0ABF00000000000000007B30C2B4599014401EE94D657ED8454000000000802D0ABF00000000000000009BF78627A28F14408BB67F3E8ED8454000000000E02D0ABF00000000000000006C5A9EE3918E14400EE917E298D8454000000000C02D0ABF0000000000000000ECE1FD04DC8D1440B79B0E249FD8454000000000C02D0ABF000000000000000026BC70CEEB8C1440C32B3251A9D8454000000000E02D0ABF0000000000000000527B1C75E38B144026E5DCB6B8D8454000000000E02D0ABF0000000000000000502D4228428A1440704D0FF6C9D8454000000000402E0ABF0000000000000000921A10C7988814403C68FBC4DFD8454000000000402E0ABF000000000000000090CFB8CF05881440954B6C7ECFD8454000000000202E0ABF0000000000000000D23248DEC287144096CA51EDC6D8454000000000002E0ABF0000000000000000B04C036D55871440EDC6B955BAD8454000000000202E0ABF000000000000000047070BDEEA8614408DB83C0AA7D8454000000000002E0ABF0000000000000000A94733FC1A8714400CC30C1090D8454000000000C02D0ABF00000000000000005BAC4B6EA58614408CD13CCB86D8454000000000802D0ABF0000000000000000C4FAC9F9A2851440A42C249681D8454000000000A02D0ABF0000000000000000D9C19CAAFE8414400655015E76D8454000000000802D0ABF0000000000000000BA9FFAA9FA831440F7799A3186D8454000000000802D0ABF000000000000000023525566F982144003C4E418A9D8454000000000002E0ABF0000000000000000A05B0EA48581144085DE69738CD8454000000000A02D0ABF00000000000000006C1D4830838014405FD3EF3D87D8454000000000A02D0ABF0000000000000000FB6666C7017F1440EE06C0D078D8454000000000802D0ABF000000000000000097492067407D1440270D86267BD8454000000000602D0ABF0000000000000000B070A177317C1440B444239E6BD8454000000000C02D0ABF000000000000000018AA325DFA7A14408FF92F446FD8454000000000802D0ABF0000000000000000A9EFAC066C771440C4EE22095BD8454000000000402D0ABF000000000000000063BE5880397814404567DFC685D8454000000000A02D0ABF00000000000000000B86123121781440B7F2F770A0D8454000000000E02D0ABF0000000000000000FC4179B79B761440AF7DE16FB2D8454000000000E02D0ABF0000000000000000349852988D791440273D2949E6D8454000000000602E0ABF000000000000000014B1AB0AF5791440DA9227F10DD9454000000000802E0ABF0000000000000000314827819A791440F4861DBE5DD9454000000000402F0ABF0000000000000000085F246EBC781440E83CFCD667D9454000000000202F0ABF00000000000000002A138F1F9C771440B5C5A2A26AD9454000000000602F0ABF000000000000000020986C06727714409F9A0C7478D9454000000000602F0ABF00000000000000002E890342CF761440ECD704C180D9454000000000802F0ABF0000000000000000E5A9FCAE0C761440DF6946F97AD9454000000000802F0ABF0000000000000000B4B8B173707514401028F7286BD9454000000000402F0ABF000000000000000042487DCBDD7414400FFA96576CD9454000000000402F0ABF0000000000000000AA778462A77314403FDF5C7E72D9454000000000602F0ABF00000000000000007F974A05D7721440311E83208BD9454000000000802F0ABF0000000000000000B73B60200072144062FB7F888CD9454000000000802F0ABF0000000000000000D25BAC024871144068C4F2538BD9454000000000A02F0ABF00000000000000000042DBAE36701440366888A092D9454000000000C02F0ABF0000000000000000848BE0A5696F1440FF401DB297D9454000000000A02F0ABF00000000000000005E25A0FDC76E1440AFFE615794D9454000000000A02F0ABF000000000000000002ED70BCEC6D144071CE439E98D9454000000000A02F0ABF0000000000000000C9BE2BB9256D1440CAA0A4AFA2D9454000000000C02F0ABF000000000000000005B93768376C1440EC10AE16A4D9454000000000C02F0ABF0000000000000000FD629962AD6B1440F2CC1C3394D9454000000000C02F0ABF00000000000000002D3E5F5BBC6A1440C2D087DC9BD945400000000000300ABF00000000000000008C27E222D26914404A216B348CD9454000000000A02F0ABF0000000000000000C80EC255B26814409FFAC53F81D9454000000000A02F0ABF00000000000000003B1CF8271F6814408830EC2C90D9454000000000A02F0ABF0000000000000000C2F329FEEC6614400A488BDAA4D9454000000000A02F0ABF0000000000000000100ACD7B1E66144034657EAAB6D9454000000000E02F0ABF000000000000000076BCBA6704651440707F17CCBAD945400000000000300ABF00000000000000000958BE7BFC631440151CA5BCBED945400000000000300ABF00000000000000005D266931786314403DB4F25BC2D945400000000000300ABF0000000000000000CDCBB214E2621440F60F7652C7D9454000000000E02F0ABF0000000000000000C7642037AD621440F5D5BA7FCED945400000000000300ABF0000000000000000B9CE459AF061144074AD0E63CCD945400000000020300ABF0000000000000000936F7F4A8560144046283141D5D945400000000040300ABF00000000000000009D218CDEB05F1440D1B4AD7AD8D9454000000000C02F0ABF0000000000000000022D751EE95E144009E5A2E2DDD945400000000040300ABF0000000000000000A8750890495E1440C4B65699E0D945400000000020300ABF000000000000000025531664D75D14407AD851E9E3D945400000000060300ABF0000000000000000842C7906715D1440658D6137E4D945400000000060300ABF0000000000000000DA79EF76315D14406CF1E5BFE3D945400000000060300ABF00000000000000002C9555DD015D14407E14CD5CE3D945400000000060300ABF0000000000000000798FE4FF575C144041B7AFD9E0D945400000000040300ABF0000000000000000D776220DD05B14407C8DCBC2DFD945400000000040300ABF000000000000000002637DD2155B1440AC0394C8DBD945400000000020300ABF0000000000000000628C7EF8735A14408F295ABFD7D945400000000020300ABF000000000000000041251EADC9591440488EE5A3D2D945400000000000300ABF0000000000000000B3839F99DC5814406DAC6948CED945400000000000300ABF000000000000000094BDF31D6258144040B1F0A1CDD945400000000040300ABF00000000000000004756D3259A5714404B58D64CD2D945400000000000300ABF0000000000000000E620A8C44E571440F415B662DAD945400000000040300ABF0000000000000000EFC1A24C29571440B1DD6C54E5D945400000000020300ABF0000000000000000FC0A080C11571440A50DBE19F2D945400000000060300ABF0000000000000000877655567E56144041E3F5AB01DA45400000000040300ABF00000000000000004EC42019385614403AD09BE60CDA45400000000080300ABF0000000000000000355B16CB4F561440F992AEE717DA454000000000A0300ABF000000000000000036CB0B7246561440BB333C4022DA454000000000C0300ABF0000000000000000A4285A2551561440E168F4122BDA454000000000C0300ABF0000000000000000C62D5A3BFB551440C60210CE29DA454000000000E0300ABF000000000000000022C4D0DC9855144074593F1727DA454000000000C0300ABF000000000000000082024ACE5E551440604F573023DA454000000000E0300ABF0000000000000000D330A3FAFD541440EC8F0F5C18DA454000000000A0300ABF00000000000000001A38D8DE9F541440A36F147409DA45400000000060300ABF00000000000000007BB02ABCE9531440629BA2F50DDA454000000000A0300ABF0000000000000000CA48FB86655314409B8C224415DA454000000000A0300ABF00000000000000006F2FE518C9521440B5D4AFBD0FDA454000000000A0300ABF00000000000000005DDF6DC124521440D88EF4BA08DA454000000000A0300ABF00000000000000004DFCC85CC6511440CB8358D2F8D945400000000080300ABF0000000000000000CB69CEBBF84F1440FA0E6406F4D945400000000080300ABF0000000000000000FEB33BB20F4F1440C843853FF1D945400000000040300ABF0000000000000000327048E2644D1440B08EA8B5C9D945400000000040300ABF0000000000000000842BCE54314E144079DC056C93D9454000000000802F0ABF0000000000000000B11695E3144D14408EE38A9087D9454000000000802F0ABF0000000000000000B38A91E14A4C1440A6D9B4947FD9454000000000A02F0ABF000000000000000089F4E217864A1440F5477A998AD9454000000000802F0ABF00000000000000005C4A8185E048144045344E3D92D9454000000000A02F0ABF00000000000000004E2E4C43164814405393041F99D9454000000000802F0ABF0000000000000000C6A356FDD6461440E829F4DE81D9454000000000802F0ABF000000000000000099DD41C6EF4414406D3792C65DD9454000000000402F0ABF00000000000000002C054F3043441440A330C9B074D9454000000000602F0ABF00000000000000003CCEC771CD4214408939AC6A85D9454000000000A02F0ABF0000000000000000BBA43A58BA411440B7180C5A8CD9454000000000A02F0ABF0000000000000000681F72FCC2401440AB21DE3D90D9454000000000602F0ABF0000000000000000658A422F473F14408F85D7FA8BD9454000000000A02F0ABF0000000000000000519D435F8E3E14404600FFA079D9454000000000802F0ABF000000000000000021CA482B773D1440ECFC5DBE7ED9454000000000802F0ABF0000000000000000B2F9CBB3793C144047CCAEAA89D9454000000000A02F0ABF0000000000000000BDECACEA363B14402C7DC106A2D9454000000000802F0ABF0000000000000000CDC69F485C3A14406289102BA5D9454000000000A02F0ABF00000000000000008005EBA3E3391440A38701509DD9454000000000C02F0ABF0000000000000000D228156BB93914402E51EAFC98D9454000000000A02F0ABF00000000000000000A5939136C3914407CCE2BCCA6D9454000000000E02F0ABF000000000000000016F162BB4639144017937954B2D945400000000000300ABF000000000000000031A2F0CF10391440188DCCE6BDD9454000000000E02F0ABF00000000000000007AA448AA953814406A4C0884C8D945400000000020300ABF0000000000000000C2CECD4AAD3714402A5F8E99D5D945400000000040300ABF00000000000000001525A6D7D2361440EF2E218ADAD945400000000020300ABF000000000000000024ACF9BDD8351440E4816388E2D945400000000060300ABF000000000000000074C937BE5C351440B8B9EF32EAD945400000000040300ABF0000000000000000C86C5B1E05341440E3D07CDBF3D945400000000060300ABF00000000000000002A69065B103214403E5807B410DA45400000000080300ABF0000000000000000D6C2FAFBB930144051B01EC81EDA454000000000A0300ABF0000000000000000CBCFE97FBC2F14405FB3B54B36DA454000000000E0300ABF000000000000000058FCE62EBB2E144089E4DDB242DA454000000000E0300ABF0000000000000000E18E47C3762D1440FEE633CB46DA454000000000E0300ABF000000000000000056BB745F182C14403E61D0D638DA454000000000A0300ABF00000000000000002BAF1C11452B14405C10153449DA454000000000E0300ABF0000000000000000AAAF62BC922A14405218250752DA45400000000000310ABF0000000000000000033A4F378C291440CF8FE63454DA45400000000000310ABF0000000000000000F114D8F509291440CE11B18562DA45400000000040310ABF0000000000000000EFA9399AA02814406CA3AE9B72DA45400000000060310ABF0000000000000000B966563E22281440B1231AEA80DA45400000000080310ABF0000000000000000E778CFCE92271440A36023F190DA45400000000080310ABF00000000000000008F8C8B9F03271440C117A16E9EDA454000000000C0310ABF0000000000000000AC79ADC4BB25144029401D1783DA45400000000080310ABF0000000000000000F4239A73A1251440B23962EB98DA45400000000060310ABF0000000000000000188F5A2D242414409088BB39C4DA454000000000E0310ABF00000000000000007A73E325A2231440539A5CFDDFDA45400000000020320ABF00000000000000007C9822F81E231440FD5AD124F3DA45400000000040320ABF0000000000000000C59CE76394221440738BF2C00FDB45400000000060320ABF0000000000000000E7DD9B90C52114407D6C4C0420DB454000000000A0320ABF000000000000000078FF27750021144082C4BA5541DB454000000000C0320ABF0000000000000000AE42E6CA6B201440E3FCBAA64BDB45400000000020330ABF00000000000000005EF0011C18221440EF07D5DB5FDB45400000000000330ABF0000000000000000279A75DF3D221440AF2C64F867DB45400000000000330ABF0000000000000000EA52E3C6092214407779B0D777DB45400000000020330ABF00000000000000004543F1474421144008C2236294DB454000000000A0330ABF0000000000000000D994B61C8C211440073682A5AFDB454000000000A0330ABF00000000000000002F4B5D3870211440374E1EB7C5DB454000000000C0330ABF000000000000000005E7A68C53211440C3049D2BD2DB454000000000E0330ABF0000000000000000BB1409451E211440602D6C09DFDB45400000000020340ABF00000000000000000E9CB977D5201440C202C230EEDB45400000000020340ABF0000000000000000B5A881A25A2014404603C24EFBDB45400000000020340ABF000000000000000038CE54F9941F1440C91C3FB302DC45400000000040340ABF00000000000000004111086EF01E1440AE43B86A06DC45400000000040340ABF00000000000000001B0E22AC541E14405D260B1721DC454000000000A0340ABF00000000000000008037D4DB601D1440B2FC674D16DC45400000000060340ABF0000000000000000BD7AC952271C1440BA46400C12DC454000000000A0340ABF000000000000000048E81601641B1440D28F47C629DC45400000000080340ABF0000000000000000D4A2F5C0D41A14402693F94E47DC454000000000C0340ABF00000000000000009F64BE7DC8191440A0C26D3252DC45400000000000350ABF00000000000000003160B51AD818144095FDC41F58DC45400000000000350ABF0000000000000000D02056C9CA171440A98B494C5FDC45400000000020350ABF000000000000000083E22EA85C1614400F4EC7FD66DC45400000000000350ABF00000000000000000C8F05B3D214144021263E2F58DC454000000000E0340ABF0000000000000000E29EA5B5B1131440E1B760ED48DC454000000000E0340ABF0000000000000000A14E1C29EE1214409A8BCBF632DC454000000000A0340ABF0000000000000000F5A9E301DC111440262D4F8416DC454000000000A0340ABF00000000000000001AD88D2144111440F1FC476805DC45400000000060340ABF0000000000000000B6F0EECA9110144041279584F8DB45400000000040340ABF0000000000000000D4DC0788830F14400E2557FCEADB45400000000020340ABF0000000000000000EC2646C1810E1440BA0A5447E8DB45400000000040340ABF00000000000000008D1B7B656A0D144064A350C4DADB45400000000000340ABF000000000000000038EC5E40F60B1440D31E3285DFDB45400000000000340ABF00000000000000005EB511EB2E0B144059CBD01FE9DB45400000000020340ABF000000000000000098BB35E2530A1440F24D5E9DEEDB45400000000020340ABF00000000000000005AFD568DA60914402DF50559F2DB45400000000020340ABF000000000000000063E462D7A50814400F057C97F4DB45400000000060340ABF000000000000000046577E60EE071440C2AF37D7F5DB45400000000040340ABF0000000000000000AE5EA2A32507144048835876FADB45400000000020340ABF00000000000000006409159240061440B5B8DEABFCDB45400000000020340ABF00000000000000001788CF584105144071B1DD1103DC45400000000060340ABF00000000000000002AE5B68B800414402CB17F8303DC45400000000040340ABF00000000000000003C2CC980A503144039DBA10009DC45400000000040340ABF000000000000000078EC6486F10214408C2009B816DC454000000000A0340ABF0000000000000000B22EAF613C0214408BDB6C4720DC454000000000C0340ABF00000000000000002F50B5D27701144065A191DF33DC454000000000A0340ABF00000000000000002E3B0301DF0014406ACD7CD83FDC454000000000E0340ABF0000000000000000119F00283C001440E03C968948DC454000000000E0340ABF0000000000000000EBA80D5E6BFF13409E4C152952DC454000000000E0340ABF0000000000000000DD23467F92FE13403598184F5EDC45400000000000350ABF000000000000000017E510FC48FD1340819C4C3963DC45400000000000350ABF0000000000000000CC479D4C7FFC1340813A1F8364DC454000000000E0340ABF00000000000000001ACA03C26DFB134086C81CCE6BDC45400000000000350ABF00000000000000004F153734A0FA134068D8FB1181DC45400000000060350ABF00000000000000005A75FB8BF6F913403A578D1092DC45400000000080350ABF00000000000000001C68C0F34AF91340FD4D44489DDC454000000000A0350ABF0000000000000000B3BB26CA3DF8134093EB1C58B4DC454000000000A0350ABF0000000000000000CCE5C52E6EF61340056F2C0AC6DC454000000000A0350ABF00000000000000000B2F78E045F6134073151912DADC454000000000C0350ABF000000000000000012A995101FF61340CFD555A0EDDC45400000000000360ABF0000000000000000102B0C0D86F51340D01055ADF6DC45400000000060360ABF0000000000000000D787129901F513404BF4442001DD45400000000040360ABF000000000000000094EF9B516DF41340B073A12C0DDD45400000000020360ABF0000000000000000D2E95B18F0F3134029C4875206DD45400000000060360ABF0000000000000000B5A7AD9E26F31340DCFB196F08DD45400000000040360ABF0000000000000000DE218BE4B0F21340C1D060830EDD45400000000040360ABF0000000000000000E90D2B39DEF1134097B8378011DD45400000000040360ABF0000000000000000213D6C5CD4F01340AB273EC213DD45400000000060360ABF0000000000000000E63E2B03D6EF13408BF0EC821DDD45400000000060360ABF0000000000000000DD4CBE12FCEE1340E201C22627DD45400000000080360ABF00000000000000002CDC178744EE1340C300897230DD45400000000080360ABF000000000000000084C2A5FC46ED13407334F7EA34DD454000000000A0360ABF000000000000000033E2942855EC1340C9F7053638DD454000000000A0360ABF0000000000000000704F88864AEB13407C2F643C3BDD454000000000C0360ABF0000000000000000FE10581B35EA1340F60E39CC42DD454000000000A0360ABF0000000000000000182B1B605CE91340BB34DE0F31DD45400000000080360ABF00000000000000002F5C2D4752E81340817BF47D32DD454000000000A0360ABF00000000000000006A03BBB26CE7134052BC540333DD45400000000060360ABF0000000000000000AC0504C63EE613408D364EDB37DD454000000000A0360ABF0000000000000000FC07BFCD47E513401F1E4B933CDD454000000000C0360ABF00000000000000002B515B8781E41340F31BB6534ADD454000000000A0360ABF00000000000000007EF342AD22E4134084F66F2960DD454000000000E0360ABF00000000000000007A5D6B9767E41340B0CB59F973DD454000000000E0360ABF00000000000000008E6E4D9B3CE313405DBFE12D74DD45400000000020370ABF0000000000000000C59537939DE2134022CEB5C47CDD45400000000020370ABF0000000000000000BBC2D147EFE11340E0A2180589DD45400000000020370ABF0000000000000000A967B14748E1134001496A217EDD45400000000020370ABF000000000000000076CAC5D5B3E0134057C7EC157FDD45400000000020370ABF0000000000000000EC65FAC7CCDF1340B58885068CDD45400000000040370ABF00000000000000008CA630F03ADF13407994F2D96BDD45400000000000370ABF0000000000000000AC20E1D770DE1340E79DA61754DD454000000000C0360ABF0000000000000000E0DBA65282DD1340C13C9CDA45DD454000000000C0360ABF000000000000000040C640A99FDC1340BA0EB5154BDD454000000000E0360ABF00000000000000003654B76924DC1340F189EE8A4CDD454000000000C0360ABF0000000000000000383448437DDB1340438B383555DD454000000000E0360ABF0000000000000000AF5EF301E1DA1340EB47712656DD454000000000C0360ABF00000000000000005CC7DE4A22DA1340DF1A571750DD454000000000C0360ABF0000000000000000E9DA2E0CC8D9134008797B3E53DD454000000000C0360ABF0000000000000000CBD8420A92D91340510A0FE263DD454000000000E0360ABF0000000000000000E1519F10B8D91340CD2530E277DD45400000000040370ABF0000000000000000F9717D6296D913400ADFAA748BDD45400000000040370ABF0000000000000000D0AD4D1038D913406652F4AC98DD45400000000040370ABF0000000000000000') ), -(84, - 'Le Coulon du ravin de la Prée au Grand Vallat inclus', +(1000003, + 'SAMPLE - Le Coulon du ravin de la Prée au Grand Vallat inclus', ST_Force2D('01060000E0E61000000100000001030000C00100000081010000645802C2779516408C1B4CB228F3454000000000E0600ABF0000000000000000343C5EC4A094164054C96BB215F3454000000000A0600ABF0000000000000000D133C6F22E941640C2D93793FBF245400000000060600ABF00000000000000005196BDF2519316400206FB55D8F245400000000020600ABF000000000000000032BDEA3C5F921640EC599121C7F245400000000000600ABF00000000000000006727882DFD9116408D339B67A4F2454000000000C05F0ABF0000000000000000F12650D4F29016405D8EA09485F2454000000000A05F0ABF0000000000000000CA23DA39329016405874D82363F2454000000000005F0ABF00000000000000006C3B5EAB708F164028DBA8A323F2454000000000E05E0ABF00000000000000009B513F5F548E164083C241AEEEF1454000000000405E0ABF000000000000000023643E66388D1640837FFA0AD5F1454000000000205E0ABF00000000000000002A451FA9358C1640893822F2B1F1454000000000E05D0ABF0000000000000000CF6405365C8B16400D304A1B98F1454000000000A05D0ABF00000000000000007583E324378A164080F3C6A37DF1454000000000605D0ABF000000000000000006B7797767891640D18B5F7B65F1454000000000405D0ABF0000000000000000AB512E00F1881640C3CA8E0A52F1454000000000205D0ABF0000000000000000F6C328198A881640BC20E3333FF1454000000000205D0ABF0000000000000000F1565052F18616405FF0F04F51F1454000000000E05C0ABF00000000000000008593DF458F8516401EC1554862F1454000000000405D0ABF0000000000000000010ADC043D841640BBD15AF670F1454000000000A05D0ABF00000000000000007B7AAC406282164087E4093579F1454000000000405D0ABF00000000000000009241418EA5811640E1D1576A6EF1454000000000205D0ABF0000000000000000DBE272D6CB801640A08B990661F1454000000000405D0ABF00000000000000006B844ED9377F1640A8A2D15F67F1454000000000805D0ABF0000000000000000ED2684828C7D1640FE5F00747BF1454000000000405D0ABF00000000000000005F19A0DE4D7D1640B493FEC551F1454000000000005D0ABF00000000000000006309FB817F7C1640E704FE2C3CF1454000000000205D0ABF00000000000000006EAF8BB7677B1640B1F0B1C92CF1454000000000E05C0ABF0000000000000000685C2884CA7A1640566B1A2D1CF1454000000000C05C0ABF0000000000000000BACD1785AB791640CF802821F9F0454000000000605C0ABF000000000000000014EF3157A17816407DBBBBFBDCF0454000000000405C0ABF0000000000000000C11DBAF5FC761640B876266BF0F0454000000000405C0ABF000000000000000038BAF23D14751640BB1684CBE8F0454000000000205C0ABF0000000000000000772704660C731640924BA7D8E8F0454000000000205C0ABF0000000000000000F30962B8D1711640CA517A20DCF0454000000000205C0ABF000000000000000019AF68609E7016408DA88824CDF0454000000000405C0ABF000000000000000094165122F26E1640BD0ACBE5B3F0454000000000005C0ABF0000000000000000BB10F279DE6C164071B2385CD8F0454000000000005C0ABF00000000000000008B11D358826A1640A05E595BD6F0454000000000205C0ABF0000000000000000BC8FE8EC1D691640B709378ECAF0454000000000205C0ABF0000000000000000DD8C7D9C3168164024EAF2F2C5F0454000000000205C0ABF000000000000000070FA247128671640AEF4BDE6B8F0454000000000205C0ABF000000000000000089607015AB6416401BC9B6B69FF0454000000000E05B0ABF0000000000000000CC682AA70E6316406386CA18C9F0454000000000405C0ABF000000000000000015356249BD611640186755C0F0F0454000000000805C0ABF00000000000000004296E6C3416116409DA247EA0DF1454000000000805C0ABF0000000000000000315F5A5B505F1640F3B034061DF1454000000000A05C0ABF0000000000000000AA4DE7091F5D164075EF6EEC1DF1454000000000C05C0ABF00000000000000004F503840CB5B1640AD1D4E1112F1454000000000A05C0ABF0000000000000000C9101B0DB35A1640CACF64061FF1454000000000005D0ABF00000000000000003D08BF9059591640469ED9A640F1454000000000E05C0ABF000000000000000055314D7855581640F2ECE75E3AF1454000000000005D0ABF000000000000000014BA2EED6C571640A365121441F1454000000000005D0ABF000000000000000013EC8E06EC5616408381406B50F1454000000000405D0ABF00000000000000002EB45CC7AF541640261E04725EF1454000000000605D0ABF0000000000000000795CA62785521640C026F21367F1454000000000605D0ABF000000000000000046A6C378DB4F1640FAA10BF373F1454000000000805D0ABF000000000000000039F07C34E24C1640C6F85A6614F2454000000000805E0ABF0000000000000000B1C64003F441164002B71B92CCF245400000000020600ABF0000000000000000A9EE6E8F4A3E1640499A7D7A0AF345400000000060600ABF0000000000000000AB4EB52A873A1640D7DED62A5CF3454000000000E0600ABF00000000000000004E63E09028361640D75805BB83F345400000000040610ABF000000000000000010BB2089342E16403F7E70DCCEF345400000000020620ABF00000000000000000DD19A166E2D16402221509BE8F345400000000020620ABF00000000000000005FA437023E2D1640BBE4DA1437F4454000000000A0620ABF0000000000000000E50493E2E12C1640A73E7EDE62F445400000000000630ABF000000000000000055E219092A2D1640D283E5ECADF4454000000000A0630ABF0000000000000000DFF84A664E2D16405EBC42A5CAF4454000000000E0630ABF00000000000000008CFF30A4302F1640AFCEE326E5F445400000000000640ABF0000000000000000E7D6C9E8D5301640C4A6F25525F545400000000080640ABF00000000000000008E2D200CFC3116402B7C620371F545400000000020650ABF000000000000000066ED79A8273516405F7C1496B9F5454000000000A0650ABF0000000000000000B37ED3A631371640A25276C70FF645400000000020660ABF0000000000000000CDFC78D2A23516407F7230663AF6454000000000A0660ABF0000000000000000AB0F4ECE68351640AED9A0D16DF6454000000000E0660ABF0000000000000000E4250AAB223716409F26CC6BBAF645400000000080670ABF00000000000000004FFA5553013716402985B4E96EF7454000000000E0680ABF00000000000000005C1B40EBBF361640102164CECAF745400000000080690ABF00000000000000004E7B5523293416403C72A6816AF8454000000000E06A0ABF00000000000000004E12A639A6311640DC8C2FA0E7F8454000000000A06B0ABF0000000000000000E8A47DCDD32F16402E7B05904BF9454000000000606C0ABF00000000000000006A39EC4BB12F16406721FCF9C0F9454000000000206D0ABF000000000000000009A314DBB730164060D697DC1DFA454000000000406E0ABF000000000000000010CB9C35942D1640BE2B35D463FA454000000000406E0ABF00000000000000008B0E5883F92E1640F7DBBC8AD7FA454000000000606F0ABF0000000000000000B9FFC6F2102C16404162E0EF0EFB454000000000A06F0ABF00000000000000002DEDCC4A1F291640692DB29D3BFB45400000000040700ABF0000000000000000149EC50F8B2716409B09BFF685FB454000000000C0700ABF0000000000000000016A3ED365251640548027F8E3FB45400000000080710ABF0000000000000000BC500CF56F231640E118FC020AFC454000000000C0710ABF00000000000000003A938E7B851E164061EC77D21CFC454000000000C0710ABF0000000000000000AEF4CAE0D91616402823F65822FC454000000000E0710ABF0000000000000000BAEC316290131640CF06EAC451FC45400000000020720ABF0000000000000000060100A494111640B2F03A0A61FC45400000000060720ABF000000000000000040E6F301A40F1640BC6E554071FC45400000000060720ABF00000000000000008AE16DDAE70C1640EDC788E78CFC454000000000C0720ABF00000000000000001BC2C0E838091640AB23B2CD81FC454000000000A0720ABF0000000000000000A876358DA2071640CA26E4A19AFC454000000000C0720ABF00000000000000002B5815D67E051640BFA34F4C95FC454000000000A0720ABF0000000000000000753159C65B041640CD6192FC9FFC454000000000E0720ABF000000000000000002E9D0AA15021640533A9B5DB6FC454000000000E0720ABF0000000000000000E33647595F001640297D57B0B1FC454000000000E0720ABF0000000000000000F2E71102A0FE1540A771AFF7B2FC45400000000000730ABF000000000000000014ABF04ED8FC15407158652CBBFC454000000000E0720ABF000000000000000071C57E38A2FA15400FE91994C4FC45400000000020730ABF00000000000000000BC0FCA315FA1540121788CA14FD454000000000A0730ABF0000000000000000A387BD968FF815407EE57A5933FD45400000000000740ABF0000000000000000809CB253D7F615406B906A1E55FD45400000000020740ABF00000000000000001A65F5DE0AF61540852F2F4777FD45400000000080740ABF00000000000000009C10FC8DB2F51540A4A9A1D289FD45400000000080740ABF0000000000000000076E3112B6F415407469470B6AFE45400000000060760ABF000000000000000087E79B483EF4154099F2ADB8DDFE45400000000000770ABF000000000000000019C76A8D25F41540D559508C2EFF454000000000C0770ABF00000000000000003F47986AD5F3154096D8D49558FF45400000000020780ABF0000000000000000B7E72BE2B5F315407C18CB1077FF45400000000040780ABF0000000000000000C69F27AEB8F31540111B91FC8EFF45400000000060780ABF0000000000000000A12DD36A58F315406C10031D1A0046400000000080790ABF0000000000000000779DC93909F11540B257F3997C00464000000000607A0ABF00000000000000008A99B38DADEF1540DC75F397B600464000000000C07A0ABF0000000000000000E36AE6E5F1EC1540855B9775EF00464000000000207B0ABF0000000000000000032AAD5DDCEB15401AB681CB2D01464000000000807B0ABF00000000000000003F131051AAEA15401F37F19CA001464000000000607C0ABF0000000000000000294498642EE915404B9ED48E1502464000000000807D0ABF000000000000000076877B08B4E515409D25330F9D02464000000000407E0ABF0000000000000000DF00E9066BE215402DD369D00303464000000000E07E0ABF00000000000000001C58D165EEDF1540EB5F3E875A03464000000000C07F0ABF0000000000000000CD23DC2FE5DC1540549D1DB2B10346400000000080800ABF00000000000000006FADDF87CDD9154028FED0C12E0446400000000040810ABF0000000000000000BAE9908800D71540DDEEF9178C0446400000000000820ABF00000000000000009A2E37B455D31540F11BC00EE30446400000000080820ABF0000000000000000CDB0E7AAE8D0154049F792A5230546400000000040830ABF0000000000000000223109A139D0154073B4B2245405464000000000A0830ABF00000000000000007EF797D79FD015400141A43A910546400000000020840ABF0000000000000000907961CB21D31540671F0B84CF0546400000000080840ABF0000000000000000DD92BBEEC8DA15407B68D85AFE05464000000000C0840ABF00000000000000005BD5B96FE5DE1540E094C911580646400000000080850ABF0000000000000000E4145009E3E21540334C32398E06464000000000A0850ABF00000000000000001B8C1F58C3E01540F77DD1CA9B0746400000000000880ABF0000000000000000C988CBCA8EDC15402D72115A1E08464000000000C0880ABF0000000000000000212891D2CDE015405D14BE255D0846400000000040890ABF00000000000000004C313F3B0AE415405335AFC1DC08464000000000808A0ABF000000000000000050B205ECE4E71540B49B2DD90609464000000000A08A0ABF0000000000000000C0996E9B9EEA1540963A434CFF08464000000000608A0ABF0000000000000000C5A188C7EFEC1540CF2DD4D1690846400000000080890ABF000000000000000047FFAAA77CEF1540E5DA65C16E0846400000000080890ABF0000000000000000C4C7079749F3154097FEDDBE5E0846400000000040890ABF0000000000000000888BCEC8D7F5154073115F0E6D08464000000000A0890ABF0000000000000000CB55BF9246FA15408658FC3FED08464000000000408A0ABF0000000000000000A67EED1BC9FD15405545D391C508464000000000208A0ABF000000000000000006CCEC3119FF154069D13D41A808464000000000208A0ABF0000000000000000F6E3269CF801164002509A389F08464000000000C0890ABF0000000000000000AAF5E91CC6041640A8E5F120D008464000000000408A0ABF0000000000000000B52B69E33A051640E1D7D3ED1D09464000000000E08A0ABF00000000000000002C67DA28830A1640ED23E5A83009464000000000E08A0ABF0000000000000000DDFFC610E30D1640025EB6A85D09464000000000208B0ABF0000000000000000B541AF6C8B151640319F11249709464000000000A08B0ABF00000000000000007D8EEFC1AE17164086E4A686ED09464000000000408C0ABF0000000000000000BE726A5DA21B1640EBF151161A0A464000000000A08C0ABF00000000000000007054A0A959221640962D2D59EE09464000000000408C0ABF0000000000000000534884BB05251640ACD5F8F6090A464000000000608C0ABF0000000000000000AF7327125E27164067F16228EA09464000000000408C0ABF000000000000000074EE85B51B291640A7DC7945140A464000000000808C0ABF0000000000000000F67CD254F82A1640A9E036CE4A0A464000000000208D0ABF000000000000000081ECA641DE301640383A4C9D8B0A464000000000808D0ABF0000000000000000D1196A39D23216400DBB9926630A464000000000408D0ABF0000000000000000EDED08D402351640F1400D41220A464000000000C08C0ABF00000000000000004411173E16381640237FAFFE2A0A464000000000E08C0ABF0000000000000000E2D526DDED3A164092630FA39E0A464000000000808D0ABF000000000000000095D436C3B93F16400B477283EA0A464000000000208E0ABF00000000000000006F95E8F2724616405145EF11CD0A464000000000008E0ABF0000000000000000173CA720DB4D1640AA2257BBBC0A464000000000C08D0ABF000000000000000085767FB2ED501640CE3748D0450B464000000000008F0ABF00000000000000001F245DC9CF521640885381809B0B464000000000E08F0ABF00000000000000004790EEEDD0511640FFDD5976EE0B46400000000000900ABF0000000000000000C02B7F877B5316400BB7DCD5410C46400000000000910ABF00000000000000003DA637C04A57164089DFC24AE30C464000000000E0910ABF0000000000000000BFD68369985B1640ABF221BD640D464000000000E0920ABF00000000000000000B5F7968B35C1640998D5126DC0D464000000000C0930ABF000000000000000009621E68A55A1640E09901544B0E46400000000080940ABF00000000000000008A71A5740C5B16404C7ABF5C850E46400000000020950ABF0000000000000000321D0FF5935B164062A4CC63EC0E464000000000E0950ABF00000000000000007EE2CEC1F45B16406E3242E5440F464000000000A0960ABF0000000000000000D3E6532AD861164088C4B8EA780F464000000000E0960ABF0000000000000000F2847A093D6516403271E79C3C1046400000000020980ABF0000000000000000AA73E2A8B069164056ADCE3DA71046400000000060990ABF0000000000000000AEDC8CDD446A16402BCEC75B7311464000000000E09A0ABF0000000000000000CA9B667FD46C16404C374A9A5D12464000000000A09C0ABF0000000000000000FC01C3A3916F16404C168227BA12464000000000209D0ABF0000000000000000317BFFF3E86C1640C22AA83A3613464000000000009E0ABF00000000000000005697F9FF6D6A1640C7E114749513464000000000A09E0ABF00000000000000001D3FB28D6469164014B670B5C113464000000000209F0ABF000000000000000091CEF23C516C164017CA5F0DB013464000000000409F0ABF00000000000000003C82159C297516407D5C79406A13464000000000809E0ABF0000000000000000141998807C781640886AD0DA6513464000000000609E0ABF0000000000000000E6218FFABE7C1640E7B8AA884613464000000000409E0ABF00000000000000007BBE0CDB6E8016404E7258D24113464000000000409E0ABF00000000000000007C843304778516400CCFFDE73E13464000000000009E0ABF0000000000000000706322EDB7891640A4748DE14613464000000000409E0ABF0000000000000000BCFEFCF8F7851640A97DBF3B2F13464000000000209E0ABF000000000000000070DA8894B6841640FB6541E6F912464000000000C09D0ABF00000000000000000D3C0C06247F164087EFB258BF12464000000000209D0ABF00000000000000003ECD9720EE7F164048FCB53E5512464000000000409C0ABF00000000000000000F4975E9107F1640EF90C00CEA11464000000000809B0ABF0000000000000000929DB4CACC7C1640CE9FF168CA11464000000000409B0ABF00000000000000005C8BC32E66771640C0C6C8683311464000000000409A0ABF00000000000000003BB5CBA158771640F4480923B11046400000000060990ABF000000000000000031FEFACC6777164062CF84CF0B1046400000000060980ABF000000000000000016E8FE339E791640884D9262A80F46400000000040970ABF0000000000000000A7853294037B16408BFFE1CCF80E46400000000000960ABF000000000000000022AA4A62B47A1640D160404BAF0E46400000000040950ABF00000000000000004EAF3AFBC976164004E91CCB480E46400000000080940ABF00000000000000008DCFAFFF177616405235F2F6DB0D464000000000A0930ABF0000000000000000CE6728ABB178164076D39F67850D46400000000060930ABF0000000000000000F7E3B27AA87616400247AC67250D464000000000A0920ABF0000000000000000CDF6EFDB2276164088BEF48ABB0C464000000000C0910ABF0000000000000000962E0A2F08751640B81BA8A5610C46400000000000910ABF0000000000000000A90414EEC4731640346DCF16260C46400000000080900ABF00000000000000004538C599727116403AA29D65AC0B464000000000A08F0ABF00000000000000009951884FAA691640BB9A6480730B464000000000008F0ABF0000000000000000DC7C238F9A681640E9D7B8114F0B464000000000008F0ABF00000000000000007A4ACAAF4D6816408C826A3AF20A464000000000808E0ABF0000000000000000C802E04800641640B8C00CBEB90A464000000000E08D0ABF0000000000000000719FF459025E1640AB1737686E0A464000000000608D0ABF00000000000000001D5BEC762D5C1640CEFDDE45060A464000000000A08C0ABF00000000000000004C202208F75C16403AD9249A8209464000000000608B0ABF000000000000000056D79328FC5C164031765C78E008464000000000208A0ABF0000000000000000A6138E920D5A1640D98EF63B9F08464000000000E0890ABF0000000000000000A4A467A6705916407348B0EE170846400000000000890ABF0000000000000000C881353CB059164045F4C1D08A07464000000000A0870ABF0000000000000000FC741BE67259164054ACBBC01207464000000000E0860ABF00000000000000007FBE8893CE591640AE1C17CF9406464000000000E0850ABF0000000000000000CF7B0DE05F5816400CFE14D95106464000000000A0850ABF00000000000000004AA273C7A1581640034A22E6CC0546400000000040840ABF00000000000000009C29FE037E571640BE45C79A9D0546400000000020840ABF0000000000000000C061F309BB55164084C25726860546400000000000840ABF0000000000000000DC73A8C979531640C9AF25B77805464000000000E0830ABF0000000000000000A07D8A3AC04E16402C27888E2E0546400000000000830ABF00000000000000003DBD8283D64B1640F8DADAD9F404464000000000C0820ABF00000000000000002E26D1E8D64C1640F24BA7DEAD0446400000000080820ABF000000000000000059124630C14A16400E86E3CC440446400000000080810ABF00000000000000003FC2B918664B16403F14DDDABE0346400000000040800ABF0000000000000000DD98A035B24B164017CF50FE930346400000000020800ABF00000000000000006EEB203EE84A1640A7DB20933503464000000000407F0ABF0000000000000000B0B37523D449164063FC3250B202464000000000607E0ABF0000000000000000B1605C316A47164009946CD70802464000000000407D0ABF000000000000000042FC14C0B547164095EFEFFC2801464000000000A07B0ABF000000000000000070FAED15C6461640C3A3E11BA200464000000000607A0ABF00000000000000009409DDD28E45164016929AD63B0046400000000080790ABF0000000000000000BA9205B255481640CC7375AFF7FF45400000000020790ABF00000000000000000F28B288864A1640AA635AC6EDFF45400000000020790ABF000000000000000041F2C3335A4D1640374C9C5DC2FF454000000000E0780ABF000000000000000084F5145B2F4F16402683722064FF45400000000020780ABF000000000000000030D35122824F16409387F02C1AFF454000000000A0770ABF0000000000000000E8B91CC61E511640CD21C940F4FE45400000000060770ABF00000000000000000F7CE2D6F2501640DE3BB347CBFE45400000000000770ABF0000000000000000C162B7A19E55164016DC742886FE45400000000060760ABF000000000000000015E65FAF6E5D1640FE30334641FE454000000000E0750ABF0000000000000000CD7ABD1DBB571640AFC5FCCAB0FD45400000000000750ABF000000000000000018786D189A561640C01190BB79FD45400000000040740ABF0000000000000000981E3543A05516406E71AFC82DFD45400000000000740ABF0000000000000000DD1BE3D81F5A1640C5C9BA7CF0FC45400000000060730ABF00000000000000001C92034EAE5E1640A1AB1E71ECFC45400000000060730ABF00000000000000000E95D8C116621640E7B0DB5245FD45400000000020740ABF000000000000000015A7B73F88631640E5403C901AFD454000000000C0730ABF00000000000000003E2A278F2E6516403AFE56C706FD45400000000080730ABF00000000000000002B31FBA6326616409A700E83ECFC454000000000A0730ABF0000000000000000257169556E671640B3471ADBDEFC45400000000060730ABF000000000000000083E83E6DDB6916408E0E8A25FFFC45400000000060730ABF000000000000000022CBA6B6E36B164022FFF06524FD454000000000E0730ABF0000000000000000AAE413F4336D16404AEBFCBA26FD454000000000E0730ABF0000000000000000DF40FB6B9F6E1640155CBFC13EFD454000000000E0730ABF0000000000000000D355B208C16F16409FB212B657FD45400000000000740ABF0000000000000000C8211308B870164051E1682761FD45400000000020740ABF000000000000000066F3BF178D7316409434B35857FD45400000000000740ABF00000000000000003CCC0402FB7416408DCD426441FD45400000000020740ABF000000000000000024FD6241527616401591D36639FD45400000000020740ABF000000000000000007E372D03A7716404642A9563DFD454000000000E0730ABF000000000000000073EA0B9DC0771640252606C054FD45400000000040740ABF00000000000000000169765355781640E565DBEE72FD45400000000080740ABF00000000000000004256E85DF27816408255FB138DFD45400000000080740ABF0000000000000000F94ED4AE427916406C94737BA7FD454000000000E0740ABF0000000000000000FC74377E037C164052B9DDC7A4FD454000000000E0740ABF00000000000000000D661D7AF27D1640D76C0A4FB9FD45400000000000750ABF0000000000000000AE36A506CF7D164015673053DDFD45400000000040750ABF000000000000000087B7FB5BAC7E164045318FDFF0FD45400000000040750ABF0000000000000000AE4DA2E17F801640D522CAC209FE45400000000080750ABF0000000000000000C6BD1223C8811640CCC6A98A1BFE454000000000A0750ABF0000000000000000B01F1179FF8216402082C0FA29FE45400000000080750ABF000000000000000066A1A20D72841640CBC378E73DFE454000000000E0750ABF0000000000000000607C76398B8516401668126C49FE45400000000000760ABF00000000000000008B4A4125CD8616401B22B5B953FE45400000000020760ABF0000000000000000B510E7E999881640471059CF64FE45400000000020760ABF000000000000000096D32AE4318A164081D5C89374FE45400000000060760ABF0000000000000000EA9259CE3C8C1640B2C7BD9660FE45400000000040760ABF0000000000000000091A8110E18D16403598402A41FE45400000000000760ABF000000000000000024D4522A6A8E16407FDFDCFD26FE454000000000C0750ABF00000000000000001AFD6396008F1640E29DDBA904FE45400000000060750ABF0000000000000000FA697AEF048F1640DFC8F447E4FD45400000000020750ABF00000000000000003EBB0C68F58E1640B9B16D5EBAFD45400000000000750ABF0000000000000000CF05A90F3F8F16408DF9AC93A4FD454000000000A0740ABF000000000000000092F1583424901640E3F47F768EFD454000000000C0740ABF00000000000000009534819A0891164086015CFD87FD45400000000080740ABF000000000000000040124803859216409301EE979EFD454000000000A0740ABF000000000000000056C8F8CBFE9216402AEE916F8DFD45400000000080740ABF0000000000000000910704B230931640C02C5FE069FD45400000000060740ABF0000000000000000434231F54F921640F4A835F947FD45400000000020740ABF000000000000000099717444AD91164063F21C1A33FD45400000000000740ABF000000000000000074D0B373A3911640C12964A218FD454000000000A0730ABF0000000000000000C59CC26531921640AAFF498DDFFC45400000000040730ABF00000000000000001DE165C845921640B6562962BEFC45400000000020730ABF00000000000000005FAE9108C1911640CEEB0713A2FC454000000000E0720ABF000000000000000031B148DB35931640007221A975FC45400000000080720ABF00000000000000000B000B61CB9316407173FF0F51FC45400000000040720ABF0000000000000000DBAA085C6C94164096F8BA0129FC45400000000000720ABF00000000000000001BC574E9A0941640057B7C1618FC454000000000C0710ABF00000000000000005F497C9DC49416409651753DFBFB45400000000040710ABF0000000000000000E3011425399516407A1296B3E5FB45400000000080710ABF00000000000000002BB174877E9516407BF874ABCAFB45400000000060710ABF0000000000000000495D7178599516402BF40329AEFB45400000000040710ABF0000000000000000A4CE6C8AFA9416406EEC7CFC95FB454000000000E0700ABF0000000000000000D0EB67AFA79416401B07273C7AFB454000000000A0700ABF00000000000000009107687E1E94164078A4D5566CFB45400000000080700ABF0000000000000000EAAB1F26DA931640805EDD4F3FFB45400000000020700ABF0000000000000000FB4B257D7C931640B650A0692BFB45400000000040700ABF0000000000000000EE6E95EC699216406CC8C71900FB454000000000A06F0ABF0000000000000000DEA1A82E799116404D4656F5D6FA454000000000606F0ABF00000000000000006B40786EA2901640BBCBC57CBBFA454000000000006F0ABF00000000000000009B574ECF228F164095E8777E96FA454000000000E06E0ABF00000000000000009AB9D026208D16402F4C66E74FFA454000000000606E0ABF000000000000000062CDED60AA8C164090A299DB2EFA454000000000206E0ABF0000000000000000D3648BD39D8C1640ACDB01EF0CFA454000000000206E0ABF0000000000000000CC9578FAC78C1640F4ED5925EDF9454000000000C06D0ABF0000000000000000FF580A934F8C16402C1302B8B7F9454000000000206D0ABF0000000000000000A35CC1DFB48C1640A8F2F9587EF9454000000000E06C0ABF000000000000000004A13F1B698B16404BCC673756F9454000000000806C0ABF0000000000000000E3765EF13D8A1640220560A83EF9454000000000606C0ABF00000000000000008D0EEE6AD089164058025D7C10F9454000000000006C0ABF00000000000000007D1FF17648891640D14DBE64E2F8454000000000E06B0ABF0000000000000000C73D241DE78816402166CFD8B8F8454000000000606B0ABF000000000000000034E8F179B78716404792FE008EF8454000000000206B0ABF0000000000000000E77D18B9C78616405D7BF2C35AF8454000000000A06A0ABF00000000000000001115D1520E861640BE9D0A9B29F8454000000000406A0ABF0000000000000000B228462FBB85164055FC5D09F4F7454000000000E0690ABF0000000000000000A0A200BE5E851640768FE7BEB0F745400000000040690ABF0000000000000000E011C98DAD85164003BF4F088AF745400000000020690ABF0000000000000000418AA282078616406C38936254F7454000000000C0680ABF0000000000000000E07DCBC321861640475251EB24F7454000000000A0680ABF0000000000000000D330AF8281861640322EE0240DF745400000000020680ABF00000000000000005C4C243F6A871640844684FBF3F645400000000020680ABF000000000000000010626F9B0D881640D28AF38CE1F6454000000000C0670ABF0000000000000000D96AC22B3B8A16401A83C22613F745400000000020680ABF00000000000000004D2ABCBB328B1640671B6D2631F745400000000080680ABF0000000000000000DCF33027178D1640156F202550F745400000000080680ABF0000000000000000DD55FD3FD98F1640818E44692EF745400000000040680ABF0000000000000000866411D0B491164046ACB4E31BF745400000000020680ABF00000000000000003593746AD49216401DE0A3800CF745400000000060680ABF000000000000000019F76A69FC921640871CE616DFF6454000000000C0670ABF0000000000000000A8F2E9DB5693164090491FE8BAF645400000000080670ABF00000000000000000A12EF11A4931640C78C00B38BF645400000000040670ABF0000000000000000405C430C759316403F576D0E73F6454000000000E0660ABF0000000000000000A11B099FEA93164055D6EA8A4AF6454000000000C0660ABF00000000000000006A515CCE66941640922365A135F6454000000000A0660ABF00000000000000008623A75D4C9516402F02CFB525F645400000000060660ABF0000000000000000DB1FC24730961640AD0550160CF645400000000080660ABF000000000000000062D531064C971640F6A13571F2F545400000000020660ABF0000000000000000AC09688396991640CB5F223BF3F5454000000000E0650ABF00000000000000003891BE3F5B9B16409DCCD688D6F5454000000000E0650ABF0000000000000000C2B93A3F499C16404F1F9446C1F5454000000000A0650ABF00000000000000005B37B4DB339C1640E5464E5AA0F545400000000060650ABF000000000000000047B7FC26029C16407CDA076F81F545400000000020650ABF0000000000000000715E61879D9B164079FD2AA070F545400000000020650ABF0000000000000000B56160945B9B1640F7B3FA1158F545400000000000650ABF000000000000000069262665AE9A1640CA57064137F5454000000000A0640ABF0000000000000000C7085C305F9A16405C80709D13F545400000000040640ABF0000000000000000FD7CE50B499A1640072EA283F1F445400000000040640ABF00000000000000004C2AF426919A16402D6A0F19CFF4454000000000E0630ABF0000000000000000C873F592629B16403950544BACF4454000000000A0630ABF0000000000000000BF661A98EB9B16401E220AD581F445400000000060630ABF0000000000000000EE4A4E903C9B1640BA2C5D845FF445400000000060630ABF00000000000000006E863726199B16406396473033F4454000000000A0620ABF000000000000000047B3345FF69A16403C2DD09108F445400000000060620ABF0000000000000000B6E368C88E9A1640BA9BBFE0D8F345400000000020620ABF00000000000000009AB2C997019A16407A9EB8FCBEF3454000000000C0610ABF00000000000000006EAA313C24991640D9488FEC9AF3454000000000A0610ABF0000000000000000645802C2779516408C1B4CB228F3454000000000E0600ABF0000000000000000') ) ; @@ -43,8 +43,8 @@ INSERT INTO pr_zh.t_hydro_area (id_hydro, name, geom) VALUES INSERT INTO pr_zh.t_references(id_reference,ref_number,reference,authors,pub_year,title,editor,editor_location) VALUES -(1, 29, 'Charte PNRL - VBM', 'Parc naturel régional du Luberon', 2009, 'Secteur de Valeur Biologique Majeure (VBM) : "Le Calavon"', 'PNR Luberon', 'APT'), -(2, 32, 'DOCOB FR9301587 "Le Calavon et l''Encrème"', 'Groupe de Chiroptères de Provence - F. ALBALAT', 2013, 'Inventaire et cartographie des Chiroptères d''intérêt communautaire du site Natura 2000 FR9301587 "Le Calavon et l''Encrème"', 'GCP', 'APT') +(1000001, 29, 'Charte PNRL - VBM', 'Parc naturel régional du Luberon', 2009, 'Secteur de Valeur Biologique Majeure (VBM) : "Le Calavon"', 'PNR Luberon', 'APT'), +(1000002, 32, 'DOCOB FR9301587 "Le Calavon et l''Encrème"', 'Groupe de Chiroptères de Provence - F. ALBALAT', 2013, 'Inventaire et cartographie des Chiroptères d''intérêt communautaire du site Natura 2000 FR9301587 "Le Calavon et l''Encrème"', 'GCP', 'APT') ON CONFLICT DO NOTHING; @@ -61,22 +61,22 @@ ON CONFLICT DO NOTHING; -- step 2 : insert list of rules of Calavon river basin INSERT INTO pr_zh.cor_rb_rules VALUES -(1, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'Calavon - DU_13_07'), 1), -(2, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'Calavon - DU_13_07'), 2), -(3, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'Calavon - DU_13_07'), 3), -(4, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'Calavon - DU_13_07'), 4), -(5, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'Calavon - DU_13_07'), 5), -(6, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'Calavon - DU_13_07'), 6), -(7, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'Calavon - DU_13_07'), 7), -(8, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'Calavon - DU_13_07'), 8), -(9, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'Calavon - DU_13_07'), 9), -(10, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'Calavon - DU_13_07'), 10), -(11, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'Calavon - DU_13_07'), 11), -(12, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'Calavon - DU_13_07'), 12), -(13, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'Calavon - DU_13_07'), 13), -(14, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'Calavon - DU_13_07'), 14), -(15, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'Calavon - DU_13_07'), 15), -(16, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'Calavon - DU_13_07'), 16) +(1000001, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'SAMPLE - Calavon - DU_13_07'), 1), +(1000002, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'SAMPLE - Calavon - DU_13_07'), 2), +(1000003, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'SAMPLE - Calavon - DU_13_07'), 3), +(1000004, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'SAMPLE - Calavon - DU_13_07'), 4), +(1000005, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'SAMPLE - Calavon - DU_13_07'), 5), +(1000006, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'SAMPLE - Calavon - DU_13_07'), 6), +(1000007, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'SAMPLE - Calavon - DU_13_07'), 7), +(1000008, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'SAMPLE - Calavon - DU_13_07'), 8), +(1000009, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'SAMPLE - Calavon - DU_13_07'), 9), +(10000010, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'SAMPLE - Calavon - DU_13_07'), 10), +(10000011, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'SAMPLE - Calavon - DU_13_07'), 11), +(10000012, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'SAMPLE - Calavon - DU_13_07'), 12), +(10000013, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'SAMPLE - Calavon - DU_13_07'), 13), +(10000014, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'SAMPLE - Calavon - DU_13_07'), 14), +(10000015, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'SAMPLE - Calavon - DU_13_07'), 15), +(10000016, (SELECT id_rb FROM pr_zh.t_river_basin WHERE name = 'SAMPLE - Calavon - DU_13_07'), 16) ; @@ -87,131 +87,98 @@ INSERT INTO pr_zh.cor_rb_rules VALUES -- - check if global category note is not > 100 ? INSERT INTO pr_zh.t_items VALUES -(1, 1, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = '07 - zones humides de bas fonds en tête de bassin'), 100, 1), -(2, 1, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = '11 - zones humides ponctuelles'), 75, 1), -(3, 1, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = '05 - bordures de cours d''eau'), 50, 1), -(4, 1, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = '06 - plaines alluviales'), 75, 1), -(5, 1, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = '13 - zones humides artificielles'), 0, 1), -(95, 1, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = '10 - marais et landes humides de plaines et plateaux'), 100, 1), - -(6, 2, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 1, 2), -(7, 2, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 3), -(8, 2, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1 ou 2' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 13, 2), -(9, 2, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1 ou 2' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 13, 3), -(10, 2, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '3 à 5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 19, 2), -(11, 2, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '3 à 5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 19, 3), -(12, 2, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 25, 2), -(13, 2, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 25, 3), - -(14, 3, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 1, 2), -(15, 3, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 3), -(16, 3, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1 ou 2' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 14, 2), -(17, 3, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1 ou 2' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 11, 3), -(18, 3, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '3 à 5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 19, 2), -(19, 3, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '3 à 5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 17, 3), -(20, 3, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 25, 2), -(21, 3, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 22, 3), - -(22, 4, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 1, 2), -(23, 4, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 3), -(24, 4, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1 à 4' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 11, 2), -(25, 4, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1 à 4' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 9, 3), -(26, 4, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '5 à 7' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 16, 2), -(27, 4, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '5 à 7' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 14, 3), -(28, 4, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '8 ou 9' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 20, 2), -(29, 4, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '8 ou 9' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 18, 3), -(30, 4, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>9' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 25, 2), -(31, 4, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>9' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 23, 3), - -(32, 5, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 1, 2), -(33, 5, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 3), -(34, 5, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 11, 2), -(35, 5, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 9, 3), -(36, 5, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '2' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 16, 2), -(37, 5, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '2' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 14, 3), -(38, 5, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '3' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 20, 2), -(39, 5, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '3' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 18, 3), -(40, 5, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>3' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 25, 2), -(41, 5, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>3' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 23, 3), - -(42, 6, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'ZH isolée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 1), -(43, 6, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'ZH participant d''un réseau ou continuum' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 100, 1), - -(44, 7, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 15, 2), -(45, 7, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 15, 3), -(46, 7, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Nulle à faible' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 10, 2), -(47, 7, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Nulle à faible' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 0, 3), -(48, 7, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Moyenne' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 25, 2), -(49, 7, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Moyenne' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 20, 3), -(50, 7, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Forte' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 33.3, 2), -(51, 7, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Forte' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 33.3, 3), - -(52, 8, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 15, 2), -(53, 8, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 15, 3), -(54, 8, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Nulle à faible' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 10, 2), -(55, 8, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Nulle à faible' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 0, 3), -(56, 8, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Moyenne' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 25, 2), -(57, 8, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Moyenne' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 20, 3), -(58, 8, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Forte' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 33.3, 2), -(59, 8, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Forte' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 33.3, 3), - -(60, 9, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 15, 2), -(61, 9, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 15, 3), -(62, 9, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Nulle à faible' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 10, 2), -(63, 9, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Nulle à faible' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 0, 3), -(64, 9, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Moyenne' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 25, 2), -(65, 9, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Moyenne' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 20, 3), -(66, 9, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Forte' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 33.3, 2), -(67, 9, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Forte' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 33.3, 3), - -(68, 10, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 10, 1), -(69, 10, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Nulle à faible' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 0, 1), -(70, 10, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Moyenne' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 25, 1), -(71, 10, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Forte' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 50, 1), - -(72, 11, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 10, 1), -(73, 11, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Nulle à faible' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 0, 1), -(74, 11, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Moyenne' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 25, 1), -(75, 11, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Forte' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 50, 1), - -(76, 12, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 50, 1), -(77, 12, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Faible (conventionnel / contractuel / inventaire)' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 25, 1), -(78, 12, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Fort (réglementaire / maîtrise foncière)' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 1), - -(79, 13, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'OUI' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 1), -(80, 13, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'NON' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 50, 1), - -(81, 14, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Pas ou peu dégradée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 1), -(82, 14, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Partiellement dégradée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 25, 1), -(83, 14, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Fortement dégradée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 50, 1), -(84, 14, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 10, 1), - -(85, 15, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Pas ou peu dégradée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 1), -(86, 15, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Partiellement dégradée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 25, 1), -(87, 15, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Fortement dégradée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 50, 1), -(88, 15, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 10, 1), - -(89, 16, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Pas ou peu menacée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'EVAL_GLOB_MENACES')), 0, 1), -(90, 16, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Modérément menacée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'EVAL_GLOB_MENACES')), 50, 1), -(91, 16, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Fortement menacée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'EVAL_GLOB_MENACES')), 100, 1), -(92, 16, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'EVAL_GLOB_MENACES')), 25, 1); - - --- step 4 : insert min and max values for rules which need quantifications - -INSERT INTO pr_zh.cor_item_value VALUES -((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 0), -((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1 ou 2' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 1, 2), -((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '3 à 5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 2, 5), -((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 6, 999999999), -((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1 à 4' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 1, 4), -((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '5 à 7' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 5, 7), -((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '8 ou 9' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 8, 9), -((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>9' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 9, 999999999), -((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 1, 1), -((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '2' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 2, 2), -((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '3' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 3, 3), -((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>3' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 4, 999999999); - +(1000001, 1000001, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = '07 - zones humides de bas fonds en tête de bassin'), 100, 1), +(1000002, 1000001, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = '11 - zones humides ponctuelles'), 75, 1), +(1000003, 1000001, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = '05 - bordures de cours d''eau'), 50, 1), +(1000004, 1000001, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = '06 - plaines alluviales'), 75, 1), +(1000005, 1000001, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = '13 - zones humides artificielles'), 0, 1), +(10000095, 1000001, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = '10 - marais et landes humides de plaines et plateaux'), 100, 1), +(1000006, 1000002, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 1, 2), +(1000007, 1000002, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 3), +(1000008, 1000002, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1 ou 2' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 13, 2), +(1000009, 1000002, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1 ou 2' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 13, 3), +(10000010, 1000002, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '3 à 5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 19, 2), +(10000011, 1000002, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '3 à 5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 19, 3), +(10000012, 1000002, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 25, 2), +(10000013, 1000002, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 25, 3), +(10000014, 1000003, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 1, 2), +(10000015, 1000003, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 3), +(10000016, 1000003, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1 ou 2' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 14, 2), +(10000017, 1000003, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1 ou 2' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 11, 3), +(10000018, 1000003, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '3 à 5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 19, 2), +(10000019, 1000003, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '3 à 5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 17, 3), +(10000020, 1000003, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 25, 2), +(10000021, 1000003, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 22, 3), +(10000022, 1000004, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 1, 2), +(10000023, 1000004, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 3), +(10000024, 1000004, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1 à 4' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 11, 2), +(10000025, 1000004, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1 à 4' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 9, 3), +(10000026, 1000004, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '5 à 7' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 16, 2), +(10000027, 1000004, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '5 à 7' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 14, 3), +(10000028, 1000004, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '8 ou 9' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 20, 2), +(10000029, 1000004, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '8 ou 9' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 18, 3), +(10000030, 1000004, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>9' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 25, 2), +(10000031, 1000004, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>9' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 23, 3), +(10000032, 1000005, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 1, 2), +(10000033, 1000005, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 3), +(10000034, 1000005, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 11, 2), +(10000035, 1000005, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 9, 3), +(10000036, 1000005, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '2' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 16, 2), +(10000037, 1000005, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '2' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 14, 3), +(10000038, 1000005, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '3' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 20, 2), +(10000039, 1000005, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '3' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 18, 3), +(10000040, 1000005, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>3' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 25, 2), +(10000041, 1000005, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>3' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 23, 3), +(10000042, 1000006, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'ZH isolée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 1), +(10000043, 1000006, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'ZH participant d''un réseau ou continuum' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 100, 1), +(10000044, 1000007, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 15, 2), +(10000045, 1000007, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 15, 3), +(10000046, 1000007, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Nulle à faible' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 10, 2), +(10000047, 1000007, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Nulle à faible' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 0, 3), +(10000048, 1000007, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Moyenne' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 25, 2), +(10000049, 1000007, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Moyenne' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 20, 3), +(10000050, 1000007, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Forte' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 33.3, 2), +(10000051, 1000007, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Forte' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 33.3, 3), +(10000052, 1000008, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 15, 2), +(10000053, 1000008, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 15, 3), +(10000054, 1000008, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Nulle à faible' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 10, 2), +(10000055, 1000008, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Nulle à faible' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 0, 3), +(10000056, 1000008, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Moyenne' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 25, 2), +(10000057, 1000008, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Moyenne' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 20, 3), +(10000058, 1000008, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Forte' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 33.3, 2), +(10000059, 1000008, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Forte' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 33.3, 3), +(10000060, 1000009, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 15, 2), +(10000061, 1000009, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 15, 3), +(10000062, 1000009, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Nulle à faible' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 10, 2), +(10000063, 1000009, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Nulle à faible' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 0, 3), +(10000064, 1000009, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Moyenne' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 25, 2), +(10000065, 1000009, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Moyenne' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 20, 3), +(10000066, 1000009, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Forte' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 33.3, 2), +(10000067, 1000009, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Forte' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 33.3, 3), +(10000068, 10000010, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 10, 1), +(10000069, 10000010, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Nulle à faible' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 0, 1), +(10000070, 10000010, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Moyenne' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 25, 1), +(10000071, 10000010, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Forte' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 50, 1), +(10000072, 10000011, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 10, 1), +(10000073, 10000011, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Nulle à faible' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 0, 1), +(10000074, 10000011, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Moyenne' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 25, 1), +(10000075, 10000011, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Forte' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'FONCTIONS_QUALIF')), 50, 1), +(10000076, 10000012, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 50, 1), +(10000077, 10000012, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Faible (conventionnel / contractuel / inventaire)' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 25, 1), +(10000078, 10000012, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Fort (réglementaire / maîtrise foncière)' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 1), +(10000079, 10000013, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'OUI' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 1), +(10000080, 10000013, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'NON' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 50, 1), +(10000081, 10000014, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Pas ou peu dégradée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 1), +(10000082, 10000014, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Partiellement dégradée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 25, 1), +(10000083, 10000014, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Fortement dégradée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 50, 1), +(10000084, 10000014, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 10, 1), +(10000085, 10000015, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Pas ou peu dégradée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 1), +(10000086, 10000015, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Partiellement dégradée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 25, 1), +(10000087, 10000015, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Fortement dégradée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 50, 1), +(10000088, 10000015, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 10, 1), +(10000089, 10000016, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Pas ou peu menacée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'EVAL_GLOB_MENACES')), 0, 1), +(10000090, 10000016, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Modérément menacée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'EVAL_GLOB_MENACES')), 50, 1), +(10000091, 10000016, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Fortement menacée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'EVAL_GLOB_MENACES')), 100, 1), +(10000092, 10000016, (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE label_default = 'Non évaluée' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'EVAL_GLOB_MENACES')), 25, 1); COMMIT; diff --git a/backend/gn_module_zh/migrations/data/insert_into_pr_zh_schema.sql b/backend/gn_module_zh/migrations/data/insert_into_pr_zh_schema.sql index 9c1d6e86..f971ce60 100644 --- a/backend/gn_module_zh/migrations/data/insert_into_pr_zh_schema.sql +++ b/backend/gn_module_zh/migrations/data/insert_into_pr_zh_schema.sql @@ -1435,5 +1435,21 @@ INSERT INTO pr_zh.cor_rule_nomenc VALUES ((SELECT rule_id FROM pr_zh.t_rules WHERE abbreviation = 'status'), (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'STATUT_PROTECTION') AND cd_nomenclature = '97'), (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY') AND cd_nomenclature = 'faible')), ((SELECT rule_id FROM pr_zh.t_rules WHERE abbreviation = 'status'), (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'STATUT_PROTECTION') AND cd_nomenclature = '98'), (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY') AND cd_nomenclature = 'faible')), ((SELECT rule_id FROM pr_zh.t_rules WHERE abbreviation = 'status'), (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'STATUT_PROTECTION') AND cd_nomenclature = '99'), (SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY') AND cd_nomenclature = 'faible')); - + +-- insert min and max values for rules which need quantifications +INSERT INTO pr_zh.cor_item_value VALUES +((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = 'Aucun' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 0, 0), +((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1 ou 2' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 1, 2), +((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '3 à 5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 3, 5), +((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>5' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 6, 999999999), +((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1 à 4' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 1, 4), +((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '5 à 7' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 5, 7), +((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '8 ou 9' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 8, 9), +((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>9' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 10, 999999999), +((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '1' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 1, 1), +((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '2' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 2, 2), +((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '3' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 3, 3), +((SELECT id_nomenclature FROM ref_nomenclatures.t_nomenclatures WHERE mnemonique = '>3' and id_type = (SELECT id_type FROM ref_nomenclatures.bib_nomenclatures_types WHERE mnemonique = 'HIERARCHY')), 4, 999999999); + + COMMIT; From f1721a93958c03893715473a53a44914f991b42b Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Wed, 22 May 2024 12:11:41 +0200 Subject: [PATCH 09/60] fix: use same path in patch_file than in post_file --- backend/gn_module_zh/blueprint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/gn_module_zh/blueprint.py b/backend/gn_module_zh/blueprint.py index 429b9a9d..18a6b3c2 100644 --- a/backend/gn_module_zh/blueprint.py +++ b/backend/gn_module_zh/blueprint.py @@ -733,7 +733,7 @@ def patch_file(id_media): ALLOWED_EXTENSIONS = blueprint.config["allowed_extensions"] MAX_PDF_SIZE = blueprint.config["max_pdf_size"] MAX_JPG_SIZE = blueprint.config["max_jpg_size"] - FILE_PATH = blueprint.config["file_path"] + FILE_PATH = Path(BACKEND_DIR, config["MEDIA_FOLDER"], "attachments") MODULE_NAME = blueprint.config["MODULE_CODE"].lower() upload_resp = upload_process( From 14d170f3803621d2da676c748b904febfceeb717 Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Wed, 17 Apr 2024 17:17:25 +0200 Subject: [PATCH 10/60] feat: create zh-multiselect component --- .../zh-multiselect.component.html | 45 +++++++++ .../zh-multiselect.component.scss | 96 +++++++++++++++++++ .../zh-multiselect.component.ts | 28 ++++++ frontend/app/zh-details/zh-details.module.ts | 3 + frontend/app/zh-search/zh-search.module.ts | 3 +- 5 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.html create mode 100644 frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.scss create mode 100644 frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.ts diff --git a/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.html b/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.html new file mode 100644 index 00000000..3cbb0152 --- /dev/null +++ b/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.html @@ -0,0 +1,45 @@ +{{ label }} + + +
+ + +
+
+ +
+ +
{{ item[keyLabel] }}
+
+
+
\ No newline at end of file diff --git a/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.scss b/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.scss new file mode 100644 index 00000000..7e9f24a7 --- /dev/null +++ b/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.scss @@ -0,0 +1,96 @@ +$primary: #219653; +$primary-darken: #156035; +$primary-lighten: #EFFCF4; +$primary-text: #fff; + +$gray-lighten: #F5F5F5; +$gray-darken: #dcdcdc; +.Multiselect { + color: $primary !important; + ::ng-deep .ng-value-container { + max-height: 200px; + overflow: auto; + } + + ::ng-deep &.ng-select-disabled > .ng-select-container { + background-color: $gray-darken !important; + max-height: 200px; + } + + .MultiselectHeader{ + display: flex; + flex-flow: row nowrap; + justify-content: space-between; + max-width: 100%; + overflow: hidden; + max-height: 24px; + &__search{ + &::placeholder { + opacity: 0.5; + } + max-width: 60%; + border: none; + &:focus { + outline: none; + } + } + &__selectAll{ + white-space: nowrap; + max-height: 24px + } + + } + ::ng-deep .ng-input { + opacity: 0 !important; + } + ::ng-deep .ng-value { + max-width: 90%; + padding-left: 5px; + padding-right: 5px; + background-color: $primary !important; + color: $primary-text !important; + } + // Chip items + &--multiple{ + ::ng-deep .ng-value { + display: flex; + flex-flow: row nowrap; + justify-content: center; + .ng-value-icon{ + align-self: center; + } + .ng-value-icon:hover{ + background-color: $primary !important; + color: $primary-darken !important; + } + .ng-value-label{ + word-wrap: whitespace; + white-space: normal; + } + } + } + + // Option + ::ng-deep .ng-option:hover, + ::ng-deep .ng-option.ng-option-selected:hover { + background-color: $gray-lighten !important; + } + ::ng-deep .ng-option.ng-option-selected { + background-color: $primary-lighten !important; + } + + .MultiselectOptionItem { + display: flex; + flex: row nowrap; + column-gap: 10px; + input[type="checkbox"] { + accent-color: $primary !important; + } + + &__text { + max-width: 80%; + word-wrap: break-all; + white-space: normal; + } + } +} \ No newline at end of file diff --git a/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.ts b/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.ts new file mode 100644 index 00000000..8a080854 --- /dev/null +++ b/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.ts @@ -0,0 +1,28 @@ +import { Component, OnInit, Input } from '@angular/core'; +import { MultiSelectComponent } from '@geonature_common/form/multiselect/multiselect.component'; + +@Component({ + selector: 'zh-multiselect', + templateUrl: './zh-multiselect.component.html', + styleUrls: ['./zh-multiselect.component.scss'], +}) +export class ZHMultiSelectComponent extends MultiSelectComponent implements OnInit { + /** + */ + @Input() multiple: boolean; + constructor() { + super() + this.multiple = true; + } + ngOnInit() { + super.ngOnInit() + } + + public selectAllFiltered(select: any) { + for (const item of select.itemsList.filteredItems) { + select.select(item) + } + // close popup + select.close(); + } +} diff --git a/frontend/app/zh-details/zh-details.module.ts b/frontend/app/zh-details/zh-details.module.ts index cce5f240..cae41aec 100644 --- a/frontend/app/zh-details/zh-details.module.ts +++ b/frontend/app/zh-details/zh-details.module.ts @@ -16,6 +16,7 @@ import { StatutsComponent } from './statuts/statuts.component'; import { CollapseComponent } from '../commonComponents/collapse/collapse.component'; import { TableComponent } from '../commonComponents/table/table.component'; import { LabelComponent } from '../commonComponents/label/label.component'; +import { ZHMultiSelectComponent } from '../commonComponents/zh-multiselect/zh-multiselect.component'; import { HeaderComponent } from './header/header.component'; import { DeleteModalComponent } from '../commonComponents/delete-modal/delete-modal.component'; import { ImageTableComponent } from '../commonComponents/imageTable/image-table.component'; @@ -40,6 +41,7 @@ const routes: Routes = [{ path: 'zhDetails/:id', component: ZhDetailsComponent } CollapseComponent, TableComponent, LabelComponent, + ZHMultiSelectComponent, HeaderComponent, ImageTableComponent, DeleteModalComponent, @@ -52,6 +54,7 @@ const routes: Routes = [{ path: 'zhDetails/:id', component: ZhDetailsComponent } ImageTableComponent, DeleteModalComponent, LabelComponent, + ZHMultiSelectComponent ], }) export class ZhDetailsModule {} diff --git a/frontend/app/zh-search/zh-search.module.ts b/frontend/app/zh-search/zh-search.module.ts index 4ce03d9a..0fb0736e 100644 --- a/frontend/app/zh-search/zh-search.module.ts +++ b/frontend/app/zh-search/zh-search.module.ts @@ -8,6 +8,7 @@ import { ZhSearchComponent } from './zh-search.component'; import { ZhDetailsModule } from '../zh-details/zh-details.module'; import { TableComponent } from '../commonComponents/table/table.component'; import { LabelComponent } from '../commonComponents/label/label.component'; +import { ZHMultiSelectComponent } from '../commonComponents/zh-multiselect/zh-multiselect.component'; import { ZhSearchCodeComponent } from './zh-search-items/zh-search-code/zh-search-code.component'; import { ZhSearchEnsembleComponent } from './zh-search-items/zh-search-ensemble/zh-search-ensemble.component'; import { ZhSearchAreaComponent } from './zh-search-items/zh-search-superficie/zh-search-area.component'; @@ -37,6 +38,6 @@ const routes: Routes = [{ path: 'search', component: ZhSearchComponent }]; ZhAdvancedSearchModule, ZhHierarchySearchModule, ], - exports: [TableComponent, LabelComponent, ZhSearchComponent, AngularMultiSelectModule], + exports: [AngularMultiSelectModule, LabelComponent, TableComponent, ZHMultiSelectComponent, ZhSearchComponent], }) export class ZhSearchModule {} From 1dfc1fedf36b40e4abd84433282780da0d366804 Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Mon, 22 Apr 2024 13:06:29 +0200 Subject: [PATCH 11/60] feat: adjust search input --- .../zh-search-input.component.html | 27 +++++-------------- .../zh-search-input.component.ts | 2 +- 2 files changed, 8 insertions(+), 21 deletions(-) diff --git a/frontend/app/zh-search/zh-search-items/components/zh-search-input/zh-search-input.component.html b/frontend/app/zh-search/zh-search-items/components/zh-search-input/zh-search-input.component.html index ce053a14..26744170 100644 --- a/frontend/app/zh-search/zh-search-items/components/zh-search-input/zh-search-input.component.html +++ b/frontend/app/zh-search/zh-search-items/components/zh-search-input/zh-search-input.component.html @@ -3,25 +3,12 @@
- - - - - - - - - - - - - - +
diff --git a/frontend/app/zh-search/zh-search-items/components/zh-search-input/zh-search-input.component.ts b/frontend/app/zh-search/zh-search-items/components/zh-search-input/zh-search-input.component.ts index cc6cee6f..b785101a 100644 --- a/frontend/app/zh-search/zh-search-items/components/zh-search-input/zh-search-input.component.ts +++ b/frontend/app/zh-search/zh-search-items/components/zh-search-input/zh-search-input.component.ts @@ -27,7 +27,7 @@ export class ZhSearchInputComponent implements OnInit { ngOnInit() { this.form.valueChanges.subscribe((x) => { - this.onSelected.emit(x); + this.onSelected.emit([x]); }); } From 4a10c38ebe144e48acd1b9218cf1b72050638834 Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Wed, 17 Apr 2024 17:17:47 +0200 Subject: [PATCH 12/60] feat: use zh-multiselect in search-ensemble --- .../zh-search-ensemble.component.html | 12 +++++------- .../zh-search-ensemble.component.ts | 14 -------------- 2 files changed, 5 insertions(+), 21 deletions(-) diff --git a/frontend/app/zh-search/zh-search-items/zh-search-ensemble/zh-search-ensemble.component.html b/frontend/app/zh-search/zh-search-items/zh-search-ensemble/zh-search-ensemble.component.html index d7897519..7675a86d 100644 --- a/frontend/app/zh-search/zh-search-items/zh-search-ensemble/zh-search-ensemble.component.html +++ b/frontend/app/zh-search/zh-search-items/zh-search-ensemble/zh-search-ensemble.component.html @@ -3,12 +3,10 @@
- - +
diff --git a/frontend/app/zh-search/zh-search-items/zh-search-ensemble/zh-search-ensemble.component.ts b/frontend/app/zh-search/zh-search-items/zh-search-ensemble/zh-search-ensemble.component.ts index 3ba2fa6b..754d38b6 100644 --- a/frontend/app/zh-search/zh-search-items/zh-search-ensemble/zh-search-ensemble.component.ts +++ b/frontend/app/zh-search/zh-search-items/zh-search-ensemble/zh-search-ensemble.component.ts @@ -9,22 +9,8 @@ import { FormGroup } from '@angular/forms'; export class ZhSearchEnsembleComponent implements OnInit { @Input() data: any; @Input() form: FormGroup; - public dropdownSettings; constructor() {} ngOnInit() { - this.dropdownSettings = { - enableCheckAll: false, - text: 'Sélectionner', - labelKey: 'name', - primaryKey: 'id_site_space', - searchPlaceholderText: 'Rechercher', - enableSearchFilter: true, - autoPosition: true, - }; - } - - onDeSelectAll() { - this.form.reset(); } } From 78cc4124abb8d39da52e38470f65490c546bc167 Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Thu, 18 Apr 2024 11:58:57 +0200 Subject: [PATCH 13/60] feat: use zh-multiselect in search-dependant --- .../zh-search-dependant.component.html | 12 ++++---- .../zh-search-dependant.component.ts | 29 +++++-------------- 2 files changed, 13 insertions(+), 28 deletions(-) diff --git a/frontend/app/zh-search/zh-search-items/components/zh-search-dependant/zh-search-dependant.component.html b/frontend/app/zh-search/zh-search-items/components/zh-search-dependant/zh-search-dependant.component.html index 250abbf9..d8e4ed29 100644 --- a/frontend/app/zh-search/zh-search-items/components/zh-search-dependant/zh-search-dependant.component.html +++ b/frontend/app/zh-search/zh-search-items/components/zh-search-dependant/zh-search-dependant.component.html @@ -3,12 +3,10 @@
- - +
diff --git a/frontend/app/zh-search/zh-search-items/components/zh-search-dependant/zh-search-dependant.component.ts b/frontend/app/zh-search/zh-search-items/components/zh-search-dependant/zh-search-dependant.component.ts index d525fe09..5e9b9d8b 100644 --- a/frontend/app/zh-search/zh-search-items/components/zh-search-dependant/zh-search-dependant.component.ts +++ b/frontend/app/zh-search/zh-search-items/components/zh-search-dependant/zh-search-dependant.component.ts @@ -20,22 +20,15 @@ export class ZhSearchDependantComponent implements OnInit { } @Output() onSelected = new EventEmitter(); public _inputData: inputDataType[] = null; - public dataForm: FormGroup; - public dropdownSettings = { - enableSearchFilter: true, - text: '', - labelKey: 'name', - primaryKey: 'code', - enableFilterSelectAll: false, - selectAllText: 'Tout sélectionner', - unSelectAllText: 'Tout déselectionner', - searchPlaceholderText: 'Rechercher', - disabled: true, - }; + constructor() {} - ngOnInit() {} + ngOnInit() { + if (!this._inputData || this._inputData.length < 1) { + this.disable() + } + } setData(value) { if (this._inputData != undefined) { @@ -48,16 +41,10 @@ export class ZhSearchDependantComponent implements OnInit { this.disable(); } } - - onDeselectAll() { - this.form.reset(); - } - - //Awkward but taken from the doc : https://cuppalabs.github.io/angular2-multiselect-dropdown/#/disablemode disable() { - this.dropdownSettings = { ...this.dropdownSettings, disabled: true }; + this.form.disable() } enable() { - this.dropdownSettings = { ...this.dropdownSettings, disabled: false }; + this.form.enable() } } From fa6c88c4879e0e0fb271bcd77789989e264a8352 Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Thu, 18 Apr 2024 12:09:43 +0200 Subject: [PATCH 14/60] feat: use zh-multiselect in search-sdage component --- .../zh-search-sdage.component.html | 12 +++++------- .../zh-search-sdage/zh-search-sdage.component.ts | 15 --------------- 2 files changed, 5 insertions(+), 22 deletions(-) diff --git a/frontend/app/zh-search/zh-search-items/zh-search-sdage/zh-search-sdage.component.html b/frontend/app/zh-search/zh-search-items/zh-search-sdage/zh-search-sdage.component.html index b7a0c43d..2d27608d 100644 --- a/frontend/app/zh-search/zh-search-items/zh-search-sdage/zh-search-sdage.component.html +++ b/frontend/app/zh-search/zh-search-items/zh-search-sdage/zh-search-sdage.component.html @@ -3,12 +3,10 @@
- - +
diff --git a/frontend/app/zh-search/zh-search-items/zh-search-sdage/zh-search-sdage.component.ts b/frontend/app/zh-search/zh-search-items/zh-search-sdage/zh-search-sdage.component.ts index f94f6959..4fdc90c1 100644 --- a/frontend/app/zh-search/zh-search-items/zh-search-sdage/zh-search-sdage.component.ts +++ b/frontend/app/zh-search/zh-search-items/zh-search-sdage/zh-search-sdage.component.ts @@ -10,23 +10,8 @@ export class ZhSearchSDAGEComponent implements OnInit { @Input() data: any; @Input() form: FormGroup; - public dropdownSettings; - constructor() {} ngOnInit() { - this.dropdownSettings = { - enableCheckAll: false, - text: 'Sélectionner', - labelKey: 'mnemonique', - primaryKey: 'id_nomenclature', - searchPlaceholderText: 'Rechercher', - enableSearchFilter: true, - autoPosition: true, - }; - } - - onDeSelectAll() { - this.form.reset(); } } From e12a57f0844a63c7f42d3845f9d6d2a1f249d14f Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Thu, 18 Apr 2024 12:17:20 +0200 Subject: [PATCH 15/60] feat: use zh-multiselect in advanced-search-statuts --- .../zh-advanced-search-statuts.component.html | 36 ++++++++----------- .../zh-advanced-search-statuts.component.ts | 25 ++----------- 2 files changed, 17 insertions(+), 44 deletions(-) diff --git a/frontend/app/zh-advanced-search/components/statuts/zh-advanced-search-statuts.component.html b/frontend/app/zh-advanced-search/components/statuts/zh-advanced-search-statuts.component.html index 0dd2cda0..207d0e8c 100644 --- a/frontend/app/zh-advanced-search/components/statuts/zh-advanced-search-statuts.component.html +++ b/frontend/app/zh-advanced-search/components/statuts/zh-advanced-search-statuts.component.html @@ -8,13 +8,11 @@
Statuts et gestion
- - +
@@ -22,13 +20,11 @@
Statuts et gestion
- - +
@@ -36,13 +32,11 @@
Statuts et gestion
- - +
diff --git a/frontend/app/zh-advanced-search/components/statuts/zh-advanced-search-statuts.component.ts b/frontend/app/zh-advanced-search/components/statuts/zh-advanced-search-statuts.component.ts index 39061c34..5986b6f0 100644 --- a/frontend/app/zh-advanced-search/components/statuts/zh-advanced-search-statuts.component.ts +++ b/frontend/app/zh-advanced-search/components/statuts/zh-advanced-search-statuts.component.ts @@ -11,28 +11,7 @@ export class ZhAdvancedSearchStatutsComponent implements OnInit { @Input() plans: []; @Input() strategies: []; @Input() form: FormGroup; - public dropdownSettings: {}; + constructor() {} - - ngOnInit() { - this.dropdownSettings = { - enableCheckAll: false, - text: 'Sélectionner', - labelKey: 'mnemonique', - primaryKey: 'id_nomenclature', - searchPlaceholderText: 'Rechercher', - enableSearchFilter: true, - autoPosition: true, - }; - } - - onDeSelectAllStatuts() { - this.form.get('statuts').reset(); - } - onDeSelectAllPlans() { - this.form.get('plans').reset(); - } - onDeSelectAllStrategies() { - this.form.get('strategies').reset(); - } + ngOnInit() {} } From 14746e04f3e28aa52214f861806c0b7b786211d4 Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Thu, 18 Apr 2024 12:28:25 +0200 Subject: [PATCH 16/60] feat: use zh-multiselect in advanced-search-evaluations --- ...advanced-search-evaluations.component.html | 36 ++++++++----------- ...h-advanced-search-evaluations.component.ts | 24 +------------ 2 files changed, 16 insertions(+), 44 deletions(-) diff --git a/frontend/app/zh-advanced-search/components/evaluations/zh-advanced-search-evaluations.component.html b/frontend/app/zh-advanced-search/components/evaluations/zh-advanced-search-evaluations.component.html index f775979f..8a33649e 100644 --- a/frontend/app/zh-advanced-search/components/evaluations/zh-advanced-search-evaluations.component.html +++ b/frontend/app/zh-advanced-search/components/evaluations/zh-advanced-search-evaluations.component.html @@ -8,13 +8,11 @@
Evaluation de l'état fonctionnel de la zone humide et
- - +
@@ -23,13 +21,11 @@
Evaluation de l'état fonctionnel de la zone humide et
- - +
@@ -37,13 +33,11 @@
Evaluation de l'état fonctionnel de la zone humide et
- - +
diff --git a/frontend/app/zh-advanced-search/components/evaluations/zh-advanced-search-evaluations.component.ts b/frontend/app/zh-advanced-search/components/evaluations/zh-advanced-search-evaluations.component.ts index dd2e962c..2a4023ae 100644 --- a/frontend/app/zh-advanced-search/components/evaluations/zh-advanced-search-evaluations.component.ts +++ b/frontend/app/zh-advanced-search/components/evaluations/zh-advanced-search-evaluations.component.ts @@ -12,29 +12,7 @@ export class ZhAdvancedSearchEvaluationsComponent implements OnInit { @Input() bios: []; @Input() menaces: []; - public dropdownSettings: {}; constructor() {} - ngOnInit() { - this.dropdownSettings = { - enableCheckAll: false, - text: 'Sélectionner', - labelKey: 'mnemonique', - primaryKey: 'id_nomenclature', - searchPlaceholderText: 'Rechercher', - enableSearchFilter: true, - autoPosition: false, - position: 'bottom', - }; - } - - onDeSelectAllHydro() { - this.form.get('hydros').reset(); - } - onDeSelectAllBio() { - this.form.get('bios').reset(); - } - onDeSelectAllMenaces() { - this.form.get('menaces').reset(); - } + ngOnInit() {} } From d8d5849aead654f86eaa76dfd202061fc6db81ea Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Mon, 22 Apr 2024 15:19:29 +0200 Subject: [PATCH 17/60] feat: add to advanced search --- ...h-advanced-search-fonctions.component.html | 37 ++++++++----------- .../zh-advanced-search-fonctions.component.ts | 31 +--------------- 2 files changed, 18 insertions(+), 50 deletions(-) diff --git a/frontend/app/zh-advanced-search/components/fonctions/zh-advanced-search-fonctions.component.html b/frontend/app/zh-advanced-search/components/fonctions/zh-advanced-search-fonctions.component.html index dc1e3760..8512c0af 100644 --- a/frontend/app/zh-advanced-search/components/fonctions/zh-advanced-search-fonctions.component.html +++ b/frontend/app/zh-advanced-search/components/fonctions/zh-advanced-search-fonctions.component.html @@ -8,13 +8,12 @@
{{ title }}
- - + +
@@ -22,13 +21,11 @@
{{ title }}
- - +
@@ -36,13 +33,11 @@
{{ title }}
- - +
diff --git a/frontend/app/zh-advanced-search/components/fonctions/zh-advanced-search-fonctions.component.ts b/frontend/app/zh-advanced-search/components/fonctions/zh-advanced-search-fonctions.component.ts index ae454473..567444c7 100644 --- a/frontend/app/zh-advanced-search/components/fonctions/zh-advanced-search-fonctions.component.ts +++ b/frontend/app/zh-advanced-search/components/fonctions/zh-advanced-search-fonctions.component.ts @@ -13,37 +13,10 @@ export class ZhAdvancedSearchFonctionsComponent implements OnInit { @Input() title: string = ''; @Input() fonctionLabel: string = 'Fonction'; @Input() form: FormGroup; - public dropdownSettings: {}; - public dropdownSettingsNoCategory: {}; + // public dropdownSettings: {}; + // public dropdownSettingsNoCategory: {}; constructor() {} ngOnInit() { - this.dropdownSettings = { - enableCheckAll: false, - text: 'Sélectionner', - labelKey: 'mnemonique', - primaryKey: 'id_nomenclature', - searchPlaceholderText: 'Rechercher', - enableSearchFilter: true, - position: 'bottom', - autoPosition: false, - }; - this.dropdownSettingsNoCategory = { - enableCheckAll: false, - text: 'Sélectionner', - labelKey: 'mnemonique', - primaryKey: 'id_nomenclature', - autoPosition: false, - }; - } - - onDeSelectAllFcts() { - this.form.get('functions').reset(); - } - onDeSelectAllQual() { - this.form.get('qualifications').reset(); - } - onDeSelectAllConn() { - this.form.get('connaissances').reset(); } } From 301e3e5372bbfa1727ea3e2c2490b826191f49e2 Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Mon, 22 Apr 2024 15:42:42 +0200 Subject: [PATCH 18/60] feat: zh-multiselect add groupable option --- .../zh-multiselect.component.html | 20 ++++++++++++++++++- .../zh-multiselect.component.ts | 2 ++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.html b/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.html index 3cbb0152..c80bc860 100644 --- a/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.html +++ b/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.html @@ -11,7 +11,11 @@ [formControl]="parentFormControl" (add)="onChange.emit($event)" (remove)="onDelete.emit($event)" - [closeOnSelect]="!multiple"> + [closeOnSelect]="!multiple" + [groupBy]="groupBy" + [selectableGroup]="true" + [selectableGroupAsModel]="false" + >
+ +
+ +
{{ item[groupBy] }}
+
+
Date: Mon, 22 Apr 2024 15:52:53 +0200 Subject: [PATCH 19/60] feat: add to tab-3 --- .../zh-forms/tabs/tab3/zh-form-tab3.component.html | 13 ++++++------- .../zh-forms/tabs/tab3/zh-form-tab3.component.ts | 11 ----------- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/frontend/app/zh-forms/tabs/tab3/zh-form-tab3.component.html b/frontend/app/zh-forms/tabs/tab3/zh-form-tab3.component.html index baaf4311..015078c6 100755 --- a/frontend/app/zh-forms/tabs/tab3/zh-form-tab3.component.html +++ b/frontend/app/zh-forms/tabs/tab3/zh-form-tab3.component.html @@ -204,14 +204,13 @@
{{ modalTitle }}
Impacts (facteurs influençant l’évolution de la zone) - - + groupBy="category" + /> (); constructor() { super() this.multiple = true; From 53e466c4491499d72e1867471cdeb0baa58ce84f Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Mon, 22 Apr 2024 17:07:33 +0200 Subject: [PATCH 21/60] feat: adjust hierarchy zo zh-multiselect --- .../zh-hierarchy-search-table.component.html | 26 +++++++++---------- .../zh-hierarchy-search-table.component.ts | 19 -------------- 2 files changed, 13 insertions(+), 32 deletions(-) diff --git a/frontend/app/zh-hierarchy-search/components/zh-hierarchy-search-table.component.html b/frontend/app/zh-hierarchy-search/components/zh-hierarchy-search-table.component.html index 0edc3174..a1822bd9 100644 --- a/frontend/app/zh-hierarchy-search/components/zh-hierarchy-search-table.component.html +++ b/frontend/app/zh-hierarchy-search/components/zh-hierarchy-search-table.component.html @@ -39,22 +39,22 @@
Rubrique
Attribut
- - +
Connaissance
- - +
Statuts - - + [parentFormControl]="formTab6.controls.protections" + groupBy="category" + keyLabel="mnemonique_status" + />
diff --git a/frontend/app/zh-forms/tabs/tab6/zh-form-tab6.component.ts b/frontend/app/zh-forms/tabs/tab6/zh-form-tab6.component.ts index 3df38a8c..8af941a4 100755 --- a/frontend/app/zh-forms/tabs/tab6/zh-form-tab6.component.ts +++ b/frontend/app/zh-forms/tabs/tab6/zh-form-tab6.component.ts @@ -725,9 +725,9 @@ export class ZhFormTab6Component implements OnInit { onAddStructure() { // multi select : returns an Array... - const structure = this.formTab6.value.structure[0]; + const structure = this.formTab6.value.structure; if (structure) { - let itemExist = this.managements.some((item) => item.id_org == structure.id_org); + const itemExist = this.managements.some((item) => item.id_org == structure.id_org); if (!itemExist && structure.id_org) { this.managements.push(structure); } From e44254956c41ce4c2f4deec14574bf63467b398e Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Mon, 22 Apr 2024 17:08:48 +0200 Subject: [PATCH 23/60] feat: adjust tab7 zo zh-multiselect --- .../tabs/tab7/zh-form-tab7.component.html | 14 ++++++-------- .../zh-forms/tabs/tab7/zh-form-tab7.component.ts | 16 ++-------------- 2 files changed, 8 insertions(+), 22 deletions(-) diff --git a/frontend/app/zh-forms/tabs/tab7/zh-form-tab7.component.html b/frontend/app/zh-forms/tabs/tab7/zh-form-tab7.component.html index 00251bca..9e7fd9fb 100755 --- a/frontend/app/zh-forms/tabs/tab7/zh-form-tab7.component.html +++ b/frontend/app/zh-forms/tabs/tab7/zh-form-tab7.component.html @@ -212,14 +212,12 @@
{{ modalTitle }}
Propositions d'actions - - + - + Date: Mon, 22 Apr 2024 17:15:30 +0200 Subject: [PATCH 25/60] feat: placeholder added to zh-multiselect --- .../zh-multiselect/zh-multiselect.component.html | 2 +- .../commonComponents/zh-multiselect/zh-multiselect.component.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.html b/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.html index e70ba0ca..65cee724 100644 --- a/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.html +++ b/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.html @@ -4,7 +4,7 @@ [ngClass]="{'Multiselect--multiple': multiple}" [items]="values" [bindLabel]="keyLabel" - placeholder="Sélectionner" + [placeholder]="placeholder" [multiple]="multiple" [clearable]="true" [virtualScroll]="true" diff --git a/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.ts b/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.ts index de92b8e9..b23a28e9 100644 --- a/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.ts +++ b/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.ts @@ -11,11 +11,13 @@ export class ZHMultiSelectComponent extends MultiSelectComponent implements OnIn */ @Input() multiple: boolean; @Input() groupBy: string | null; + @Input() placeholder: string; @Output() onOpen = new EventEmitter(); constructor() { super() this.multiple = true; this.groupBy = null; + this.placeholder = "Sélectionner"; } ngOnInit() { super.ngOnInit() From bb76326268554e7bc3345faa8a405d841acbb7f6 Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Mon, 22 Apr 2024 17:15:41 +0200 Subject: [PATCH 26/60] feat: adjust tab0 to zh-multiselect --- .../zh-forms/tabs/tab0/zh-form-tab0.component.html | 13 ++++++------- .../zh-forms/tabs/tab0/zh-form-tab0.component.ts | 10 ---------- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/frontend/app/zh-forms/tabs/tab0/zh-form-tab0.component.html b/frontend/app/zh-forms/tabs/tab0/zh-form-tab0.component.html index 905781b1..64e44dfa 100755 --- a/frontend/app/zh-forms/tabs/tab0/zh-form-tab0.component.html +++ b/frontend/app/zh-forms/tabs/tab0/zh-form-tab0.component.html @@ -65,13 +65,12 @@
Champs obligatoires
-->
Critères de délimitation de la zone humide - - + Description de l'espace de fonctionnalité
Occupation des sols (Nomenclature Corine Land Cover) - - +
diff --git a/frontend/app/zh-forms/tabs/tab3/zh-form-tab3.component.ts b/frontend/app/zh-forms/tabs/tab3/zh-form-tab3.component.ts index 3f25df22..9fbfa066 100755 --- a/frontend/app/zh-forms/tabs/tab3/zh-form-tab3.component.ts +++ b/frontend/app/zh-forms/tabs/tab3/zh-form-tab3.component.ts @@ -74,7 +74,6 @@ export class ZhFormTab3Component implements OnInit { listCorinBio = []; posted: boolean = false; patchActivity: boolean = false; - dropdownSettings: any; activityForm: FormGroup; modalButtonLabel: string; modalTitle: string; @@ -96,16 +95,6 @@ export class ZhFormTab3Component implements OnInit { ) {} ngOnInit() { - this.dropdownSettings = { - singleSelection: false, - idField: 'id_nomenclature', - textField: 'mnemonique', - searchPlaceholderText: 'Rechercher', - enableCheckAll: false, - allowSearchFilter: true, - maxHeight: 300, - }; - this.activityForm = this.fb.group({ human_activity: [null, Validators.required], localisation: [null, Validators.required], From 46b50948acdf228ddbac2ee17d1c9c0fa2fda55e Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Mon, 22 Apr 2024 17:45:45 +0200 Subject: [PATCH 28/60] feat: adjust tab6 to zh-multiselect --- .../tabs/tab6/zh-form-tab6.component.html | 12 +++---- .../tabs/tab6/zh-form-tab6.component.ts | 31 ------------------- 2 files changed, 5 insertions(+), 38 deletions(-) diff --git a/frontend/app/zh-forms/tabs/tab6/zh-form-tab6.component.html b/frontend/app/zh-forms/tabs/tab6/zh-form-tab6.component.html index 5a5cd6c8..2ba6b017 100755 --- a/frontend/app/zh-forms/tabs/tab6/zh-form-tab6.component.html +++ b/frontend/app/zh-forms/tabs/tab6/zh-form-tab6.component.html @@ -470,13 +470,11 @@
{{ modalTitle }}
Type de classement - - + Critères de délimitation de la zone humide
Critères utilisés - - +
Remarque @@ -30,13 +29,11 @@
Critères de délimitation de l'espace de fonctionnali
Critères utilisés - - +
Remarque diff --git a/frontend/app/zh-forms/tabs/tab2/zh-form-tab2.component.ts b/frontend/app/zh-forms/tabs/tab2/zh-form-tab2.component.ts index 76f985f8..321ae0ce 100755 --- a/frontend/app/zh-forms/tabs/tab2/zh-form-tab2.component.ts +++ b/frontend/app/zh-forms/tabs/tab2/zh-form-tab2.component.ts @@ -21,7 +21,6 @@ export class ZhFormTab2Component implements OnInit, AfterViewInit { public formTab2: FormGroup; public critDelim: any; public critDelimFct: any; - public dropdownSettings: any; public submitted: boolean; public posted: boolean; @@ -34,15 +33,6 @@ export class ZhFormTab2Component implements OnInit, AfterViewInit { ) {} ngOnInit() { - this.dropdownSettings = { - singleSelection: false, - idField: 'id_nomenclature', - textField: 'mnemonique', - searchPlaceholderText: 'Rechercher', - enableCheckAll: false, - allowSearchFilter: true, - }; - this.getMetaData(); this.createForm(); } From 23d80e7ce879e98a8f49302c5d07175d4cebc4dd Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Mon, 22 Apr 2024 17:53:51 +0200 Subject: [PATCH 30/60] feat: purge ng_multiselect_dropdown --- .../ng-multiselect-dropdown/CHANGELOG.md | 0 .../ng-multiselect-dropdown/README.md | 226 ------ .../bundles/ng-multiselect-dropdown.umd.js | 667 ------------------ .../ng-multiselect-dropdown.umd.js.map | 1 - .../ng-multiselect-dropdown.umd.min.js | 16 - .../ng-multiselect-dropdown.umd.min.js.map | 1 - .../click-outside.directive.d.ts | 12 - .../esm2015/click-outside.directive.js | 33 - .../esm2015/list-filter.pipe.js | 26 - .../esm2015/multiselect.component.js | 346 --------- .../esm2015/multiselect.model.js | 14 - .../esm2015/ng-multiselect-dropdown.js | 8 - .../esm2015/ng-multiselect-dropdown.module.js | 25 - .../esm2015/public_api.js | 3 - .../esm5/click-outside.directive.js | 34 - .../esm5/list-filter.pipe.js | 30 - .../esm5/multiselect.component.js | 367 ---------- .../esm5/multiselect.model.js | 16 - .../esm5/ng-multiselect-dropdown.js | 8 - .../esm5/ng-multiselect-dropdown.module.js | 29 - .../esm5/public_api.js | 3 - .../fesm2015/ng-multiselect-dropdown.js | 434 ------------ .../fesm2015/ng-multiselect-dropdown.js.map | 1 - .../fesm5/ng-multiselect-dropdown.js | 465 ------------ .../fesm5/ng-multiselect-dropdown.js.map | 1 - .../list-filter.pipe.d.ts | 11 - .../multiselect.component.d.ts | 55 -- .../multiselect.model.d.ts | 26 - .../ng-multiselect-dropdown.d.ts | 9 - .../ng-multiselect-dropdown.metadata.json | 1 - .../ng-multiselect-dropdown.module.d.ts | 15 - .../ng-multiselect-dropdown/package.json | 97 --- .../ng-multiselect-dropdown/public_api.d.ts | 3 - .../themes/ng-multiselect-dropdown.theme.scss | 210 ------ .../node_modules/tslib/CopyrightNotice.txt | 15 - frontend/node_modules/tslib/LICENSE.txt | 12 - frontend/node_modules/tslib/README.md | 142 ---- frontend/node_modules/tslib/modules/index.js | 51 -- .../node_modules/tslib/modules/package.json | 3 - frontend/node_modules/tslib/package.json | 37 - .../index.js | 23 - .../package.json | 6 - frontend/node_modules/tslib/tslib.d.ts | 37 - frontend/node_modules/tslib/tslib.es6.html | 1 - frontend/node_modules/tslib/tslib.es6.js | 218 ------ frontend/node_modules/tslib/tslib.html | 1 - frontend/node_modules/tslib/tslib.js | 284 -------- frontend/package-lock.json | 173 ----- frontend/package.json | 1 - 49 files changed, 4197 deletions(-) delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/CHANGELOG.md delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/README.md delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/bundles/ng-multiselect-dropdown.umd.js delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/bundles/ng-multiselect-dropdown.umd.js.map delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/bundles/ng-multiselect-dropdown.umd.min.js delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/bundles/ng-multiselect-dropdown.umd.min.js.map delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/click-outside.directive.d.ts delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/esm2015/click-outside.directive.js delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/esm2015/list-filter.pipe.js delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/esm2015/multiselect.component.js delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/esm2015/multiselect.model.js delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/esm2015/ng-multiselect-dropdown.js delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/esm2015/ng-multiselect-dropdown.module.js delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/esm2015/public_api.js delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/esm5/click-outside.directive.js delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/esm5/list-filter.pipe.js delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/esm5/multiselect.component.js delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/esm5/multiselect.model.js delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/esm5/ng-multiselect-dropdown.js delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/esm5/ng-multiselect-dropdown.module.js delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/esm5/public_api.js delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/fesm2015/ng-multiselect-dropdown.js delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/fesm2015/ng-multiselect-dropdown.js.map delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/fesm5/ng-multiselect-dropdown.js delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/fesm5/ng-multiselect-dropdown.js.map delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/list-filter.pipe.d.ts delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/multiselect.component.d.ts delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/multiselect.model.d.ts delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/ng-multiselect-dropdown.d.ts delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/ng-multiselect-dropdown.metadata.json delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/ng-multiselect-dropdown.module.d.ts delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/package.json delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/public_api.d.ts delete mode 100644 frontend/node_modules/ng-multiselect-dropdown/themes/ng-multiselect-dropdown.theme.scss delete mode 100644 frontend/node_modules/tslib/CopyrightNotice.txt delete mode 100644 frontend/node_modules/tslib/LICENSE.txt delete mode 100644 frontend/node_modules/tslib/README.md delete mode 100644 frontend/node_modules/tslib/modules/index.js delete mode 100644 frontend/node_modules/tslib/modules/package.json delete mode 100644 frontend/node_modules/tslib/package.json delete mode 100644 frontend/node_modules/tslib/test/validateModuleExportsMatchCommonJS/index.js delete mode 100644 frontend/node_modules/tslib/test/validateModuleExportsMatchCommonJS/package.json delete mode 100644 frontend/node_modules/tslib/tslib.d.ts delete mode 100644 frontend/node_modules/tslib/tslib.es6.html delete mode 100644 frontend/node_modules/tslib/tslib.es6.js delete mode 100644 frontend/node_modules/tslib/tslib.html delete mode 100644 frontend/node_modules/tslib/tslib.js diff --git a/frontend/node_modules/ng-multiselect-dropdown/CHANGELOG.md b/frontend/node_modules/ng-multiselect-dropdown/CHANGELOG.md deleted file mode 100644 index e69de29b..00000000 diff --git a/frontend/node_modules/ng-multiselect-dropdown/README.md b/frontend/node_modules/ng-multiselect-dropdown/README.md deleted file mode 100644 index e8a6b51a..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/README.md +++ /dev/null @@ -1,226 +0,0 @@ -# Angular Multiselect Dropdown - -[![All Contributors](https://img.shields.io/badge/all_contributors-6-orange.svg?style=flat-square)](#contributors-) - - -[![npm version](https://img.shields.io/npm/v/ng-multiselect-dropdown.svg)](https://www.npmjs.com/package/ng-multiselect-dropdown) -[![downloads](https://img.shields.io/npm/dt/ng-multiselect-dropdown.svg)](https://www.npmjs.com/package/ng-multiselect-dropdown) -[![downloads](https://img.shields.io/npm/dm/ng-multiselect-dropdown.svg)](https://www.npmjs.com/package/ng-multiselect-dropdown) - -Angular multiselect dropdown component for web applications. Easy to integrate and use. It can be bind to any custom data source. - -# [Demo](https://nileshpatel17.github.io/ng-multiselect-dropdown/) - -![demo](Screenshots/ng-multiselect-dropdown_v0.1.6.gif) - -## Getting Started - -## Features - -- dropdown with single/multiple selction option -- bind to any custom data source -- search item with custom placeholder text -- limit selection -- select/de-select all items -- custom theme - -### Installation - -``` -npm install ng-multiselect-dropdown -``` - -And then include it in your module (see [app.module.ts](https://github.com/NileshPatel17/ng-multiselect-dropdown/blob/master/src/app/app.module.ts)): - -```ts -import { NgMultiSelectDropDownModule } from 'ng-multiselect-dropdown'; -// ... - -@NgModule({ - imports: [ - NgMultiSelectDropDownModule.forRoot() - // ... - ] - // ... -}) -export class AppModule {} -``` - -### Usage - -```ts -import { Component, OnInit } from '@angular/core'; -import { IDropdownSettings } from 'ng-multiselect-dropdown'; - -export class AppComponent implements OnInit { - dropdownList = []; - selectedItems = []; - dropdownSettings = {}; - ngOnInit() { - this.dropdownList = [ - { item_id: 1, item_text: 'Mumbai' }, - { item_id: 2, item_text: 'Bangaluru' }, - { item_id: 3, item_text: 'Pune' }, - { item_id: 4, item_text: 'Navsari' }, - { item_id: 5, item_text: 'New Delhi' } - ]; - this.selectedItems = [ - { item_id: 3, item_text: 'Pune' }, - { item_id: 4, item_text: 'Navsari' } - ]; - this.dropdownSettings:IDropdownSettings = { - singleSelection: false, - idField: 'item_id', - textField: 'item_text', - selectAllText: 'Select All', - unSelectAllText: 'UnSelect All', - itemsShowLimit: 3, - allowSearchFilter: true - }; - } - onItemSelect(item: any) { - console.log(item); - } - onSelectAll(items: any) { - console.log(items); - } -} -``` - -```html - - -``` - -### Settings - -| Setting | Type | Description | Default Value | -| :----------------------------- | :--------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------ | -| singleSelection | Boolean | Mode of this component. If set `true` user can select more than one option. | false | -| placeholder | String | Text to be show in the dropdown, when no items are selected. | 'Select' | -| disabled | Boolean | Disable the dropdown | false | -| data | Array | Array of items from which to select. Should be an array of objects with id and `text` properties. You can also use custom properties. In that case you need to map idField and `textField` properties. As convenience, you may also pass an array of strings, in which case the same string is used for both the ID and the text(no mapping is required) | n/a | -| idField | String | map id field in case of custom array of object | 'id' | -| textField | String | map text field in case of custom array of object | 'text' | -| enableCheckAll | Boolean | Enable the option to select all items in list | false | -| selectAllText | String | Text to display as the label of select all option | Select All | -| unSelectAllText | String | Text to display as the label of unSelect option | UnSelect All | -| allowSearchFilter | Boolean | Enable filter option for the list. | false | -| searchPlaceholderText | String | custom search placeholder | Search | -| clearSearchFilter | Boolean | clear search filter on dropdown close | true | -| maxHeight | Number | Set maximum height of the dropdown list in px. | 197 | -| itemsShowLimit | Number | Limit the number of items to show in the input field. If not set will show all selected. | All | -| limitSelection | Number | Limit the selection of number of items from the dropdown list. Once the limit is reached, all unselected items gets disabled. | none | -| searchPlaceholderText | String | Custom text for the search placeholder text. Default value would be 'Search' | 'Search' | -| noDataAvailablePlaceholderText | String | Custom text when no data is available. | 'No data available' | -| closeDropDownOnSelection | Boolean | Closes the dropdown when item is selected. applicable only in cas of single selection | false | -| defaultOpen | Boolean | open state of dropdown | false | -| allowRemoteDataSearch | Boolean | allow search remote api if no data is present. | false | - - -### Callback Methods - -- `onSelect` - Return the selected item when an item is checked. - Example : (onSelect)="onItemSelect($event)" -- `onSelectAll` - Return the all items. - Example : (onSelectAll)="onSelectAll($event)". -- `onDeSelect` - Return the unselected item when an item is unchecked. - Example : (onDeSelect)="onItemDeSelect($event)" -- `onFilterChange` - Return the key press. - Example : (onFilterChange)="onFilterChange($event)" -- `onDropDownClose`- - Example : (onDropDownClose)="onDropDownClose()" - - -### Custom Theme - -- The component package has a themes folder in node_modules at `ng-multiselet-dropdown\themes\ng-multiselect-dropdown.theme.scss` -- Include the `ng-multiselet-dropdown.theme.css` in `angular-cli.json` (for versions below angular 6) and `angular.json` (for version 6 or more). -- [Refer this file](https://github.com/NileshPatel17/ng-multiselect-dropdown/blob/master/custom-theme.md) on how to add the css file to your angular project. - - - -## Custom Template(in beta): - -### Variables can be used in template - -1. id: return id as number -2. option: return option text. return string -3. isSelected: determine if item is selected or not. returns boolean - -Template for each item -``` - - {{option}} - -``` - -Template for selected item -``` - - {{option}} - -``` - -[Demo](https://codesandbox.io/s/custom-template-uyo0o?file=/src/app/app.component.html) -### Run locally - -- Clone the repository or downlod the .zip,.tar files. -- Run `npm install` -- Run `ng serve` for a dev server -- Navigate to `http://localhost:4200/` - -### Library Build / NPM Package - -Run `yarn build:lib` to build the library and generate an NPM package. The build artifacts will be stored in the dist-lib/ folder. - -## Running unit tests - -Run `yarn test` to execute the unit tests. - -## Development - -This project was generated with Angular CLI version 1.7.1. - -## Contributions - -Contributions are welcome, please open an issue and preferrably file a pull request. - -### Opening Issue - -Please share sample code using codesandbox.com or stackblitz.com to help me re-produce the issue. - -## License - -MIT License. - -## Contributors ✨ - -Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - -

Tom Saleeba

💻

Simon Pinfold

💻

Sushil Suthar

💻

Sachin Grover

💻

Mike Roberts

💻

David Sosa

💻
- - - - - -This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! diff --git a/frontend/node_modules/ng-multiselect-dropdown/bundles/ng-multiselect-dropdown.umd.js b/frontend/node_modules/ng-multiselect-dropdown/bundles/ng-multiselect-dropdown.umd.js deleted file mode 100644 index ff359d39..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/bundles/ng-multiselect-dropdown.umd.js +++ /dev/null @@ -1,667 +0,0 @@ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/forms'), require('@angular/common')) : - typeof define === 'function' && define.amd ? define('ng-multiselect-dropdown', ['exports', '@angular/core', '@angular/forms', '@angular/common'], factory) : - (global = global || self, factory(global['ng-multiselect-dropdown'] = {}, global.ng.core, global.ng.forms, global.ng.common)); -}(this, (function (exports, core, forms, common) { 'use strict'; - - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. All rights reserved. - Licensed under the Apache License, Version 2.0 (the "License"); you may not use - this file except in compliance with the License. You may obtain a copy of the - License at http://www.apache.org/licenses/LICENSE-2.0 - - THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED - WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, - MERCHANTABLITY OR NON-INFRINGEMENT. - - See the Apache Version 2.0 License for specific language governing permissions - and limitations under the License. - ***************************************************************************** */ - /* global Reflect, Promise */ - - var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - - function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - } - - var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - - function __rest(s, e) { - var t = {}; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { - if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) - t[p[i]] = s[p[i]]; - } - return t; - } - - function __decorate(decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - } - - function __param(paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); } - } - - function __metadata(metadataKey, metadataValue) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); - } - - function __awaiter(thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - } - - function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - } - - function __exportStar(m, exports) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; - } - - function __values(o) { - var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0; - if (m) return m.call(o); - return { - next: function () { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - } - - function __read(o, n) { - var m = typeof Symbol === "function" && o[Symbol.iterator]; - if (!m) return o; - var i = m.call(o), r, ar = [], e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); - } - catch (error) { e = { error: error }; } - finally { - try { - if (r && !r.done && (m = i["return"])) m.call(i); - } - finally { if (e) throw e.error; } - } - return ar; - } - - function __spread() { - for (var ar = [], i = 0; i < arguments.length; i++) - ar = ar.concat(__read(arguments[i])); - return ar; - } - - function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; - }; - - function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); - } - - function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; - function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } - function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } - function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } - function fulfill(value) { resume("next", value); } - function reject(value) { resume("throw", value); } - function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } - } - - function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; - function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } - } - - function __asyncValues(o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); - function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } - function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } - } - - function __makeTemplateObject(cooked, raw) { - if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } - return cooked; - }; - - function __importStar(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result.default = mod; - return result; - } - - function __importDefault(mod) { - return (mod && mod.__esModule) ? mod : { default: mod }; - } - - var ListItem = /** @class */ (function () { - function ListItem(source) { - if (typeof source === 'string' || typeof source === 'number') { - this.id = this.text = source; - this.isDisabled = false; - } - if (typeof source === 'object') { - this.id = source.id; - this.text = source.text; - this.isDisabled = source.isDisabled; - } - } - return ListItem; - }()); - - var ListFilterPipe = /** @class */ (function () { - function ListFilterPipe() { - } - ListFilterPipe.prototype.transform = function (items, filter) { - var _this = this; - if (!items || !filter) { - return items; - } - return items.filter(function (item) { return _this.applyFilter(item, filter); }); - }; - ListFilterPipe.prototype.applyFilter = function (item, filter) { - if (typeof item.text === 'string' && typeof filter.text === 'string') { - return !(filter.text && item.text && item.text.toLowerCase().indexOf(filter.text.toLowerCase()) === -1); - } - else { - return !(filter.text && item.text && item.text.toString().toLowerCase().indexOf(filter.text.toString().toLowerCase()) === -1); - } - }; - ListFilterPipe = __decorate([ - core.Pipe({ - name: 'multiSelectFilter', - pure: false - }) - ], ListFilterPipe); - return ListFilterPipe; - }()); - - var DROPDOWN_CONTROL_VALUE_ACCESSOR = { - provide: forms.NG_VALUE_ACCESSOR, - useExisting: core.forwardRef(function () { return MultiSelectComponent; }), - multi: true - }; - var noop = function () { }; - var ɵ0 = noop; - var MultiSelectComponent = /** @class */ (function () { - function MultiSelectComponent(listFilterPipe) { - this.listFilterPipe = listFilterPipe; - this._data = []; - this.selectedItems = []; - this.isDropdownOpen = true; - this._placeholder = "Select"; - this._sourceDataType = null; // to keep note of the source data type. could be array of string/number/object - this._sourceDataFields = []; // store source data fields names - this.filter = new ListItem(this.data); - this.defaultSettings = { - singleSelection: false, - idField: "id", - textField: "text", - disabledField: "isDisabled", - enableCheckAll: true, - selectAllText: "Select All", - unSelectAllText: "UnSelect All", - allowSearchFilter: false, - limitSelection: -1, - clearSearchFilter: true, - maxHeight: 197, - itemsShowLimit: 999999999999, - searchPlaceholderText: "Search", - noDataAvailablePlaceholderText: "No data available", - closeDropDownOnSelection: false, - showSelectedItemsAtTop: false, - defaultOpen: false, - allowRemoteDataSearch: false - }; - this.disabled = false; - this.onFilterChange = new core.EventEmitter(); - this.onDropDownClose = new core.EventEmitter(); - this.onSelect = new core.EventEmitter(); - this.onDeSelect = new core.EventEmitter(); - this.onSelectAll = new core.EventEmitter(); - this.onDeSelectAll = new core.EventEmitter(); - this.onTouchedCallback = noop; - this.onChangeCallback = noop; - } - Object.defineProperty(MultiSelectComponent.prototype, "placeholder", { - set: function (value) { - if (value) { - this._placeholder = value; - } - else { - this._placeholder = "Select"; - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(MultiSelectComponent.prototype, "settings", { - set: function (value) { - if (value) { - this._settings = Object.assign(this.defaultSettings, value); - } - else { - this._settings = Object.assign(this.defaultSettings); - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(MultiSelectComponent.prototype, "data", { - set: function (value) { - var _this = this; - if (!value) { - this._data = []; - } - else { - var firstItem = value[0]; - this._sourceDataType = typeof firstItem; - this._sourceDataFields = this.getFields(firstItem); - this._data = value.map(function (item) { - return typeof item === "string" || typeof item === "number" - ? new ListItem(item) - : new ListItem({ - id: item[_this._settings.idField], - text: item[_this._settings.textField], - isDisabled: item[_this._settings.disabledField] - }); - }); - } - }, - enumerable: true, - configurable: true - }); - MultiSelectComponent.prototype.onFilterTextChange = function ($event) { - this.onFilterChange.emit($event); - }; - MultiSelectComponent.prototype.onItemClick = function ($event, item) { - if (this.disabled || item.isDisabled) { - return false; - } - var found = this.isSelected(item); - var allowAdd = this._settings.limitSelection === -1 || (this._settings.limitSelection > 0 && this.selectedItems.length < this._settings.limitSelection); - if (!found) { - if (allowAdd) { - this.addSelected(item); - } - } - else { - this.removeSelected(item); - } - if (this._settings.singleSelection && this._settings.closeDropDownOnSelection) { - this.closeDropdown(); - } - }; - MultiSelectComponent.prototype.writeValue = function (value) { - var _this = this; - if (value !== undefined && value !== null && value.length > 0) { - if (this._settings.singleSelection) { - try { - if (value.length >= 1) { - var firstItem = value[0]; - this.selectedItems = [ - typeof firstItem === "string" || typeof firstItem === "number" - ? new ListItem(firstItem) - : new ListItem({ - id: firstItem[this._settings.idField], - text: firstItem[this._settings.textField], - isDisabled: firstItem[this._settings.disabledField] - }) - ]; - } - } - catch (e) { - // console.error(e.body.msg); - } - } - else { - var _data = value.map(function (item) { - return typeof item === "string" || typeof item === "number" - ? new ListItem(item) - : new ListItem({ - id: item[_this._settings.idField], - text: item[_this._settings.textField], - isDisabled: item[_this._settings.disabledField] - }); - }); - if (this._settings.limitSelection > 0) { - this.selectedItems = _data.splice(0, this._settings.limitSelection); - } - else { - this.selectedItems = _data; - } - } - } - else { - this.selectedItems = []; - } - this.onChangeCallback(value); - }; - // From ControlValueAccessor interface - MultiSelectComponent.prototype.registerOnChange = function (fn) { - this.onChangeCallback = fn; - }; - // From ControlValueAccessor interface - MultiSelectComponent.prototype.registerOnTouched = function (fn) { - this.onTouchedCallback = fn; - }; - // Set touched on blur - MultiSelectComponent.prototype.onTouched = function () { - this.closeDropdown(); - this.onTouchedCallback(); - }; - MultiSelectComponent.prototype.trackByFn = function (index, item) { - return item.id; - }; - MultiSelectComponent.prototype.isSelected = function (clickedItem) { - var found = false; - this.selectedItems.forEach(function (item) { - if (clickedItem.id === item.id) { - found = true; - } - }); - return found; - }; - MultiSelectComponent.prototype.isLimitSelectionReached = function () { - return this._settings.limitSelection === this.selectedItems.length; - }; - MultiSelectComponent.prototype.isAllItemsSelected = function () { - // get disabld item count - var filteredItems = this.listFilterPipe.transform(this._data, this.filter); - var itemDisabledCount = filteredItems.filter(function (item) { return item.isDisabled; }).length; - // take disabled items into consideration when checking - if ((!this.data || this.data.length === 0) && this._settings.allowRemoteDataSearch) { - return false; - } - return filteredItems.length === this.selectedItems.length + itemDisabledCount; - }; - MultiSelectComponent.prototype.showButton = function () { - if (!this._settings.singleSelection) { - if (this._settings.limitSelection > 0) { - return false; - } - // this._settings.enableCheckAll = this._settings.limitSelection === -1 ? true : false; - return true; // !this._settings.singleSelection && this._settings.enableCheckAll && this._data.length > 0; - } - else { - // should be disabled in single selection mode - return false; - } - }; - MultiSelectComponent.prototype.itemShowRemaining = function () { - return this.selectedItems.length - this._settings.itemsShowLimit; - }; - MultiSelectComponent.prototype.addSelected = function (item) { - if (this._settings.singleSelection) { - this.selectedItems = []; - this.selectedItems.push(item); - } - else { - this.selectedItems.push(item); - } - this.onChangeCallback(this.emittedValue(this.selectedItems)); - this.onSelect.emit(this.emittedValue(item)); - }; - MultiSelectComponent.prototype.removeSelected = function (itemSel) { - var _this = this; - this.selectedItems.forEach(function (item) { - if (itemSel.id === item.id) { - _this.selectedItems.splice(_this.selectedItems.indexOf(item), 1); - } - }); - this.onChangeCallback(this.emittedValue(this.selectedItems)); - this.onDeSelect.emit(this.emittedValue(itemSel)); - }; - MultiSelectComponent.prototype.emittedValue = function (val) { - var _this = this; - var selected = []; - if (Array.isArray(val)) { - val.map(function (item) { - selected.push(_this.objectify(item)); - }); - } - else { - if (val) { - return this.objectify(val); - } - } - return selected; - }; - MultiSelectComponent.prototype.objectify = function (val) { - if (this._sourceDataType === 'object') { - var obj = {}; - obj[this._settings.idField] = val.id; - obj[this._settings.textField] = val.text; - if (this._sourceDataFields.includes(this._settings.disabledField)) { - obj[this._settings.disabledField] = val.isDisabled; - } - return obj; - } - if (this._sourceDataType === 'number') { - return Number(val.id); - } - else { - return val.text; - } - }; - MultiSelectComponent.prototype.toggleDropdown = function (evt) { - evt.preventDefault(); - if (this.disabled && this._settings.singleSelection) { - return; - } - this._settings.defaultOpen = !this._settings.defaultOpen; - if (!this._settings.defaultOpen) { - this.onDropDownClose.emit(); - } - }; - MultiSelectComponent.prototype.closeDropdown = function () { - this._settings.defaultOpen = false; - // clear search text - if (this._settings.clearSearchFilter) { - this.filter.text = ""; - } - this.onDropDownClose.emit(); - }; - MultiSelectComponent.prototype.toggleSelectAll = function () { - if (this.disabled) { - return false; - } - if (!this.isAllItemsSelected()) { - // filter out disabled item first before slicing - this.selectedItems = this.listFilterPipe.transform(this._data, this.filter).filter(function (item) { return !item.isDisabled; }).slice(); - this.onSelectAll.emit(this.emittedValue(this.selectedItems)); - } - else { - this.selectedItems = []; - this.onDeSelectAll.emit(this.emittedValue(this.selectedItems)); - } - this.onChangeCallback(this.emittedValue(this.selectedItems)); - }; - MultiSelectComponent.prototype.getFields = function (inputData) { - var fields = []; - if (typeof inputData !== "object") { - return fields; - } - // tslint:disable-next-line:forin - for (var prop in inputData) { - fields.push(prop); - } - return fields; - }; - MultiSelectComponent.ctorParameters = function () { return [ - { type: ListFilterPipe } - ]; }; - __decorate([ - core.Input() - ], MultiSelectComponent.prototype, "placeholder", null); - __decorate([ - core.Input() - ], MultiSelectComponent.prototype, "disabled", void 0); - __decorate([ - core.Input() - ], MultiSelectComponent.prototype, "settings", null); - __decorate([ - core.Input() - ], MultiSelectComponent.prototype, "data", null); - __decorate([ - core.Output("onFilterChange") - ], MultiSelectComponent.prototype, "onFilterChange", void 0); - __decorate([ - core.Output("onDropDownClose") - ], MultiSelectComponent.prototype, "onDropDownClose", void 0); - __decorate([ - core.Output("onSelect") - ], MultiSelectComponent.prototype, "onSelect", void 0); - __decorate([ - core.Output("onDeSelect") - ], MultiSelectComponent.prototype, "onDeSelect", void 0); - __decorate([ - core.Output("onSelectAll") - ], MultiSelectComponent.prototype, "onSelectAll", void 0); - __decorate([ - core.Output("onDeSelectAll") - ], MultiSelectComponent.prototype, "onDeSelectAll", void 0); - __decorate([ - core.HostListener("blur") - ], MultiSelectComponent.prototype, "onTouched", null); - MultiSelectComponent = __decorate([ - core.Component({ - selector: "ng-multiselect-dropdown", - template: "
\n
\n \n {{_placeholder}}\n _settings.itemsShowLimit-1\">\n {{item.text}}\n x\n \n \n 0\">+{{itemShowRemaining()}}\n \n \n \n
\n
\n
    \n
  • 0 || _settings.allowRemoteDataSearch) && !_settings.singleSelection && _settings.enableCheckAll && _settings.limitSelection===-1\" class=\"multiselect-item-checkbox\" style=\"border-bottom: 1px solid #ccc;padding:10px\">\n \n
    {{!isAllItemsSelected() ? _settings.selectAllText : _settings.unSelectAllText}}
    \n
  • \n
  • 0 || _settings.allowRemoteDataSearch) && _settings.allowSearchFilter\">\n \n
  • \n
\n
    \n
  • \n \n
    {{item.text}}
    \n
  • \n
  • \n
    {{_settings.noDataAvailablePlaceholderText}}
    \n
  • \n
\n
\n
\n", - providers: [DROPDOWN_CONTROL_VALUE_ACCESSOR], - changeDetection: core.ChangeDetectionStrategy.OnPush, - styles: [".multiselect-dropdown{position:relative;width:100%;font-size:inherit;font-family:inherit}.multiselect-dropdown .dropdown-btn{display:inline-block;border:1px solid #adadad;width:100%;padding:6px 12px;margin-bottom:0;font-weight:400;line-height:1.52857143;text-align:left;vertical-align:middle;cursor:pointer;background-image:none;border-radius:4px}.multiselect-dropdown .dropdown-btn .selected-item{border:1px solid #337ab7;margin-right:4px;background:#337ab7;padding:0 5px;color:#fff;border-radius:2px;float:left;display:flex;max-width:100px}.multiselect-dropdown .dropdown-btn .selected-item span{overflow:hidden;text-overflow:ellipsis}.multiselect-dropdown .dropdown-btn .selected-item a{text-decoration:none}.multiselect-dropdown .dropdown-btn .selected-item:hover{box-shadow:1px 1px #959595}.multiselect-dropdown .dropdown-btn .dropdown-multiselect__caret{line-height:16px;display:block;position:absolute;box-sizing:border-box;width:40px;height:38px;right:1px;top:0;padding:4px 8px;margin:0;text-decoration:none;text-align:center;cursor:pointer;transition:transform .2s}.multiselect-dropdown .dropdown-btn .dropdown-multiselect__caret:before{position:relative;right:0;top:65%;color:#999;margin-top:4px;border-style:solid;border-width:8px 8px 0;border-color:#999 transparent;content:\"\"}.multiselect-dropdown .dropdown-btn .dropdown-multiselect--active .dropdown-multiselect__caret{transform:rotateZ(180deg)}.multiselect-dropdown .disabled>span{background-color:#eceeef}.dropdown-list{position:absolute;padding-top:6px;width:100%;z-index:9999;border:1px solid #ccc;border-radius:3px;background:#fff;margin-top:10px;box-shadow:0 1px 5px #959595}.dropdown-list ul{padding:0;list-style:none;overflow:auto;margin:0}.dropdown-list li{padding:6px 10px;cursor:pointer;text-align:left}.dropdown-list .filter-textbox{border-bottom:1px solid #ccc;position:relative;padding:10px}.dropdown-list .filter-textbox input{border:0;width:100%;padding:0 0 0 26px}.dropdown-list .filter-textbox input:focus{outline:0}.multiselect-item-checkbox:hover{background-color:#e4e3e3}.multiselect-item-checkbox input[type=checkbox]{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.multiselect-item-checkbox input[type=checkbox]:focus+div:before,.multiselect-item-checkbox input[type=checkbox]:hover+div:before{border-color:#337ab7;background-color:#f2f2f2}.multiselect-item-checkbox input[type=checkbox]:active+div:before{transition-duration:0s}.multiselect-item-checkbox input[type=checkbox]+div{position:relative;padding-left:2em;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;margin:0;color:#000}.multiselect-item-checkbox input[type=checkbox]+div:before{box-sizing:content-box;content:\"\";color:#337ab7;position:absolute;top:50%;left:0;width:14px;height:14px;margin-top:-9px;border:2px solid #337ab7;text-align:center;transition:.4s}.multiselect-item-checkbox input[type=checkbox]+div:after{box-sizing:content-box;content:\"\";position:absolute;transform:scale(0);transform-origin:50%;transition:transform .2s ease-out;background-color:transparent;top:50%;left:4px;width:8px;height:3px;margin-top:-4px;border-style:solid;border-color:#fff;border-width:0 0 3px 3px;-o-border-image:none;border-image:none;transform:rotate(-45deg) scale(0)}.multiselect-item-checkbox input[type=checkbox]:disabled+div:before{border-color:#ccc}.multiselect-item-checkbox input[type=checkbox]:disabled:focus+div:before .multiselect-item-checkbox input[type=checkbox]:disabled:hover+div:before{background-color:inherit}.multiselect-item-checkbox input[type=checkbox]:disabled:checked+div:before{background-color:#ccc}.multiselect-item-checkbox input[type=checkbox]:checked+div:after{content:\"\";transition:transform .2s ease-out;transform:rotate(-45deg) scale(1)}.multiselect-item-checkbox input[type=checkbox]:checked+div:before{-webkit-animation:.2s ease-in borderscale;animation:.2s ease-in borderscale;background:#337ab7}@-webkit-keyframes borderscale{50%{box-shadow:0 0 0 2px #337ab7}}@keyframes borderscale{50%{box-shadow:0 0 0 2px #337ab7}}"] - }) - ], MultiSelectComponent); - return MultiSelectComponent; - }()); - - var ClickOutsideDirective = /** @class */ (function () { - function ClickOutsideDirective(_elementRef) { - this._elementRef = _elementRef; - this.clickOutside = new core.EventEmitter(); - } - ClickOutsideDirective.prototype.onClick = function (event, targetElement) { - if (!targetElement) { - return; - } - var clickedInside = this._elementRef.nativeElement.contains(targetElement); - if (!clickedInside) { - this.clickOutside.emit(event); - } - }; - ClickOutsideDirective.ctorParameters = function () { return [ - { type: core.ElementRef } - ]; }; - __decorate([ - core.Output() - ], ClickOutsideDirective.prototype, "clickOutside", void 0); - __decorate([ - core.HostListener('document:click', ['$event', '$event.target']) - ], ClickOutsideDirective.prototype, "onClick", null); - ClickOutsideDirective = __decorate([ - core.Directive({ - selector: '[clickOutside]' - }) - ], ClickOutsideDirective); - return ClickOutsideDirective; - }()); - - var NgMultiSelectDropDownModule = /** @class */ (function () { - function NgMultiSelectDropDownModule() { - } - NgMultiSelectDropDownModule_1 = NgMultiSelectDropDownModule; - NgMultiSelectDropDownModule.forRoot = function () { - return { - ngModule: NgMultiSelectDropDownModule_1 - }; - }; - var NgMultiSelectDropDownModule_1; - NgMultiSelectDropDownModule = NgMultiSelectDropDownModule_1 = __decorate([ - core.NgModule({ - imports: [common.CommonModule, forms.FormsModule], - declarations: [MultiSelectComponent, ClickOutsideDirective, ListFilterPipe], - providers: [ListFilterPipe], - exports: [MultiSelectComponent] - }) - ], NgMultiSelectDropDownModule); - return NgMultiSelectDropDownModule; - }()); - - exports.MultiSelectComponent = MultiSelectComponent; - exports.NgMultiSelectDropDownModule = NgMultiSelectDropDownModule; - exports.ɵa = DROPDOWN_CONTROL_VALUE_ACCESSOR; - exports.ɵb = ListFilterPipe; - exports.ɵc = ClickOutsideDirective; - - Object.defineProperty(exports, '__esModule', { value: true }); - -}))); -//# sourceMappingURL=ng-multiselect-dropdown.umd.js.map diff --git a/frontend/node_modules/ng-multiselect-dropdown/bundles/ng-multiselect-dropdown.umd.js.map b/frontend/node_modules/ng-multiselect-dropdown/bundles/ng-multiselect-dropdown.umd.js.map deleted file mode 100644 index 3df6c606..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/bundles/ng-multiselect-dropdown.umd.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ng-multiselect-dropdown.umd.js","sources":["../../node_modules/tslib/tslib.es6.js","ng://ng-multiselect-dropdown/multiselect.model.ts","ng://ng-multiselect-dropdown/list-filter.pipe.ts","ng://ng-multiselect-dropdown/multiselect.component.ts","ng://ng-multiselect-dropdown/click-outside.directive.ts","ng://ng-multiselect-dropdown/ng-multiselect-dropdown.module.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n","export interface IDropdownSettings {\n singleSelection?: boolean;\n idField?: string;\n textField?: string;\n disabledField?: string;\n enableCheckAll?: boolean;\n selectAllText?: string;\n unSelectAllText?: string;\n allowSearchFilter?: boolean;\n clearSearchFilter?: boolean;\n maxHeight?: number;\n itemsShowLimit?: number;\n limitSelection?: number;\n searchPlaceholderText?: string;\n noDataAvailablePlaceholderText?: string;\n closeDropDownOnSelection?: boolean;\n showSelectedItemsAtTop?: boolean;\n defaultOpen?: boolean;\n allowRemoteDataSearch?: boolean;\n}\n\nexport class ListItem {\n id: String | number;\n text: String | number;\n isDisabled?: boolean;\n\n public constructor(source: any) {\n if (typeof source === 'string' || typeof source === 'number') {\n this.id = this.text = source;\n this.isDisabled = false;\n }\n if (typeof source === 'object') {\n this.id = source.id;\n this.text = source.text;\n this.isDisabled = source.isDisabled;\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { ListItem } from './multiselect.model';\n\n@Pipe({\n name: 'multiSelectFilter',\n pure: false\n})\nexport class ListFilterPipe implements PipeTransform {\n transform(items: ListItem[], filter: ListItem): ListItem[] {\n if (!items || !filter) {\n return items;\n }\n return items.filter((item: ListItem) => this.applyFilter(item, filter));\n }\n\n applyFilter(item: ListItem, filter: ListItem): boolean {\n if (typeof item.text === 'string' && typeof filter.text === 'string') {\n return !(filter.text && item.text && item.text.toLowerCase().indexOf(filter.text.toLowerCase()) === -1);\n } else {\n return !(filter.text && item.text && item.text.toString().toLowerCase().indexOf(filter.text.toString().toLowerCase()) === -1);\n }\n }\n}\n","import { Component, HostListener, forwardRef, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef } from \"@angular/core\";\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from \"@angular/forms\";\nimport { ListItem, IDropdownSettings } from \"./multiselect.model\";\nimport { ListFilterPipe } from \"./list-filter.pipe\";\n\nexport const DROPDOWN_CONTROL_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MultiSelectComponent),\n multi: true\n};\nconst noop = () => {};\n\n@Component({\n selector: \"ng-multiselect-dropdown\",\n templateUrl: \"./multi-select.component.html\",\n styleUrls: [\"./multi-select.component.scss\"],\n providers: [DROPDOWN_CONTROL_VALUE_ACCESSOR],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MultiSelectComponent implements ControlValueAccessor {\n public _settings: IDropdownSettings;\n public _data: Array = [];\n public selectedItems: Array = [];\n public isDropdownOpen = true;\n _placeholder = \"Select\";\n private _sourceDataType = null; // to keep note of the source data type. could be array of string/number/object\n private _sourceDataFields: Array = []; // store source data fields names\n filter: ListItem = new ListItem(this.data);\n defaultSettings: IDropdownSettings = {\n singleSelection: false,\n idField: \"id\",\n textField: \"text\",\n disabledField: \"isDisabled\",\n enableCheckAll: true,\n selectAllText: \"Select All\",\n unSelectAllText: \"UnSelect All\",\n allowSearchFilter: false,\n limitSelection: -1,\n clearSearchFilter: true,\n maxHeight: 197,\n itemsShowLimit: 999999999999,\n searchPlaceholderText: \"Search\",\n noDataAvailablePlaceholderText: \"No data available\",\n closeDropDownOnSelection: false,\n showSelectedItemsAtTop: false,\n defaultOpen: false,\n allowRemoteDataSearch: false\n };\n\n @Input()\n public set placeholder(value: string) {\n if (value) {\n this._placeholder = value;\n } else {\n this._placeholder = \"Select\";\n }\n }\n @Input()\n disabled = false;\n\n @Input()\n public set settings(value: IDropdownSettings) {\n if (value) {\n this._settings = Object.assign(this.defaultSettings, value);\n } else {\n this._settings = Object.assign(this.defaultSettings);\n }\n }\n\n @Input()\n public set data(value: Array) {\n if (!value) {\n this._data = [];\n } else {\n const firstItem = value[0];\n this._sourceDataType = typeof firstItem;\n this._sourceDataFields = this.getFields(firstItem);\n this._data = value.map((item: any) =>\n typeof item === \"string\" || typeof item === \"number\"\n ? new ListItem(item)\n : new ListItem({\n id: item[this._settings.idField],\n text: item[this._settings.textField],\n isDisabled: item[this._settings.disabledField]\n })\n );\n }\n }\n\n @Output(\"onFilterChange\")\n onFilterChange: EventEmitter = new EventEmitter();\n @Output(\"onDropDownClose\")\n onDropDownClose: EventEmitter = new EventEmitter();\n\n @Output(\"onSelect\")\n onSelect: EventEmitter = new EventEmitter();\n\n @Output(\"onDeSelect\")\n onDeSelect: EventEmitter = new EventEmitter();\n\n @Output(\"onSelectAll\")\n onSelectAll: EventEmitter> = new EventEmitter>();\n\n @Output(\"onDeSelectAll\")\n onDeSelectAll: EventEmitter> = new EventEmitter>();\n\n private onTouchedCallback: () => void = noop;\n private onChangeCallback: (_: any) => void = noop;\n\n onFilterTextChange($event) {\n this.onFilterChange.emit($event);\n }\n\n constructor(private listFilterPipe:ListFilterPipe) {}\n\n onItemClick($event: any, item: ListItem) {\n if (this.disabled || item.isDisabled) {\n return false;\n }\n\n const found = this.isSelected(item);\n const allowAdd = this._settings.limitSelection === -1 || (this._settings.limitSelection > 0 && this.selectedItems.length < this._settings.limitSelection);\n if (!found) {\n if (allowAdd) {\n this.addSelected(item);\n }\n } else {\n this.removeSelected(item);\n }\n if (this._settings.singleSelection && this._settings.closeDropDownOnSelection) {\n this.closeDropdown();\n }\n }\n\n writeValue(value: any) {\n if (value !== undefined && value !== null && value.length > 0) {\n if (this._settings.singleSelection) {\n try {\n if (value.length >= 1) {\n const firstItem = value[0];\n this.selectedItems = [\n typeof firstItem === \"string\" || typeof firstItem === \"number\"\n ? new ListItem(firstItem)\n : new ListItem({\n id: firstItem[this._settings.idField],\n text: firstItem[this._settings.textField],\n isDisabled: firstItem[this._settings.disabledField]\n })\n ];\n }\n } catch (e) {\n // console.error(e.body.msg);\n }\n } else {\n const _data = value.map((item: any) =>\n typeof item === \"string\" || typeof item === \"number\"\n ? new ListItem(item)\n : new ListItem({\n id: item[this._settings.idField],\n text: item[this._settings.textField],\n isDisabled: item[this._settings.disabledField]\n })\n );\n if (this._settings.limitSelection > 0) {\n this.selectedItems = _data.splice(0, this._settings.limitSelection);\n } else {\n this.selectedItems = _data;\n }\n }\n } else {\n this.selectedItems = [];\n }\n this.onChangeCallback(value);\n }\n\n // From ControlValueAccessor interface\n registerOnChange(fn: any) {\n this.onChangeCallback = fn;\n }\n\n // From ControlValueAccessor interface\n registerOnTouched(fn: any) {\n this.onTouchedCallback = fn;\n }\n\n // Set touched on blur\n @HostListener(\"blur\")\n public onTouched() {\n this.closeDropdown();\n this.onTouchedCallback();\n }\n\n trackByFn(index, item) {\n return item.id;\n }\n\n isSelected(clickedItem: ListItem) {\n let found = false;\n this.selectedItems.forEach(item => {\n if (clickedItem.id === item.id) {\n found = true;\n }\n });\n return found;\n }\n\n isLimitSelectionReached(): boolean {\n return this._settings.limitSelection === this.selectedItems.length;\n }\n\n isAllItemsSelected(): boolean {\n // get disabld item count\n let filteredItems = this.listFilterPipe.transform(this._data,this.filter);\n const itemDisabledCount = filteredItems.filter(item => item.isDisabled).length;\n // take disabled items into consideration when checking\n if ((!this.data || this.data.length === 0) && this._settings.allowRemoteDataSearch) {\n return false;\n }\n return filteredItems.length === this.selectedItems.length + itemDisabledCount;\n }\n\n showButton(): boolean {\n if (!this._settings.singleSelection) {\n if (this._settings.limitSelection > 0) {\n return false;\n }\n // this._settings.enableCheckAll = this._settings.limitSelection === -1 ? true : false;\n return true; // !this._settings.singleSelection && this._settings.enableCheckAll && this._data.length > 0;\n } else {\n // should be disabled in single selection mode\n return false;\n }\n }\n\n itemShowRemaining(): number {\n return this.selectedItems.length - this._settings.itemsShowLimit;\n }\n\n addSelected(item: ListItem) {\n if (this._settings.singleSelection) {\n this.selectedItems = [];\n this.selectedItems.push(item);\n } else {\n this.selectedItems.push(item);\n }\n this.onChangeCallback(this.emittedValue(this.selectedItems));\n this.onSelect.emit(this.emittedValue(item));\n }\n\n removeSelected(itemSel: ListItem) {\n this.selectedItems.forEach(item => {\n if (itemSel.id === item.id) {\n this.selectedItems.splice(this.selectedItems.indexOf(item), 1);\n }\n });\n this.onChangeCallback(this.emittedValue(this.selectedItems));\n this.onDeSelect.emit(this.emittedValue(itemSel));\n }\n\n emittedValue(val: any): any {\n const selected = [];\n if (Array.isArray(val)) {\n val.map(item => {\n selected.push(this.objectify(item));\n });\n } else {\n if (val) {\n return this.objectify(val);\n }\n }\n return selected;\n }\n\n objectify(val: ListItem) {\n if (this._sourceDataType === 'object') {\n const obj = {};\n obj[this._settings.idField] = val.id;\n obj[this._settings.textField] = val.text;\n if (this._sourceDataFields.includes(this._settings.disabledField)) {\n obj[this._settings.disabledField] = val.isDisabled;\n }\n return obj;\n }\n if (this._sourceDataType === 'number') {\n return Number(val.id);\n } else {\n return val.text;\n }\n }\n\n toggleDropdown(evt) {\n evt.preventDefault();\n if (this.disabled && this._settings.singleSelection) {\n return;\n }\n this._settings.defaultOpen = !this._settings.defaultOpen;\n if (!this._settings.defaultOpen) {\n this.onDropDownClose.emit();\n }\n }\n\n closeDropdown() {\n this._settings.defaultOpen = false;\n // clear search text\n if (this._settings.clearSearchFilter) {\n this.filter.text = \"\";\n }\n this.onDropDownClose.emit();\n }\n\n toggleSelectAll() {\n if (this.disabled) {\n return false;\n }\n if (!this.isAllItemsSelected()) {\n // filter out disabled item first before slicing\n this.selectedItems = this.listFilterPipe.transform(this._data,this.filter).filter(item => !item.isDisabled).slice();\n this.onSelectAll.emit(this.emittedValue(this.selectedItems));\n } else {\n this.selectedItems = [];\n this.onDeSelectAll.emit(this.emittedValue(this.selectedItems));\n }\n this.onChangeCallback(this.emittedValue(this.selectedItems));\n }\n\n getFields(inputData) {\n const fields = [];\n if (typeof inputData !== \"object\") {\n return fields;\n }\n // tslint:disable-next-line:forin\n for (const prop in inputData) {\n fields.push(prop);\n }\n return fields;\n }\n}\n","import {Directive, ElementRef, Output, EventEmitter, HostListener} from '@angular/core';\n\n@Directive({\n selector: '[clickOutside]'\n})\nexport class ClickOutsideDirective {\n constructor(private _elementRef: ElementRef) {\n }\n\n @Output()\n public clickOutside = new EventEmitter();\n\n @HostListener('document:click', ['$event', '$event.target'])\n public onClick(event: MouseEvent, targetElement: HTMLElement): void {\n if (!targetElement) {\n return;\n }\n\n const clickedInside = this._elementRef.nativeElement.contains(targetElement);\n if (!clickedInside) {\n this.clickOutside.emit(event);\n }\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MultiSelectComponent } from './multiselect.component';\nimport { ClickOutsideDirective } from './click-outside.directive';\nimport { ListFilterPipe } from './list-filter.pipe';\n\n@NgModule({\n imports: [CommonModule, FormsModule],\n declarations: [MultiSelectComponent, ClickOutsideDirective, ListFilterPipe],\n providers: [ListFilterPipe],\n exports: [MultiSelectComponent]\n})\n\nexport class NgMultiSelectDropDownModule {\n static forRoot(): ModuleWithProviders {\n return {\n ngModule: NgMultiSelectDropDownModule\n };\n }\n}\n"],"names":["Pipe","NG_VALUE_ACCESSOR","forwardRef","EventEmitter","tslib_1.__decorate","Input","Output","HostListener","Component","ChangeDetectionStrategy","ElementRef","Directive","NgModule","CommonModule","FormsModule"],"mappings":"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"} \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/bundles/ng-multiselect-dropdown.umd.min.js b/frontend/node_modules/ng-multiselect-dropdown/bundles/ng-multiselect-dropdown.umd.min.js deleted file mode 100644 index c550ee04..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/bundles/ng-multiselect-dropdown.umd.min.js +++ /dev/null @@ -1,16 +0,0 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("@angular/forms"),require("@angular/common")):"function"==typeof define&&define.amd?define("ng-multiselect-dropdown",["exports","@angular/core","@angular/forms","@angular/common"],t):t((e=e||self)["ng-multiselect-dropdown"]={},e.ng.core,e.ng.forms,e.ng.common)}(this,(function(e,t,i,o){"use strict"; -/*! ***************************************************************************** - Copyright (c) Microsoft Corporation. All rights reserved. - Licensed under the Apache License, Version 2.0 (the "License"); you may not use - this file except in compliance with the License. You may obtain a copy of the - License at http://www.apache.org/licenses/LICENSE-2.0 - - THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED - WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, - MERCHANTABLITY OR NON-INFRINGEMENT. - - See the Apache Version 2.0 License for specific language governing permissions - and limitations under the License. - ***************************************************************************** */function n(e,t,i,o){var n,s=arguments.length,l=s<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,i):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,i,o);else for(var r=e.length-1;r>=0;r--)(n=e[r])&&(l=(s<3?n(l):s>3?n(t,i,l):n(t,i))||l);return s>3&&l&&Object.defineProperty(t,i,l),l}var s=function(e){"string"!=typeof e&&"number"!=typeof e||(this.id=this.text=e,this.isDisabled=!1),"object"==typeof e&&(this.id=e.id,this.text=e.text,this.isDisabled=e.isDisabled)},l=function(){function e(){}return e.prototype.transform=function(e,t){var i=this;return e&&t?e.filter((function(e){return i.applyFilter(e,t)})):e},e.prototype.applyFilter=function(e,t){return"string"==typeof e.text&&"string"==typeof t.text?!(t.text&&e.text&&-1===e.text.toLowerCase().indexOf(t.text.toLowerCase())):!(t.text&&e.text&&-1===e.text.toString().toLowerCase().indexOf(t.text.toString().toLowerCase()))},e=n([t.Pipe({name:"multiSelectFilter",pure:!1})],e)}(),r={provide:i.NG_VALUE_ACCESSOR,useExisting:t.forwardRef((function(){return d})),multi:!0},c=function(){},d=function(){function e(e){this.listFilterPipe=e,this._data=[],this.selectedItems=[],this.isDropdownOpen=!0,this._placeholder="Select",this._sourceDataType=null,this._sourceDataFields=[],this.filter=new s(this.data),this.defaultSettings={singleSelection:!1,idField:"id",textField:"text",disabledField:"isDisabled",enableCheckAll:!0,selectAllText:"Select All",unSelectAllText:"UnSelect All",allowSearchFilter:!1,limitSelection:-1,clearSearchFilter:!0,maxHeight:197,itemsShowLimit:999999999999,searchPlaceholderText:"Search",noDataAvailablePlaceholderText:"No data available",closeDropDownOnSelection:!1,showSelectedItemsAtTop:!1,defaultOpen:!1,allowRemoteDataSearch:!1},this.disabled=!1,this.onFilterChange=new t.EventEmitter,this.onDropDownClose=new t.EventEmitter,this.onSelect=new t.EventEmitter,this.onDeSelect=new t.EventEmitter,this.onSelectAll=new t.EventEmitter,this.onDeSelectAll=new t.EventEmitter,this.onTouchedCallback=c,this.onChangeCallback=c}return Object.defineProperty(e.prototype,"placeholder",{set:function(e){this._placeholder=e||"Select"},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"settings",{set:function(e){this._settings=e?Object.assign(this.defaultSettings,e):Object.assign(this.defaultSettings)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"data",{set:function(e){var t=this;if(e){var i=e[0];this._sourceDataType=typeof i,this._sourceDataFields=this.getFields(i),this._data=e.map((function(e){return new s("string"==typeof e||"number"==typeof e?e:{id:e[t._settings.idField],text:e[t._settings.textField],isDisabled:e[t._settings.disabledField]})}))}else this._data=[]},enumerable:!0,configurable:!0}),e.prototype.onFilterTextChange=function(e){this.onFilterChange.emit(e)},e.prototype.onItemClick=function(e,t){if(this.disabled||t.isDisabled)return!1;var i=this.isSelected(t),o=-1===this._settings.limitSelection||this._settings.limitSelection>0&&this.selectedItems.length0)if(this._settings.singleSelection)try{if(e.length>=1){var i=e[0];this.selectedItems=[new s("string"==typeof i||"number"==typeof i?i:{id:i[this._settings.idField],text:i[this._settings.textField],isDisabled:i[this._settings.disabledField]})]}}catch(e){}else{var o=e.map((function(e){return new s("string"==typeof e||"number"==typeof e?e:{id:e[t._settings.idField],text:e[t._settings.textField],isDisabled:e[t._settings.disabledField]})}));this._settings.limitSelection>0?this.selectedItems=o.splice(0,this._settings.limitSelection):this.selectedItems=o}else this.selectedItems=[];this.onChangeCallback(e)},e.prototype.registerOnChange=function(e){this.onChangeCallback=e},e.prototype.registerOnTouched=function(e){this.onTouchedCallback=e},e.prototype.onTouched=function(){this.closeDropdown(),this.onTouchedCallback()},e.prototype.trackByFn=function(e,t){return t.id},e.prototype.isSelected=function(e){var t=!1;return this.selectedItems.forEach((function(i){e.id===i.id&&(t=!0)})),t},e.prototype.isLimitSelectionReached=function(){return this._settings.limitSelection===this.selectedItems.length},e.prototype.isAllItemsSelected=function(){var e=this.listFilterPipe.transform(this._data,this.filter),t=e.filter((function(e){return e.isDisabled})).length;return!((!this.data||0===this.data.length)&&this._settings.allowRemoteDataSearch)&&e.length===this.selectedItems.length+t},e.prototype.showButton=function(){return!this._settings.singleSelection&&!(this._settings.limitSelection>0)},e.prototype.itemShowRemaining=function(){return this.selectedItems.length-this._settings.itemsShowLimit},e.prototype.addSelected=function(e){this._settings.singleSelection?(this.selectedItems=[],this.selectedItems.push(e)):this.selectedItems.push(e),this.onChangeCallback(this.emittedValue(this.selectedItems)),this.onSelect.emit(this.emittedValue(e))},e.prototype.removeSelected=function(e){var t=this;this.selectedItems.forEach((function(i){e.id===i.id&&t.selectedItems.splice(t.selectedItems.indexOf(i),1)})),this.onChangeCallback(this.emittedValue(this.selectedItems)),this.onDeSelect.emit(this.emittedValue(e))},e.prototype.emittedValue=function(e){var t=this,i=[];if(Array.isArray(e))e.map((function(e){i.push(t.objectify(e))}));else if(e)return this.objectify(e);return i},e.prototype.objectify=function(e){if("object"===this._sourceDataType){var t={};return t[this._settings.idField]=e.id,t[this._settings.textField]=e.text,this._sourceDataFields.includes(this._settings.disabledField)&&(t[this._settings.disabledField]=e.isDisabled),t}return"number"===this._sourceDataType?Number(e.id):e.text},e.prototype.toggleDropdown=function(e){e.preventDefault(),this.disabled&&this._settings.singleSelection||(this._settings.defaultOpen=!this._settings.defaultOpen,this._settings.defaultOpen||this.onDropDownClose.emit())},e.prototype.closeDropdown=function(){this._settings.defaultOpen=!1,this._settings.clearSearchFilter&&(this.filter.text=""),this.onDropDownClose.emit()},e.prototype.toggleSelectAll=function(){if(this.disabled)return!1;this.isAllItemsSelected()?(this.selectedItems=[],this.onDeSelectAll.emit(this.emittedValue(this.selectedItems))):(this.selectedItems=this.listFilterPipe.transform(this._data,this.filter).filter((function(e){return!e.isDisabled})).slice(),this.onSelectAll.emit(this.emittedValue(this.selectedItems))),this.onChangeCallback(this.emittedValue(this.selectedItems))},e.prototype.getFields=function(e){var t=[];if("object"!=typeof e)return t;for(var i in e)t.push(i);return t},e.ctorParameters=function(){return[{type:l}]},n([t.Input()],e.prototype,"placeholder",null),n([t.Input()],e.prototype,"disabled",void 0),n([t.Input()],e.prototype,"settings",null),n([t.Input()],e.prototype,"data",null),n([t.Output("onFilterChange")],e.prototype,"onFilterChange",void 0),n([t.Output("onDropDownClose")],e.prototype,"onDropDownClose",void 0),n([t.Output("onSelect")],e.prototype,"onSelect",void 0),n([t.Output("onDeSelect")],e.prototype,"onDeSelect",void 0),n([t.Output("onSelectAll")],e.prototype,"onSelectAll",void 0),n([t.Output("onDeSelectAll")],e.prototype,"onDeSelectAll",void 0),n([t.HostListener("blur")],e.prototype,"onTouched",null),e=n([t.Component({selector:"ng-multiselect-dropdown",template:'
\n
\n \n {{_placeholder}}\n \n {{item.text}}\n x\n \n \n +{{itemShowRemaining()}}\n \n \n \n
\n \n
\n',providers:[r],changeDetection:t.ChangeDetectionStrategy.OnPush,styles:['.multiselect-dropdown{position:relative;width:100%;font-size:inherit;font-family:inherit}.multiselect-dropdown .dropdown-btn{display:inline-block;border:1px solid #adadad;width:100%;padding:6px 12px;margin-bottom:0;font-weight:400;line-height:1.52857143;text-align:left;vertical-align:middle;cursor:pointer;background-image:none;border-radius:4px}.multiselect-dropdown .dropdown-btn .selected-item{border:1px solid #337ab7;margin-right:4px;background:#337ab7;padding:0 5px;color:#fff;border-radius:2px;float:left;display:flex;max-width:100px}.multiselect-dropdown .dropdown-btn .selected-item span{overflow:hidden;text-overflow:ellipsis}.multiselect-dropdown .dropdown-btn .selected-item a{text-decoration:none}.multiselect-dropdown .dropdown-btn .selected-item:hover{box-shadow:1px 1px #959595}.multiselect-dropdown .dropdown-btn .dropdown-multiselect__caret{line-height:16px;display:block;position:absolute;box-sizing:border-box;width:40px;height:38px;right:1px;top:0;padding:4px 8px;margin:0;text-decoration:none;text-align:center;cursor:pointer;transition:transform .2s}.multiselect-dropdown .dropdown-btn .dropdown-multiselect__caret:before{position:relative;right:0;top:65%;color:#999;margin-top:4px;border-style:solid;border-width:8px 8px 0;border-color:#999 transparent;content:""}.multiselect-dropdown .dropdown-btn .dropdown-multiselect--active .dropdown-multiselect__caret{transform:rotateZ(180deg)}.multiselect-dropdown .disabled>span{background-color:#eceeef}.dropdown-list{position:absolute;padding-top:6px;width:100%;z-index:9999;border:1px solid #ccc;border-radius:3px;background:#fff;margin-top:10px;box-shadow:0 1px 5px #959595}.dropdown-list ul{padding:0;list-style:none;overflow:auto;margin:0}.dropdown-list li{padding:6px 10px;cursor:pointer;text-align:left}.dropdown-list .filter-textbox{border-bottom:1px solid #ccc;position:relative;padding:10px}.dropdown-list .filter-textbox input{border:0;width:100%;padding:0 0 0 26px}.dropdown-list .filter-textbox input:focus{outline:0}.multiselect-item-checkbox:hover{background-color:#e4e3e3}.multiselect-item-checkbox input[type=checkbox]{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.multiselect-item-checkbox input[type=checkbox]:focus+div:before,.multiselect-item-checkbox input[type=checkbox]:hover+div:before{border-color:#337ab7;background-color:#f2f2f2}.multiselect-item-checkbox input[type=checkbox]:active+div:before{transition-duration:0s}.multiselect-item-checkbox input[type=checkbox]+div{position:relative;padding-left:2em;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;margin:0;color:#000}.multiselect-item-checkbox input[type=checkbox]+div:before{box-sizing:content-box;content:"";color:#337ab7;position:absolute;top:50%;left:0;width:14px;height:14px;margin-top:-9px;border:2px solid #337ab7;text-align:center;transition:.4s}.multiselect-item-checkbox input[type=checkbox]+div:after{box-sizing:content-box;content:"";position:absolute;transform:scale(0);transform-origin:50%;transition:transform .2s ease-out;background-color:transparent;top:50%;left:4px;width:8px;height:3px;margin-top:-4px;border-style:solid;border-color:#fff;border-width:0 0 3px 3px;-o-border-image:none;border-image:none;transform:rotate(-45deg) scale(0)}.multiselect-item-checkbox input[type=checkbox]:disabled+div:before{border-color:#ccc}.multiselect-item-checkbox input[type=checkbox]:disabled:focus+div:before .multiselect-item-checkbox input[type=checkbox]:disabled:hover+div:before{background-color:inherit}.multiselect-item-checkbox input[type=checkbox]:disabled:checked+div:before{background-color:#ccc}.multiselect-item-checkbox input[type=checkbox]:checked+div:after{content:"";transition:transform .2s ease-out;transform:rotate(-45deg) scale(1)}.multiselect-item-checkbox input[type=checkbox]:checked+div:before{-webkit-animation:.2s ease-in borderscale;animation:.2s ease-in borderscale;background:#337ab7}@-webkit-keyframes borderscale{50%{box-shadow:0 0 0 2px #337ab7}}@keyframes borderscale{50%{box-shadow:0 0 0 2px #337ab7}}']})],e)}(),a=function(){function e(e){this._elementRef=e,this.clickOutside=new t.EventEmitter}return e.prototype.onClick=function(e,t){t&&(this._elementRef.nativeElement.contains(t)||this.clickOutside.emit(e))},e.ctorParameters=function(){return[{type:t.ElementRef}]},n([t.Output()],e.prototype,"clickOutside",void 0),n([t.HostListener("document:click",["$event","$event.target"])],e.prototype,"onClick",null),e=n([t.Directive({selector:"[clickOutside]"})],e)}(),p=function(){function e(){}var s;return s=e,e.forRoot=function(){return{ngModule:s}},e=s=n([t.NgModule({imports:[o.CommonModule,i.FormsModule],declarations:[d,a,l],providers:[l],exports:[d]})],e)}();e.MultiSelectComponent=d,e.NgMultiSelectDropDownModule=p,e.ɵa=r,e.ɵb=l,e.ɵc=a,Object.defineProperty(e,"__esModule",{value:!0})})); -//# sourceMappingURL=ng-multiselect-dropdown.umd.min.js.map \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/bundles/ng-multiselect-dropdown.umd.min.js.map b/frontend/node_modules/ng-multiselect-dropdown/bundles/ng-multiselect-dropdown.umd.min.js.map deleted file mode 100644 index c1e65534..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/bundles/ng-multiselect-dropdown.umd.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","ng://ng-multiselect-dropdown/multiselect.model.ts","ng://ng-multiselect-dropdown/list-filter.pipe.ts","ng://ng-multiselect-dropdown/multiselect.component.ts","ng://ng-multiselect-dropdown/click-outside.directive.ts","ng://ng-multiselect-dropdown/ng-multiselect-dropdown.module.ts"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","ListItem","source","this","id","text","isDisabled","ListFilterPipe","prototype","transform","items","filter","_this","item","applyFilter","toLowerCase","indexOf","toString","Pipe","name","pure","DROPDOWN_CONTROL_VALUE_ACCESSOR","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","MultiSelectComponent","multi","noop","listFilterPipe","_data","selectedItems","isDropdownOpen","_placeholder","_sourceDataType","_sourceDataFields","data","defaultSettings","singleSelection","idField","textField","disabledField","enableCheckAll","selectAllText","unSelectAllText","allowSearchFilter","limitSelection","clearSearchFilter","maxHeight","itemsShowLimit","searchPlaceholderText","noDataAvailablePlaceholderText","closeDropDownOnSelection","showSelectedItemsAtTop","defaultOpen","allowRemoteDataSearch","disabled","onFilterChange","EventEmitter","onDropDownClose","onSelect","onDeSelect","onSelectAll","onDeSelectAll","onTouchedCallback","onChangeCallback","value","_settings","assign","firstItem","getFields","map","onFilterTextChange","$event","emit","onItemClick","found","isSelected","allowAdd","removeSelected","addSelected","closeDropdown","writeValue","e","splice","registerOnChange","fn","registerOnTouched","onTouched","trackByFn","index","clickedItem","forEach","isLimitSelectionReached","isAllItemsSelected","filteredItems","itemDisabledCount","showButton","itemShowRemaining","push","emittedValue","itemSel","val","selected","Array","isArray","objectify","obj","includes","Number","toggleDropdown","evt","preventDefault","toggleSelectAll","slice","inputData","fields","prop","tslib_1.__decorate","Input","Output","HostListener","Component","selector","template","providers","changeDetection","ChangeDetectionStrategy","OnPush","ClickOutsideDirective","_elementRef","clickOutside","onClick","event","targetElement","nativeElement","contains","ElementRef","Directive","NgMultiSelectDropDownModule","forRoot","ngModule","NgMultiSelectDropDownModule_1","NgModule","imports","CommonModule","FormsModule","declarations","exports"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n","export interface IDropdownSettings {\n singleSelection?: boolean;\n idField?: string;\n textField?: string;\n disabledField?: string;\n enableCheckAll?: boolean;\n selectAllText?: string;\n unSelectAllText?: string;\n allowSearchFilter?: boolean;\n clearSearchFilter?: boolean;\n maxHeight?: number;\n itemsShowLimit?: number;\n limitSelection?: number;\n searchPlaceholderText?: string;\n noDataAvailablePlaceholderText?: string;\n closeDropDownOnSelection?: boolean;\n showSelectedItemsAtTop?: boolean;\n defaultOpen?: boolean;\n allowRemoteDataSearch?: boolean;\n}\n\nexport class ListItem {\n id: String | number;\n text: String | number;\n isDisabled?: boolean;\n\n public constructor(source: any) {\n if (typeof source === 'string' || typeof source === 'number') {\n this.id = this.text = source;\n this.isDisabled = false;\n }\n if (typeof source === 'object') {\n this.id = source.id;\n this.text = source.text;\n this.isDisabled = source.isDisabled;\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { ListItem } from './multiselect.model';\n\n@Pipe({\n name: 'multiSelectFilter',\n pure: false\n})\nexport class ListFilterPipe implements PipeTransform {\n transform(items: ListItem[], filter: ListItem): ListItem[] {\n if (!items || !filter) {\n return items;\n }\n return items.filter((item: ListItem) => this.applyFilter(item, filter));\n }\n\n applyFilter(item: ListItem, filter: ListItem): boolean {\n if (typeof item.text === 'string' && typeof filter.text === 'string') {\n return !(filter.text && item.text && item.text.toLowerCase().indexOf(filter.text.toLowerCase()) === -1);\n } else {\n return !(filter.text && item.text && item.text.toString().toLowerCase().indexOf(filter.text.toString().toLowerCase()) === -1);\n }\n }\n}\n","import { Component, HostListener, forwardRef, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef } from \"@angular/core\";\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from \"@angular/forms\";\nimport { ListItem, IDropdownSettings } from \"./multiselect.model\";\nimport { ListFilterPipe } from \"./list-filter.pipe\";\n\nexport const DROPDOWN_CONTROL_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MultiSelectComponent),\n multi: true\n};\nconst noop = () => {};\n\n@Component({\n selector: \"ng-multiselect-dropdown\",\n templateUrl: \"./multi-select.component.html\",\n styleUrls: [\"./multi-select.component.scss\"],\n providers: [DROPDOWN_CONTROL_VALUE_ACCESSOR],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MultiSelectComponent implements ControlValueAccessor {\n public _settings: IDropdownSettings;\n public _data: Array = [];\n public selectedItems: Array = [];\n public isDropdownOpen = true;\n _placeholder = \"Select\";\n private _sourceDataType = null; // to keep note of the source data type. could be array of string/number/object\n private _sourceDataFields: Array = []; // store source data fields names\n filter: ListItem = new ListItem(this.data);\n defaultSettings: IDropdownSettings = {\n singleSelection: false,\n idField: \"id\",\n textField: \"text\",\n disabledField: \"isDisabled\",\n enableCheckAll: true,\n selectAllText: \"Select All\",\n unSelectAllText: \"UnSelect All\",\n allowSearchFilter: false,\n limitSelection: -1,\n clearSearchFilter: true,\n maxHeight: 197,\n itemsShowLimit: 999999999999,\n searchPlaceholderText: \"Search\",\n noDataAvailablePlaceholderText: \"No data available\",\n closeDropDownOnSelection: false,\n showSelectedItemsAtTop: false,\n defaultOpen: false,\n allowRemoteDataSearch: false\n };\n\n @Input()\n public set placeholder(value: string) {\n if (value) {\n this._placeholder = value;\n } else {\n this._placeholder = \"Select\";\n }\n }\n @Input()\n disabled = false;\n\n @Input()\n public set settings(value: IDropdownSettings) {\n if (value) {\n this._settings = Object.assign(this.defaultSettings, value);\n } else {\n this._settings = Object.assign(this.defaultSettings);\n }\n }\n\n @Input()\n public set data(value: Array) {\n if (!value) {\n this._data = [];\n } else {\n const firstItem = value[0];\n this._sourceDataType = typeof firstItem;\n this._sourceDataFields = this.getFields(firstItem);\n this._data = value.map((item: any) =>\n typeof item === \"string\" || typeof item === \"number\"\n ? new ListItem(item)\n : new ListItem({\n id: item[this._settings.idField],\n text: item[this._settings.textField],\n isDisabled: item[this._settings.disabledField]\n })\n );\n }\n }\n\n @Output(\"onFilterChange\")\n onFilterChange: EventEmitter = new EventEmitter();\n @Output(\"onDropDownClose\")\n onDropDownClose: EventEmitter = new EventEmitter();\n\n @Output(\"onSelect\")\n onSelect: EventEmitter = new EventEmitter();\n\n @Output(\"onDeSelect\")\n onDeSelect: EventEmitter = new EventEmitter();\n\n @Output(\"onSelectAll\")\n onSelectAll: EventEmitter> = new EventEmitter>();\n\n @Output(\"onDeSelectAll\")\n onDeSelectAll: EventEmitter> = new EventEmitter>();\n\n private onTouchedCallback: () => void = noop;\n private onChangeCallback: (_: any) => void = noop;\n\n onFilterTextChange($event) {\n this.onFilterChange.emit($event);\n }\n\n constructor(private listFilterPipe:ListFilterPipe) {}\n\n onItemClick($event: any, item: ListItem) {\n if (this.disabled || item.isDisabled) {\n return false;\n }\n\n const found = this.isSelected(item);\n const allowAdd = this._settings.limitSelection === -1 || (this._settings.limitSelection > 0 && this.selectedItems.length < this._settings.limitSelection);\n if (!found) {\n if (allowAdd) {\n this.addSelected(item);\n }\n } else {\n this.removeSelected(item);\n }\n if (this._settings.singleSelection && this._settings.closeDropDownOnSelection) {\n this.closeDropdown();\n }\n }\n\n writeValue(value: any) {\n if (value !== undefined && value !== null && value.length > 0) {\n if (this._settings.singleSelection) {\n try {\n if (value.length >= 1) {\n const firstItem = value[0];\n this.selectedItems = [\n typeof firstItem === \"string\" || typeof firstItem === \"number\"\n ? new ListItem(firstItem)\n : new ListItem({\n id: firstItem[this._settings.idField],\n text: firstItem[this._settings.textField],\n isDisabled: firstItem[this._settings.disabledField]\n })\n ];\n }\n } catch (e) {\n // console.error(e.body.msg);\n }\n } else {\n const _data = value.map((item: any) =>\n typeof item === \"string\" || typeof item === \"number\"\n ? new ListItem(item)\n : new ListItem({\n id: item[this._settings.idField],\n text: item[this._settings.textField],\n isDisabled: item[this._settings.disabledField]\n })\n );\n if (this._settings.limitSelection > 0) {\n this.selectedItems = _data.splice(0, this._settings.limitSelection);\n } else {\n this.selectedItems = _data;\n }\n }\n } else {\n this.selectedItems = [];\n }\n this.onChangeCallback(value);\n }\n\n // From ControlValueAccessor interface\n registerOnChange(fn: any) {\n this.onChangeCallback = fn;\n }\n\n // From ControlValueAccessor interface\n registerOnTouched(fn: any) {\n this.onTouchedCallback = fn;\n }\n\n // Set touched on blur\n @HostListener(\"blur\")\n public onTouched() {\n this.closeDropdown();\n this.onTouchedCallback();\n }\n\n trackByFn(index, item) {\n return item.id;\n }\n\n isSelected(clickedItem: ListItem) {\n let found = false;\n this.selectedItems.forEach(item => {\n if (clickedItem.id === item.id) {\n found = true;\n }\n });\n return found;\n }\n\n isLimitSelectionReached(): boolean {\n return this._settings.limitSelection === this.selectedItems.length;\n }\n\n isAllItemsSelected(): boolean {\n // get disabld item count\n let filteredItems = this.listFilterPipe.transform(this._data,this.filter);\n const itemDisabledCount = filteredItems.filter(item => item.isDisabled).length;\n // take disabled items into consideration when checking\n if ((!this.data || this.data.length === 0) && this._settings.allowRemoteDataSearch) {\n return false;\n }\n return filteredItems.length === this.selectedItems.length + itemDisabledCount;\n }\n\n showButton(): boolean {\n if (!this._settings.singleSelection) {\n if (this._settings.limitSelection > 0) {\n return false;\n }\n // this._settings.enableCheckAll = this._settings.limitSelection === -1 ? true : false;\n return true; // !this._settings.singleSelection && this._settings.enableCheckAll && this._data.length > 0;\n } else {\n // should be disabled in single selection mode\n return false;\n }\n }\n\n itemShowRemaining(): number {\n return this.selectedItems.length - this._settings.itemsShowLimit;\n }\n\n addSelected(item: ListItem) {\n if (this._settings.singleSelection) {\n this.selectedItems = [];\n this.selectedItems.push(item);\n } else {\n this.selectedItems.push(item);\n }\n this.onChangeCallback(this.emittedValue(this.selectedItems));\n this.onSelect.emit(this.emittedValue(item));\n }\n\n removeSelected(itemSel: ListItem) {\n this.selectedItems.forEach(item => {\n if (itemSel.id === item.id) {\n this.selectedItems.splice(this.selectedItems.indexOf(item), 1);\n }\n });\n this.onChangeCallback(this.emittedValue(this.selectedItems));\n this.onDeSelect.emit(this.emittedValue(itemSel));\n }\n\n emittedValue(val: any): any {\n const selected = [];\n if (Array.isArray(val)) {\n val.map(item => {\n selected.push(this.objectify(item));\n });\n } else {\n if (val) {\n return this.objectify(val);\n }\n }\n return selected;\n }\n\n objectify(val: ListItem) {\n if (this._sourceDataType === 'object') {\n const obj = {};\n obj[this._settings.idField] = val.id;\n obj[this._settings.textField] = val.text;\n if (this._sourceDataFields.includes(this._settings.disabledField)) {\n obj[this._settings.disabledField] = val.isDisabled;\n }\n return obj;\n }\n if (this._sourceDataType === 'number') {\n return Number(val.id);\n } else {\n return val.text;\n }\n }\n\n toggleDropdown(evt) {\n evt.preventDefault();\n if (this.disabled && this._settings.singleSelection) {\n return;\n }\n this._settings.defaultOpen = !this._settings.defaultOpen;\n if (!this._settings.defaultOpen) {\n this.onDropDownClose.emit();\n }\n }\n\n closeDropdown() {\n this._settings.defaultOpen = false;\n // clear search text\n if (this._settings.clearSearchFilter) {\n this.filter.text = \"\";\n }\n this.onDropDownClose.emit();\n }\n\n toggleSelectAll() {\n if (this.disabled) {\n return false;\n }\n if (!this.isAllItemsSelected()) {\n // filter out disabled item first before slicing\n this.selectedItems = this.listFilterPipe.transform(this._data,this.filter).filter(item => !item.isDisabled).slice();\n this.onSelectAll.emit(this.emittedValue(this.selectedItems));\n } else {\n this.selectedItems = [];\n this.onDeSelectAll.emit(this.emittedValue(this.selectedItems));\n }\n this.onChangeCallback(this.emittedValue(this.selectedItems));\n }\n\n getFields(inputData) {\n const fields = [];\n if (typeof inputData !== \"object\") {\n return fields;\n }\n // tslint:disable-next-line:forin\n for (const prop in inputData) {\n fields.push(prop);\n }\n return fields;\n }\n}\n","import {Directive, ElementRef, Output, EventEmitter, HostListener} from '@angular/core';\n\n@Directive({\n selector: '[clickOutside]'\n})\nexport class ClickOutsideDirective {\n constructor(private _elementRef: ElementRef) {\n }\n\n @Output()\n public clickOutside = new EventEmitter();\n\n @HostListener('document:click', ['$event', '$event.target'])\n public onClick(event: MouseEvent, targetElement: HTMLElement): void {\n if (!targetElement) {\n return;\n }\n\n const clickedInside = this._elementRef.nativeElement.contains(targetElement);\n if (!clickedInside) {\n this.clickOutside.emit(event);\n }\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MultiSelectComponent } from './multiselect.component';\nimport { ClickOutsideDirective } from './click-outside.directive';\nimport { ListFilterPipe } from './list-filter.pipe';\n\n@NgModule({\n imports: [CommonModule, FormsModule],\n declarations: [MultiSelectComponent, ClickOutsideDirective, ListFilterPipe],\n providers: [ListFilterPipe],\n exports: [MultiSelectComponent]\n})\n\nexport class NgMultiSelectDropDownModule {\n static forRoot(): ModuleWithProviders {\n return {\n ngModule: NgMultiSelectDropDownModule\n };\n }\n}\n"]} \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/click-outside.directive.d.ts b/frontend/node_modules/ng-multiselect-dropdown/click-outside.directive.d.ts deleted file mode 100644 index 994b0ba1..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/click-outside.directive.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ElementRef, EventEmitter } from '@angular/core'; -import * as ɵngcc0 from '@angular/core'; -export declare class ClickOutsideDirective { - private _elementRef; - constructor(_elementRef: ElementRef); - clickOutside: EventEmitter; - onClick(event: MouseEvent, targetElement: HTMLElement): void; - static ɵfac: ɵngcc0.ɵɵFactoryDeclaration; - static ɵdir: ɵngcc0.ɵɵDirectiveDeclaration; -} - -//# sourceMappingURL=click-outside.directive.d.ts.map \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/esm2015/click-outside.directive.js b/frontend/node_modules/ng-multiselect-dropdown/esm2015/click-outside.directive.js deleted file mode 100644 index 3b14aa27..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/esm2015/click-outside.directive.js +++ /dev/null @@ -1,33 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Directive, ElementRef, Output, EventEmitter, HostListener } from '@angular/core'; -let ClickOutsideDirective = class ClickOutsideDirective { - constructor(_elementRef) { - this._elementRef = _elementRef; - this.clickOutside = new EventEmitter(); - } - onClick(event, targetElement) { - if (!targetElement) { - return; - } - const clickedInside = this._elementRef.nativeElement.contains(targetElement); - if (!clickedInside) { - this.clickOutside.emit(event); - } - } -}; -ClickOutsideDirective.ctorParameters = () => [ - { type: ElementRef } -]; -tslib_1.__decorate([ - Output() -], ClickOutsideDirective.prototype, "clickOutside", void 0); -tslib_1.__decorate([ - HostListener('document:click', ['$event', '$event.target']) -], ClickOutsideDirective.prototype, "onClick", null); -ClickOutsideDirective = tslib_1.__decorate([ - Directive({ - selector: '[clickOutside]' - }) -], ClickOutsideDirective); -export { ClickOutsideDirective }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpY2stb3V0c2lkZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1tdWx0aXNlbGVjdC1kcm9wZG93bi8iLCJzb3VyY2VzIjpbImNsaWNrLW91dHNpZGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUt4RixJQUFhLHFCQUFxQixHQUFsQyxNQUFhLHFCQUFxQjtJQUM5QixZQUFvQixXQUF1QjtRQUF2QixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUlwQyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7SUFIckQsQ0FBQztJQU1NLE9BQU8sQ0FBQyxLQUFpQixFQUFFLGFBQTBCO1FBQ3hELElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEIsT0FBTztTQUNWO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDakM7SUFDTCxDQUFDO0NBQ0osQ0FBQTs7WUFqQm9DLFVBQVU7O0FBSTNDO0lBREMsTUFBTSxFQUFFOzJEQUM0QztBQUdyRDtJQURDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztvREFVM0Q7QUFqQlEscUJBQXFCO0lBSGpDLFNBQVMsQ0FBQztRQUNQLFFBQVEsRUFBRSxnQkFBZ0I7S0FDN0IsQ0FBQztHQUNXLHFCQUFxQixDQWtCakM7U0FsQlkscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tjbGlja091dHNpZGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBDbGlja091dHNpZGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHtcbiAgICB9XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2xpY2tPdXRzaWRlID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50PigpO1xuXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCcsICckZXZlbnQudGFyZ2V0J10pXG4gICAgcHVibGljIG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGFyZ2V0RWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xpY2tlZEluc2lkZSA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXRFbGVtZW50KTtcbiAgICAgICAgaWYgKCFjbGlja2VkSW5zaWRlKSB7XG4gICAgICAgICAgICB0aGlzLmNsaWNrT3V0c2lkZS5lbWl0KGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/esm2015/list-filter.pipe.js b/frontend/node_modules/ng-multiselect-dropdown/esm2015/list-filter.pipe.js deleted file mode 100644 index 78725d57..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/esm2015/list-filter.pipe.js +++ /dev/null @@ -1,26 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Pipe } from '@angular/core'; -let ListFilterPipe = class ListFilterPipe { - transform(items, filter) { - if (!items || !filter) { - return items; - } - return items.filter((item) => this.applyFilter(item, filter)); - } - applyFilter(item, filter) { - if (typeof item.text === 'string' && typeof filter.text === 'string') { - return !(filter.text && item.text && item.text.toLowerCase().indexOf(filter.text.toLowerCase()) === -1); - } - else { - return !(filter.text && item.text && item.text.toString().toLowerCase().indexOf(filter.text.toString().toLowerCase()) === -1); - } - } -}; -ListFilterPipe = tslib_1.__decorate([ - Pipe({ - name: 'multiSelectFilter', - pure: false - }) -], ListFilterPipe); -export { ListFilterPipe }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1maWx0ZXIucGlwZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLW11bHRpc2VsZWN0LWRyb3Bkb3duLyIsInNvdXJjZXMiOlsibGlzdC1maWx0ZXIucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFRcEQsSUFBYSxjQUFjLEdBQTNCLE1BQWEsY0FBYztJQUN2QixTQUFTLENBQUMsS0FBaUIsRUFBRSxNQUFnQjtRQUN6QyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ25CLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBYyxFQUFFLE1BQWdCO1FBQ3hDLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQ2xFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMzRzthQUFNO1lBQ0gsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2pJO0lBQ0wsQ0FBQztDQUNKLENBQUE7QUFmWSxjQUFjO0lBSjFCLElBQUksQ0FBQztRQUNGLElBQUksRUFBRSxtQkFBbUI7UUFDekIsSUFBSSxFQUFFLEtBQUs7S0FDZCxDQUFDO0dBQ1csY0FBYyxDQWUxQjtTQWZZLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IExpc3RJdGVtIH0gZnJvbSAnLi9tdWx0aXNlbGVjdC5tb2RlbCc7XG5cbkBQaXBlKHtcbiAgICBuYW1lOiAnbXVsdGlTZWxlY3RGaWx0ZXInLFxuICAgIHB1cmU6IGZhbHNlXG59KVxuZXhwb3J0IGNsYXNzIExpc3RGaWx0ZXJQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gICAgdHJhbnNmb3JtKGl0ZW1zOiBMaXN0SXRlbVtdLCBmaWx0ZXI6IExpc3RJdGVtKTogTGlzdEl0ZW1bXSB7XG4gICAgICAgIGlmICghaXRlbXMgfHwgIWZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGl0ZW06IExpc3RJdGVtKSA9PiB0aGlzLmFwcGx5RmlsdGVyKGl0ZW0sIGZpbHRlcikpO1xuICAgIH1cblxuICAgIGFwcGx5RmlsdGVyKGl0ZW06IExpc3RJdGVtLCBmaWx0ZXI6IExpc3RJdGVtKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbS50ZXh0ID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgZmlsdGVyLnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gIShmaWx0ZXIudGV4dCAmJiBpdGVtLnRleHQgJiYgaXRlbS50ZXh0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihmaWx0ZXIudGV4dC50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICEoZmlsdGVyLnRleHQgJiYgaXRlbS50ZXh0ICYmIGl0ZW0udGV4dC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihmaWx0ZXIudGV4dC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpID09PSAtMSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0= \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/esm2015/multiselect.component.js b/frontend/node_modules/ng-multiselect-dropdown/esm2015/multiselect.component.js deleted file mode 100644 index a47bff5d..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/esm2015/multiselect.component.js +++ /dev/null @@ -1,346 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Component, HostListener, forwardRef, Input, Output, EventEmitter, ChangeDetectionStrategy } from "@angular/core"; -import { NG_VALUE_ACCESSOR } from "@angular/forms"; -import { ListItem } from "./multiselect.model"; -import { ListFilterPipe } from "./list-filter.pipe"; -export const DROPDOWN_CONTROL_VALUE_ACCESSOR = { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MultiSelectComponent), - multi: true -}; -const noop = () => { }; -const ɵ0 = noop; -let MultiSelectComponent = class MultiSelectComponent { - constructor(listFilterPipe) { - this.listFilterPipe = listFilterPipe; - this._data = []; - this.selectedItems = []; - this.isDropdownOpen = true; - this._placeholder = "Select"; - this._sourceDataType = null; // to keep note of the source data type. could be array of string/number/object - this._sourceDataFields = []; // store source data fields names - this.filter = new ListItem(this.data); - this.defaultSettings = { - singleSelection: false, - idField: "id", - textField: "text", - disabledField: "isDisabled", - enableCheckAll: true, - selectAllText: "Select All", - unSelectAllText: "UnSelect All", - allowSearchFilter: false, - limitSelection: -1, - clearSearchFilter: true, - maxHeight: 197, - itemsShowLimit: 999999999999, - searchPlaceholderText: "Search", - noDataAvailablePlaceholderText: "No data available", - closeDropDownOnSelection: false, - showSelectedItemsAtTop: false, - defaultOpen: false, - allowRemoteDataSearch: false - }; - this.disabled = false; - this.onFilterChange = new EventEmitter(); - this.onDropDownClose = new EventEmitter(); - this.onSelect = new EventEmitter(); - this.onDeSelect = new EventEmitter(); - this.onSelectAll = new EventEmitter(); - this.onDeSelectAll = new EventEmitter(); - this.onTouchedCallback = noop; - this.onChangeCallback = noop; - } - set placeholder(value) { - if (value) { - this._placeholder = value; - } - else { - this._placeholder = "Select"; - } - } - set settings(value) { - if (value) { - this._settings = Object.assign(this.defaultSettings, value); - } - else { - this._settings = Object.assign(this.defaultSettings); - } - } - set data(value) { - if (!value) { - this._data = []; - } - else { - const firstItem = value[0]; - this._sourceDataType = typeof firstItem; - this._sourceDataFields = this.getFields(firstItem); - this._data = value.map((item) => typeof item === "string" || typeof item === "number" - ? new ListItem(item) - : new ListItem({ - id: item[this._settings.idField], - text: item[this._settings.textField], - isDisabled: item[this._settings.disabledField] - })); - } - } - onFilterTextChange($event) { - this.onFilterChange.emit($event); - } - onItemClick($event, item) { - if (this.disabled || item.isDisabled) { - return false; - } - const found = this.isSelected(item); - const allowAdd = this._settings.limitSelection === -1 || (this._settings.limitSelection > 0 && this.selectedItems.length < this._settings.limitSelection); - if (!found) { - if (allowAdd) { - this.addSelected(item); - } - } - else { - this.removeSelected(item); - } - if (this._settings.singleSelection && this._settings.closeDropDownOnSelection) { - this.closeDropdown(); - } - } - writeValue(value) { - if (value !== undefined && value !== null && value.length > 0) { - if (this._settings.singleSelection) { - try { - if (value.length >= 1) { - const firstItem = value[0]; - this.selectedItems = [ - typeof firstItem === "string" || typeof firstItem === "number" - ? new ListItem(firstItem) - : new ListItem({ - id: firstItem[this._settings.idField], - text: firstItem[this._settings.textField], - isDisabled: firstItem[this._settings.disabledField] - }) - ]; - } - } - catch (e) { - // console.error(e.body.msg); - } - } - else { - const _data = value.map((item) => typeof item === "string" || typeof item === "number" - ? new ListItem(item) - : new ListItem({ - id: item[this._settings.idField], - text: item[this._settings.textField], - isDisabled: item[this._settings.disabledField] - })); - if (this._settings.limitSelection > 0) { - this.selectedItems = _data.splice(0, this._settings.limitSelection); - } - else { - this.selectedItems = _data; - } - } - } - else { - this.selectedItems = []; - } - this.onChangeCallback(value); - } - // From ControlValueAccessor interface - registerOnChange(fn) { - this.onChangeCallback = fn; - } - // From ControlValueAccessor interface - registerOnTouched(fn) { - this.onTouchedCallback = fn; - } - // Set touched on blur - onTouched() { - this.closeDropdown(); - this.onTouchedCallback(); - } - trackByFn(index, item) { - return item.id; - } - isSelected(clickedItem) { - let found = false; - this.selectedItems.forEach(item => { - if (clickedItem.id === item.id) { - found = true; - } - }); - return found; - } - isLimitSelectionReached() { - return this._settings.limitSelection === this.selectedItems.length; - } - isAllItemsSelected() { - // get disabld item count - let filteredItems = this.listFilterPipe.transform(this._data, this.filter); - const itemDisabledCount = filteredItems.filter(item => item.isDisabled).length; - // take disabled items into consideration when checking - if ((!this.data || this.data.length === 0) && this._settings.allowRemoteDataSearch) { - return false; - } - return filteredItems.length === this.selectedItems.length + itemDisabledCount; - } - showButton() { - if (!this._settings.singleSelection) { - if (this._settings.limitSelection > 0) { - return false; - } - // this._settings.enableCheckAll = this._settings.limitSelection === -1 ? true : false; - return true; // !this._settings.singleSelection && this._settings.enableCheckAll && this._data.length > 0; - } - else { - // should be disabled in single selection mode - return false; - } - } - itemShowRemaining() { - return this.selectedItems.length - this._settings.itemsShowLimit; - } - addSelected(item) { - if (this._settings.singleSelection) { - this.selectedItems = []; - this.selectedItems.push(item); - } - else { - this.selectedItems.push(item); - } - this.onChangeCallback(this.emittedValue(this.selectedItems)); - this.onSelect.emit(this.emittedValue(item)); - } - removeSelected(itemSel) { - this.selectedItems.forEach(item => { - if (itemSel.id === item.id) { - this.selectedItems.splice(this.selectedItems.indexOf(item), 1); - } - }); - this.onChangeCallback(this.emittedValue(this.selectedItems)); - this.onDeSelect.emit(this.emittedValue(itemSel)); - } - emittedValue(val) { - const selected = []; - if (Array.isArray(val)) { - val.map(item => { - selected.push(this.objectify(item)); - }); - } - else { - if (val) { - return this.objectify(val); - } - } - return selected; - } - objectify(val) { - if (this._sourceDataType === 'object') { - const obj = {}; - obj[this._settings.idField] = val.id; - obj[this._settings.textField] = val.text; - if (this._sourceDataFields.includes(this._settings.disabledField)) { - obj[this._settings.disabledField] = val.isDisabled; - } - return obj; - } - if (this._sourceDataType === 'number') { - return Number(val.id); - } - else { - return val.text; - } - } - toggleDropdown(evt) { - evt.preventDefault(); - if (this.disabled && this._settings.singleSelection) { - return; - } - this._settings.defaultOpen = !this._settings.defaultOpen; - if (!this._settings.defaultOpen) { - this.onDropDownClose.emit(); - } - } - closeDropdown() { - this._settings.defaultOpen = false; - // clear search text - if (this._settings.clearSearchFilter) { - this.filter.text = ""; - } - this.onDropDownClose.emit(); - } - toggleSelectAll() { - if (this.disabled) { - return false; - } - if (!this.isAllItemsSelected()) { - // filter out disabled item first before slicing - this.selectedItems = this.listFilterPipe.transform(this._data, this.filter).filter(item => !item.isDisabled).slice(); - this.onSelectAll.emit(this.emittedValue(this.selectedItems)); - } - else { - this.selectedItems = []; - this.onDeSelectAll.emit(this.emittedValue(this.selectedItems)); - } - this.onChangeCallback(this.emittedValue(this.selectedItems)); - } - getFields(inputData) { - const fields = []; - if (typeof inputData !== "object") { - return fields; - } - // tslint:disable-next-line:forin - for (const prop in inputData) { - fields.push(prop); - } - return fields; - } -}; -MultiSelectComponent.ctorParameters = () => [ - { type: ListFilterPipe } -]; -tslib_1.__decorate([ - Input() -], MultiSelectComponent.prototype, "placeholder", null); -tslib_1.__decorate([ - Input() -], MultiSelectComponent.prototype, "disabled", void 0); -tslib_1.__decorate([ - Input() -], MultiSelectComponent.prototype, "settings", null); -tslib_1.__decorate([ - Input() -], MultiSelectComponent.prototype, "data", null); -tslib_1.__decorate([ - Output("onFilterChange") -], MultiSelectComponent.prototype, "onFilterChange", void 0); -tslib_1.__decorate([ - Output("onDropDownClose") -], MultiSelectComponent.prototype, "onDropDownClose", void 0); -tslib_1.__decorate([ - Output("onSelect") -], MultiSelectComponent.prototype, "onSelect", void 0); -tslib_1.__decorate([ - Output("onDeSelect") -], MultiSelectComponent.prototype, "onDeSelect", void 0); -tslib_1.__decorate([ - Output("onSelectAll") -], MultiSelectComponent.prototype, "onSelectAll", void 0); -tslib_1.__decorate([ - Output("onDeSelectAll") -], MultiSelectComponent.prototype, "onDeSelectAll", void 0); -tslib_1.__decorate([ - HostListener("blur") -], MultiSelectComponent.prototype, "onTouched", null); -MultiSelectComponent = tslib_1.__decorate([ - Component({ - selector: "ng-multiselect-dropdown", - template: "
\n
\n \n {{_placeholder}}\n _settings.itemsShowLimit-1\">\n {{item.text}}\n x\n \n \n 0\">+{{itemShowRemaining()}}\n \n \n \n
\n
\n
    \n
  • 0 || _settings.allowRemoteDataSearch) && !_settings.singleSelection && _settings.enableCheckAll && _settings.limitSelection===-1\" class=\"multiselect-item-checkbox\" style=\"border-bottom: 1px solid #ccc;padding:10px\">\n \n
    {{!isAllItemsSelected() ? _settings.selectAllText : _settings.unSelectAllText}}
    \n
  • \n
  • 0 || _settings.allowRemoteDataSearch) && _settings.allowSearchFilter\">\n \n
  • \n
\n
    \n
  • \n \n
    {{item.text}}
    \n
  • \n
  • \n
    {{_settings.noDataAvailablePlaceholderText}}
    \n
  • \n
\n
\n
\n", - providers: [DROPDOWN_CONTROL_VALUE_ACCESSOR], - changeDetection: ChangeDetectionStrategy.OnPush, - styles: [".multiselect-dropdown{position:relative;width:100%;font-size:inherit;font-family:inherit}.multiselect-dropdown .dropdown-btn{display:inline-block;border:1px solid #adadad;width:100%;padding:6px 12px;margin-bottom:0;font-weight:400;line-height:1.52857143;text-align:left;vertical-align:middle;cursor:pointer;background-image:none;border-radius:4px}.multiselect-dropdown .dropdown-btn .selected-item{border:1px solid #337ab7;margin-right:4px;background:#337ab7;padding:0 5px;color:#fff;border-radius:2px;float:left;display:flex;max-width:100px}.multiselect-dropdown .dropdown-btn .selected-item span{overflow:hidden;text-overflow:ellipsis}.multiselect-dropdown .dropdown-btn .selected-item a{text-decoration:none}.multiselect-dropdown .dropdown-btn .selected-item:hover{box-shadow:1px 1px #959595}.multiselect-dropdown .dropdown-btn .dropdown-multiselect__caret{line-height:16px;display:block;position:absolute;box-sizing:border-box;width:40px;height:38px;right:1px;top:0;padding:4px 8px;margin:0;text-decoration:none;text-align:center;cursor:pointer;transition:transform .2s}.multiselect-dropdown .dropdown-btn .dropdown-multiselect__caret:before{position:relative;right:0;top:65%;color:#999;margin-top:4px;border-style:solid;border-width:8px 8px 0;border-color:#999 transparent;content:\"\"}.multiselect-dropdown .dropdown-btn .dropdown-multiselect--active .dropdown-multiselect__caret{transform:rotateZ(180deg)}.multiselect-dropdown .disabled>span{background-color:#eceeef}.dropdown-list{position:absolute;padding-top:6px;width:100%;z-index:9999;border:1px solid #ccc;border-radius:3px;background:#fff;margin-top:10px;box-shadow:0 1px 5px #959595}.dropdown-list ul{padding:0;list-style:none;overflow:auto;margin:0}.dropdown-list li{padding:6px 10px;cursor:pointer;text-align:left}.dropdown-list .filter-textbox{border-bottom:1px solid #ccc;position:relative;padding:10px}.dropdown-list .filter-textbox input{border:0;width:100%;padding:0 0 0 26px}.dropdown-list .filter-textbox input:focus{outline:0}.multiselect-item-checkbox:hover{background-color:#e4e3e3}.multiselect-item-checkbox input[type=checkbox]{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.multiselect-item-checkbox input[type=checkbox]:focus+div:before,.multiselect-item-checkbox input[type=checkbox]:hover+div:before{border-color:#337ab7;background-color:#f2f2f2}.multiselect-item-checkbox input[type=checkbox]:active+div:before{transition-duration:0s}.multiselect-item-checkbox input[type=checkbox]+div{position:relative;padding-left:2em;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;margin:0;color:#000}.multiselect-item-checkbox input[type=checkbox]+div:before{box-sizing:content-box;content:\"\";color:#337ab7;position:absolute;top:50%;left:0;width:14px;height:14px;margin-top:-9px;border:2px solid #337ab7;text-align:center;transition:.4s}.multiselect-item-checkbox input[type=checkbox]+div:after{box-sizing:content-box;content:\"\";position:absolute;transform:scale(0);transform-origin:50%;transition:transform .2s ease-out;background-color:transparent;top:50%;left:4px;width:8px;height:3px;margin-top:-4px;border-style:solid;border-color:#fff;border-width:0 0 3px 3px;-o-border-image:none;border-image:none;transform:rotate(-45deg) scale(0)}.multiselect-item-checkbox input[type=checkbox]:disabled+div:before{border-color:#ccc}.multiselect-item-checkbox input[type=checkbox]:disabled:focus+div:before .multiselect-item-checkbox input[type=checkbox]:disabled:hover+div:before{background-color:inherit}.multiselect-item-checkbox input[type=checkbox]:disabled:checked+div:before{background-color:#ccc}.multiselect-item-checkbox input[type=checkbox]:checked+div:after{content:\"\";transition:transform .2s ease-out;transform:rotate(-45deg) scale(1)}.multiselect-item-checkbox input[type=checkbox]:checked+div:before{-webkit-animation:.2s ease-in borderscale;animation:.2s ease-in borderscale;background:#337ab7}@-webkit-keyframes borderscale{50%{box-shadow:0 0 0 2px #337ab7}}@keyframes borderscale{50%{box-shadow:0 0 0 2px #337ab7}}"] - }) -], MultiSelectComponent); -export { MultiSelectComponent }; -export { ɵ0 }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlzZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctbXVsdGlzZWxlY3QtZHJvcGRvd24vIiwic291cmNlcyI6WyJtdWx0aXNlbGVjdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSx1QkFBdUIsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0ksT0FBTyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxRQUFRLEVBQXFCLE1BQU0scUJBQXFCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBELE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFRO0lBQ2xELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztJQUNuRCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFDRixNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7O0FBU3RCLElBQWEsb0JBQW9CLEdBQWpDLE1BQWEsb0JBQW9CO0lBOEYvQixZQUFvQixjQUE2QjtRQUE3QixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQTVGMUMsVUFBSyxHQUFvQixFQUFFLENBQUM7UUFDNUIsa0JBQWEsR0FBb0IsRUFBRSxDQUFDO1FBQ3BDLG1CQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzdCLGlCQUFZLEdBQUcsUUFBUSxDQUFDO1FBQ2hCLG9CQUFlLEdBQUcsSUFBSSxDQUFDLENBQUMsK0VBQStFO1FBQ3ZHLHNCQUFpQixHQUFrQixFQUFFLENBQUMsQ0FBQyxpQ0FBaUM7UUFDaEYsV0FBTSxHQUFhLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMs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RyxFQUFFLENBQUM7UUFDbEIsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUU7WUFDakMsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUNELGlDQUFpQztRQUNqQyxLQUFLLE1BQU0sSUFBSSxJQUFJLFNBQVMsRUFBRTtZQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25CO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGLENBQUE7O1lBL05vQyxjQUFjOztBQS9EakQ7SUFEQyxLQUFLLEVBQUU7dURBT1A7QUFFRDtJQURDLEtBQUssRUFBRTtzREFDUztBQUdqQjtJQURDLEtBQUssRUFBRTtvREFPUDtBQUdEO0lBREMsS0FBSyxFQUFFO2dEQWtCUDtBQUdEO0lBREMsTUFBTSxDQUFDLGdCQUFnQixDQUFDOzREQUN3QztBQUVqRTtJQURDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQzs2REFDd0M7QUFHbEU7SUFEQyxNQUFNLENBQUMsVUFBVSxDQUFDO3NEQUN3QztBQUczRDtJQURDLE1BQU0sQ0FBQyxZQUFZLENBQUM7d0RBQ3dDO0FBRzdEO0lBREMsTUFBTSxDQUFDLGFBQWEsQ0FBQzt5REFDc0Q7QUFHNUU7SUFEQyxNQUFNLENBQUMsZUFBZSxDQUFDOzJEQUNzRDtBQW1GOUU7SUFEQyxZQUFZLENBQUMsTUFBTSxDQUFDO3FEQUlwQjtBQTNLVSxvQkFBb0I7SUFQaEMsU0FBUyxDQUFDO1FBQ1QsUUFBUSxFQUFFLHlCQUF5QjtRQUNuQyxrbUZBQTRDO1FBRTVDLFNBQVMsRUFBRSxDQUFDLCtCQUErQixDQUFDO1FBQzVDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOztLQUNoRCxDQUFDO0dBQ1csb0JBQW9CLENBNlRoQztTQTdUWSxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgZm9yd2FyZFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBMaXN0SXRlbSwgSURyb3Bkb3duU2V0dGluZ3MgfSBmcm9tIFwiLi9tdWx0aXNlbGVjdC5tb2RlbFwiO1xuaW1wb3J0IHsgTGlzdEZpbHRlclBpcGUgfSBmcm9tIFwiLi9saXN0LWZpbHRlci5waXBlXCI7XG5cbmV4cG9ydCBjb25zdCBEUk9QRE9XTl9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SOiBhbnkgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNdWx0aVNlbGVjdENvbXBvbmVudCksXG4gIG11bHRpOiB0cnVlXG59O1xuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwibmctbXVsdGlzZWxlY3QtZHJvcGRvd25cIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9tdWx0aS1zZWxlY3QuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL211bHRpLXNlbGVjdC5jb21wb25lbnQuc2Nzc1wiXSxcbiAgcHJvdmlkZXJzOiBbRFJPUERPV05fQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpU2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBwdWJsaWMgX3NldHRpbmdzOiBJRHJvcGRvd25TZXR0aW5ncztcbiAgcHVibGljIF9kYXRhOiBBcnJheTxMaXN0SXRlbT4gPSBbXTtcbiAgcHVibGljIHNlbGVjdGVkSXRlbXM6IEFycmF5PExpc3RJdGVtPiA9IFtdO1xuICBwdWJsaWMgaXNEcm9wZG93bk9wZW4gPSB0cnVlO1xuICBfcGxhY2Vob2xkZXIgPSBcIlNlbGVjdFwiO1xuICBwcml2YXRlIF9zb3VyY2VEYXRhVHlwZSA9IG51bGw7IC8vIHRvIGtlZXAgbm90ZSBvZiB0aGUgc291cmNlIGRhdGEgdHlwZS4gY291bGQgYmUgYXJyYXkgb2Ygc3RyaW5nL251bWJlci9vYmplY3RcbiAgcHJpdmF0ZSBfc291cmNlRGF0YUZpZWxkczogQXJyYXk8U3RyaW5nPiA9IFtdOyAvLyBzdG9yZSBzb3VyY2UgZGF0YSBmaWVsZHMgbmFtZXNcbiAgZmlsdGVyOiBMaXN0SXRlbSA9IG5ldyBMaXN0SXRlbSh0aGlzLmRhdGEpO1xuICBkZWZhdWx0U2V0dGluZ3M6IElEcm9wZG93blNldHRpbmdzID0ge1xuICAgIHNpbmdsZVNlbGVjdGlvbjogZmFsc2UsXG4gICAgaWRGaWVsZDogXCJpZFwiLFxuICAgIHRleHRGaWVsZDogXCJ0ZXh0XCIsXG4gICAgZGlzYWJsZWRGaWVsZDogXCJpc0Rpc2FibGVkXCIsXG4gICAgZW5hYmxlQ2hlY2tBbGw6IHRydWUsXG4gICAgc2VsZWN0QWxsVGV4dDogXCJTZWxlY3QgQWxsXCIsXG4gICAgdW5TZWxlY3RBbGxUZXh0OiBcIlVuU2VsZWN0IEFsbFwiLFxuICAgIGFsbG93U2VhcmNoRmlsdGVyOiBmYWxzZSxcbiAgICBsaW1pdFNlbGVjdGlvbjogLTEsXG4gICAgY2xlYXJTZWFyY2hGaWx0ZXI6IHRydWUsXG4gICAgbWF4SGVpZ2h0OiAxOTcsXG4gICAgaXRlbXNTaG93TGltaXQ6IDk5OTk5OTk5OTk5OSxcbiAgICBzZWFyY2hQbGFjZWhvbGRlclRleHQ6IFwiU2VhcmNoXCIsXG4gICAgbm9EYXRhQXZhaWxhYmxlUGxhY2Vob2xkZXJUZXh0OiBcIk5vIGRhdGEgYXZhaWxhYmxlXCIsXG4gICAgY2xvc2VEcm9wRG93bk9uU2VsZWN0aW9uOiBmYWxzZSxcbiAgICBzaG93U2VsZWN0ZWRJdGVtc0F0VG9wOiBmYWxzZSxcbiAgICBkZWZhdWx0T3BlbjogZmFsc2UsXG4gICAgYWxsb3dSZW1vdGVEYXRhU2VhcmNoOiBmYWxzZVxuICB9O1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSBcIlNlbGVjdFwiO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2V0dGluZ3ModmFsdWU6IElEcm9wZG93blNldHRpbmdzKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLl9zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24odGhpcy5kZWZhdWx0U2V0dGluZ3MsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHRoaXMuZGVmYXVsdFNldHRpbmdzKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRhdGEodmFsdWU6IEFycmF5PGFueT4pIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLl9kYXRhID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpcnN0SXRlbSA9IHZhbHVlWzBdO1xuICAgICAgdGhpcy5fc291cmNlRGF0YVR5cGUgPSB0eXBlb2YgZmlyc3RJdGVtO1xuICAgICAgdGhpcy5fc291cmNlRGF0YUZpZWxkcyA9IHRoaXMuZ2V0RmllbGRzKGZpcnN0SXRlbSk7XG4gICAgICB0aGlzLl9kYXRhID0gdmFsdWUubWFwKChpdGVtOiBhbnkpID0+XG4gICAgICAgIHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBpdGVtID09PSBcIm51bWJlclwiXG4gICAgICAgICAgPyBuZXcgTGlzdEl0ZW0oaXRlbSlcbiAgICAgICAgICA6IG5ldyBMaXN0SXRlbSh7XG4gICAgICAgICAgICAgIGlkOiBpdGVtW3RoaXMuX3NldHRpbmdzLmlkRmllbGRdLFxuICAgICAgICAgICAgICB0ZXh0OiBpdGVtW3RoaXMuX3NldHRpbmdzLnRleHRGaWVsZF0sXG4gICAgICAgICAgICAgIGlzRGlzYWJsZWQ6IGl0ZW1bdGhpcy5fc2V0dGluZ3MuZGlzYWJsZWRGaWVsZF1cbiAgICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIEBPdXRwdXQoXCJvbkZpbHRlckNoYW5nZVwiKVxuICBvbkZpbHRlckNoYW5nZTogRXZlbnRFbWl0dGVyPExpc3RJdGVtPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KFwib25Ecm9wRG93bkNsb3NlXCIpXG4gIG9uRHJvcERvd25DbG9zZTogRXZlbnRFbWl0dGVyPExpc3RJdGVtPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBPdXRwdXQoXCJvblNlbGVjdFwiKVxuICBvblNlbGVjdDogRXZlbnRFbWl0dGVyPExpc3RJdGVtPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBPdXRwdXQoXCJvbkRlU2VsZWN0XCIpXG4gIG9uRGVTZWxlY3Q6IEV2ZW50RW1pdHRlcjxMaXN0SXRlbT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAT3V0cHV0KFwib25TZWxlY3RBbGxcIilcbiAgb25TZWxlY3RBbGw6IEV2ZW50RW1pdHRlcjxBcnJheTxMaXN0SXRlbT4+ID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxhbnk+PigpO1xuXG4gIEBPdXRwdXQoXCJvbkRlU2VsZWN0QWxsXCIpXG4gIG9uRGVTZWxlY3RBbGw6IEV2ZW50RW1pdHRlcjxBcnJheTxMaXN0SXRlbT4+ID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxhbnk+PigpO1xuXG4gIHByaXZhdGUgb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIG9uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuXG4gIG9uRmlsdGVyVGV4dENoYW5nZSgkZXZlbnQpIHtcbiAgICB0aGlzLm9uRmlsdGVyQ2hhbmdlLmVtaXQoJGV2ZW50KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbGlzdEZpbHRlclBpcGU6TGlzdEZpbHRlclBpcGUpIHt9XG5cbiAgb25JdGVtQ2xpY2soJGV2ZW50OiBhbnksIGl0ZW06IExpc3RJdGVtKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgaXRlbS5pc0Rpc2FibGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZm91bmQgPSB0aGlzLmlzU2VsZWN0ZWQoaXRlbSk7XG4gICAgY29uc3QgYWxsb3dBZGQgPSB0aGlzLl9zZXR0aW5ncy5saW1pdFNlbGVjdGlvbiA9PT0gLTEgfHwgKHRoaXMuX3NldHRpbmdzLmxpbWl0U2VsZWN0aW9uID4gMCAmJiB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoIDwgdGhpcy5fc2V0dGluZ3MubGltaXRTZWxlY3Rpb24pO1xuICAgIGlmICghZm91bmQpIHtcbiAgICAgIGlmIChhbGxvd0FkZCkge1xuICAgICAgICB0aGlzLmFkZFNlbGVjdGVkKGl0ZW0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZVNlbGVjdGVkKGl0ZW0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2V0dGluZ3Muc2luZ2xlU2VsZWN0aW9uICYmIHRoaXMuX3NldHRpbmdzLmNsb3NlRHJvcERvd25PblNlbGVjdGlvbikge1xuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgfVxuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLnNpbmdsZVNlbGVjdGlvbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RJdGVtID0gdmFsdWVbMF07XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXG4gICAgICAgICAgICAgIHR5cGVvZiBmaXJzdEl0ZW0gPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGZpcnN0SXRlbSA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgICAgICAgID8gbmV3IExpc3RJdGVtKGZpcnN0SXRlbSlcbiAgICAgICAgICAgICAgICA6IG5ldyBMaXN0SXRlbSh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBmaXJzdEl0ZW1bdGhpcy5fc2V0dGluZ3MuaWRGaWVsZF0sXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGZpcnN0SXRlbVt0aGlzLl9zZXR0aW5ncy50ZXh0RmllbGRdLFxuICAgICAgICAgICAgICAgICAgICBpc0Rpc2FibGVkOiBmaXJzdEl0ZW1bdGhpcy5fc2V0dGluZ3MuZGlzYWJsZWRGaWVsZF1cbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoZS5ib2R5Lm1zZyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IF9kYXRhID0gdmFsdWUubWFwKChpdGVtOiBhbnkpID0+XG4gICAgICAgICAgdHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgID8gbmV3IExpc3RJdGVtKGl0ZW0pXG4gICAgICAgICAgICA6IG5ldyBMaXN0SXRlbSh7XG4gICAgICAgICAgICAgICAgaWQ6IGl0ZW1bdGhpcy5fc2V0dGluZ3MuaWRGaWVsZF0sXG4gICAgICAgICAgICAgICAgdGV4dDogaXRlbVt0aGlzLl9zZXR0aW5ncy50ZXh0RmllbGRdLFxuICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQ6IGl0ZW1bdGhpcy5fc2V0dGluZ3MuZGlzYWJsZWRGaWVsZF1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLmxpbWl0U2VsZWN0aW9uID4gMCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IF9kYXRhLnNwbGljZSgwLCB0aGlzLl9zZXR0aW5ncy5saW1pdFNlbGVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gX2RhdGE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG4gICAgfVxuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayh2YWx1ZSk7XG4gIH1cblxuICAvLyBGcm9tIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZVxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIC8vIEZyb20gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gIH1cblxuICAvLyBTZXQgdG91Y2hlZCBvbiBibHVyXG4gIEBIb3N0TGlzdGVuZXIoXCJibHVyXCIpXG4gIHB1YmxpYyBvblRvdWNoZWQoKSB7XG4gICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjaygpO1xuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4LCBpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0uaWQ7XG4gIH1cblxuICBpc1NlbGVjdGVkKGNsaWNrZWRJdGVtOiBMaXN0SXRlbSkge1xuICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgaWYgKGNsaWNrZWRJdGVtLmlkID09PSBpdGVtLmlkKSB7XG4gICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBpc0xpbWl0U2VsZWN0aW9uUmVhY2hlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3MubGltaXRTZWxlY3Rpb24gPT09IHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGg7XG4gIH1cblxuICBpc0FsbEl0ZW1zU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgLy8gZ2V0IGRpc2FibGQgaXRlbSBjb3VudFxuICAgIGxldCBmaWx0ZXJlZEl0ZW1zID0gdGhpcy5saXN0RmlsdGVyUGlwZS50cmFuc2Zvcm0odGhpcy5fZGF0YSx0aGlzLmZpbHRlcik7XG4gICAgY29uc3QgaXRlbURpc2FibGVkQ291bnQgPSBmaWx0ZXJlZEl0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uaXNEaXNhYmxlZCkubGVuZ3RoO1xuICAgIC8vIHRha2UgZGlzYWJsZWQgaXRlbXMgaW50byBjb25zaWRlcmF0aW9uIHdoZW4gY2hlY2tpbmdcbiAgICBpZiAoKCF0aGlzLmRhdGEgfHwgdGhpcy5kYXRhLmxlbmd0aCA9PT0gMCkgJiYgdGhpcy5fc2V0dGluZ3MuYWxsb3dSZW1vdGVEYXRhU2VhcmNoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBmaWx0ZXJlZEl0ZW1zLmxlbmd0aCA9PT0gdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCArIGl0ZW1EaXNhYmxlZENvdW50O1xuICB9XG5cbiAgc2hvd0J1dHRvbigpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX3NldHRpbmdzLnNpbmdsZVNlbGVjdGlvbikge1xuICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLmxpbWl0U2VsZWN0aW9uID4gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyB0aGlzLl9zZXR0aW5ncy5lbmFibGVDaGVja0FsbCA9IHRoaXMuX3NldHRpbmdzLmxpbWl0U2VsZWN0aW9uID09PSAtMSA/IHRydWUgOiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlOyAvLyAhdGhpcy5fc2V0dGluZ3Muc2luZ2xlU2VsZWN0aW9uICYmIHRoaXMuX3NldHRpbmdzLmVuYWJsZUNoZWNrQWxsICYmIHRoaXMuX2RhdGEubGVuZ3RoID4gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc2hvdWxkIGJlIGRpc2FibGVkIGluIHNpbmdsZSBzZWxlY3Rpb24gbW9kZVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGl0ZW1TaG93UmVtYWluaW5nKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggLSB0aGlzLl9zZXR0aW5ncy5pdGVtc1Nob3dMaW1pdDtcbiAgfVxuXG4gIGFkZFNlbGVjdGVkKGl0ZW06IExpc3RJdGVtKSB7XG4gICAgaWYgKHRoaXMuX3NldHRpbmdzLnNpbmdsZVNlbGVjdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMucHVzaChpdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgfVxuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayh0aGlzLmVtaXR0ZWRWYWx1ZSh0aGlzLnNlbGVjdGVkSXRlbXMpKTtcbiAgICB0aGlzLm9uU2VsZWN0LmVtaXQodGhpcy5lbWl0dGVkVmFsdWUoaXRlbSkpO1xuICB9XG5cbiAgcmVtb3ZlU2VsZWN0ZWQoaXRlbVNlbDogTGlzdEl0ZW0pIHtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmIChpdGVtU2VsLmlkID09PSBpdGVtLmlkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5zcGxpY2UodGhpcy5zZWxlY3RlZEl0ZW1zLmluZGV4T2YoaXRlbSksIDEpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayh0aGlzLmVtaXR0ZWRWYWx1ZSh0aGlzLnNlbGVjdGVkSXRlbXMpKTtcbiAgICB0aGlzLm9uRGVTZWxlY3QuZW1pdCh0aGlzLmVtaXR0ZWRWYWx1ZShpdGVtU2VsKSk7XG4gIH1cblxuICBlbWl0dGVkVmFsdWUodmFsOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdmFsLm1hcChpdGVtID0+IHtcbiAgICAgICAgc2VsZWN0ZWQucHVzaCh0aGlzLm9iamVjdGlmeShpdGVtKSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHZhbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYmplY3RpZnkodmFsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGVkO1xuICB9XG5cbiAgb2JqZWN0aWZ5KHZhbDogTGlzdEl0ZW0pIHtcbiAgICBpZiAodGhpcy5fc291cmNlRGF0YVR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBvYmogPSB7fTtcbiAgICAgIG9ialt0aGlzLl9zZXR0aW5ncy5pZEZpZWxkXSA9IHZhbC5pZDtcbiAgICAgIG9ialt0aGlzLl9zZXR0aW5ncy50ZXh0RmllbGRdID0gdmFsLnRleHQ7XG4gICAgICBpZiAodGhpcy5fc291cmNlRGF0YUZpZWxkcy5pbmNsdWRlcyh0aGlzLl9zZXR0aW5ncy5kaXNhYmxlZEZpZWxkKSkge1xuICAgICAgICBvYmpbdGhpcy5fc2V0dGluZ3MuZGlzYWJsZWRGaWVsZF0gPSB2YWwuaXNEaXNhYmxlZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zb3VyY2VEYXRhVHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBOdW1iZXIodmFsLmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZhbC50ZXh0O1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZURyb3Bkb3duKGV2dCkge1xuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICh0aGlzLmRpc2FibGVkICYmIHRoaXMuX3NldHRpbmdzLnNpbmdsZVNlbGVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZXR0aW5ncy5kZWZhdWx0T3BlbiA9ICF0aGlzLl9zZXR0aW5ncy5kZWZhdWx0T3BlbjtcbiAgICBpZiAoIXRoaXMuX3NldHRpbmdzLmRlZmF1bHRPcGVuKSB7XG4gICAgICB0aGlzLm9uRHJvcERvd25DbG9zZS5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgY2xvc2VEcm9wZG93bigpIHtcbiAgICB0aGlzLl9zZXR0aW5ncy5kZWZhdWx0T3BlbiA9IGZhbHNlO1xuICAgIC8vIGNsZWFyIHNlYXJjaCB0ZXh0XG4gICAgaWYgKHRoaXMuX3NldHRpbmdzLmNsZWFyU2VhcmNoRmlsdGVyKSB7XG4gICAgICB0aGlzLmZpbHRlci50ZXh0ID0gXCJcIjtcbiAgICB9XG4gICAgdGhpcy5vbkRyb3BEb3duQ2xvc2UuZW1pdCgpO1xuICB9XG5cbiAgdG9nZ2xlU2VsZWN0QWxsKCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0FsbEl0ZW1zU2VsZWN0ZWQoKSkge1xuICAgICAgLy8gZmlsdGVyIG91dCBkaXNhYmxlZCBpdGVtIGZpcnN0IGJlZm9yZSBzbGljaW5nXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSB0aGlzLmxpc3RGaWx0ZXJQaXBlLnRyYW5zZm9ybSh0aGlzLl9kYXRhLHRoaXMuZmlsdGVyKS5maWx0ZXIoaXRlbSA9PiAhaXRlbS5pc0Rpc2FibGVkKS5zbGljZSgpO1xuICAgICAgdGhpcy5vblNlbGVjdEFsbC5lbWl0KHRoaXMuZW1pdHRlZFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICAgIHRoaXMub25EZVNlbGVjdEFsbC5lbWl0KHRoaXMuZW1pdHRlZFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtcykpO1xuICAgIH1cbiAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sodGhpcy5lbWl0dGVkVmFsdWUodGhpcy5zZWxlY3RlZEl0ZW1zKSk7XG4gIH1cblxuICBnZXRGaWVsZHMoaW5wdXREYXRhKSB7XG4gICAgY29uc3QgZmllbGRzID0gW107XG4gICAgaWYgKHR5cGVvZiBpbnB1dERhdGEgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgfVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpmb3JpblxuICAgIGZvciAoY29uc3QgcHJvcCBpbiBpbnB1dERhdGEpIHtcbiAgICAgIGZpZWxkcy5wdXNoKHByb3ApO1xuICAgIH1cbiAgICByZXR1cm4gZmllbGRzO1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/esm2015/multiselect.model.js b/frontend/node_modules/ng-multiselect-dropdown/esm2015/multiselect.model.js deleted file mode 100644 index 9b5d58f4..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/esm2015/multiselect.model.js +++ /dev/null @@ -1,14 +0,0 @@ -export class ListItem { - constructor(source) { - if (typeof source === 'string' || typeof source === 'number') { - this.id = this.text = source; - this.isDisabled = false; - } - if (typeof source === 'object') { - this.id = source.id; - this.text = source.text; - this.isDisabled = source.isDisabled; - } - } -} -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlzZWxlY3QubW9kZWwuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1tdWx0aXNlbGVjdC1kcm9wZG93bi8iLCJzb3VyY2VzIjpbIm11bHRpc2VsZWN0Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXFCQSxNQUFNLE9BQU8sUUFBUTtJQUtuQixZQUFtQixNQUFXO1FBQzVCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtZQUM1RCxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO1lBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDOUIsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztZQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7U0FDckM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIElEcm9wZG93blNldHRpbmdzIHtcbiAgc2luZ2xlU2VsZWN0aW9uPzogYm9vbGVhbjtcbiAgaWRGaWVsZD86IHN0cmluZztcbiAgdGV4dEZpZWxkPzogc3RyaW5nO1xuICBkaXNhYmxlZEZpZWxkPzogc3RyaW5nO1xuICBlbmFibGVDaGVja0FsbD86IGJvb2xlYW47XG4gIHNlbGVjdEFsbFRleHQ/OiBzdHJpbmc7XG4gIHVuU2VsZWN0QWxsVGV4dD86IHN0cmluZztcbiAgYWxsb3dTZWFyY2hGaWx0ZXI/OiBib29sZWFuO1xuICBjbGVhclNlYXJjaEZpbHRlcj86IGJvb2xlYW47XG4gIG1heEhlaWdodD86IG51bWJlcjtcbiAgaXRlbXNTaG93TGltaXQ/OiBudW1iZXI7XG4gIGxpbWl0U2VsZWN0aW9uPzogbnVtYmVyO1xuICBzZWFyY2hQbGFjZWhvbGRlclRleHQ/OiBzdHJpbmc7XG4gIG5vRGF0YUF2YWlsYWJsZVBsYWNlaG9sZGVyVGV4dD86IHN0cmluZztcbiAgY2xvc2VEcm9wRG93bk9uU2VsZWN0aW9uPzogYm9vbGVhbjtcbiAgc2hvd1NlbGVjdGVkSXRlbXNBdFRvcD86IGJvb2xlYW47XG4gIGRlZmF1bHRPcGVuPzogYm9vbGVhbjtcbiAgYWxsb3dSZW1vdGVEYXRhU2VhcmNoPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIExpc3RJdGVtIHtcbiAgaWQ6IFN0cmluZyB8IG51bWJlcjtcbiAgdGV4dDogU3RyaW5nIHwgbnVtYmVyO1xuICBpc0Rpc2FibGVkPzogYm9vbGVhbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc291cmNlOiBhbnkpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHNvdXJjZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuaWQgPSB0aGlzLnRleHQgPSBzb3VyY2U7XG4gICAgICB0aGlzLmlzRGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLmlkID0gc291cmNlLmlkO1xuICAgICAgdGhpcy50ZXh0ID0gc291cmNlLnRleHQ7XG4gICAgICB0aGlzLmlzRGlzYWJsZWQgPSBzb3VyY2UuaXNEaXNhYmxlZDtcbiAgICB9XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/esm2015/ng-multiselect-dropdown.js b/frontend/node_modules/ng-multiselect-dropdown/esm2015/ng-multiselect-dropdown.js deleted file mode 100644 index 76cc82ff..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/esm2015/ng-multiselect-dropdown.js +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Generated bundle index. Do not edit. - */ -export * from './public_api'; -export { ClickOutsideDirective as ɵc } from './click-outside.directive'; -export { ListFilterPipe as ɵb } from './list-filter.pipe'; -export { DROPDOWN_CONTROL_VALUE_ACCESSOR as ɵa } from './multiselect.component'; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctbXVsdGlzZWxlY3QtZHJvcGRvd24uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1tdWx0aXNlbGVjdC1kcm9wZG93bi8iLCJzb3VyY2VzIjpbIm5nLW11bHRpc2VsZWN0LWRyb3Bkb3duLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUM7QUFFN0IsT0FBTyxFQUFDLHFCQUFxQixJQUFJLEVBQUUsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxjQUFjLElBQUksRUFBRSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFDLCtCQUErQixJQUFJLEVBQUUsRUFBQyxNQUFNLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpY19hcGknO1xuXG5leHBvcnQge0NsaWNrT3V0c2lkZURpcmVjdGl2ZSBhcyDJtWN9IGZyb20gJy4vY2xpY2stb3V0c2lkZS5kaXJlY3RpdmUnO1xuZXhwb3J0IHtMaXN0RmlsdGVyUGlwZSBhcyDJtWJ9IGZyb20gJy4vbGlzdC1maWx0ZXIucGlwZSc7XG5leHBvcnQge0RST1BET1dOX0NPTlRST0xfVkFMVUVfQUNDRVNTT1IgYXMgybVhfSBmcm9tICcuL211bHRpc2VsZWN0LmNvbXBvbmVudCc7Il19 \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/esm2015/ng-multiselect-dropdown.module.js b/frontend/node_modules/ng-multiselect-dropdown/esm2015/ng-multiselect-dropdown.module.js deleted file mode 100644 index a6165da0..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/esm2015/ng-multiselect-dropdown.module.js +++ /dev/null @@ -1,25 +0,0 @@ -var NgMultiSelectDropDownModule_1; -import * as tslib_1 from "tslib"; -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { MultiSelectComponent } from './multiselect.component'; -import { ClickOutsideDirective } from './click-outside.directive'; -import { ListFilterPipe } from './list-filter.pipe'; -let NgMultiSelectDropDownModule = NgMultiSelectDropDownModule_1 = class NgMultiSelectDropDownModule { - static forRoot() { - return { - ngModule: NgMultiSelectDropDownModule_1 - }; - } -}; -NgMultiSelectDropDownModule = NgMultiSelectDropDownModule_1 = tslib_1.__decorate([ - NgModule({ - imports: [CommonModule, FormsModule], - declarations: [MultiSelectComponent, ClickOutsideDirective, ListFilterPipe], - providers: [ListFilterPipe], - exports: [MultiSelectComponent] - }) -], NgMultiSelectDropDownModule); -export { NgMultiSelectDropDownModule }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctbXVsdGlzZWxlY3QtZHJvcGRvd24ubW9kdWxlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctbXVsdGlzZWxlY3QtZHJvcGRvd24vIiwic291cmNlcyI6WyJuZy1tdWx0aXNlbGVjdC1kcm9wZG93bi5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUF1QixNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVNwRCxJQUFhLDJCQUEyQixtQ0FBeEMsTUFBYSwyQkFBMkI7SUFDcEMsTUFBTSxDQUFDLE9BQU87UUFDWixPQUFPO1lBQ0wsUUFBUSxFQUFFLDZCQUEyQjtTQUN0QyxDQUFDO0lBQ0osQ0FBQztDQUNKLENBQUE7QUFOWSwyQkFBMkI7SUFQdkMsUUFBUSxDQUFDO1FBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQztRQUNwQyxZQUFZLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxjQUFjLENBQUM7UUFDM0UsU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDO1FBQzNCLE9BQU8sRUFBRSxDQUFDLG9CQUFvQixDQUFDO0tBQ2hDLENBQUM7R0FFVywyQkFBMkIsQ0FNdkM7U0FOWSwyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuL211bHRpc2VsZWN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDbGlja091dHNpZGVEaXJlY3RpdmUgfSBmcm9tICcuL2NsaWNrLW91dHNpZGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IExpc3RGaWx0ZXJQaXBlIH0gZnJvbSAnLi9saXN0LWZpbHRlci5waXBlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtNdWx0aVNlbGVjdENvbXBvbmVudCwgQ2xpY2tPdXRzaWRlRGlyZWN0aXZlLCBMaXN0RmlsdGVyUGlwZV0sXG4gIHByb3ZpZGVyczogW0xpc3RGaWx0ZXJQaXBlXSxcbiAgZXhwb3J0czogW011bHRpU2VsZWN0Q29tcG9uZW50XVxufSlcblxuZXhwb3J0IGNsYXNzIE5nTXVsdGlTZWxlY3REcm9wRG93bk1vZHVsZSB7XG4gICAgc3RhdGljIGZvclJvb3QoKTogTW9kdWxlV2l0aFByb3ZpZGVyczxOZ011bHRpU2VsZWN0RHJvcERvd25Nb2R1bGU+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5nTW9kdWxlOiBOZ011bHRpU2VsZWN0RHJvcERvd25Nb2R1bGVcbiAgICAgIH07XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/esm2015/public_api.js b/frontend/node_modules/ng-multiselect-dropdown/esm2015/public_api.js deleted file mode 100644 index da739289..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/esm2015/public_api.js +++ /dev/null @@ -1,3 +0,0 @@ -export { MultiSelectComponent } from './multiselect.component'; -export { NgMultiSelectDropDownModule } from './ng-multiselect-dropdown.module'; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLW11bHRpc2VsZWN0LWRyb3Bkb3duLyIsInNvdXJjZXMiOlsicHVibGljX2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IE11bHRpU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi9tdWx0aXNlbGVjdC5jb21wb25lbnQnO1xuZXhwb3J0IHsgTmdNdWx0aVNlbGVjdERyb3BEb3duTW9kdWxlIH0gZnJvbSAnLi9uZy1tdWx0aXNlbGVjdC1kcm9wZG93bi5tb2R1bGUnO1xuZXhwb3J0IHsgSURyb3Bkb3duU2V0dGluZ3MgfSBmcm9tICcuL211bHRpc2VsZWN0Lm1vZGVsJztcbiJdfQ== \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/esm5/click-outside.directive.js b/frontend/node_modules/ng-multiselect-dropdown/esm5/click-outside.directive.js deleted file mode 100644 index d7774612..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/esm5/click-outside.directive.js +++ /dev/null @@ -1,34 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Directive, ElementRef, Output, EventEmitter, HostListener } from '@angular/core'; -var ClickOutsideDirective = /** @class */ (function () { - function ClickOutsideDirective(_elementRef) { - this._elementRef = _elementRef; - this.clickOutside = new EventEmitter(); - } - ClickOutsideDirective.prototype.onClick = function (event, targetElement) { - if (!targetElement) { - return; - } - var clickedInside = this._elementRef.nativeElement.contains(targetElement); - if (!clickedInside) { - this.clickOutside.emit(event); - } - }; - ClickOutsideDirective.ctorParameters = function () { return [ - { type: ElementRef } - ]; }; - tslib_1.__decorate([ - Output() - ], ClickOutsideDirective.prototype, "clickOutside", void 0); - tslib_1.__decorate([ - HostListener('document:click', ['$event', '$event.target']) - ], ClickOutsideDirective.prototype, "onClick", null); - ClickOutsideDirective = tslib_1.__decorate([ - Directive({ - selector: '[clickOutside]' - }) - ], ClickOutsideDirective); - return ClickOutsideDirective; -}()); -export { ClickOutsideDirective }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpY2stb3V0c2lkZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1tdWx0aXNlbGVjdC1kcm9wZG93bi8iLCJzb3VyY2VzIjpbImNsaWNrLW91dHNpZGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUt4RjtJQUNJLCtCQUFvQixXQUF1QjtRQUF2QixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUlwQyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7SUFIckQsQ0FBQztJQU1NLHVDQUFPLEdBQWQsVUFBZSxLQUFpQixFQUFFLGFBQTBCO1FBQ3hELElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEIsT0FBTztTQUNWO1FBRUQsSUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDakM7SUFDTCxDQUFDOztnQkFoQmdDLFVBQVU7O0lBSTNDO1FBREMsTUFBTSxFQUFFOytEQUM0QztJQUdyRDtRQURDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQzt3REFVM0Q7SUFqQlEscUJBQXFCO1FBSGpDLFNBQVMsQ0FBQztZQUNQLFFBQVEsRUFBRSxnQkFBZ0I7U0FDN0IsQ0FBQztPQUNXLHFCQUFxQixDQWtCakM7SUFBRCw0QkFBQztDQUFBLEFBbEJELElBa0JDO1NBbEJZLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlyZWN0aXZlLCBFbGVtZW50UmVmLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbY2xpY2tPdXRzaWRlXSdcbn0pXG5leHBvcnQgY2xhc3MgQ2xpY2tPdXRzaWRlRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgfVxuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNsaWNrT3V0c2lkZSA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnLCAnJGV2ZW50LnRhcmdldCddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRhcmdldEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0RWxlbWVudCk7XG4gICAgICAgIGlmICghY2xpY2tlZEluc2lkZSkge1xuICAgICAgICAgICAgdGhpcy5jbGlja091dHNpZGUuZW1pdChldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0= \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/esm5/list-filter.pipe.js b/frontend/node_modules/ng-multiselect-dropdown/esm5/list-filter.pipe.js deleted file mode 100644 index e5c252c2..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/esm5/list-filter.pipe.js +++ /dev/null @@ -1,30 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Pipe } from '@angular/core'; -var ListFilterPipe = /** @class */ (function () { - function ListFilterPipe() { - } - ListFilterPipe.prototype.transform = function (items, filter) { - var _this = this; - if (!items || !filter) { - return items; - } - return items.filter(function (item) { return _this.applyFilter(item, filter); }); - }; - ListFilterPipe.prototype.applyFilter = function (item, filter) { - if (typeof item.text === 'string' && typeof filter.text === 'string') { - return !(filter.text && item.text && item.text.toLowerCase().indexOf(filter.text.toLowerCase()) === -1); - } - else { - return !(filter.text && item.text && item.text.toString().toLowerCase().indexOf(filter.text.toString().toLowerCase()) === -1); - } - }; - ListFilterPipe = tslib_1.__decorate([ - Pipe({ - name: 'multiSelectFilter', - pure: false - }) - ], ListFilterPipe); - return ListFilterPipe; -}()); -export { ListFilterPipe }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1maWx0ZXIucGlwZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLW11bHRpc2VsZWN0LWRyb3Bkb3duLyIsInNvdXJjZXMiOlsibGlzdC1maWx0ZXIucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFRcEQ7SUFBQTtJQWVBLENBQUM7SUFkRyxrQ0FBUyxHQUFULFVBQVUsS0FBaUIsRUFBRSxNQUFnQjtRQUE3QyxpQkFLQztRQUpHLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDbkIsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQyxJQUFjLElBQUssT0FBQSxLQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBOUIsQ0FBOEIsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxvQ0FBVyxHQUFYLFVBQVksSUFBYyxFQUFFLE1BQWdCO1FBQ3hDLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQ2xFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMzRzthQUFNO1lBQ0gsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2pJO0lBQ0wsQ0FBQztJQWRRLGNBQWM7UUFKMUIsSUFBSSxDQUFDO1lBQ0YsSUFBSSxFQUFFLG1CQUFtQjtZQUN6QixJQUFJLEVBQUUsS0FBSztTQUNkLENBQUM7T0FDVyxjQUFjLENBZTFCO0lBQUQscUJBQUM7Q0FBQSxBQWZELElBZUM7U0FmWSxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBMaXN0SXRlbSB9IGZyb20gJy4vbXVsdGlzZWxlY3QubW9kZWwnO1xuXG5AUGlwZSh7XG4gICAgbmFtZTogJ211bHRpU2VsZWN0RmlsdGVyJyxcbiAgICBwdXJlOiBmYWxzZVxufSlcbmV4cG9ydCBjbGFzcyBMaXN0RmlsdGVyUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICAgIHRyYW5zZm9ybShpdGVtczogTGlzdEl0ZW1bXSwgZmlsdGVyOiBMaXN0SXRlbSk6IExpc3RJdGVtW10ge1xuICAgICAgICBpZiAoIWl0ZW1zIHx8ICFmaWx0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKChpdGVtOiBMaXN0SXRlbSkgPT4gdGhpcy5hcHBseUZpbHRlcihpdGVtLCBmaWx0ZXIpKTtcbiAgICB9XG5cbiAgICBhcHBseUZpbHRlcihpdGVtOiBMaXN0SXRlbSwgZmlsdGVyOiBMaXN0SXRlbSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0udGV4dCA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGZpbHRlci50ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuICEoZmlsdGVyLnRleHQgJiYgaXRlbS50ZXh0ICYmIGl0ZW0udGV4dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZmlsdGVyLnRleHQudG9Mb3dlckNhc2UoKSkgPT09IC0xKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAhKGZpbHRlci50ZXh0ICYmIGl0ZW0udGV4dCAmJiBpdGVtLnRleHQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZmlsdGVyLnRleHQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/esm5/multiselect.component.js b/frontend/node_modules/ng-multiselect-dropdown/esm5/multiselect.component.js deleted file mode 100644 index 43d080f4..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/esm5/multiselect.component.js +++ /dev/null @@ -1,367 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Component, HostListener, forwardRef, Input, Output, EventEmitter, ChangeDetectionStrategy } from "@angular/core"; -import { NG_VALUE_ACCESSOR } from "@angular/forms"; -import { ListItem } from "./multiselect.model"; -import { ListFilterPipe } from "./list-filter.pipe"; -export var DROPDOWN_CONTROL_VALUE_ACCESSOR = { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(function () { return MultiSelectComponent; }), - multi: true -}; -var noop = function () { }; -var ɵ0 = noop; -var MultiSelectComponent = /** @class */ (function () { - function MultiSelectComponent(listFilterPipe) { - this.listFilterPipe = listFilterPipe; - this._data = []; - this.selectedItems = []; - this.isDropdownOpen = true; - this._placeholder = "Select"; - this._sourceDataType = null; // to keep note of the source data type. could be array of string/number/object - this._sourceDataFields = []; // store source data fields names - this.filter = new ListItem(this.data); - this.defaultSettings = { - singleSelection: false, - idField: "id", - textField: "text", - disabledField: "isDisabled", - enableCheckAll: true, - selectAllText: "Select All", - unSelectAllText: "UnSelect All", - allowSearchFilter: false, - limitSelection: -1, - clearSearchFilter: true, - maxHeight: 197, - itemsShowLimit: 999999999999, - searchPlaceholderText: "Search", - noDataAvailablePlaceholderText: "No data available", - closeDropDownOnSelection: false, - showSelectedItemsAtTop: false, - defaultOpen: false, - allowRemoteDataSearch: false - }; - this.disabled = false; - this.onFilterChange = new EventEmitter(); - this.onDropDownClose = new EventEmitter(); - this.onSelect = new EventEmitter(); - this.onDeSelect = new EventEmitter(); - this.onSelectAll = new EventEmitter(); - this.onDeSelectAll = new EventEmitter(); - this.onTouchedCallback = noop; - this.onChangeCallback = noop; - } - Object.defineProperty(MultiSelectComponent.prototype, "placeholder", { - set: function (value) { - if (value) { - this._placeholder = value; - } - else { - this._placeholder = "Select"; - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(MultiSelectComponent.prototype, "settings", { - set: function (value) { - if (value) { - this._settings = Object.assign(this.defaultSettings, value); - } - else { - this._settings = Object.assign(this.defaultSettings); - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(MultiSelectComponent.prototype, "data", { - set: function (value) { - var _this = this; - if (!value) { - this._data = []; - } - else { - var firstItem = value[0]; - this._sourceDataType = typeof firstItem; - this._sourceDataFields = this.getFields(firstItem); - this._data = value.map(function (item) { - return typeof item === "string" || typeof item === "number" - ? new ListItem(item) - : new ListItem({ - id: item[_this._settings.idField], - text: item[_this._settings.textField], - isDisabled: item[_this._settings.disabledField] - }); - }); - } - }, - enumerable: true, - configurable: true - }); - MultiSelectComponent.prototype.onFilterTextChange = function ($event) { - this.onFilterChange.emit($event); - }; - MultiSelectComponent.prototype.onItemClick = function ($event, item) { - if (this.disabled || item.isDisabled) { - return false; - } - var found = this.isSelected(item); - var allowAdd = this._settings.limitSelection === -1 || (this._settings.limitSelection > 0 && this.selectedItems.length < this._settings.limitSelection); - if (!found) { - if (allowAdd) { - this.addSelected(item); - } - } - else { - this.removeSelected(item); - } - if (this._settings.singleSelection && this._settings.closeDropDownOnSelection) { - this.closeDropdown(); - } - }; - MultiSelectComponent.prototype.writeValue = function (value) { - var _this = this; - if (value !== undefined && value !== null && value.length > 0) { - if (this._settings.singleSelection) { - try { - if (value.length >= 1) { - var firstItem = value[0]; - this.selectedItems = [ - typeof firstItem === "string" || typeof firstItem === "number" - ? new ListItem(firstItem) - : new ListItem({ - id: firstItem[this._settings.idField], - text: firstItem[this._settings.textField], - isDisabled: firstItem[this._settings.disabledField] - }) - ]; - } - } - catch (e) { - // console.error(e.body.msg); - } - } - else { - var _data = value.map(function (item) { - return typeof item === "string" || typeof item === "number" - ? new ListItem(item) - : new ListItem({ - id: item[_this._settings.idField], - text: item[_this._settings.textField], - isDisabled: item[_this._settings.disabledField] - }); - }); - if (this._settings.limitSelection > 0) { - this.selectedItems = _data.splice(0, this._settings.limitSelection); - } - else { - this.selectedItems = _data; - } - } - } - else { - this.selectedItems = []; - } - this.onChangeCallback(value); - }; - // From ControlValueAccessor interface - MultiSelectComponent.prototype.registerOnChange = function (fn) { - this.onChangeCallback = fn; - }; - // From ControlValueAccessor interface - MultiSelectComponent.prototype.registerOnTouched = function (fn) { - this.onTouchedCallback = fn; - }; - // Set touched on blur - MultiSelectComponent.prototype.onTouched = function () { - this.closeDropdown(); - this.onTouchedCallback(); - }; - MultiSelectComponent.prototype.trackByFn = function (index, item) { - return item.id; - }; - MultiSelectComponent.prototype.isSelected = function (clickedItem) { - var found = false; - this.selectedItems.forEach(function (item) { - if (clickedItem.id === item.id) { - found = true; - } - }); - return found; - }; - MultiSelectComponent.prototype.isLimitSelectionReached = function () { - return this._settings.limitSelection === this.selectedItems.length; - }; - MultiSelectComponent.prototype.isAllItemsSelected = function () { - // get disabld item count - var filteredItems = this.listFilterPipe.transform(this._data, this.filter); - var itemDisabledCount = filteredItems.filter(function (item) { return item.isDisabled; }).length; - // take disabled items into consideration when checking - if ((!this.data || this.data.length === 0) && this._settings.allowRemoteDataSearch) { - return false; - } - return filteredItems.length === this.selectedItems.length + itemDisabledCount; - }; - MultiSelectComponent.prototype.showButton = function () { - if (!this._settings.singleSelection) { - if (this._settings.limitSelection > 0) { - return false; - } - // this._settings.enableCheckAll = this._settings.limitSelection === -1 ? true : false; - return true; // !this._settings.singleSelection && this._settings.enableCheckAll && this._data.length > 0; - } - else { - // should be disabled in single selection mode - return false; - } - }; - MultiSelectComponent.prototype.itemShowRemaining = function () { - return this.selectedItems.length - this._settings.itemsShowLimit; - }; - MultiSelectComponent.prototype.addSelected = function (item) { - if (this._settings.singleSelection) { - this.selectedItems = []; - this.selectedItems.push(item); - } - else { - this.selectedItems.push(item); - } - this.onChangeCallback(this.emittedValue(this.selectedItems)); - this.onSelect.emit(this.emittedValue(item)); - }; - MultiSelectComponent.prototype.removeSelected = function (itemSel) { - var _this = this; - this.selectedItems.forEach(function (item) { - if (itemSel.id === item.id) { - _this.selectedItems.splice(_this.selectedItems.indexOf(item), 1); - } - }); - this.onChangeCallback(this.emittedValue(this.selectedItems)); - this.onDeSelect.emit(this.emittedValue(itemSel)); - }; - MultiSelectComponent.prototype.emittedValue = function (val) { - var _this = this; - var selected = []; - if (Array.isArray(val)) { - val.map(function (item) { - selected.push(_this.objectify(item)); - }); - } - else { - if (val) { - return this.objectify(val); - } - } - return selected; - }; - MultiSelectComponent.prototype.objectify = function (val) { - if (this._sourceDataType === 'object') { - var obj = {}; - obj[this._settings.idField] = val.id; - obj[this._settings.textField] = val.text; - if (this._sourceDataFields.includes(this._settings.disabledField)) { - obj[this._settings.disabledField] = val.isDisabled; - } - return obj; - } - if (this._sourceDataType === 'number') { - return Number(val.id); - } - else { - return val.text; - } - }; - MultiSelectComponent.prototype.toggleDropdown = function (evt) { - evt.preventDefault(); - if (this.disabled && this._settings.singleSelection) { - return; - } - this._settings.defaultOpen = !this._settings.defaultOpen; - if (!this._settings.defaultOpen) { - this.onDropDownClose.emit(); - } - }; - MultiSelectComponent.prototype.closeDropdown = function () { - this._settings.defaultOpen = false; - // clear search text - if (this._settings.clearSearchFilter) { - this.filter.text = ""; - } - this.onDropDownClose.emit(); - }; - MultiSelectComponent.prototype.toggleSelectAll = function () { - if (this.disabled) { - return false; - } - if (!this.isAllItemsSelected()) { - // filter out disabled item first before slicing - this.selectedItems = this.listFilterPipe.transform(this._data, this.filter).filter(function (item) { return !item.isDisabled; }).slice(); - this.onSelectAll.emit(this.emittedValue(this.selectedItems)); - } - else { - this.selectedItems = []; - this.onDeSelectAll.emit(this.emittedValue(this.selectedItems)); - } - this.onChangeCallback(this.emittedValue(this.selectedItems)); - }; - MultiSelectComponent.prototype.getFields = function (inputData) { - var fields = []; - if (typeof inputData !== "object") { - return fields; - } - // tslint:disable-next-line:forin - for (var prop in inputData) { - fields.push(prop); - } - return fields; - }; - MultiSelectComponent.ctorParameters = function () { return [ - { type: ListFilterPipe } - ]; }; - tslib_1.__decorate([ - Input() - ], MultiSelectComponent.prototype, "placeholder", null); - tslib_1.__decorate([ - Input() - ], MultiSelectComponent.prototype, "disabled", void 0); - tslib_1.__decorate([ - Input() - ], MultiSelectComponent.prototype, "settings", null); - tslib_1.__decorate([ - Input() - ], MultiSelectComponent.prototype, "data", null); - tslib_1.__decorate([ - Output("onFilterChange") - ], MultiSelectComponent.prototype, "onFilterChange", void 0); - tslib_1.__decorate([ - Output("onDropDownClose") - ], MultiSelectComponent.prototype, "onDropDownClose", void 0); - tslib_1.__decorate([ - Output("onSelect") - ], MultiSelectComponent.prototype, "onSelect", void 0); - tslib_1.__decorate([ - Output("onDeSelect") - ], MultiSelectComponent.prototype, "onDeSelect", void 0); - tslib_1.__decorate([ - Output("onSelectAll") - ], MultiSelectComponent.prototype, "onSelectAll", void 0); - tslib_1.__decorate([ - Output("onDeSelectAll") - ], MultiSelectComponent.prototype, "onDeSelectAll", void 0); - tslib_1.__decorate([ - HostListener("blur") - ], MultiSelectComponent.prototype, "onTouched", null); - MultiSelectComponent = tslib_1.__decorate([ - Component({ - selector: "ng-multiselect-dropdown", - template: "
\n
\n \n {{_placeholder}}\n _settings.itemsShowLimit-1\">\n {{item.text}}\n x\n \n \n 0\">+{{itemShowRemaining()}}\n \n \n \n
\n
\n
    \n
  • 0 || _settings.allowRemoteDataSearch) && !_settings.singleSelection && _settings.enableCheckAll && _settings.limitSelection===-1\" class=\"multiselect-item-checkbox\" style=\"border-bottom: 1px solid #ccc;padding:10px\">\n \n
    {{!isAllItemsSelected() ? _settings.selectAllText : _settings.unSelectAllText}}
    \n
  • \n
  • 0 || _settings.allowRemoteDataSearch) && _settings.allowSearchFilter\">\n \n
  • \n
\n
    \n
  • \n \n
    {{item.text}}
    \n
  • \n
  • \n
    {{_settings.noDataAvailablePlaceholderText}}
    \n
  • \n
\n
\n
\n", - providers: [DROPDOWN_CONTROL_VALUE_ACCESSOR], - changeDetection: ChangeDetectionStrategy.OnPush, - styles: [".multiselect-dropdown{position:relative;width:100%;font-size:inherit;font-family:inherit}.multiselect-dropdown .dropdown-btn{display:inline-block;border:1px solid #adadad;width:100%;padding:6px 12px;margin-bottom:0;font-weight:400;line-height:1.52857143;text-align:left;vertical-align:middle;cursor:pointer;background-image:none;border-radius:4px}.multiselect-dropdown .dropdown-btn .selected-item{border:1px solid #337ab7;margin-right:4px;background:#337ab7;padding:0 5px;color:#fff;border-radius:2px;float:left;display:flex;max-width:100px}.multiselect-dropdown .dropdown-btn .selected-item span{overflow:hidden;text-overflow:ellipsis}.multiselect-dropdown .dropdown-btn .selected-item a{text-decoration:none}.multiselect-dropdown .dropdown-btn .selected-item:hover{box-shadow:1px 1px #959595}.multiselect-dropdown .dropdown-btn .dropdown-multiselect__caret{line-height:16px;display:block;position:absolute;box-sizing:border-box;width:40px;height:38px;right:1px;top:0;padding:4px 8px;margin:0;text-decoration:none;text-align:center;cursor:pointer;transition:transform .2s}.multiselect-dropdown .dropdown-btn .dropdown-multiselect__caret:before{position:relative;right:0;top:65%;color:#999;margin-top:4px;border-style:solid;border-width:8px 8px 0;border-color:#999 transparent;content:\"\"}.multiselect-dropdown .dropdown-btn .dropdown-multiselect--active .dropdown-multiselect__caret{transform:rotateZ(180deg)}.multiselect-dropdown .disabled>span{background-color:#eceeef}.dropdown-list{position:absolute;padding-top:6px;width:100%;z-index:9999;border:1px solid #ccc;border-radius:3px;background:#fff;margin-top:10px;box-shadow:0 1px 5px #959595}.dropdown-list ul{padding:0;list-style:none;overflow:auto;margin:0}.dropdown-list li{padding:6px 10px;cursor:pointer;text-align:left}.dropdown-list .filter-textbox{border-bottom:1px solid #ccc;position:relative;padding:10px}.dropdown-list .filter-textbox input{border:0;width:100%;padding:0 0 0 26px}.dropdown-list .filter-textbox input:focus{outline:0}.multiselect-item-checkbox:hover{background-color:#e4e3e3}.multiselect-item-checkbox input[type=checkbox]{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.multiselect-item-checkbox input[type=checkbox]:focus+div:before,.multiselect-item-checkbox input[type=checkbox]:hover+div:before{border-color:#337ab7;background-color:#f2f2f2}.multiselect-item-checkbox input[type=checkbox]:active+div:before{transition-duration:0s}.multiselect-item-checkbox input[type=checkbox]+div{position:relative;padding-left:2em;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;margin:0;color:#000}.multiselect-item-checkbox input[type=checkbox]+div:before{box-sizing:content-box;content:\"\";color:#337ab7;position:absolute;top:50%;left:0;width:14px;height:14px;margin-top:-9px;border:2px solid #337ab7;text-align:center;transition:.4s}.multiselect-item-checkbox input[type=checkbox]+div:after{box-sizing:content-box;content:\"\";position:absolute;transform:scale(0);transform-origin:50%;transition:transform .2s ease-out;background-color:transparent;top:50%;left:4px;width:8px;height:3px;margin-top:-4px;border-style:solid;border-color:#fff;border-width:0 0 3px 3px;-o-border-image:none;border-image:none;transform:rotate(-45deg) scale(0)}.multiselect-item-checkbox input[type=checkbox]:disabled+div:before{border-color:#ccc}.multiselect-item-checkbox input[type=checkbox]:disabled:focus+div:before .multiselect-item-checkbox input[type=checkbox]:disabled:hover+div:before{background-color:inherit}.multiselect-item-checkbox input[type=checkbox]:disabled:checked+div:before{background-color:#ccc}.multiselect-item-checkbox input[type=checkbox]:checked+div:after{content:\"\";transition:transform .2s ease-out;transform:rotate(-45deg) scale(1)}.multiselect-item-checkbox input[type=checkbox]:checked+div:before{-webkit-animation:.2s ease-in borderscale;animation:.2s ease-in borderscale;background:#337ab7}@-webkit-keyframes borderscale{50%{box-shadow:0 0 0 2px #337ab7}}@keyframes borderscale{50%{box-shadow:0 0 0 2px #337ab7}}"] - }) - ], MultiSelectComponent); - return MultiSelectComponent; -}()); -export { MultiSelectComponent }; -export { ɵ0 }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlzZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctbXVsdGlzZWxlY3QtZHJvcGRvd24vIiwic291cmNlcyI6WyJtdWx0aXNlbGVjdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSx1QkFBdUIsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0ksT0FBTyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxRQUFRLEVBQXFCLE1BQU0scUJBQXFCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBELE1BQU0sQ0FBQyxJQUFNLCtCQUErQixHQUFRO0lBQ2xELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxjQUFNLE9BQUEsb0JBQW9CLEVBQXBCLENBQW9CLENBQUM7SUFDbkQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBQ0YsSUFBTSxJQUFJLEdBQUcsY0FBTyxDQUFDLENBQUM7O0FBU3RCO0lBOEZFLDhCQUFvQixjQUE2QjtRQUE3QixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQTVGMUMsVUFBSyxHQUFvQixFQUFFLENBQUM7UUFDNUIsa0JBQWEsR0FBb0IsRUFBRSxDQUFDO1FBQ3BDLG1CQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzdCLGlCQUFZLEdBQUcsUUFBUSxDQUFDO1FBQ2hCLG9CQUFlLEdBQUcsSUFBSSxDQUFDLENBQUMsK0VBQStFO1FBQ3ZHLHNCQUFpQixHQUFrQixFQUFFLENBQUMsQ0FBQyxpQ0FBaUM7UUFDaEYsV0FBTSxHQUFhLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxvQkFBZSxHQUFzQjtZQUNuQyxlQUFl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K0IsQ0FBQztZQUM1QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7U0FDaEQsQ0FBQztPQUNXLG9CQUFvQixDQTZUaEM7SUFBRCwyQkFBQztDQUFBLEFBN1RELElBNlRDO1NBN1RZLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBmb3J3YXJkUmVmLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IExpc3RJdGVtLCBJRHJvcGRvd25TZXR0aW5ncyB9IGZyb20gXCIuL211bHRpc2VsZWN0Lm1vZGVsXCI7XG5pbXBvcnQgeyBMaXN0RmlsdGVyUGlwZSB9IGZyb20gXCIuL2xpc3QtZmlsdGVyLnBpcGVcIjtcblxuZXhwb3J0IGNvbnN0IERST1BET1dOX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE11bHRpU2VsZWN0Q29tcG9uZW50KSxcbiAgbXVsdGk6IHRydWVcbn07XG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJuZy1tdWx0aXNlbGVjdC1kcm9wZG93blwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL211bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vbXVsdGktc2VsZWN0LmNvbXBvbmVudC5zY3NzXCJdLFxuICBwcm92aWRlcnM6IFtEUk9QRE9XTl9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlTZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHB1YmxpYyBfc2V0dGluZ3M6IElEcm9wZG93blNldHRpbmdzO1xuICBwdWJsaWMgX2RhdGE6IEFycmF5PExpc3RJdGVtPiA9IFtdO1xuICBwdWJsaWMgc2VsZWN0ZWRJdGVtczogQXJyYXk8TGlzdEl0ZW0+ID0gW107XG4gIHB1YmxpYyBpc0Ryb3Bkb3duT3BlbiA9IHRydWU7XG4gIF9wbGFjZWhvbGRlciA9IFwiU2VsZWN0XCI7XG4gIHByaXZhdGUgX3NvdXJjZURhdGFUeXBlID0gbnVsbDsgLy8gdG8ga2VlcCBub3RlIG9mIHRoZSBzb3VyY2UgZGF0YSB0eXBlLiBjb3VsZCBiZSBhcnJheSBvZiBzdHJpbmcvbnVtYmVyL29iamVjdFxuICBwcml2YXRlIF9zb3VyY2VEYXRhRmllbGRzOiBBcnJheTxTdHJpbmc+ID0gW107IC8vIHN0b3JlIHNvdXJjZSBkYXRhIGZpZWxkcyBuYW1lc1xuICBmaWx0ZXI6IExpc3RJdGVtID0gbmV3IExpc3RJdGVtKHRoaXMuZGF0YSk7XG4gIGRlZmF1bHRTZXR0aW5nczogSURyb3Bkb3duU2V0dGluZ3MgPSB7XG4gICAgc2luZ2xlU2VsZWN0aW9uOiBmYWxzZSxcbiAgICBpZEZpZWxkOiBcImlkXCIsXG4gICAgdGV4dEZpZWxkOiBcInRleHRcIixcbiAgICBkaXNhYmxlZEZpZWxkOiBcImlzRGlzYWJsZWRcIixcbiAgICBlbmFibGVDaGVja0FsbDogdHJ1ZSxcbiAgICBzZWxlY3RBbGxUZXh0OiBcIlNlbGVjdCBBbGxcIixcbiAgICB1blNlbGVjdEFsbFRleHQ6IFwiVW5TZWxlY3QgQWxsXCIsXG4gICAgYWxsb3dTZWFyY2hGaWx0ZXI6IGZhbHNlLFxuICAgIGxpbWl0U2VsZWN0aW9uOiAtMSxcbiAgICBjbGVhclNlYXJjaEZpbHRlcjogdHJ1ZSxcbiAgICBtYXhIZWlnaHQ6IDE5NyxcbiAgICBpdGVtc1Nob3dMaW1pdDogOTk5OTk5OTk5OTk5LFxuICAgIHNlYXJjaFBsYWNlaG9sZGVyVGV4dDogXCJTZWFyY2hcIixcbiAgICBub0RhdGFBdmFpbGFibGVQbGFjZWhvbGRlclRleHQ6IFwiTm8gZGF0YSBhdmFpbGFibGVcIixcbiAgICBjbG9zZURyb3BEb3duT25TZWxlY3Rpb246IGZhbHNlLFxuICAgIHNob3dTZWxlY3RlZEl0ZW1zQXRUb3A6IGZhbHNlLFxuICAgIGRlZmF1bHRPcGVuOiBmYWxzZSxcbiAgICBhbGxvd1JlbW90ZURhdGFTZWFyY2g6IGZhbHNlXG4gIH07XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9wbGFjZWhvbGRlciA9IFwiU2VsZWN0XCI7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZXR0aW5ncyh2YWx1ZTogSURyb3Bkb3duU2V0dGluZ3MpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuX3NldHRpbmdzID0gT2JqZWN0LmFzc2lnbih0aGlzLmRlZmF1bHRTZXR0aW5ncywgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24odGhpcy5kZWZhdWx0U2V0dGluZ3MpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGF0YSh2YWx1ZTogQXJyYXk8YW55Pikge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRoaXMuX2RhdGEgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmlyc3RJdGVtID0gdmFsdWVbMF07XG4gICAgICB0aGlzLl9zb3VyY2VEYXRhVHlwZSA9IHR5cGVvZiBmaXJzdEl0ZW07XG4gICAgICB0aGlzLl9zb3VyY2VEYXRhRmllbGRzID0gdGhpcy5nZXRGaWVsZHMoZmlyc3RJdGVtKTtcbiAgICAgIHRoaXMuX2RhdGEgPSB2YWx1ZS5tYXAoKGl0ZW06IGFueSkgPT5cbiAgICAgICAgdHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCJcbiAgICAgICAgICA/IG5ldyBMaXN0SXRlbShpdGVtKVxuICAgICAgICAgIDogbmV3IExpc3RJdGVtKHtcbiAgICAgICAgICAgICAgaWQ6IGl0ZW1bdGhpcy5fc2V0dGluZ3MuaWRGaWVsZF0sXG4gICAgICAgICAgICAgIHRleHQ6IGl0ZW1bdGhpcy5fc2V0dGluZ3MudGV4dEZpZWxkXSxcbiAgICAgICAgICAgICAgaXNEaXNhYmxlZDogaXRlbVt0aGlzLl9zZXR0aW5ncy5kaXNhYmxlZEZpZWxkXVxuICAgICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQE91dHB1dChcIm9uRmlsdGVyQ2hhbmdlXCIpXG4gIG9uRmlsdGVyQ2hhbmdlOiBFdmVudEVtaXR0ZXI8TGlzdEl0ZW0+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoXCJvbkRyb3BEb3duQ2xvc2VcIilcbiAgb25Ecm9wRG93bkNsb3NlOiBFdmVudEVtaXR0ZXI8TGlzdEl0ZW0+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dChcIm9uU2VsZWN0XCIpXG4gIG9uU2VsZWN0OiBFdmVudEVtaXR0ZXI8TGlzdEl0ZW0+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dChcIm9uRGVTZWxlY3RcIilcbiAgb25EZVNlbGVjdDogRXZlbnRFbWl0dGVyPExpc3RJdGVtPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBPdXRwdXQoXCJvblNlbGVjdEFsbFwiKVxuICBvblNlbGVjdEFsbDogRXZlbnRFbWl0dGVyPEFycmF5PExpc3RJdGVtPj4gPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PGFueT4+KCk7XG5cbiAgQE91dHB1dChcIm9uRGVTZWxlY3RBbGxcIilcbiAgb25EZVNlbGVjdEFsbDogRXZlbnRFbWl0dGVyPEFycmF5PExpc3RJdGVtPj4gPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PGFueT4+KCk7XG5cbiAgcHJpdmF0ZSBvblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG5cbiAgb25GaWx0ZXJUZXh0Q2hhbmdlKCRldmVudCkge1xuICAgIHRoaXMub25GaWx0ZXJDaGFuZ2UuZW1pdCgkZXZlbnQpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBsaXN0RmlsdGVyUGlwZTpMaXN0RmlsdGVyUGlwZSkge31cblxuICBvbkl0ZW1DbGljaygkZXZlbnQ6IGFueSwgaXRlbTogTGlzdEl0ZW0pIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCBpdGVtLmlzRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBmb3VuZCA9IHRoaXMuaXNTZWxlY3RlZChpdGVtKTtcbiAgICBjb25zdCBhbGxvd0FkZCA9IHRoaXMuX3NldHRpbmdzLmxpbWl0U2VsZWN0aW9uID09PSAtMSB8fCAodGhpcy5fc2V0dGluZ3MubGltaXRTZWxlY3Rpb24gPiAwICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPCB0aGlzLl9zZXR0aW5ncy5saW1pdFNlbGVjdGlvbik7XG4gICAgaWYgKCFmb3VuZCkge1xuICAgICAgaWYgKGFsbG93QWRkKSB7XG4gICAgICAgIHRoaXMuYWRkU2VsZWN0ZWQoaXRlbSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWQoaXRlbSk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zZXR0aW5ncy5zaW5nbGVTZWxlY3Rpb24gJiYgdGhpcy5fc2V0dGluZ3MuY2xvc2VEcm9wRG93bk9uU2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodGhpcy5fc2V0dGluZ3Muc2luZ2xlU2VsZWN0aW9uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdEl0ZW0gPSB2YWx1ZVswXTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtcbiAgICAgICAgICAgICAgdHlwZW9mIGZpcnN0SXRlbSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgZmlyc3RJdGVtID09PSBcIm51bWJlclwiXG4gICAgICAgICAgICAgICAgPyBuZXcgTGlzdEl0ZW0oZmlyc3RJdGVtKVxuICAgICAgICAgICAgICAgIDogbmV3IExpc3RJdGVtKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGZpcnN0SXRlbVt0aGlzLl9zZXR0aW5ncy5pZEZpZWxkXSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogZmlyc3RJdGVtW3RoaXMuX3NldHRpbmdzLnRleHRGaWVsZF0sXG4gICAgICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQ6IGZpcnN0SXRlbVt0aGlzLl9zZXR0aW5ncy5kaXNhYmxlZEZpZWxkXVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5lcnJvcihlLmJvZHkubXNnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgX2RhdGEgPSB2YWx1ZS5tYXAoKGl0ZW06IGFueSkgPT5cbiAgICAgICAgICB0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgaXRlbSA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgICAgPyBuZXcgTGlzdEl0ZW0oaXRlbSlcbiAgICAgICAgICAgIDogbmV3IExpc3RJdGVtKHtcbiAgICAgICAgICAgICAgICBpZDogaXRlbVt0aGlzLl9zZXR0aW5ncy5pZEZpZWxkXSxcbiAgICAgICAgICAgICAgICB0ZXh0OiBpdGVtW3RoaXMuX3NldHRpbmdzLnRleHRGaWVsZF0sXG4gICAgICAgICAgICAgICAgaXNEaXNhYmxlZDogaXRlbVt0aGlzLl9zZXR0aW5ncy5kaXNhYmxlZEZpZWxkXVxuICAgICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MubGltaXRTZWxlY3Rpb24gPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gX2RhdGEuc3BsaWNlKDAsIHRoaXMuX3NldHRpbmdzLmxpbWl0U2VsZWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBfZGF0YTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHZhbHVlKTtcbiAgfVxuXG4gIC8vIEZyb20gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgLy8gRnJvbSBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge1xuICAgIHRoaXMub25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIC8vIFNldCB0b3VjaGVkIG9uIGJsdXJcbiAgQEhvc3RMaXN0ZW5lcihcImJsdXJcIilcbiAgcHVibGljIG9uVG91Y2hlZCgpIHtcbiAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrKCk7XG4gIH1cblxuICB0cmFja0J5Rm4oaW5kZXgsIGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbS5pZDtcbiAgfVxuXG4gIGlzU2VsZWN0ZWQoY2xpY2tlZEl0ZW06IExpc3RJdGVtKSB7XG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpZiAoY2xpY2tlZEl0ZW0uaWQgPT09IGl0ZW0uaWQpIHtcbiAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmb3VuZDtcbiAgfVxuXG4gIGlzTGltaXRTZWxlY3Rpb25SZWFjaGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncy5saW1pdFNlbGVjdGlvbiA9PT0gdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aDtcbiAgfVxuXG4gIGlzQWxsSXRlbXNTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICAvLyBnZXQgZGlzYWJsZCBpdGVtIGNvdW50XG4gICAgbGV0IGZpbHRlcmVkSXRlbXMgPSB0aGlzLmxpc3RGaWx0ZXJQaXBlLnRyYW5zZm9ybSh0aGlzLl9kYXRhLHRoaXMuZmlsdGVyKTtcbiAgICBjb25zdCBpdGVtRGlzYWJsZWRDb3VudCA9IGZpbHRlcmVkSXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pc0Rpc2FibGVkKS5sZW5ndGg7XG4gICAgLy8gdGFrZSBkaXNhYmxlZCBpdGVtcyBpbnRvIGNvbnNpZGVyYXRpb24gd2hlbiBjaGVja2luZ1xuICAgIGlmICgoIXRoaXMuZGF0YSB8fCB0aGlzLmRhdGEubGVuZ3RoID09PSAwKSAmJiB0aGlzLl9zZXR0aW5ncy5hbGxvd1JlbW90ZURhdGFTZWFyY2gpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcmVkSXRlbXMubGVuZ3RoID09PSB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoICsgaXRlbURpc2FibGVkQ291bnQ7XG4gIH1cblxuICBzaG93QnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fc2V0dGluZ3Muc2luZ2xlU2VsZWN0aW9uKSB7XG4gICAgICBpZiAodGhpcy5fc2V0dGluZ3MubGltaXRTZWxlY3Rpb24gPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIHRoaXMuX3NldHRpbmdzLmVuYWJsZUNoZWNrQWxsID0gdGhpcy5fc2V0dGluZ3MubGltaXRTZWxlY3Rpb24gPT09IC0xID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7IC8vICF0aGlzLl9zZXR0aW5ncy5zaW5nbGVTZWxlY3Rpb24gJiYgdGhpcy5fc2V0dGluZ3MuZW5hYmxlQ2hlY2tBbGwgJiYgdGhpcy5fZGF0YS5sZW5ndGggPiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzaG91bGQgYmUgZGlzYWJsZWQgaW4gc2luZ2xlIHNlbGVjdGlvbiBtb2RlXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaXRlbVNob3dSZW1haW5pbmcoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCAtIHRoaXMuX3NldHRpbmdzLml0ZW1zU2hvd0xpbWl0O1xuICB9XG5cbiAgYWRkU2VsZWN0ZWQoaXRlbTogTGlzdEl0ZW0pIHtcbiAgICBpZiAodGhpcy5fc2V0dGluZ3Muc2luZ2xlU2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5wdXNoKGl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMucHVzaChpdGVtKTtcbiAgICB9XG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHRoaXMuZW1pdHRlZFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtcykpO1xuICAgIHRoaXMub25TZWxlY3QuZW1pdCh0aGlzLmVtaXR0ZWRWYWx1ZShpdGVtKSk7XG4gIH1cblxuICByZW1vdmVTZWxlY3RlZChpdGVtU2VsOiBMaXN0SXRlbSkge1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgaWYgKGl0ZW1TZWwuaWQgPT09IGl0ZW0uaWQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnNwbGljZSh0aGlzLnNlbGVjdGVkSXRlbXMuaW5kZXhPZihpdGVtKSwgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHRoaXMuZW1pdHRlZFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtcykpO1xuICAgIHRoaXMub25EZVNlbGVjdC5lbWl0KHRoaXMuZW1pdHRlZFZhbHVlKGl0ZW1TZWwpKTtcbiAgfVxuXG4gIGVtaXR0ZWRWYWx1ZSh2YWw6IGFueSk6IGFueSB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICB2YWwubWFwKGl0ZW0gPT4ge1xuICAgICAgICBzZWxlY3RlZC5wdXNoKHRoaXMub2JqZWN0aWZ5KGl0ZW0pKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodmFsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9iamVjdGlmeSh2YWwpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gIH1cblxuICBvYmplY3RpZnkodmFsOiBMaXN0SXRlbSkge1xuICAgIGlmICh0aGlzLl9zb3VyY2VEYXRhVHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgICAgb2JqW3RoaXMuX3NldHRpbmdzLmlkRmllbGRdID0gdmFsLmlkO1xuICAgICAgb2JqW3RoaXMuX3NldHRpbmdzLnRleHRGaWVsZF0gPSB2YWwudGV4dDtcbiAgICAgIGlmICh0aGlzLl9zb3VyY2VEYXRhRmllbGRzLmluY2x1ZGVzKHRoaXMuX3NldHRpbmdzLmRpc2FibGVkRmllbGQpKSB7XG4gICAgICAgIG9ialt0aGlzLl9zZXR0aW5ncy5kaXNhYmxlZEZpZWxkXSA9IHZhbC5pc0Rpc2FibGVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NvdXJjZURhdGFUeXBlID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIE51bWJlcih2YWwuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsLnRleHQ7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRHJvcGRvd24oZXZ0KSB7XG4gICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgJiYgdGhpcy5fc2V0dGluZ3Muc2luZ2xlU2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3NldHRpbmdzLmRlZmF1bHRPcGVuID0gIXRoaXMuX3NldHRpbmdzLmRlZmF1bHRPcGVuO1xuICAgIGlmICghdGhpcy5fc2V0dGluZ3MuZGVmYXVsdE9wZW4pIHtcbiAgICAgIHRoaXMub25Ecm9wRG93bkNsb3NlLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZURyb3Bkb3duKCkge1xuICAgIHRoaXMuX3NldHRpbmdzLmRlZmF1bHRPcGVuID0gZmFsc2U7XG4gICAgLy8gY2xlYXIgc2VhcmNoIHRleHRcbiAgICBpZiAodGhpcy5fc2V0dGluZ3MuY2xlYXJTZWFyY2hGaWx0ZXIpIHtcbiAgICAgIHRoaXMuZmlsdGVyLnRleHQgPSBcIlwiO1xuICAgIH1cbiAgICB0aGlzLm9uRHJvcERvd25DbG9zZS5lbWl0KCk7XG4gIH1cblxuICB0b2dnbGVTZWxlY3RBbGwoKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzQWxsSXRlbXNTZWxlY3RlZCgpKSB7XG4gICAgICAvLyBmaWx0ZXIgb3V0IGRpc2FibGVkIGl0ZW0gZmlyc3QgYmVmb3JlIHNsaWNpbmdcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHRoaXMubGlzdEZpbHRlclBpcGUudHJhbnNmb3JtKHRoaXMuX2RhdGEsdGhpcy5maWx0ZXIpLmZpbHRlcihpdGVtID0+ICFpdGVtLmlzRGlzYWJsZWQpLnNsaWNlKCk7XG4gICAgICB0aGlzLm9uU2VsZWN0QWxsLmVtaXQodGhpcy5lbWl0dGVkVmFsdWUodGhpcy5zZWxlY3RlZEl0ZW1zKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtdO1xuICAgICAgdGhpcy5vbkRlU2VsZWN0QWxsLmVtaXQodGhpcy5lbWl0dGVkVmFsdWUodGhpcy5zZWxlY3RlZEl0ZW1zKSk7XG4gICAgfVxuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayh0aGlzLmVtaXR0ZWRWYWx1ZSh0aGlzLnNlbGVjdGVkSXRlbXMpKTtcbiAgfVxuXG4gIGdldEZpZWxkcyhpbnB1dERhdGEpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBbXTtcbiAgICBpZiAodHlwZW9mIGlucHV0RGF0YSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICB9XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmZvcmluXG4gICAgZm9yIChjb25zdCBwcm9wIGluIGlucHV0RGF0YSkge1xuICAgICAgZmllbGRzLnB1c2gocHJvcCk7XG4gICAgfVxuICAgIHJldHVybiBmaWVsZHM7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/esm5/multiselect.model.js b/frontend/node_modules/ng-multiselect-dropdown/esm5/multiselect.model.js deleted file mode 100644 index 8471af7f..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/esm5/multiselect.model.js +++ /dev/null @@ -1,16 +0,0 @@ -var ListItem = /** @class */ (function () { - function ListItem(source) { - if (typeof source === 'string' || typeof source === 'number') { - this.id = this.text = source; - this.isDisabled = false; - } - if (typeof source === 'object') { - this.id = source.id; - this.text = source.text; - this.isDisabled = source.isDisabled; - } - } - return ListItem; -}()); -export { ListItem }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlzZWxlY3QubW9kZWwuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1tdWx0aXNlbGVjdC1kcm9wZG93bi8iLCJzb3VyY2VzIjpbIm11bHRpc2VsZWN0Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXFCQTtJQUtFLGtCQUFtQixNQUFXO1FBQzVCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtZQUM1RCxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO1lBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDOUIsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztZQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBQ0gsZUFBQztBQUFELENBQUMsQUFoQkQsSUFnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIElEcm9wZG93blNldHRpbmdzIHtcbiAgc2luZ2xlU2VsZWN0aW9uPzogYm9vbGVhbjtcbiAgaWRGaWVsZD86IHN0cmluZztcbiAgdGV4dEZpZWxkPzogc3RyaW5nO1xuICBkaXNhYmxlZEZpZWxkPzogc3RyaW5nO1xuICBlbmFibGVDaGVja0FsbD86IGJvb2xlYW47XG4gIHNlbGVjdEFsbFRleHQ/OiBzdHJpbmc7XG4gIHVuU2VsZWN0QWxsVGV4dD86IHN0cmluZztcbiAgYWxsb3dTZWFyY2hGaWx0ZXI/OiBib29sZWFuO1xuICBjbGVhclNlYXJjaEZpbHRlcj86IGJvb2xlYW47XG4gIG1heEhlaWdodD86IG51bWJlcjtcbiAgaXRlbXNTaG93TGltaXQ/OiBudW1iZXI7XG4gIGxpbWl0U2VsZWN0aW9uPzogbnVtYmVyO1xuICBzZWFyY2hQbGFjZWhvbGRlclRleHQ/OiBzdHJpbmc7XG4gIG5vRGF0YUF2YWlsYWJsZVBsYWNlaG9sZGVyVGV4dD86IHN0cmluZztcbiAgY2xvc2VEcm9wRG93bk9uU2VsZWN0aW9uPzogYm9vbGVhbjtcbiAgc2hvd1NlbGVjdGVkSXRlbXNBdFRvcD86IGJvb2xlYW47XG4gIGRlZmF1bHRPcGVuPzogYm9vbGVhbjtcbiAgYWxsb3dSZW1vdGVEYXRhU2VhcmNoPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIExpc3RJdGVtIHtcbiAgaWQ6IFN0cmluZyB8IG51bWJlcjtcbiAgdGV4dDogU3RyaW5nIHwgbnVtYmVyO1xuICBpc0Rpc2FibGVkPzogYm9vbGVhbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc291cmNlOiBhbnkpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHNvdXJjZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuaWQgPSB0aGlzLnRleHQgPSBzb3VyY2U7XG4gICAgICB0aGlzLmlzRGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLmlkID0gc291cmNlLmlkO1xuICAgICAgdGhpcy50ZXh0ID0gc291cmNlLnRleHQ7XG4gICAgICB0aGlzLmlzRGlzYWJsZWQgPSBzb3VyY2UuaXNEaXNhYmxlZDtcbiAgICB9XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/esm5/ng-multiselect-dropdown.js b/frontend/node_modules/ng-multiselect-dropdown/esm5/ng-multiselect-dropdown.js deleted file mode 100644 index 76cc82ff..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/esm5/ng-multiselect-dropdown.js +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Generated bundle index. Do not edit. - */ -export * from './public_api'; -export { ClickOutsideDirective as ɵc } from './click-outside.directive'; -export { ListFilterPipe as ɵb } from './list-filter.pipe'; -export { DROPDOWN_CONTROL_VALUE_ACCESSOR as ɵa } from './multiselect.component'; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctbXVsdGlzZWxlY3QtZHJvcGRvd24uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1tdWx0aXNlbGVjdC1kcm9wZG93bi8iLCJzb3VyY2VzIjpbIm5nLW11bHRpc2VsZWN0LWRyb3Bkb3duLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUM7QUFFN0IsT0FBTyxFQUFDLHFCQUFxQixJQUFJLEVBQUUsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxjQUFjLElBQUksRUFBRSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFDLCtCQUErQixJQUFJLEVBQUUsRUFBQyxNQUFNLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpY19hcGknO1xuXG5leHBvcnQge0NsaWNrT3V0c2lkZURpcmVjdGl2ZSBhcyDJtWN9IGZyb20gJy4vY2xpY2stb3V0c2lkZS5kaXJlY3RpdmUnO1xuZXhwb3J0IHtMaXN0RmlsdGVyUGlwZSBhcyDJtWJ9IGZyb20gJy4vbGlzdC1maWx0ZXIucGlwZSc7XG5leHBvcnQge0RST1BET1dOX0NPTlRST0xfVkFMVUVfQUNDRVNTT1IgYXMgybVhfSBmcm9tICcuL211bHRpc2VsZWN0LmNvbXBvbmVudCc7Il19 \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/esm5/ng-multiselect-dropdown.module.js b/frontend/node_modules/ng-multiselect-dropdown/esm5/ng-multiselect-dropdown.module.js deleted file mode 100644 index 6aa7f4fa..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/esm5/ng-multiselect-dropdown.module.js +++ /dev/null @@ -1,29 +0,0 @@ -import * as tslib_1 from "tslib"; -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { MultiSelectComponent } from './multiselect.component'; -import { ClickOutsideDirective } from './click-outside.directive'; -import { ListFilterPipe } from './list-filter.pipe'; -var NgMultiSelectDropDownModule = /** @class */ (function () { - function NgMultiSelectDropDownModule() { - } - NgMultiSelectDropDownModule_1 = NgMultiSelectDropDownModule; - NgMultiSelectDropDownModule.forRoot = function () { - return { - ngModule: NgMultiSelectDropDownModule_1 - }; - }; - var NgMultiSelectDropDownModule_1; - NgMultiSelectDropDownModule = NgMultiSelectDropDownModule_1 = tslib_1.__decorate([ - NgModule({ - imports: [CommonModule, FormsModule], - declarations: [MultiSelectComponent, ClickOutsideDirective, ListFilterPipe], - providers: [ListFilterPipe], - exports: [MultiSelectComponent] - }) - ], NgMultiSelectDropDownModule); - return NgMultiSelectDropDownModule; -}()); -export { NgMultiSelectDropDownModule }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctbXVsdGlzZWxlY3QtZHJvcGRvd24ubW9kdWxlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctbXVsdGlzZWxlY3QtZHJvcGRvd24vIiwic291cmNlcyI6WyJuZy1tdWx0aXNlbGVjdC1kcm9wZG93bi5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQXVCLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBU3BEO0lBQUE7SUFNQSxDQUFDO29DQU5ZLDJCQUEyQjtJQUM3QixtQ0FBTyxHQUFkO1FBQ0UsT0FBTztZQUNMLFFBQVEsRUFBRSw2QkFBMkI7U0FDdEMsQ0FBQztJQUNKLENBQUM7O0lBTFEsMkJBQTJCO1FBUHZDLFFBQVEsQ0FBQztZQUNSLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUM7WUFDcEMsWUFBWSxFQUFFLENBQUMsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUUsY0FBYyxDQUFDO1lBQzNFLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQztZQUMzQixPQUFPLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztTQUNoQyxDQUFDO09BRVcsMkJBQTJCLENBTXZDO0lBQUQsa0NBQUM7Q0FBQSxBQU5ELElBTUM7U0FOWSwyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuL211bHRpc2VsZWN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDbGlja091dHNpZGVEaXJlY3RpdmUgfSBmcm9tICcuL2NsaWNrLW91dHNpZGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IExpc3RGaWx0ZXJQaXBlIH0gZnJvbSAnLi9saXN0LWZpbHRlci5waXBlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtNdWx0aVNlbGVjdENvbXBvbmVudCwgQ2xpY2tPdXRzaWRlRGlyZWN0aXZlLCBMaXN0RmlsdGVyUGlwZV0sXG4gIHByb3ZpZGVyczogW0xpc3RGaWx0ZXJQaXBlXSxcbiAgZXhwb3J0czogW011bHRpU2VsZWN0Q29tcG9uZW50XVxufSlcblxuZXhwb3J0IGNsYXNzIE5nTXVsdGlTZWxlY3REcm9wRG93bk1vZHVsZSB7XG4gICAgc3RhdGljIGZvclJvb3QoKTogTW9kdWxlV2l0aFByb3ZpZGVyczxOZ011bHRpU2VsZWN0RHJvcERvd25Nb2R1bGU+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5nTW9kdWxlOiBOZ011bHRpU2VsZWN0RHJvcERvd25Nb2R1bGVcbiAgICAgIH07XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/esm5/public_api.js b/frontend/node_modules/ng-multiselect-dropdown/esm5/public_api.js deleted file mode 100644 index da739289..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/esm5/public_api.js +++ /dev/null @@ -1,3 +0,0 @@ -export { MultiSelectComponent } from './multiselect.component'; -export { NgMultiSelectDropDownModule } from './ng-multiselect-dropdown.module'; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLW11bHRpc2VsZWN0LWRyb3Bkb3duLyIsInNvdXJjZXMiOlsicHVibGljX2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IE11bHRpU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi9tdWx0aXNlbGVjdC5jb21wb25lbnQnO1xuZXhwb3J0IHsgTmdNdWx0aVNlbGVjdERyb3BEb3duTW9kdWxlIH0gZnJvbSAnLi9uZy1tdWx0aXNlbGVjdC1kcm9wZG93bi5tb2R1bGUnO1xuZXhwb3J0IHsgSURyb3Bkb3duU2V0dGluZ3MgfSBmcm9tICcuL211bHRpc2VsZWN0Lm1vZGVsJztcbiJdfQ== \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/fesm2015/ng-multiselect-dropdown.js b/frontend/node_modules/ng-multiselect-dropdown/fesm2015/ng-multiselect-dropdown.js deleted file mode 100644 index 8867d30a..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/fesm2015/ng-multiselect-dropdown.js +++ /dev/null @@ -1,434 +0,0 @@ -import { __decorate } from 'tslib'; -import { Pipe, forwardRef, EventEmitter, Input, Output, HostListener, Component, ChangeDetectionStrategy, ElementRef, Directive, NgModule } from '@angular/core'; -import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms'; -import { CommonModule } from '@angular/common'; - -class ListItem { - constructor(source) { - if (typeof source === 'string' || typeof source === 'number') { - this.id = this.text = source; - this.isDisabled = false; - } - if (typeof source === 'object') { - this.id = source.id; - this.text = source.text; - this.isDisabled = source.isDisabled; - } - } -} - -let ListFilterPipe = class ListFilterPipe { - transform(items, filter) { - if (!items || !filter) { - return items; - } - return items.filter((item) => this.applyFilter(item, filter)); - } - applyFilter(item, filter) { - if (typeof item.text === 'string' && typeof filter.text === 'string') { - return !(filter.text && item.text && item.text.toLowerCase().indexOf(filter.text.toLowerCase()) === -1); - } - else { - return !(filter.text && item.text && item.text.toString().toLowerCase().indexOf(filter.text.toString().toLowerCase()) === -1); - } - } -}; -ListFilterPipe = __decorate([ - Pipe({ - name: 'multiSelectFilter', - pure: false - }) -], ListFilterPipe); - -const DROPDOWN_CONTROL_VALUE_ACCESSOR = { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MultiSelectComponent), - multi: true -}; -const noop = () => { }; -const ɵ0 = noop; -let MultiSelectComponent = class MultiSelectComponent { - constructor(listFilterPipe) { - this.listFilterPipe = listFilterPipe; - this._data = []; - this.selectedItems = []; - this.isDropdownOpen = true; - this._placeholder = "Select"; - this._sourceDataType = null; // to keep note of the source data type. could be array of string/number/object - this._sourceDataFields = []; // store source data fields names - this.filter = new ListItem(this.data); - this.defaultSettings = { - singleSelection: false, - idField: "id", - textField: "text", - disabledField: "isDisabled", - enableCheckAll: true, - selectAllText: "Select All", - unSelectAllText: "UnSelect All", - allowSearchFilter: false, - limitSelection: -1, - clearSearchFilter: true, - maxHeight: 197, - itemsShowLimit: 999999999999, - searchPlaceholderText: "Search", - noDataAvailablePlaceholderText: "No data available", - closeDropDownOnSelection: false, - showSelectedItemsAtTop: false, - defaultOpen: false, - allowRemoteDataSearch: false - }; - this.disabled = false; - this.onFilterChange = new EventEmitter(); - this.onDropDownClose = new EventEmitter(); - this.onSelect = new EventEmitter(); - this.onDeSelect = new EventEmitter(); - this.onSelectAll = new EventEmitter(); - this.onDeSelectAll = new EventEmitter(); - this.onTouchedCallback = noop; - this.onChangeCallback = noop; - } - set placeholder(value) { - if (value) { - this._placeholder = value; - } - else { - this._placeholder = "Select"; - } - } - set settings(value) { - if (value) { - this._settings = Object.assign(this.defaultSettings, value); - } - else { - this._settings = Object.assign(this.defaultSettings); - } - } - set data(value) { - if (!value) { - this._data = []; - } - else { - const firstItem = value[0]; - this._sourceDataType = typeof firstItem; - this._sourceDataFields = this.getFields(firstItem); - this._data = value.map((item) => typeof item === "string" || typeof item === "number" - ? new ListItem(item) - : new ListItem({ - id: item[this._settings.idField], - text: item[this._settings.textField], - isDisabled: item[this._settings.disabledField] - })); - } - } - onFilterTextChange($event) { - this.onFilterChange.emit($event); - } - onItemClick($event, item) { - if (this.disabled || item.isDisabled) { - return false; - } - const found = this.isSelected(item); - const allowAdd = this._settings.limitSelection === -1 || (this._settings.limitSelection > 0 && this.selectedItems.length < this._settings.limitSelection); - if (!found) { - if (allowAdd) { - this.addSelected(item); - } - } - else { - this.removeSelected(item); - } - if (this._settings.singleSelection && this._settings.closeDropDownOnSelection) { - this.closeDropdown(); - } - } - writeValue(value) { - if (value !== undefined && value !== null && value.length > 0) { - if (this._settings.singleSelection) { - try { - if (value.length >= 1) { - const firstItem = value[0]; - this.selectedItems = [ - typeof firstItem === "string" || typeof firstItem === "number" - ? new ListItem(firstItem) - : new ListItem({ - id: firstItem[this._settings.idField], - text: firstItem[this._settings.textField], - isDisabled: firstItem[this._settings.disabledField] - }) - ]; - } - } - catch (e) { - // console.error(e.body.msg); - } - } - else { - const _data = value.map((item) => typeof item === "string" || typeof item === "number" - ? new ListItem(item) - : new ListItem({ - id: item[this._settings.idField], - text: item[this._settings.textField], - isDisabled: item[this._settings.disabledField] - })); - if (this._settings.limitSelection > 0) { - this.selectedItems = _data.splice(0, this._settings.limitSelection); - } - else { - this.selectedItems = _data; - } - } - } - else { - this.selectedItems = []; - } - this.onChangeCallback(value); - } - // From ControlValueAccessor interface - registerOnChange(fn) { - this.onChangeCallback = fn; - } - // From ControlValueAccessor interface - registerOnTouched(fn) { - this.onTouchedCallback = fn; - } - // Set touched on blur - onTouched() { - this.closeDropdown(); - this.onTouchedCallback(); - } - trackByFn(index, item) { - return item.id; - } - isSelected(clickedItem) { - let found = false; - this.selectedItems.forEach(item => { - if (clickedItem.id === item.id) { - found = true; - } - }); - return found; - } - isLimitSelectionReached() { - return this._settings.limitSelection === this.selectedItems.length; - } - isAllItemsSelected() { - // get disabld item count - let filteredItems = this.listFilterPipe.transform(this._data, this.filter); - const itemDisabledCount = filteredItems.filter(item => item.isDisabled).length; - // take disabled items into consideration when checking - if ((!this.data || this.data.length === 0) && this._settings.allowRemoteDataSearch) { - return false; - } - return filteredItems.length === this.selectedItems.length + itemDisabledCount; - } - showButton() { - if (!this._settings.singleSelection) { - if (this._settings.limitSelection > 0) { - return false; - } - // this._settings.enableCheckAll = this._settings.limitSelection === -1 ? true : false; - return true; // !this._settings.singleSelection && this._settings.enableCheckAll && this._data.length > 0; - } - else { - // should be disabled in single selection mode - return false; - } - } - itemShowRemaining() { - return this.selectedItems.length - this._settings.itemsShowLimit; - } - addSelected(item) { - if (this._settings.singleSelection) { - this.selectedItems = []; - this.selectedItems.push(item); - } - else { - this.selectedItems.push(item); - } - this.onChangeCallback(this.emittedValue(this.selectedItems)); - this.onSelect.emit(this.emittedValue(item)); - } - removeSelected(itemSel) { - this.selectedItems.forEach(item => { - if (itemSel.id === item.id) { - this.selectedItems.splice(this.selectedItems.indexOf(item), 1); - } - }); - this.onChangeCallback(this.emittedValue(this.selectedItems)); - this.onDeSelect.emit(this.emittedValue(itemSel)); - } - emittedValue(val) { - const selected = []; - if (Array.isArray(val)) { - val.map(item => { - selected.push(this.objectify(item)); - }); - } - else { - if (val) { - return this.objectify(val); - } - } - return selected; - } - objectify(val) { - if (this._sourceDataType === 'object') { - const obj = {}; - obj[this._settings.idField] = val.id; - obj[this._settings.textField] = val.text; - if (this._sourceDataFields.includes(this._settings.disabledField)) { - obj[this._settings.disabledField] = val.isDisabled; - } - return obj; - } - if (this._sourceDataType === 'number') { - return Number(val.id); - } - else { - return val.text; - } - } - toggleDropdown(evt) { - evt.preventDefault(); - if (this.disabled && this._settings.singleSelection) { - return; - } - this._settings.defaultOpen = !this._settings.defaultOpen; - if (!this._settings.defaultOpen) { - this.onDropDownClose.emit(); - } - } - closeDropdown() { - this._settings.defaultOpen = false; - // clear search text - if (this._settings.clearSearchFilter) { - this.filter.text = ""; - } - this.onDropDownClose.emit(); - } - toggleSelectAll() { - if (this.disabled) { - return false; - } - if (!this.isAllItemsSelected()) { - // filter out disabled item first before slicing - this.selectedItems = this.listFilterPipe.transform(this._data, this.filter).filter(item => !item.isDisabled).slice(); - this.onSelectAll.emit(this.emittedValue(this.selectedItems)); - } - else { - this.selectedItems = []; - this.onDeSelectAll.emit(this.emittedValue(this.selectedItems)); - } - this.onChangeCallback(this.emittedValue(this.selectedItems)); - } - getFields(inputData) { - const fields = []; - if (typeof inputData !== "object") { - return fields; - } - // tslint:disable-next-line:forin - for (const prop in inputData) { - fields.push(prop); - } - return fields; - } -}; -MultiSelectComponent.ctorParameters = () => [ - { type: ListFilterPipe } -]; -__decorate([ - Input() -], MultiSelectComponent.prototype, "placeholder", null); -__decorate([ - Input() -], MultiSelectComponent.prototype, "disabled", void 0); -__decorate([ - Input() -], MultiSelectComponent.prototype, "settings", null); -__decorate([ - Input() -], MultiSelectComponent.prototype, "data", null); -__decorate([ - Output("onFilterChange") -], MultiSelectComponent.prototype, "onFilterChange", void 0); -__decorate([ - Output("onDropDownClose") -], MultiSelectComponent.prototype, "onDropDownClose", void 0); -__decorate([ - Output("onSelect") -], MultiSelectComponent.prototype, "onSelect", void 0); -__decorate([ - Output("onDeSelect") -], MultiSelectComponent.prototype, "onDeSelect", void 0); -__decorate([ - Output("onSelectAll") -], MultiSelectComponent.prototype, "onSelectAll", void 0); -__decorate([ - Output("onDeSelectAll") -], MultiSelectComponent.prototype, "onDeSelectAll", void 0); -__decorate([ - HostListener("blur") -], MultiSelectComponent.prototype, "onTouched", null); -MultiSelectComponent = __decorate([ - Component({ - selector: "ng-multiselect-dropdown", - template: "
\n
\n \n {{_placeholder}}\n _settings.itemsShowLimit-1\">\n {{item.text}}\n x\n \n \n 0\">+{{itemShowRemaining()}}\n \n \n \n
\n
\n
    \n
  • 0 || _settings.allowRemoteDataSearch) && !_settings.singleSelection && _settings.enableCheckAll && _settings.limitSelection===-1\" class=\"multiselect-item-checkbox\" style=\"border-bottom: 1px solid #ccc;padding:10px\">\n \n
    {{!isAllItemsSelected() ? _settings.selectAllText : _settings.unSelectAllText}}
    \n
  • \n
  • 0 || _settings.allowRemoteDataSearch) && _settings.allowSearchFilter\">\n \n
  • \n
\n
    \n
  • \n \n
    {{item.text}}
    \n
  • \n
  • \n
    {{_settings.noDataAvailablePlaceholderText}}
    \n
  • \n
\n
\n
\n", - providers: [DROPDOWN_CONTROL_VALUE_ACCESSOR], - changeDetection: ChangeDetectionStrategy.OnPush, - styles: [".multiselect-dropdown{position:relative;width:100%;font-size:inherit;font-family:inherit}.multiselect-dropdown .dropdown-btn{display:inline-block;border:1px solid #adadad;width:100%;padding:6px 12px;margin-bottom:0;font-weight:400;line-height:1.52857143;text-align:left;vertical-align:middle;cursor:pointer;background-image:none;border-radius:4px}.multiselect-dropdown .dropdown-btn .selected-item{border:1px solid #337ab7;margin-right:4px;background:#337ab7;padding:0 5px;color:#fff;border-radius:2px;float:left;display:flex;max-width:100px}.multiselect-dropdown .dropdown-btn .selected-item span{overflow:hidden;text-overflow:ellipsis}.multiselect-dropdown .dropdown-btn .selected-item a{text-decoration:none}.multiselect-dropdown .dropdown-btn .selected-item:hover{box-shadow:1px 1px #959595}.multiselect-dropdown .dropdown-btn .dropdown-multiselect__caret{line-height:16px;display:block;position:absolute;box-sizing:border-box;width:40px;height:38px;right:1px;top:0;padding:4px 8px;margin:0;text-decoration:none;text-align:center;cursor:pointer;transition:transform .2s}.multiselect-dropdown .dropdown-btn .dropdown-multiselect__caret:before{position:relative;right:0;top:65%;color:#999;margin-top:4px;border-style:solid;border-width:8px 8px 0;border-color:#999 transparent;content:\"\"}.multiselect-dropdown .dropdown-btn .dropdown-multiselect--active .dropdown-multiselect__caret{transform:rotateZ(180deg)}.multiselect-dropdown .disabled>span{background-color:#eceeef}.dropdown-list{position:absolute;padding-top:6px;width:100%;z-index:9999;border:1px solid #ccc;border-radius:3px;background:#fff;margin-top:10px;box-shadow:0 1px 5px #959595}.dropdown-list ul{padding:0;list-style:none;overflow:auto;margin:0}.dropdown-list li{padding:6px 10px;cursor:pointer;text-align:left}.dropdown-list .filter-textbox{border-bottom:1px solid #ccc;position:relative;padding:10px}.dropdown-list .filter-textbox input{border:0;width:100%;padding:0 0 0 26px}.dropdown-list .filter-textbox input:focus{outline:0}.multiselect-item-checkbox:hover{background-color:#e4e3e3}.multiselect-item-checkbox input[type=checkbox]{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.multiselect-item-checkbox input[type=checkbox]:focus+div:before,.multiselect-item-checkbox input[type=checkbox]:hover+div:before{border-color:#337ab7;background-color:#f2f2f2}.multiselect-item-checkbox input[type=checkbox]:active+div:before{transition-duration:0s}.multiselect-item-checkbox input[type=checkbox]+div{position:relative;padding-left:2em;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;margin:0;color:#000}.multiselect-item-checkbox input[type=checkbox]+div:before{box-sizing:content-box;content:\"\";color:#337ab7;position:absolute;top:50%;left:0;width:14px;height:14px;margin-top:-9px;border:2px solid #337ab7;text-align:center;transition:.4s}.multiselect-item-checkbox input[type=checkbox]+div:after{box-sizing:content-box;content:\"\";position:absolute;transform:scale(0);transform-origin:50%;transition:transform .2s ease-out;background-color:transparent;top:50%;left:4px;width:8px;height:3px;margin-top:-4px;border-style:solid;border-color:#fff;border-width:0 0 3px 3px;-o-border-image:none;border-image:none;transform:rotate(-45deg) scale(0)}.multiselect-item-checkbox input[type=checkbox]:disabled+div:before{border-color:#ccc}.multiselect-item-checkbox input[type=checkbox]:disabled:focus+div:before .multiselect-item-checkbox input[type=checkbox]:disabled:hover+div:before{background-color:inherit}.multiselect-item-checkbox input[type=checkbox]:disabled:checked+div:before{background-color:#ccc}.multiselect-item-checkbox input[type=checkbox]:checked+div:after{content:\"\";transition:transform .2s ease-out;transform:rotate(-45deg) scale(1)}.multiselect-item-checkbox input[type=checkbox]:checked+div:before{-webkit-animation:.2s ease-in borderscale;animation:.2s ease-in borderscale;background:#337ab7}@-webkit-keyframes borderscale{50%{box-shadow:0 0 0 2px #337ab7}}@keyframes borderscale{50%{box-shadow:0 0 0 2px #337ab7}}"] - }) -], MultiSelectComponent); - -let ClickOutsideDirective = class ClickOutsideDirective { - constructor(_elementRef) { - this._elementRef = _elementRef; - this.clickOutside = new EventEmitter(); - } - onClick(event, targetElement) { - if (!targetElement) { - return; - } - const clickedInside = this._elementRef.nativeElement.contains(targetElement); - if (!clickedInside) { - this.clickOutside.emit(event); - } - } -}; -ClickOutsideDirective.ctorParameters = () => [ - { type: ElementRef } -]; -__decorate([ - Output() -], ClickOutsideDirective.prototype, "clickOutside", void 0); -__decorate([ - HostListener('document:click', ['$event', '$event.target']) -], ClickOutsideDirective.prototype, "onClick", null); -ClickOutsideDirective = __decorate([ - Directive({ - selector: '[clickOutside]' - }) -], ClickOutsideDirective); - -var NgMultiSelectDropDownModule_1; -let NgMultiSelectDropDownModule = NgMultiSelectDropDownModule_1 = class NgMultiSelectDropDownModule { - static forRoot() { - return { - ngModule: NgMultiSelectDropDownModule_1 - }; - } -}; -NgMultiSelectDropDownModule = NgMultiSelectDropDownModule_1 = __decorate([ - NgModule({ - imports: [CommonModule, FormsModule], - declarations: [MultiSelectComponent, ClickOutsideDirective, ListFilterPipe], - providers: [ListFilterPipe], - exports: [MultiSelectComponent] - }) -], NgMultiSelectDropDownModule); - -/** - * Generated bundle index. Do not edit. - */ - -export { MultiSelectComponent, NgMultiSelectDropDownModule, DROPDOWN_CONTROL_VALUE_ACCESSOR as ɵa, ListFilterPipe as ɵb, ClickOutsideDirective as ɵc }; -//# sourceMappingURL=ng-multiselect-dropdown.js.map diff --git a/frontend/node_modules/ng-multiselect-dropdown/fesm2015/ng-multiselect-dropdown.js.map b/frontend/node_modules/ng-multiselect-dropdown/fesm2015/ng-multiselect-dropdown.js.map deleted file mode 100644 index 3b984b81..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/fesm2015/ng-multiselect-dropdown.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ng-multiselect-dropdown.js","sources":["ng://ng-multiselect-dropdown/multiselect.model.ts","ng://ng-multiselect-dropdown/list-filter.pipe.ts","ng://ng-multiselect-dropdown/multiselect.component.ts","ng://ng-multiselect-dropdown/click-outside.directive.ts","ng://ng-multiselect-dropdown/ng-multiselect-dropdown.module.ts","ng://ng-multiselect-dropdown/ng-multiselect-dropdown.ts"],"sourcesContent":["export interface IDropdownSettings {\n singleSelection?: boolean;\n idField?: string;\n textField?: string;\n disabledField?: string;\n enableCheckAll?: boolean;\n selectAllText?: string;\n unSelectAllText?: string;\n allowSearchFilter?: boolean;\n clearSearchFilter?: boolean;\n maxHeight?: number;\n itemsShowLimit?: number;\n limitSelection?: number;\n searchPlaceholderText?: string;\n noDataAvailablePlaceholderText?: string;\n closeDropDownOnSelection?: boolean;\n showSelectedItemsAtTop?: boolean;\n defaultOpen?: boolean;\n allowRemoteDataSearch?: boolean;\n}\n\nexport class ListItem {\n id: String | number;\n text: String | number;\n isDisabled?: boolean;\n\n public constructor(source: any) {\n if (typeof source === 'string' || typeof source === 'number') {\n this.id = this.text = source;\n this.isDisabled = false;\n }\n if (typeof source === 'object') {\n this.id = source.id;\n this.text = source.text;\n this.isDisabled = source.isDisabled;\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { ListItem } from './multiselect.model';\n\n@Pipe({\n name: 'multiSelectFilter',\n pure: false\n})\nexport class ListFilterPipe implements PipeTransform {\n transform(items: ListItem[], filter: ListItem): ListItem[] {\n if (!items || !filter) {\n return items;\n }\n return items.filter((item: ListItem) => this.applyFilter(item, filter));\n }\n\n applyFilter(item: ListItem, filter: ListItem): boolean {\n if (typeof item.text === 'string' && typeof filter.text === 'string') {\n return !(filter.text && item.text && item.text.toLowerCase().indexOf(filter.text.toLowerCase()) === -1);\n } else {\n return !(filter.text && item.text && item.text.toString().toLowerCase().indexOf(filter.text.toString().toLowerCase()) === -1);\n }\n }\n}\n","import { Component, HostListener, forwardRef, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef } from \"@angular/core\";\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from \"@angular/forms\";\nimport { ListItem, IDropdownSettings } from \"./multiselect.model\";\nimport { ListFilterPipe } from \"./list-filter.pipe\";\n\nexport const DROPDOWN_CONTROL_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MultiSelectComponent),\n multi: true\n};\nconst noop = () => {};\n\n@Component({\n selector: \"ng-multiselect-dropdown\",\n templateUrl: \"./multi-select.component.html\",\n styleUrls: [\"./multi-select.component.scss\"],\n providers: [DROPDOWN_CONTROL_VALUE_ACCESSOR],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MultiSelectComponent implements ControlValueAccessor {\n public _settings: IDropdownSettings;\n public _data: Array = [];\n public selectedItems: Array = [];\n public isDropdownOpen = true;\n _placeholder = \"Select\";\n private _sourceDataType = null; // to keep note of the source data type. could be array of string/number/object\n private _sourceDataFields: Array = []; // store source data fields names\n filter: ListItem = new ListItem(this.data);\n defaultSettings: IDropdownSettings = {\n singleSelection: false,\n idField: \"id\",\n textField: \"text\",\n disabledField: \"isDisabled\",\n enableCheckAll: true,\n selectAllText: \"Select All\",\n unSelectAllText: \"UnSelect All\",\n allowSearchFilter: false,\n limitSelection: -1,\n clearSearchFilter: true,\n maxHeight: 197,\n itemsShowLimit: 999999999999,\n searchPlaceholderText: \"Search\",\n noDataAvailablePlaceholderText: \"No data available\",\n closeDropDownOnSelection: false,\n showSelectedItemsAtTop: false,\n defaultOpen: false,\n allowRemoteDataSearch: false\n };\n\n @Input()\n public set placeholder(value: string) {\n if (value) {\n this._placeholder = value;\n } else {\n this._placeholder = \"Select\";\n }\n }\n @Input()\n disabled = false;\n\n @Input()\n public set settings(value: IDropdownSettings) {\n if (value) {\n this._settings = Object.assign(this.defaultSettings, value);\n } else {\n this._settings = Object.assign(this.defaultSettings);\n }\n }\n\n @Input()\n public set data(value: Array) {\n if (!value) {\n this._data = [];\n } else {\n const firstItem = value[0];\n this._sourceDataType = typeof firstItem;\n this._sourceDataFields = this.getFields(firstItem);\n this._data = value.map((item: any) =>\n typeof item === \"string\" || typeof item === \"number\"\n ? new ListItem(item)\n : new ListItem({\n id: item[this._settings.idField],\n text: item[this._settings.textField],\n isDisabled: item[this._settings.disabledField]\n })\n );\n }\n }\n\n @Output(\"onFilterChange\")\n onFilterChange: EventEmitter = new EventEmitter();\n @Output(\"onDropDownClose\")\n onDropDownClose: EventEmitter = new EventEmitter();\n\n @Output(\"onSelect\")\n onSelect: EventEmitter = new EventEmitter();\n\n @Output(\"onDeSelect\")\n onDeSelect: EventEmitter = new EventEmitter();\n\n @Output(\"onSelectAll\")\n onSelectAll: EventEmitter> = new EventEmitter>();\n\n @Output(\"onDeSelectAll\")\n onDeSelectAll: EventEmitter> = new EventEmitter>();\n\n private onTouchedCallback: () => void = noop;\n private onChangeCallback: (_: any) => void = noop;\n\n onFilterTextChange($event) {\n this.onFilterChange.emit($event);\n }\n\n constructor(private listFilterPipe:ListFilterPipe) {}\n\n onItemClick($event: any, item: ListItem) {\n if (this.disabled || item.isDisabled) {\n return false;\n }\n\n const found = this.isSelected(item);\n const allowAdd = this._settings.limitSelection === -1 || (this._settings.limitSelection > 0 && this.selectedItems.length < this._settings.limitSelection);\n if (!found) {\n if (allowAdd) {\n this.addSelected(item);\n }\n } else {\n this.removeSelected(item);\n }\n if (this._settings.singleSelection && this._settings.closeDropDownOnSelection) {\n this.closeDropdown();\n }\n }\n\n writeValue(value: any) {\n if (value !== undefined && value !== null && value.length > 0) {\n if (this._settings.singleSelection) {\n try {\n if (value.length >= 1) {\n const firstItem = value[0];\n this.selectedItems = [\n typeof firstItem === \"string\" || typeof firstItem === \"number\"\n ? new ListItem(firstItem)\n : new ListItem({\n id: firstItem[this._settings.idField],\n text: firstItem[this._settings.textField],\n isDisabled: firstItem[this._settings.disabledField]\n })\n ];\n }\n } catch (e) {\n // console.error(e.body.msg);\n }\n } else {\n const _data = value.map((item: any) =>\n typeof item === \"string\" || typeof item === \"number\"\n ? new ListItem(item)\n : new ListItem({\n id: item[this._settings.idField],\n text: item[this._settings.textField],\n isDisabled: item[this._settings.disabledField]\n })\n );\n if (this._settings.limitSelection > 0) {\n this.selectedItems = _data.splice(0, this._settings.limitSelection);\n } else {\n this.selectedItems = _data;\n }\n }\n } else {\n this.selectedItems = [];\n }\n this.onChangeCallback(value);\n }\n\n // From ControlValueAccessor interface\n registerOnChange(fn: any) {\n this.onChangeCallback = fn;\n }\n\n // From ControlValueAccessor interface\n registerOnTouched(fn: any) {\n this.onTouchedCallback = fn;\n }\n\n // Set touched on blur\n @HostListener(\"blur\")\n public onTouched() {\n this.closeDropdown();\n this.onTouchedCallback();\n }\n\n trackByFn(index, item) {\n return item.id;\n }\n\n isSelected(clickedItem: ListItem) {\n let found = false;\n this.selectedItems.forEach(item => {\n if (clickedItem.id === item.id) {\n found = true;\n }\n });\n return found;\n }\n\n isLimitSelectionReached(): boolean {\n return this._settings.limitSelection === this.selectedItems.length;\n }\n\n isAllItemsSelected(): boolean {\n // get disabld item count\n let filteredItems = this.listFilterPipe.transform(this._data,this.filter);\n const itemDisabledCount = filteredItems.filter(item => item.isDisabled).length;\n // take disabled items into consideration when checking\n if ((!this.data || this.data.length === 0) && this._settings.allowRemoteDataSearch) {\n return false;\n }\n return filteredItems.length === this.selectedItems.length + itemDisabledCount;\n }\n\n showButton(): boolean {\n if (!this._settings.singleSelection) {\n if (this._settings.limitSelection > 0) {\n return false;\n }\n // this._settings.enableCheckAll = this._settings.limitSelection === -1 ? true : false;\n return true; // !this._settings.singleSelection && this._settings.enableCheckAll && this._data.length > 0;\n } else {\n // should be disabled in single selection mode\n return false;\n }\n }\n\n itemShowRemaining(): number {\n return this.selectedItems.length - this._settings.itemsShowLimit;\n }\n\n addSelected(item: ListItem) {\n if (this._settings.singleSelection) {\n this.selectedItems = [];\n this.selectedItems.push(item);\n } else {\n this.selectedItems.push(item);\n }\n this.onChangeCallback(this.emittedValue(this.selectedItems));\n this.onSelect.emit(this.emittedValue(item));\n }\n\n removeSelected(itemSel: ListItem) {\n this.selectedItems.forEach(item => {\n if (itemSel.id === item.id) {\n this.selectedItems.splice(this.selectedItems.indexOf(item), 1);\n }\n });\n this.onChangeCallback(this.emittedValue(this.selectedItems));\n this.onDeSelect.emit(this.emittedValue(itemSel));\n }\n\n emittedValue(val: any): any {\n const selected = [];\n if (Array.isArray(val)) {\n val.map(item => {\n selected.push(this.objectify(item));\n });\n } else {\n if (val) {\n return this.objectify(val);\n }\n }\n return selected;\n }\n\n objectify(val: ListItem) {\n if (this._sourceDataType === 'object') {\n const obj = {};\n obj[this._settings.idField] = val.id;\n obj[this._settings.textField] = val.text;\n if (this._sourceDataFields.includes(this._settings.disabledField)) {\n obj[this._settings.disabledField] = val.isDisabled;\n }\n return obj;\n }\n if (this._sourceDataType === 'number') {\n return Number(val.id);\n } else {\n return val.text;\n }\n }\n\n toggleDropdown(evt) {\n evt.preventDefault();\n if (this.disabled && this._settings.singleSelection) {\n return;\n }\n this._settings.defaultOpen = !this._settings.defaultOpen;\n if (!this._settings.defaultOpen) {\n this.onDropDownClose.emit();\n }\n }\n\n closeDropdown() {\n this._settings.defaultOpen = false;\n // clear search text\n if (this._settings.clearSearchFilter) {\n this.filter.text = \"\";\n }\n this.onDropDownClose.emit();\n }\n\n toggleSelectAll() {\n if (this.disabled) {\n return false;\n }\n if (!this.isAllItemsSelected()) {\n // filter out disabled item first before slicing\n this.selectedItems = this.listFilterPipe.transform(this._data,this.filter).filter(item => !item.isDisabled).slice();\n this.onSelectAll.emit(this.emittedValue(this.selectedItems));\n } else {\n this.selectedItems = [];\n this.onDeSelectAll.emit(this.emittedValue(this.selectedItems));\n }\n this.onChangeCallback(this.emittedValue(this.selectedItems));\n }\n\n getFields(inputData) {\n const fields = [];\n if (typeof inputData !== \"object\") {\n return fields;\n }\n // tslint:disable-next-line:forin\n for (const prop in inputData) {\n fields.push(prop);\n }\n return fields;\n }\n}\n","import {Directive, ElementRef, Output, EventEmitter, HostListener} from '@angular/core';\n\n@Directive({\n selector: '[clickOutside]'\n})\nexport class ClickOutsideDirective {\n constructor(private _elementRef: ElementRef) {\n }\n\n @Output()\n public clickOutside = new EventEmitter();\n\n @HostListener('document:click', ['$event', '$event.target'])\n public onClick(event: MouseEvent, targetElement: HTMLElement): void {\n if (!targetElement) {\n return;\n }\n\n const clickedInside = this._elementRef.nativeElement.contains(targetElement);\n if (!clickedInside) {\n this.clickOutside.emit(event);\n }\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MultiSelectComponent } from './multiselect.component';\nimport { ClickOutsideDirective } from './click-outside.directive';\nimport { ListFilterPipe } from './list-filter.pipe';\n\n@NgModule({\n imports: [CommonModule, FormsModule],\n declarations: [MultiSelectComponent, ClickOutsideDirective, ListFilterPipe],\n providers: [ListFilterPipe],\n exports: [MultiSelectComponent]\n})\n\nexport class NgMultiSelectDropDownModule {\n static forRoot(): ModuleWithProviders {\n return {\n ngModule: NgMultiSelectDropDownModule\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n\nexport {ClickOutsideDirective as ɵc} from './click-outside.directive';\nexport {ListFilterPipe as ɵb} from './list-filter.pipe';\nexport {DROPDOWN_CONTROL_VALUE_ACCESSOR as ɵa} from './multiselect.component';"],"names":["tslib_1.__decorate"],"mappings":"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"} \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/fesm5/ng-multiselect-dropdown.js b/frontend/node_modules/ng-multiselect-dropdown/fesm5/ng-multiselect-dropdown.js deleted file mode 100644 index 0e463684..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/fesm5/ng-multiselect-dropdown.js +++ /dev/null @@ -1,465 +0,0 @@ -import { __decorate } from 'tslib'; -import { Pipe, forwardRef, EventEmitter, Input, Output, HostListener, Component, ChangeDetectionStrategy, ElementRef, Directive, NgModule } from '@angular/core'; -import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms'; -import { CommonModule } from '@angular/common'; - -var ListItem = /** @class */ (function () { - function ListItem(source) { - if (typeof source === 'string' || typeof source === 'number') { - this.id = this.text = source; - this.isDisabled = false; - } - if (typeof source === 'object') { - this.id = source.id; - this.text = source.text; - this.isDisabled = source.isDisabled; - } - } - return ListItem; -}()); - -var ListFilterPipe = /** @class */ (function () { - function ListFilterPipe() { - } - ListFilterPipe.prototype.transform = function (items, filter) { - var _this = this; - if (!items || !filter) { - return items; - } - return items.filter(function (item) { return _this.applyFilter(item, filter); }); - }; - ListFilterPipe.prototype.applyFilter = function (item, filter) { - if (typeof item.text === 'string' && typeof filter.text === 'string') { - return !(filter.text && item.text && item.text.toLowerCase().indexOf(filter.text.toLowerCase()) === -1); - } - else { - return !(filter.text && item.text && item.text.toString().toLowerCase().indexOf(filter.text.toString().toLowerCase()) === -1); - } - }; - ListFilterPipe = __decorate([ - Pipe({ - name: 'multiSelectFilter', - pure: false - }) - ], ListFilterPipe); - return ListFilterPipe; -}()); - -var DROPDOWN_CONTROL_VALUE_ACCESSOR = { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(function () { return MultiSelectComponent; }), - multi: true -}; -var noop = function () { }; -var ɵ0 = noop; -var MultiSelectComponent = /** @class */ (function () { - function MultiSelectComponent(listFilterPipe) { - this.listFilterPipe = listFilterPipe; - this._data = []; - this.selectedItems = []; - this.isDropdownOpen = true; - this._placeholder = "Select"; - this._sourceDataType = null; // to keep note of the source data type. could be array of string/number/object - this._sourceDataFields = []; // store source data fields names - this.filter = new ListItem(this.data); - this.defaultSettings = { - singleSelection: false, - idField: "id", - textField: "text", - disabledField: "isDisabled", - enableCheckAll: true, - selectAllText: "Select All", - unSelectAllText: "UnSelect All", - allowSearchFilter: false, - limitSelection: -1, - clearSearchFilter: true, - maxHeight: 197, - itemsShowLimit: 999999999999, - searchPlaceholderText: "Search", - noDataAvailablePlaceholderText: "No data available", - closeDropDownOnSelection: false, - showSelectedItemsAtTop: false, - defaultOpen: false, - allowRemoteDataSearch: false - }; - this.disabled = false; - this.onFilterChange = new EventEmitter(); - this.onDropDownClose = new EventEmitter(); - this.onSelect = new EventEmitter(); - this.onDeSelect = new EventEmitter(); - this.onSelectAll = new EventEmitter(); - this.onDeSelectAll = new EventEmitter(); - this.onTouchedCallback = noop; - this.onChangeCallback = noop; - } - Object.defineProperty(MultiSelectComponent.prototype, "placeholder", { - set: function (value) { - if (value) { - this._placeholder = value; - } - else { - this._placeholder = "Select"; - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(MultiSelectComponent.prototype, "settings", { - set: function (value) { - if (value) { - this._settings = Object.assign(this.defaultSettings, value); - } - else { - this._settings = Object.assign(this.defaultSettings); - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(MultiSelectComponent.prototype, "data", { - set: function (value) { - var _this = this; - if (!value) { - this._data = []; - } - else { - var firstItem = value[0]; - this._sourceDataType = typeof firstItem; - this._sourceDataFields = this.getFields(firstItem); - this._data = value.map(function (item) { - return typeof item === "string" || typeof item === "number" - ? new ListItem(item) - : new ListItem({ - id: item[_this._settings.idField], - text: item[_this._settings.textField], - isDisabled: item[_this._settings.disabledField] - }); - }); - } - }, - enumerable: true, - configurable: true - }); - MultiSelectComponent.prototype.onFilterTextChange = function ($event) { - this.onFilterChange.emit($event); - }; - MultiSelectComponent.prototype.onItemClick = function ($event, item) { - if (this.disabled || item.isDisabled) { - return false; - } - var found = this.isSelected(item); - var allowAdd = this._settings.limitSelection === -1 || (this._settings.limitSelection > 0 && this.selectedItems.length < this._settings.limitSelection); - if (!found) { - if (allowAdd) { - this.addSelected(item); - } - } - else { - this.removeSelected(item); - } - if (this._settings.singleSelection && this._settings.closeDropDownOnSelection) { - this.closeDropdown(); - } - }; - MultiSelectComponent.prototype.writeValue = function (value) { - var _this = this; - if (value !== undefined && value !== null && value.length > 0) { - if (this._settings.singleSelection) { - try { - if (value.length >= 1) { - var firstItem = value[0]; - this.selectedItems = [ - typeof firstItem === "string" || typeof firstItem === "number" - ? new ListItem(firstItem) - : new ListItem({ - id: firstItem[this._settings.idField], - text: firstItem[this._settings.textField], - isDisabled: firstItem[this._settings.disabledField] - }) - ]; - } - } - catch (e) { - // console.error(e.body.msg); - } - } - else { - var _data = value.map(function (item) { - return typeof item === "string" || typeof item === "number" - ? new ListItem(item) - : new ListItem({ - id: item[_this._settings.idField], - text: item[_this._settings.textField], - isDisabled: item[_this._settings.disabledField] - }); - }); - if (this._settings.limitSelection > 0) { - this.selectedItems = _data.splice(0, this._settings.limitSelection); - } - else { - this.selectedItems = _data; - } - } - } - else { - this.selectedItems = []; - } - this.onChangeCallback(value); - }; - // From ControlValueAccessor interface - MultiSelectComponent.prototype.registerOnChange = function (fn) { - this.onChangeCallback = fn; - }; - // From ControlValueAccessor interface - MultiSelectComponent.prototype.registerOnTouched = function (fn) { - this.onTouchedCallback = fn; - }; - // Set touched on blur - MultiSelectComponent.prototype.onTouched = function () { - this.closeDropdown(); - this.onTouchedCallback(); - }; - MultiSelectComponent.prototype.trackByFn = function (index, item) { - return item.id; - }; - MultiSelectComponent.prototype.isSelected = function (clickedItem) { - var found = false; - this.selectedItems.forEach(function (item) { - if (clickedItem.id === item.id) { - found = true; - } - }); - return found; - }; - MultiSelectComponent.prototype.isLimitSelectionReached = function () { - return this._settings.limitSelection === this.selectedItems.length; - }; - MultiSelectComponent.prototype.isAllItemsSelected = function () { - // get disabld item count - var filteredItems = this.listFilterPipe.transform(this._data, this.filter); - var itemDisabledCount = filteredItems.filter(function (item) { return item.isDisabled; }).length; - // take disabled items into consideration when checking - if ((!this.data || this.data.length === 0) && this._settings.allowRemoteDataSearch) { - return false; - } - return filteredItems.length === this.selectedItems.length + itemDisabledCount; - }; - MultiSelectComponent.prototype.showButton = function () { - if (!this._settings.singleSelection) { - if (this._settings.limitSelection > 0) { - return false; - } - // this._settings.enableCheckAll = this._settings.limitSelection === -1 ? true : false; - return true; // !this._settings.singleSelection && this._settings.enableCheckAll && this._data.length > 0; - } - else { - // should be disabled in single selection mode - return false; - } - }; - MultiSelectComponent.prototype.itemShowRemaining = function () { - return this.selectedItems.length - this._settings.itemsShowLimit; - }; - MultiSelectComponent.prototype.addSelected = function (item) { - if (this._settings.singleSelection) { - this.selectedItems = []; - this.selectedItems.push(item); - } - else { - this.selectedItems.push(item); - } - this.onChangeCallback(this.emittedValue(this.selectedItems)); - this.onSelect.emit(this.emittedValue(item)); - }; - MultiSelectComponent.prototype.removeSelected = function (itemSel) { - var _this = this; - this.selectedItems.forEach(function (item) { - if (itemSel.id === item.id) { - _this.selectedItems.splice(_this.selectedItems.indexOf(item), 1); - } - }); - this.onChangeCallback(this.emittedValue(this.selectedItems)); - this.onDeSelect.emit(this.emittedValue(itemSel)); - }; - MultiSelectComponent.prototype.emittedValue = function (val) { - var _this = this; - var selected = []; - if (Array.isArray(val)) { - val.map(function (item) { - selected.push(_this.objectify(item)); - }); - } - else { - if (val) { - return this.objectify(val); - } - } - return selected; - }; - MultiSelectComponent.prototype.objectify = function (val) { - if (this._sourceDataType === 'object') { - var obj = {}; - obj[this._settings.idField] = val.id; - obj[this._settings.textField] = val.text; - if (this._sourceDataFields.includes(this._settings.disabledField)) { - obj[this._settings.disabledField] = val.isDisabled; - } - return obj; - } - if (this._sourceDataType === 'number') { - return Number(val.id); - } - else { - return val.text; - } - }; - MultiSelectComponent.prototype.toggleDropdown = function (evt) { - evt.preventDefault(); - if (this.disabled && this._settings.singleSelection) { - return; - } - this._settings.defaultOpen = !this._settings.defaultOpen; - if (!this._settings.defaultOpen) { - this.onDropDownClose.emit(); - } - }; - MultiSelectComponent.prototype.closeDropdown = function () { - this._settings.defaultOpen = false; - // clear search text - if (this._settings.clearSearchFilter) { - this.filter.text = ""; - } - this.onDropDownClose.emit(); - }; - MultiSelectComponent.prototype.toggleSelectAll = function () { - if (this.disabled) { - return false; - } - if (!this.isAllItemsSelected()) { - // filter out disabled item first before slicing - this.selectedItems = this.listFilterPipe.transform(this._data, this.filter).filter(function (item) { return !item.isDisabled; }).slice(); - this.onSelectAll.emit(this.emittedValue(this.selectedItems)); - } - else { - this.selectedItems = []; - this.onDeSelectAll.emit(this.emittedValue(this.selectedItems)); - } - this.onChangeCallback(this.emittedValue(this.selectedItems)); - }; - MultiSelectComponent.prototype.getFields = function (inputData) { - var fields = []; - if (typeof inputData !== "object") { - return fields; - } - // tslint:disable-next-line:forin - for (var prop in inputData) { - fields.push(prop); - } - return fields; - }; - MultiSelectComponent.ctorParameters = function () { return [ - { type: ListFilterPipe } - ]; }; - __decorate([ - Input() - ], MultiSelectComponent.prototype, "placeholder", null); - __decorate([ - Input() - ], MultiSelectComponent.prototype, "disabled", void 0); - __decorate([ - Input() - ], MultiSelectComponent.prototype, "settings", null); - __decorate([ - Input() - ], MultiSelectComponent.prototype, "data", null); - __decorate([ - Output("onFilterChange") - ], MultiSelectComponent.prototype, "onFilterChange", void 0); - __decorate([ - Output("onDropDownClose") - ], MultiSelectComponent.prototype, "onDropDownClose", void 0); - __decorate([ - Output("onSelect") - ], MultiSelectComponent.prototype, "onSelect", void 0); - __decorate([ - Output("onDeSelect") - ], MultiSelectComponent.prototype, "onDeSelect", void 0); - __decorate([ - Output("onSelectAll") - ], MultiSelectComponent.prototype, "onSelectAll", void 0); - __decorate([ - Output("onDeSelectAll") - ], MultiSelectComponent.prototype, "onDeSelectAll", void 0); - __decorate([ - HostListener("blur") - ], MultiSelectComponent.prototype, "onTouched", null); - MultiSelectComponent = __decorate([ - Component({ - selector: "ng-multiselect-dropdown", - template: "
\n
\n \n {{_placeholder}}\n _settings.itemsShowLimit-1\">\n {{item.text}}\n x\n \n \n 0\">+{{itemShowRemaining()}}\n \n \n \n
\n
\n
    \n
  • 0 || _settings.allowRemoteDataSearch) && !_settings.singleSelection && _settings.enableCheckAll && _settings.limitSelection===-1\" class=\"multiselect-item-checkbox\" style=\"border-bottom: 1px solid #ccc;padding:10px\">\n \n
    {{!isAllItemsSelected() ? _settings.selectAllText : _settings.unSelectAllText}}
    \n
  • \n
  • 0 || _settings.allowRemoteDataSearch) && _settings.allowSearchFilter\">\n \n
  • \n
\n
    \n
  • \n \n
    {{item.text}}
    \n
  • \n
  • \n
    {{_settings.noDataAvailablePlaceholderText}}
    \n
  • \n
\n
\n
\n", - providers: [DROPDOWN_CONTROL_VALUE_ACCESSOR], - changeDetection: ChangeDetectionStrategy.OnPush, - styles: [".multiselect-dropdown{position:relative;width:100%;font-size:inherit;font-family:inherit}.multiselect-dropdown .dropdown-btn{display:inline-block;border:1px solid #adadad;width:100%;padding:6px 12px;margin-bottom:0;font-weight:400;line-height:1.52857143;text-align:left;vertical-align:middle;cursor:pointer;background-image:none;border-radius:4px}.multiselect-dropdown .dropdown-btn .selected-item{border:1px solid #337ab7;margin-right:4px;background:#337ab7;padding:0 5px;color:#fff;border-radius:2px;float:left;display:flex;max-width:100px}.multiselect-dropdown .dropdown-btn .selected-item span{overflow:hidden;text-overflow:ellipsis}.multiselect-dropdown .dropdown-btn .selected-item a{text-decoration:none}.multiselect-dropdown .dropdown-btn .selected-item:hover{box-shadow:1px 1px #959595}.multiselect-dropdown .dropdown-btn .dropdown-multiselect__caret{line-height:16px;display:block;position:absolute;box-sizing:border-box;width:40px;height:38px;right:1px;top:0;padding:4px 8px;margin:0;text-decoration:none;text-align:center;cursor:pointer;transition:transform .2s}.multiselect-dropdown .dropdown-btn .dropdown-multiselect__caret:before{position:relative;right:0;top:65%;color:#999;margin-top:4px;border-style:solid;border-width:8px 8px 0;border-color:#999 transparent;content:\"\"}.multiselect-dropdown .dropdown-btn .dropdown-multiselect--active .dropdown-multiselect__caret{transform:rotateZ(180deg)}.multiselect-dropdown .disabled>span{background-color:#eceeef}.dropdown-list{position:absolute;padding-top:6px;width:100%;z-index:9999;border:1px solid #ccc;border-radius:3px;background:#fff;margin-top:10px;box-shadow:0 1px 5px #959595}.dropdown-list ul{padding:0;list-style:none;overflow:auto;margin:0}.dropdown-list li{padding:6px 10px;cursor:pointer;text-align:left}.dropdown-list .filter-textbox{border-bottom:1px solid #ccc;position:relative;padding:10px}.dropdown-list .filter-textbox input{border:0;width:100%;padding:0 0 0 26px}.dropdown-list .filter-textbox input:focus{outline:0}.multiselect-item-checkbox:hover{background-color:#e4e3e3}.multiselect-item-checkbox input[type=checkbox]{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.multiselect-item-checkbox input[type=checkbox]:focus+div:before,.multiselect-item-checkbox input[type=checkbox]:hover+div:before{border-color:#337ab7;background-color:#f2f2f2}.multiselect-item-checkbox input[type=checkbox]:active+div:before{transition-duration:0s}.multiselect-item-checkbox input[type=checkbox]+div{position:relative;padding-left:2em;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;margin:0;color:#000}.multiselect-item-checkbox input[type=checkbox]+div:before{box-sizing:content-box;content:\"\";color:#337ab7;position:absolute;top:50%;left:0;width:14px;height:14px;margin-top:-9px;border:2px solid #337ab7;text-align:center;transition:.4s}.multiselect-item-checkbox input[type=checkbox]+div:after{box-sizing:content-box;content:\"\";position:absolute;transform:scale(0);transform-origin:50%;transition:transform .2s ease-out;background-color:transparent;top:50%;left:4px;width:8px;height:3px;margin-top:-4px;border-style:solid;border-color:#fff;border-width:0 0 3px 3px;-o-border-image:none;border-image:none;transform:rotate(-45deg) scale(0)}.multiselect-item-checkbox input[type=checkbox]:disabled+div:before{border-color:#ccc}.multiselect-item-checkbox input[type=checkbox]:disabled:focus+div:before .multiselect-item-checkbox input[type=checkbox]:disabled:hover+div:before{background-color:inherit}.multiselect-item-checkbox input[type=checkbox]:disabled:checked+div:before{background-color:#ccc}.multiselect-item-checkbox input[type=checkbox]:checked+div:after{content:\"\";transition:transform .2s ease-out;transform:rotate(-45deg) scale(1)}.multiselect-item-checkbox input[type=checkbox]:checked+div:before{-webkit-animation:.2s ease-in borderscale;animation:.2s ease-in borderscale;background:#337ab7}@-webkit-keyframes borderscale{50%{box-shadow:0 0 0 2px #337ab7}}@keyframes borderscale{50%{box-shadow:0 0 0 2px #337ab7}}"] - }) - ], MultiSelectComponent); - return MultiSelectComponent; -}()); - -var ClickOutsideDirective = /** @class */ (function () { - function ClickOutsideDirective(_elementRef) { - this._elementRef = _elementRef; - this.clickOutside = new EventEmitter(); - } - ClickOutsideDirective.prototype.onClick = function (event, targetElement) { - if (!targetElement) { - return; - } - var clickedInside = this._elementRef.nativeElement.contains(targetElement); - if (!clickedInside) { - this.clickOutside.emit(event); - } - }; - ClickOutsideDirective.ctorParameters = function () { return [ - { type: ElementRef } - ]; }; - __decorate([ - Output() - ], ClickOutsideDirective.prototype, "clickOutside", void 0); - __decorate([ - HostListener('document:click', ['$event', '$event.target']) - ], ClickOutsideDirective.prototype, "onClick", null); - ClickOutsideDirective = __decorate([ - Directive({ - selector: '[clickOutside]' - }) - ], ClickOutsideDirective); - return ClickOutsideDirective; -}()); - -var NgMultiSelectDropDownModule = /** @class */ (function () { - function NgMultiSelectDropDownModule() { - } - NgMultiSelectDropDownModule_1 = NgMultiSelectDropDownModule; - NgMultiSelectDropDownModule.forRoot = function () { - return { - ngModule: NgMultiSelectDropDownModule_1 - }; - }; - var NgMultiSelectDropDownModule_1; - NgMultiSelectDropDownModule = NgMultiSelectDropDownModule_1 = __decorate([ - NgModule({ - imports: [CommonModule, FormsModule], - declarations: [MultiSelectComponent, ClickOutsideDirective, ListFilterPipe], - providers: [ListFilterPipe], - exports: [MultiSelectComponent] - }) - ], NgMultiSelectDropDownModule); - return NgMultiSelectDropDownModule; -}()); - -/** - * Generated bundle index. Do not edit. - */ - -export { MultiSelectComponent, NgMultiSelectDropDownModule, DROPDOWN_CONTROL_VALUE_ACCESSOR as ɵa, ListFilterPipe as ɵb, ClickOutsideDirective as ɵc }; -//# sourceMappingURL=ng-multiselect-dropdown.js.map diff --git a/frontend/node_modules/ng-multiselect-dropdown/fesm5/ng-multiselect-dropdown.js.map b/frontend/node_modules/ng-multiselect-dropdown/fesm5/ng-multiselect-dropdown.js.map deleted file mode 100644 index 49314c04..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/fesm5/ng-multiselect-dropdown.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ng-multiselect-dropdown.js","sources":["ng://ng-multiselect-dropdown/multiselect.model.ts","ng://ng-multiselect-dropdown/list-filter.pipe.ts","ng://ng-multiselect-dropdown/multiselect.component.ts","ng://ng-multiselect-dropdown/click-outside.directive.ts","ng://ng-multiselect-dropdown/ng-multiselect-dropdown.module.ts","ng://ng-multiselect-dropdown/ng-multiselect-dropdown.ts"],"sourcesContent":["export interface IDropdownSettings {\n singleSelection?: boolean;\n idField?: string;\n textField?: string;\n disabledField?: string;\n enableCheckAll?: boolean;\n selectAllText?: string;\n unSelectAllText?: string;\n allowSearchFilter?: boolean;\n clearSearchFilter?: boolean;\n maxHeight?: number;\n itemsShowLimit?: number;\n limitSelection?: number;\n searchPlaceholderText?: string;\n noDataAvailablePlaceholderText?: string;\n closeDropDownOnSelection?: boolean;\n showSelectedItemsAtTop?: boolean;\n defaultOpen?: boolean;\n allowRemoteDataSearch?: boolean;\n}\n\nexport class ListItem {\n id: String | number;\n text: String | number;\n isDisabled?: boolean;\n\n public constructor(source: any) {\n if (typeof source === 'string' || typeof source === 'number') {\n this.id = this.text = source;\n this.isDisabled = false;\n }\n if (typeof source === 'object') {\n this.id = source.id;\n this.text = source.text;\n this.isDisabled = source.isDisabled;\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { ListItem } from './multiselect.model';\n\n@Pipe({\n name: 'multiSelectFilter',\n pure: false\n})\nexport class ListFilterPipe implements PipeTransform {\n transform(items: ListItem[], filter: ListItem): ListItem[] {\n if (!items || !filter) {\n return items;\n }\n return items.filter((item: ListItem) => this.applyFilter(item, filter));\n }\n\n applyFilter(item: ListItem, filter: ListItem): boolean {\n if (typeof item.text === 'string' && typeof filter.text === 'string') {\n return !(filter.text && item.text && item.text.toLowerCase().indexOf(filter.text.toLowerCase()) === -1);\n } else {\n return !(filter.text && item.text && item.text.toString().toLowerCase().indexOf(filter.text.toString().toLowerCase()) === -1);\n }\n }\n}\n","import { Component, HostListener, forwardRef, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef } from \"@angular/core\";\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from \"@angular/forms\";\nimport { ListItem, IDropdownSettings } from \"./multiselect.model\";\nimport { ListFilterPipe } from \"./list-filter.pipe\";\n\nexport const DROPDOWN_CONTROL_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MultiSelectComponent),\n multi: true\n};\nconst noop = () => {};\n\n@Component({\n selector: \"ng-multiselect-dropdown\",\n templateUrl: \"./multi-select.component.html\",\n styleUrls: [\"./multi-select.component.scss\"],\n providers: [DROPDOWN_CONTROL_VALUE_ACCESSOR],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MultiSelectComponent implements ControlValueAccessor {\n public _settings: IDropdownSettings;\n public _data: Array = [];\n public selectedItems: Array = [];\n public isDropdownOpen = true;\n _placeholder = \"Select\";\n private _sourceDataType = null; // to keep note of the source data type. could be array of string/number/object\n private _sourceDataFields: Array = []; // store source data fields names\n filter: ListItem = new ListItem(this.data);\n defaultSettings: IDropdownSettings = {\n singleSelection: false,\n idField: \"id\",\n textField: \"text\",\n disabledField: \"isDisabled\",\n enableCheckAll: true,\n selectAllText: \"Select All\",\n unSelectAllText: \"UnSelect All\",\n allowSearchFilter: false,\n limitSelection: -1,\n clearSearchFilter: true,\n maxHeight: 197,\n itemsShowLimit: 999999999999,\n searchPlaceholderText: \"Search\",\n noDataAvailablePlaceholderText: \"No data available\",\n closeDropDownOnSelection: false,\n showSelectedItemsAtTop: false,\n defaultOpen: false,\n allowRemoteDataSearch: false\n };\n\n @Input()\n public set placeholder(value: string) {\n if (value) {\n this._placeholder = value;\n } else {\n this._placeholder = \"Select\";\n }\n }\n @Input()\n disabled = false;\n\n @Input()\n public set settings(value: IDropdownSettings) {\n if (value) {\n this._settings = Object.assign(this.defaultSettings, value);\n } else {\n this._settings = Object.assign(this.defaultSettings);\n }\n }\n\n @Input()\n public set data(value: Array) {\n if (!value) {\n this._data = [];\n } else {\n const firstItem = value[0];\n this._sourceDataType = typeof firstItem;\n this._sourceDataFields = this.getFields(firstItem);\n this._data = value.map((item: any) =>\n typeof item === \"string\" || typeof item === \"number\"\n ? new ListItem(item)\n : new ListItem({\n id: item[this._settings.idField],\n text: item[this._settings.textField],\n isDisabled: item[this._settings.disabledField]\n })\n );\n }\n }\n\n @Output(\"onFilterChange\")\n onFilterChange: EventEmitter = new EventEmitter();\n @Output(\"onDropDownClose\")\n onDropDownClose: EventEmitter = new EventEmitter();\n\n @Output(\"onSelect\")\n onSelect: EventEmitter = new EventEmitter();\n\n @Output(\"onDeSelect\")\n onDeSelect: EventEmitter = new EventEmitter();\n\n @Output(\"onSelectAll\")\n onSelectAll: EventEmitter> = new EventEmitter>();\n\n @Output(\"onDeSelectAll\")\n onDeSelectAll: EventEmitter> = new EventEmitter>();\n\n private onTouchedCallback: () => void = noop;\n private onChangeCallback: (_: any) => void = noop;\n\n onFilterTextChange($event) {\n this.onFilterChange.emit($event);\n }\n\n constructor(private listFilterPipe:ListFilterPipe) {}\n\n onItemClick($event: any, item: ListItem) {\n if (this.disabled || item.isDisabled) {\n return false;\n }\n\n const found = this.isSelected(item);\n const allowAdd = this._settings.limitSelection === -1 || (this._settings.limitSelection > 0 && this.selectedItems.length < this._settings.limitSelection);\n if (!found) {\n if (allowAdd) {\n this.addSelected(item);\n }\n } else {\n this.removeSelected(item);\n }\n if (this._settings.singleSelection && this._settings.closeDropDownOnSelection) {\n this.closeDropdown();\n }\n }\n\n writeValue(value: any) {\n if (value !== undefined && value !== null && value.length > 0) {\n if (this._settings.singleSelection) {\n try {\n if (value.length >= 1) {\n const firstItem = value[0];\n this.selectedItems = [\n typeof firstItem === \"string\" || typeof firstItem === \"number\"\n ? new ListItem(firstItem)\n : new ListItem({\n id: firstItem[this._settings.idField],\n text: firstItem[this._settings.textField],\n isDisabled: firstItem[this._settings.disabledField]\n })\n ];\n }\n } catch (e) {\n // console.error(e.body.msg);\n }\n } else {\n const _data = value.map((item: any) =>\n typeof item === \"string\" || typeof item === \"number\"\n ? new ListItem(item)\n : new ListItem({\n id: item[this._settings.idField],\n text: item[this._settings.textField],\n isDisabled: item[this._settings.disabledField]\n })\n );\n if (this._settings.limitSelection > 0) {\n this.selectedItems = _data.splice(0, this._settings.limitSelection);\n } else {\n this.selectedItems = _data;\n }\n }\n } else {\n this.selectedItems = [];\n }\n this.onChangeCallback(value);\n }\n\n // From ControlValueAccessor interface\n registerOnChange(fn: any) {\n this.onChangeCallback = fn;\n }\n\n // From ControlValueAccessor interface\n registerOnTouched(fn: any) {\n this.onTouchedCallback = fn;\n }\n\n // Set touched on blur\n @HostListener(\"blur\")\n public onTouched() {\n this.closeDropdown();\n this.onTouchedCallback();\n }\n\n trackByFn(index, item) {\n return item.id;\n }\n\n isSelected(clickedItem: ListItem) {\n let found = false;\n this.selectedItems.forEach(item => {\n if (clickedItem.id === item.id) {\n found = true;\n }\n });\n return found;\n }\n\n isLimitSelectionReached(): boolean {\n return this._settings.limitSelection === this.selectedItems.length;\n }\n\n isAllItemsSelected(): boolean {\n // get disabld item count\n let filteredItems = this.listFilterPipe.transform(this._data,this.filter);\n const itemDisabledCount = filteredItems.filter(item => item.isDisabled).length;\n // take disabled items into consideration when checking\n if ((!this.data || this.data.length === 0) && this._settings.allowRemoteDataSearch) {\n return false;\n }\n return filteredItems.length === this.selectedItems.length + itemDisabledCount;\n }\n\n showButton(): boolean {\n if (!this._settings.singleSelection) {\n if (this._settings.limitSelection > 0) {\n return false;\n }\n // this._settings.enableCheckAll = this._settings.limitSelection === -1 ? true : false;\n return true; // !this._settings.singleSelection && this._settings.enableCheckAll && this._data.length > 0;\n } else {\n // should be disabled in single selection mode\n return false;\n }\n }\n\n itemShowRemaining(): number {\n return this.selectedItems.length - this._settings.itemsShowLimit;\n }\n\n addSelected(item: ListItem) {\n if (this._settings.singleSelection) {\n this.selectedItems = [];\n this.selectedItems.push(item);\n } else {\n this.selectedItems.push(item);\n }\n this.onChangeCallback(this.emittedValue(this.selectedItems));\n this.onSelect.emit(this.emittedValue(item));\n }\n\n removeSelected(itemSel: ListItem) {\n this.selectedItems.forEach(item => {\n if (itemSel.id === item.id) {\n this.selectedItems.splice(this.selectedItems.indexOf(item), 1);\n }\n });\n this.onChangeCallback(this.emittedValue(this.selectedItems));\n this.onDeSelect.emit(this.emittedValue(itemSel));\n }\n\n emittedValue(val: any): any {\n const selected = [];\n if (Array.isArray(val)) {\n val.map(item => {\n selected.push(this.objectify(item));\n });\n } else {\n if (val) {\n return this.objectify(val);\n }\n }\n return selected;\n }\n\n objectify(val: ListItem) {\n if (this._sourceDataType === 'object') {\n const obj = {};\n obj[this._settings.idField] = val.id;\n obj[this._settings.textField] = val.text;\n if (this._sourceDataFields.includes(this._settings.disabledField)) {\n obj[this._settings.disabledField] = val.isDisabled;\n }\n return obj;\n }\n if (this._sourceDataType === 'number') {\n return Number(val.id);\n } else {\n return val.text;\n }\n }\n\n toggleDropdown(evt) {\n evt.preventDefault();\n if (this.disabled && this._settings.singleSelection) {\n return;\n }\n this._settings.defaultOpen = !this._settings.defaultOpen;\n if (!this._settings.defaultOpen) {\n this.onDropDownClose.emit();\n }\n }\n\n closeDropdown() {\n this._settings.defaultOpen = false;\n // clear search text\n if (this._settings.clearSearchFilter) {\n this.filter.text = \"\";\n }\n this.onDropDownClose.emit();\n }\n\n toggleSelectAll() {\n if (this.disabled) {\n return false;\n }\n if (!this.isAllItemsSelected()) {\n // filter out disabled item first before slicing\n this.selectedItems = this.listFilterPipe.transform(this._data,this.filter).filter(item => !item.isDisabled).slice();\n this.onSelectAll.emit(this.emittedValue(this.selectedItems));\n } else {\n this.selectedItems = [];\n this.onDeSelectAll.emit(this.emittedValue(this.selectedItems));\n }\n this.onChangeCallback(this.emittedValue(this.selectedItems));\n }\n\n getFields(inputData) {\n const fields = [];\n if (typeof inputData !== \"object\") {\n return fields;\n }\n // tslint:disable-next-line:forin\n for (const prop in inputData) {\n fields.push(prop);\n }\n return fields;\n }\n}\n","import {Directive, ElementRef, Output, EventEmitter, HostListener} from '@angular/core';\n\n@Directive({\n selector: '[clickOutside]'\n})\nexport class ClickOutsideDirective {\n constructor(private _elementRef: ElementRef) {\n }\n\n @Output()\n public clickOutside = new EventEmitter();\n\n @HostListener('document:click', ['$event', '$event.target'])\n public onClick(event: MouseEvent, targetElement: HTMLElement): void {\n if (!targetElement) {\n return;\n }\n\n const clickedInside = this._elementRef.nativeElement.contains(targetElement);\n if (!clickedInside) {\n this.clickOutside.emit(event);\n }\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MultiSelectComponent } from './multiselect.component';\nimport { ClickOutsideDirective } from './click-outside.directive';\nimport { ListFilterPipe } from './list-filter.pipe';\n\n@NgModule({\n imports: [CommonModule, FormsModule],\n declarations: [MultiSelectComponent, ClickOutsideDirective, ListFilterPipe],\n providers: [ListFilterPipe],\n exports: [MultiSelectComponent]\n})\n\nexport class NgMultiSelectDropDownModule {\n static forRoot(): ModuleWithProviders {\n return {\n ngModule: NgMultiSelectDropDownModule\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n\nexport {ClickOutsideDirective as ɵc} from './click-outside.directive';\nexport {ListFilterPipe as ɵb} from './list-filter.pipe';\nexport {DROPDOWN_CONTROL_VALUE_ACCESSOR as ɵa} from './multiselect.component';"],"names":["tslib_1.__decorate"],"mappings":"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"} \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/list-filter.pipe.d.ts b/frontend/node_modules/ng-multiselect-dropdown/list-filter.pipe.d.ts deleted file mode 100644 index db411240..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/list-filter.pipe.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { PipeTransform } from '@angular/core'; -import { ListItem } from './multiselect.model'; -import * as ɵngcc0 from '@angular/core'; -export declare class ListFilterPipe implements PipeTransform { - transform(items: ListItem[], filter: ListItem): ListItem[]; - applyFilter(item: ListItem, filter: ListItem): boolean; - static ɵfac: ɵngcc0.ɵɵFactoryDeclaration; - static ɵpipe: ɵngcc0.ɵɵPipeDeclaration; -} - -//# sourceMappingURL=list-filter.pipe.d.ts.map \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/multiselect.component.d.ts b/frontend/node_modules/ng-multiselect-dropdown/multiselect.component.d.ts deleted file mode 100644 index bafe2e08..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/multiselect.component.d.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { EventEmitter } from "@angular/core"; -import { ControlValueAccessor } from "@angular/forms"; -import { ListItem, IDropdownSettings } from "./multiselect.model"; -import { ListFilterPipe } from "./list-filter.pipe"; -import * as ɵngcc0 from '@angular/core'; -export declare const DROPDOWN_CONTROL_VALUE_ACCESSOR: any; -export declare class MultiSelectComponent implements ControlValueAccessor { - private listFilterPipe; - _settings: IDropdownSettings; - _data: Array; - selectedItems: Array; - isDropdownOpen: boolean; - _placeholder: string; - private _sourceDataType; - private _sourceDataFields; - filter: ListItem; - defaultSettings: IDropdownSettings; - placeholder: string; - disabled: boolean; - settings: IDropdownSettings; - data: Array; - onFilterChange: EventEmitter; - onDropDownClose: EventEmitter; - onSelect: EventEmitter; - onDeSelect: EventEmitter; - onSelectAll: EventEmitter>; - onDeSelectAll: EventEmitter>; - private onTouchedCallback; - private onChangeCallback; - onFilterTextChange($event: any): void; - constructor(listFilterPipe: ListFilterPipe); - onItemClick($event: any, item: ListItem): boolean; - writeValue(value: any): void; - registerOnChange(fn: any): void; - registerOnTouched(fn: any): void; - onTouched(): void; - trackByFn(index: any, item: any): any; - isSelected(clickedItem: ListItem): boolean; - isLimitSelectionReached(): boolean; - isAllItemsSelected(): boolean; - showButton(): boolean; - itemShowRemaining(): number; - addSelected(item: ListItem): void; - removeSelected(itemSel: ListItem): void; - emittedValue(val: any): any; - objectify(val: ListItem): {}; - toggleDropdown(evt: any): void; - closeDropdown(): void; - toggleSelectAll(): boolean; - getFields(inputData: any): any[]; - static ɵfac: ɵngcc0.ɵɵFactoryDeclaration; - static ɵcmp: ɵngcc0.ɵɵComponentDeclaration; -} - -//# sourceMappingURL=multiselect.component.d.ts.map \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/multiselect.model.d.ts b/frontend/node_modules/ng-multiselect-dropdown/multiselect.model.d.ts deleted file mode 100644 index 5c4cbcc0..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/multiselect.model.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -export interface IDropdownSettings { - singleSelection?: boolean; - idField?: string; - textField?: string; - disabledField?: string; - enableCheckAll?: boolean; - selectAllText?: string; - unSelectAllText?: string; - allowSearchFilter?: boolean; - clearSearchFilter?: boolean; - maxHeight?: number; - itemsShowLimit?: number; - limitSelection?: number; - searchPlaceholderText?: string; - noDataAvailablePlaceholderText?: string; - closeDropDownOnSelection?: boolean; - showSelectedItemsAtTop?: boolean; - defaultOpen?: boolean; - allowRemoteDataSearch?: boolean; -} -export declare class ListItem { - id: String | number; - text: String | number; - isDisabled?: boolean; - constructor(source: any); -} diff --git a/frontend/node_modules/ng-multiselect-dropdown/ng-multiselect-dropdown.d.ts b/frontend/node_modules/ng-multiselect-dropdown/ng-multiselect-dropdown.d.ts deleted file mode 100644 index 0969ca63..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/ng-multiselect-dropdown.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Generated bundle index. Do not edit. - */ -export * from './public_api'; -export { ClickOutsideDirective as ɵc } from './click-outside.directive'; -export { ListFilterPipe as ɵb } from './list-filter.pipe'; -export { DROPDOWN_CONTROL_VALUE_ACCESSOR as ɵa } from './multiselect.component'; - -//# sourceMappingURL=ng-multiselect-dropdown.d.ts.map \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/ng-multiselect-dropdown.metadata.json b/frontend/node_modules/ng-multiselect-dropdown/ng-multiselect-dropdown.metadata.json deleted file mode 100644 index f3aeaac3..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/ng-multiselect-dropdown.metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"__symbolic":"module","version":4,"metadata":{"ɵa":{"provide":{"__symbolic":"reference","module":"@angular/forms","name":"NG_VALUE_ACCESSOR","line":6,"character":11},"useExisting":{"__symbolic":"reference","name":"MultiSelectComponent"},"multi":true},"MultiSelectComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":12,"character":1},"arguments":[{"selector":"ng-multiselect-dropdown","providers":[{"__symbolic":"reference","name":"ɵa"}],"changeDetection":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ChangeDetectionStrategy","line":17,"character":19},"member":"OnPush"},"template":"
\n
\n \n {{_placeholder}}\n _settings.itemsShowLimit-1\">\n {{item.text}}\n x\n \n \n 0\">+{{itemShowRemaining()}}\n \n \n \n
\n
\n
    \n
  • 0 || _settings.allowRemoteDataSearch) && !_settings.singleSelection && _settings.enableCheckAll && _settings.limitSelection===-1\" class=\"multiselect-item-checkbox\" style=\"border-bottom: 1px solid #ccc;padding:10px\">\n \n
    {{!isAllItemsSelected() ? _settings.selectAllText : _settings.unSelectAllText}}
    \n
  • \n
  • 0 || _settings.allowRemoteDataSearch) && _settings.allowSearchFilter\">\n \n
  • \n
\n
    \n
  • \n \n
    {{item.text}}
    \n
  • \n
  • \n
    {{_settings.noDataAvailablePlaceholderText}}
    \n
  • \n
\n
\n
\n","styles":[".multiselect-dropdown{position:relative;width:100%;font-size:inherit;font-family:inherit}.multiselect-dropdown .dropdown-btn{display:inline-block;border:1px solid #adadad;width:100%;padding:6px 12px;margin-bottom:0;font-weight:400;line-height:1.52857143;text-align:left;vertical-align:middle;cursor:pointer;background-image:none;border-radius:4px}.multiselect-dropdown .dropdown-btn .selected-item{border:1px solid #337ab7;margin-right:4px;background:#337ab7;padding:0 5px;color:#fff;border-radius:2px;float:left;display:flex;max-width:100px}.multiselect-dropdown .dropdown-btn .selected-item span{overflow:hidden;text-overflow:ellipsis}.multiselect-dropdown .dropdown-btn .selected-item a{text-decoration:none}.multiselect-dropdown .dropdown-btn .selected-item:hover{box-shadow:1px 1px #959595}.multiselect-dropdown .dropdown-btn .dropdown-multiselect__caret{line-height:16px;display:block;position:absolute;box-sizing:border-box;width:40px;height:38px;right:1px;top:0;padding:4px 8px;margin:0;text-decoration:none;text-align:center;cursor:pointer;transition:transform .2s}.multiselect-dropdown .dropdown-btn .dropdown-multiselect__caret:before{position:relative;right:0;top:65%;color:#999;margin-top:4px;border-style:solid;border-width:8px 8px 0;border-color:#999 transparent;content:\"\"}.multiselect-dropdown .dropdown-btn .dropdown-multiselect--active .dropdown-multiselect__caret{transform:rotateZ(180deg)}.multiselect-dropdown .disabled>span{background-color:#eceeef}.dropdown-list{position:absolute;padding-top:6px;width:100%;z-index:9999;border:1px solid #ccc;border-radius:3px;background:#fff;margin-top:10px;box-shadow:0 1px 5px #959595}.dropdown-list ul{padding:0;list-style:none;overflow:auto;margin:0}.dropdown-list li{padding:6px 10px;cursor:pointer;text-align:left}.dropdown-list .filter-textbox{border-bottom:1px solid #ccc;position:relative;padding:10px}.dropdown-list .filter-textbox input{border:0;width:100%;padding:0 0 0 26px}.dropdown-list .filter-textbox input:focus{outline:0}.multiselect-item-checkbox:hover{background-color:#e4e3e3}.multiselect-item-checkbox input[type=checkbox]{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.multiselect-item-checkbox input[type=checkbox]:focus+div:before,.multiselect-item-checkbox input[type=checkbox]:hover+div:before{border-color:#337ab7;background-color:#f2f2f2}.multiselect-item-checkbox input[type=checkbox]:active+div:before{transition-duration:0s}.multiselect-item-checkbox input[type=checkbox]+div{position:relative;padding-left:2em;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;margin:0;color:#000}.multiselect-item-checkbox input[type=checkbox]+div:before{box-sizing:content-box;content:\"\";color:#337ab7;position:absolute;top:50%;left:0;width:14px;height:14px;margin-top:-9px;border:2px solid #337ab7;text-align:center;transition:.4s}.multiselect-item-checkbox input[type=checkbox]+div:after{box-sizing:content-box;content:\"\";position:absolute;transform:scale(0);transform-origin:50%;transition:transform .2s ease-out;background-color:transparent;top:50%;left:4px;width:8px;height:3px;margin-top:-4px;border-style:solid;border-color:#fff;border-width:0 0 3px 3px;-o-border-image:none;border-image:none;transform:rotate(-45deg) scale(0)}.multiselect-item-checkbox input[type=checkbox]:disabled+div:before{border-color:#ccc}.multiselect-item-checkbox input[type=checkbox]:disabled:focus+div:before .multiselect-item-checkbox input[type=checkbox]:disabled:hover+div:before{background-color:inherit}.multiselect-item-checkbox input[type=checkbox]:disabled:checked+div:before{background-color:#ccc}.multiselect-item-checkbox input[type=checkbox]:checked+div:after{content:\"\";transition:transform .2s ease-out;transform:rotate(-45deg) scale(1)}.multiselect-item-checkbox input[type=checkbox]:checked+div:before{-webkit-animation:.2s ease-in borderscale;animation:.2s ease-in borderscale;background:#337ab7}@-webkit-keyframes borderscale{50%{box-shadow:0 0 0 2px #337ab7}}@keyframes borderscale{50%{box-shadow:0 0 0 2px #337ab7}}"]}]}],"members":{"placeholder":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":49,"character":3}}]}],"disabled":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":57,"character":3}}]}],"settings":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":60,"character":3}}]}],"data":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":69,"character":3}}]}],"onFilterChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":89,"character":3},"arguments":["onFilterChange"]}]}],"onDropDownClose":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":91,"character":3},"arguments":["onDropDownClose"]}]}],"onSelect":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":94,"character":3},"arguments":["onSelect"]}]}],"onDeSelect":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":97,"character":3},"arguments":["onDeSelect"]}]}],"onSelectAll":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":100,"character":3},"arguments":["onSelectAll"]}]}],"onDeSelectAll":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":103,"character":3},"arguments":["onDeSelectAll"]}]}],"onFilterTextChange":[{"__symbolic":"method"}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"ɵb"}]}],"onItemClick":[{"__symbolic":"method"}],"writeValue":[{"__symbolic":"method"}],"registerOnChange":[{"__symbolic":"method"}],"registerOnTouched":[{"__symbolic":"method"}],"onTouched":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":186,"character":3},"arguments":["blur"]}]}],"trackByFn":[{"__symbolic":"method"}],"isSelected":[{"__symbolic":"method"}],"isLimitSelectionReached":[{"__symbolic":"method"}],"isAllItemsSelected":[{"__symbolic":"method"}],"showButton":[{"__symbolic":"method"}],"itemShowRemaining":[{"__symbolic":"method"}],"addSelected":[{"__symbolic":"method"}],"removeSelected":[{"__symbolic":"method"}],"emittedValue":[{"__symbolic":"method"}],"objectify":[{"__symbolic":"method"}],"toggleDropdown":[{"__symbolic":"method"}],"closeDropdown":[{"__symbolic":"method"}],"toggleSelectAll":[{"__symbolic":"method"}],"getFields":[{"__symbolic":"method"}]}},"NgMultiSelectDropDownModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":7,"character":1},"arguments":[{"imports":[{"__symbolic":"reference","module":"@angular/common","name":"CommonModule","line":8,"character":12},{"__symbolic":"reference","module":"@angular/forms","name":"FormsModule","line":8,"character":26}],"declarations":[{"__symbolic":"reference","name":"MultiSelectComponent"},{"__symbolic":"reference","name":"ɵc"},{"__symbolic":"reference","name":"ɵb"}],"providers":[{"__symbolic":"reference","name":"ɵb"}],"exports":[{"__symbolic":"reference","name":"MultiSelectComponent"}]}]}],"members":{},"statics":{"forRoot":{"__symbolic":"function","parameters":[],"value":{"ngModule":{"__symbolic":"reference","name":"NgMultiSelectDropDownModule"}}}}},"IDropdownSettings":{"__symbolic":"interface"},"ɵb":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Pipe","line":4,"character":1},"arguments":[{"name":"multiSelectFilter","pure":false}]}],"members":{"transform":[{"__symbolic":"method"}],"applyFilter":[{"__symbolic":"method"}]}},"ɵc":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":2,"character":1},"arguments":[{"selector":"[clickOutside]"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":6,"character":37}]}],"clickOutside":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":9,"character":5}}]}],"onClick":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":12,"character":5},"arguments":["document:click",["$event","$event.target"]]}]}]}}},"origins":{"ɵa":"./multiselect.component","MultiSelectComponent":"./multiselect.component","NgMultiSelectDropDownModule":"./ng-multiselect-dropdown.module","IDropdownSettings":"./multiselect.model","ɵb":"./list-filter.pipe","ɵc":"./click-outside.directive"},"importAs":"ng-multiselect-dropdown"} \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/ng-multiselect-dropdown.module.d.ts b/frontend/node_modules/ng-multiselect-dropdown/ng-multiselect-dropdown.module.d.ts deleted file mode 100644 index 62cca0c6..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/ng-multiselect-dropdown.module.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ModuleWithProviders } from '@angular/core'; -import * as ɵngcc0 from '@angular/core'; -import * as ɵngcc1 from './multiselect.component'; -import * as ɵngcc2 from './click-outside.directive'; -import * as ɵngcc3 from './list-filter.pipe'; -import * as ɵngcc4 from '@angular/common'; -import * as ɵngcc5 from '@angular/forms'; -export declare class NgMultiSelectDropDownModule { - static forRoot(): ModuleWithProviders; - static ɵfac: ɵngcc0.ɵɵFactoryDeclaration; - static ɵmod: ɵngcc0.ɵɵNgModuleDeclaration; - static ɵinj: ɵngcc0.ɵɵInjectorDeclaration; -} - -//# sourceMappingURL=ng-multiselect-dropdown.module.d.ts.map \ No newline at end of file diff --git a/frontend/node_modules/ng-multiselect-dropdown/package.json b/frontend/node_modules/ng-multiselect-dropdown/package.json deleted file mode 100644 index 1bb1306b..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/package.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "name": "ng-multiselect-dropdown", - "version": "0.3.4", - "private": false, - "description": "Angular Multi-Select Dropdown", - "author": "Nilesh Patel", - "license": "MIT", - "keywords": [ - "angular4", - "angular8", - "angular multiselect dropdown", - "angular4 multiselect dropdown", - "angular8 multiselect dropdown", - "ng multiselect dropdown", - "ng4 multiselect dropdown", - "ng8 multiselect dropdown" - ], - "repository": { - "type": "git", - "url": "https://github.com/nileshpatel17/ng-multiselect-dropdown.git" - }, - "bugs": { - "url": "https://github.com/nileshpatel17/ng-multiselect-dropdown/issues" - }, - "homepage": "https://github.com/nileshpatel17/ng-multiselect-dropdown#readme", - "peerDependencies": { - "@angular/common": ">=2.0.0", - "@angular/core": ">=2.0.0" - }, - "devDependencies": { - "@angular-devkit/build-angular": "~0.802.2", - "@angular/animations": "8.2.2", - "@angular/cli": "^8.2.2", - "@angular/common": "8.2.2", - "@angular/compiler": "8.2.2", - "@angular/compiler-cli": "8.2.2", - "@angular/core": "8.2.2", - "@angular/forms": "8.2.2", - "@angular/http": "7.2.15", - "@angular/language-service": "8.2.2", - "@angular/platform-browser": "8.2.2", - "@angular/platform-browser-dynamic": "8.2.2", - "@angular/router": "8.2.2", - "@types/jasmine": "~3.4.0", - "@types/jasminewd2": "~2.0.2", - "@types/node": "~12.7.2", - "angular-cli-ghpages": "^0.6.0-rc.2", - "angular2-markdown": "^2.2.3", - "codelyzer": "~5.1.0", - "copyfiles": "^2.0.0", - "core-js": "^3.2.1", - "jasmine-core": "~3.4.0", - "jasmine-spec-reporter": "~4.2.1", - "jest": "^24.9.0", - "jest-preset-angular": "^7.1.1", - "karma": "~4.2.0", - "karma-chrome-launcher": "~3.1.0", - "karma-cli": "~2.0.0", - "karma-coverage-istanbul-reporter": "^2.1.0", - "karma-jasmine": "~2.0.1", - "karma-jasmine-html-reporter": "^1.4.2", - "ng-multiselect-dropdown": "^0.2.11", - "ng-packagr": "^5.5.0", - "ngx-bootstrap": "^5.1.1", - "protractor": "~5.4.2", - "rimraf": "^3.0.0", - "rxjs": "^6.2.1", - "rxjs-compat": "^6.2.1", - "ts-node": "~8.3.0", - "tslint": "~5.19.0", - "typescript": "3.5.3", - "zone.js": "^0.10.2" - }, - "main": "bundles/ng-multiselect-dropdown.umd.js", - "module": "fesm5/ng-multiselect-dropdown.js", - "es2015_ivy_ngcc": "__ivy_ngcc__/fesm2015/ng-multiselect-dropdown.js", - "es2015": "fesm2015/ng-multiselect-dropdown.js", - "esm5": "esm5/ng-multiselect-dropdown.js", - "esm2015": "esm2015/ng-multiselect-dropdown.js", - "fesm5": "fesm5/ng-multiselect-dropdown.js", - "fesm2015_ivy_ngcc": "__ivy_ngcc__/fesm2015/ng-multiselect-dropdown.js", - "fesm2015": "fesm2015/ng-multiselect-dropdown.js", - "typings": "ng-multiselect-dropdown.d.ts", - "metadata": "ng-multiselect-dropdown.metadata.json", - "sideEffects": false, - "dependencies": { - "tslib": "^1.9.0" - }, - "__processed_by_ivy_ngcc__": { - "es2015": "15.1.1", - "fesm2015": "15.1.1", - "typings": "15.1.1" - }, - "scripts": { - "prepublishOnly": "node --eval \"console.error('ERROR: Trying to publish a package that has been compiled by NGCC. This is not allowed.\\nPlease delete and rebuild the package, without compiling with NGCC, before attempting to publish.\\nNote that NGCC may have been run by importing this package into another project that is being built with Ivy enabled.\\n')\" && exit 1" - } -} diff --git a/frontend/node_modules/ng-multiselect-dropdown/public_api.d.ts b/frontend/node_modules/ng-multiselect-dropdown/public_api.d.ts deleted file mode 100644 index 53f93bd3..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/public_api.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { MultiSelectComponent } from './multiselect.component'; -export { NgMultiSelectDropDownModule } from './ng-multiselect-dropdown.module'; -export { IDropdownSettings } from './multiselect.model'; diff --git a/frontend/node_modules/ng-multiselect-dropdown/themes/ng-multiselect-dropdown.theme.scss b/frontend/node_modules/ng-multiselect-dropdown/themes/ng-multiselect-dropdown.theme.scss deleted file mode 100644 index c6f11ad3..00000000 --- a/frontend/node_modules/ng-multiselect-dropdown/themes/ng-multiselect-dropdown.theme.scss +++ /dev/null @@ -1,210 +0,0 @@ -$base-color: #337ab7; -$disable-background-color: #eceeef; -.multiselect-dropdown { - position: relative; - width: 100%; - font-size: inherit; - font-family: inherit; - .dropdown-btn { - display: inline-block; - border: 1px solid #adadad; - width: 100%; - padding: 6px 12px; - margin-bottom: 0; - font-weight: normal; - line-height: 1.52857143; - text-align: left; - vertical-align: middle; - cursor: pointer; - background-image: none; - border-radius: 4px; - .selected-item { - border: 1px solid $base-color; - margin-right: 4px; - background: $base-color; - padding: 0px 5px; - color: #fff; - border-radius: 2px; - float: left; - a { - text-decoration: none; - } - } - .selected-item:hover { - box-shadow: 1px 1px #959595; - } - .dropdown-down { - display: inline-block; - top: 10px; - width: 0; - height: 0; - border-top: 10px solid #adadad; - border-left: 10px solid transparent; - border-right: 10px solid transparent; - } - .dropdown-up { - display: inline-block; - width: 0; - height: 0; - border-bottom: 10px solid #adadad; - border-left: 10px solid transparent; - border-right: 10px solid transparent; - } - } - .disabled { - & > span { - background-color: $disable-background-color; - } - } -} - -.dropdown-list { - position: absolute; - padding-top: 6px; - width: 100%; - z-index: 9999; - border: 1px solid #ccc; - border-radius: 3px; - background: #fff; - margin-top: 10px; - box-shadow: 0px 1px 5px #959595; - ul { - padding: 0px; - list-style: none; - overflow: auto; - margin: 0px; - } - li { - padding: 6px 10px; - cursor: pointer; - text-align: left; - } - .filter-textbox { - border-bottom: 1px solid #ccc; - position: relative; - padding: 10px; - input { - border: 0px; - width: 100%; - padding: 0px 0px 0px 26px; - } - input:focus { - outline: none; - } - } -} - -.multiselect-item-checkbox input[type='checkbox'] { - border: 0; - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; -} - -.multiselect-item-checkbox input[type='checkbox']:focus + div:before, -.multiselect-item-checkbox input[type='checkbox']:hover + div:before { - border-color: $base-color; - background-color: #f2f2f2; -} - -.multiselect-item-checkbox input[type='checkbox']:active + div:before { - transition-duration: 0s; -} - -.multiselect-item-checkbox input[type='checkbox'] + div { - position: relative; - padding-left: 2em; - vertical-align: middle; - user-select: none; - cursor: pointer; - margin: 0px; - color: #000; -} - -.multiselect-item-checkbox input[type='checkbox'] + div:before { - box-sizing: content-box; - content: ''; - color: $base-color; - position: absolute; - top: 50%; - left: 0; - width: 14px; - height: 14px; - margin-top: -9px; - border: 2px solid $base-color; - text-align: center; - transition: all 0.4s ease; -} - -.multiselect-item-checkbox input[type='checkbox'] + div:after { - box-sizing: content-box; - content: ''; - background-color: $base-color; - position: absolute; - top: 50%; - left: 4px; - width: 10px; - height: 10px; - margin-top: -5px; - transform: scale(0); - transform-origin: 50%; - transition: transform 200ms ease-out; -} - -.multiselect-item-checkbox input[type='checkbox']:disabled + div:before { - border-color: #cccccc; -} - -.multiselect-item-checkbox - input[type='checkbox']:disabled:focus - + div:before - .multiselect-item-checkbox - input[type='checkbox']:disabled:hover - + div:before { - background-color: inherit; -} - -.multiselect-item-checkbox - input[type='checkbox']:disabled:checked - + div:before { - background-color: #cccccc; -} - -.multiselect-item-checkbox input[type='checkbox'] + div:after { - background-color: transparent; - top: 50%; - left: 4px; - width: 8px; - height: 3px; - margin-top: -4px; - border-style: solid; - border-color: #ffffff; - border-width: 0 0 3px 3px; - border-image: none; - transform: rotate(-45deg) scale(0); -} - -.multiselect-item-checkbox input[type='checkbox']:checked + div:after { - content: ''; - transform: rotate(-45deg) scale(1); - transition: transform 200ms ease-out; -} - -.multiselect-item-checkbox input[type='checkbox']:checked + div:before { - animation: borderscale 200ms ease-in; - background: $base-color; -} - -.multiselect-item-checkbox input[type='checkbox']:checked + div:after { - transform: rotate(-45deg) scale(1); -} - -@keyframes borderscale { - 50% { - box-shadow: 0 0 0 2px $base-color; - } -} \ No newline at end of file diff --git a/frontend/node_modules/tslib/CopyrightNotice.txt b/frontend/node_modules/tslib/CopyrightNotice.txt deleted file mode 100644 index 3d4c8234..00000000 --- a/frontend/node_modules/tslib/CopyrightNotice.txt +++ /dev/null @@ -1,15 +0,0 @@ -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ - diff --git a/frontend/node_modules/tslib/LICENSE.txt b/frontend/node_modules/tslib/LICENSE.txt deleted file mode 100644 index bfe6430c..00000000 --- a/frontend/node_modules/tslib/LICENSE.txt +++ /dev/null @@ -1,12 +0,0 @@ -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/frontend/node_modules/tslib/README.md b/frontend/node_modules/tslib/README.md deleted file mode 100644 index a5b2692c..00000000 --- a/frontend/node_modules/tslib/README.md +++ /dev/null @@ -1,142 +0,0 @@ -# tslib - -This is a runtime library for [TypeScript](http://www.typescriptlang.org/) that contains all of the TypeScript helper functions. - -This library is primarily used by the `--importHelpers` flag in TypeScript. -When using `--importHelpers`, a module that uses helper functions like `__extends` and `__assign` in the following emitted file: - -```ts -var __assign = (this && this.__assign) || Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; -}; -exports.x = {}; -exports.y = __assign({}, exports.x); - -``` - -will instead be emitted as something like the following: - -```ts -var tslib_1 = require("tslib"); -exports.x = {}; -exports.y = tslib_1.__assign({}, exports.x); -``` - -Because this can avoid duplicate declarations of things like `__extends`, `__assign`, etc., this means delivering users smaller files on average, as well as less runtime overhead. -For optimized bundles with TypeScript, you should absolutely consider using `tslib` and `--importHelpers`. - -# Installing - -For the latest stable version, run: - -## npm - -```sh -# TypeScript 2.3.3 or later -npm install tslib - -# TypeScript 2.3.2 or earlier -npm install tslib@1.6.1 -``` - -## yarn - -```sh -# TypeScript 2.3.3 or later -yarn add tslib - -# TypeScript 2.3.2 or earlier -yarn add tslib@1.6.1 -``` - -## bower - -```sh -# TypeScript 2.3.3 or later -bower install tslib - -# TypeScript 2.3.2 or earlier -bower install tslib@1.6.1 -``` - -## JSPM - -```sh -# TypeScript 2.3.3 or later -jspm install tslib - -# TypeScript 2.3.2 or earlier -jspm install tslib@1.6.1 -``` - -# Usage - -Set the `importHelpers` compiler option on the command line: - -``` -tsc --importHelpers file.ts -``` - -or in your tsconfig.json: - -```json -{ - "compilerOptions": { - "importHelpers": true - } -} -``` - -#### For bower and JSPM users - -You will need to add a `paths` mapping for `tslib`, e.g. For Bower users: - -```json -{ - "compilerOptions": { - "module": "amd", - "importHelpers": true, - "baseUrl": "./", - "paths": { - "tslib" : ["bower_components/tslib/tslib.d.ts"] - } - } -} -``` - -For JSPM users: - -```json -{ - "compilerOptions": { - "module": "system", - "importHelpers": true, - "baseUrl": "./", - "paths": { - "tslib" : ["jspm_packages/npm/tslib@1.[version].0/tslib.d.ts"] - } - } -} -``` - - -# Contribute - -There are many ways to [contribute](https://github.com/Microsoft/TypeScript/blob/master/CONTRIBUTING.md) to TypeScript. - -* [Submit bugs](https://github.com/Microsoft/TypeScript/issues) and help us verify fixes as they are checked in. -* Review the [source code changes](https://github.com/Microsoft/TypeScript/pulls). -* Engage with other TypeScript users and developers on [StackOverflow](http://stackoverflow.com/questions/tagged/typescript). -* Join the [#typescript](http://twitter.com/#!/search/realtime/%23typescript) discussion on Twitter. -* [Contribute bug fixes](https://github.com/Microsoft/TypeScript/blob/master/CONTRIBUTING.md). - -# Documentation - -* [Quick tutorial](http://www.typescriptlang.org/Tutorial) -* [Programming handbook](http://www.typescriptlang.org/Handbook) -* [Homepage](http://www.typescriptlang.org/) diff --git a/frontend/node_modules/tslib/modules/index.js b/frontend/node_modules/tslib/modules/index.js deleted file mode 100644 index d241d042..00000000 --- a/frontend/node_modules/tslib/modules/index.js +++ /dev/null @@ -1,51 +0,0 @@ -import tslib from '../tslib.js'; -const { - __extends, - __assign, - __rest, - __decorate, - __param, - __metadata, - __awaiter, - __generator, - __exportStar, - __createBinding, - __values, - __read, - __spread, - __spreadArrays, - __await, - __asyncGenerator, - __asyncDelegator, - __asyncValues, - __makeTemplateObject, - __importStar, - __importDefault, - __classPrivateFieldGet, - __classPrivateFieldSet, -} = tslib; -export { - __extends, - __assign, - __rest, - __decorate, - __param, - __metadata, - __awaiter, - __generator, - __exportStar, - __createBinding, - __values, - __read, - __spread, - __spreadArrays, - __await, - __asyncGenerator, - __asyncDelegator, - __asyncValues, - __makeTemplateObject, - __importStar, - __importDefault, - __classPrivateFieldGet, - __classPrivateFieldSet, -}; diff --git a/frontend/node_modules/tslib/modules/package.json b/frontend/node_modules/tslib/modules/package.json deleted file mode 100644 index aafa0e4b..00000000 --- a/frontend/node_modules/tslib/modules/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} \ No newline at end of file diff --git a/frontend/node_modules/tslib/package.json b/frontend/node_modules/tslib/package.json deleted file mode 100644 index f8c2a53d..00000000 --- a/frontend/node_modules/tslib/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "tslib", - "author": "Microsoft Corp.", - "homepage": "https://www.typescriptlang.org/", - "version": "1.14.1", - "license": "0BSD", - "description": "Runtime library for TypeScript helper functions", - "keywords": [ - "TypeScript", - "Microsoft", - "compiler", - "language", - "javascript", - "tslib", - "runtime" - ], - "bugs": { - "url": "https://github.com/Microsoft/TypeScript/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/Microsoft/tslib.git" - }, - "main": "tslib.js", - "module": "tslib.es6.js", - "jsnext:main": "tslib.es6.js", - "typings": "tslib.d.ts", - "sideEffects": false, - "exports": { - ".": { - "module": "./tslib.es6.js", - "import": "./modules/index.js", - "default": "./tslib.js" - }, - "./": "./" - } -} diff --git a/frontend/node_modules/tslib/test/validateModuleExportsMatchCommonJS/index.js b/frontend/node_modules/tslib/test/validateModuleExportsMatchCommonJS/index.js deleted file mode 100644 index 0c1b613d..00000000 --- a/frontend/node_modules/tslib/test/validateModuleExportsMatchCommonJS/index.js +++ /dev/null @@ -1,23 +0,0 @@ -// When on node 14, it validates that all of the commonjs exports -// are correctly re-exported for es modules importers. - -const nodeMajor = Number(process.version.split(".")[0].slice(1)) -if (nodeMajor < 14) { - console.log("Skipping because node does not support module exports.") - process.exit(0) -} - -// ES Modules import via the ./modules folder -import * as esTSLib from "../../modules/index.js" - -// Force a commonjs resolve -import { createRequire } from "module"; -const commonJSTSLib = createRequire(import.meta.url)("../../tslib.js"); - -for (const key in commonJSTSLib) { - if (commonJSTSLib.hasOwnProperty(key)) { - if(!esTSLib[key]) throw new Error(`ESModules is missing ${key} - it needs to be re-exported in ./modules/index.js`) - } -} - -console.log("All exports in commonjs are available for es module consumers.") diff --git a/frontend/node_modules/tslib/test/validateModuleExportsMatchCommonJS/package.json b/frontend/node_modules/tslib/test/validateModuleExportsMatchCommonJS/package.json deleted file mode 100644 index 166e5095..00000000 --- a/frontend/node_modules/tslib/test/validateModuleExportsMatchCommonJS/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "node index.js" - } -} diff --git a/frontend/node_modules/tslib/tslib.d.ts b/frontend/node_modules/tslib/tslib.d.ts deleted file mode 100644 index 0756b28e..00000000 --- a/frontend/node_modules/tslib/tslib.d.ts +++ /dev/null @@ -1,37 +0,0 @@ -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -export declare function __extends(d: Function, b: Function): void; -export declare function __assign(t: any, ...sources: any[]): any; -export declare function __rest(t: any, propertyNames: (string | symbol)[]): any; -export declare function __decorate(decorators: Function[], target: any, key?: string | symbol, desc?: any): any; -export declare function __param(paramIndex: number, decorator: Function): Function; -export declare function __metadata(metadataKey: any, metadataValue: any): Function; -export declare function __awaiter(thisArg: any, _arguments: any, P: Function, generator: Function): any; -export declare function __generator(thisArg: any, body: Function): any; -export declare function __exportStar(m: any, exports: any): void; -export declare function __values(o: any): any; -export declare function __read(o: any, n?: number): any[]; -export declare function __spread(...args: any[][]): any[]; -export declare function __spreadArrays(...args: any[][]): any[]; -export declare function __await(v: any): any; -export declare function __asyncGenerator(thisArg: any, _arguments: any, generator: Function): any; -export declare function __asyncDelegator(o: any): any; -export declare function __asyncValues(o: any): any; -export declare function __makeTemplateObject(cooked: string[], raw: string[]): TemplateStringsArray; -export declare function __importStar(mod: T): T; -export declare function __importDefault(mod: T): T | { default: T }; -export declare function __classPrivateFieldGet(receiver: T, privateMap: { has(o: T): boolean, get(o: T): V | undefined }): V; -export declare function __classPrivateFieldSet(receiver: T, privateMap: { has(o: T): boolean, set(o: T, value: V): any }, value: V): V; -export declare function __createBinding(object: object, target: object, key: PropertyKey, objectKey?: PropertyKey): void; \ No newline at end of file diff --git a/frontend/node_modules/tslib/tslib.es6.html b/frontend/node_modules/tslib/tslib.es6.html deleted file mode 100644 index b122e41b..00000000 --- a/frontend/node_modules/tslib/tslib.es6.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/node_modules/tslib/tslib.es6.js b/frontend/node_modules/tslib/tslib.es6.js deleted file mode 100644 index 0e0d8d07..00000000 --- a/frontend/node_modules/tslib/tslib.es6.js +++ /dev/null @@ -1,218 +0,0 @@ -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -export function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -export var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - } - return __assign.apply(this, arguments); -} - -export function __rest(s, e) { - var t = {}; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { - if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) - t[p[i]] = s[p[i]]; - } - return t; -} - -export function __decorate(decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -} - -export function __param(paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); } -} - -export function __metadata(metadataKey, metadataValue) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); -} - -export function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -export function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -export function __createBinding(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -} - -export function __exportStar(m, exports) { - for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) exports[p] = m[p]; -} - -export function __values(o) { - var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) return m.call(o); - if (o && typeof o.length === "number") return { - next: function () { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); -} - -export function __read(o, n) { - var m = typeof Symbol === "function" && o[Symbol.iterator]; - if (!m) return o; - var i = m.call(o), r, ar = [], e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); - } - catch (error) { e = { error: error }; } - finally { - try { - if (r && !r.done && (m = i["return"])) m.call(i); - } - finally { if (e) throw e.error; } - } - return ar; -} - -export function __spread() { - for (var ar = [], i = 0; i < arguments.length; i++) - ar = ar.concat(__read(arguments[i])); - return ar; -} - -export function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; -}; - -export function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -} - -export function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; - function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } - function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } - function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } - function fulfill(value) { resume("next", value); } - function reject(value) { resume("throw", value); } - function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } -} - -export function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; - function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } -} - -export function __asyncValues(o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); - function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } - function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } -} - -export function __makeTemplateObject(cooked, raw) { - if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } - return cooked; -}; - -export function __importStar(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result.default = mod; - return result; -} - -export function __importDefault(mod) { - return (mod && mod.__esModule) ? mod : { default: mod }; -} - -export function __classPrivateFieldGet(receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); -} - -export function __classPrivateFieldSet(receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; -} diff --git a/frontend/node_modules/tslib/tslib.html b/frontend/node_modules/tslib/tslib.html deleted file mode 100644 index 44c9ba51..00000000 --- a/frontend/node_modules/tslib/tslib.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/node_modules/tslib/tslib.js b/frontend/node_modules/tslib/tslib.js deleted file mode 100644 index e5b7c9b8..00000000 --- a/frontend/node_modules/tslib/tslib.js +++ /dev/null @@ -1,284 +0,0 @@ -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ - -/* global global, define, System, Reflect, Promise */ -var __extends; -var __assign; -var __rest; -var __decorate; -var __param; -var __metadata; -var __awaiter; -var __generator; -var __exportStar; -var __values; -var __read; -var __spread; -var __spreadArrays; -var __await; -var __asyncGenerator; -var __asyncDelegator; -var __asyncValues; -var __makeTemplateObject; -var __importStar; -var __importDefault; -var __classPrivateFieldGet; -var __classPrivateFieldSet; -var __createBinding; -(function (factory) { - var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {}; - if (typeof define === "function" && define.amd) { - define("tslib", ["exports"], function (exports) { factory(createExporter(root, createExporter(exports))); }); - } - else if (typeof module === "object" && typeof module.exports === "object") { - factory(createExporter(root, createExporter(module.exports))); - } - else { - factory(createExporter(root)); - } - function createExporter(exports, previous) { - if (exports !== root) { - if (typeof Object.create === "function") { - Object.defineProperty(exports, "__esModule", { value: true }); - } - else { - exports.__esModule = true; - } - } - return function (id, v) { return exports[id] = previous ? previous(id, v) : v; }; - } -}) -(function (exporter) { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - - __extends = function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; - - __assign = Object.assign || function (t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - - __rest = function (s, e) { - var t = {}; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { - if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) - t[p[i]] = s[p[i]]; - } - return t; - }; - - __decorate = function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - - __param = function (paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); } - }; - - __metadata = function (metadataKey, metadataValue) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); - }; - - __awaiter = function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - - __generator = function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - }; - - __createBinding = function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - }; - - __exportStar = function (m, exports) { - for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) exports[p] = m[p]; - }; - - __values = function (o) { - var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) return m.call(o); - if (o && typeof o.length === "number") return { - next: function () { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); - }; - - __read = function (o, n) { - var m = typeof Symbol === "function" && o[Symbol.iterator]; - if (!m) return o; - var i = m.call(o), r, ar = [], e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); - } - catch (error) { e = { error: error }; } - finally { - try { - if (r && !r.done && (m = i["return"])) m.call(i); - } - finally { if (e) throw e.error; } - } - return ar; - }; - - __spread = function () { - for (var ar = [], i = 0; i < arguments.length; i++) - ar = ar.concat(__read(arguments[i])); - return ar; - }; - - __spreadArrays = function () { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; - }; - - __await = function (v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); - }; - - __asyncGenerator = function (thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; - function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } - function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } - function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } - function fulfill(value) { resume("next", value); } - function reject(value) { resume("throw", value); } - function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } - }; - - __asyncDelegator = function (o) { - var i, p; - return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; - function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } - }; - - __asyncValues = function (o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); - function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } - function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } - }; - - __makeTemplateObject = function (cooked, raw) { - if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } - return cooked; - }; - - __importStar = function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result["default"] = mod; - return result; - }; - - __importDefault = function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; - }; - - __classPrivateFieldGet = function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); - }; - - __classPrivateFieldSet = function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; - }; - - exporter("__extends", __extends); - exporter("__assign", __assign); - exporter("__rest", __rest); - exporter("__decorate", __decorate); - exporter("__param", __param); - exporter("__metadata", __metadata); - exporter("__awaiter", __awaiter); - exporter("__generator", __generator); - exporter("__exportStar", __exportStar); - exporter("__createBinding", __createBinding); - exporter("__values", __values); - exporter("__read", __read); - exporter("__spread", __spread); - exporter("__spreadArrays", __spreadArrays); - exporter("__await", __await); - exporter("__asyncGenerator", __asyncGenerator); - exporter("__asyncDelegator", __asyncDelegator); - exporter("__asyncValues", __asyncValues); - exporter("__makeTemplateObject", __makeTemplateObject); - exporter("__importStar", __importStar); - exporter("__importDefault", __importDefault); - exporter("__classPrivateFieldGet", __classPrivateFieldGet); - exporter("__classPrivateFieldSet", __classPrivateFieldSet); -}); diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 977c553c..6627abb1 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -12,57 +12,12 @@ "file-saver": "^2.0.5", "geobuf": "^3.0.2", "leaflet.vectorgrid": "^1.3.0", - "ng-multiselect-dropdown": "^0.3.4", "pbf": "^3.2.1" }, "devDependencies": { "prettier": "~3.1.0" } }, - "node_modules/@angular/common": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-15.2.4.tgz", - "integrity": "sha512-RT6bo3RB768alor27i4KG9rTcsya58f2Pda/MjcNC5iR7WpmA4tE4h9x4JnI/1GCR3U1KAa4qrDrEFUJZoFofw==", - "peer": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0" - }, - "peerDependencies": { - "@angular/core": "15.2.4", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/common/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "peer": true - }, - "node_modules/@angular/core": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-15.2.4.tgz", - "integrity": "sha512-ApWxICIOK47F/yh0Di/SFR3qMXZPpVLFainlIEauwpULKCLrYSJSnlF+zaDB6mMI1754skZZE69lX4uS2Byi+w==", - "peer": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0" - }, - "peerDependencies": { - "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.11.4 || ~0.12.0 || ~0.13.0" - } - }, - "node_modules/@angular/core/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "peer": true - }, "node_modules/array-source": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/array-source/-/array-source-0.0.4.tgz", @@ -164,18 +119,6 @@ "leaflet": "^1.0.2" } }, - "node_modules/ng-multiselect-dropdown": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/ng-multiselect-dropdown/-/ng-multiselect-dropdown-0.3.4.tgz", - "integrity": "sha512-ZUzA4apGY7Y0MW7scF35iPYy4/DpIRhZcQiTICDJFs66+JoJOE+YqA+Tx9C2Ylv0B8tADX7PAsTQL9Jys1vWiQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "peerDependencies": { - "@angular/common": ">=2.0.0", - "@angular/core": ">=2.0.0" - } - }, "node_modules/path-source": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/path-source/-/path-source-0.1.3.tgz", @@ -244,21 +187,6 @@ "protocol-buffers-schema": "^3.3.1" } }, - "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "peer": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "peer": true - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -332,11 +260,6 @@ "topoquantize": "bin/topoquantize" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -360,58 +283,9 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" - }, - "node_modules/zone.js": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.0.tgz", - "integrity": "sha512-7m3hNNyswsdoDobCkYNAy5WiUulkMd3+fWaGT9ij6iq3Zr/IwJo4RMCYPSDjT+r7tnPErmY9sZpKhWQ8S5k6XQ==", - "peer": true, - "dependencies": { - "tslib": "^2.3.0" - } - }, - "node_modules/zone.js/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "peer": true } }, "dependencies": { - "@angular/common": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-15.2.4.tgz", - "integrity": "sha512-RT6bo3RB768alor27i4KG9rTcsya58f2Pda/MjcNC5iR7WpmA4tE4h9x4JnI/1GCR3U1KAa4qrDrEFUJZoFofw==", - "peer": true, - "requires": { - "tslib": "^2.3.0" - }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "peer": true - } - } - }, - "@angular/core": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-15.2.4.tgz", - "integrity": "sha512-ApWxICIOK47F/yh0Di/SFR3qMXZPpVLFainlIEauwpULKCLrYSJSnlF+zaDB6mMI1754skZZE69lX4uS2Byi+w==", - "peer": true, - "requires": { - "tslib": "^2.3.0" - }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "peer": true - } - } - }, "array-source": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/array-source/-/array-source-0.0.4.tgz", @@ -488,14 +362,6 @@ "whatwg-fetch": "^2.0.3" } }, - "ng-multiselect-dropdown": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/ng-multiselect-dropdown/-/ng-multiselect-dropdown-0.3.4.tgz", - "integrity": "sha512-ZUzA4apGY7Y0MW7scF35iPYy4/DpIRhZcQiTICDJFs66+JoJOE+YqA+Tx9C2Ylv0B8tADX7PAsTQL9Jys1vWiQ==", - "requires": { - "tslib": "^1.9.0" - } - }, "path-source": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/path-source/-/path-source-0.1.3.tgz", @@ -548,23 +414,6 @@ "protocol-buffers-schema": "^3.3.1" } }, - "rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "peer": true, - "requires": { - "tslib": "^2.1.0" - }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "peer": true - } - } - }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -614,11 +463,6 @@ "commander": "2" } }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -641,23 +485,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" - }, - "zone.js": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.0.tgz", - "integrity": "sha512-7m3hNNyswsdoDobCkYNAy5WiUulkMd3+fWaGT9ij6iq3Zr/IwJo4RMCYPSDjT+r7tnPErmY9sZpKhWQ8S5k6XQ==", - "peer": true, - "requires": { - "tslib": "^2.3.0" - }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "peer": true - } - } } } } diff --git a/frontend/package.json b/frontend/package.json index 44b5340a..77de20be 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,7 +14,6 @@ "file-saver": "^2.0.5", "geobuf": "^3.0.2", "leaflet.vectorgrid": "^1.3.0", - "ng-multiselect-dropdown": "^0.3.4", "pbf": "^3.2.1" }, "devDependencies": { From 0fa7a80e25e4934982ab33142212f05b233779db Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Mon, 22 Apr 2024 18:07:43 +0200 Subject: [PATCH 31/60] feat: purge ng_multiselect_dropdown --- frontend/_app.module.scss | 29 ----------------------------- frontend/app/gnModule.module.ts | 2 -- 2 files changed, 31 deletions(-) diff --git a/frontend/_app.module.scss b/frontend/_app.module.scss index 81d96ec1..1b81805b 100644 --- a/frontend/_app.module.scss +++ b/frontend/_app.module.scss @@ -74,35 +74,6 @@ mat-spinner { } } -::ng-deep ng-multiselect-dropdown span.selected-item.ng-star-inserted { - max-width: 90% !important; - margin-bottom: 4px; -} - -ng-multiselect-dropdown { - border: none !important; -} - -::ng-deep ng-multiselect-dropdown.ng-invalid .multiselect-dropdown { - border-left: 5px solid #ff0000 !important; -} - -::ng-deep ng-multiselect-dropdown .multiselect-dropdown .dropdown-btn .selected-item { - background: #219653 !important; - border: 1px solid #219653 !important; -} - -::ng-deep ng-multiselect-dropdown .dropdown-btn { - color: gray; - border: 1px solid #ced4da !important; - border-radius: 0.2rem !important; -} - -::ng-deep ng-multiselect-dropdown span.selected-item.ng-star-inserted a { - font-weight: 600; - margin-left: 8px; -} - fieldset { padding: 0.35em 0.625em 0.75em !important; border: 1px solid silver !important; diff --git a/frontend/app/gnModule.module.ts b/frontend/app/gnModule.module.ts index ccbf8d59..9daf5b6f 100644 --- a/frontend/app/gnModule.module.ts +++ b/frontend/app/gnModule.module.ts @@ -5,7 +5,6 @@ import { Routes, RouterModule } from '@angular/router'; import { GN2CommonModule } from '@geonature_common/GN2Common.module'; import { MapListService } from '@geonature_common/map-list/map-list.service'; import { ZhDetailsModule } from './zh-details/zh-details.module'; -import { NgMultiSelectDropDownModule } from 'ng-multiselect-dropdown'; //Components import { ZhMapListComponent } from './zh-map-list/zh-map-list.component'; import { ZhFormMapComponent } from './zh-forms/map/map.component'; @@ -57,7 +56,6 @@ const routes: Routes = [ GN2CommonModule, CommonModule, RouterModule.forChild(routes), - NgMultiSelectDropDownModule.forRoot(), NgbModule, ZhDetailsModule, ZhSearchModule, From 73aed6475e12b4690e98382eeaa97dd3f971b877 Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Mon, 22 Apr 2024 18:08:15 +0200 Subject: [PATCH 32/60] feat: switch select to zh-multiselect in tab0 --- .../zh-multiselect.component.html | 1 + .../tabs/tab0/zh-form-tab0.component.html | 24 +++++++++++-------- .../tabs/tab0/zh-form-tab0.component.ts | 1 - 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.html b/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.html index 65cee724..44af004c 100644 --- a/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.html +++ b/frontend/app/commonComponents/zh-multiselect/zh-multiselect.component.html @@ -4,6 +4,7 @@ [ngClass]="{'Multiselect--multiple': multiple}" [items]="values" [bindLabel]="keyLabel" + [bindValue]="keyValue" [placeholder]="placeholder" [multiple]="multiple" [clearable]="true" diff --git a/frontend/app/zh-forms/tabs/tab0/zh-form-tab0.component.html b/frontend/app/zh-forms/tabs/tab0/zh-form-tab0.component.html index 64e44dfa..9f54b853 100755 --- a/frontend/app/zh-forms/tabs/tab0/zh-form-tab0.component.html +++ b/frontend/app/zh-forms/tabs/tab0/zh-form-tab0.component.html @@ -22,11 +22,13 @@
Champs obligatoires
Organisme de l'opérateur - + + Champs obligatoires
-->
Typologie SDAGE - + (); constructor() { super() this.multiple = true; + this.hightlightValue = true; this.groupBy = null; this.placeholder = "Sélectionner"; } From 9d0c4865954982cd9c2d000eccb4c33fcfb0d2fc Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Mon, 22 Apr 2024 18:13:14 +0200 Subject: [PATCH 34/60] feat: update zh-multiselect in tab0 --- frontend/app/zh-forms/tabs/tab0/zh-form-tab0.component.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/app/zh-forms/tabs/tab0/zh-form-tab0.component.html b/frontend/app/zh-forms/tabs/tab0/zh-form-tab0.component.html index 9f54b853..961c235b 100755 --- a/frontend/app/zh-forms/tabs/tab0/zh-form-tab0.component.html +++ b/frontend/app/zh-forms/tabs/tab0/zh-form-tab0.component.html @@ -28,7 +28,8 @@
Champs obligatoires
keyValue="id_org" [values]="idOrg" [parentFormControl]="form.controls.id_org" - [multiple]="false" /> + [multiple]="false" + [hightlightValue]="false"/> Champs obligatoires [values]="sdage" [parentFormControl]="form.controls.sdage" [multiple]="false" + [hightlightValue]="false" /> (); public _inputData: inputDataType[] = null; - constructor() {} ngOnInit() { if (!this._inputData || this._inputData.length < 1) { - this.disable() + this.disable(); } } @@ -42,9 +41,9 @@ export class ZhSearchDependantComponent implements OnInit { } } disable() { - this.form.disable() + this.form.disable(); } enable() { - this.form.enable() + this.form.enable(); } } diff --git a/frontend/app/zh-search/zh-search-items/zh-search-ensemble/zh-search-ensemble.component.ts b/frontend/app/zh-search/zh-search-items/zh-search-ensemble/zh-search-ensemble.component.ts index 754d38b6..24b7905a 100644 --- a/frontend/app/zh-search/zh-search-items/zh-search-ensemble/zh-search-ensemble.component.ts +++ b/frontend/app/zh-search/zh-search-items/zh-search-ensemble/zh-search-ensemble.component.ts @@ -11,6 +11,5 @@ export class ZhSearchEnsembleComponent implements OnInit { @Input() form: FormGroup; constructor() {} - ngOnInit() { - } + ngOnInit() {} } diff --git a/frontend/app/zh-search/zh-search-items/zh-search-sdage/zh-search-sdage.component.ts b/frontend/app/zh-search/zh-search-items/zh-search-sdage/zh-search-sdage.component.ts index 4fdc90c1..64520392 100644 --- a/frontend/app/zh-search/zh-search-items/zh-search-sdage/zh-search-sdage.component.ts +++ b/frontend/app/zh-search/zh-search-items/zh-search-sdage/zh-search-sdage.component.ts @@ -12,6 +12,5 @@ export class ZhSearchSDAGEComponent implements OnInit { constructor() {} - ngOnInit() { - } + ngOnInit() {} } diff --git a/frontend/app/zh-search/zh-search.module.ts b/frontend/app/zh-search/zh-search.module.ts index 7a7dfe62..15d315ac 100644 --- a/frontend/app/zh-search/zh-search.module.ts +++ b/frontend/app/zh-search/zh-search.module.ts @@ -37,10 +37,6 @@ const routes: Routes = [{ path: 'search', component: ZhSearchComponent }]; ZhAdvancedSearchModule, ZhHierarchySearchModule, ], - exports: [ - LabelComponent, - TableComponent, - ZHMultiSelectComponent, - ZhSearchComponent], + exports: [LabelComponent, TableComponent, ZHMultiSelectComponent, ZhSearchComponent], }) export class ZhSearchModule {} From 12d73bdc71930dc73c65f82be52aac3aeffd3ad2 Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Wed, 26 Jul 2023 14:49:25 +0200 Subject: [PATCH 36/60] feat: improve zh already splitted detection by computing percentage of recovering intersection compared to zh superficy --- backend/gn_module_zh/geometry.py | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/backend/gn_module_zh/geometry.py b/backend/gn_module_zh/geometry.py index 76851ad2..b9429a5f 100644 --- a/backend/gn_module_zh/geometry.py +++ b/backend/gn_module_zh/geometry.py @@ -8,38 +8,53 @@ from .api_error import ZHApiError from .model.zh_schema import TZH, CorZhRb, TRiverBasin +import pdb + def set_geom(geometry, id_zh=None): if not id_zh: id_zh = 0 # SetSRID for POSTGIS < 3.0 compat - polygon = DB.session.query(func.ST_SetSRID(func.ST_GeomFromGeoJSON(str(geometry)), 4326)).one()[ - 0 - ] + + # select only already existing ZH geometries which intersect with the new ZH geometry q_zh = ( DB.session.query(TZH) .filter( func.ST_Intersects( func.ST_GeogFromWKB(func.ST_AsEWKB(TZH.geom)), - func.ST_GeomFromGeoJSON(str(geometry)), + func.ST_GeogFromWKB(func.ST_AsEWKB(str(geometry))), ) ) + .filter( + func.ST_Touches( + func.ST_GeomFromWKB(func.ST_AsEWKB(TZH.geom), 4326), + func.ST_GeomFromWKB(func.ST_AsEWKB(str(geometry)), 4326), + ) + == False + ) .all() ) + is_intersected = False for zh in q_zh: if zh.id_zh != id_zh: zh_geom = DB.session.query(func.ST_GeogFromWKB(func.ST_AsEWKB(zh.geom))).scalar() - polygon_geom = DB.session.query(func.ST_GeogFromWKB(func.ST_AsEWKB(polygon))).scalar() + polygon_geom = DB.session.query( + func.ST_GeogFromWKB(func.ST_AsEWKB(str(geometry))) + ).scalar() if DB.session.query(func.ST_Intersects(polygon_geom, zh_geom)).scalar(): - is_intersected = True + if DB.session.query( + func.ST_GeometryType(func.ST_Intersection(zh_geom, polygon_geom, 0.1)) + ).scalar() not in ["ST_LineString", "ST_MultiLineString"]: + is_intersected = True if DB.session.query( func.ST_Contains( - func.ST_GeomFromText(func.ST_AsText(zh_geom)), - func.ST_GeomFromText(func.ST_AsText(polygon_geom)), + zh_geom, + polygon_geom, ) ).scalar(): raise BadRequest("La ZH est entièrement dans une ZH existante") + # TODO: not detected if contained entirely in 2 or more ZH polygons polygon = DB.session.query(func.ST_Difference(polygon_geom, zh_geom)).scalar() return {"polygon": polygon, "is_intersected": is_intersected} From dd3005155781b05b4b3c48432c37ade05dc5e1c8 Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Wed, 3 Apr 2024 10:15:07 +0200 Subject: [PATCH 37/60] feat: update to sqlalchemy1.4 --- backend/gn_module_zh/blueprint.py | 137 ++++---- backend/gn_module_zh/forms.py | 308 +++++++++------- backend/gn_module_zh/geometry.py | 77 ++-- backend/gn_module_zh/hierarchy.py | 387 +++++++++++---------- backend/gn_module_zh/model/cards.py | 113 +++--- backend/gn_module_zh/model/code.py | 23 +- backend/gn_module_zh/model/repositories.py | 3 +- backend/gn_module_zh/model/zh.py | 36 +- backend/gn_module_zh/model/zh_schema.py | 240 +++++++------ backend/gn_module_zh/nomenclatures.py | 124 ++++--- backend/gn_module_zh/search.py | 94 ++--- backend/gn_module_zh/upload.py | 8 +- backend/gn_module_zh/utils.py | 44 ++- 13 files changed, 881 insertions(+), 713 deletions(-) diff --git a/backend/gn_module_zh/blueprint.py b/backend/gn_module_zh/blueprint.py index 18a6b3c2..153e775c 100644 --- a/backend/gn_module_zh/blueprint.py +++ b/backend/gn_module_zh/blueprint.py @@ -21,7 +21,7 @@ from geonature.utils.env import DB, ROOT_DIR, BACKEND_DIR from pypnnomenclature.models import TNomenclatures from pypnusershub.db.models import Organisme, User -from sqlalchemy import desc, func, text +from sqlalchemy import desc, func, text, select, update, delete from sqlalchemy.orm import aliased from utils_flask_sqla.generic import GenericQuery from utils_flask_sqla.response import json_resp_accept_empty_list, json_resp @@ -93,7 +93,7 @@ def get_zh(scope): coauthor = aliased(User, name="coauthor") coorganism = aliased(Organisme, name="coorganism") q = ( - DB.session.query(TZH) + select(TZH) .join(TNomenclatures, TZH.sdage) .join(User, TZH.authors) .join(coauthor, TZH.coauthors) @@ -109,6 +109,7 @@ def get_zh(scope): if request.is_json: q = main_search(q, request.json) + # q2 = main_search(q2, request.json) return get_all_zh( info_role=g.current_user, @@ -123,7 +124,9 @@ def get_zh(scope): def get_all_zh(info_role, query, limit, page, orderby=None, order="asc"): # try: # Pour obtenir le nombre de résultat de la requete sans le LIMIT - nb_results_without_limit = query.count() + nb_results_without_limit = ( + DB.session.execute(select(func.count()).select_from(query.subquery())).scalars().one() + ) user = info_role user_cruved = get_user_cruved() @@ -151,7 +154,11 @@ def get_all_zh(info_role, query, limit, page, orderby=None, order="asc"): # Order by id because there can be ambiguity in order_by(col) depending # on the column so add on order_by id makes it clearer - data = query.order_by(TZH.id_zh).limit(limit).offset(page * limit).all() + data = ( + DB.session.execute(query.order_by(TZH.id_zh).limit(limit).offset(page * limit)) + .scalars() + .all() + ) is_ref_geo = check_ref_geo_schema() featureCollection = [] @@ -336,8 +343,7 @@ def get_pbf(): SELECT ST_AsGeobuf(q, 'geom') as pbf FROM (SELECT id_zh, geom from pr_zh.t_zh tz) AS q; """ - query = DB.session.execute(sql) - row = query.first() + row = DB.session.execute(sql).first() return Response(bytes(row["pbf"]) if row["pbf"] else bytes(), mimetype="application/protobuf") @@ -364,8 +370,7 @@ def get_pbf_complete(): 'bassin_versant', tz.bassin_versant) as json_arrays FROM pr_zh.atlas_app tz) AS q; """ - query = DB.session.execute(sql) - row = query.first() + row = DB.session.execute(sql).first() return Response(bytes(row["pbf"]) if row["pbf"] else bytes(), mimetype="application/protobuf") @@ -385,8 +390,7 @@ def get_json(): ) AS feature FROM (SELECT * FROM pr_zh.atlas_app tz) inputs) features; """ - query = DB.session.execute(sql) - row = query.first() + row = DB.session.execute(sql).first() return row["geojson"] @@ -396,7 +400,7 @@ def get_json(): def get_geometries(): """Get list of all zh geometries (contours)""" try: - if not DB.session.query(TZH).all(): + if not DB.session.execute(select(TZH)).all(): raise ZHApiError( message="no_geometry", details="Empty list of zh returned from get_zh_list db request", @@ -406,7 +410,7 @@ def get_geometries(): "geometry": zh.get_geofeature()["geometry"], "id_zh": zh.get_geofeature()["properties"]["id_zh"], } - for zh in DB.session.query(TZH).all() + for zh in DB.session.scalars(select(TZH)).all() ] except Exception as e: if e.__class__.__name__ == "ZHApiError": @@ -428,17 +432,14 @@ def get_ref_autocomplete(): params = request.args search_title = params.get("search_title") # search_title = 'MCD' - q = DB.session.query( - TReferences, - func.similarity(TReferences.title, search_title).label("idx_trgm"), - ) + q = select(TReferences, func.similarity(TReferences.title, search_title).label("idx_trgm")) search_title = search_title.replace(" ", "%") - q = q.filter(TReferences.title.ilike("%" + search_title + "%")).order_by(desc("idx_trgm")) + q = q.where(TReferences.title.ilike("%" + search_title + "%")).order_by(desc("idx_trgm")) limit = request.args.get("limit", 20) - data = q.limit(limit).all() + data = DB.session.execute(q.limit(limit)).all() if data: return [d[0].as_dict() for d in data] else: @@ -462,17 +463,16 @@ def get_file_list(id_zh): """get a list of the zh files contained in static repo""" try: # FIXME: to optimize... See relationships and lazy join with sqlalchemy - zh_uuid = DB.session.query(TZH).filter(TZH.id_zh == id_zh).one().zh_uuid - q_medias = ( - DB.session.query(TMedias, TNomenclatures.label_default) - .filter(TMedias.unique_id_media == zh_uuid) + zh_uuid = DB.session.execute(select(TZH).where(TZH.id_zh == id_zh)).scalar_one().zh_uuid + q_medias = DB.session.execute( + select(TMedias, TNomenclatures.label_default) .join( TNomenclatures, TNomenclatures.id_nomenclature == TMedias.id_nomenclature_media_type, ) + .where(TMedias.unique_id_media == zh_uuid) .order_by(TMedias.meta_update_date.desc()) - .all() - ) + ).all() res_media, image_medias = [], [] for media, media_type in q_medias: res_media.append(media) @@ -528,9 +528,12 @@ def post_main_pict(id_zh, id_media): """post main picture id in tzh""" try: # FIXME: after insert+after update on t_zh => update_date=dt.now() - DB.session.query(TZH).filter(TZH.id_zh == id_zh).update( - {TZH.main_pict_id: id_media, TZH.update_date: dt.now()} + stmt = ( + update(TZH) + .where(TZH.id_zh == id_zh) + .values(main_pict_id=id_media, update_date=dt.now()) ) + DB.session.execute(stmt) DB.session.commit() return ("", 204) except Exception as e: @@ -553,18 +556,17 @@ def post_main_pict(id_zh, id_media): @blueprint.route("/photos", methods=["GET"]) @json_resp def get_all_photos(id_zh: int): - q_medias = ( - DB.session.query(TZH.main_pict_id, TMedias.id_media, TMedias.media_path) + q_medias = DB.session.execute( + select(TZH.main_pict_id, TMedias.id_media, TMedias.media_path) .join(TZH, TZH.zh_uuid == TMedias.unique_id_media) .join( TNomenclatures, TNomenclatures.id_nomenclature == TMedias.id_nomenclature_media_type, ) .order_by(TMedias.meta_update_date.desc()) - .filter(TNomenclatures.label_default == "Photo") - .filter(TZH.id_zh == id_zh) - .all() - ) + .where(TNomenclatures.label_default == "Photo") + .where(TZH.id_zh == id_zh) + ).all() api_uri = urljoin( f"{config['API_ENDPOINT']}/", f"{blueprint.config['MODULE_CODE'].lower()}/{blueprint.config['file_path']}/", @@ -767,18 +769,20 @@ def deleteOneZh(id_zh): zhRepository = ZhRepository(TZH) # delete references - DB.session.query(CorZhRef).filter(CorZhRef.id_zh == id_zh).delete() + DB.session.execute(delete(CorZhRef).where(CorZhRef.id_zh == id_zh)) # delete criteres delim - id_lim_list = DB.session.query(TZH).filter(TZH.id_zh == id_zh).one().id_lim_list - DB.session.query(CorLimList).filter(CorLimList.id_lim_list == id_lim_list).delete() + id_lim_list = ( + DB.session.execute(select(TZH).where(TZH.id_zh == id_zh)).scalar_one().id_lim_list + ) + DB.session.execute(delete(CorLimList).where(CorLimList.id_lim_list == id_lim_list)) # delete cor_zh_area - DB.session.query(CorZhArea).filter(CorZhArea.id_zh == id_zh).delete() + DB.session.execute(delete(CorZhArea).where(CorZhArea.id_zh == id_zh)) # delete files in TMedias and repos - zh_uuid = DB.session.query(TZH).filter(TZH.id_zh == id_zh).one().zh_uuid - q_medias = DB.session.query(TMedias).filter(TMedias.unique_id_media == zh_uuid).all() + zh_uuid = DB.session.execute(select(TZH).where(TZH.id_zh == id_zh)).scalar_one().zh_uuid + q_medias = DB.session.scalars(select(TMedias).where(TMedias.unique_id_media == zh_uuid)).all() for media in q_medias: delete_file(media.id_media) @@ -803,9 +807,11 @@ def write_csv(id_zh): names = [] FILE_PATH = blueprint.config["file_path"] MODULE_NAME = blueprint.config["MODULE_CODE"].lower() - zh_code = DB.session.query(TZH).filter(TZH.id_zh == id_zh).one().code + zh_code = DB.session.execute(select(TZH).where(TZH.id_zh == id_zh)).scalar_one().code # author name - user = DB.session.query(User).filter(User.id_role == g.current_user.id_role).one() + user = DB.session.execute( + select(User).where(User.id_role == g.current_user.id_role) + ).scalar_one() author = user.prenom_role + " " + user.nom_role for i in ["vertebrates_view_name", "invertebrates_view_name", "flora_view_name"]: query = GenericQuery( @@ -813,7 +819,7 @@ def write_csv(id_zh): tableName=blueprint.config[i]["table_name"], schemaName=blueprint.config[i]["schema_name"], filters={"id_zh": id_zh, "orderby": "id_zh"}, - limit=-1, + limit=100, ) results = query.return_query().get("items", []) current_date = dt.now() @@ -864,8 +870,10 @@ def write_csv(id_zh): DB.session.flush() # update TMedias.media_path with media_filename - DB.session.query(TMedias).filter(TMedias.id_media == id_media).update( - {"media_path": str(media_path)} + DB.session.execute( + update(TMedias) + .where(TMedias.id_media == id_media) + .values(media_path=str(media_path)) ) DB.session.commit() @@ -924,41 +932,47 @@ def download(id_zh: int): @json_resp def departments(): query = ( - DB.session.query(LAreas) - .with_entities(LAreas.area_name, LAreas.area_code, LAreas.id_type, BibAreasTypes.type_code) + select(LAreas) + .with_only_columns( + LAreas.area_name, LAreas.area_code, LAreas.id_type, BibAreasTypes.type_code + ) .join(BibAreasTypes, LAreas.id_type == BibAreasTypes.id_type) - .filter(BibAreasTypes.type_code == "DEP") - .filter(LAreas.enable) + .where(BibAreasTypes.type_code == "DEP") + .where(LAreas.enable) .order_by(LAreas.area_code) ) - resp = query.all() + resp = DB.session.execute(query).all() return [{"code": r.area_code, "name": r.area_name} for r in resp] @blueprint.route("/communes", methods=["POST"]) @json_resp def get_area_from_department() -> dict: + # route utilisée ? code = request.json.get("code") if code: query = ( - DB.session.query(LiMunicipalities) - .with_entities(LiMunicipalities.id_area, LAreas.area_name, LAreas.area_code) + select(LiMunicipalities) + .with_only_columns(LiMunicipalities.id_area, LAreas.area_name, LAreas.area_code) .join(LAreas, LiMunicipalities.id_area == LAreas.id_area) - .filter(LiMunicipalities.insee_com.like("{}%".format(code))) - .filter(LAreas.enable) + .where(LiMunicipalities.insee_com.like("{}%".format(code))) + .where(LAreas.enable) + .order_by(LAreas.area_code) ) - query = query.order_by(LAreas.area_code) - resp = query.all() + resp = DB.session.execute(query).all() return [{"code": r.area_code, "name": r.area_name} for r in resp] - return [] @blueprint.route("/bassins", methods=["GET"]) @json_resp def bassins(): - query = DB.session.query(TRiverBasin).with_entities(TRiverBasin.id_rb, TRiverBasin.name) - resp = query.order_by(TRiverBasin.name).all() + query = ( + select(TRiverBasin) + .with_only_columns(TRiverBasin.id_rb, TRiverBasin.name) + .order_by(TRiverBasin.name) + ) + resp = DB.session.execute(query).all() return [{"code": r.id_rb, "name": r.name} for r in resp] @@ -968,9 +982,9 @@ def get_hydro_zones_from_bassin() -> dict: code = request.json.get("code") if code: query = ( - DB.session.query(THydroArea) - .with_entities(THydroArea.id_hydro, THydroArea.name, TRiverBasin.id_rb) - .filter(TRiverBasin.id_rb == code) + select(THydroArea) + .with_only_columns(THydroArea.id_hydro, THydroArea.name, TRiverBasin.id_rb) + .where(TRiverBasin.id_rb == code) .join( TRiverBasin, func.ST_Contains( @@ -978,9 +992,10 @@ def get_hydro_zones_from_bassin() -> dict: func.ST_SetSRID(THydroArea.geom, 4326), ), ) + .order_by(THydroArea.name) ) - resp = query.order_by(THydroArea.name).all() + resp = DB.session.execute(query).all() return [{"code": r.id_hydro, "name": r.name} for r in resp] return [] diff --git a/backend/gn_module_zh/forms.py b/backend/gn_module_zh/forms.py index 560081a8..ec8b7342 100644 --- a/backend/gn_module_zh/forms.py +++ b/backend/gn_module_zh/forms.py @@ -9,6 +9,7 @@ from geonature.utils.env import DB from pypnnomenclature.models import TNomenclatures from sqlalchemy import and_, func +from sqlalchemy.sql import select, delete, update from .api_error import ZHApiError from .model.code import Code @@ -46,7 +47,7 @@ def update_tzh(data): - zh = DB.session.query(TZH).filter_by(id_zh=data["id_zh"]).first() + zh = DB.session.get(TZH, data["id_zh"]) for key, val in data.items(): if hasattr(TZH, key) and key != "id_zh": setattr(zh, key, val) @@ -85,22 +86,27 @@ def create_zh(form_data, info_role, zh_date, polygon, zh_area, ref_geo_referenti post_cor_zh_area( polygon, new_zh.id_zh, - DB.session.query(BibAreasTypes).filter(BibAreasTypes.type_code == "COM").one().id_type, + DB.session.execute(select(BibAreasTypes).where(BibAreasTypes.type_code == "COM")) + .scalar_one() + .id_type, ) # fill cor_zh_area for departements post_cor_zh_area( polygon, new_zh.id_zh, - DB.session.query(BibAreasTypes).filter(BibAreasTypes.type_code == "DEP").one().id_type, + DB.session.execute(select(BibAreasTypes).where(BibAreasTypes.type_code == "DEP")) + .scalar_one() + .id_type, ) # fill cor_zh_area for other geo referentials for ref in ref_geo_referentiels: post_cor_zh_area( polygon, new_zh.id_zh, - DB.session.query(BibAreasTypes) - .filter(BibAreasTypes.type_code == ref["type_code_ref_geo"]) - .one() + DB.session.execute( + select(BibAreasTypes).where(BibAreasTypes.type_code == ref["type_code_ref_geo"]) + ) + .scalar_one() .id_type, ) @@ -116,9 +122,12 @@ def create_zh(form_data, info_role, zh_date, polygon, zh_area, ref_geo_referenti new_zh.ef_area = total_cover # set default values fct_delim_default_id = ( - DB.session.query(DefaultsNomenclaturesValues) - .filter(DefaultsNomenclaturesValues.mnemonique_type == "CRIT_DEF_ESP_FCT") - .one() + DB.session.execute( + select(DefaultsNomenclaturesValues).where( + DefaultsNomenclaturesValues.mnemonique_type == "CRIT_DEF_ESP_FCT" + ) + ) + .scalar_one() .id_nomenclature ) @@ -168,28 +177,27 @@ def post_cor_zh_area(polygon, id_zh, id_type): # try: elements = [ getattr(element, "id_area") - for element in DB.session.query(LAreas) - .filter( - LAreas.geom.ST_Intersects( - func.ST_Transform(func.ST_SetSRID(func.ST_AsText(polygon), 4326), 2154) + for element in DB.session.scalars( + select(LAreas) + .where( + LAreas.geom.ST_Intersects( + func.ST_Transform(func.ST_SetSRID(func.ST_AsText(polygon), 4326), 2154) + ) ) - ) - .filter(LAreas.id_type == id_type) - .all() + .where(LAreas.id_type == id_type) + ).all() ] for element in elements: # if 'Communes', % of zh in the municipality must be calculated if id_type == CorZhArea.get_id_type("Communes"): - municipality_geom = getattr( - DB.session.query(LAreas).filter(LAreas.id_area == element).first(), "geom" + municipality_geom = getattr(DB.session.get(LAreas, element), "geom") + polygon_2154 = DB.session.scalar( + select(func.ST_Transform(func.ST_SetSRID(func.ST_AsText(polygon), 4326), 2154)) ) - polygon_2154 = DB.session.query( - func.ST_Transform(func.ST_SetSRID(func.ST_AsText(polygon), 4326), 2154) - ).scalar() - intersect_area = DB.session.query( - func.ST_Area(func.ST_Intersection(municipality_geom, polygon_2154)) - ).scalar() - municipality_area = DB.session.query(func.ST_Area(municipality_geom)).scalar() + intersect_area = DB.session.scalar( + select(func.ST_Area(func.ST_Intersection(municipality_geom, polygon_2154))) + ) + municipality_area = DB.session.scalar(select(func.ST_Area(municipality_geom))) cover = math.ceil((intersect_area * 100) / municipality_area) if cover > 100: cover = 100 @@ -280,11 +288,10 @@ def update_zh_tab0(form_data, polygon, area, info_role, zh_date, geo_refs): is_geom_new = check_polygon(polygon, form_data["id_zh"]) # update pr_zh.cor_lim_list - id_lim_list, ef_area = ( - DB.session.query(TZH.id_lim_list, TZH.ef_area).filter(TZH.id_zh == form_data["id_zh"]).one() - ) + id_lim_list = DB.session.get(TZH, form_data["id_zh"]).id_lim_list + ef_area = DB.session.get(TZH, form_data["id_zh"]).ef_area - DB.session.query(CorLimList).filter(CorLimList.id_lim_list == id_lim_list).delete() + DB.session.execute(delete(CorLimList).where(CorLimList.id_lim_list == id_lim_list)) post_cor_lim_list(id_lim_list, form_data["critere_delim"]) if is_geom_new: @@ -294,17 +301,19 @@ def update_zh_tab0(form_data, polygon, area, info_role, zh_date, geo_refs): ef_area = update_cor_zh_fct_area(form_data["geom"]["geometry"], form_data["id_zh"]) # update zh : fill pr_zh.t_zh - DB.session.query(TZH).filter(TZH.id_zh == form_data["id_zh"]).update( - { - TZH.main_name: form_data["main_name"], - TZH.id_org: form_data["id_org"], - TZH.update_author: info_role.id_role, - TZH.update_date: zh_date, - TZH.id_sdage: form_data["sdage"], - TZH.geom: polygon, - TZH.area: area, - TZH.ef_area: ef_area, - } + DB.session.execute( + update(TZH) + .where(TZH.id_zh == form_data["id_zh"]) + .values( + main_name=form_data["main_name"], + id_org=form_data["id_org"], + update_author=info_role.id_role, + update_date=zh_date, + id_sdage=form_data["sdage"], + geom=polygon, + area=area, + ef_area=ef_area, + ) ) DB.session.flush() @@ -324,7 +333,12 @@ def update_zh_tab0(form_data, polygon, area, info_role, zh_date, geo_refs): def check_polygon(polygon, id_zh): try: - if polygon != str(DB.session.query(TZH.geom).filter(TZH.id_zh == id_zh).one()[0]).upper(): + if ( + polygon + != str( + DB.session.execute(select(TZH.geom).where(TZH.id_zh == id_zh)).scalar_one() + ).upper() + ): return True return False except Exception as e: @@ -336,25 +350,32 @@ def check_polygon(polygon, id_zh): def update_cor_zh_area(polygon, id_zh, geo_refs): try: - DB.session.query(CorZhArea).filter(CorZhArea.id_zh == id_zh).delete() + DB.session.execute(delete(CorZhArea).where(CorZhArea.id_zh == id_zh)) post_cor_zh_area( polygon, id_zh, - DB.session.query(BibAreasTypes).filter(BibAreasTypes.type_code == "COM").one().id_type, + DB.session.execute(select(BibAreasTypes).where(BibAreasTypes.type_code == "COM")) + .scalar_one() + .id_type, ) post_cor_zh_area( polygon, id_zh, - DB.session.query(BibAreasTypes).filter(BibAreasTypes.type_code == "DEP").one().id_type, + DB.session.execute(select(BibAreasTypes).where(BibAreasTypes.type_code == "DEP")) + .scalar_one() + .id_type, ) # fill cor_zh_area for other geo referentials for ref in geo_refs: post_cor_zh_area( polygon, id_zh, - DB.session.query(BibAreasTypes) - .filter(BibAreasTypes.type_code == ref["type_code_ref_geo"]) - .one() + DB.session.execute( + select(BibAreasTypes).where( + BibAreasTypes.type_code == ref["type_code_ref_geo"] + ) + ) + .scalar_one() .id_type, ) except Exception as e: @@ -372,17 +393,17 @@ def update_cor_zh_area(polygon, id_zh, geo_refs): def update_cor_zh_rb(geom, id_zh): - DB.session.query(CorZhRb).filter(CorZhRb.id_zh == id_zh).delete() + DB.session.execute(delete(CorZhRb).where(CorZhRb.id_zh == id_zh)) post_cor_zh_rb(geom, id_zh) def update_cor_zh_hydro(geom, id_zh): - DB.session.query(CorZhHydro).filter(CorZhHydro.id_zh == id_zh).delete() + DB.session.execute(delete(CorZhHydro).where(CorZhHydro.id_zh == id_zh)) post_cor_zh_hydro(geom, id_zh) def update_cor_zh_fct_area(geom, id_zh): - DB.session.query(CorZhFctArea).filter(CorZhFctArea.id_zh == id_zh).delete() + DB.session.execute(delete(CorZhFctArea).where(CorZhFctArea.id_zh == id_zh)) return post_cor_zh_fct_area(geom, id_zh) @@ -391,7 +412,7 @@ def update_cor_zh_fct_area(geom, id_zh): def update_refs(form_data): try: - DB.session.query(CorZhRef).filter(CorZhRef.id_zh == form_data["id_zh"]).delete() + DB.session.execute(delete(CorZhRef).where(CorZhRef.id_zh == form_data["id_zh"])) for ref in form_data["id_references"]: DB.session.add(CorZhRef(id_zh=form_data["id_zh"], id_ref=ref)) DB.session.flush() @@ -436,7 +457,7 @@ def post_activities(id_zh, activities): def update_activities(id_zh, activities): try: # delete cascade t_activity and cor_impact_list with id_zh - DB.session.query(TActivity).filter(TActivity.id_zh == id_zh).delete() + DB.session.execute(delete(TActivity).where(TActivity.id_zh == id_zh)) # post new activities post_activities(id_zh, activities) except Exception as e: @@ -455,7 +476,7 @@ def update_activities(id_zh, activities): def update_corine_biotopes(id_zh, corine_biotopes): try: - DB.session.query(CorZhCb).filter(CorZhCb.id_zh == id_zh).delete() + DB.session.execute(delete(CorZhCb).where(CorZhCb.id_zh == id_zh)) post_corine_biotopes(id_zh, corine_biotopes) except Exception as e: if e.__class__.__name__ == "DataError": @@ -479,7 +500,7 @@ def post_corine_biotopes(id_zh, corine_biotopes): def update_corine_landcover(id_zh, ids_cover): try: - DB.session.query(CorZhCorineCover).filter(CorZhCorineCover.id_zh == id_zh).delete() + DB.session.execute(delete(CorZhCorineCover).where(CorZhCorineCover.id_zh == id_zh)) post_corine_landcover(id_zh, ids_cover) except Exception as e: if e.__class__.__name__ == "DataError": @@ -506,10 +527,8 @@ def post_corine_landcover(id_zh, ids_cover): def update_delim(id_zh, criteria): try: - uuid_lim_list = ( - DB.session.query(TZH.id_lim_list).filter(TZH.id_zh == id_zh).one().id_lim_list - ) - DB.session.query(CorLimList).filter(CorLimList.id_lim_list == uuid_lim_list).delete() + uuid_lim_list = DB.session.get(TZH, id_zh).id_lim_list + DB.session.execute(delete(CorLimList).where(CorLimList.id_lim_list == uuid_lim_list)) post_delim(uuid_lim_list, criteria) except Exception as e: if e.__class__.__name__ == "DataError": @@ -533,7 +552,7 @@ def post_delim(uuid_lim, criteria): def update_fct_delim(id_zh, criteria): try: - DB.session.query(CorZhLimFs).filter(CorZhLimFs.id_zh == id_zh).delete() + DB.session.execute(delete(CorZhLimFs).where(CorZhLimFs.id_zh == id_zh)) post_fct_delim(id_zh, criteria) except Exception as e: if e.__class__.__name__ == "DataError": @@ -560,7 +579,7 @@ def post_fct_delim(id_zh, criteria): def update_outflow(id_zh, outflows): try: - DB.session.query(TOutflow).filter(TOutflow.id_zh == id_zh).delete() + DB.session.execute(delete(TOutflow).where(TOutflow.id_zh == id_zh)) post_outflow(id_zh, outflows) except Exception as e: if e.__class__.__name__ == "DataError": @@ -591,7 +610,7 @@ def post_outflow(id_zh, outflows): def update_inflow(id_zh, inflows): try: - DB.session.query(TInflow).filter(TInflow.id_zh == id_zh).delete() + DB.session.execute(select(TInflow).where(TInflow.id_zh == id_zh)) post_inflow(id_zh, inflows) except Exception as e: if e.__class__.__name__ == "DataError": @@ -643,9 +662,13 @@ def update_functions(id_zh, functions, function_type): nomenclature.id_nomenclature for nomenclature in Nomenclatures.get_nomenclature_info(function_type) ] - DB.session.query(TFunctions).filter(TFunctions.id_zh == id_zh).filter( - TFunctions.id_function.in_(id_function_list) - ).delete(synchronize_session="fetch") + stmt = ( + delete(TFunctions) + .where(TFunctions.id_zh == id_zh) + .where(TFunctions.id_function.in_(id_function_list)) + .execution_options(synchronize_session="fetch") + ) + DB.session.execute(stmt) post_functions(id_zh, functions) except Exception as e: if e.__class__.__name__ == "DataError": @@ -664,7 +687,7 @@ def update_functions(id_zh, functions, function_type): def update_hab_heritages(id_zh, hab_heritages): try: # delete cascade t_hab_heritages - DB.session.query(THabHeritage).filter(THabHeritage.id_zh == id_zh).delete() + DB.session.execute(delete(THabHeritage).where(THabHeritage.id_zh == id_zh)) # post new hab_heritages post_hab_heritages(id_zh, hab_heritages) except Exception as e: @@ -699,7 +722,7 @@ def post_hab_heritages(id_zh, hab_heritages): def update_ownerships(id_zh, ownerships): try: - DB.session.query(TOwnership).filter(TOwnership.id_zh == id_zh).delete() + DB.session.execute(delete(TOwnership).where(TOwnership.id_zh == id_zh)) post_ownerships(id_zh, ownerships) except Exception as e: if e.__class__.__name__ == "DataError": @@ -725,9 +748,9 @@ def post_ownerships(id_zh, ownerships): def update_managements(id_zh, managements): try: - DB.session.query(TManagementStructures).filter( - TManagementStructures.id_zh == id_zh - ).delete() + DB.session.execute( + delete(TManagementStructures).where(TManagementStructures.id_zh == id_zh) + ) # verifier si suppression en cascade ok dans TManagementPlans post_managements(id_zh, managements) except Exception as e: @@ -753,14 +776,15 @@ def post_managements(id_zh, managements): DB.session.add( TManagementPlans( id_nature=plan["id_nature"], - id_structure=DB.session.query(TManagementStructures) - .filter( - and_( - TManagementStructures.id_zh == id_zh, - TManagementStructures.id_org == management["structure"], + id_structure=DB.session.execute( + select(TManagementStructures).where( + and_( + TManagementStructures.id_zh == id_zh, + TManagementStructures.id_org == management["structure"], + ) ) ) - .one() + .scalar_one() .id_structure, plan_date=datetime.datetime.strptime(plan["plan_date"], "%d/%m/%Y"), duration=plan["duration"], @@ -772,7 +796,7 @@ def post_managements(id_zh, managements): def update_instruments(id_zh, instruments): try: - DB.session.query(TInstruments).filter(TInstruments.id_zh == id_zh).delete() + DB.session.execute(delete(TInstruments).where(TInstruments.id_zh == id_zh)) post_instruments(id_zh, instruments) except Exception as e: if e.__class__.__name__ == "DataError": @@ -804,7 +828,7 @@ def post_instruments(id_zh, instruments): def update_protections(id_zh, protections): try: - DB.session.query(CorZhProtection).filter(CorZhProtection.id_zh == id_zh).delete() + DB.session.execute(select(CorZhProtection).where(CorZhProtection.id_zh == id_zh)) post_protections(id_zh, protections) except Exception as e: if e.__class__.__name__ == "DataError": @@ -824,9 +848,12 @@ def post_protections(id_zh, protections): for protection in protections: DB.session.add( CorZhProtection( - id_protection=DB.session.query(CorProtectionLevelType) - .filter(CorProtectionLevelType.id_protection_status == protection) - .one() + id_protection=DB.session.execute( + select(CorProtectionLevelType).where( + CorProtectionLevelType.id_protection_status == protection + ) + ) + .scalar_one() .id_protection, id_zh=id_zh, ) @@ -837,15 +864,17 @@ def post_protections(id_zh, protections): def update_zh_tab6(data): try: is_other_inventory = data["is_other_inventory"] - DB.session.query(TZH).filter(TZH.id_zh == data["id_zh"]).update( - { - TZH.update_author: data["update_author"], - TZH.update_date: data["update_date"], - TZH.is_other_inventory: is_other_inventory, - TZH.remark_is_other_inventory: ( + DB.session.execute( + update(TZH) + .where(TZH.id_zh == data["id_zh"]) + .values( + update_author=data["update_author"], + update_date=data["update_date"], + is_other_inventory=is_other_inventory, + remark_is_other_inventory=( data["remark_is_other_inventory"] if is_other_inventory else None ), - } + ) ) DB.session.flush() except Exception as e: @@ -864,7 +893,7 @@ def update_zh_tab6(data): def update_urban_docs(id_zh, urban_docs): try: - DB.session.query(TUrbanPlanningDocs).filter(TUrbanPlanningDocs.id_zh == id_zh).delete() + DB.session.execute(delete(TUrbanPlanningDocs).where(TUrbanPlanningDocs.id_zh == id_zh)) post_urban_docs(id_zh, urban_docs) except Exception as e: if e.__class__.__name__ == "DataError": @@ -883,9 +912,12 @@ def update_urban_docs(id_zh, urban_docs): def post_urban_docs(id_zh, urban_docs): for urban_doc in urban_docs: id_doc_type = ( - DB.session.query(CorUrbanTypeRange) - .filter(CorUrbanTypeRange.id_cor == urban_doc["id_urban_type"][0]["id_cor"]) - .one() + DB.session.execute( + select(CorUrbanTypeRange).where( + CorUrbanTypeRange.id_cor == urban_doc["id_urban_type"][0]["id_cor"] + ) + ) + .scalar_one() .id_doc_type ) uuid_doc = uuid.uuid4() @@ -910,7 +942,7 @@ def post_urban_docs(id_zh, urban_docs): def update_actions(id_zh, actions): try: # delete cascade actions - DB.session.query(TActions).filter(TActions.id_zh == id_zh).delete() + DB.session.execute(select(TActions).where(TActions.id_zh == id_zh)) # post new actions post_actions(id_zh, actions) except Exception as e: @@ -945,7 +977,9 @@ def post_actions(id_zh, actions): def post_file_info(id_zh, title, author, description, extension, media_path=None): try: - unique_id_media = DB.session.query(TZH).filter(TZH.id_zh == int(id_zh)).one().zh_uuid + unique_id_media = ( + DB.session.execute(select(TZH).where(TZH.id_zh == int(id_zh))).scalar_one().zh_uuid + ) uuid_attached_row = uuid.uuid4() if extension == ".pdf": mnemo = "PDF" @@ -954,20 +988,20 @@ def post_file_info(id_zh, title, author, description, extension, media_path=None else: mnemo = "Photo" id_nomenclature_media_type = ( - DB.session.query(TNomenclatures) - .filter(TNomenclatures.mnemonique == mnemo) - .one() + DB.session.execute(select(TNomenclatures).where(TNomenclatures.mnemonique == mnemo)) + .scalar_one() .id_nomenclature ) id_table_location = ( - DB.session.query(BibTablesLocation) - .filter( - and_( - BibTablesLocation.schema_name == "pr_zh", - BibTablesLocation.table_name == "t_zh", + DB.session.execute( + select(BibTablesLocation).where( + and_( + BibTablesLocation.schema_name == "pr_zh", + BibTablesLocation.table_name == "t_zh", + ) ) ) - .one() + .scalar_one() .id_table_location ) post_date = datetime.datetime.now() @@ -988,9 +1022,10 @@ def post_file_info(id_zh, title, author, description, extension, media_path=None ) DB.session.commit() id_media = ( - DB.session.query(TMedias) - .filter(TMedias.uuid_attached_row == uuid_attached_row) - .one() + DB.session.execute( + select(TMedias).where(TMedias.uuid_attached_row == uuid_attached_row) + ) + .scalar_one() .id_media ) return id_media @@ -1006,31 +1041,36 @@ def post_file_info(id_zh, title, author, description, extension, media_path=None def patch_file_info(id_zh, id_media, title, author, description): try: - unique_id_media = DB.session.query(TZH).filter(TZH.id_zh == int(id_zh)).one().zh_uuid + unique_id_media = ( + DB.session.execute(select(TZH).where(TZH.id_zh == int(id_zh))).scalar_one().zh_uuid + ) uuid_attached_row = uuid.uuid4() id_table_location = ( - DB.session.query(BibTablesLocation) - .filter( - and_( - BibTablesLocation.schema_name == "pr_zh", - BibTablesLocation.table_name == "t_zh", + DB.session.execute( + select(BibTablesLocation).where( + and_( + BibTablesLocation.schema_name == "pr_zh", + BibTablesLocation.table_name == "t_zh", + ) ) ) - .one() + .scalar_one() .id_table_location ) post_date = datetime.datetime.now() - DB.session.query(TMedias).filter(TMedias.id_media == id_media).update( - { - "unique_id_media": unique_id_media, - "id_table_location": id_table_location, - "uuid_attached_row": uuid_attached_row, - "title_fr": title, - "author": author, - "description_fr": description, - "is_public": True, - "meta_update_date": str(post_date), - } + DB.session.execute( + update(TMedias) + .where(TMedias.id_media == id_media) + .values( + unique_id_media=unique_id_media, + id_table_location=id_table_location, + uuid_attached_row=uuid_attached_row, + title_fr=title, + author=author, + description_fr=description, + is_public=True, + meta_update_date=str(post_date), + ) ) DB.session.flush() except exc.DataError as e: @@ -1052,13 +1092,14 @@ def update_file_extension(id_media, extension): else: mnemo = "Photo" id_nomenclature_media_type = ( - DB.session.query(TNomenclatures) - .filter(TNomenclatures.mnemonique == mnemo) - .one() + DB.session.execute(select(TNomenclatures).where(TNomenclatures.mnemonique == mnemo)) + .scalar_one() .id_nomenclature ) - DB.session.query(TMedias).filter(TMedias.id_media == id_media).update( - {"id_nomenclature_media_type": id_nomenclature_media_type} + DB.session.execute( + update(TMedias) + .where(TMedias.id_media == id_media) + .values(id_nomenclature_media_type=id_nomenclature_media_type) ) DB.session.flush() except exc.DataError as e: @@ -1073,12 +1114,11 @@ def update_file_extension(id_media, extension): def post_note(id_zh, cor_rule_id, note, attribute_id, note_type_id): try: - element = ( - DB.session.query(CorZhNotes) - .filter(CorZhNotes.id_zh == id_zh) - .filter(CorZhNotes.cor_rule_id == cor_rule_id) - .first() - ) + element = DB.session.scalars( + select(CorZhNotes) + .where(CorZhNotes.id_zh == id_zh) + .where(CorZhNotes.cor_rule_id == cor_rule_id) + ).first() if element: if element.note != note: element.note = note diff --git a/backend/gn_module_zh/geometry.py b/backend/gn_module_zh/geometry.py index b9429a5f..3742036a 100644 --- a/backend/gn_module_zh/geometry.py +++ b/backend/gn_module_zh/geometry.py @@ -2,7 +2,7 @@ from geoalchemy2.shape import to_shape from geonature.utils.env import DB -from sqlalchemy import func +from sqlalchemy.sql import select, func from werkzeug.exceptions import BadRequest from .api_error import ZHApiError @@ -17,45 +17,48 @@ def set_geom(geometry, id_zh=None): # SetSRID for POSTGIS < 3.0 compat # select only already existing ZH geometries which intersect with the new ZH geometry - q_zh = ( - DB.session.query(TZH) - .filter( + # polygon = DB.session.execute( + # select(func.ST_SetSRID(func.ST_GeomFromGeoJSON(str(geometry)), 4326)) + # ).scalar_one() + q_zh = DB.session.scalars( + select(TZH) + .where( func.ST_Intersects( func.ST_GeogFromWKB(func.ST_AsEWKB(TZH.geom)), func.ST_GeogFromWKB(func.ST_AsEWKB(str(geometry))), ) ) - .filter( - func.ST_Touches( + .where(func.ST_Touches( func.ST_GeomFromWKB(func.ST_AsEWKB(TZH.geom), 4326), func.ST_GeomFromWKB(func.ST_AsEWKB(str(geometry)), 4326), ) == False ) - .all() - ) + ).all() + is_intersected = False for zh in q_zh: if zh.id_zh != id_zh: - zh_geom = DB.session.query(func.ST_GeogFromWKB(func.ST_AsEWKB(zh.geom))).scalar() - polygon_geom = DB.session.query( - func.ST_GeogFromWKB(func.ST_AsEWKB(str(geometry))) - ).scalar() - if DB.session.query(func.ST_Intersects(polygon_geom, zh_geom)).scalar(): - if DB.session.query( - func.ST_GeometryType(func.ST_Intersection(zh_geom, polygon_geom, 0.1)) - ).scalar() not in ["ST_LineString", "ST_MultiLineString"]: + zh_geom = DB.session.scalar(select(func.ST_GeogFromWKB(func.ST_AsEWKB(zh.geom)))) + polygon_geom = DB.session.scalar( + select(func.ST_GeogFromWKB(func.ST_AsEWKB(str(geometry)))) + ) + if DB.session.scalar(select(func.ST_Intersects(polygon_geom, zh_geom))): + if DB.session.scalar( + func.ST_GeometryType(func.ST_Intersection(zh_geom, polygon_geom, 0.1)) + ) not in ["ST_LineString", "ST_MultiLineString"]: is_intersected = True - if DB.session.query( + if DB.session.scalar( func.ST_Contains( zh_geom, polygon_geom, + ) - ).scalar(): + ): raise BadRequest("La ZH est entièrement dans une ZH existante") - # TODO: not detected if contained entirely in 2 or more ZH polygons - polygon = DB.session.query(func.ST_Difference(polygon_geom, zh_geom)).scalar() + # TODO: not detected if contained entirely in 2 or more ZH polygons + polygon = DB.session.scalar(select(func.ST_Difference(polygon_geom, zh_geom))) return {"polygon": polygon, "is_intersected": is_intersected} @@ -63,9 +66,9 @@ def set_area(geom): # unit : ha return round( ( - DB.session.query( - func.ST_Area(func.ST_GeomFromText(func.ST_AsText(geom["polygon"])), False) - ).scalar() + DB.session.scalar( + select(func.ST_Area(func.ST_GeomFromText(func.ST_AsText(geom["polygon"])), False)) + ) ) / 10000, 2, @@ -77,22 +80,28 @@ def get_main_rb(query: list) -> int: area = 0 for q_ in query: zh_polygon = ( - DB.session.query(TZH.geom).filter(TZH.id_zh == getattr(q_, "id_zh")).first().geom + DB.session.scalars(select(TZH.geom).where(TZH.id_zh == getattr(q_, "id_zh"))) + .first() + .geom ) rb_polygon = ( - DB.session.query(CorZhRb, TRiverBasin) - .join(TRiverBasin, TRiverBasin.id_rb == CorZhRb.id_rb) - .filter(TRiverBasin.id_rb == getattr(q_, "id_rb")) + DB.session.scalar( + select(CorZhRb, TRiverBasin) + .join(TRiverBasin, TRiverBasin.id_rb == CorZhRb.id_rb) + .where(TRiverBasin.id_rb == getattr(q_, "id_rb")) + ) .first() .TRiverBasin.geom ) - intersection = DB.session.query( - func.ST_Intersection( - func.ST_GeomFromText(func.ST_AsText(zh_polygon)), - func.ST_GeomFromText(func.ST_AsText(rb_polygon)), + intersection = DB.session.scalar( + select( + func.ST_Intersection( + func.ST_GeomFromText(func.ST_AsText(zh_polygon)), + func.ST_GeomFromText(func.ST_AsText(rb_polygon)), + ) ) - ).scalar() - if DB.session.query(func.ST_Area(intersection, False)).scalar() > area: - area = DB.session.query(func.ST_Area(intersection, False)).scalar() + ) + if DB.session.scalar(select(func.ST_Area(intersection, False))) > area: + area = DB.session.scalar(select(func.ST_Area(intersection, False))) rb_id = getattr(q_, "id_rb") return rb_id diff --git a/backend/gn_module_zh/hierarchy.py b/backend/gn_module_zh/hierarchy.py index 4cd861dd..e769e321 100644 --- a/backend/gn_module_zh/hierarchy.py +++ b/backend/gn_module_zh/hierarchy.py @@ -6,6 +6,7 @@ from geonature.utils.env import DB from pypnnomenclature.models import BibNomenclaturesTypes, TNomenclatures from sqlalchemy import and_ +from sqlalchemy.sql import select from sqlalchemy.orm.exc import NoResultFound from utils_flask_sqla.generic import GenericQuery @@ -54,7 +55,7 @@ def __init__(self, id_zh, rb_id, abb): def __get_rule_id(self, abb): try: return getattr( - DB.session.query(TRules).filter(TRules.abbreviation == abb).one(), + DB.session.execute(select(TRules).where(TRules.abbreviation == abb)).scalar_one(), "rule_id", ) except Exception as e: @@ -68,16 +69,14 @@ def __get_rule_id(self, abb): def __is_rb_rule(self): try: - q_rule = ( - DB.session.query(CorRbRules) - .filter( + q_rule = DB.session.scalars( + select(CorRbRules).where( and_( CorRbRules.rb_id == self.rb_id, CorRbRules.rule_id == self.rule_id, ) ) - .first() - ) + ).first() if q_rule: return True return False @@ -94,14 +93,14 @@ def __get_cor_rule_id(self): try: if self.active: return getattr( - DB.session.query(CorRbRules) - .filter( - and_( - CorRbRules.rb_id == self.rb_id, - CorRbRules.rule_id == self.rule_id, + DB.session.execute( + select(CorRbRules).where( + and_( + CorRbRules.rb_id == self.rb_id, + CorRbRules.rule_id == self.rule_id, + ) ) - ) - .one(), + ).scalar_one(), "cor_rule_id", ) except Exception as e: @@ -115,14 +114,14 @@ def __get_cor_rule_id(self): def __get_id_nomenc(self, id_type: int, cd_nomenc: str) -> int: return getattr( - DB.session.query(TNomenclatures) - .filter( - and_( - TNomenclatures.id_type == id_type, - TNomenclatures.cd_nomenclature == cd_nomenc, + DB.session.scalars( + select(TNomenclatures).where( + and_( + TNomenclatures.id_type == id_type, + TNomenclatures.cd_nomenclature == cd_nomenc, + ) ) - ) - .first(), + ).first(), "id_nomenclature", None, ) @@ -131,10 +130,11 @@ def __get_nomencs(self, abb, cat=None): cat_id = self.__get_id_nomenc(self.__get_id_type("HIERARCHY"), cat) return [ getattr(q_.CorRuleNomenc, "nomenc_id") - for q_ in DB.session.query(CorRuleNomenc, TRules) - .join(TRules) - .filter(and_(TRules.abbreviation == abb, CorRuleNomenc.qualif_id == cat_id)) - .all() + for q_ in DB.session.execute( + select(CorRuleNomenc, TRules) + .join(TRules) + .where(and_(TRules.abbreviation == abb, CorRuleNomenc.qualif_id == cat_id)) + ).all() ] def __get_nomenc_ids(self): @@ -161,9 +161,9 @@ def __get_qualif_cat7(self): id_nomenc = self.__get_qualif_val() if ( getattr( - DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_nomenclature == id_nomenc) - .one(), + DB.session.execute( + select(TNomenclatures).where(TNomenclatures.id_nomenclature == id_nomenc) + ).scalar_one(), "cd_nomenclature", ) == "0" @@ -171,9 +171,9 @@ def __get_qualif_cat7(self): return self.__get_id_nomenc(self.__get_id_type("HIERARCHY"), "NE") if ( getattr( - DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_nomenclature == id_nomenc) - .one(), + DB.session.execute( + select(TNomenclatures).where(TNomenclatures.id_nomenclature == id_nomenc) + ).scalar_one(), "cd_nomenclature", ) == "1" @@ -181,9 +181,9 @@ def __get_qualif_cat7(self): return self.__get_id_nomenc(self.__get_id_type("HIERARCHY"), "bon") if ( getattr( - DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_nomenclature == id_nomenc) - .one(), + DB.session.execute( + select(TNomenclatures).where(TNomenclatures.id_nomenclature == id_nomenc) + ).scalar_one(), "cd_nomenclature", ) == "2" @@ -191,9 +191,9 @@ def __get_qualif_cat7(self): return self.__get_id_nomenc(self.__get_id_type("HIERARCHY"), "moyen") if ( getattr( - DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_nomenclature == id_nomenc) - .one(), + DB.session.execute( + select(TNomenclatures).where(TNomenclatures.id_nomenclature == id_nomenc) + ).scalar_one(), "cd_nomenclature", ) == "3" @@ -253,24 +253,23 @@ def __get_qualif_heritage(self): if not nb: nb = 0 try: - qualif = ( - DB.session.query(CorRbRules, TItems, CorItemValue) + qualif = DB.session.scalars( + select(CorRbRules, TItems, CorItemValue) .join(TItems, TItems.cor_rule_id == CorRbRules.cor_rule_id) .join(CorItemValue, TItems.attribute_id == CorItemValue.attribute_id) - .filter( + .where( and_( CorRbRules.rb_id == self.rb_id, CorRbRules.rule_id == self.rule_id, ) ) - .filter( + .where( and_( CorItemValue.val_min.__le__(nb), CorItemValue.val_max.__ge__(nb), ) ) - .first() - ) + ).first() except Exception as e: exc_type, value, tb = sys.exc_info() raise ZHApiError( @@ -341,26 +340,26 @@ def __get_qualif_eco(self): if len(q_functions) >= 1: # if 61 and/or 62 : get nomenc id of continum ('res') return getattr( - DB.session.query(TNomenclatures) - .filter( - and_( - TNomenclatures.id_type == hier_type_id, - TNomenclatures.cd_nomenclature == "res", + DB.session.execute( + select(TNomenclatures).where( + and_( + TNomenclatures.id_type == hier_type_id, + TNomenclatures.cd_nomenclature == "res", + ) ) - ) - .one(), + ).scalar_one(), "id_nomenclature", ) else: return getattr( - DB.session.query(TNomenclatures) - .filter( - and_( - TNomenclatures.id_type == hier_type_id, - TNomenclatures.cd_nomenclature == "iso", + DB.session.execute( + select(TNomenclatures).where( + and_( + TNomenclatures.id_type == hier_type_id, + TNomenclatures.cd_nomenclature == "iso", + ) ) - ) - .one(), + ).scalar_one(), "id_nomenclature", ) except ZHApiError as e: @@ -382,17 +381,19 @@ def __get_selected_status(self): try: return [ getattr(q_.TNomenclatures, "id_nomenclature") - for q_ in DB.session.query(CorZhProtection, CorProtectionLevelType, TNomenclatures) - .join( - CorProtectionLevelType, - CorZhProtection.id_protection == CorProtectionLevelType.id_protection, - ) - .join( - TNomenclatures, - TNomenclatures.id_nomenclature == CorProtectionLevelType.id_protection_status, - ) - .filter(CorZhProtection.id_zh == self.id_zh) - .all() + for q_ in DB.session.execute( + select(CorZhProtection, CorProtectionLevelType, TNomenclatures) + .join( + CorProtectionLevelType, + CorZhProtection.id_protection == CorProtectionLevelType.id_protection, + ) + .join( + TNomenclatures, + TNomenclatures.id_nomenclature + == CorProtectionLevelType.id_protection_status, + ) + .where(CorZhProtection.id_zh == self.id_zh) + ).all() ] except ZHApiError as e: raise ZHApiError( @@ -415,16 +416,15 @@ def __get_selected_functions(self, nomenc_ids): # type_id = getattr(DB.session.query(BibNomenclaturesTypes).filter( # BibNomenclaturesTypes.mnemonique == nomenc_type_mnemo).one(), 'id_type') # get selected functions - q_ = ( - DB.session.query(TFunctions, TNomenclatures) + q_ = DB.session.execute( + select(TFunctions, TNomenclatures) .join( TNomenclatures, TNomenclatures.id_nomenclature == TFunctions.id_function, ) - .filter(TFunctions.id_zh == self.id_zh) - .filter(TNomenclatures.id_nomenclature.in_(nomenc_ids)) - .all() - ) + .where(TFunctions.id_zh == self.id_zh) + .where(TNomenclatures.id_nomenclature.in_(nomenc_ids)) + ).all() return q_ except ZHApiError as e: raise ZHApiError( @@ -445,9 +445,9 @@ def __get_id_type(self, mnemo): try: # get id_type in TNomenclatures return getattr( - DB.session.query(BibNomenclaturesTypes) - .filter(BibNomenclaturesTypes.mnemonique == mnemo) - .one(), + DB.session.execute( + select(BibNomenclaturesTypes).where(BibNomenclaturesTypes.mnemonique == mnemo) + ).scalar_one(), "id_type", ) except Exception as e: @@ -493,11 +493,12 @@ def __get_combination(self): "mnemo": nomenc.TNomenclatures.mnemonique, "id": nomenc.TNomenclatures.id_nomenclature, } - for nomenc in DB.session.query(BibNomenclaturesTypes, TNomenclatures) - .join(BibNomenclaturesTypes) - .filter(BibNomenclaturesTypes.mnemonique == "FONCTIONS_QUALIF") - .order_by(TNomenclatures.id_nomenclature) - .all() + for nomenc in DB.session.execute( + select(BibNomenclaturesTypes, TNomenclatures) + .join(BibNomenclaturesTypes) + .where(BibNomenclaturesTypes.mnemonique == "FONCTIONS_QUALIF") + .order_by(TNomenclatures.id_nomenclature) + ).all() ] # get qualif combination of selected functions @@ -510,7 +511,9 @@ def __get_qualif_cat4_cat5(self): combination = self.__get_combination() # set qualif_id qualif_id = getattr( - DB.session.query(TCorQualif).filter(TCorQualif.combination == combination).first(), + DB.session.scalars( + select(TCorQualif).where(TCorQualif.combination == combination) + ).first(), "id_qualification", ) return qualif_id @@ -531,7 +534,9 @@ def __get_qualif_cat4_cat5(self): def __get_tzh_val(self, field): try: - return getattr(DB.session.query(TZH).filter(TZH.id_zh == self.id_zh).one(), field) + return getattr( + DB.session.execute(select(TZH).where(TZH.id_zh == self.id_zh)).scalar_one(), field + ) except Exception as e: exc_type, value, tb = sys.exc_info() raise ZHApiError( @@ -584,54 +589,57 @@ def __get_qualif(self): def __get_qualif_management(self): try: cd_id_nature_naturaliste = getattr( - DB.session.query(BibNomenclaturesTypes, TNomenclatures) - .join( - TNomenclatures, - TNomenclatures.id_type == BibNomenclaturesTypes.id_type, - ) - .filter( - and_( - BibNomenclaturesTypes.mnemonique == "PLAN_GESTION", - TNomenclatures.cd_nomenclature == "5", + DB.session.execute( + select(BibNomenclaturesTypes, TNomenclatures) + .join( + TNomenclatures, + TNomenclatures.id_type == BibNomenclaturesTypes.id_type, + ) + .where( + and_( + BibNomenclaturesTypes.mnemonique == "PLAN_GESTION", + TNomenclatures.cd_nomenclature == "5", + ) ) ) - .one() + .scalar_one() .TNomenclatures, "id_nomenclature", ) selected_id_nature = [ getattr(q_.TManagementPlans, "id_nature") - for q_ in DB.session.query(TManagementPlans, TManagementStructures) - .join( - TManagementStructures, - TManagementPlans.id_structure == TManagementStructures.id_structure, - ) - .filter(TManagementStructures.id_zh == self.id_zh) - .all() + for q_ in DB.session.execute( + select(TManagementPlans, TManagementStructures) + .join( + TManagementStructures, + TManagementPlans.id_structure == TManagementStructures.id_structure, + ) + .where(TManagementStructures.id_zh == self.id_zh) + ).all() ] if cd_id_nature_naturaliste in selected_id_nature: # if id_nature == 'naturaliste' in selected plans : return return getattr( - DB.session.query(TNomenclatures) - .filter( - and_( - TNomenclatures.id_type == self.__get_id_type("HIERARCHY"), - TNomenclatures.cd_nomenclature == "OUI", + DB.session.execute( + select(TNomenclatures).where( + and_( + TNomenclatures.id_type == self.__get_id_type("HIERARCHY"), + TNomenclatures.cd_nomenclature == "OUI", + ) ) - ) - .one(), + ).scalar_one(), "id_nomenclature", ) else: return getattr( - DB.session.query(TNomenclatures) - .filter( - and_( - TNomenclatures.id_type == self.__get_id_type("HIERARCHY"), - TNomenclatures.cd_nomenclature == "NON", + DB.session.execute( + select(TNomenclatures).where( + and_( + TNomenclatures.id_type == self.__get_id_type("HIERARCHY"), + TNomenclatures.cd_nomenclature == "NON", + ) ) - ) - .one(), + ).scalar_one(), "id_nomenclature", ) except ZHApiError as e: @@ -654,16 +662,17 @@ def __get_knowledge(self): if self.active: if self.abb == "hab": is_carto = ( - DB.session.query(TZH).filter(TZH.id_zh == self.id_zh).one().is_carto_hab + DB.session.execute(select(TZH).where(TZH.id_zh == self.id_zh)) + .scalar_one() + .is_carto_hab ) if is_carto: return 3 return 2 elif self.abb in ["flore", "vertebrates", "invertebrates"]: is_other_inventory = ( - DB.session.query(TZH) - .filter(TZH.id_zh == self.id_zh) - .one() + DB.session.execute(select(TZH).where(TZH.id_zh == self.id_zh)) + .scalar_one() .is_other_inventory ) is_id_nature_plan_2 = self.__get_id_plan() @@ -676,22 +685,27 @@ def __get_knowledge(self): try: # return id_knowledge if abb function selected knowledge_id = ( - DB.session.query(TFunctions.id_knowledge) - .filter( - and_( - TFunctions.id_zh == self.id_zh, - TFunctions.id_qualification == self.qualif_id, + DB.session.execute( + select(TFunctions.id_knowledge) + .where( + and_( + TFunctions.id_zh == self.id_zh, + TFunctions.id_qualification == self.qualif_id, + ) ) + .where(TFunctions.id_function == CorRuleNomenc.nomenc_id) + .where(CorRuleNomenc.rule_id == self.rule_id) ) - .filter(TFunctions.id_function == CorRuleNomenc.nomenc_id) - .filter(CorRuleNomenc.rule_id == self.rule_id) - .one() + .scalar_one() .id_knowledge ) return ( - DB.session.query(BibNoteTypes) - .filter(BibNoteTypes.id_knowledge == knowledge_id) - .one() + DB.session.execute( + select(BibNoteTypes).where( + BibNoteTypes.id_knowledge == knowledge_id + ) + ) + .scalar_one() .note_id ) except: @@ -755,8 +769,8 @@ def __set_protection_knowledge(self): DB.session.close() def __get_id_plan(self): - q_plans = ( - DB.session.query(TManagementStructures, TManagementPlans) + q_plans = DB.session.execute( + select(TManagementStructures, TManagementPlans) .join( TManagementPlans, TManagementStructures.id_structure == TManagementPlans.id_structure, @@ -765,14 +779,13 @@ def __get_id_plan(self): TNomenclatures, TNomenclatures.id_nomenclature == TManagementPlans.id_nature, ) - .filter( + .where( and_( TManagementStructures.id_zh == self.id_zh, TNomenclatures.mnemonique == "Naturaliste", ) ) - .all() - ) + ).all() if q_plans: return True return False @@ -782,17 +795,20 @@ def __check_qualif(self, qualif_id): if self.active: attribute_id_list = [ getattr(item, "attribute_id") - for item in DB.session.query(TItems) - .filter(TItems.cor_rule_id == self.cor_rule_id) - .all() + for item in DB.session.scalars( + select(TItems).where(TItems.cor_rule_id == self.cor_rule_id) + ).all() ] if qualif_id not in attribute_id_list: raise ZHApiError( message="wrong_qualif", details="zh qualif ({}) provided for {} rule is not part of the qualif list defined in the river basin hierarchy rules".format( - DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_nomenclature == qualif_id) - .one() + DB.session.execute( + select(TNomenclatures).where( + TNomenclatures.id_nomenclature == qualif_id + ) + ) + .scalar_one() .mnemonique, self.abb, ), @@ -817,17 +833,15 @@ def __check_qualif(self, qualif_id): def __set_note(self): try: if self.active: - result = ( - DB.session.query(TItems) - .filter( + result = DB.session.execute( + select(TItems).where( and_( TItems.attribute_id == self.qualif_id, TItems.cor_rule_id == self.cor_rule_id, TItems.note_type_id == self.knowledge, ) ) - .one() - ) + ).scalar_one() note = round(result.note, 2) attribute_id = result.attribute_id note_type_id = result.note_type_id @@ -858,9 +872,9 @@ def __get_denominator(self): if self.active: return max( getattr(val, "note") - for val in DB.session.query(TItems) - .filter(TItems.cor_rule_id == self.cor_rule_id) - .all() + for val in DB.session.scalars( + select(TItems).where(TItems.cor_rule_id == self.cor_rule_id) + ).all() ) except Exception as e: exc_type, value, tb = sys.exc_info() @@ -872,19 +886,23 @@ def __get_denominator(self): def __get_rule_name(self): try: return ( - DB.session.query(TRules, BibHierSubcategories) - .join(TRules) - .filter(TRules.rule_id == self.rule_id) - .one() + DB.session.execute( + select(TRules, BibHierSubcategories) + .join(TRules) + .where(TRules.rule_id == self.rule_id) + ) + .scalar_one() .BibHierSubcategories.label.capitalize() ) except NoResultFound: pass return ( - DB.session.query(TRules, BibHierCategories) - .join(TRules) - .filter(TRules.rule_id == self.rule_id) - .one() + DB.session.execute( + select(TRules, BibHierCategories) + .join(TRules) + .where(TRules.rule_id == self.rule_id) + ) + .scalar_one() .BibHierCategories.label.capitalize() ) @@ -895,13 +913,15 @@ def __get_knowledge_mnemo(self): return None else: return getattr( - DB.session.query(TNomenclatures, BibNoteTypes) - .join( - BibNoteTypes, - TNomenclatures.id_nomenclature == BibNoteTypes.id_knowledge, + DB.session.execute( + select(TNomenclatures, BibNoteTypes) + .join( + BibNoteTypes, + TNomenclatures.id_nomenclature == BibNoteTypes.id_knowledge, + ) + .where(BibNoteTypes.note_id == self.knowledge) ) - .filter(BibNoteTypes.note_id == self.knowledge) - .one() + .scalar_one() .TNomenclatures, "mnemonique", ) @@ -916,9 +936,11 @@ def __get_qualif_mnemo(self): try: if self.active: return getattr( - DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_nomenclature == self.qualif_id) - .one(), + DB.session.execute( + select(TNomenclatures).where( + TNomenclatures.id_nomenclature == self.qualif_id + ) + ).scalar_one(), "label_default", ) except Exception as e: @@ -961,9 +983,9 @@ def denominator(self, value): def __get_name(self): return getattr( - DB.session.query(BibHierCategories) - .filter(BibHierCategories.abbreviation == self.abb) - .one(), + DB.session.execute( + select(BibHierCategories).where(BibHierCategories.abbreviation == self.abb) + ).scalar_one(), "label", ) @@ -1188,16 +1210,18 @@ def __get_rb(self): if len(q_rb) > 1: return get_main_rb(q_rb) return ( - DB.session.query(CorZhRb, TRiverBasin) - .join(TRiverBasin) - .filter(CorZhRb.id_zh == self.id_zh) - .one() + DB.session.execute( + select(CorZhRb, TRiverBasin).join(TRiverBasin).where(CorZhRb.id_zh == self.id_zh) + ) + .scalar_one() .TRiverBasin.id_rb ) def __check_if_rules(self): try: - if not DB.session.query(CorRbRules).filter(CorRbRules.rb_id == self.rb_id).first(): + if not DB.session.scalars( + select(CorRbRules).where(CorRbRules.rb_id == self.rb_id) + ).first(): raise ZHApiError( message="no_rb_rules", details="no existing rules for the river basin", @@ -1215,9 +1239,15 @@ def __check_if_rules(self): @staticmethod def get_denom(rb_id, col_name): - rb_name = DB.session.query(TRiverBasin).filter(TRiverBasin.id_rb == rb_id).one().name + rb_name = ( + DB.session.execute(select(TRiverBasin).where(TRiverBasin.id_rb == rb_id)) + .scalar_one() + .name + ) return getattr( - DB.session.query(RbNotesSummary).filter(RbNotesSummary.bassin_versant == rb_name).one(), + DB.session.execute( + select(RbNotesSummary).where(RbNotesSummary.bassin_versant == rb_name) + ).scalar_one(), col_name, ) @@ -1236,9 +1266,10 @@ def get_str_note(note, denominator): def as_dict(self): return { - "river_basin_name": DB.session.query(TRiverBasin) - .filter(TRiverBasin.id_rb == self.rb_id) - .one() + "river_basin_name": DB.session.execute( + select(TRiverBasin).where(TRiverBasin.id_rb == self.rb_id) + ) + .scalar_one() .name, "volet1": self.volet1.__str__(), "volet2": self.volet2.__str__(), diff --git a/backend/gn_module_zh/model/cards.py b/backend/gn_module_zh/model/cards.py index 90ffc3ce..7f63bc02 100644 --- a/backend/gn_module_zh/model/cards.py +++ b/backend/gn_module_zh/model/cards.py @@ -3,6 +3,7 @@ from ref_geo.models import BibAreasTypes, LAreas from geonature.utils.env import DB +from sqlalchemy.sql import select from pypn_habref_api.models import Habref from pypnnomenclature.models import TNomenclatures @@ -32,15 +33,17 @@ def get_mnemo(ids): if ids: if type(ids) is int: return ( - DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_nomenclature == ids) - .one() + DB.session.execute( + select(TNomenclatures).where(TNomenclatures.id_nomenclature == ids) + ) + .scalar_one() .label_default ) return [ - DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_nomenclature == id) - .one() + DB.session.execute( + select(TNomenclatures).where(TNomenclatures.id_nomenclature == id) + ) + .scalar_one() .label_default for id in ids ] @@ -50,18 +53,16 @@ def get_mnemo(ids): def get_cd_and_mnemo(ids): if ids: if type(ids) is int: - result = ( - DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_nomenclature == ids) - .one() - ) + result = DB.session.execute( + select(TNomenclatures).where(TNomenclatures.id_nomenclature == ids) + ).scalar_one() return (result.cd_nomenclature, result.label_default) - return ( - DB.session.query(TNomenclatures.cd_nomenclature, TNomenclatures.label_default) - .filter(TNomenclatures.id_nomenclature.in_(ids)) - .all() - ) + return DB.session.execute( + select(TNomenclatures.cd_nomenclature, TNomenclatures.label_default).where( + TNomenclatures.id_nomenclature.in_(ids) + ) + ).all() return [] @@ -380,21 +381,19 @@ def __init__(self, id_corine_bio, id_cahier_hab, id_preservation_state, hab_cove self.hab_cover: int = hab_cover def __str__(self): - hab_biotope = ( - DB.session.query(Habref) - .filter(Habref.lb_code == self.id_corine_bio) - .filter(Habref.cd_typo == 22) - .one() - ) + hab_biotope = DB.session.execute( + select(Habref).where(Habref.lb_code == self.id_corine_bio).where(Habref.cd_typo == 22) + ).scalar_one() biotope_lb_hab_fr = hab_biotope.lb_hab_fr biotope_lb_code = hab_biotope.lb_code - cahier = DB.session.query(Habref).filter(Habref.cd_hab == self.id_cahier_hab).one() + cahier = DB.session.execute( + select(Habref).where(Habref.cd_hab == self.id_cahier_hab) + ).scalar_one() cahier_lb_hab_fr = cahier.lb_hab_fr cahier_lb_code = cahier.lb_code priority = ( - DB.session.query(CorChStatus) - .filter(CorChStatus.lb_code == cahier_lb_code) - .one() + DB.session.execute(select(CorChStatus).where(CorChStatus.lb_code == cahier_lb_code)) + .scalar_one() .priority ) return { @@ -505,19 +504,22 @@ def __str__(self): def __get_river_basins(self): return [ name - for (name,) in DB.session.query(TRiverBasin.name) - .filter(TRiverBasin.id_rb == CorZhRb.id_rb) - .filter(CorZhRb.id_zh == self.id_zh) - .all() + for (name,) in DB.session.execute( + select(TRiverBasin.name) + .where(TRiverBasin.id_rb == CorZhRb.id_rb) + .where(CorZhRb.id_zh == self.id_zh) + ).all() ] def __get_hydro_zones(self): return [ name - for (name,) in DB.session.query(THydroArea.name) - .filter(THydroArea.id_hydro == CorZhHydro.id_hydro) - .filter(CorZhHydro.id_zh == self.id_zh) - .distinct() + for (name,) in DB.session.execute( + select(THydroArea.name) + .where(THydroArea.id_hydro == CorZhHydro.id_hydro) + .where(CorZhHydro.id_zh == self.id_zh) + .distinct() + ).all() ] @@ -677,9 +679,10 @@ def other_ref_geo(self, ref_geo): for ref in CorZhArea.get_ref_geo_info(self.id_zh, id_types): for i in ref: type_code = ( - DB.session.query(BibAreasTypes) - .filter(BibAreasTypes.id_type == i.LAreas.id_type) - .one() + DB.session.execute( + select(BibAreasTypes).where(BibAreasTypes.id_type == i.LAreas.id_type) + ) + .scalar_one() .type_code ) refs.append( @@ -722,11 +725,11 @@ def protections(self, protections): self.__protections: list(int) = protections def __str_protections(self): - q_protections = ( - DB.session.query(CorProtectionLevelType) - .filter(CorProtectionLevelType.id_protection_status.in_(self.protections)) - .all() - ) + q_protections = DB.session.scalars( + select(CorProtectionLevelType).where( + CorProtectionLevelType.id_protection_status.in_(self.protections) + ) + ).all() temp = [ { "status": Utils.get_mnemo(protection.id_protection_status), @@ -777,9 +780,10 @@ def set_management(self, id_org, plans): def __str__(self): return { - "structure": DB.session.query(BibOrganismes) - .filter(BibOrganismes.id_org == self.id_org) - .one() + "structure": DB.session.execute( + select(BibOrganismes).where(BibOrganismes.id_org == self.id_org) + ) + .scalar_one() .name, "plans": [plan.__str__() for plan in self.plans], } @@ -819,16 +823,16 @@ def __init__(self, id_area, id_doc_type, id_cors, remark): def __str__(self): return { - "commune": DB.session.query(LAreas) - .filter(LAreas.id_area == self.id_area) - .one() + "commune": DB.session.execute(select(LAreas).where(LAreas.id_area == self.id_area)) + .scalar_one() .area_name, "type_doc": Utils.get_mnemo(self.id_doc_type), "type_classement": [ Utils.get_mnemo( - DB.session.query(CorUrbanTypeRange) - .filter(CorUrbanTypeRange.id_cor == id) - .one() + DB.session.execute( + select(CorUrbanTypeRange).where(CorUrbanTypeRange.id_cor == id) + ) + .scalar_one() .id_range_type ) for id in self.id_cors @@ -1009,9 +1013,10 @@ def __init__(self, id_action, id_priority_level, remark): def __str__(self): return { - "proposition": DB.session.query(BibActions) - .filter(BibActions.id_action == self.id_action) - .one() + "proposition": DB.session.execute( + select(BibActions).where(BibActions.id_action == self.id_action) + ) + .scalar_one() .name, "niveau": Utils.get_mnemo(self.id_priority_level), "remarque": Utils.get_string(self.remark), diff --git a/backend/gn_module_zh/model/code.py b/backend/gn_module_zh/model/code.py index 132fcd57..3189f1d1 100644 --- a/backend/gn_module_zh/model/code.py +++ b/backend/gn_module_zh/model/code.py @@ -1,7 +1,7 @@ import sys from geonature.utils.env import DB -from sqlalchemy.sql import func +from sqlalchemy.sql import func, select from ..api_error import ZHApiError from .zh import ZH @@ -18,15 +18,20 @@ def get_departments(self): try: departments = CorZhArea.get_departments(self.id_zh) area = 0 - my_geom = ( - DB.session.query(func.ST_Transform(func.ST_SetSRID(TZH.geom, 4326), 2154)) - .filter(TZH.id_zh == self.id_zh) - .one()[0] - ) + my_geom = DB.session.execute( + select(func.ST_Transform(func.ST_SetSRID(TZH.geom, 4326), 2154)).where( + TZH.id_zh == self.id_zh + ) + ).scalar_one() main_dep = None for dep in departments: - if DB.session.scalar(dep.LAreas.geom.ST_Intersection(my_geom).ST_Area()) > area: - area = DB.session.scalar(dep.LAreas.geom.ST_Intersection(my_geom).ST_Area()) + if ( + DB.session.scalar(select(dep.LAreas.geom.ST_Intersection(my_geom).ST_Area())) + > area + ): + area = DB.session.scalar( + select(dep.LAreas.geom.ST_Intersection(my_geom).ST_Area()) + ) main_dep = dep.LAreas.area_code if main_dep is None: raise ZHApiError(message="no_department", details="main_dep value is none") @@ -44,7 +49,7 @@ def get_organism(self): def get_number(self): base_code = self.get_departments() + self.get_organism() - q_codes = DB.session.query(TZH).filter(TZH.code.contains(base_code)).all() + q_codes = DB.session.scalars(select(TZH).where(TZH.code.contains(base_code))).all() if q_codes: code_numbers = [int(zh.code.split(self.get_organism())[1]) for zh in q_codes] max_code = max(code_numbers) diff --git a/backend/gn_module_zh/model/repositories.py b/backend/gn_module_zh/model/repositories.py index f2100867..20b3a679 100644 --- a/backend/gn_module_zh/model/repositories.py +++ b/backend/gn_module_zh/model/repositories.py @@ -1,5 +1,6 @@ from geonature.utils.env import DB from werkzeug.exceptions import NotFound +from sqlalchemy.sql import select class ZhRepository: @@ -17,7 +18,7 @@ def delete(self, id_zh, user, user_cruved): - id_zh: integer - info_user: TRole object model""" level = user_cruved["D"] - zh = DB.session.query(self.model).get(id_zh) + zh = DB.session.get(self.model, id_zh) if zh: zh = zh.get_zh_if_allowed(user, "D", level) DB.session.delete(zh) diff --git a/backend/gn_module_zh/model/zh.py b/backend/gn_module_zh/model/zh.py index 404759a3..050801e9 100644 --- a/backend/gn_module_zh/model/zh.py +++ b/backend/gn_module_zh/model/zh.py @@ -1,5 +1,6 @@ # instance de la BDD from geonature.utils.env import DB +from sqlalchemy.sql import select from .zh_schema import ( TZH, @@ -32,11 +33,11 @@ class ZH(TZH): __abstract__ = True def __init__(self, id_zh): - self.zh = DB.session.query(TZH).filter(TZH.id_zh == id_zh).one() + self.zh = DB.session.get(TZH, id_zh) @staticmethod def get_data_by_id(table_name, id_zh): - return DB.session.query(table_name).filter(table_name.id_zh == id_zh).all() + return DB.session.scalars(select(table_name).where(table_name.id_zh == id_zh)).all() def get_id_lims(self): lim_list = CorLimList.get_lims_by_id(self.zh.id_lim_list) @@ -141,11 +142,11 @@ def get_managements(self): q_management_structures = ZH.get_data_by_id(TManagementStructures, self.zh.id_zh) managements = [] for management in q_management_structures: - q_management_plans = ( - DB.session.query(TManagementPlans) - .filter(TManagementPlans.id_structure == management.id_structure) - .all() - ) + q_management_plans = DB.session.scalars( + select(TManagementPlans).where( + TManagementPlans.id_structure == management.id_structure + ) + ).all() plans = [] if q_management_plans: for plan in q_management_plans: @@ -178,9 +179,12 @@ def get_instruments(self): def get_protections(self): return { "protections": [ - DB.session.query(CorProtectionLevelType) - .filter(CorProtectionLevelType.id_protection == protec) - .one() + DB.session.execute( + select(CorProtectionLevelType).where( + CorProtectionLevelType.id_protection == protec + ) + ) + .scalar_one() .id_protection_status for protec in [ protection.id_protection @@ -197,9 +201,9 @@ def get_urban_docs(self): "id_doc_type": urban_doc.id_doc_type, "id_cors": [ doc.id_cor - for doc in DB.session.query(CorZhDocRange) - .filter(CorZhDocRange.id_doc == urban_doc.id_doc) - .all() + for doc in DB.session.scalars( + select(CorZhDocRange).where(CorZhDocRange.id_doc == urban_doc.id_doc) + ).all() ], "remark": urban_doc.remark, } @@ -252,9 +256,9 @@ def get_regions(self, query): for municipality in query: if municipality.LiMunicipalities.insee_reg not in region_list: region_list.append(municipality.LiMunicipalities.insee_reg) - q_region = ( - DB.session.query(InseeRegions).filter(InseeRegions.insee_reg.in_(region_list)).all() - ) + q_region = DB.session.scalars( + select(InseeRegions).where(InseeRegions.insee_reg.in_(region_list)) + ).all() regions = [region.region_name for region in q_region] return regions diff --git a/backend/gn_module_zh/model/zh_schema.py b/backend/gn_module_zh/model/zh_schema.py index e8e2ba19..7a678cd5 100644 --- a/backend/gn_module_zh/model/zh_schema.py +++ b/backend/gn_module_zh/model/zh_schema.py @@ -91,12 +91,13 @@ class Nomenclatures(TNomenclatures): @staticmethod def get_nomenclature_info(bib_mnemo): - q = TNomenclatures.query.filter_by( - id_type=select([func.ref_nomenclatures.get_id_nomenclature_type(bib_mnemo)]) + # todo + q = select(TNomenclatures).where( + TNomenclatures.id_type == (func.ref_nomenclatures.get_id_nomenclature_type(bib_mnemo)) ) if bib_mnemo == "SDAGE": q = q.order_by(TNomenclatures.id_nomenclature) - return q.all() + return DB.session.scalars(q).all() @serializable @@ -127,7 +128,8 @@ class BibSiteSpace(DB.Model): @staticmethod def get_bib_site_spaces(): - bib_site_spaces = DB.session.query(BibSiteSpace).all() + # bib_site_spaces = DB.session.execute(select(BibSiteSpace)).scalars().all() + bib_site_spaces = DB.session.scalars(select(BibSiteSpace)).all() bib_site_spaces_list = [bib_site_space.as_dict() for bib_site_space in bib_site_spaces] return bib_site_spaces_list @@ -143,12 +145,15 @@ class BibOrganismes(DB.Model): @staticmethod def get_abbrevation(id_org): - org = DB.session.query(BibOrganismes).filter(BibOrganismes.id_org == id_org).one() + org = DB.session.execute( + select(BibOrganismes).where(BibOrganismes.id_org == id_org) + ).scalar_one() return org.abbrevation @staticmethod def get_bib_organisms(org_type): - bib_organismes = DB.session.query(BibOrganismes).all() + # bib_organismes = DB.session.execute(select(BibOrganismes)).scalars().all() + bib_organismes = DB.session.scalars(select(BibOrganismes)).all() if org_type == "operator": return [bib_org.as_dict() for bib_org in bib_organismes if bib_org.is_op_org] elif org_type == "management_structure": @@ -165,7 +170,7 @@ class CorLimList(DB.Model): id_lim = DB.Column(DB.Integer, ForeignKey(TNomenclatures.id_nomenclature), primary_key=True) def get_lims_by_id(id): - return DB.session.query(CorLimList).filter(CorLimList.id_lim_list == id).all() + return DB.session.scalars(select(CorLimList).where(CorLimList.id_lim_list == id)).all() @serializable @@ -262,53 +267,56 @@ def get_geofeature(self, recursif=True, relationships=()): @staticmethod def get_site_space_name(id): - return DB.session.query(BibSiteSpace).filter(BibSiteSpace.id_site_space == id).one().name + return ( + DB.session.execute(select(BibSiteSpace).where(BibSiteSpace.id_site_space == id)) + .scalar_one() + .name + ) @staticmethod def get_tzh_by_id(id): - return DB.session.query(TZH).filter(TZH.id_zh == id).one() + return DB.session.execute(select(TZH).where(TZH.id_zh == id)).scalar_one() @staticmethod def get_zh_area_intersected(zh_area_type, id_zh_geom): if zh_area_type == "river_basin": - q = ( - DB.session.query(TRiverBasin) - .filter(TRiverBasin.geom.ST_Intersects(cast(id_zh_geom, Geography))) - .all() - ) + q = DB.session.execute( + select(TRiverBasin).where( + TRiverBasin.geom.ST_Intersects(cast(id_zh_geom, Geography)) + ) + ).all() if zh_area_type == "hydro_area": - q = ( - DB.session.query(THydroArea) - .filter(THydroArea.geom.ST_Intersects(cast(id_zh_geom, Geography))) - .all() - ) + q = DB.session.execute( + select(THydroArea).where( + THydroArea.geom.ST_Intersects(cast(id_zh_geom, Geography)) + ) + ).all() if zh_area_type == "fct_area": - q = ( - DB.session.query(TFctArea) - .filter(TFctArea.geom.ST_Intersects(cast(id_zh_geom, Geography))) - .all() - ) + q = DB.session.execute( + select(TFctArea).where(TFctArea.geom.ST_Intersects(cast(id_zh_geom, Geography))) + ).all() return q @hybrid_property def delims(self): - delims = [ - element.TNomenclatures.mnemonique - for element in DB.session.query(CorLimList, TNomenclatures) - .filter(CorLimList.id_lim_list == self.id_lim_list) - .filter(TNomenclatures.id_nomenclature == CorLimList.id_lim) - .all() - ] + query = select(CorLimList, TNomenclatures).where( + and_( + TNomenclatures.id_nomenclature == CorLimList.id_lim, + CorLimList.id_lim_list == self.id_lim_list, + ) + ) + delims = [element.TNomenclatures.mnemonique for element in DB.session.execute(query).all()] return ", ".join([str(item) for item in delims]) @hybrid_property def bassin_versant(self): bassin_versant = [ name - for (name,) in DB.session.query(TRiverBasin.name) - .filter(TRiverBasin.id_rb == CorZhRb.id_rb) - .filter(CorZhRb.id_zh == self.id_zh) - .all() + for (name,) in DB.session.execute( + select(TRiverBasin.name) + .where(TRiverBasin.id_rb == CorZhRb.id_rb) + .where(CorZhRb.id_zh == self.id_zh) + ).all() ] return ", ".join([str(item) for item in bassin_versant]) @@ -324,31 +332,32 @@ class CorZhArea(DB.Model): @staticmethod def get_id_type(mnemo): return ( - DB.session.query(BibAreasTypes).filter(BibAreasTypes.type_name == mnemo).one().id_type + DB.session.scalars(select(BibAreasTypes).where(BibAreasTypes.type_name == mnemo)) + .one() + .id_type ) @staticmethod def get_departments(id_zh): - return ( - DB.session.query(CorZhArea, LAreas, TZH) + query = ( + select(CorZhArea, LAreas, TZH) .join(LAreas) - .filter( + .where( CorZhArea.id_zh == id_zh, LAreas.id_type == CorZhArea.get_id_type("Départements"), TZH.id_zh == id_zh, ) - .all() ) + return DB.session.execute(query).all() @staticmethod def get_municipalities_info(id_zh): - return ( - DB.session.query(CorZhArea, LiMunicipalities, TZH) + return DB.session.execute( + select(CorZhArea, LiMunicipalities, TZH) .join(LiMunicipalities, LiMunicipalities.id_area == CorZhArea.id_area) - .filter(CorZhArea.id_zh == id_zh, TZH.id_zh == id_zh) + .where(CorZhArea.id_zh == id_zh, TZH.id_zh == id_zh) .order_by(LiMunicipalities.nom_com) - .all() - ) + ).all() @staticmethod def get_id_types_ref_geo(id_zh, ref_geo_config): @@ -356,9 +365,12 @@ def get_id_types_ref_geo(id_zh, ref_geo_config): for ref in ref_geo_config: if ref["active"]: ids.append( - DB.session.query(BibAreasTypes) - .filter(BibAreasTypes.type_code == ref["type_code_ref_geo"]) - .one() + DB.session.execute( + select(BibAreasTypes).where( + BibAreasTypes.type_code == ref["type_code_ref_geo"] + ) + ) + .scalar_one() .id_type ) return ids @@ -366,10 +378,11 @@ def get_id_types_ref_geo(id_zh, ref_geo_config): @staticmethod def get_ref_geo_info(id_zh, id_types): return [ - DB.session.query(CorZhArea, LAreas, TZH) - .join(LAreas) - .filter(CorZhArea.id_zh == id_zh, LAreas.id_type == id_type, TZH.id_zh == id_zh) - .all() + DB.session.scalars( + select(CorZhArea, LAreas, TZH) + .join(LAreas) + .where(CorZhArea.id_zh == id_zh, LAreas.id_type == id_type, TZH.id_zh == id_zh) + ).all() for id_type in id_types ] @@ -441,13 +454,12 @@ class CorZhRef(DB.Model): @staticmethod def get_references_by_id(id_zh): - return ( - DB.session.query(TReferences) + return DB.session.scalars( + select(TReferences) .join(CorZhRef) - .filter(CorZhRef.id_zh == id_zh) + .where(CorZhRef.id_zh == id_zh) .order_by(TReferences.pub_year.desc()) - .all() - ) + ).all() class CorZhLimFs(DB.Model): @@ -465,17 +477,16 @@ class CorSdageSage(DB.Model): @staticmethod def get_id_sdage_list(): - q_id_sdages = DB.session.query(func.distinct(CorSdageSage.id_sdage)).all() + q_id_sdages = DB.session.execute(select(func.distinct(CorSdageSage.id_sdage))).all() return [id[0] for id in q_id_sdages] @staticmethod def get_sage_by_id(id): - return ( - DB.session.query(CorSdageSage, TNomenclatures) + return DB.session.execute( + select(CorSdageSage, TNomenclatures) .join(TNomenclatures, TNomenclatures.id_nomenclature == CorSdageSage.id_sage) - .filter(CorSdageSage.id_sdage == id) - .all() - ) + .where(CorSdageSage.id_sdage == id) + ).all() class BibCb(DB.Model): @@ -487,17 +498,19 @@ class BibCb(DB.Model): @staticmethod def get_label(): - return ( - DB.session.query(BibCb, Habref) + return DB.session.execute( + select(BibCb, Habref) .join(Habref, BibCb.lb_code == Habref.lb_code) - .filter(Habref.cd_typo == 22) + .where(Habref.cd_typo == 22) .order_by(BibCb.lb_code) - .all() - ) + ).all() @staticmethod def get_ch(lb_code): # get cd_hab_sortie from lb_code of selected Corine Biotope + # !!! est-ce que method utilisée qqpart ? + # todo + """ cd_hab_sortie = ( DB.session.query(Habref) .filter(and_(Habref.lb_code == lb_code, Habref.cd_typo == 22)) @@ -505,11 +518,13 @@ def get_ch(lb_code): .cd_hab ) # get all cd_hab_entre corresponding to cd_hab_sortie + #todo q_cd_hab_entre = ( DB.session.query(CorespHab).filter(CorespHab.cd_hab_sortie == cd_hab_sortie).all() ) # get list of cd_hab_entre/lb_code/lb_hab_fr for each cahier habitat ch = [] + #todo for q in q_cd_hab_entre: ch.append( { @@ -525,6 +540,7 @@ def get_ch(lb_code): } ) return ch + """ class CorChStatus(DB.Model): @@ -544,15 +560,14 @@ class CorImpactTypes(DB.Model): @staticmethod def get_impacts(): - return ( - DB.session.query(CorImpactTypes, TNomenclatures) + return DB.session.execute( + select(CorImpactTypes, TNomenclatures) .join( TNomenclatures, TNomenclatures.id_nomenclature == CorImpactTypes.id_impact, ) - .filter(CorImpactTypes.active) - .all() - ) + .where(CorImpactTypes.active) + ).all() # and_(CorImpactTypes.id_impact_type == id_type, CorImpactTypes.active)).all() # def get_impact_type_list(): @@ -586,45 +601,44 @@ class CorMainFct(DB.Model): @staticmethod def get_functions(nomenc_ids): - return ( - DB.session.query(CorMainFct, TNomenclatures) + return DB.session.execute( + select(CorMainFct, TNomenclatures) .join(TNomenclatures, TNomenclatures.id_nomenclature == CorMainFct.id_function) - .filter(CorMainFct.active) - .filter(CorMainFct.id_function.in_(nomenc_ids)) - .all() - ) + .where(CorMainFct.active) + .where(CorMainFct.id_function.in_(nomenc_ids)) + ).all() @staticmethod def get_all_functions(nomenc_ids): - return ( - DB.session.query(CorMainFct, TNomenclatures) + query = ( + select(CorMainFct, TNomenclatures) .join(TNomenclatures, TNomenclatures.id_nomenclature == CorMainFct.id_function) - .filter(CorMainFct.id_function.in_(nomenc_ids)) - .all() + .where(CorMainFct.id_function.in_(nomenc_ids)) ) + return DB.session.execute(query).all() @staticmethod def get_main_function_list(ids): - q_id_types = DB.session.query(func.distinct(CorMainFct.id_main_function)).all() + # méthode utilisée ??? + q_id_types = DB.session.scalars(select(func.distinct(CorMainFct.id_main_function))).all() return [id[0] for id in q_id_types if id[0] in ids] @staticmethod def get_function_by_main_function(id_main): - return ( - DB.session.query(CorMainFct, TNomenclatures) + # méthode utilisée ??? + return DB.session.execute( + select(CorMainFct, TNomenclatures) .join(TNomenclatures, TNomenclatures.id_nomenclature == CorMainFct.id_function) - .filter(and_(CorMainFct.id_main_function == id_main, CorMainFct.active)) - .all() - ) + .where(and_(CorMainFct.id_main_function == id_main, CorMainFct.active)) + ).all() @staticmethod def get_mnemo_type(id_type): if id_type: - return ( - DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_nomenclature == id_type) - .one() - ) + # pas testé + return DB.session.execute( + select(TNomenclatures).where(TNomenclatures.id_nomenclature == id_type) + ).scalar_one() else: return "" @@ -658,8 +672,10 @@ class CorImpactList(DB.Model): @staticmethod def get_impacts_by_uuid(uuid_activity): return ( - DB.session.query(CorImpactList) - .filter(CorImpactList.id_impact_list == uuid_activity) + DB.session.execute( + select(CorImpactList).where(CorImpactList.id_impact_list == uuid_activity) + ) + .scalars() .all() ) @@ -741,13 +757,12 @@ def get_functions_by_id_and_category(id_zh, category, is_eval=False): for nomenclature in Nomenclatures.get_nomenclature_info("FONCTIONS_QUALIF") ] - return ( - DB.session.query(TFunctions) - .filter(TFunctions.id_zh == id_zh) - .filter(TFunctions.id_function.in_(function_ids)) - .filter(TFunctions.id_qualification.in_(qualif_ids)) - .all() - ) + return DB.session.scalars( + select(TFunctions) + .where(TFunctions.id_zh == id_zh) + .where(TFunctions.id_function.in_(function_ids)) + .where(TFunctions.id_qualification.in_(qualif_ids)) + ).all() class THabHeritage(DB.Model): @@ -773,20 +788,21 @@ class CorUrbanTypeRange(DB.Model): @staticmethod def get_range_by_doc(doc_id): - q_ranges = ( - DB.session.query(CorUrbanTypeRange) - .filter(CorUrbanTypeRange.id_doc_type == doc_id) - .all() - ) + q_ranges = DB.session.scalars( + select(CorUrbanTypeRange).where(CorUrbanTypeRange.id_doc_type == doc_id) + ).all() ranges = [] for range in q_ranges: ranges.append( { "id_cor": range.id_cor, "id_nomenclature": range.id_range_type, - "mnemonique": DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_nomenclature == range.id_range_type) - .one() + "mnemonique": DB.session.execute( + select(TNomenclatures).where( + TNomenclatures.id_nomenclature == range.id_range_type + ) + ) + .scalar_one() .mnemonique, } ) @@ -834,7 +850,7 @@ class BibActions(DB.Model): @staticmethod def get_bib_actions(): - q_bib_actions = DB.session.query(BibActions).all() + q_bib_actions = DB.session.scalars(select(BibActions)).all() bib_actions_list = [bib_action.as_dict() for bib_action in q_bib_actions] return bib_actions_list diff --git a/backend/gn_module_zh/nomenclatures.py b/backend/gn_module_zh/nomenclatures.py index ad6f28cd..eaf3e08e 100644 --- a/backend/gn_module_zh/nomenclatures.py +++ b/backend/gn_module_zh/nomenclatures.py @@ -4,6 +4,7 @@ from pypn_habref_api.models import CorespHab, Habref, TypoRef from pypnnomenclature.models import BibNomenclaturesTypes, TNomenclatures from sqlalchemy import and_ +from sqlalchemy.sql import select from .api_error import ZHApiError from .model.zh_schema import ( @@ -61,41 +62,46 @@ def get_corine_biotope(): def get_ch(lb_code): try: - CH_typo = DB.session.query(TypoRef).filter(TypoRef.cd_table == "TYPO_CH").one().cd_typo + CH_typo = ( + DB.session.execute(select(TypoRef).where(TypoRef.cd_table == "TYPO_CH")) + .scalar_one() + .cd_typo + ) CB_typo = ( - DB.session.query(TypoRef) - .filter(TypoRef.cd_table == "TYPO_CORINE_BIOTOPES") - .one() + DB.session.execute(select(TypoRef).where(TypoRef.cd_table == "TYPO_CORINE_BIOTOPES")) + .scalar_one() .cd_typo ) # get cd_hab_sortie list from lb_code of selected Corine Biotope cd_hab_sortie = ( - DB.session.query(Habref) - .filter(and_(Habref.lb_code == lb_code, Habref.cd_typo == CB_typo)) - .one() + DB.session.execute( + select(Habref).where(and_(Habref.lb_code == lb_code, Habref.cd_typo == CB_typo)) + ) + .scalar_one() .cd_hab ) # get all cd_hab_entre corresponding to cd_hab_sortie - q_cd_hab_entre = ( - DB.session.query(CorespHab) - .filter( + q_cd_hab_entre = DB.session.scalars( + select(CorespHab).where( and_(CorespHab.cd_hab_sortie == cd_hab_sortie, CorespHab.cd_typo_entre == CH_typo) ) - .all() - ) + ).all() # get list of cd_hab_entre/lb_code/lb_hab_fr for each cahier habitat ch = [] for q in q_cd_hab_entre: - hab = DB.session.query(Habref).filter(Habref.cd_hab == q.cd_hab_entre).one() + hab = DB.session.execute( + select(Habref).where(Habref.cd_hab == q.cd_hab_entre) + ).scalar_one() ch.append( { "cd_hab": q.cd_hab_entre, "front_name": hab.lb_code + " - " + hab.lb_hab_fr, "lb_code": hab.lb_code, "lb_hab_fr": hab.lb_hab_fr, - "priority": DB.session.query(CorChStatus) - .filter(CorChStatus.lb_code == hab.lb_code) - .one() + "priority": DB.session.execute( + select(CorChStatus).where(CorChStatus.lb_code == hab.lb_code) + ) + .scalar_one() .priority, } ) @@ -138,9 +144,12 @@ def get_impact_category(impact): # get mnemonique of id_impact_type if impact.CorImpactTypes.id_impact_type is not None: return ( - DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_nomenclature == impact.CorImpactTypes.id_impact_type) - .one() + DB.session.execute( + select(TNomenclatures).where( + TNomenclatures.id_nomenclature == impact.CorImpactTypes.id_impact_type + ) + ) + .scalar_one() .mnemonique ) return "Aucun" @@ -150,18 +159,19 @@ def get_function_list(mnemo): try: # get id_type of mnemo (ex : 'FONCTIONS_HYDRO') in BibNomenclatureTypes id_type_main_function = ( - DB.session.query(BibNomenclaturesTypes) - .filter(BibNomenclaturesTypes.mnemonique == mnemo) - .one() + DB.session.execute( + select(BibNomenclaturesTypes).where(BibNomenclaturesTypes.mnemonique == mnemo) + ) + .scalar_one() .id_type ) # get list of TNomenclatures ids by id_type nomenclature_ids = [ nomenc.id_nomenclature - for nomenc in DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_type == id_type_main_function) - .all() + for nomenc in DB.session.scalars( + select(TNomenclatures).where(TNomenclatures.id_type == id_type_main_function) + ).all() ] return [ @@ -169,9 +179,12 @@ def get_function_list(mnemo): "id_nomenclature": function.CorMainFct.id_function, "mnemonique": function.TNomenclatures.mnemonique, "id_category": function.CorMainFct.id_main_function, - "category": DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_nomenclature == function.CorMainFct.id_main_function) - .one() + "category": DB.session.execute( + select(TNomenclatures).where( + TNomenclatures.id_nomenclature == function.CorMainFct.id_main_function + ) + ) + .scalar_one() .mnemonique.upper(), } for function in CorMainFct.get_functions(nomenclature_ids) @@ -188,18 +201,19 @@ def get_all_function_list(mnemo): try: # get id_type of mnemo (ex : 'FONCTIONS_HYDRO') in BibNomenclatureTypes id_type_main_function = ( - DB.session.query(BibNomenclaturesTypes) - .filter(BibNomenclaturesTypes.mnemonique == mnemo) - .one() + DB.session.execute( + select(BibNomenclaturesTypes).where(BibNomenclaturesTypes.mnemonique == mnemo) + ) + .scalar_one() .id_type ) # get list of TNomenclatures ids by id_type nomenclature_ids = [ nomenc.id_nomenclature - for nomenc in DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_type == id_type_main_function) - .all() + for nomenc in DB.session.scalars( + select(TNomenclatures).where(TNomenclatures.id_type == id_type_main_function) + ).all() ] return [ @@ -207,9 +221,12 @@ def get_all_function_list(mnemo): "id_nomenclature": function.CorMainFct.id_function, "mnemonique": function.TNomenclatures.mnemonique, "id_category": function.CorMainFct.id_main_function, - "category": DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_nomenclature == function.CorMainFct.id_main_function) - .one() + "category": DB.session.execute( + select(TNomenclatures).where( + TNomenclatures.id_nomenclature == function.CorMainFct.id_main_function + ) + ) + .scalar_one() .mnemonique.upper(), } for function in CorMainFct.get_all_functions(nomenclature_ids) @@ -245,21 +262,27 @@ def get_protections(): return [ { "id_protection_status": protection.id_protection_status, - "mnemonique_status": DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_nomenclature == protection.id_protection_status) - .one() + "mnemonique_status": DB.session.execute( + select(TNomenclatures).where( + TNomenclatures.id_nomenclature == protection.id_protection_status + ) + ) + .scalar_one() .mnemonique, "id_protection_level": protection.id_protection_level, - "mnemonique_level": DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_nomenclature == protection.id_protection_level) - .one() + "mnemonique_level": DB.session.execute( + select(TNomenclatures).where( + TNomenclatures.id_nomenclature == protection.id_protection_level + ) + ) + .scalar_one() .mnemonique, "category": get_protection_category(protection), "category_id": protection.id_protection_type, } - for protection in DB.session.query(CorProtectionLevelType) - .order_by(CorProtectionLevelType.id_protection) - .all() + for protection in DB.session.scalars( + select(CorProtectionLevelType).order_by(CorProtectionLevelType.id_protection) + ).all() ] except Exception as e: exc_type, value, tb = sys.exc_info() @@ -272,9 +295,12 @@ def get_protections(): def get_protection_category(protection): if protection.id_protection_type is not None: return ( - DB.session.query(TNomenclatures) - .filter(TNomenclatures.id_nomenclature == protection.id_protection_type) - .one() + DB.session.execute( + select(TNomenclatures).where( + TNomenclatures.id_nomenclature == protection.id_protection_type + ) + ) + .scalar_one() .mnemonique ) return "Autre" diff --git a/backend/gn_module_zh/search.py b/backend/gn_module_zh/search.py index e7373ae6..a97dbe03 100644 --- a/backend/gn_module_zh/search.py +++ b/backend/gn_module_zh/search.py @@ -5,6 +5,7 @@ from pypnnomenclature.models import TNomenclatures from sqlalchemy import and_, desc, func, or_ from sqlalchemy.sql.expression import select +from sqlalchemy.orm import aliased from utils_flask_sqla.generic import GenericQuery from .api_error import ZHApiError @@ -40,7 +41,7 @@ def strip_accents(s): def main_search(query, json): for key in json.keys(): if key in TZH.__table__.columns: - query = query.filter(getattr(TZH, key) == json[key]) + query = query.where(getattr(TZH, key) == json[key]) sdage = json.get("sdage") if sdage is not None: query = filter_sdage(query, sdage) @@ -111,7 +112,7 @@ def main_search(query, json): def filter_sdage(query, json: dict): ids = [obj.get("id_nomenclature") for obj in json] - return query.filter(TZH.id_sdage.in_(ids)) + return query.where(TZH.id_sdage.in_(ids)) def filter_nameorcode(query, json: dict): @@ -120,19 +121,19 @@ def filter_nameorcode(query, json: dict): json = strip_accents(json) # TODO: create index with another function to make unaccent immutable unaccent_fullname = func.lower(func.unaccent(TZH.fullname)) - subquery = ( - DB.session.query(TZH.id_zh, func.similarity(unaccent_fullname, json).label("idx_trgm")) - .filter(unaccent_fullname.ilike("%" + json + "%")) + subq = ( + select(TZH.id_zh, func.similarity(unaccent_fullname, json).label("idx_trgm")) + .where(unaccent_fullname.ilike("%" + json + "%")) .order_by(desc("idx_trgm")) .subquery() ) - return query.filter(TZH.id_zh == subquery.c.id_zh) + return query.where(TZH.id_zh == subq.c.id_zh) return query def filter_ensemble(query, json: dict): ids = [obj.get("id_site_space") for obj in json] - return query.filter(TZH.id_site_space.in_(ids)) + return query.where(TZH.id_site_space.in_(ids)) def filter_area_size(query, json: dict): @@ -143,11 +144,11 @@ def filter_area_size(query, json: dict): # TZH.area is already in ha if symbol == "=": - query = query.filter(TZH.area == ha) + query = query.where(TZH.area == ha) elif symbol == "≥": - query = query.filter(TZH.area >= ha) + query = query.where(TZH.area >= ha) elif symbol == "≤": - query = query.filter(TZH.area <= ha) + query = query.where(TZH.area <= ha) return query @@ -159,17 +160,17 @@ def filter_area(query, json: dict, type_code: str): # Filter on departments subquery = ( - DB.session.query(LAreas) - .with_entities(LAreas.area_name, LAreas.geom, LAreas.id_type, BibAreasTypes.type_code) + select(LAreas) + .with_only_columns(LAreas.area_name, LAreas.geom, LAreas.id_type, BibAreasTypes.type_code) .join(BibAreasTypes, LAreas.id_type == BibAreasTypes.id_type) - .filter(BibAreasTypes.type_code == type_code) - .filter(LAreas.area_code.in_(codes)) + .where(BibAreasTypes.type_code == type_code) + .where(LAreas.area_code.in_(codes)) .subquery() ) # Filter on geom. # Need to use (c) on subquery to get the column - query = query.filter( + query = query.where( func.ST_Transform(func.ST_SetSRID(TZH.geom, 4326), 2154).ST_Intersects(subquery.c.geom) ) @@ -181,14 +182,14 @@ def filter_hydro(query, json): if codes and all(code is not None for code in codes): subquery = ( - DB.session.query(THydroArea) - .with_entities(THydroArea.id_hydro, THydroArea.geom) - .filter(THydroArea.id_hydro.in_(codes)) + select(THydroArea) + .with_only_columns(THydroArea.id_hydro, THydroArea.geom) + .where(THydroArea.id_hydro.in_(codes)) .subquery() ) # SET_SRID does not return a valid geom... - query = query.filter( + query = query.where( func.ST_Transform(func.ST_SetSRID(TZH.geom, 4326), 4326).ST_Intersects(subquery.c.geom) ) @@ -200,16 +201,16 @@ def filter_basin(query, json): if codes is not None: subquery = ( - DB.session.query(TRiverBasin) - .with_entities( + select(TRiverBasin) + .with_only_columns( TRiverBasin.id_rb, TRiverBasin.geom, ) - .filter(TRiverBasin.id_rb.in_(codes)) + .where(TRiverBasin.id_rb.in_(codes)) .subquery() ) # SET_SRID does not return a valid geom... - query = query.filter( + query = query.where( func.ST_Transform(func.ST_SetSRID(TZH.geom, 4326), 4326).ST_Intersects(subquery.c.geom) ) @@ -233,8 +234,8 @@ def filter_fct(query, json: dict, type_: str): ids_conn = [f.get("id_nomenclature") for f in json.get("connaissances", [])] subquery = ( - DB.session.query(TFunctions.id_zh) - .with_entities( + select(TFunctions.id_zh) + .with_only_columns( TFunctions.id_zh, TFunctions.id_function, TFunctions.id_qualification, @@ -245,19 +246,19 @@ def filter_fct(query, json: dict, type_: str): ) .join(TFunctions, TFunctions.id_zh == TZH.id_zh) .join(TNomenclatures, TNomenclatures.id_nomenclature == TFunctions.id_function) - .filter_by(id_type=select([func.ref_nomenclatures.get_id_nomenclature_type(type_)])) + .filter_by(id_type=select(func.ref_nomenclatures.get_id_nomenclature_type(type_))) ) if ids_fct and all(id_ is not None for id_ in ids_fct): - subquery = subquery.filter(TFunctions.id_function.in_(ids_fct)) + subquery = subquery.where(TFunctions.id_function.in_(ids_fct)) if ids_qual and all(id_ is not None for id_ in ids_qual): - subquery = subquery.filter(TFunctions.id_qualification.in_(ids_qual)) + subquery = subquery.where(TFunctions.id_qualification.in_(ids_qual)) if ids_conn and all(id_ is not None for id_ in ids_conn): - subquery = subquery.filter(TFunctions.id_knowledge.in_(ids_conn)) + subquery = subquery.where(TFunctions.id_knowledge.in_(ids_conn)) - query = query.filter(TZH.id_zh == subquery.subquery().c.id_zh).distinct() + query = query.where(TZH.id_zh == subquery.subquery().c.id_zh).distinct() return query @@ -267,11 +268,11 @@ def filter_statuts(query, json: dict): if ids_statuts: subquery = ( - DB.session.query(TOwnership.id_zh) - .with_entities(TOwnership.id_zh, TOwnership.id_status) - .filter(TOwnership.id_status.in_(ids_statuts)) + select(TOwnership.id_zh) + .with_only_columns(TOwnership.id_zh, TOwnership.id_status) + .where(TOwnership.id_status.in_(ids_statuts)) ) - query = query.filter(TZH.id_zh == subquery.subquery().c.id_zh).distinct() + query = query.where(TZH.id_zh == subquery.subquery().c.id_zh).distinct() return query @@ -281,8 +282,8 @@ def filter_plans(query, json: dict): if ids_plans and all(id_ is not None for id_ in ids_plans): subquery = ( - DB.session.query(TManagementStructures.id_zh) - .with_entities( + select(TManagementStructures.id_zh) + .with_only_columns( TManagementPlans.id_nature, TManagementPlans.id_structure, TManagementStructures.id_structure, @@ -292,10 +293,10 @@ def filter_plans(query, json: dict): TManagementStructures, TManagementPlans.id_structure == TManagementStructures.id_structure, ) - .filter(TManagementPlans.id_nature.in_(ids_plans)) + .where(TManagementPlans.id_nature.in_(ids_plans)) ) - query = query.filter(TZH.id_zh == subquery.subquery().c.id_zh).distinct() + query = query.where(TZH.id_zh == subquery.subquery().c.id_zh).distinct() return query @@ -303,7 +304,7 @@ def filter_plans(query, json: dict): def filter_strategies(query, json: dict): ids_strategies = [f.get("id_nomenclature") for f in json.get("strategies", [])] if ids_strategies: - query = query.filter(TZH.id_strat_gestion.in_(ids_strategies)).distinct() + query = query.where(TZH.id_strat_gestion.in_(ids_strategies)).distinct() return query @@ -313,13 +314,13 @@ def filter_evaluations(query, json: dict): ids_menaces = [f.get("id_nomenclature") for f in json.get("menaces", [])] if ids_hydros and all(id_ is not None for id_ in ids_hydros): - query = query.filter(TZH.id_diag_hydro.in_(ids_hydros)) + query = query.where(TZH.id_diag_hydro.in_(ids_hydros)) if ids_bios and all(id_ is not None for id_ in ids_bios): - query = query.filter(TZH.id_diag_bio.in_(ids_bios)) + query = query.where(TZH.id_diag_bio.in_(ids_bios)) if ids_menaces and all(id_ is not None for id_ in ids_menaces): - query = query.filter(TZH.id_thread.in_(ids_menaces)) + query = query.where(TZH.id_thread.in_(ids_menaces)) return query @@ -348,9 +349,9 @@ def filter_hierarchy(query, json: dict, basin: str): filters.append(TZH.id_zh.in_(subquery)) if not and_: - query = query.filter(or_(*filters)) + query = query.where(or_(*filters)) else: - query = query.filter(*filters) + query = query.where(*filters) return query @@ -374,6 +375,7 @@ def generate_global_attributes_subquery(attributes: list, global_notes: dict): """ Generates the subquery taking care only on "GlobalMarks" """ + # TODO: sqlalchemy1.4 subquery = DB.session.query(CorZhNotes.id_zh) note_query = func.sum(CorZhNotes.note) @@ -405,6 +407,7 @@ def generate_global_attributes_subquery(attributes: list, global_notes: dict): def generate_volet(subquery, volet: str, attribute_list: list, global_notes: dict, note_query): + # TODO: sqlalchemy1.4 if volet.lower() in [VOLET1.lower(), VOLET2.lower()]: subquery = subquery.join(BibHierPanes, BibHierPanes.pane_id == TRules.pane_id).filter( BibHierPanes.label == volet @@ -426,6 +429,7 @@ def generate_volet_subquery(subquery, volet, attribute_list: list, global_notes: """ Subquery for "volet" """ + # TODO: sqlalchemy1.4 volet_nb = COR_VOLET[volet] max_note = global_notes[volet_nb] and_query = [] @@ -439,6 +443,7 @@ def generate_volet_subquery(subquery, volet, attribute_list: list, global_notes: def generate_rub(subquery, rub: str, attribute_list: list, global_notes: dict, note_query): + # TODO: sqlalchemy1.4 subquery = subquery.join(BibHierCategories, BibHierCategories.cat_id == TRules.cat_id).filter( BibHierCategories.label == rub ) @@ -495,6 +500,7 @@ def generate_rub(subquery, rub: str, attribute_list: list, global_notes: dict, n def generate_attributes_subquery(attributes: list): + # TODO: sqlalchemy1.4 subquery = DB.session.query(CorZhNotes.id_zh) attribute_ids = [] note_type_ids = [] diff --git a/backend/gn_module_zh/upload.py b/backend/gn_module_zh/upload.py index bc3e4ce6..7f76b04a 100644 --- a/backend/gn_module_zh/upload.py +++ b/backend/gn_module_zh/upload.py @@ -4,6 +4,7 @@ from geonature.core.gn_commons.models import TMedias from geonature.utils.env import DB, ROOT_DIR +from sqlalchemy.sql import update, select from werkzeug.utils import secure_filename from .api_error import ZHApiError @@ -101,8 +102,8 @@ def upload(request, extensions, pdf_size, jpg_size, upload_path, module_name, id return {"error": "ERROR_WHILE_LOADING_FILE"} # update TMedias.media_path with media_filename - DB.session.query(TMedias).filter(TMedias.id_media == id_media).update( - {"media_path": str(media_path)} + DB.session.execute( + update(TMedias).where(TMedias.id_media == id_media).values(media_path=str(media_path)) ) update_file_extension(id_media, extension) @@ -113,7 +114,8 @@ def upload(request, extensions, pdf_size, jpg_size, upload_path, module_name, id "file_name": get_file_path(id_media).name, "full_path": str(get_file_path(id_media)), "media_path": getattr( - DB.session.query(TMedias).filter(TMedias.id_media == id_media).one(), "media_path" + DB.session.execute(select(TMedias).where(TMedias.id_media == id_media)).scalar_one(), + "media_path", ), "extension": get_extension(get_file_path(id_media).name), } diff --git a/backend/gn_module_zh/utils.py b/backend/gn_module_zh/utils.py index d16d8785..c411c5b6 100644 --- a/backend/gn_module_zh/utils.py +++ b/backend/gn_module_zh/utils.py @@ -7,6 +7,7 @@ from geonature.utils.env import DB, ROOT_DIR from pypnnomenclature.models import TNomenclatures from sqlalchemy.orm import Query +from sqlalchemy.sql import select, update, delete, func from .api_error import ZHApiError from .model.zh_schema import TZH, BibAreasTypes, LAreas @@ -18,12 +19,14 @@ def get_main_picture_id(id_zh, media_list=None): media_list(list): media_list of the zh to set the main_pict_id if not present """ - main_pict_id = DB.session.query(TZH).filter(TZH.id_zh == id_zh).one().main_pict_id + main_pict_id = ( + DB.session.execute(select(TZH).where(TZH.id_zh == id_zh)).scalar_one().main_pict_id + ) if main_pict_id is None and media_list is not None and len(media_list) > 0: id_media = media_list[0].id_media - DB.session.query(TZH).filter(TZH.id_zh == id_zh).update({TZH.main_pict_id: id_media}) + stmt = update(TZH).where(TZH.id_zh == id_zh).values(main_pict_id=id_media) + DB.session.execute(stmt) DB.session.commit() - main_pict_id = id_media return main_pict_id @@ -36,16 +39,16 @@ def get_last_pdf_export(id_zh, last_date) -> Query: # TODO: Add with entities ? # Need to have do a separate query instead of reusing get_medias... query = ( - DB.session.query(TZH, TMedias, TNomenclatures) - .with_entities(TMedias.id_media) - .filter(TZH.id_zh == id_zh) - .filter(TZH.zh_uuid == TMedias.unique_id_media) - .filter(TMedias.id_nomenclature_media_type == TNomenclatures.id_nomenclature) - .filter(TNomenclatures.mnemonique == "PDF") - .filter(TMedias.meta_update_date > last_date) - .filter(TMedias.title_fr.like(f"{id_zh}_fiche%.pdf")) + select(TZH, TMedias, TNomenclatures) + .with_only_columns(TMedias.id_media) + .where(TZH.id_zh == id_zh) + .where(TZH.zh_uuid == TMedias.unique_id_media) + .where(TMedias.id_nomenclature_media_type == TNomenclatures.id_nomenclature) + .where(TNomenclatures.mnemonique == "PDF") + .where(TMedias.meta_update_date > last_date) + .where(TMedias.title_fr.like(f"{id_zh}_fiche%.pdf")) ) - return query.first() + return DB.session.execute(query).first() def get_file_path(id_media): @@ -61,7 +64,7 @@ def get_file_path(id_media): def get_media_path(id_media): try: - return DB.session.query(TMedias).filter(TMedias.id_media == id_media).one().media_path + return DB.session.get(TMedias, id_media).media_path except Exception as e: exc_type, value, tb = sys.exc_info() raise ZHApiError( @@ -76,7 +79,8 @@ def delete_file(id_media): os.remove(get_file_path(id_media)) except: pass - DB.session.query(TMedias).filter(TMedias.id_media == id_media).delete() + stmt = delete(TMedias).where(TMedias.id_media == id_media) + DB.session.execute(stmt) DB.session.commit() except Exception as e: exc_type, value, tb = sys.exc_info() @@ -88,13 +92,17 @@ def delete_file(id_media): def check_ref_geo_schema(): try: id_type_com = ( - DB.session.query(BibAreasTypes).filter(BibAreasTypes.type_code == "COM").one().id_type + DB.session.execute(select(BibAreasTypes).where(BibAreasTypes.type_code == "COM")) + .scalar_one() + .id_type ) id_type_dep = ( - DB.session.query(BibAreasTypes).filter(BibAreasTypes.type_code == "DEP").one().id_type + DB.session.execute(select(BibAreasTypes).where(BibAreasTypes.type_code == "DEP")) + .scalar_one() + .id_type ) - n_com = DB.session.query(LAreas).filter(LAreas.id_type == id_type_com).count() - n_dep = DB.session.query(LAreas).filter(LAreas.id_type == id_type_dep).count() + n_com = DB.session.scalar(select(func.count()).where(LAreas.id_type == id_type_com)) + n_dep = DB.session.scalar(select(func.count()).where(LAreas.id_type == id_type_dep)) if n_com == 0 or n_dep == 0: return False return True From 318d78c45bf18359e09b37e022e58458871fa070 Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Fri, 5 Apr 2024 17:42:57 +0200 Subject: [PATCH 38/60] sqlalchemy update for hierarchy and river basins --- backend/gn_module_zh/hierarchy.py | 20 +++++++++----------- backend/gn_module_zh/model/zh_schema.py | 6 +++--- backend/gn_module_zh/search.py | 21 ++++++++------------- 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/backend/gn_module_zh/hierarchy.py b/backend/gn_module_zh/hierarchy.py index e769e321..87b14265 100644 --- a/backend/gn_module_zh/hierarchy.py +++ b/backend/gn_module_zh/hierarchy.py @@ -253,7 +253,7 @@ def __get_qualif_heritage(self): if not nb: nb = 0 try: - qualif = DB.session.scalars( + qualif = DB.session.execute( select(CorRbRules, TItems, CorItemValue) .join(TItems, TItems.cor_rule_id == CorRbRules.cor_rule_id) .join(CorItemValue, TItems.attribute_id == CorItemValue.attribute_id) @@ -602,7 +602,7 @@ def __get_qualif_management(self): ) ) ) - .scalar_one() + .all()[0] .TNomenclatures, "id_nomenclature", ) @@ -887,12 +887,12 @@ def __get_rule_name(self): try: return ( DB.session.execute( - select(TRules, BibHierSubcategories) + select(TRules, BibHierCategories) .join(TRules) .where(TRules.rule_id == self.rule_id) ) - .scalar_one() - .BibHierSubcategories.label.capitalize() + .all()[0] + .BibHierCategories.label.capitalize() ) except NoResultFound: pass @@ -902,7 +902,7 @@ def __get_rule_name(self): .join(TRules) .where(TRules.rule_id == self.rule_id) ) - .scalar_one() + .all()[0] .BibHierCategories.label.capitalize() ) @@ -920,9 +920,7 @@ def __get_knowledge_mnemo(self): TNomenclatures.id_nomenclature == BibNoteTypes.id_knowledge, ) .where(BibNoteTypes.note_id == self.knowledge) - ) - .scalar_one() - .TNomenclatures, + ).scalar_one(), "mnemonique", ) except Exception as e: @@ -1214,7 +1212,7 @@ def __get_rb(self): select(CorZhRb, TRiverBasin).join(TRiverBasin).where(CorZhRb.id_zh == self.id_zh) ) .scalar_one() - .TRiverBasin.id_rb + .id_rb ) def __check_if_rules(self): @@ -1284,7 +1282,7 @@ def get_all_hierarchy_fields(id_rb: int): tableName="all_rb_rules", schemaName="pr_zh", filters={"id_rb": id_rb, "orderby": "name"}, - limit=-1, + limit=100000, ) results = query.return_query() diff --git a/backend/gn_module_zh/model/zh_schema.py b/backend/gn_module_zh/model/zh_schema.py index 7a678cd5..cf697373 100644 --- a/backend/gn_module_zh/model/zh_schema.py +++ b/backend/gn_module_zh/model/zh_schema.py @@ -280,19 +280,19 @@ def get_tzh_by_id(id): @staticmethod def get_zh_area_intersected(zh_area_type, id_zh_geom): if zh_area_type == "river_basin": - q = DB.session.execute( + q = DB.session.scalars( select(TRiverBasin).where( TRiverBasin.geom.ST_Intersects(cast(id_zh_geom, Geography)) ) ).all() if zh_area_type == "hydro_area": - q = DB.session.execute( + q = DB.session.scalars( select(THydroArea).where( THydroArea.geom.ST_Intersects(cast(id_zh_geom, Geography)) ) ).all() if zh_area_type == "fct_area": - q = DB.session.execute( + q = DB.session.scalars( select(TFctArea).where(TFctArea.geom.ST_Intersects(cast(id_zh_geom, Geography))) ).all() return q diff --git a/backend/gn_module_zh/search.py b/backend/gn_module_zh/search.py index a97dbe03..ee2a7b14 100644 --- a/backend/gn_module_zh/search.py +++ b/backend/gn_module_zh/search.py @@ -375,8 +375,7 @@ def generate_global_attributes_subquery(attributes: list, global_notes: dict): """ Generates the subquery taking care only on "GlobalMarks" """ - # TODO: sqlalchemy1.4 - subquery = DB.session.query(CorZhNotes.id_zh) + subquery = select(CorZhNotes.id_zh) note_query = func.sum(CorZhNotes.note) subquery = subquery.join(CorRbRules, CorRbRules.cor_rule_id == CorZhNotes.cor_rule_id).join( @@ -407,9 +406,8 @@ def generate_global_attributes_subquery(attributes: list, global_notes: dict): def generate_volet(subquery, volet: str, attribute_list: list, global_notes: dict, note_query): - # TODO: sqlalchemy1.4 if volet.lower() in [VOLET1.lower(), VOLET2.lower()]: - subquery = subquery.join(BibHierPanes, BibHierPanes.pane_id == TRules.pane_id).filter( + subquery = subquery.join(BibHierPanes, BibHierPanes.pane_id == TRules.pane_id).where( BibHierPanes.label == volet ) subquery = generate_volet_subquery( @@ -429,7 +427,6 @@ def generate_volet_subquery(subquery, volet, attribute_list: list, global_notes: """ Subquery for "volet" """ - # TODO: sqlalchemy1.4 volet_nb = COR_VOLET[volet] max_note = global_notes[volet_nb] and_query = [] @@ -443,8 +440,7 @@ def generate_volet_subquery(subquery, volet, attribute_list: list, global_notes: def generate_rub(subquery, rub: str, attribute_list: list, global_notes: dict, note_query): - # TODO: sqlalchemy1.4 - subquery = subquery.join(BibHierCategories, BibHierCategories.cat_id == TRules.cat_id).filter( + subquery = subquery.join(BibHierCategories, BibHierCategories.cat_id == TRules.cat_id).where( BibHierCategories.label == rub ) # Takes care of the several attributes choosen by the user. @@ -500,8 +496,7 @@ def generate_rub(subquery, rub: str, attribute_list: list, global_notes: dict, n def generate_attributes_subquery(attributes: list): - # TODO: sqlalchemy1.4 - subquery = DB.session.query(CorZhNotes.id_zh) + subquery = select(CorZhNotes.id_zh) attribute_ids = [] note_type_ids = [] cor_rule_ids = [] @@ -514,10 +509,10 @@ def generate_attributes_subquery(attributes: list): # TODO: see if all of these are usefull... Are cor_rule_id with note sufficient? subquery = ( - subquery.filter(CorZhNotes.attribute_id.in_(attribute_ids)) - .filter(CorZhNotes.note_type_id.in_(note_type_ids)) - .filter(CorZhNotes.cor_rule_id.in_(cor_rule_ids)) - .filter(CorZhNotes.note.in_(notes)) + subquery.where(CorZhNotes.attribute_id.in_(attribute_ids)) + .where(CorZhNotes.note_type_id.in_(note_type_ids)) + .where(CorZhNotes.cor_rule_id.in_(cor_rule_ids)) + .where(CorZhNotes.note.in_(notes)) ) return subquery.subquery() From f53ed6d6d8d837e3b4f184cbc8bdc9d835de72f7 Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Tue, 9 Apr 2024 23:26:07 +0200 Subject: [PATCH 39/60] fix sqlalchemy update errors for river_basins --- backend/gn_module_zh/geometry.py | 4 ++-- backend/gn_module_zh/model/zh_schema.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/gn_module_zh/geometry.py b/backend/gn_module_zh/geometry.py index 3742036a..cc2d748e 100644 --- a/backend/gn_module_zh/geometry.py +++ b/backend/gn_module_zh/geometry.py @@ -80,12 +80,12 @@ def get_main_rb(query: list) -> int: area = 0 for q_ in query: zh_polygon = ( - DB.session.scalars(select(TZH.geom).where(TZH.id_zh == getattr(q_, "id_zh"))) + DB.session.execute(select(TZH.geom).where(TZH.id_zh == getattr(q_, "id_zh"))) .first() .geom ) rb_polygon = ( - DB.session.scalar( + DB.session.execute( select(CorZhRb, TRiverBasin) .join(TRiverBasin, TRiverBasin.id_rb == CorZhRb.id_rb) .where(TRiverBasin.id_rb == getattr(q_, "id_rb")) diff --git a/backend/gn_module_zh/model/zh_schema.py b/backend/gn_module_zh/model/zh_schema.py index cf697373..40e97dfd 100644 --- a/backend/gn_module_zh/model/zh_schema.py +++ b/backend/gn_module_zh/model/zh_schema.py @@ -378,7 +378,7 @@ def get_id_types_ref_geo(id_zh, ref_geo_config): @staticmethod def get_ref_geo_info(id_zh, id_types): return [ - DB.session.scalars( + DB.session.execute( select(CorZhArea, LAreas, TZH) .join(LAreas) .where(CorZhArea.id_zh == id_zh, LAreas.id_type == id_type, TZH.id_zh == id_zh) From aa39485f5c307951df3768e9a09cf3ed30bd8c0c Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Tue, 9 Apr 2024 23:59:43 +0200 Subject: [PATCH 40/60] fix duplicate results in cor_ch_status request --- backend/gn_module_zh/model/cards.py | 4 +++- backend/gn_module_zh/nomenclatures.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/backend/gn_module_zh/model/cards.py b/backend/gn_module_zh/model/cards.py index 7f63bc02..cc0a6c80 100644 --- a/backend/gn_module_zh/model/cards.py +++ b/backend/gn_module_zh/model/cards.py @@ -392,7 +392,9 @@ def __str__(self): cahier_lb_hab_fr = cahier.lb_hab_fr cahier_lb_code = cahier.lb_code priority = ( - DB.session.execute(select(CorChStatus).where(CorChStatus.lb_code == cahier_lb_code)) + DB.session.execute( + select(CorChStatus).where(CorChStatus.lb_code == cahier_lb_code).distinct() + ) .scalar_one() .priority ) diff --git a/backend/gn_module_zh/nomenclatures.py b/backend/gn_module_zh/nomenclatures.py index eaf3e08e..cfab354a 100644 --- a/backend/gn_module_zh/nomenclatures.py +++ b/backend/gn_module_zh/nomenclatures.py @@ -99,7 +99,7 @@ def get_ch(lb_code): "lb_code": hab.lb_code, "lb_hab_fr": hab.lb_hab_fr, "priority": DB.session.execute( - select(CorChStatus).where(CorChStatus.lb_code == hab.lb_code) + select(CorChStatus).where(CorChStatus.lb_code == hab.lb_code).distinct() ) .scalar_one() .priority, From 2d03683c1d837250ebbcb9a1aa2e6d461b87224e Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Wed, 17 Apr 2024 23:17:36 +0200 Subject: [PATCH 41/60] sqlalchemy 1.4 review corrections --- backend/gn_module_zh/blueprint.py | 17 ++- backend/gn_module_zh/forms.py | 65 ++++------ backend/gn_module_zh/hierarchy.py | 160 ++++++++---------------- backend/gn_module_zh/model/cards.py | 39 +++--- backend/gn_module_zh/model/zh.py | 3 +- backend/gn_module_zh/model/zh_schema.py | 18 ++- backend/gn_module_zh/nomenclatures.py | 47 +++---- backend/gn_module_zh/upload.py | 5 +- backend/gn_module_zh/utils.py | 22 ++-- 9 files changed, 135 insertions(+), 241 deletions(-) diff --git a/backend/gn_module_zh/blueprint.py b/backend/gn_module_zh/blueprint.py index 153e775c..3e2a3f0b 100644 --- a/backend/gn_module_zh/blueprint.py +++ b/backend/gn_module_zh/blueprint.py @@ -125,7 +125,7 @@ def get_all_zh(info_role, query, limit, page, orderby=None, order="asc"): # try: # Pour obtenir le nombre de résultat de la requete sans le LIMIT nb_results_without_limit = ( - DB.session.execute(select(func.count()).select_from(query.subquery())).scalars().one() + DB.session.scalar(select(func.count()).select_from(query.subquery())) ) user = info_role user_cruved = get_user_cruved() @@ -155,8 +155,7 @@ def get_all_zh(info_role, query, limit, page, orderby=None, order="asc"): # Order by id because there can be ambiguity in order_by(col) depending # on the column so add on order_by id makes it clearer data = ( - DB.session.execute(query.order_by(TZH.id_zh).limit(limit).offset(page * limit)) - .scalars() + DB.session.scalars(query.order_by(TZH.id_zh).limit(limit).offset(page * limit)) .all() ) is_ref_geo = check_ref_geo_schema() @@ -370,7 +369,7 @@ def get_pbf_complete(): 'bassin_versant', tz.bassin_versant) as json_arrays FROM pr_zh.atlas_app tz) AS q; """ - row = DB.session.execute(sql).first() + row = DB.session.execute(text(sql).limit(1)).first() return Response(bytes(row["pbf"]) if row["pbf"] else bytes(), mimetype="application/protobuf") @@ -390,7 +389,7 @@ def get_json(): ) AS feature FROM (SELECT * FROM pr_zh.atlas_app tz) inputs) features; """ - row = DB.session.execute(sql).first() + row = DB.session.execute(text(sql).limit(1)).first() return row["geojson"] @@ -463,7 +462,7 @@ def get_file_list(id_zh): """get a list of the zh files contained in static repo""" try: # FIXME: to optimize... See relationships and lazy join with sqlalchemy - zh_uuid = DB.session.execute(select(TZH).where(TZH.id_zh == id_zh)).scalar_one().zh_uuid + zh_uuid = DB.session.execute(select(TZH.zh_uuid).where(TZH.id_zh == id_zh)).scalar_one() q_medias = DB.session.execute( select(TMedias, TNomenclatures.label_default) .join( @@ -773,7 +772,7 @@ def deleteOneZh(id_zh): # delete criteres delim id_lim_list = ( - DB.session.execute(select(TZH).where(TZH.id_zh == id_zh)).scalar_one().id_lim_list + DB.session.execute(select(TZH.id_lim_list).where(TZH.id_zh == id_zh)).scalar_one() ) DB.session.execute(delete(CorLimList).where(CorLimList.id_lim_list == id_lim_list)) @@ -781,7 +780,7 @@ def deleteOneZh(id_zh): DB.session.execute(delete(CorZhArea).where(CorZhArea.id_zh == id_zh)) # delete files in TMedias and repos - zh_uuid = DB.session.execute(select(TZH).where(TZH.id_zh == id_zh)).scalar_one().zh_uuid + zh_uuid = DB.session.execute(select(TZH.zh_uuid).where(TZH.id_zh == id_zh)).scalar_one() q_medias = DB.session.scalars(select(TMedias).where(TMedias.unique_id_media == zh_uuid)).all() for media in q_medias: delete_file(media.id_media) @@ -807,7 +806,7 @@ def write_csv(id_zh): names = [] FILE_PATH = blueprint.config["file_path"] MODULE_NAME = blueprint.config["MODULE_CODE"].lower() - zh_code = DB.session.execute(select(TZH).where(TZH.id_zh == id_zh)).scalar_one().code + zh_code = DB.session.execute(select(TZH.code).where(TZH.id_zh == id_zh)).scalar_one() # author name user = DB.session.execute( select(User).where(User.id_role == g.current_user.id_role) diff --git a/backend/gn_module_zh/forms.py b/backend/gn_module_zh/forms.py index ec8b7342..c6ce98b7 100644 --- a/backend/gn_module_zh/forms.py +++ b/backend/gn_module_zh/forms.py @@ -86,17 +86,15 @@ def create_zh(form_data, info_role, zh_date, polygon, zh_area, ref_geo_referenti post_cor_zh_area( polygon, new_zh.id_zh, - DB.session.execute(select(BibAreasTypes).where(BibAreasTypes.type_code == "COM")) - .scalar_one() - .id_type, + DB.session.execute(select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "COM")) + .scalar_one(), ) # fill cor_zh_area for departements post_cor_zh_area( polygon, new_zh.id_zh, - DB.session.execute(select(BibAreasTypes).where(BibAreasTypes.type_code == "DEP")) - .scalar_one() - .id_type, + DB.session.execute(select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "DEP")) + .scalar_one(), ) # fill cor_zh_area for other geo referentials for ref in ref_geo_referentiels: @@ -104,10 +102,9 @@ def create_zh(form_data, info_role, zh_date, polygon, zh_area, ref_geo_referenti polygon, new_zh.id_zh, DB.session.execute( - select(BibAreasTypes).where(BibAreasTypes.type_code == ref["type_code_ref_geo"]) + select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == ref["type_code_ref_geo"]) ) - .scalar_one() - .id_type, + .scalar_one(), ) # fill cor_zh_rb @@ -123,12 +120,11 @@ def create_zh(form_data, info_role, zh_date, polygon, zh_area, ref_geo_referenti # set default values fct_delim_default_id = ( DB.session.execute( - select(DefaultsNomenclaturesValues).where( + select(DefaultsNomenclaturesValues.id_nomenclature).where( DefaultsNomenclaturesValues.mnemonique_type == "CRIT_DEF_ESP_FCT" ) ) .scalar_one() - .id_nomenclature ) post_fct_delim(new_zh.id_zh, [fct_delim_default_id]) @@ -354,16 +350,14 @@ def update_cor_zh_area(polygon, id_zh, geo_refs): post_cor_zh_area( polygon, id_zh, - DB.session.execute(select(BibAreasTypes).where(BibAreasTypes.type_code == "COM")) - .scalar_one() - .id_type, + DB.session.execute(select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "COM")) + .scalar_one(), ) post_cor_zh_area( polygon, id_zh, - DB.session.execute(select(BibAreasTypes).where(BibAreasTypes.type_code == "DEP")) - .scalar_one() - .id_type, + DB.session.execute(select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "DEP")) + .scalar_one(), ) # fill cor_zh_area for other geo referentials for ref in geo_refs: @@ -371,12 +365,11 @@ def update_cor_zh_area(polygon, id_zh, geo_refs): polygon, id_zh, DB.session.execute( - select(BibAreasTypes).where( + select(BibAreasTypes.id_type).where( BibAreasTypes.type_code == ref["type_code_ref_geo"] ) ) - .scalar_one() - .id_type, + .scalar_one(), ) except Exception as e: if e.__class__.__name__ == "DataError": @@ -777,15 +770,14 @@ def post_managements(id_zh, managements): TManagementPlans( id_nature=plan["id_nature"], id_structure=DB.session.execute( - select(TManagementStructures).where( + select(TManagementStructures.id_structure).where( and_( TManagementStructures.id_zh == id_zh, TManagementStructures.id_org == management["structure"], ) ) ) - .scalar_one() - .id_structure, + .scalar_one(), plan_date=datetime.datetime.strptime(plan["plan_date"], "%d/%m/%Y"), duration=plan["duration"], remark=plan["remark"], @@ -849,12 +841,11 @@ def post_protections(id_zh, protections): DB.session.add( CorZhProtection( id_protection=DB.session.execute( - select(CorProtectionLevelType).where( + select(CorProtectionLevelType.id_protection).where( CorProtectionLevelType.id_protection_status == protection ) ) - .scalar_one() - .id_protection, + .scalar_one(), id_zh=id_zh, ) ) @@ -913,12 +904,11 @@ def post_urban_docs(id_zh, urban_docs): for urban_doc in urban_docs: id_doc_type = ( DB.session.execute( - select(CorUrbanTypeRange).where( + select(CorUrbanTypeRange.id_doc_type).where( CorUrbanTypeRange.id_cor == urban_doc["id_urban_type"][0]["id_cor"] ) ) .scalar_one() - .id_doc_type ) uuid_doc = uuid.uuid4() DB.session.add( @@ -978,7 +968,7 @@ def post_actions(id_zh, actions): def post_file_info(id_zh, title, author, description, extension, media_path=None): try: unique_id_media = ( - DB.session.execute(select(TZH).where(TZH.id_zh == int(id_zh))).scalar_one().zh_uuid + DB.session.execute(select(TZH.zh_uuid).where(TZH.id_zh == int(id_zh))).scalar_one() ) uuid_attached_row = uuid.uuid4() if extension == ".pdf": @@ -988,13 +978,12 @@ def post_file_info(id_zh, title, author, description, extension, media_path=None else: mnemo = "Photo" id_nomenclature_media_type = ( - DB.session.execute(select(TNomenclatures).where(TNomenclatures.mnemonique == mnemo)) + DB.session.execute(select(TNomenclatures.id_nomenclature).where(TNomenclatures.mnemonique == mnemo)) .scalar_one() - .id_nomenclature ) id_table_location = ( DB.session.execute( - select(BibTablesLocation).where( + select(BibTablesLocation.id_table_location).where( and_( BibTablesLocation.schema_name == "pr_zh", BibTablesLocation.table_name == "t_zh", @@ -1002,7 +991,6 @@ def post_file_info(id_zh, title, author, description, extension, media_path=None ) ) .scalar_one() - .id_table_location ) post_date = datetime.datetime.now() DB.session.add( @@ -1023,10 +1011,9 @@ def post_file_info(id_zh, title, author, description, extension, media_path=None DB.session.commit() id_media = ( DB.session.execute( - select(TMedias).where(TMedias.uuid_attached_row == uuid_attached_row) + select(TMedias.id_media).where(TMedias.uuid_attached_row == uuid_attached_row) ) .scalar_one() - .id_media ) return id_media except Exception as e: @@ -1042,12 +1029,12 @@ def post_file_info(id_zh, title, author, description, extension, media_path=None def patch_file_info(id_zh, id_media, title, author, description): try: unique_id_media = ( - DB.session.execute(select(TZH).where(TZH.id_zh == int(id_zh))).scalar_one().zh_uuid + DB.session.execute(select(TZH.zh_uuid).where(TZH.id_zh == int(id_zh))).scalar_one() ) uuid_attached_row = uuid.uuid4() id_table_location = ( DB.session.execute( - select(BibTablesLocation).where( + select(BibTablesLocation.id_table_location).where( and_( BibTablesLocation.schema_name == "pr_zh", BibTablesLocation.table_name == "t_zh", @@ -1055,7 +1042,6 @@ def patch_file_info(id_zh, id_media, title, author, description): ) ) .scalar_one() - .id_table_location ) post_date = datetime.datetime.now() DB.session.execute( @@ -1092,9 +1078,8 @@ def update_file_extension(id_media, extension): else: mnemo = "Photo" id_nomenclature_media_type = ( - DB.session.execute(select(TNomenclatures).where(TNomenclatures.mnemonique == mnemo)) + DB.session.execute(select(TNomenclatures.id_nomenclature).where(TNomenclatures.mnemonique == mnemo)) .scalar_one() - .id_nomenclature ) DB.session.execute( update(TMedias) diff --git a/backend/gn_module_zh/hierarchy.py b/backend/gn_module_zh/hierarchy.py index 87b14265..5e444760 100644 --- a/backend/gn_module_zh/hierarchy.py +++ b/backend/gn_module_zh/hierarchy.py @@ -54,10 +54,7 @@ def __init__(self, id_zh, rb_id, abb): def __get_rule_id(self, abb): try: - return getattr( - DB.session.execute(select(TRules).where(TRules.abbreviation == abb)).scalar_one(), - "rule_id", - ) + return DB.session.execute(select(TRules.rule_id).where(TRules.abbreviation == abb)).scalar_one() except Exception as e: exc_type, value, tb = sys.exc_info() raise ZHApiError( @@ -92,17 +89,14 @@ def __is_rb_rule(self): def __get_cor_rule_id(self): try: if self.active: - return getattr( - DB.session.execute( - select(CorRbRules).where( + return DB.session.execute( + select(CorRbRules.cor_rule_id).where( and_( CorRbRules.rb_id == self.rb_id, CorRbRules.rule_id == self.rule_id, ) ) - ).scalar_one(), - "cor_rule_id", - ) + ).scalar_one() except Exception as e: exc_type, value, tb = sys.exc_info() raise ZHApiError( @@ -159,45 +153,21 @@ def __get_nomenc_ids(self): def __get_qualif_cat7(self): try: id_nomenc = self.__get_qualif_val() - if ( - getattr( - DB.session.execute( - select(TNomenclatures).where(TNomenclatures.id_nomenclature == id_nomenc) - ).scalar_one(), - "cd_nomenclature", - ) - == "0" - ): + if DB.session.execute( + select(TNomenclatures.cd_nomenclature).where(TNomenclatures.id_nomenclature == id_nomenc) + ).scalar_one() == "0": return self.__get_id_nomenc(self.__get_id_type("HIERARCHY"), "NE") - if ( - getattr( - DB.session.execute( - select(TNomenclatures).where(TNomenclatures.id_nomenclature == id_nomenc) - ).scalar_one(), - "cd_nomenclature", - ) - == "1" - ): + if DB.session.execute( + select(TNomenclatures.cd_nomenclature).where(TNomenclatures.id_nomenclature == id_nomenc) + ).scalar_one() == "1": return self.__get_id_nomenc(self.__get_id_type("HIERARCHY"), "bon") - if ( - getattr( - DB.session.execute( - select(TNomenclatures).where(TNomenclatures.id_nomenclature == id_nomenc) - ).scalar_one(), - "cd_nomenclature", - ) - == "2" - ): + if DB.session.execute( + select(TNomenclatures.cd_nomenclature).where(TNomenclatures.id_nomenclature == id_nomenc) + ).scalar_one() == "2": return self.__get_id_nomenc(self.__get_id_type("HIERARCHY"), "moyen") - if ( - getattr( - DB.session.execute( - select(TNomenclatures).where(TNomenclatures.id_nomenclature == id_nomenc) - ).scalar_one(), - "cd_nomenclature", - ) - == "3" - ): + if DB.session.execute( + select(TNomenclatures.cd_nomenclature).where(TNomenclatures.id_nomenclature == id_nomenc) + ).scalar_one() == "3": return self.__get_id_nomenc(self.__get_id_type("HIERARCHY"), "mauvais") except ZHApiError as e: raise ZHApiError( @@ -339,29 +309,23 @@ def __get_qualif_eco(self): if len(q_functions) >= 1: # if 61 and/or 62 : get nomenc id of continum ('res') - return getattr( - DB.session.execute( - select(TNomenclatures).where( + return DB.session.execute( + select(TNomenclatures.id_nomenclature).where( and_( TNomenclatures.id_type == hier_type_id, TNomenclatures.cd_nomenclature == "res", ) ) - ).scalar_one(), - "id_nomenclature", - ) + ).scalar_one() else: - return getattr( - DB.session.execute( - select(TNomenclatures).where( + return DB.session.execute( + select(TNomenclatures.id_nomenclature).where( and_( TNomenclatures.id_type == hier_type_id, TNomenclatures.cd_nomenclature == "iso", ) ) - ).scalar_one(), - "id_nomenclature", - ) + ).scalar_one() except ZHApiError as e: raise ZHApiError( message=str(e.message), @@ -444,12 +408,9 @@ def __get_selected_functions(self, nomenc_ids): def __get_id_type(self, mnemo): try: # get id_type in TNomenclatures - return getattr( - DB.session.execute( - select(BibNomenclaturesTypes).where(BibNomenclaturesTypes.mnemonique == mnemo) - ).scalar_one(), - "id_type", - ) + return DB.session.execute( + select(BibNomenclaturesTypes.id_type).where(BibNomenclaturesTypes.mnemonique == mnemo) + ).scalar_one() except Exception as e: exc_type, value, tb = sys.exc_info() raise ZHApiError( @@ -619,29 +580,23 @@ def __get_qualif_management(self): ] if cd_id_nature_naturaliste in selected_id_nature: # if id_nature == 'naturaliste' in selected plans : return - return getattr( - DB.session.execute( - select(TNomenclatures).where( + return DB.session.execute( + select(TNomenclatures.id_nomenclature).where( and_( TNomenclatures.id_type == self.__get_id_type("HIERARCHY"), TNomenclatures.cd_nomenclature == "OUI", ) ) - ).scalar_one(), - "id_nomenclature", - ) + ).scalar_one() else: - return getattr( - DB.session.execute( - select(TNomenclatures).where( + return DB.session.execute( + select(TNomenclatures.id_nomenclature).where( and_( TNomenclatures.id_type == self.__get_id_type("HIERARCHY"), TNomenclatures.cd_nomenclature == "NON", ) ) - ).scalar_one(), - "id_nomenclature", - ) + ).scalar_one() except ZHApiError as e: raise ZHApiError( message=str(e.message), @@ -912,17 +867,14 @@ def __get_knowledge_mnemo(self): if self.knowledge == 1: return None else: - return getattr( - DB.session.execute( - select(TNomenclatures, BibNoteTypes) + return DB.session.execute( + select(TNomenclatures.mnemonique, BibNoteTypes) .join( BibNoteTypes, TNomenclatures.id_nomenclature == BibNoteTypes.id_knowledge, ) .where(BibNoteTypes.note_id == self.knowledge) - ).scalar_one(), - "mnemonique", - ) + ).scalar_one() except Exception as e: exc_type, value, tb = sys.exc_info() raise ZHApiError( @@ -933,14 +885,11 @@ def __get_knowledge_mnemo(self): def __get_qualif_mnemo(self): try: if self.active: - return getattr( - DB.session.execute( - select(TNomenclatures).where( + return DB.session.execute( + select(TNomenclatures.label_default).where( TNomenclatures.id_nomenclature == self.qualif_id ) - ).scalar_one(), - "label_default", - ) + ).scalar_one() except Exception as e: exc_type, value, tb = sys.exc_info() raise ZHApiError( @@ -980,12 +929,9 @@ def denominator(self, value): self.__denominator = Hierarchy.get_denom(self.rb_id, value) def __get_name(self): - return getattr( - DB.session.execute( - select(BibHierCategories).where(BibHierCategories.abbreviation == self.abb) - ).scalar_one(), - "label", - ) + return DB.session.execute( + select(BibHierCategories.label).where(BibHierCategories.abbreviation == self.abb) + ).scalar_one() @staticmethod def get_note(value): @@ -1207,13 +1153,9 @@ def __get_rb(self): return None if len(q_rb) > 1: return get_main_rb(q_rb) - return ( - DB.session.execute( - select(CorZhRb, TRiverBasin).join(TRiverBasin).where(CorZhRb.id_zh == self.id_zh) - ) - .scalar_one() - .id_rb - ) + return DB.session.execute( + select(CorZhRb.id_rb, TRiverBasin).join(TRiverBasin).where(CorZhRb.id_zh == self.id_zh) + ).scalar_one() def __check_if_rules(self): try: @@ -1238,15 +1180,13 @@ def __check_if_rules(self): @staticmethod def get_denom(rb_id, col_name): rb_name = ( - DB.session.execute(select(TRiverBasin).where(TRiverBasin.id_rb == rb_id)) + DB.session.execute(select(TRiverBasin.name).where(TRiverBasin.id_rb == rb_id)) .scalar_one() - .name ) - return getattr( + return ( DB.session.execute( - select(RbNotesSummary).where(RbNotesSummary.bassin_versant == rb_name) - ).scalar_one(), - col_name, + select(RbNotesSummary.col_name).where(RbNotesSummary.bassin_versant == rb_name) + ).scalar_one() ) @staticmethod @@ -1265,10 +1205,8 @@ def get_str_note(note, denominator): def as_dict(self): return { "river_basin_name": DB.session.execute( - select(TRiverBasin).where(TRiverBasin.id_rb == self.rb_id) - ) - .scalar_one() - .name, + select(TRiverBasin.name).where(TRiverBasin.id_rb == self.rb_id) + ).scalar_one(), "volet1": self.volet1.__str__(), "volet2": self.volet2.__str__(), "global_note": Hierarchy.get_str_note(self.global_note, self.total_denom), diff --git a/backend/gn_module_zh/model/cards.py b/backend/gn_module_zh/model/cards.py index cc0a6c80..50492c52 100644 --- a/backend/gn_module_zh/model/cards.py +++ b/backend/gn_module_zh/model/cards.py @@ -34,17 +34,15 @@ def get_mnemo(ids): if type(ids) is int: return ( DB.session.execute( - select(TNomenclatures).where(TNomenclatures.id_nomenclature == ids) + select(TNomenclatures.label_default).where(TNomenclatures.id_nomenclature == ids) ) .scalar_one() - .label_default ) return [ DB.session.execute( - select(TNomenclatures).where(TNomenclatures.id_nomenclature == id) + select(TNomenclatures.label_default).where(TNomenclatures.id_nomenclature == id) ) .scalar_one() - .label_default for id in ids ] return [] @@ -393,10 +391,9 @@ def __str__(self): cahier_lb_code = cahier.lb_code priority = ( DB.session.execute( - select(CorChStatus).where(CorChStatus.lb_code == cahier_lb_code).distinct() + select(CorChStatus.priority).where(CorChStatus.lb_code == cahier_lb_code).distinct() ) - .scalar_one() - .priority + .scalar_one() ) return { "biotope": biotope_lb_code + " - " + biotope_lb_hab_fr, @@ -682,10 +679,9 @@ def other_ref_geo(self, ref_geo): for i in ref: type_code = ( DB.session.execute( - select(BibAreasTypes).where(BibAreasTypes.id_type == i.LAreas.id_type) + select(BibAreasTypes.type_code).where(BibAreasTypes.id_type == i.LAreas.id_type) ) - .scalar_one() - .type_code + .scalar_one() ) refs.append( { @@ -783,10 +779,8 @@ def set_management(self, id_org, plans): def __str__(self): return { "structure": DB.session.execute( - select(BibOrganismes).where(BibOrganismes.id_org == self.id_org) - ) - .scalar_one() - .name, + select(BibOrganismes.name).where(BibOrganismes.id_org == self.id_org) + ).scalar_one(), "plans": [plan.__str__() for plan in self.plans], } @@ -825,17 +819,14 @@ def __init__(self, id_area, id_doc_type, id_cors, remark): def __str__(self): return { - "commune": DB.session.execute(select(LAreas).where(LAreas.id_area == self.id_area)) - .scalar_one() - .area_name, + "commune": DB.session.execute(select(LAreas.area_name).where(LAreas.id_area == self.id_area)) + .scalar_one(), "type_doc": Utils.get_mnemo(self.id_doc_type), "type_classement": [ Utils.get_mnemo( DB.session.execute( - select(CorUrbanTypeRange).where(CorUrbanTypeRange.id_cor == id) - ) - .scalar_one() - .id_range_type + select(CorUrbanTypeRange.id_range_type).where(CorUrbanTypeRange.id_cor == id) + ).scalar_one() ) for id in self.id_cors ], @@ -1016,10 +1007,8 @@ def __init__(self, id_action, id_priority_level, remark): def __str__(self): return { "proposition": DB.session.execute( - select(BibActions).where(BibActions.id_action == self.id_action) - ) - .scalar_one() - .name, + select(BibActions.name).where(BibActions.id_action == self.id_action) + ).scalar_one(), "niveau": Utils.get_mnemo(self.id_priority_level), "remarque": Utils.get_string(self.remark), } diff --git a/backend/gn_module_zh/model/zh.py b/backend/gn_module_zh/model/zh.py index 050801e9..57142a10 100644 --- a/backend/gn_module_zh/model/zh.py +++ b/backend/gn_module_zh/model/zh.py @@ -180,12 +180,11 @@ def get_protections(self): return { "protections": [ DB.session.execute( - select(CorProtectionLevelType).where( + select(CorProtectionLevelType.id_protection_status).where( CorProtectionLevelType.id_protection == protec ) ) .scalar_one() - .id_protection_status for protec in [ protection.id_protection for protection in ZH.get_data_by_id(CorZhProtection, self.zh.id_zh) diff --git a/backend/gn_module_zh/model/zh_schema.py b/backend/gn_module_zh/model/zh_schema.py index 40e97dfd..629ee098 100644 --- a/backend/gn_module_zh/model/zh_schema.py +++ b/backend/gn_module_zh/model/zh_schema.py @@ -268,9 +268,8 @@ def get_geofeature(self, recursif=True, relationships=()): @staticmethod def get_site_space_name(id): return ( - DB.session.execute(select(BibSiteSpace).where(BibSiteSpace.id_site_space == id)) + DB.session.execute(select(BibSiteSpace.name).where(BibSiteSpace.id_site_space == id)) .scalar_one() - .name ) @staticmethod @@ -366,12 +365,11 @@ def get_id_types_ref_geo(id_zh, ref_geo_config): if ref["active"]: ids.append( DB.session.execute( - select(BibAreasTypes).where( + select(BibAreasTypes.id_type).where( BibAreasTypes.type_code == ref["type_code_ref_geo"] ) ) .scalar_one() - .id_type ) return ids @@ -619,13 +617,13 @@ def get_all_functions(nomenc_ids): @staticmethod def get_main_function_list(ids): - # méthode utilisée ??? + # méthode utilisée ? q_id_types = DB.session.scalars(select(func.distinct(CorMainFct.id_main_function))).all() return [id[0] for id in q_id_types if id[0] in ids] @staticmethod def get_function_by_main_function(id_main): - # méthode utilisée ??? + # méthode utilisée ? return DB.session.execute( select(CorMainFct, TNomenclatures) .join(TNomenclatures, TNomenclatures.id_nomenclature == CorMainFct.id_function) @@ -634,8 +632,9 @@ def get_function_by_main_function(id_main): @staticmethod def get_mnemo_type(id_type): + # methode utilisée ? if id_type: - # pas testé + test = 'test' return DB.session.execute( select(TNomenclatures).where(TNomenclatures.id_nomenclature == id_type) ).scalar_one() @@ -798,12 +797,11 @@ def get_range_by_doc(doc_id): "id_cor": range.id_cor, "id_nomenclature": range.id_range_type, "mnemonique": DB.session.execute( - select(TNomenclatures).where( + select(TNomenclatures.mnemonique).where( TNomenclatures.id_nomenclature == range.id_range_type ) ) - .scalar_one() - .mnemonique, + .scalar_one(), } ) return ranges diff --git a/backend/gn_module_zh/nomenclatures.py b/backend/gn_module_zh/nomenclatures.py index cfab354a..a030e060 100644 --- a/backend/gn_module_zh/nomenclatures.py +++ b/backend/gn_module_zh/nomenclatures.py @@ -63,22 +63,19 @@ def get_corine_biotope(): def get_ch(lb_code): try: CH_typo = ( - DB.session.execute(select(TypoRef).where(TypoRef.cd_table == "TYPO_CH")) - .scalar_one() - .cd_typo + DB.session.execute(select(TypoRef.cd_typo).where(TypoRef.cd_table == "TYPO_CH")) + .scalar_one() ) CB_typo = ( - DB.session.execute(select(TypoRef).where(TypoRef.cd_table == "TYPO_CORINE_BIOTOPES")) + DB.session.execute(select(TypoRef.cd_typo).where(TypoRef.cd_table == "TYPO_CORINE_BIOTOPES")) .scalar_one() - .cd_typo ) # get cd_hab_sortie list from lb_code of selected Corine Biotope cd_hab_sortie = ( DB.session.execute( - select(Habref).where(and_(Habref.lb_code == lb_code, Habref.cd_typo == CB_typo)) + select(Habref.cd_hab).where(and_(Habref.lb_code == lb_code, Habref.cd_typo == CB_typo)) ) .scalar_one() - .cd_hab ) # get all cd_hab_entre corresponding to cd_hab_sortie q_cd_hab_entre = DB.session.scalars( @@ -99,10 +96,8 @@ def get_ch(lb_code): "lb_code": hab.lb_code, "lb_hab_fr": hab.lb_hab_fr, "priority": DB.session.execute( - select(CorChStatus).where(CorChStatus.lb_code == hab.lb_code).distinct() - ) - .scalar_one() - .priority, + select(CorChStatus.priority).where(CorChStatus.lb_code == hab.lb_code).distinct() + ).scalar_one() } ) return ch @@ -145,12 +140,11 @@ def get_impact_category(impact): if impact.CorImpactTypes.id_impact_type is not None: return ( DB.session.execute( - select(TNomenclatures).where( + select(TNomenclatures.mnemonique).where( TNomenclatures.id_nomenclature == impact.CorImpactTypes.id_impact_type ) ) .scalar_one() - .mnemonique ) return "Aucun" @@ -160,10 +154,9 @@ def get_function_list(mnemo): # get id_type of mnemo (ex : 'FONCTIONS_HYDRO') in BibNomenclatureTypes id_type_main_function = ( DB.session.execute( - select(BibNomenclaturesTypes).where(BibNomenclaturesTypes.mnemonique == mnemo) + select(BibNomenclaturesTypes.id_type).where(BibNomenclaturesTypes.mnemonique == mnemo) ) .scalar_one() - .id_type ) # get list of TNomenclatures ids by id_type @@ -180,12 +173,12 @@ def get_function_list(mnemo): "mnemonique": function.TNomenclatures.mnemonique, "id_category": function.CorMainFct.id_main_function, "category": DB.session.execute( - select(TNomenclatures).where( + select(TNomenclatures.mnemonique).where( TNomenclatures.id_nomenclature == function.CorMainFct.id_main_function ) ) .scalar_one() - .mnemonique.upper(), + .upper(), } for function in CorMainFct.get_functions(nomenclature_ids) ] @@ -202,10 +195,9 @@ def get_all_function_list(mnemo): # get id_type of mnemo (ex : 'FONCTIONS_HYDRO') in BibNomenclatureTypes id_type_main_function = ( DB.session.execute( - select(BibNomenclaturesTypes).where(BibNomenclaturesTypes.mnemonique == mnemo) + select(BibNomenclaturesTypes.id_type).where(BibNomenclaturesTypes.mnemonique == mnemo) ) .scalar_one() - .id_type ) # get list of TNomenclatures ids by id_type @@ -222,12 +214,12 @@ def get_all_function_list(mnemo): "mnemonique": function.TNomenclatures.mnemonique, "id_category": function.CorMainFct.id_main_function, "category": DB.session.execute( - select(TNomenclatures).where( + select(TNomenclatures.mnemonique).where( TNomenclatures.id_nomenclature == function.CorMainFct.id_main_function ) ) .scalar_one() - .mnemonique.upper(), + .upper(), } for function in CorMainFct.get_all_functions(nomenclature_ids) ] @@ -263,20 +255,18 @@ def get_protections(): { "id_protection_status": protection.id_protection_status, "mnemonique_status": DB.session.execute( - select(TNomenclatures).where( + select(TNomenclatures.mnemonique).where( TNomenclatures.id_nomenclature == protection.id_protection_status ) ) - .scalar_one() - .mnemonique, + .scalar_one(), "id_protection_level": protection.id_protection_level, "mnemonique_level": DB.session.execute( - select(TNomenclatures).where( + select(TNomenclatures.mnemonique).where( TNomenclatures.id_nomenclature == protection.id_protection_level ) ) - .scalar_one() - .mnemonique, + .scalar_one(), "category": get_protection_category(protection), "category_id": protection.id_protection_type, } @@ -296,12 +286,11 @@ def get_protection_category(protection): if protection.id_protection_type is not None: return ( DB.session.execute( - select(TNomenclatures).where( + select(TNomenclatures.mnemonique).where( TNomenclatures.id_nomenclature == protection.id_protection_type ) ) .scalar_one() - .mnemonique ) return "Autre" diff --git a/backend/gn_module_zh/upload.py b/backend/gn_module_zh/upload.py index 7f76b04a..cc4095c5 100644 --- a/backend/gn_module_zh/upload.py +++ b/backend/gn_module_zh/upload.py @@ -113,10 +113,7 @@ def upload(request, extensions, pdf_size, jpg_size, upload_path, module_name, id return { "file_name": get_file_path(id_media).name, "full_path": str(get_file_path(id_media)), - "media_path": getattr( - DB.session.execute(select(TMedias).where(TMedias.id_media == id_media)).scalar_one(), - "media_path", - ), + "media_path": DB.session.execute(select(TMedias.media_path).where(TMedias.id_media == id_media)).scalar_one(), "extension": get_extension(get_file_path(id_media).name), } diff --git a/backend/gn_module_zh/utils.py b/backend/gn_module_zh/utils.py index c411c5b6..c6534b66 100644 --- a/backend/gn_module_zh/utils.py +++ b/backend/gn_module_zh/utils.py @@ -20,7 +20,7 @@ def get_main_picture_id(id_zh, media_list=None): present """ main_pict_id = ( - DB.session.execute(select(TZH).where(TZH.id_zh == id_zh)).scalar_one().main_pict_id + DB.session.execute(select(TZH.main_pict_id).where(TZH.id_zh == id_zh)).scalar_one() ) if main_pict_id is None and media_list is not None and len(media_list) > 0: id_media = media_list[0].id_media @@ -41,12 +41,14 @@ def get_last_pdf_export(id_zh, last_date) -> Query: query = ( select(TZH, TMedias, TNomenclatures) .with_only_columns(TMedias.id_media) - .where(TZH.id_zh == id_zh) - .where(TZH.zh_uuid == TMedias.unique_id_media) - .where(TMedias.id_nomenclature_media_type == TNomenclatures.id_nomenclature) - .where(TNomenclatures.mnemonique == "PDF") - .where(TMedias.meta_update_date > last_date) - .where(TMedias.title_fr.like(f"{id_zh}_fiche%.pdf")) + .where( + TZH.id_zh == id_zh, + TZH.zh_uuid == TMedias.unique_id_media, + TMedias.id_nomenclature_media_type == TNomenclatures.id_nomenclature, + TNomenclatures.mnemonique == "PDF", + TMedias.meta_update_date > last_date, + TMedias.title_fr.like(f"{id_zh}_fiche%.pdf") + ) ) return DB.session.execute(query).first() @@ -92,14 +94,12 @@ def delete_file(id_media): def check_ref_geo_schema(): try: id_type_com = ( - DB.session.execute(select(BibAreasTypes).where(BibAreasTypes.type_code == "COM")) + DB.session.execute(select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "DEP")) .scalar_one() - .id_type ) id_type_dep = ( - DB.session.execute(select(BibAreasTypes).where(BibAreasTypes.type_code == "DEP")) + DB.session.execute(select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "DEP")) .scalar_one() - .id_type ) n_com = DB.session.scalar(select(func.count()).where(LAreas.id_type == id_type_com)) n_dep = DB.session.scalar(select(func.count()).where(LAreas.id_type == id_type_dep)) From 44474395877905d997e30520a032dec8d48632f3 Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Wed, 17 Apr 2024 23:19:33 +0200 Subject: [PATCH 42/60] linter backend --- backend/gn_module_zh/blueprint.py | 15 +-- backend/gn_module_zh/forms.py | 123 ++++++++---------- backend/gn_module_zh/hierarchy.py | 159 ++++++++++++++---------- backend/gn_module_zh/model/cards.py | 43 ++++--- backend/gn_module_zh/model/zh.py | 3 +- backend/gn_module_zh/model/zh_schema.py | 15 +-- backend/gn_module_zh/nomenclatures.py | 75 +++++------ backend/gn_module_zh/upload.py | 4 +- backend/gn_module_zh/utils.py | 22 ++-- 9 files changed, 220 insertions(+), 239 deletions(-) diff --git a/backend/gn_module_zh/blueprint.py b/backend/gn_module_zh/blueprint.py index 3e2a3f0b..b96a98a8 100644 --- a/backend/gn_module_zh/blueprint.py +++ b/backend/gn_module_zh/blueprint.py @@ -124,8 +124,8 @@ def get_zh(scope): def get_all_zh(info_role, query, limit, page, orderby=None, order="asc"): # try: # Pour obtenir le nombre de résultat de la requete sans le LIMIT - nb_results_without_limit = ( - DB.session.scalar(select(func.count()).select_from(query.subquery())) + nb_results_without_limit = DB.session.scalar( + select(func.count()).select_from(query.subquery()) ) user = info_role user_cruved = get_user_cruved() @@ -154,10 +154,7 @@ def get_all_zh(info_role, query, limit, page, orderby=None, order="asc"): # Order by id because there can be ambiguity in order_by(col) depending # on the column so add on order_by id makes it clearer - data = ( - DB.session.scalars(query.order_by(TZH.id_zh).limit(limit).offset(page * limit)) - .all() - ) + data = DB.session.scalars(query.order_by(TZH.id_zh).limit(limit).offset(page * limit)).all() is_ref_geo = check_ref_geo_schema() featureCollection = [] @@ -771,9 +768,9 @@ def deleteOneZh(id_zh): DB.session.execute(delete(CorZhRef).where(CorZhRef.id_zh == id_zh)) # delete criteres delim - id_lim_list = ( - DB.session.execute(select(TZH.id_lim_list).where(TZH.id_zh == id_zh)).scalar_one() - ) + id_lim_list = DB.session.execute( + select(TZH.id_lim_list).where(TZH.id_zh == id_zh) + ).scalar_one() DB.session.execute(delete(CorLimList).where(CorLimList.id_lim_list == id_lim_list)) # delete cor_zh_area diff --git a/backend/gn_module_zh/forms.py b/backend/gn_module_zh/forms.py index c6ce98b7..a4970e62 100644 --- a/backend/gn_module_zh/forms.py +++ b/backend/gn_module_zh/forms.py @@ -86,15 +86,17 @@ def create_zh(form_data, info_role, zh_date, polygon, zh_area, ref_geo_referenti post_cor_zh_area( polygon, new_zh.id_zh, - DB.session.execute(select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "COM")) - .scalar_one(), + DB.session.execute( + select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "COM") + ).scalar_one(), ) # fill cor_zh_area for departements post_cor_zh_area( polygon, new_zh.id_zh, - DB.session.execute(select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "DEP")) - .scalar_one(), + DB.session.execute( + select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "DEP") + ).scalar_one(), ) # fill cor_zh_area for other geo referentials for ref in ref_geo_referentiels: @@ -102,9 +104,10 @@ def create_zh(form_data, info_role, zh_date, polygon, zh_area, ref_geo_referenti polygon, new_zh.id_zh, DB.session.execute( - select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == ref["type_code_ref_geo"]) - ) - .scalar_one(), + select(BibAreasTypes.id_type).where( + BibAreasTypes.type_code == ref["type_code_ref_geo"] + ) + ).scalar_one(), ) # fill cor_zh_rb @@ -118,14 +121,11 @@ def create_zh(form_data, info_role, zh_date, polygon, zh_area, ref_geo_referenti new_zh.code = code.__repr__() new_zh.ef_area = total_cover # set default values - fct_delim_default_id = ( - DB.session.execute( - select(DefaultsNomenclaturesValues.id_nomenclature).where( - DefaultsNomenclaturesValues.mnemonique_type == "CRIT_DEF_ESP_FCT" - ) + fct_delim_default_id = DB.session.execute( + select(DefaultsNomenclaturesValues.id_nomenclature).where( + DefaultsNomenclaturesValues.mnemonique_type == "CRIT_DEF_ESP_FCT" ) - .scalar_one() - ) + ).scalar_one() post_fct_delim(new_zh.id_zh, [fct_delim_default_id]) @@ -350,14 +350,16 @@ def update_cor_zh_area(polygon, id_zh, geo_refs): post_cor_zh_area( polygon, id_zh, - DB.session.execute(select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "COM")) - .scalar_one(), + DB.session.execute( + select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "COM") + ).scalar_one(), ) post_cor_zh_area( polygon, id_zh, - DB.session.execute(select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "DEP")) - .scalar_one(), + DB.session.execute( + select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "DEP") + ).scalar_one(), ) # fill cor_zh_area for other geo referentials for ref in geo_refs: @@ -368,8 +370,7 @@ def update_cor_zh_area(polygon, id_zh, geo_refs): select(BibAreasTypes.id_type).where( BibAreasTypes.type_code == ref["type_code_ref_geo"] ) - ) - .scalar_one(), + ).scalar_one(), ) except Exception as e: if e.__class__.__name__ == "DataError": @@ -776,8 +777,7 @@ def post_managements(id_zh, managements): TManagementStructures.id_org == management["structure"], ) ) - ) - .scalar_one(), + ).scalar_one(), plan_date=datetime.datetime.strptime(plan["plan_date"], "%d/%m/%Y"), duration=plan["duration"], remark=plan["remark"], @@ -844,8 +844,7 @@ def post_protections(id_zh, protections): select(CorProtectionLevelType.id_protection).where( CorProtectionLevelType.id_protection_status == protection ) - ) - .scalar_one(), + ).scalar_one(), id_zh=id_zh, ) ) @@ -902,14 +901,11 @@ def update_urban_docs(id_zh, urban_docs): def post_urban_docs(id_zh, urban_docs): for urban_doc in urban_docs: - id_doc_type = ( - DB.session.execute( - select(CorUrbanTypeRange.id_doc_type).where( - CorUrbanTypeRange.id_cor == urban_doc["id_urban_type"][0]["id_cor"] - ) + id_doc_type = DB.session.execute( + select(CorUrbanTypeRange.id_doc_type).where( + CorUrbanTypeRange.id_cor == urban_doc["id_urban_type"][0]["id_cor"] ) - .scalar_one() - ) + ).scalar_one() uuid_doc = uuid.uuid4() DB.session.add( TUrbanPlanningDocs( @@ -967,9 +963,9 @@ def post_actions(id_zh, actions): def post_file_info(id_zh, title, author, description, extension, media_path=None): try: - unique_id_media = ( - DB.session.execute(select(TZH.zh_uuid).where(TZH.id_zh == int(id_zh))).scalar_one() - ) + unique_id_media = DB.session.execute( + select(TZH.zh_uuid).where(TZH.id_zh == int(id_zh)) + ).scalar_one() uuid_attached_row = uuid.uuid4() if extension == ".pdf": mnemo = "PDF" @@ -977,21 +973,17 @@ def post_file_info(id_zh, title, author, description, extension, media_path=None mnemo = "Tableur" else: mnemo = "Photo" - id_nomenclature_media_type = ( - DB.session.execute(select(TNomenclatures.id_nomenclature).where(TNomenclatures.mnemonique == mnemo)) - .scalar_one() - ) - id_table_location = ( - DB.session.execute( - select(BibTablesLocation.id_table_location).where( - and_( - BibTablesLocation.schema_name == "pr_zh", - BibTablesLocation.table_name == "t_zh", - ) + id_nomenclature_media_type = DB.session.execute( + select(TNomenclatures.id_nomenclature).where(TNomenclatures.mnemonique == mnemo) + ).scalar_one() + id_table_location = DB.session.execute( + select(BibTablesLocation.id_table_location).where( + and_( + BibTablesLocation.schema_name == "pr_zh", + BibTablesLocation.table_name == "t_zh", ) ) - .scalar_one() - ) + ).scalar_one() post_date = datetime.datetime.now() DB.session.add( TMedias( @@ -1009,12 +1001,9 @@ def post_file_info(id_zh, title, author, description, extension, media_path=None ) ) DB.session.commit() - id_media = ( - DB.session.execute( - select(TMedias.id_media).where(TMedias.uuid_attached_row == uuid_attached_row) - ) - .scalar_one() - ) + id_media = DB.session.execute( + select(TMedias.id_media).where(TMedias.uuid_attached_row == uuid_attached_row) + ).scalar_one() return id_media except Exception as e: if e.__class__.__name__ == "DataError": @@ -1028,21 +1017,18 @@ def post_file_info(id_zh, title, author, description, extension, media_path=None def patch_file_info(id_zh, id_media, title, author, description): try: - unique_id_media = ( - DB.session.execute(select(TZH.zh_uuid).where(TZH.id_zh == int(id_zh))).scalar_one() - ) + unique_id_media = DB.session.execute( + select(TZH.zh_uuid).where(TZH.id_zh == int(id_zh)) + ).scalar_one() uuid_attached_row = uuid.uuid4() - id_table_location = ( - DB.session.execute( - select(BibTablesLocation.id_table_location).where( - and_( - BibTablesLocation.schema_name == "pr_zh", - BibTablesLocation.table_name == "t_zh", - ) + id_table_location = DB.session.execute( + select(BibTablesLocation.id_table_location).where( + and_( + BibTablesLocation.schema_name == "pr_zh", + BibTablesLocation.table_name == "t_zh", ) ) - .scalar_one() - ) + ).scalar_one() post_date = datetime.datetime.now() DB.session.execute( update(TMedias) @@ -1077,10 +1063,9 @@ def update_file_extension(id_media, extension): mnemo = "Tableur" else: mnemo = "Photo" - id_nomenclature_media_type = ( - DB.session.execute(select(TNomenclatures.id_nomenclature).where(TNomenclatures.mnemonique == mnemo)) - .scalar_one() - ) + id_nomenclature_media_type = DB.session.execute( + select(TNomenclatures.id_nomenclature).where(TNomenclatures.mnemonique == mnemo) + ).scalar_one() DB.session.execute( update(TMedias) .where(TMedias.id_media == id_media) diff --git a/backend/gn_module_zh/hierarchy.py b/backend/gn_module_zh/hierarchy.py index 5e444760..73eeac80 100644 --- a/backend/gn_module_zh/hierarchy.py +++ b/backend/gn_module_zh/hierarchy.py @@ -54,7 +54,9 @@ def __init__(self, id_zh, rb_id, abb): def __get_rule_id(self, abb): try: - return DB.session.execute(select(TRules.rule_id).where(TRules.abbreviation == abb)).scalar_one() + return DB.session.execute( + select(TRules.rule_id).where(TRules.abbreviation == abb) + ).scalar_one() except Exception as e: exc_type, value, tb = sys.exc_info() raise ZHApiError( @@ -90,13 +92,13 @@ def __get_cor_rule_id(self): try: if self.active: return DB.session.execute( - select(CorRbRules.cor_rule_id).where( - and_( - CorRbRules.rb_id == self.rb_id, - CorRbRules.rule_id == self.rule_id, - ) + select(CorRbRules.cor_rule_id).where( + and_( + CorRbRules.rb_id == self.rb_id, + CorRbRules.rule_id == self.rule_id, ) - ).scalar_one() + ) + ).scalar_one() except Exception as e: exc_type, value, tb = sys.exc_info() raise ZHApiError( @@ -153,21 +155,41 @@ def __get_nomenc_ids(self): def __get_qualif_cat7(self): try: id_nomenc = self.__get_qualif_val() - if DB.session.execute( - select(TNomenclatures.cd_nomenclature).where(TNomenclatures.id_nomenclature == id_nomenc) - ).scalar_one() == "0": + if ( + DB.session.execute( + select(TNomenclatures.cd_nomenclature).where( + TNomenclatures.id_nomenclature == id_nomenc + ) + ).scalar_one() + == "0" + ): return self.__get_id_nomenc(self.__get_id_type("HIERARCHY"), "NE") - if DB.session.execute( - select(TNomenclatures.cd_nomenclature).where(TNomenclatures.id_nomenclature == id_nomenc) - ).scalar_one() == "1": + if ( + DB.session.execute( + select(TNomenclatures.cd_nomenclature).where( + TNomenclatures.id_nomenclature == id_nomenc + ) + ).scalar_one() + == "1" + ): return self.__get_id_nomenc(self.__get_id_type("HIERARCHY"), "bon") - if DB.session.execute( - select(TNomenclatures.cd_nomenclature).where(TNomenclatures.id_nomenclature == id_nomenc) - ).scalar_one() == "2": + if ( + DB.session.execute( + select(TNomenclatures.cd_nomenclature).where( + TNomenclatures.id_nomenclature == id_nomenc + ) + ).scalar_one() + == "2" + ): return self.__get_id_nomenc(self.__get_id_type("HIERARCHY"), "moyen") - if DB.session.execute( - select(TNomenclatures.cd_nomenclature).where(TNomenclatures.id_nomenclature == id_nomenc) - ).scalar_one() == "3": + if ( + DB.session.execute( + select(TNomenclatures.cd_nomenclature).where( + TNomenclatures.id_nomenclature == id_nomenc + ) + ).scalar_one() + == "3" + ): return self.__get_id_nomenc(self.__get_id_type("HIERARCHY"), "mauvais") except ZHApiError as e: raise ZHApiError( @@ -310,22 +332,22 @@ def __get_qualif_eco(self): if len(q_functions) >= 1: # if 61 and/or 62 : get nomenc id of continum ('res') return DB.session.execute( - select(TNomenclatures.id_nomenclature).where( - and_( - TNomenclatures.id_type == hier_type_id, - TNomenclatures.cd_nomenclature == "res", - ) + select(TNomenclatures.id_nomenclature).where( + and_( + TNomenclatures.id_type == hier_type_id, + TNomenclatures.cd_nomenclature == "res", ) - ).scalar_one() + ) + ).scalar_one() else: return DB.session.execute( - select(TNomenclatures.id_nomenclature).where( - and_( - TNomenclatures.id_type == hier_type_id, - TNomenclatures.cd_nomenclature == "iso", - ) + select(TNomenclatures.id_nomenclature).where( + and_( + TNomenclatures.id_type == hier_type_id, + TNomenclatures.cd_nomenclature == "iso", ) - ).scalar_one() + ) + ).scalar_one() except ZHApiError as e: raise ZHApiError( message=str(e.message), @@ -409,8 +431,10 @@ def __get_id_type(self, mnemo): try: # get id_type in TNomenclatures return DB.session.execute( - select(BibNomenclaturesTypes.id_type).where(BibNomenclaturesTypes.mnemonique == mnemo) - ).scalar_one() + select(BibNomenclaturesTypes.id_type).where( + BibNomenclaturesTypes.mnemonique == mnemo + ) + ).scalar_one() except Exception as e: exc_type, value, tb = sys.exc_info() raise ZHApiError( @@ -581,22 +605,22 @@ def __get_qualif_management(self): if cd_id_nature_naturaliste in selected_id_nature: # if id_nature == 'naturaliste' in selected plans : return return DB.session.execute( - select(TNomenclatures.id_nomenclature).where( - and_( - TNomenclatures.id_type == self.__get_id_type("HIERARCHY"), - TNomenclatures.cd_nomenclature == "OUI", - ) + select(TNomenclatures.id_nomenclature).where( + and_( + TNomenclatures.id_type == self.__get_id_type("HIERARCHY"), + TNomenclatures.cd_nomenclature == "OUI", ) - ).scalar_one() + ) + ).scalar_one() else: return DB.session.execute( - select(TNomenclatures.id_nomenclature).where( - and_( - TNomenclatures.id_type == self.__get_id_type("HIERARCHY"), - TNomenclatures.cd_nomenclature == "NON", - ) + select(TNomenclatures.id_nomenclature).where( + and_( + TNomenclatures.id_type == self.__get_id_type("HIERARCHY"), + TNomenclatures.cd_nomenclature == "NON", ) - ).scalar_one() + ) + ).scalar_one() except ZHApiError as e: raise ZHApiError( message=str(e.message), @@ -868,13 +892,13 @@ def __get_knowledge_mnemo(self): return None else: return DB.session.execute( - select(TNomenclatures.mnemonique, BibNoteTypes) - .join( - BibNoteTypes, - TNomenclatures.id_nomenclature == BibNoteTypes.id_knowledge, - ) - .where(BibNoteTypes.note_id == self.knowledge) - ).scalar_one() + select(TNomenclatures.mnemonique, BibNoteTypes) + .join( + BibNoteTypes, + TNomenclatures.id_nomenclature == BibNoteTypes.id_knowledge, + ) + .where(BibNoteTypes.note_id == self.knowledge) + ).scalar_one() except Exception as e: exc_type, value, tb = sys.exc_info() raise ZHApiError( @@ -886,10 +910,10 @@ def __get_qualif_mnemo(self): try: if self.active: return DB.session.execute( - select(TNomenclatures.label_default).where( - TNomenclatures.id_nomenclature == self.qualif_id - ) - ).scalar_one() + select(TNomenclatures.label_default).where( + TNomenclatures.id_nomenclature == self.qualif_id + ) + ).scalar_one() except Exception as e: exc_type, value, tb = sys.exc_info() raise ZHApiError( @@ -930,8 +954,8 @@ def denominator(self, value): def __get_name(self): return DB.session.execute( - select(BibHierCategories.label).where(BibHierCategories.abbreviation == self.abb) - ).scalar_one() + select(BibHierCategories.label).where(BibHierCategories.abbreviation == self.abb) + ).scalar_one() @staticmethod def get_note(value): @@ -1154,8 +1178,8 @@ def __get_rb(self): if len(q_rb) > 1: return get_main_rb(q_rb) return DB.session.execute( - select(CorZhRb.id_rb, TRiverBasin).join(TRiverBasin).where(CorZhRb.id_zh == self.id_zh) - ).scalar_one() + select(CorZhRb.id_rb, TRiverBasin).join(TRiverBasin).where(CorZhRb.id_zh == self.id_zh) + ).scalar_one() def __check_if_rules(self): try: @@ -1179,15 +1203,12 @@ def __check_if_rules(self): @staticmethod def get_denom(rb_id, col_name): - rb_name = ( - DB.session.execute(select(TRiverBasin.name).where(TRiverBasin.id_rb == rb_id)) - .scalar_one() - ) - return ( - DB.session.execute( - select(RbNotesSummary.col_name).where(RbNotesSummary.bassin_versant == rb_name) - ).scalar_one() - ) + rb_name = DB.session.execute( + select(TRiverBasin.name).where(TRiverBasin.id_rb == rb_id) + ).scalar_one() + return DB.session.execute( + select(RbNotesSummary.col_name).where(RbNotesSummary.bassin_versant == rb_name) + ).scalar_one() @staticmethod def get_str_note(note, denominator): diff --git a/backend/gn_module_zh/model/cards.py b/backend/gn_module_zh/model/cards.py index 50492c52..85ec29e2 100644 --- a/backend/gn_module_zh/model/cards.py +++ b/backend/gn_module_zh/model/cards.py @@ -32,17 +32,17 @@ class Utils(ZH): def get_mnemo(ids): if ids: if type(ids) is int: - return ( - DB.session.execute( - select(TNomenclatures.label_default).where(TNomenclatures.id_nomenclature == ids) + return DB.session.execute( + select(TNomenclatures.label_default).where( + TNomenclatures.id_nomenclature == ids ) - .scalar_one() - ) + ).scalar_one() return [ DB.session.execute( - select(TNomenclatures.label_default).where(TNomenclatures.id_nomenclature == id) - ) - .scalar_one() + select(TNomenclatures.label_default).where( + TNomenclatures.id_nomenclature == id + ) + ).scalar_one() for id in ids ] return [] @@ -389,12 +389,9 @@ def __str__(self): ).scalar_one() cahier_lb_hab_fr = cahier.lb_hab_fr cahier_lb_code = cahier.lb_code - priority = ( - DB.session.execute( - select(CorChStatus.priority).where(CorChStatus.lb_code == cahier_lb_code).distinct() - ) - .scalar_one() - ) + priority = DB.session.execute( + select(CorChStatus.priority).where(CorChStatus.lb_code == cahier_lb_code).distinct() + ).scalar_one() return { "biotope": biotope_lb_code + " - " + biotope_lb_hab_fr, "etat": Utils.get_mnemo(self.id_preservation_state), @@ -677,12 +674,11 @@ def other_ref_geo(self, ref_geo): refs = [] for ref in CorZhArea.get_ref_geo_info(self.id_zh, id_types): for i in ref: - type_code = ( - DB.session.execute( - select(BibAreasTypes.type_code).where(BibAreasTypes.id_type == i.LAreas.id_type) + type_code = DB.session.execute( + select(BibAreasTypes.type_code).where( + BibAreasTypes.id_type == i.LAreas.id_type ) - .scalar_one() - ) + ).scalar_one() refs.append( { "area_name": i.LAreas.area_name, @@ -819,13 +815,16 @@ def __init__(self, id_area, id_doc_type, id_cors, remark): def __str__(self): return { - "commune": DB.session.execute(select(LAreas.area_name).where(LAreas.id_area == self.id_area)) - .scalar_one(), + "commune": DB.session.execute( + select(LAreas.area_name).where(LAreas.id_area == self.id_area) + ).scalar_one(), "type_doc": Utils.get_mnemo(self.id_doc_type), "type_classement": [ Utils.get_mnemo( DB.session.execute( - select(CorUrbanTypeRange.id_range_type).where(CorUrbanTypeRange.id_cor == id) + select(CorUrbanTypeRange.id_range_type).where( + CorUrbanTypeRange.id_cor == id + ) ).scalar_one() ) for id in self.id_cors diff --git a/backend/gn_module_zh/model/zh.py b/backend/gn_module_zh/model/zh.py index 57142a10..84c4a945 100644 --- a/backend/gn_module_zh/model/zh.py +++ b/backend/gn_module_zh/model/zh.py @@ -183,8 +183,7 @@ def get_protections(self): select(CorProtectionLevelType.id_protection_status).where( CorProtectionLevelType.id_protection == protec ) - ) - .scalar_one() + ).scalar_one() for protec in [ protection.id_protection for protection in ZH.get_data_by_id(CorZhProtection, self.zh.id_zh) diff --git a/backend/gn_module_zh/model/zh_schema.py b/backend/gn_module_zh/model/zh_schema.py index 629ee098..7c0a9fb4 100644 --- a/backend/gn_module_zh/model/zh_schema.py +++ b/backend/gn_module_zh/model/zh_schema.py @@ -267,10 +267,9 @@ def get_geofeature(self, recursif=True, relationships=()): @staticmethod def get_site_space_name(id): - return ( - DB.session.execute(select(BibSiteSpace.name).where(BibSiteSpace.id_site_space == id)) - .scalar_one() - ) + return DB.session.execute( + select(BibSiteSpace.name).where(BibSiteSpace.id_site_space == id) + ).scalar_one() @staticmethod def get_tzh_by_id(id): @@ -368,8 +367,7 @@ def get_id_types_ref_geo(id_zh, ref_geo_config): select(BibAreasTypes.id_type).where( BibAreasTypes.type_code == ref["type_code_ref_geo"] ) - ) - .scalar_one() + ).scalar_one() ) return ids @@ -634,7 +632,7 @@ def get_function_by_main_function(id_main): def get_mnemo_type(id_type): # methode utilisée ? if id_type: - test = 'test' + test = "test" return DB.session.execute( select(TNomenclatures).where(TNomenclatures.id_nomenclature == id_type) ).scalar_one() @@ -800,8 +798,7 @@ def get_range_by_doc(doc_id): select(TNomenclatures.mnemonique).where( TNomenclatures.id_nomenclature == range.id_range_type ) - ) - .scalar_one(), + ).scalar_one(), } ) return ranges diff --git a/backend/gn_module_zh/nomenclatures.py b/backend/gn_module_zh/nomenclatures.py index a030e060..f564b7fa 100644 --- a/backend/gn_module_zh/nomenclatures.py +++ b/backend/gn_module_zh/nomenclatures.py @@ -62,21 +62,16 @@ def get_corine_biotope(): def get_ch(lb_code): try: - CH_typo = ( - DB.session.execute(select(TypoRef.cd_typo).where(TypoRef.cd_table == "TYPO_CH")) - .scalar_one() - ) - CB_typo = ( - DB.session.execute(select(TypoRef.cd_typo).where(TypoRef.cd_table == "TYPO_CORINE_BIOTOPES")) - .scalar_one() - ) + CH_typo = DB.session.execute( + select(TypoRef.cd_typo).where(TypoRef.cd_table == "TYPO_CH") + ).scalar_one() + CB_typo = DB.session.execute( + select(TypoRef.cd_typo).where(TypoRef.cd_table == "TYPO_CORINE_BIOTOPES") + ).scalar_one() # get cd_hab_sortie list from lb_code of selected Corine Biotope - cd_hab_sortie = ( - DB.session.execute( - select(Habref.cd_hab).where(and_(Habref.lb_code == lb_code, Habref.cd_typo == CB_typo)) - ) - .scalar_one() - ) + cd_hab_sortie = DB.session.execute( + select(Habref.cd_hab).where(and_(Habref.lb_code == lb_code, Habref.cd_typo == CB_typo)) + ).scalar_one() # get all cd_hab_entre corresponding to cd_hab_sortie q_cd_hab_entre = DB.session.scalars( select(CorespHab).where( @@ -96,8 +91,10 @@ def get_ch(lb_code): "lb_code": hab.lb_code, "lb_hab_fr": hab.lb_hab_fr, "priority": DB.session.execute( - select(CorChStatus.priority).where(CorChStatus.lb_code == hab.lb_code).distinct() - ).scalar_one() + select(CorChStatus.priority) + .where(CorChStatus.lb_code == hab.lb_code) + .distinct() + ).scalar_one(), } ) return ch @@ -138,26 +135,20 @@ def get_impact_list(): def get_impact_category(impact): # get mnemonique of id_impact_type if impact.CorImpactTypes.id_impact_type is not None: - return ( - DB.session.execute( - select(TNomenclatures.mnemonique).where( - TNomenclatures.id_nomenclature == impact.CorImpactTypes.id_impact_type - ) + return DB.session.execute( + select(TNomenclatures.mnemonique).where( + TNomenclatures.id_nomenclature == impact.CorImpactTypes.id_impact_type ) - .scalar_one() - ) + ).scalar_one() return "Aucun" def get_function_list(mnemo): try: # get id_type of mnemo (ex : 'FONCTIONS_HYDRO') in BibNomenclatureTypes - id_type_main_function = ( - DB.session.execute( - select(BibNomenclaturesTypes.id_type).where(BibNomenclaturesTypes.mnemonique == mnemo) - ) - .scalar_one() - ) + id_type_main_function = DB.session.execute( + select(BibNomenclaturesTypes.id_type).where(BibNomenclaturesTypes.mnemonique == mnemo) + ).scalar_one() # get list of TNomenclatures ids by id_type nomenclature_ids = [ @@ -193,12 +184,9 @@ def get_function_list(mnemo): def get_all_function_list(mnemo): try: # get id_type of mnemo (ex : 'FONCTIONS_HYDRO') in BibNomenclatureTypes - id_type_main_function = ( - DB.session.execute( - select(BibNomenclaturesTypes.id_type).where(BibNomenclaturesTypes.mnemonique == mnemo) - ) - .scalar_one() - ) + id_type_main_function = DB.session.execute( + select(BibNomenclaturesTypes.id_type).where(BibNomenclaturesTypes.mnemonique == mnemo) + ).scalar_one() # get list of TNomenclatures ids by id_type nomenclature_ids = [ @@ -258,15 +246,13 @@ def get_protections(): select(TNomenclatures.mnemonique).where( TNomenclatures.id_nomenclature == protection.id_protection_status ) - ) - .scalar_one(), + ).scalar_one(), "id_protection_level": protection.id_protection_level, "mnemonique_level": DB.session.execute( select(TNomenclatures.mnemonique).where( TNomenclatures.id_nomenclature == protection.id_protection_level ) - ) - .scalar_one(), + ).scalar_one(), "category": get_protection_category(protection), "category_id": protection.id_protection_type, } @@ -284,14 +270,11 @@ def get_protections(): def get_protection_category(protection): if protection.id_protection_type is not None: - return ( - DB.session.execute( - select(TNomenclatures.mnemonique).where( - TNomenclatures.id_nomenclature == protection.id_protection_type - ) + return DB.session.execute( + select(TNomenclatures.mnemonique).where( + TNomenclatures.id_nomenclature == protection.id_protection_type ) - .scalar_one() - ) + ).scalar_one() return "Autre" diff --git a/backend/gn_module_zh/upload.py b/backend/gn_module_zh/upload.py index cc4095c5..41585bbb 100644 --- a/backend/gn_module_zh/upload.py +++ b/backend/gn_module_zh/upload.py @@ -113,7 +113,9 @@ def upload(request, extensions, pdf_size, jpg_size, upload_path, module_name, id return { "file_name": get_file_path(id_media).name, "full_path": str(get_file_path(id_media)), - "media_path": DB.session.execute(select(TMedias.media_path).where(TMedias.id_media == id_media)).scalar_one(), + "media_path": DB.session.execute( + select(TMedias.media_path).where(TMedias.id_media == id_media) + ).scalar_one(), "extension": get_extension(get_file_path(id_media).name), } diff --git a/backend/gn_module_zh/utils.py b/backend/gn_module_zh/utils.py index c6534b66..d0efb7fb 100644 --- a/backend/gn_module_zh/utils.py +++ b/backend/gn_module_zh/utils.py @@ -19,9 +19,9 @@ def get_main_picture_id(id_zh, media_list=None): media_list(list): media_list of the zh to set the main_pict_id if not present """ - main_pict_id = ( - DB.session.execute(select(TZH.main_pict_id).where(TZH.id_zh == id_zh)).scalar_one() - ) + main_pict_id = DB.session.execute( + select(TZH.main_pict_id).where(TZH.id_zh == id_zh) + ).scalar_one() if main_pict_id is None and media_list is not None and len(media_list) > 0: id_media = media_list[0].id_media stmt = update(TZH).where(TZH.id_zh == id_zh).values(main_pict_id=id_media) @@ -47,7 +47,7 @@ def get_last_pdf_export(id_zh, last_date) -> Query: TMedias.id_nomenclature_media_type == TNomenclatures.id_nomenclature, TNomenclatures.mnemonique == "PDF", TMedias.meta_update_date > last_date, - TMedias.title_fr.like(f"{id_zh}_fiche%.pdf") + TMedias.title_fr.like(f"{id_zh}_fiche%.pdf"), ) ) return DB.session.execute(query).first() @@ -93,14 +93,12 @@ def delete_file(id_media): def check_ref_geo_schema(): try: - id_type_com = ( - DB.session.execute(select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "DEP")) - .scalar_one() - ) - id_type_dep = ( - DB.session.execute(select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "DEP")) - .scalar_one() - ) + id_type_com = DB.session.execute( + select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "DEP") + ).scalar_one() + id_type_dep = DB.session.execute( + select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "DEP") + ).scalar_one() n_com = DB.session.scalar(select(func.count()).where(LAreas.id_type == id_type_com)) n_dep = DB.session.scalar(select(func.count()).where(LAreas.id_type == id_type_dep)) if n_com == 0 or n_dep == 0: From 0cd9291e6f89d43cfc872ecfcbd8e748d30f9182 Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Thu, 18 Apr 2024 11:50:35 +0200 Subject: [PATCH 43/60] fix getattr error --- backend/gn_module_zh/hierarchy.py | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/backend/gn_module_zh/hierarchy.py b/backend/gn_module_zh/hierarchy.py index 73eeac80..1323abb9 100644 --- a/backend/gn_module_zh/hierarchy.py +++ b/backend/gn_module_zh/hierarchy.py @@ -109,18 +109,14 @@ def __get_cor_rule_id(self): DB.session.close() def __get_id_nomenc(self, id_type: int, cd_nomenc: str) -> int: - return getattr( - DB.session.scalars( - select(TNomenclatures).where( + return DB.session.scalars( + select(TNomenclatures.id_nomenclature).where( and_( TNomenclatures.id_type == id_type, TNomenclatures.cd_nomenclature == cd_nomenc, ) ) - ).first(), - "id_nomenclature", - None, - ) + ).first() def __get_nomencs(self, abb, cat=None): cat_id = self.__get_id_nomenc(self.__get_id_type("HIERARCHY"), cat) @@ -495,12 +491,9 @@ def __get_qualif_cat4_cat5(self): try: combination = self.__get_combination() # set qualif_id - qualif_id = getattr( - DB.session.scalars( - select(TCorQualif).where(TCorQualif.combination == combination) - ).first(), - "id_qualification", - ) + qualif_id = DB.session.scalars( + select(TCorQualif.id_qualification).where(TCorQualif.combination == combination) + ).first() return qualif_id except ZHApiError as e: raise ZHApiError( @@ -1206,9 +1199,10 @@ def get_denom(rb_id, col_name): rb_name = DB.session.execute( select(TRiverBasin.name).where(TRiverBasin.id_rb == rb_id) ).scalar_one() - return DB.session.execute( - select(RbNotesSummary.col_name).where(RbNotesSummary.bassin_versant == rb_name) - ).scalar_one() + return getattr( + DB.session.execute( + select(RbNotesSummary).where(RbNotesSummary.bassin_versant == rb_name) + ).scalar_one(), col_name) @staticmethod def get_str_note(note, denominator): From 03ab4c5a3a7a3849a844f633c0e1baa2878f9350 Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Tue, 21 May 2024 11:43:18 +0200 Subject: [PATCH 44/60] lint: adjust to last lint updates --- backend/gn_module_zh/blueprint.py | 8 ++------ backend/gn_module_zh/hierarchy.py | 26 ++++++++++++------------- backend/gn_module_zh/model/cards.py | 8 ++------ backend/gn_module_zh/model/zh_schema.py | 4 +--- 4 files changed, 18 insertions(+), 28 deletions(-) diff --git a/backend/gn_module_zh/blueprint.py b/backend/gn_module_zh/blueprint.py index b96a98a8..fb0b77c1 100644 --- a/backend/gn_module_zh/blueprint.py +++ b/backend/gn_module_zh/blueprint.py @@ -124,9 +124,7 @@ def get_zh(scope): def get_all_zh(info_role, query, limit, page, orderby=None, order="asc"): # try: # Pour obtenir le nombre de résultat de la requete sans le LIMIT - nb_results_without_limit = DB.session.scalar( - select(func.count()).select_from(query.subquery()) - ) + nb_results_without_limit = DB.session.scalar(select(func.count()).select_from(query.subquery())) user = info_role user_cruved = get_user_cruved() @@ -768,9 +766,7 @@ def deleteOneZh(id_zh): DB.session.execute(delete(CorZhRef).where(CorZhRef.id_zh == id_zh)) # delete criteres delim - id_lim_list = DB.session.execute( - select(TZH.id_lim_list).where(TZH.id_zh == id_zh) - ).scalar_one() + id_lim_list = DB.session.execute(select(TZH.id_lim_list).where(TZH.id_zh == id_zh)).scalar_one() DB.session.execute(delete(CorLimList).where(CorLimList.id_lim_list == id_lim_list)) # delete cor_zh_area diff --git a/backend/gn_module_zh/hierarchy.py b/backend/gn_module_zh/hierarchy.py index 1323abb9..d1a0de7a 100644 --- a/backend/gn_module_zh/hierarchy.py +++ b/backend/gn_module_zh/hierarchy.py @@ -110,13 +110,13 @@ def __get_cor_rule_id(self): def __get_id_nomenc(self, id_type: int, cd_nomenc: str) -> int: return DB.session.scalars( - select(TNomenclatures.id_nomenclature).where( - and_( - TNomenclatures.id_type == id_type, - TNomenclatures.cd_nomenclature == cd_nomenc, - ) + select(TNomenclatures.id_nomenclature).where( + and_( + TNomenclatures.id_type == id_type, + TNomenclatures.cd_nomenclature == cd_nomenc, ) - ).first() + ) + ).first() def __get_nomencs(self, abb, cat=None): cat_id = self.__get_id_nomenc(self.__get_id_type("HIERARCHY"), cat) @@ -492,8 +492,8 @@ def __get_qualif_cat4_cat5(self): combination = self.__get_combination() # set qualif_id qualif_id = DB.session.scalars( - select(TCorQualif.id_qualification).where(TCorQualif.combination == combination) - ).first() + select(TCorQualif.id_qualification).where(TCorQualif.combination == combination) + ).first() return qualif_id except ZHApiError as e: raise ZHApiError( @@ -870,9 +870,7 @@ def __get_rule_name(self): pass return ( DB.session.execute( - select(TRules, BibHierCategories) - .join(TRules) - .where(TRules.rule_id == self.rule_id) + select(TRules, BibHierCategories).join(TRules).where(TRules.rule_id == self.rule_id) ) .all()[0] .BibHierCategories.label.capitalize() @@ -1201,8 +1199,10 @@ def get_denom(rb_id, col_name): ).scalar_one() return getattr( DB.session.execute( - select(RbNotesSummary).where(RbNotesSummary.bassin_versant == rb_name) - ).scalar_one(), col_name) + select(RbNotesSummary).where(RbNotesSummary.bassin_versant == rb_name) + ).scalar_one(), + col_name, + ) @staticmethod def get_str_note(note, denominator): diff --git a/backend/gn_module_zh/model/cards.py b/backend/gn_module_zh/model/cards.py index 85ec29e2..1e4abd91 100644 --- a/backend/gn_module_zh/model/cards.py +++ b/backend/gn_module_zh/model/cards.py @@ -39,9 +39,7 @@ def get_mnemo(ids): ).scalar_one() return [ DB.session.execute( - select(TNomenclatures.label_default).where( - TNomenclatures.id_nomenclature == id - ) + select(TNomenclatures.label_default).where(TNomenclatures.id_nomenclature == id) ).scalar_one() for id in ids ] @@ -675,9 +673,7 @@ def other_ref_geo(self, ref_geo): for ref in CorZhArea.get_ref_geo_info(self.id_zh, id_types): for i in ref: type_code = DB.session.execute( - select(BibAreasTypes.type_code).where( - BibAreasTypes.id_type == i.LAreas.id_type - ) + select(BibAreasTypes.type_code).where(BibAreasTypes.id_type == i.LAreas.id_type) ).scalar_one() refs.append( { diff --git a/backend/gn_module_zh/model/zh_schema.py b/backend/gn_module_zh/model/zh_schema.py index 7c0a9fb4..ab2a8827 100644 --- a/backend/gn_module_zh/model/zh_schema.py +++ b/backend/gn_module_zh/model/zh_schema.py @@ -285,9 +285,7 @@ def get_zh_area_intersected(zh_area_type, id_zh_geom): ).all() if zh_area_type == "hydro_area": q = DB.session.scalars( - select(THydroArea).where( - THydroArea.geom.ST_Intersects(cast(id_zh_geom, Geography)) - ) + select(THydroArea).where(THydroArea.geom.ST_Intersects(cast(id_zh_geom, Geography))) ).all() if zh_area_type == "fct_area": q = DB.session.scalars( From d4f0864b52a48bdc0d6ea920e72caacd6765c6ae Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Mon, 27 May 2024 16:27:33 +0200 Subject: [PATCH 45/60] fix: adjust scalars and execute --- backend/gn_module_zh/blueprint.py | 22 ++++------ backend/gn_module_zh/model/cards.py | 52 +++++++++++------------- backend/gn_module_zh/model/code.py | 12 +++--- backend/gn_module_zh/model/zh_schema.py | 53 +++++++++++-------------- backend/gn_module_zh/nomenclatures.py | 46 ++++++++++----------- backend/gn_module_zh/search.py | 33 ++++++--------- backend/gn_module_zh/upload.py | 4 +- backend/gn_module_zh/utils.py | 15 ++++--- 8 files changed, 101 insertions(+), 136 deletions(-) diff --git a/backend/gn_module_zh/blueprint.py b/backend/gn_module_zh/blueprint.py index fb0b77c1..57b20e21 100644 --- a/backend/gn_module_zh/blueprint.py +++ b/backend/gn_module_zh/blueprint.py @@ -337,7 +337,7 @@ def get_pbf(): SELECT ST_AsGeobuf(q, 'geom') as pbf FROM (SELECT id_zh, geom from pr_zh.t_zh tz) AS q; """ - row = DB.session.execute(sql).first() + row = DB.session.execute(text(sql)).first() return Response(bytes(row["pbf"]) if row["pbf"] else bytes(), mimetype="application/protobuf") @@ -364,7 +364,7 @@ def get_pbf_complete(): 'bassin_versant', tz.bassin_versant) as json_arrays FROM pr_zh.atlas_app tz) AS q; """ - row = DB.session.execute(text(sql).limit(1)).first() + row = DB.session.execute(text(sql)).first() return Response(bytes(row["pbf"]) if row["pbf"] else bytes(), mimetype="application/protobuf") @@ -384,7 +384,7 @@ def get_json(): ) AS feature FROM (SELECT * FROM pr_zh.atlas_app tz) inputs) features; """ - row = DB.session.execute(text(sql).limit(1)).first() + row = DB.session.execute(text(sql)).first() return row["geojson"] @@ -457,7 +457,7 @@ def get_file_list(id_zh): """get a list of the zh files contained in static repo""" try: # FIXME: to optimize... See relationships and lazy join with sqlalchemy - zh_uuid = DB.session.execute(select(TZH.zh_uuid).where(TZH.id_zh == id_zh)).scalar_one() + zh_uuid = DB.session.scalar(select(TZH.zh_uuid).where(TZH.id_zh == id_zh)) q_medias = DB.session.execute( select(TMedias, TNomenclatures.label_default) .join( @@ -558,8 +558,7 @@ def get_all_photos(id_zh: int): TNomenclatures.id_nomenclature == TMedias.id_nomenclature_media_type, ) .order_by(TMedias.meta_update_date.desc()) - .where(TNomenclatures.label_default == "Photo") - .where(TZH.id_zh == id_zh) + .where(TNomenclatures.label_default == "Photo", TZH.id_zh == id_zh) ).all() api_uri = urljoin( f"{config['API_ENDPOINT']}/", @@ -799,7 +798,7 @@ def write_csv(id_zh): names = [] FILE_PATH = blueprint.config["file_path"] MODULE_NAME = blueprint.config["MODULE_CODE"].lower() - zh_code = DB.session.execute(select(TZH.code).where(TZH.id_zh == id_zh)).scalar_one() + zh_code = DB.session.scalar(select(TZH.code).where(TZH.id_zh == id_zh)) # author name user = DB.session.execute( select(User).where(User.id_role == g.current_user.id_role) @@ -959,11 +958,7 @@ def get_area_from_department() -> dict: @blueprint.route("/bassins", methods=["GET"]) @json_resp def bassins(): - query = ( - select(TRiverBasin) - .with_only_columns(TRiverBasin.id_rb, TRiverBasin.name) - .order_by(TRiverBasin.name) - ) + query = select(TRiverBasin.id_rb, TRiverBasin.name).order_by(TRiverBasin.name) resp = DB.session.execute(query).all() return [{"code": r.id_rb, "name": r.name} for r in resp] @@ -974,8 +969,7 @@ def get_hydro_zones_from_bassin() -> dict: code = request.json.get("code") if code: query = ( - select(THydroArea) - .with_only_columns(THydroArea.id_hydro, THydroArea.name, TRiverBasin.id_rb) + select(THydroArea.id_hydro, THydroArea.name, TRiverBasin.id_rb) .where(TRiverBasin.id_rb == code) .join( TRiverBasin, diff --git a/backend/gn_module_zh/model/cards.py b/backend/gn_module_zh/model/cards.py index 1e4abd91..795b5e19 100644 --- a/backend/gn_module_zh/model/cards.py +++ b/backend/gn_module_zh/model/cards.py @@ -32,15 +32,15 @@ class Utils(ZH): def get_mnemo(ids): if ids: if type(ids) is int: - return DB.session.execute( + return DB.session.scalar( select(TNomenclatures.label_default).where( TNomenclatures.id_nomenclature == ids ) - ).scalar_one() + ) return [ - DB.session.execute( + DB.session.scalar( select(TNomenclatures.label_default).where(TNomenclatures.id_nomenclature == id) - ).scalar_one() + ) for id in ids ] return [] @@ -495,23 +495,23 @@ def __str__(self): "hydros": self.hydro_zones, } + # TODO: replace in "where with multiples conditions" the coma by AND def __get_river_basins(self): return [ name - for (name,) in DB.session.execute( - select(TRiverBasin.name) - .where(TRiverBasin.id_rb == CorZhRb.id_rb) - .where(CorZhRb.id_zh == self.id_zh) + for name in DB.session.execute( + select(TRiverBasin.name).where( + TRiverBasin.id_rb == CorZhRb.id_rb, CorZhRb.id_zh == self.id_zh + ) ).all() ] def __get_hydro_zones(self): return [ name - for (name,) in DB.session.execute( + for name in DB.session.execute( select(THydroArea.name) - .where(THydroArea.id_hydro == CorZhHydro.id_hydro) - .where(CorZhHydro.id_zh == self.id_zh) + .where(THydroArea.id_hydro == CorZhHydro.id_hydro, CorZhHydro.id_zh == self.id_zh) .distinct() ).all() ] @@ -670,16 +670,14 @@ def instruments(self, instruments): def other_ref_geo(self, ref_geo): id_types = CorZhArea.get_id_types_ref_geo(self.id_zh, ref_geo) refs = [] - for ref in CorZhArea.get_ref_geo_info(self.id_zh, id_types): - for i in ref: - type_code = DB.session.execute( - select(BibAreasTypes.type_code).where(BibAreasTypes.id_type == i.LAreas.id_type) - ).scalar_one() + for ref_infos in CorZhArea.get_ref_geo_info(self.id_zh, id_types): + for info in ref_infos: + type_code = DB.session.get(BibAreasTypes, info.LAreas.id_type) refs.append( { - "area_name": i.LAreas.area_name, - "area_code": i.LAreas.area_code, - "url": i.LAreas.source, + "area_name": info.LAreas.area_name, + "area_code": info.LAreas.area_code, + "url": info.LAreas.source, "type_code": type_code, "zh_type_name": [ ref["zh_name"] @@ -770,9 +768,9 @@ def set_management(self, id_org, plans): def __str__(self): return { - "structure": DB.session.execute( + "structure": DB.session.scalar( select(BibOrganismes.name).where(BibOrganismes.id_org == self.id_org) - ).scalar_one(), + ), "plans": [plan.__str__() for plan in self.plans], } @@ -811,17 +809,15 @@ def __init__(self, id_area, id_doc_type, id_cors, remark): def __str__(self): return { - "commune": DB.session.execute( - select(LAreas.area_name).where(LAreas.id_area == self.id_area) - ).scalar_one(), + "commune": DB.session.get(LAreas, self.id_area), "type_doc": Utils.get_mnemo(self.id_doc_type), "type_classement": [ Utils.get_mnemo( - DB.session.execute( + DB.session.scalar( select(CorUrbanTypeRange.id_range_type).where( CorUrbanTypeRange.id_cor == id ) - ).scalar_one() + ) ) for id in self.id_cors ], @@ -1001,9 +997,7 @@ def __init__(self, id_action, id_priority_level, remark): def __str__(self): return { - "proposition": DB.session.execute( - select(BibActions.name).where(BibActions.id_action == self.id_action) - ).scalar_one(), + "proposition": DB.session.get(BibActions, self.id_action).name, "niveau": Utils.get_mnemo(self.id_priority_level), "remarque": Utils.get_string(self.remark), } diff --git a/backend/gn_module_zh/model/code.py b/backend/gn_module_zh/model/code.py index 3189f1d1..6cea6918 100644 --- a/backend/gn_module_zh/model/code.py +++ b/backend/gn_module_zh/model/code.py @@ -25,13 +25,11 @@ def get_departments(self): ).scalar_one() main_dep = None for dep in departments: - if ( - DB.session.scalar(select(dep.LAreas.geom.ST_Intersection(my_geom).ST_Area())) - > area - ): - area = DB.session.scalar( - select(dep.LAreas.geom.ST_Intersection(my_geom).ST_Area()) - ) + dep_area = DB.session.scalar( + select(dep.LAreas.geom.ST_Intersection(my_geom).ST_Area()) + ) + if dep_area > area: + area = dep_area main_dep = dep.LAreas.area_code if main_dep is None: raise ZHApiError(message="no_department", details="main_dep value is none") diff --git a/backend/gn_module_zh/model/zh_schema.py b/backend/gn_module_zh/model/zh_schema.py index ab2a8827..8953de87 100644 --- a/backend/gn_module_zh/model/zh_schema.py +++ b/backend/gn_module_zh/model/zh_schema.py @@ -267,13 +267,11 @@ def get_geofeature(self, recursif=True, relationships=()): @staticmethod def get_site_space_name(id): - return DB.session.execute( - select(BibSiteSpace.name).where(BibSiteSpace.id_site_space == id) - ).scalar_one() + return DB.session.scalar(select(BibSiteSpace.name).where(BibSiteSpace.id_site_space == id)) @staticmethod def get_tzh_by_id(id): - return DB.session.execute(select(TZH).where(TZH.id_zh == id)).scalar_one() + return DB.session.scalar(select(TZH).where(TZH.id_zh == id)) @staticmethod def get_zh_area_intersected(zh_area_type, id_zh_geom): @@ -308,10 +306,10 @@ def delims(self): def bassin_versant(self): bassin_versant = [ name - for (name,) in DB.session.execute( - select(TRiverBasin.name) - .where(TRiverBasin.id_rb == CorZhRb.id_rb) - .where(CorZhRb.id_zh == self.id_zh) + for name in DB.session.execute( + select(TRiverBasin.name).where( + TRiverBasin.id_rb == CorZhRb.id_rb, CorZhRb.id_zh == self.id_zh + ) ).all() ] return ", ".join([str(item) for item in bassin_versant]) @@ -361,11 +359,11 @@ def get_id_types_ref_geo(id_zh, ref_geo_config): for ref in ref_geo_config: if ref["active"]: ids.append( - DB.session.execute( + DB.session.scalar( select(BibAreasTypes.id_type).where( BibAreasTypes.type_code == ref["type_code_ref_geo"] ) - ).scalar_one() + ) ) return ids @@ -598,8 +596,7 @@ def get_functions(nomenc_ids): return DB.session.execute( select(CorMainFct, TNomenclatures) .join(TNomenclatures, TNomenclatures.id_nomenclature == CorMainFct.id_function) - .where(CorMainFct.active) - .where(CorMainFct.id_function.in_(nomenc_ids)) + .where(CorMainFct.active, CorMainFct.id_function.in_(nomenc_ids)) ).all() @staticmethod @@ -619,7 +616,7 @@ def get_main_function_list(ids): @staticmethod def get_function_by_main_function(id_main): - # méthode utilisée ? + # TODO: méthode utilisée ? return DB.session.execute( select(CorMainFct, TNomenclatures) .join(TNomenclatures, TNomenclatures.id_nomenclature == CorMainFct.id_function) @@ -628,12 +625,11 @@ def get_function_by_main_function(id_main): @staticmethod def get_mnemo_type(id_type): - # methode utilisée ? + # TODO: methode utilisée ? if id_type: - test = "test" - return DB.session.execute( + return DB.session.scalar( select(TNomenclatures).where(TNomenclatures.id_nomenclature == id_type) - ).scalar_one() + ) else: return "" @@ -666,13 +662,9 @@ class CorImpactList(DB.Model): @staticmethod def get_impacts_by_uuid(uuid_activity): - return ( - DB.session.execute( - select(CorImpactList).where(CorImpactList.id_impact_list == uuid_activity) - ) - .scalars() - .all() - ) + return DB.session.scalars( + select(CorImpactList).where(CorImpactList.id_impact_list == uuid_activity) + ).all() class TActivity(DB.Model): @@ -753,10 +745,11 @@ def get_functions_by_id_and_category(id_zh, category, is_eval=False): ] return DB.session.scalars( - select(TFunctions) - .where(TFunctions.id_zh == id_zh) - .where(TFunctions.id_function.in_(function_ids)) - .where(TFunctions.id_qualification.in_(qualif_ids)) + select(TFunctions).where( + TFunctions.id_zh == id_zh, + TFunctions.id_function.in_(function_ids), + TFunctions.id_qualification.in_(qualif_ids), + ) ).all() @@ -792,11 +785,11 @@ def get_range_by_doc(doc_id): { "id_cor": range.id_cor, "id_nomenclature": range.id_range_type, - "mnemonique": DB.session.execute( + "mnemonique": DB.session.scalar( select(TNomenclatures.mnemonique).where( TNomenclatures.id_nomenclature == range.id_range_type ) - ).scalar_one(), + ), } ) return ranges diff --git a/backend/gn_module_zh/nomenclatures.py b/backend/gn_module_zh/nomenclatures.py index f564b7fa..38f0491a 100644 --- a/backend/gn_module_zh/nomenclatures.py +++ b/backend/gn_module_zh/nomenclatures.py @@ -62,16 +62,14 @@ def get_corine_biotope(): def get_ch(lb_code): try: - CH_typo = DB.session.execute( - select(TypoRef.cd_typo).where(TypoRef.cd_table == "TYPO_CH") - ).scalar_one() - CB_typo = DB.session.execute( + CH_typo = DB.session.scalar(select(TypoRef.cd_typo).where(TypoRef.cd_table == "TYPO_CH")) + CB_typo = DB.session.scalar( select(TypoRef.cd_typo).where(TypoRef.cd_table == "TYPO_CORINE_BIOTOPES") - ).scalar_one() + ) # get cd_hab_sortie list from lb_code of selected Corine Biotope - cd_hab_sortie = DB.session.execute( + cd_hab_sortie = DB.session.scalar( select(Habref.cd_hab).where(and_(Habref.lb_code == lb_code, Habref.cd_typo == CB_typo)) - ).scalar_one() + ) # get all cd_hab_entre corresponding to cd_hab_sortie q_cd_hab_entre = DB.session.scalars( select(CorespHab).where( @@ -81,20 +79,18 @@ def get_ch(lb_code): # get list of cd_hab_entre/lb_code/lb_hab_fr for each cahier habitat ch = [] for q in q_cd_hab_entre: - hab = DB.session.execute( - select(Habref).where(Habref.cd_hab == q.cd_hab_entre) - ).scalar_one() + hab = DB.session.scalar(select(Habref).where(Habref.cd_hab == q.cd_hab_entre)) ch.append( { "cd_hab": q.cd_hab_entre, "front_name": hab.lb_code + " - " + hab.lb_hab_fr, "lb_code": hab.lb_code, "lb_hab_fr": hab.lb_hab_fr, - "priority": DB.session.execute( + "priority": DB.session.scalar( select(CorChStatus.priority) .where(CorChStatus.lb_code == hab.lb_code) .distinct() - ).scalar_one(), + ), } ) return ch @@ -135,20 +131,20 @@ def get_impact_list(): def get_impact_category(impact): # get mnemonique of id_impact_type if impact.CorImpactTypes.id_impact_type is not None: - return DB.session.execute( + return DB.session.scalar( select(TNomenclatures.mnemonique).where( TNomenclatures.id_nomenclature == impact.CorImpactTypes.id_impact_type ) - ).scalar_one() + ) return "Aucun" def get_function_list(mnemo): try: # get id_type of mnemo (ex : 'FONCTIONS_HYDRO') in BibNomenclatureTypes - id_type_main_function = DB.session.execute( + id_type_main_function = DB.session.scalar( select(BibNomenclaturesTypes.id_type).where(BibNomenclaturesTypes.mnemonique == mnemo) - ).scalar_one() + ) # get list of TNomenclatures ids by id_type nomenclature_ids = [ @@ -163,13 +159,11 @@ def get_function_list(mnemo): "id_nomenclature": function.CorMainFct.id_function, "mnemonique": function.TNomenclatures.mnemonique, "id_category": function.CorMainFct.id_main_function, - "category": DB.session.execute( + "category": DB.session.scalar( select(TNomenclatures.mnemonique).where( TNomenclatures.id_nomenclature == function.CorMainFct.id_main_function ) - ) - .scalar_one() - .upper(), + ).upper(), } for function in CorMainFct.get_functions(nomenclature_ids) ] @@ -242,17 +236,17 @@ def get_protections(): return [ { "id_protection_status": protection.id_protection_status, - "mnemonique_status": DB.session.execute( + "mnemonique_status": DB.session.scalar( select(TNomenclatures.mnemonique).where( TNomenclatures.id_nomenclature == protection.id_protection_status ) - ).scalar_one(), + ), "id_protection_level": protection.id_protection_level, - "mnemonique_level": DB.session.execute( + "mnemonique_level": DB.session.scalar( select(TNomenclatures.mnemonique).where( TNomenclatures.id_nomenclature == protection.id_protection_level ) - ).scalar_one(), + ), "category": get_protection_category(protection), "category_id": protection.id_protection_type, } @@ -270,11 +264,11 @@ def get_protections(): def get_protection_category(protection): if protection.id_protection_type is not None: - return DB.session.execute( + return DB.session.scalar( select(TNomenclatures.mnemonique).where( TNomenclatures.id_nomenclature == protection.id_protection_type ) - ).scalar_one() + ) return "Autre" diff --git a/backend/gn_module_zh/search.py b/backend/gn_module_zh/search.py index ee2a7b14..12d45ee9 100644 --- a/backend/gn_module_zh/search.py +++ b/backend/gn_module_zh/search.py @@ -160,11 +160,9 @@ def filter_area(query, json: dict, type_code: str): # Filter on departments subquery = ( - select(LAreas) - .with_only_columns(LAreas.area_name, LAreas.geom, LAreas.id_type, BibAreasTypes.type_code) + select(LAreas.area_name, LAreas.geom, LAreas.id_type, BibAreasTypes.type_code) .join(BibAreasTypes, LAreas.id_type == BibAreasTypes.id_type) - .where(BibAreasTypes.type_code == type_code) - .where(LAreas.area_code.in_(codes)) + .where(BibAreasTypes.type_code == type_code, LAreas.area_code.in_(codes)) .subquery() ) @@ -182,8 +180,7 @@ def filter_hydro(query, json): if codes and all(code is not None for code in codes): subquery = ( - select(THydroArea) - .with_only_columns(THydroArea.id_hydro, THydroArea.geom) + select(THydroArea.id_hydro, THydroArea.geom) .where(THydroArea.id_hydro.in_(codes)) .subquery() ) @@ -201,8 +198,7 @@ def filter_basin(query, json): if codes is not None: subquery = ( - select(TRiverBasin) - .with_only_columns( + select( TRiverBasin.id_rb, TRiverBasin.geom, ) @@ -234,8 +230,8 @@ def filter_fct(query, json: dict, type_: str): ids_conn = [f.get("id_nomenclature") for f in json.get("connaissances", [])] subquery = ( - select(TFunctions.id_zh) - .with_only_columns( + # TODO: be careful with this. To be verified + select( TFunctions.id_zh, TFunctions.id_function, TFunctions.id_qualification, @@ -267,10 +263,8 @@ def filter_statuts(query, json: dict): ids_statuts = [f.get("id_nomenclature") for f in json.get("statuts", [])] if ids_statuts: - subquery = ( - select(TOwnership.id_zh) - .with_only_columns(TOwnership.id_zh, TOwnership.id_status) - .where(TOwnership.id_status.in_(ids_statuts)) + subquery = select(TOwnership.id_zh, TOwnership.id_status).where( + TOwnership.id_status.in_(ids_statuts) ) query = query.where(TZH.id_zh == subquery.subquery().c.id_zh).distinct() @@ -282,8 +276,7 @@ def filter_plans(query, json: dict): if ids_plans and all(id_ is not None for id_ in ids_plans): subquery = ( - select(TManagementStructures.id_zh) - .with_only_columns( + select( TManagementPlans.id_nature, TManagementPlans.id_structure, TManagementStructures.id_structure, @@ -509,10 +502,10 @@ def generate_attributes_subquery(attributes: list): # TODO: see if all of these are usefull... Are cor_rule_id with note sufficient? subquery = ( - subquery.where(CorZhNotes.attribute_id.in_(attribute_ids)) - .where(CorZhNotes.note_type_id.in_(note_type_ids)) - .where(CorZhNotes.cor_rule_id.in_(cor_rule_ids)) - .where(CorZhNotes.note.in_(notes)) + subquery.where(CorZhNotes.attribute_id.in_(attribute_ids), + CorZhNotes.note_type_id.in_(note_type_ids), + CorZhNotes.cor_rule_id.in_(cor_rule_ids), + CorZhNotes.note.in_(notes)) ) return subquery.subquery() diff --git a/backend/gn_module_zh/upload.py b/backend/gn_module_zh/upload.py index 41585bbb..f9ab229a 100644 --- a/backend/gn_module_zh/upload.py +++ b/backend/gn_module_zh/upload.py @@ -113,9 +113,9 @@ def upload(request, extensions, pdf_size, jpg_size, upload_path, module_name, id return { "file_name": get_file_path(id_media).name, "full_path": str(get_file_path(id_media)), - "media_path": DB.session.execute( + "media_path": DB.session.scalar( select(TMedias.media_path).where(TMedias.id_media == id_media) - ).scalar_one(), + ), "extension": get_extension(get_file_path(id_media).name), } diff --git a/backend/gn_module_zh/utils.py b/backend/gn_module_zh/utils.py index d0efb7fb..7379bd4d 100644 --- a/backend/gn_module_zh/utils.py +++ b/backend/gn_module_zh/utils.py @@ -19,9 +19,7 @@ def get_main_picture_id(id_zh, media_list=None): media_list(list): media_list of the zh to set the main_pict_id if not present """ - main_pict_id = DB.session.execute( - select(TZH.main_pict_id).where(TZH.id_zh == id_zh) - ).scalar_one() + main_pict_id = DB.session.scalar(select(TZH.main_pict_id).where(TZH.id_zh == id_zh)) if main_pict_id is None and media_list is not None and len(media_list) > 0: id_media = media_list[0].id_media stmt = update(TZH).where(TZH.id_zh == id_zh).values(main_pict_id=id_media) @@ -38,6 +36,7 @@ def get_last_pdf_export(id_zh, last_date) -> Query: """ # TODO: Add with entities ? # Need to have do a separate query instead of reusing get_medias... + # TODO : compare efficiency with or without join query = ( select(TZH, TMedias, TNomenclatures) .with_only_columns(TMedias.id_media) @@ -93,12 +92,12 @@ def delete_file(id_media): def check_ref_geo_schema(): try: - id_type_com = DB.session.execute( - select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "DEP") - ).scalar_one() - id_type_dep = DB.session.execute( + id_type_com = DB.session.scalar( + select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "COM") + ) + id_type_dep = DB.session.scalar( select(BibAreasTypes.id_type).where(BibAreasTypes.type_code == "DEP") - ).scalar_one() + ) n_com = DB.session.scalar(select(func.count()).where(LAreas.id_type == id_type_com)) n_dep = DB.session.scalar(select(func.count()).where(LAreas.id_type == id_type_dep)) if n_com == 0 or n_dep == 0: From ed71d7c93da7ef2e9c78eb924374f1bef724a0c4 Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Mon, 27 May 2024 16:55:19 +0200 Subject: [PATCH 46/60] fix: update geometry --- backend/gn_module_zh/geometry.py | 45 +++++++++++++++----------------- backend/gn_module_zh/search.py | 6 ++--- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/backend/gn_module_zh/geometry.py b/backend/gn_module_zh/geometry.py index cc2d748e..b8c92d1c 100644 --- a/backend/gn_module_zh/geometry.py +++ b/backend/gn_module_zh/geometry.py @@ -2,6 +2,7 @@ from geoalchemy2.shape import to_shape from geonature.utils.env import DB +from sqlalchemy import func from sqlalchemy.sql import select, func from werkzeug.exceptions import BadRequest @@ -15,11 +16,7 @@ def set_geom(geometry, id_zh=None): if not id_zh: id_zh = 0 # SetSRID for POSTGIS < 3.0 compat - # select only already existing ZH geometries which intersect with the new ZH geometry - # polygon = DB.session.execute( - # select(func.ST_SetSRID(func.ST_GeomFromGeoJSON(str(geometry)), 4326)) - # ).scalar_one() q_zh = DB.session.scalars( select(TZH) .where( @@ -28,7 +25,8 @@ def set_geom(geometry, id_zh=None): func.ST_GeogFromWKB(func.ST_AsEWKB(str(geometry))), ) ) - .where(func.ST_Touches( + .where( + func.ST_Touches( func.ST_GeomFromWKB(func.ST_AsEWKB(TZH.geom), 4326), func.ST_GeomFromWKB(func.ST_AsEWKB(str(geometry)), 4326), ) @@ -36,8 +34,10 @@ def set_geom(geometry, id_zh=None): ) ).all() - is_intersected = False + polygon = DB.session.scalar( + select(func.ST_SetSRID(func.ST_GeomFromGeoJSON(str(geometry)), 4326)) + ) for zh in q_zh: if zh.id_zh != id_zh: zh_geom = DB.session.scalar(select(func.ST_GeogFromWKB(func.ST_AsEWKB(zh.geom)))) @@ -46,18 +46,19 @@ def set_geom(geometry, id_zh=None): ) if DB.session.scalar(select(func.ST_Intersects(polygon_geom, zh_geom))): if DB.session.scalar( - func.ST_GeometryType(func.ST_Intersection(zh_geom, polygon_geom, 0.1)) - ) not in ["ST_LineString", "ST_MultiLineString"]: + select(func.ST_GeometryType(func.ST_Intersection(zh_geom, polygon_geom, 0.1))) + ) not in ["ST_LineString", "ST_MultiLineString"]: is_intersected = True if DB.session.scalar( - func.ST_Contains( - zh_geom, - polygon_geom, - + select( + func.ST_Contains( + zh_geom, + polygon_geom, + ) ) ): raise BadRequest("La ZH est entièrement dans une ZH existante") - # TODO: not detected if contained entirely in 2 or more ZH polygons + # TODO: not detected if contained entirely in 2 or more ZH polygons polygon = DB.session.scalar(select(func.ST_Difference(polygon_geom, zh_geom))) return {"polygon": polygon, "is_intersected": is_intersected} @@ -79,20 +80,16 @@ def get_main_rb(query: list) -> int: rb_id = None area = 0 for q_ in query: - zh_polygon = ( - DB.session.execute(select(TZH.geom).where(TZH.id_zh == getattr(q_, "id_zh"))) - .first() - .geom + zh_polygon = DB.session.execute( + select(TZH.geom).where(TZH.id_zh == getattr(q_, "id_zh")).first() ) - rb_polygon = ( - DB.session.execute( - select(CorZhRb, TRiverBasin) - .join(TRiverBasin, TRiverBasin.id_rb == CorZhRb.id_rb) - .where(TRiverBasin.id_rb == getattr(q_, "id_rb")) - ) + rb_polygon = DB.session.execute( + select(TRiverBasin.geom) + .join(TRiverBasin, TRiverBasin.id_rb == CorZhRb.id_rb) + .where(TRiverBasin.id_rb == getattr(q_, "id_rb")) .first() - .TRiverBasin.geom ) + intersection = DB.session.scalar( select( func.ST_Intersection( diff --git a/backend/gn_module_zh/search.py b/backend/gn_module_zh/search.py index 12d45ee9..c686c7eb 100644 --- a/backend/gn_module_zh/search.py +++ b/backend/gn_module_zh/search.py @@ -501,11 +501,11 @@ def generate_attributes_subquery(attributes: list): notes.append(attribute["note"]) # TODO: see if all of these are usefull... Are cor_rule_id with note sufficient? - subquery = ( - subquery.where(CorZhNotes.attribute_id.in_(attribute_ids), + subquery = subquery.where( + CorZhNotes.attribute_id.in_(attribute_ids), CorZhNotes.note_type_id.in_(note_type_ids), CorZhNotes.cor_rule_id.in_(cor_rule_ids), - CorZhNotes.note.in_(notes)) + CorZhNotes.note.in_(notes), ) return subquery.subquery() From 60480a81c3a13fd57b9fd153c9b82d5889e2ce22 Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Wed, 29 May 2024 14:11:17 +0200 Subject: [PATCH 47/60] fix: close drawer by default --- frontend/app/zh-map-list/zh-map-list.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/app/zh-map-list/zh-map-list.component.html b/frontend/app/zh-map-list/zh-map-list.component.html index 7d64c670..646790b7 100644 --- a/frontend/app/zh-map-list/zh-map-list.component.html +++ b/frontend/app/zh-map-list/zh-map-list.component.html @@ -1,6 +1,6 @@
- + Date: Fri, 5 Apr 2024 12:36:50 +0200 Subject: [PATCH 48/60] temporary fix for bug of negative limit --- backend/gn_module_zh/blueprint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/gn_module_zh/blueprint.py b/backend/gn_module_zh/blueprint.py index 57b20e21..6524f209 100644 --- a/backend/gn_module_zh/blueprint.py +++ b/backend/gn_module_zh/blueprint.py @@ -810,7 +810,7 @@ def write_csv(id_zh): tableName=blueprint.config[i]["table_name"], schemaName=blueprint.config[i]["schema_name"], filters={"id_zh": id_zh, "orderby": "id_zh"}, - limit=100, + limit=100000, ) results = query.return_query().get("items", []) current_date = dt.now() From dff73ca4274c209881f2f77fad9f06477c820750 Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Tue, 9 Apr 2024 21:56:08 +0200 Subject: [PATCH 49/60] fix: taxon list as a MV instead of a view Request has poor performance with a simple view: time out when db contains multiple zh and taxons. Use of MV improves perf --- backend/gn_module_zh/blueprint.py | 1 + backend/gn_module_zh/conf_schema_toml.py | 6 +- .../c0c4748a597a_create_vm_taxons.py | 596 ++++++++++++++++++ .../data/script_create_taxon_view.sh | 2 +- 4 files changed, 601 insertions(+), 4 deletions(-) create mode 100644 backend/gn_module_zh/migrations/c0c4748a597a_create_vm_taxons.py diff --git a/backend/gn_module_zh/blueprint.py b/backend/gn_module_zh/blueprint.py index 6524f209..24af5fbd 100644 --- a/backend/gn_module_zh/blueprint.py +++ b/backend/gn_module_zh/blueprint.py @@ -812,6 +812,7 @@ def write_csv(id_zh): filters={"id_zh": id_zh, "orderby": "id_zh"}, limit=100000, ) + # TODO: change for limit=-1 when the next version of Utils-Flask-SQLAlchemy will be released results = query.return_query().get("items", []) current_date = dt.now() if results: diff --git a/backend/gn_module_zh/conf_schema_toml.py b/backend/gn_module_zh/conf_schema_toml.py index b99b5e7c..45a7df36 100644 --- a/backend/gn_module_zh/conf_schema_toml.py +++ b/backend/gn_module_zh/conf_schema_toml.py @@ -103,17 +103,17 @@ class MapListConfig(Schema): vertebrates_view_name = { "schema_name": "pr_zh", - "table_name": "vertebrates", + "table_name": "vm_vertebrates", "category": "vertebrates", } invertebrates_view_name = { "schema_name": "pr_zh", - "table_name": "invertebrates", + "table_name": "vm_invertebrates", "category": "invertebrates", } -flora_view_name = {"schema_name": "pr_zh", "table_name": "flora", "category": "flora"} +flora_view_name = {"schema_name": "pr_zh", "table_name": "vm_flora", "category": "flora"} # Name of the source of species data (tab5) species_source_name = "GeoNature" diff --git a/backend/gn_module_zh/migrations/c0c4748a597a_create_vm_taxons.py b/backend/gn_module_zh/migrations/c0c4748a597a_create_vm_taxons.py new file mode 100644 index 00000000..0b9cd9b0 --- /dev/null +++ b/backend/gn_module_zh/migrations/c0c4748a597a_create_vm_taxons.py @@ -0,0 +1,596 @@ +"""create_vm_taxons + +Revision ID: c0c4748a597a +Revises: 510677623a13 +Create Date: 2024-04-09 15:30:20.522477 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'c0c4748a597a' +down_revision = '510677623a13' +branch_labels = None +depends_on = None + + +def upgrade(): + op.execute( + """ + DROP VIEW IF EXISTS pr_zh.vertebrates; + DROP VIEW IF EXISTS pr_zh.invertebrates; + DROP VIEW IF EXISTS pr_zh.flora; + + CREATE MATERIALIZED VIEW pr_zh.vm_vertebrates AS + WITH + synthese_taxa AS ( + SELECT + synthese.id_synthese, + ( + SELECT t_zh.id_zh + FROM pr_zh.t_zh + WHERE st_intersects(st_setsrid(t_zh.geom, 4326), st_setsrid(synthese.the_geom_point, 4326)) + ) AS id_zh, + synthese.cd_nom, + synthese.date_max, + synthese.observers, + ( + SELECT organisme + FROM utilisateurs.v_userslist_forall_applications + WHERE nom_role || ' ' || prenom_role = synthese.observers limit 1 + ) + FROM gn_synthese.synthese + ), + synthese_zh AS ( + SELECT DISTINCT ON (id_zh, cd_nom) * + FROM synthese_taxa + WHERE id_zh IS NOT null + ORDER BY id_zh, cd_nom, date_max DESC + ), + bdc_statut AS ( + SELECT + cd_nom, + cd_sig, + regroupement_type AS statut_type, + lb_type_statut || ' - ' || label_statut AS statut, + full_citation AS article, + doc_url AS doc_url + FROM taxonomie.bdc_statut + WHERE ( + regroupement_type = 'Liste rouge' + AND code_statut IN ('VU', 'EN', 'CR') + ) + OR ( + regroupement_type IN ('ZNIEFF', 'Réglementation', 'Protection', 'Directives européennes') + ) + ) + + SELECT + synthese_zh.id_zh, + taxref.cd_nom, + taxref.classe AS group_class, + taxref.ordre AS group_order, + taxref.nom_complet AS scientific_name, + taxref.nom_vern AS vernac_name, + bdc_statut.statut_type AS statut_type, + bdc_statut.statut AS statut, + bdc_statut.article AS article, + bdc_statut.doc_url AS doc_url, + synthese_zh.date_max AS last_date, + synthese_zh.observers AS observer, + synthese_zh.organisme AS organisme, + (select count(cd_nom) from synthese_taxa where id_zh = synthese_zh.id_zh and cd_nom = taxref.cd_nom)::integer AS obs_nb + FROM synthese_zh + LEFT JOIN taxonomie.taxref taxref ON synthese_zh.cd_nom = taxref.cd_nom + LEFT JOIN bdc_statut ON bdc_statut.cd_nom = taxref.cd_nom + WHERE synthese_zh.id_zh IS NOT NULL + AND (synthese_zh.date_max::timestamp > (NOW()::timestamp - interval '20 years')) + AND taxref.phylum = 'Chordata' + AND ( + bdc_statut.cd_sig = 'ETATFRA' + OR bdc_statut.cd_sig IN + ( + SELECT + DISTINCT('INSEER' || lim.insee_reg) AS cd_sig + FROM pr_zh.t_zh tzh + LEFT JOIN pr_zh.cor_zh_area cza ON cza.id_zh = tzh.id_zh + LEFT JOIN ref_geo.l_areas lareas ON cza.id_area = lareas.id_area + LEFT JOIN ref_geo.li_municipalities lim ON lim.id_area = lareas.id_area + WHERE tzh.id_zh = synthese_zh.id_zh + AND lim.insee_reg IS NOT NULL + ) + OR bdc_statut.cd_sig IN + ( + SELECT + DISTINCT('INSEED' || lareas.area_code) AS cd_sig + FROM pr_zh.t_zh tzh + LEFT JOIN pr_zh.cor_zh_area cza ON cza.id_zh = tzh.id_zh + LEFT JOIN ref_geo.l_areas lareas ON cza.id_area = lareas.id_area + WHERE tzh.id_zh = synthese_zh.id_zh + AND id_type = (SELECT id_type FROM ref_geo.bib_areas_types WHERE type_code = 'DEP') + AND lareas.area_code IS NOT NULL + ) + OR (bdc_statut.statut_type in ('Liste rouge', 'Réglementation', 'Protection', 'Directives européennes') and bdc_statut.cd_sig = 'TERFXFR') + ) + GROUP BY taxref.nom_complet, taxref.nom_vern, taxref.classe, synthese_zh.id_zh, taxref.cd_nom, bdc_statut.statut_type, bdc_statut.article, bdc_statut.statut, bdc_statut.doc_url, synthese_zh.date_max, synthese_zh.observers, synthese_zh.organisme; + + CREATE MATERIALIZED VIEW pr_zh.vm_invertebrates AS + WITH + synthese_taxa AS ( + SELECT + synthese.id_synthese, + ( + SELECT t_zh.id_zh + FROM pr_zh.t_zh + WHERE st_intersects(st_setsrid(t_zh.geom, 4326), st_setsrid(synthese.the_geom_point, 4326)) + ) AS id_zh, + synthese.cd_nom, + synthese.date_max, + synthese.observers, + ( + SELECT organisme + FROM utilisateurs.v_userslist_forall_applications + WHERE nom_role || ' ' || prenom_role = synthese.observers limit 1 + ) + FROM gn_synthese.synthese + ), + synthese_zh AS ( + SELECT DISTINCT ON (id_zh, cd_nom) * + FROM synthese_taxa + WHERE id_zh IS NOT null + ORDER BY id_zh, cd_nom, date_max DESC + ), + bdc_statut AS ( + SELECT + cd_nom, + cd_sig, + regroupement_type AS statut_type, + lb_type_statut || ' - ' || label_statut AS statut, + full_citation AS article, + doc_url AS doc_url + FROM taxonomie.bdc_statut + WHERE ( + regroupement_type = 'Liste rouge' + AND code_statut IN ('VU', 'EN', 'CR') + ) + OR ( + regroupement_type IN ('ZNIEFF', 'Réglementation', 'Protection', 'Directives européennes') + ) + ) + + SELECT + synthese_zh.id_zh, + taxref.cd_nom, + taxref.classe AS group_class, + taxref.ordre AS group_order, + taxref.nom_complet AS scientific_name, + taxref.nom_vern AS vernac_name, + bdc_statut.statut_type AS statut_type, + bdc_statut.statut AS statut, + bdc_statut.article AS article, + bdc_statut.doc_url AS doc_url, + synthese_zh.date_max AS last_date, + synthese_zh.observers AS observer, + synthese_zh.organisme AS organisme, + (select count(cd_nom) from synthese_taxa where id_zh = synthese_zh.id_zh and cd_nom = taxref.cd_nom)::integer AS obs_nb + FROM synthese_zh + LEFT JOIN taxonomie.taxref taxref ON synthese_zh.cd_nom = taxref.cd_nom + LEFT JOIN bdc_statut ON bdc_statut.cd_nom = taxref.cd_nom + WHERE synthese_zh.id_zh IS NOT NULL + AND (synthese_zh.date_max::timestamp > (NOW()::timestamp - interval '20 years')) + AND taxref.phylum != 'Chordata' + AND taxref.regne = 'Animalia' + AND ( + bdc_statut.cd_sig = 'ETATFRA' + OR bdc_statut.cd_sig IN + ( + SELECT + DISTINCT('INSEER' || lim.insee_reg) AS cd_sig + FROM pr_zh.t_zh tzh + LEFT JOIN pr_zh.cor_zh_area cza ON cza.id_zh = tzh.id_zh + LEFT JOIN ref_geo.l_areas lareas ON cza.id_area = lareas.id_area + LEFT JOIN ref_geo.li_municipalities lim ON lim.id_area = lareas.id_area + WHERE tzh.id_zh = synthese_zh.id_zh + AND lim.insee_reg IS NOT NULL + ) + OR bdc_statut.cd_sig IN + ( + SELECT + DISTINCT('INSEED' || lareas.area_code) AS cd_sig + FROM pr_zh.t_zh tzh + LEFT JOIN pr_zh.cor_zh_area cza ON cza.id_zh = tzh.id_zh + LEFT JOIN ref_geo.l_areas lareas ON cza.id_area = lareas.id_area + WHERE tzh.id_zh = synthese_zh.id_zh + AND id_type = (SELECT id_type FROM ref_geo.bib_areas_types WHERE type_code = 'DEP') + AND lareas.area_code IS NOT NULL + ) + OR (bdc_statut.statut_type in ('Liste rouge', 'Réglementation', 'Protection', 'Directives européennes') and bdc_statut.cd_sig = 'TERFXFR') + ) + GROUP BY taxref.nom_complet, taxref.nom_vern, taxref.classe, synthese_zh.id_zh, taxref.cd_nom, bdc_statut.statut_type, bdc_statut.article, bdc_statut.statut, bdc_statut.doc_url, synthese_zh.date_max, synthese_zh.observers, synthese_zh.organisme; + + CREATE MATERIALIZED VIEW pr_zh.vm_flora AS + WITH + synthese_taxa AS ( + SELECT + synthese.id_synthese, + ( + SELECT t_zh.id_zh + FROM pr_zh.t_zh + WHERE st_intersects(st_setsrid(t_zh.geom, 4326), st_setsrid(synthese.the_geom_point, 4326)) + ) AS id_zh, + synthese.cd_nom, + synthese.date_max, + synthese.observers, + ( + SELECT organisme + FROM utilisateurs.v_userslist_forall_applications + WHERE nom_role || ' ' || prenom_role = synthese.observers limit 1 + ) + FROM gn_synthese.synthese + ), + synthese_zh AS ( + SELECT DISTINCT ON (id_zh, cd_nom) * + FROM synthese_taxa + WHERE id_zh IS NOT null + ORDER BY id_zh, cd_nom, date_max DESC + ), + bdc_statut AS ( + SELECT + cd_nom, + cd_sig, + regroupement_type AS statut_type, + lb_type_statut || ' - ' || label_statut AS statut, + full_citation AS article, + doc_url AS doc_url + FROM taxonomie.bdc_statut + WHERE ( + regroupement_type = 'Liste rouge' + AND code_statut IN ('VU', 'EN', 'CR') + ) + OR ( + regroupement_type IN ('ZNIEFF', 'Réglementation', 'Protection', 'Directives européennes') + ) + ) + + SELECT + synthese_zh.id_zh, + taxref.cd_nom, + taxref.classe AS group_class, + taxref.ordre AS group_order, + taxref.nom_complet AS scientific_name, + taxref.nom_vern AS vernac_name, + bdc_statut.statut_type AS statut_type, + bdc_statut.statut AS statut, + bdc_statut.article AS article, + bdc_statut.doc_url AS doc_url, + synthese_zh.date_max AS last_date, + synthese_zh.observers AS observer, + synthese_zh.organisme AS organisme, + (select count(cd_nom) from synthese_taxa where id_zh = synthese_zh.id_zh and cd_nom = taxref.cd_nom)::integer AS obs_nb + FROM synthese_zh + LEFT JOIN taxonomie.taxref taxref ON synthese_zh.cd_nom = taxref.cd_nom + LEFT JOIN bdc_statut ON bdc_statut.cd_nom = taxref.cd_nom + WHERE synthese_zh.id_zh IS NOT NULL + AND (synthese_zh.date_max::timestamp > (NOW()::timestamp - interval '20 years')) + AND taxref.regne = 'Plantae' + AND ( + bdc_statut.cd_sig = 'ETATFRA' + OR bdc_statut.cd_sig IN + ( + SELECT + DISTINCT('INSEER' || lim.insee_reg) AS cd_sig + FROM pr_zh.t_zh tzh + LEFT JOIN pr_zh.cor_zh_area cza ON cza.id_zh = tzh.id_zh + LEFT JOIN ref_geo.l_areas lareas ON cza.id_area = lareas.id_area + LEFT JOIN ref_geo.li_municipalities lim ON lim.id_area = lareas.id_area + WHERE tzh.id_zh = synthese_zh.id_zh + AND lim.insee_reg IS NOT NULL + ) + OR bdc_statut.cd_sig IN + ( + SELECT + DISTINCT('INSEED' || lareas.area_code) AS cd_sig + FROM pr_zh.t_zh tzh + LEFT JOIN pr_zh.cor_zh_area cza ON cza.id_zh = tzh.id_zh + LEFT JOIN ref_geo.l_areas lareas ON cza.id_area = lareas.id_area + WHERE tzh.id_zh = synthese_zh.id_zh + AND id_type = (SELECT id_type FROM ref_geo.bib_areas_types WHERE type_code = 'DEP') + AND lareas.area_code IS NOT NULL + ) + OR (bdc_statut.statut_type in ('Liste rouge', 'Réglementation', 'Protection', 'Directives européennes') and bdc_statut.cd_sig = 'TERFXFR') + ) + GROUP BY taxref.nom_complet, taxref.nom_vern, taxref.classe, synthese_zh.id_zh, taxref.cd_nom, bdc_statut.statut_type, bdc_statut.article, bdc_statut.statut, bdc_statut.doc_url, synthese_zh.date_max, synthese_zh.observers, synthese_zh.organisme; + """ + ) + + +def downgrade(): + op.execute( + """ + DROP MATERIALIZED VIEW pr_zh.vm_vertebrates; + DROP MATERIALIZED VIEW pr_zh.vm_invertebrates; + DROP MATERIALIZED VIEW pr_zh.vm_flora; + + CREATE OR REPLACE VIEW pr_zh.vertebrates AS + WITH + synthese_taxa AS ( + SELECT + synthese.id_synthese, + ( + SELECT t_zh.id_zh + FROM pr_zh.t_zh + WHERE st_intersects(st_setsrid(t_zh.geom, 4326), st_setsrid(synthese.the_geom_point, 4326)) + ) AS id_zh, + synthese.cd_nom, + synthese.date_max, + synthese.observers, + ( + SELECT organisme + FROM utilisateurs.v_userslist_forall_applications + WHERE nom_role || ' ' || prenom_role = synthese.observers limit 1 + ) + FROM gn_synthese.synthese + ), + synthese_zh AS ( + SELECT DISTINCT ON (id_zh, cd_nom) * + FROM synthese_taxa + WHERE id_zh IS NOT null + ORDER BY id_zh, cd_nom, date_max DESC + ), + bdc_statut AS ( + SELECT + cd_nom, + cd_sig, + regroupement_type AS statut_type, + lb_type_statut || ' - ' || label_statut AS statut, + full_citation AS article, + doc_url AS doc_url + FROM taxonomie.bdc_statut + WHERE ( + regroupement_type = 'Liste rouge' + AND code_statut IN ('VU', 'EN', 'CR') + ) + OR ( + regroupement_type IN ('ZNIEFF', 'Réglementation', 'Protection', 'Directives européennes') + ) + ) + + SELECT + synthese_zh.id_zh, + taxref.cd_nom, + taxref.classe AS group_class, + taxref.ordre AS group_order, + taxref.nom_complet AS scientific_name, + taxref.nom_vern AS vernac_name, + bdc_statut.statut_type AS statut_type, + bdc_statut.statut AS statut, + bdc_statut.article AS article, + bdc_statut.doc_url AS doc_url, + synthese_zh.date_max AS last_date, + synthese_zh.observers AS observer, + synthese_zh.organisme AS organisme, + (select count(cd_nom) from synthese_taxa where id_zh = synthese_zh.id_zh and cd_nom = taxref.cd_nom)::integer AS obs_nb + FROM synthese_zh + LEFT JOIN taxonomie.taxref taxref ON synthese_zh.cd_nom = taxref.cd_nom + LEFT JOIN bdc_statut ON bdc_statut.cd_nom = taxref.cd_nom + WHERE synthese_zh.id_zh IS NOT NULL + AND (synthese_zh.date_max::timestamp > (NOW()::timestamp - interval '20 years')) + AND taxref.phylum = 'Chordata' + AND ( + bdc_statut.cd_sig = 'ETATFRA' + OR bdc_statut.cd_sig IN + ( + SELECT + DISTINCT('INSEER' || lim.insee_reg) AS cd_sig + FROM pr_zh.t_zh tzh + LEFT JOIN pr_zh.cor_zh_area cza ON cza.id_zh = tzh.id_zh + LEFT JOIN ref_geo.l_areas lareas ON cza.id_area = lareas.id_area + LEFT JOIN ref_geo.li_municipalities lim ON lim.id_area = lareas.id_area + WHERE tzh.id_zh = synthese_zh.id_zh + AND lim.insee_reg IS NOT NULL + ) + OR bdc_statut.cd_sig IN + ( + SELECT + DISTINCT('INSEED' || lareas.area_code) AS cd_sig + FROM pr_zh.t_zh tzh + LEFT JOIN pr_zh.cor_zh_area cza ON cza.id_zh = tzh.id_zh + LEFT JOIN ref_geo.l_areas lareas ON cza.id_area = lareas.id_area + WHERE tzh.id_zh = synthese_zh.id_zh + AND id_type = (SELECT id_type FROM ref_geo.bib_areas_types WHERE type_code = 'DEP') + AND lareas.area_code IS NOT NULL + ) + OR (bdc_statut.statut_type in ('Liste rouge', 'Réglementation', 'Protection', 'Directives européennes') and bdc_statut.cd_sig = 'TERFXFR') + ) + GROUP BY taxref.nom_complet, taxref.nom_vern, taxref.classe, synthese_zh.id_zh, taxref.cd_nom, bdc_statut.statut_type, bdc_statut.article, bdc_statut.statut, bdc_statut.doc_url, synthese_zh.date_max, synthese_zh.observers, synthese_zh.organisme; + + CREATE OR REPLACE VIEW pr_zh.invertebrates AS + WITH + synthese_taxa AS ( + SELECT + synthese.id_synthese, + ( + SELECT t_zh.id_zh + FROM pr_zh.t_zh + WHERE st_intersects(st_setsrid(t_zh.geom, 4326), st_setsrid(synthese.the_geom_point, 4326)) + ) AS id_zh, + synthese.cd_nom, + synthese.date_max, + synthese.observers, + ( + SELECT organisme + FROM utilisateurs.v_userslist_forall_applications + WHERE nom_role || ' ' || prenom_role = synthese.observers limit 1 + ) + FROM gn_synthese.synthese + ), + synthese_zh AS ( + SELECT DISTINCT ON (id_zh, cd_nom) * + FROM synthese_taxa + WHERE id_zh IS NOT null + ORDER BY id_zh, cd_nom, date_max DESC + ), + bdc_statut AS ( + SELECT + cd_nom, + cd_sig, + regroupement_type AS statut_type, + lb_type_statut || ' - ' || label_statut AS statut, + full_citation AS article, + doc_url AS doc_url + FROM taxonomie.bdc_statut + WHERE ( + regroupement_type = 'Liste rouge' + AND code_statut IN ('VU', 'EN', 'CR') + ) + OR ( + regroupement_type IN ('ZNIEFF', 'Réglementation', 'Protection', 'Directives européennes') + ) + ) + + SELECT + synthese_zh.id_zh, + taxref.cd_nom, + taxref.classe AS group_class, + taxref.ordre AS group_order, + taxref.nom_complet AS scientific_name, + taxref.nom_vern AS vernac_name, + bdc_statut.statut_type AS statut_type, + bdc_statut.statut AS statut, + bdc_statut.article AS article, + bdc_statut.doc_url AS doc_url, + synthese_zh.date_max AS last_date, + synthese_zh.observers AS observer, + synthese_zh.organisme AS organisme, + (select count(cd_nom) from synthese_taxa where id_zh = synthese_zh.id_zh and cd_nom = taxref.cd_nom)::integer AS obs_nb + FROM synthese_zh + LEFT JOIN taxonomie.taxref taxref ON synthese_zh.cd_nom = taxref.cd_nom + LEFT JOIN bdc_statut ON bdc_statut.cd_nom = taxref.cd_nom + WHERE synthese_zh.id_zh IS NOT NULL + AND (synthese_zh.date_max::timestamp > (NOW()::timestamp - interval '20 years')) + AND taxref.phylum != 'Chordata' + AND taxref.regne = 'Animalia' + AND ( + bdc_statut.cd_sig = 'ETATFRA' + OR bdc_statut.cd_sig IN + ( + SELECT + DISTINCT('INSEER' || lim.insee_reg) AS cd_sig + FROM pr_zh.t_zh tzh + LEFT JOIN pr_zh.cor_zh_area cza ON cza.id_zh = tzh.id_zh + LEFT JOIN ref_geo.l_areas lareas ON cza.id_area = lareas.id_area + LEFT JOIN ref_geo.li_municipalities lim ON lim.id_area = lareas.id_area + WHERE tzh.id_zh = synthese_zh.id_zh + AND lim.insee_reg IS NOT NULL + ) + OR bdc_statut.cd_sig IN + ( + SELECT + DISTINCT('INSEED' || lareas.area_code) AS cd_sig + FROM pr_zh.t_zh tzh + LEFT JOIN pr_zh.cor_zh_area cza ON cza.id_zh = tzh.id_zh + LEFT JOIN ref_geo.l_areas lareas ON cza.id_area = lareas.id_area + WHERE tzh.id_zh = synthese_zh.id_zh + AND id_type = (SELECT id_type FROM ref_geo.bib_areas_types WHERE type_code = 'DEP') + AND lareas.area_code IS NOT NULL + ) + OR (bdc_statut.statut_type in ('Liste rouge', 'Réglementation', 'Protection', 'Directives européennes') and bdc_statut.cd_sig = 'TERFXFR') + ) + GROUP BY taxref.nom_complet, taxref.nom_vern, taxref.classe, synthese_zh.id_zh, taxref.cd_nom, bdc_statut.statut_type, bdc_statut.article, bdc_statut.statut, bdc_statut.doc_url, synthese_zh.date_max, synthese_zh.observers, synthese_zh.organisme; + + CREATE OR REPLACE VIEW pr_zh.flora AS + WITH + synthese_taxa AS ( + SELECT + synthese.id_synthese, + ( + SELECT t_zh.id_zh + FROM pr_zh.t_zh + WHERE st_intersects(st_setsrid(t_zh.geom, 4326), st_setsrid(synthese.the_geom_point, 4326)) + ) AS id_zh, + synthese.cd_nom, + synthese.date_max, + synthese.observers, + ( + SELECT organisme + FROM utilisateurs.v_userslist_forall_applications + WHERE nom_role || ' ' || prenom_role = synthese.observers limit 1 + ) + FROM gn_synthese.synthese + ), + synthese_zh AS ( + SELECT DISTINCT ON (id_zh, cd_nom) * + FROM synthese_taxa + WHERE id_zh IS NOT null + ORDER BY id_zh, cd_nom, date_max DESC + ), + bdc_statut AS ( + SELECT + cd_nom, + cd_sig, + regroupement_type AS statut_type, + lb_type_statut || ' - ' || label_statut AS statut, + full_citation AS article, + doc_url AS doc_url + FROM taxonomie.bdc_statut + WHERE ( + regroupement_type = 'Liste rouge' + AND code_statut IN ('VU', 'EN', 'CR') + ) + OR ( + regroupement_type IN ('ZNIEFF', 'Réglementation', 'Protection', 'Directives européennes') + ) + ) + + SELECT + synthese_zh.id_zh, + taxref.cd_nom, + taxref.classe AS group_class, + taxref.ordre AS group_order, + taxref.nom_complet AS scientific_name, + taxref.nom_vern AS vernac_name, + bdc_statut.statut_type AS statut_type, + bdc_statut.statut AS statut, + bdc_statut.article AS article, + bdc_statut.doc_url AS doc_url, + synthese_zh.date_max AS last_date, + synthese_zh.observers AS observer, + synthese_zh.organisme AS organisme, + (select count(cd_nom) from synthese_taxa where id_zh = synthese_zh.id_zh and cd_nom = taxref.cd_nom)::integer AS obs_nb + FROM synthese_zh + LEFT JOIN taxonomie.taxref taxref ON synthese_zh.cd_nom = taxref.cd_nom + LEFT JOIN bdc_statut ON bdc_statut.cd_nom = taxref.cd_nom + WHERE synthese_zh.id_zh IS NOT NULL + AND (synthese_zh.date_max::timestamp > (NOW()::timestamp - interval '20 years')) + AND taxref.regne = 'Plantae' + AND ( + bdc_statut.cd_sig = 'ETATFRA' + OR bdc_statut.cd_sig IN + ( + SELECT + DISTINCT('INSEER' || lim.insee_reg) AS cd_sig + FROM pr_zh.t_zh tzh + LEFT JOIN pr_zh.cor_zh_area cza ON cza.id_zh = tzh.id_zh + LEFT JOIN ref_geo.l_areas lareas ON cza.id_area = lareas.id_area + LEFT JOIN ref_geo.li_municipalities lim ON lim.id_area = lareas.id_area + WHERE tzh.id_zh = synthese_zh.id_zh + AND lim.insee_reg IS NOT NULL + ) + OR bdc_statut.cd_sig IN + ( + SELECT + DISTINCT('INSEED' || lareas.area_code) AS cd_sig + FROM pr_zh.t_zh tzh + LEFT JOIN pr_zh.cor_zh_area cza ON cza.id_zh = tzh.id_zh + LEFT JOIN ref_geo.l_areas lareas ON cza.id_area = lareas.id_area + WHERE tzh.id_zh = synthese_zh.id_zh + AND id_type = (SELECT id_type FROM ref_geo.bib_areas_types WHERE type_code = 'DEP') + AND lareas.area_code IS NOT NULL + ) + OR (bdc_statut.statut_type in ('Liste rouge', 'Réglementation', 'Protection', 'Directives européennes') and bdc_statut.cd_sig = 'TERFXFR') + ) + GROUP BY taxref.nom_complet, taxref.nom_vern, taxref.classe, synthese_zh.id_zh, taxref.cd_nom, bdc_statut.statut_type, bdc_statut.article, bdc_statut.statut, bdc_statut.doc_url, synthese_zh.date_max, synthese_zh.observers, synthese_zh.organisme; + """ + ) diff --git a/backend/gn_module_zh/migrations/data/script_create_taxon_view.sh b/backend/gn_module_zh/migrations/data/script_create_taxon_view.sh index d1d98c7c..691feffd 100755 --- a/backend/gn_module_zh/migrations/data/script_create_taxon_view.sh +++ b/backend/gn_module_zh/migrations/data/script_create_taxon_view.sh @@ -33,7 +33,7 @@ for val in ${ViewArray[@]}; do branch="taxref.phylum != 'Chordata' AND taxref.regne = 'Animalia'" fi query=(" - CREATE OR REPLACE VIEW pr_zh.$val AS + CREATE MATERIALIZED VIEW pr_zh.vm_$val AS WITH synthese_taxa AS ( SELECT From e0b23bdea987f202827794c1b3acc3a2b5c75d7e Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Tue, 9 Apr 2024 22:41:44 +0200 Subject: [PATCH 50/60] lint backend --- .../gn_module_zh/migrations/c0c4748a597a_create_vm_taxons.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/gn_module_zh/migrations/c0c4748a597a_create_vm_taxons.py b/backend/gn_module_zh/migrations/c0c4748a597a_create_vm_taxons.py index 0b9cd9b0..ac1e3df2 100644 --- a/backend/gn_module_zh/migrations/c0c4748a597a_create_vm_taxons.py +++ b/backend/gn_module_zh/migrations/c0c4748a597a_create_vm_taxons.py @@ -5,13 +5,14 @@ Create Date: 2024-04-09 15:30:20.522477 """ + from alembic import op import sqlalchemy as sa # revision identifiers, used by Alembic. -revision = 'c0c4748a597a' -down_revision = '510677623a13' +revision = "c0c4748a597a" +down_revision = "510677623a13" branch_labels = None depends_on = None From 9d15b73b7f3742466c63c4403c381b8abbc6b2da Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Tue, 16 Apr 2024 12:46:33 +0200 Subject: [PATCH 51/60] feat: celery tasks for vm updates --- backend/gn_module_zh/blueprint.py | 2 + backend/gn_module_zh/conf_schema_toml.py | 3 +- ...793961_create_vm_taxon_refresh_function.py | 42 +++++++++++++++++++ backend/gn_module_zh/tasks.py | 42 +++++++++++++++++++ doc/admin.md | 22 ++++++++-- setup.py | 1 + 6 files changed, 107 insertions(+), 5 deletions(-) create mode 100644 backend/gn_module_zh/migrations/76e89c793961_create_vm_taxon_refresh_function.py create mode 100644 backend/gn_module_zh/tasks.py diff --git a/backend/gn_module_zh/blueprint.py b/backend/gn_module_zh/blueprint.py index 24af5fbd..118f2483 100644 --- a/backend/gn_module_zh/blueprint.py +++ b/backend/gn_module_zh/blueprint.py @@ -27,6 +27,7 @@ from utils_flask_sqla.response import json_resp_accept_empty_list, json_resp from .api_error import ZHApiError +from . import tasks # noqa: F401 from .forms import ( create_zh, post_file_info, @@ -81,6 +82,7 @@ get_main_picture_id, get_user_cruved, ) +import gn_module_zh.tasks blueprint = Blueprint("pr_zh", __name__, "./static", template_folder="templates") diff --git a/backend/gn_module_zh/conf_schema_toml.py b/backend/gn_module_zh/conf_schema_toml.py index 45a7df36..a4fe2df2 100644 --- a/backend/gn_module_zh/conf_schema_toml.py +++ b/backend/gn_module_zh/conf_schema_toml.py @@ -177,4 +177,5 @@ class GnModuleSchemaConf(Schema): pdf_layer_number = fields.Integer(load_default=pdf_layer_number) pdf_small_layer_number = fields.Integer(load_default=pdf_small_layer_number) pdf_last_page_img = fields.String(load_default=pdf_last_page_img) - pdf_title = fields.String(load_default=pdf_title) + pdf_title = fields.String(load_default=pdf_title) + TAXON_VM_CRONTAB = fields.String(load_default="0 0,12 * * *") diff --git a/backend/gn_module_zh/migrations/76e89c793961_create_vm_taxon_refresh_function.py b/backend/gn_module_zh/migrations/76e89c793961_create_vm_taxon_refresh_function.py new file mode 100644 index 00000000..2f369790 --- /dev/null +++ b/backend/gn_module_zh/migrations/76e89c793961_create_vm_taxon_refresh_function.py @@ -0,0 +1,42 @@ +"""create_vm_taxon_refresh_function + +Revision ID: 76e89c793961 +Revises: c0c4748a597a +Create Date: 2024-04-16 08:12:41.346540 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '76e89c793961' +down_revision = 'c0c4748a597a' +branch_labels = None +depends_on = None + + +def upgrade(): + op.execute( + """ + CREATE OR REPLACE FUNCTION pr_zh.refresh_taxon_materialized_views() + RETURNS void + LANGUAGE plpgsql + AS $function$ + BEGIN + REFRESH MATERIALIZED VIEW pr_zh.vm_vertebrates; + REFRESH MATERIALIZED VIEW pr_zh.vm_invertebrates; + REFRESH MATERIALIZED VIEW pr_zh.vm_flora; + END; + $function$ + ; + """ + ) + + +def downgrade(): + op.execute( + """ + DROP FUNCTION pr_zh.refresh_taxon_materialized_views(); + """ + ) diff --git a/backend/gn_module_zh/tasks.py b/backend/gn_module_zh/tasks.py new file mode 100644 index 00000000..79ffcf7a --- /dev/null +++ b/backend/gn_module_zh/tasks.py @@ -0,0 +1,42 @@ +import os + +from datetime import datetime, timedelta +from pathlib import Path + +from sqlalchemy import func +from celery.utils.log import get_task_logger +from celery.schedules import crontab + +from flask import current_app +from geonature.utils.celery import celery_app + +from geonature.utils.env import db +from geonature.utils.config import config + +logger = get_task_logger(__name__) + + +@celery_app.on_after_finalize.connect +def setup_periodic_tasks(sender, **kwargs): + ct = config["ZONES_HUMIDES"]["TAXON_VM_CRONTAB"] + minute, hour, day_of_month, month_of_year, day_of_week = ct.split(" ") + sender.add_periodic_task( + crontab( + minute=minute, + hour=hour, + day_of_week=day_of_week, + day_of_month=day_of_month, + month_of_year=month_of_year, + ), + refresh_taxon_vm.s(), + name="Refresh taxon vms", + ) + + +@celery_app.task(bind=True) +def refresh_taxon_vm(self): + logger.info("Refresh taxon vms...") + db.session.execute(func.pr_zh.refresh_taxon_materialized_views()) + db.session.commit() + logger.info("Taxon vms refreshed.") + diff --git a/doc/admin.md b/doc/admin.md index bd4a66bb..4081a7a0 100644 --- a/doc/admin.md +++ b/doc/admin.md @@ -26,13 +26,19 @@ Si l'administrateur désire qu'un inventaire n'apparaisse plus dans la section 6 ## **5 - Téléchargement des listes de taxons** +### Fonctionnement + Lorsque l'utilisateur clique sur "générer la liste des espèces" dans l'onglet 5, l'application génère 3 fichiers csv correspondant aux taxons de flore, faune vertébrée et invertébrée protégés et observés au sein du périmètre de la zone humide. Voir la documentation utilisateur du module pour plus de détails sur les critères retenus pour la composition de cette liste. A noter qu’il s’agit d’une liste de taxons et non pas d’une liste d’occurrences de taxons (les observations liées à 1 taxon représentent donc 1 seule ligne). Chaque clic sur le bouton génère les fichiers, ces derniers étant stockés sur le serveur (et donc constamment disponibles au téléchargement) dans le dossier `static`. -Par défaut, les 3 vues (`vertebrates_view_name`, `invertebrates_view_name` et `flore_view_name`) sont paramétrées pour : +Par défaut, les 3 vues matérialisées (`vertebrates_view_name`, `invertebrates_view_name` et `flore_view_name`) sont paramétrées pour : -- lister les taxons présents dans la synthèse GeoNature de l'instance sur laquelle est déployé le module ZH. Les vues utilisent donc la table `gn_synthese.synthese` en base de données. +- lister les taxons présents dans la synthèse GeoNature de l'instance sur laquelle est déployé le module ZH. Les vues matérialisées utilisent donc la table `gn_synthese.synthese` en base de données. - utiliser les statuts d’évaluation, protection et menace listés dans la table `taxonomie.bdc_statut` +![columns](taxons.png) + +### Changer la source des données + Si l'administrateur veut changer la source de données, par exemple se brancher sur la synthèse d'une autre instance en configurant un foreign data wrapper, il devra supprimer les vues déjà existantes en base de données puis les recréer en respectant leur structure : - `id_zh` - integer : id de la zh concernée @@ -52,9 +58,17 @@ Si l'administrateur veut changer la source de données, par exemple se brancher L’association `id_zh`/`cd_nom` doit être unique puisque la vue liste les taxons protégés présents dans chaque zone humide. -Le script `data/script_create_taxon_view.sh` permet d’aider la génération des vues en indiquant la table source des occurrences de taxons et la table listant les statuts d’évaluation, protection et menaces. Etant donné que par défaut les vues sont construites sur la base de la structure des tables `gn_synthese.synthese` et `taxonomie.bdc_statut` de GeoNature, ce script fonctionne de manière optimale en utilisant des sources de données dont la structure est identique, c’est-à-dire provenant de GeoNature, que ce soit en local (= l’instance sur laquelle est installé le module ZH) ou à l’extérieur (ex : un foreign data wrapper vers les données d’un autre GeoNature). Si l’administrateur désire utiliser d’autres sources de données structurées différemment, il devra modifier le code sql de ce script pour obtenir la structure attendue (décrite ci-dessus) des vues. +Le script `data/script_create_taxon_view.sh` permet d’aider la génération des vues matérialisées en indiquant la table source des occurrences de taxons et la table listant les statuts d’évaluation, protection et menaces. Etant donné que par défaut les vues matérialisées sont construites sur la base de la structure des tables `gn_synthese.synthese` et `taxonomie.bdc_statut` de GeoNature, ce script fonctionne de manière optimale en utilisant des sources de données dont la structure est identique, c’est-à-dire provenant de GeoNature, que ce soit en local (= l’instance sur laquelle est installé le module ZH) ou à l’extérieur (ex : un foreign data wrapper vers les données d’un autre GeoNature). Si l’administrateur désire utiliser d’autres sources de données structurées différemment, il devra modifier le code sql de ce script pour obtenir la structure attendue (décrite ci-dessus) des vues. -![columns](taxons.png) +### Rafraichissement des vues matérialisées + +Les vues matérisalisées sont mises à jour automatiquement à fréquence définie, par défaut toutes les 12 heures. Si toutefois, vous souhaitez diminuer ou augmenter la durée entre chaque mise à jour, définissez cette dernière dans le fichier de configuration (``zones_humides_config.toml``) dans la variable ``TAXON_VM_CRONTAB``. + + TAXON_VM_CRONTAB ="0 0,12 * * *" + +Ce paramètre est composé de cinq valeurs, chacune séparée par un espace: minute, heure, jour du mois, mois de l'année, journée de la semaine. Dans l'exemple ci-dessus, il est indiqué que la mise à jour sera effectuée toutes les 12 heures. Pour plus d'informations, vous pouvez consulter la documentation de Celery à ce sujet : https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html#crontab-schedules. + +**Note** : Si vous ne voulez pas définir un des paramètres de périodicité, utilisez un astérisque (``*``). ## **6- Les ressources documentaires** diff --git a/setup.py b/setup.py index 8a25e30e..9ebd181c 100644 --- a/setup.py +++ b/setup.py @@ -32,6 +32,7 @@ "config_schema = gn_module_zh.conf_schema_toml:GnModuleSchemaConf", "alembic_branch = gn_module_zh:ALEMBIC_BRANCH", "migrations = gn_module_zh:migrations", + "tasks = gn_module_zh.tasks", ], }, classifiers=[ From ae3359654a0fb32518af3298f551d79cd3827236 Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Wed, 17 Apr 2024 11:49:39 +0200 Subject: [PATCH 52/60] linter backend --- backend/gn_module_zh/conf_schema_toml.py | 2 +- .../76e89c793961_create_vm_taxon_refresh_function.py | 5 +++-- backend/gn_module_zh/tasks.py | 1 - 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/gn_module_zh/conf_schema_toml.py b/backend/gn_module_zh/conf_schema_toml.py index a4fe2df2..4bbb4321 100644 --- a/backend/gn_module_zh/conf_schema_toml.py +++ b/backend/gn_module_zh/conf_schema_toml.py @@ -177,5 +177,5 @@ class GnModuleSchemaConf(Schema): pdf_layer_number = fields.Integer(load_default=pdf_layer_number) pdf_small_layer_number = fields.Integer(load_default=pdf_small_layer_number) pdf_last_page_img = fields.String(load_default=pdf_last_page_img) - pdf_title = fields.String(load_default=pdf_title) + pdf_title = fields.String(load_default=pdf_title) TAXON_VM_CRONTAB = fields.String(load_default="0 0,12 * * *") diff --git a/backend/gn_module_zh/migrations/76e89c793961_create_vm_taxon_refresh_function.py b/backend/gn_module_zh/migrations/76e89c793961_create_vm_taxon_refresh_function.py index 2f369790..a89e6194 100644 --- a/backend/gn_module_zh/migrations/76e89c793961_create_vm_taxon_refresh_function.py +++ b/backend/gn_module_zh/migrations/76e89c793961_create_vm_taxon_refresh_function.py @@ -5,13 +5,14 @@ Create Date: 2024-04-16 08:12:41.346540 """ + from alembic import op import sqlalchemy as sa # revision identifiers, used by Alembic. -revision = '76e89c793961' -down_revision = 'c0c4748a597a' +revision = "76e89c793961" +down_revision = "c0c4748a597a" branch_labels = None depends_on = None diff --git a/backend/gn_module_zh/tasks.py b/backend/gn_module_zh/tasks.py index 79ffcf7a..fd257855 100644 --- a/backend/gn_module_zh/tasks.py +++ b/backend/gn_module_zh/tasks.py @@ -39,4 +39,3 @@ def refresh_taxon_vm(self): db.session.execute(func.pr_zh.refresh_taxon_materialized_views()) db.session.commit() logger.info("Taxon vms refreshed.") - From 0842d6c74efedcfcd3b37f4de61597430d59a268 Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Wed, 17 Apr 2024 23:41:31 +0200 Subject: [PATCH 53/60] remove limit in genericquery --- backend/gn_module_zh/blueprint.py | 1 - backend/gn_module_zh/hierarchy.py | 1 - 2 files changed, 2 deletions(-) diff --git a/backend/gn_module_zh/blueprint.py b/backend/gn_module_zh/blueprint.py index 118f2483..1ac1040c 100644 --- a/backend/gn_module_zh/blueprint.py +++ b/backend/gn_module_zh/blueprint.py @@ -812,7 +812,6 @@ def write_csv(id_zh): tableName=blueprint.config[i]["table_name"], schemaName=blueprint.config[i]["schema_name"], filters={"id_zh": id_zh, "orderby": "id_zh"}, - limit=100000, ) # TODO: change for limit=-1 when the next version of Utils-Flask-SQLAlchemy will be released results = query.return_query().get("items", []) diff --git a/backend/gn_module_zh/hierarchy.py b/backend/gn_module_zh/hierarchy.py index d1a0de7a..d311af37 100644 --- a/backend/gn_module_zh/hierarchy.py +++ b/backend/gn_module_zh/hierarchy.py @@ -1235,7 +1235,6 @@ def get_all_hierarchy_fields(id_rb: int): tableName="all_rb_rules", schemaName="pr_zh", filters={"id_rb": id_rb, "orderby": "name"}, - limit=100000, ) results = query.return_query() From ad22aa79763b07b215c279ad86bc2d132b967b8b Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Wed, 29 May 2024 12:39:40 +0200 Subject: [PATCH 54/60] fix complete card bugs --- backend/gn_module_zh/model/cards.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/gn_module_zh/model/cards.py b/backend/gn_module_zh/model/cards.py index 795b5e19..e1651c5c 100644 --- a/backend/gn_module_zh/model/cards.py +++ b/backend/gn_module_zh/model/cards.py @@ -672,7 +672,7 @@ def other_ref_geo(self, ref_geo): refs = [] for ref_infos in CorZhArea.get_ref_geo_info(self.id_zh, id_types): for info in ref_infos: - type_code = DB.session.get(BibAreasTypes, info.LAreas.id_type) + type_code = DB.session.get(BibAreasTypes, info.LAreas.id_type).type_code refs.append( { "area_name": info.LAreas.area_name, @@ -809,7 +809,7 @@ def __init__(self, id_area, id_doc_type, id_cors, remark): def __str__(self): return { - "commune": DB.session.get(LAreas, self.id_area), + "commune": DB.session.get(LAreas, self.id_area).id_area, "type_doc": Utils.get_mnemo(self.id_doc_type), "type_classement": [ Utils.get_mnemo( From 42d35618573c369e9439a7e2da1fbc0de9cffe6b Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Wed, 29 May 2024 12:40:56 +0200 Subject: [PATCH 55/60] toaster for user errors in tab9 --- backend/gn_module_zh/hierarchy.py | 1 + frontend/app/services/hierarchy.service.ts | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/backend/gn_module_zh/hierarchy.py b/backend/gn_module_zh/hierarchy.py index d311af37..79e72a38 100644 --- a/backend/gn_module_zh/hierarchy.py +++ b/backend/gn_module_zh/hierarchy.py @@ -1180,6 +1180,7 @@ def __check_if_rules(self): raise ZHApiError( message="no_rb_rules", details="no existing rules for the river basin", + status_code=400 ) except ZHApiError: raise diff --git a/frontend/app/services/hierarchy.service.ts b/frontend/app/services/hierarchy.service.ts index 8f2359a6..95889113 100644 --- a/frontend/app/services/hierarchy.service.ts +++ b/frontend/app/services/hierarchy.service.ts @@ -52,6 +52,10 @@ export class HierarchyService { this._toastr.warning("La ZH n'est présente dans aucun bassin versant", '', { closeButton: true, }); + } else if (error.status === 400) { + this._toastr.warning(this._error['errors'].filter(i => error.error['message'] === i.api )[0].front, '', { + closeButton: true, + }); } }, () => { From 2ee8a41cfaa3b7b9bbc44d457f0928a9c747d9b2 Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Fri, 28 Jun 2024 17:02:30 +0200 Subject: [PATCH 56/60] lint: run linter --- backend/gn_module_zh/hierarchy.py | 2 +- frontend/app/services/hierarchy.service.ts | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/backend/gn_module_zh/hierarchy.py b/backend/gn_module_zh/hierarchy.py index 79e72a38..70b670ed 100644 --- a/backend/gn_module_zh/hierarchy.py +++ b/backend/gn_module_zh/hierarchy.py @@ -1180,7 +1180,7 @@ def __check_if_rules(self): raise ZHApiError( message="no_rb_rules", details="no existing rules for the river basin", - status_code=400 + status_code=400, ) except ZHApiError: raise diff --git a/frontend/app/services/hierarchy.service.ts b/frontend/app/services/hierarchy.service.ts index 95889113..16aefa0d 100644 --- a/frontend/app/services/hierarchy.service.ts +++ b/frontend/app/services/hierarchy.service.ts @@ -53,9 +53,13 @@ export class HierarchyService { closeButton: true, }); } else if (error.status === 400) { - this._toastr.warning(this._error['errors'].filter(i => error.error['message'] === i.api )[0].front, '', { - closeButton: true, - }); + this._toastr.warning( + this._error['errors'].filter((i) => error.error['message'] === i.api)[0].front, + '', + { + closeButton: true, + } + ); } }, () => { @@ -70,7 +74,7 @@ export class HierarchyService { this.items = []; return; } - + this.items = [{ name: '', active: true, qualification: '', knowledge: '', note: '' }]; // cat 1 From 2f7efc7592e04b51bd038556dde0f498dac01aa5 Mon Sep 17 00:00:00 2001 From: Etienne Delclaux Date: Fri, 28 Jun 2024 17:25:33 +0200 Subject: [PATCH 57/60] chore: adjust todo placement --- backend/gn_module_zh/blueprint.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/gn_module_zh/blueprint.py b/backend/gn_module_zh/blueprint.py index 1ac1040c..28bfd11c 100644 --- a/backend/gn_module_zh/blueprint.py +++ b/backend/gn_module_zh/blueprint.py @@ -812,8 +812,9 @@ def write_csv(id_zh): tableName=blueprint.config[i]["table_name"], schemaName=blueprint.config[i]["schema_name"], filters={"id_zh": id_zh, "orderby": "id_zh"}, + # TODO: limit=-1 when version 0.4.2 of Utils-Flask-SQLAlchemy will be released ) - # TODO: change for limit=-1 when the next version of Utils-Flask-SQLAlchemy will be released + results = query.return_query().get("items", []) current_date = dt.now() if results: From d8659cc6fc7cfd107935493938346bfe9d7c92ab Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Fri, 28 Jun 2024 19:57:21 +0200 Subject: [PATCH 58/60] fix bugs river basin names --- backend/gn_module_zh/model/cards.py | 2 +- backend/gn_module_zh/model/zh_schema.py | 2 +- frontend/app/zh-details/hierarchy/hierarchy.component.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/gn_module_zh/model/cards.py b/backend/gn_module_zh/model/cards.py index e1651c5c..2d4f0ccd 100644 --- a/backend/gn_module_zh/model/cards.py +++ b/backend/gn_module_zh/model/cards.py @@ -499,7 +499,7 @@ def __str__(self): def __get_river_basins(self): return [ name - for name in DB.session.execute( + for (name,) in DB.session.execute( select(TRiverBasin.name).where( TRiverBasin.id_rb == CorZhRb.id_rb, CorZhRb.id_zh == self.id_zh ) diff --git a/backend/gn_module_zh/model/zh_schema.py b/backend/gn_module_zh/model/zh_schema.py index 8953de87..4a006581 100644 --- a/backend/gn_module_zh/model/zh_schema.py +++ b/backend/gn_module_zh/model/zh_schema.py @@ -306,7 +306,7 @@ def delims(self): def bassin_versant(self): bassin_versant = [ name - for name in DB.session.execute( + for name in DB.session.scalars( select(TRiverBasin.name).where( TRiverBasin.id_rb == CorZhRb.id_rb, CorZhRb.id_zh == self.id_zh ) diff --git a/frontend/app/zh-details/hierarchy/hierarchy.component.html b/frontend/app/zh-details/hierarchy/hierarchy.component.html index 851c1a17..8a3f1e93 100644 --- a/frontend/app/zh-details/hierarchy/hierarchy.component.html +++ b/frontend/app/zh-details/hierarchy/hierarchy.component.html @@ -1,4 +1,4 @@ -

Bassin versant : {{ hierarchy.rb_name }}

+

Bassin versant : {{ data.river_basin_name }}

Date: Fri, 28 Jun 2024 20:08:44 +0200 Subject: [PATCH 59/60] fix error in get_main_rb --- backend/gn_module_zh/geometry.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/backend/gn_module_zh/geometry.py b/backend/gn_module_zh/geometry.py index b8c92d1c..2dea0cea 100644 --- a/backend/gn_module_zh/geometry.py +++ b/backend/gn_module_zh/geometry.py @@ -4,6 +4,8 @@ from geonature.utils.env import DB from sqlalchemy import func from sqlalchemy.sql import select, func +from sqlalchemy.orm import aliased + from werkzeug.exceptions import BadRequest from .api_error import ZHApiError @@ -81,14 +83,16 @@ def get_main_rb(query: list) -> int: area = 0 for q_ in query: zh_polygon = DB.session.execute( - select(TZH.geom).where(TZH.id_zh == getattr(q_, "id_zh")).first() - ) + select(TZH.geom).where(TZH.id_zh == getattr(q_, "id_zh")) + ).scalar_one() + rb_polygon = DB.session.execute( select(TRiverBasin.geom) + .select_from(CorZhRb) .join(TRiverBasin, TRiverBasin.id_rb == CorZhRb.id_rb) .where(TRiverBasin.id_rb == getattr(q_, "id_rb")) - .first() - ) + .limit(1) + ).scalar_one() intersection = DB.session.scalar( select( From ff2dc1c6ce39a2e3122505c74b335b1232c4e011 Mon Sep 17 00:00:00 2001 From: Julien Corny Date: Mon, 1 Jul 2024 15:05:44 +0200 Subject: [PATCH 60/60] fix: error rb name null in complete card fix error when opening a complete card where river basin name is null --- frontend/app/zh-details/hierarchy/hierarchy.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/app/zh-details/hierarchy/hierarchy.component.html b/frontend/app/zh-details/hierarchy/hierarchy.component.html index 8a3f1e93..a5a77ac4 100644 --- a/frontend/app/zh-details/hierarchy/hierarchy.component.html +++ b/frontend/app/zh-details/hierarchy/hierarchy.component.html @@ -1,4 +1,4 @@ -

Bassin versant : {{ data.river_basin_name }}

+

Bassin versant : {{ data?.river_basin_name }}